def decode(s)
r=""
if (s.length % 2 == 1) then
return "X"
end
p = ""
s.scan(/.{2}/).each {|c|
if (p[0] == c[0] && p[1] != "z") then
return "X"
end
r += c[0] * (c[1].ord-0x60)
p = c
}
return r
end
def encode(s)
r=""
s.chars.chunk{|c|c}.each{|k,v|
n=v.length
while(n>26)
r+=k+'z'
n-=26
end
r+=k+(n+0x60).chr
}
return r
end
def encodeHttp(s)
require 'net/http'
sleep 1
return Net::HTTP.get('spacetalky.textfile.org','/api.cgi?input='+s)
end
words = """accept
add
advise
afford
agree
alert
analyse
announce
answer
appear
arrange
arrive
ask
attach
attack
attempt
attend
attract
avoid
awake
back
bake
balance
ban
bang
bat
bathe
battle
be
beam
behave
bleach
bless
blind
blow
blush
boast
boil
bolt
bomb
book
bore
borrow
bounce
bow
brake
breathe
broadcast
bruise
brush
bump
bury
buzz
calculate
call
carry
carve
cause
challenge
change
charge
chase
cheat
check
chew
chop
clean
clear
clip
close
coach
coil
collect
colour
comb
command
communicate
compare
compete
complete
concentrate
concern
confess
consider
consist
contain
continue
correct
cough
count
cover
crack
crash
cross
crush
cry
cure
curl
curve
cycle
dam
damage
dare
deceive
decide
decorate
delay
delight
deliver
depend
describe
deserve
destroy
develop
disappear
disapprove
disarm
discover
dislike
divide
double
doubt
drain
draw
dream
drive
drop
drown
drum
dry
dust
embarrass
employ
empty
encourage
end
enjoy
enter
escape
examine
excite
excuse
exercise
exist
expand
expect
explain
explode
extend
fade
fail
fancy
fasten
fear
feel
fence
fight
file
find
fit
flap
flash
float
flood
flow
flower
fly
follow
fool
forget
found
frighten
fry
gather
gaze
get
glow
glue
go
grab
grate
grease
greet
grip
groan
grow
guarantee
guess
guide
hammer
handle
hang
happen
harass
hate
heal
heap
heat
help
hide
hit
hook
hop
hope
hover
hug
hum
hunt
hurry
identify
ignore
impress
improve
include
increase
influence
inject
instruct
intend
interest
interfere
interrupt
introduce
invent
irritate
jail
jam
jog
join
joke
judge
juggle
jump
keep
kick
kill
kiss
kneel
knit
knock
knot
label
land
last
launch
learn
let
level
lie
lighten
like
listen
live
load
long
look
lose
love
make
man
manage
march
mark
marry
match
matter
mean
measure
meddle
meet
melt
memorize
mess
milk
mine
miss
mix
moan
mourn
muddle
nail
need
nest
nod
note
notice
number
obey
object
observe
obtain
offend
offer
open
overflow
owe
own
pack
paddle
paint
park
pass
paste
pat
pause
peck
pedal
peep
perform
permit
phone
pick
pinch
pine
place
plan
plant
please
point
poke
polish
pop
post
pour
practise
pray
preach
precede
prefer
prepare
present
press
pretend
prevent
prick
print
produce
program
promise
pull
pump
punch
puncture
punish
push
question
queue
radiate
rain
receive
recognise
record
reduce
regret
reign
relax
release
rely
remember
remind
remove
repair
repeat
replace
reply
report
reproduce
request
rescue
return
rhyme
risk
rob
rock
roll
rot
ruin
rule
rush
sack
satisfy
save
saw
say
scare
scold
scorch
scrape
scratch
scream
screw
scribble
scrub
seal
search
separate
settle
share
shave
shiver
shock
shop
sigh
sign
signal
sin
skip
slap
slip
slow
smash
smell
smile
snatch
sneeze
sniff
snow
soak
soothe
sound
spark
sparkle
spell
spill
spoil
spray
sprout
squash
squeak
squeal
squeezed
stain
stamp
stare
start
stay
steer
step
stir
stitch
strap
strengthen
stroke
stuff
subtract
succeed
suck
suffer
supply
support
surprise
suspect
switch
talk
tame
tap
taste
tease
telephone
tempt
test
thaw
tickle
tie
time
tip
tire
tour
trade
transport
tremble
trot
trouble
try
tumble
turn
type
undress
unfasten
unite
unpack
untidy
use
vanish
walk
wander
want
warm
warn
wash
waste
watch
water
wave
weigh
welcome
whine
whip
whirl
whisper
whistle
wink
wish
wobble
work
worry
wrap
wreck
wrestle
yell
zip
zoom
"""
words.split("\n").each{|s|
input = decode(s)
# input = "X" if input != "X" && encodeHttp(input) != s
input = "X" if input != "X" && encode(input) != s
puts(input + ":" + s)
}
ZGVmIGRlY29kZShzKQogIHI9IiIKICBpZiAocy5sZW5ndGggJSAyID09IDEpIHRoZW4KICAgIHJldHVybiAiWCIKICBlbmQKCiAgcCA9ICIiCiAgcy5zY2FuKC8uezJ9LykuZWFjaCB7fGN8CiAgICBpZiAocFswXSA9PSBjWzBdICYmIHBbMV0gIT0gInoiKSB0aGVuIAogICAgICByZXR1cm4gIlgiCiAgICBlbmQKICAgIHIgKz0gY1swXSAqIChjWzFdLm9yZC0weDYwKQogICAgcCA9IGMKICB9CiAgcmV0dXJuIHIKZW5kCgpkZWYgZW5jb2RlKHMpCiAgcj0iIgogIHMuY2hhcnMuY2h1bmt7fGN8Y30uZWFjaHt8ayx2fAogICAgbj12Lmxlbmd0aAogICAgd2hpbGUobj4yNikKICAgICAgcis9aysneicKICAgICAgbi09MjYKICAgIGVuZAogICAgcis9aysobisweDYwKS5jaHIKICB9CiAgcmV0dXJuIHIKZW5kCgpkZWYgZW5jb2RlSHR0cChzKQogIHJlcXVpcmUgJ25ldC9odHRwJwogIHNsZWVwIDEKICByZXR1cm4gTmV0OjpIVFRQLmdldCgnc3BhY2V0YWxreS50ZXh0ZmlsZS5vcmcnLCcvYXBpLmNnaT9pbnB1dD0nK3MpCmVuZAoKd29yZHMgPSAiIiJhY2NlcHQKYWRkCmFkdmlzZQphZmZvcmQKYWdyZWUKYWxlcnQKYW5hbHlzZQphbm5vdW5jZQphbnN3ZXIKYXBwZWFyCmFycmFuZ2UKYXJyaXZlCmFzawphdHRhY2gKYXR0YWNrCmF0dGVtcHQKYXR0ZW5kCmF0dHJhY3QKYXZvaWQKYXdha2UKYmFjawpiYWtlCmJhbGFuY2UKYmFuCmJhbmcKYmF0CmJhdGhlCmJhdHRsZQpiZQpiZWFtCmJlaGF2ZQpibGVhY2gKYmxlc3MKYmxpbmQKYmxvdwpibHVzaApib2FzdApib2lsCmJvbHQKYm9tYgpib29rCmJvcmUKYm9ycm93CmJvdW5jZQpib3cKYnJha2UKYnJlYXRoZQpicm9hZGNhc3QKYnJ1aXNlCmJydXNoCmJ1bXAKYnVyeQpidXp6CmNhbGN1bGF0ZQpjYWxsCmNhcnJ5CmNhcnZlCmNhdXNlCmNoYWxsZW5nZQpjaGFuZ2UKY2hhcmdlCmNoYXNlCmNoZWF0CmNoZWNrCmNoZXcKY2hvcApjbGVhbgpjbGVhcgpjbGlwCmNsb3NlCmNvYWNoCmNvaWwKY29sbGVjdApjb2xvdXIKY29tYgpjb21tYW5kCmNvbW11bmljYXRlCmNvbXBhcmUKY29tcGV0ZQpjb21wbGV0ZQpjb25jZW50cmF0ZQpjb25jZXJuCmNvbmZlc3MKY29uc2lkZXIKY29uc2lzdApjb250YWluCmNvbnRpbnVlCmNvcnJlY3QKY291Z2gKY291bnQKY292ZXIKY3JhY2sKY3Jhc2gKY3Jvc3MKY3J1c2gKY3J5CmN1cmUKY3VybApjdXJ2ZQpjeWNsZQpkYW0KZGFtYWdlCmRhcmUKZGVjZWl2ZQpkZWNpZGUKZGVjb3JhdGUKZGVsYXkKZGVsaWdodApkZWxpdmVyCmRlcGVuZApkZXNjcmliZQpkZXNlcnZlCmRlc3Ryb3kKZGV2ZWxvcApkaXNhcHBlYXIKZGlzYXBwcm92ZQpkaXNhcm0KZGlzY292ZXIKZGlzbGlrZQpkaXZpZGUKZG91YmxlCmRvdWJ0CmRyYWluCmRyYXcKZHJlYW0KZHJpdmUKZHJvcApkcm93bgpkcnVtCmRyeQpkdXN0CmVtYmFycmFzcwplbXBsb3kKZW1wdHkKZW5jb3VyYWdlCmVuZAplbmpveQplbnRlcgplc2NhcGUKZXhhbWluZQpleGNpdGUKZXhjdXNlCmV4ZXJjaXNlCmV4aXN0CmV4cGFuZApleHBlY3QKZXhwbGFpbgpleHBsb2RlCmV4dGVuZApmYWRlCmZhaWwKZmFuY3kKZmFzdGVuCmZlYXIKZmVlbApmZW5jZQpmaWdodApmaWxlCmZpbmQKZml0CmZsYXAKZmxhc2gKZmxvYXQKZmxvb2QKZmxvdwpmbG93ZXIKZmx5CmZvbGxvdwpmb29sCmZvcmdldApmb3VuZApmcmlnaHRlbgpmcnkKZ2F0aGVyCmdhemUKZ2V0Cmdsb3cKZ2x1ZQpnbwpncmFiCmdyYXRlCmdyZWFzZQpncmVldApncmlwCmdyb2FuCmdyb3cKZ3VhcmFudGVlCmd1ZXNzCmd1aWRlCmhhbW1lcgpoYW5kbGUKaGFuZwpoYXBwZW4KaGFyYXNzCmhhdGUKaGVhbApoZWFwCmhlYXQKaGVscApoaWRlCmhpdApob29rCmhvcApob3BlCmhvdmVyCmh1ZwpodW0KaHVudApodXJyeQppZGVudGlmeQppZ25vcmUKaW1wcmVzcwppbXByb3ZlCmluY2x1ZGUKaW5jcmVhc2UKaW5mbHVlbmNlCmluamVjdAppbnN0cnVjdAppbnRlbmQKaW50ZXJlc3QKaW50ZXJmZXJlCmludGVycnVwdAppbnRyb2R1Y2UKaW52ZW50Cmlycml0YXRlCmphaWwKamFtCmpvZwpqb2luCmpva2UKanVkZ2UKanVnZ2xlCmp1bXAKa2VlcApraWNrCmtpbGwKa2lzcwprbmVlbAprbml0Cmtub2NrCmtub3QKbGFiZWwKbGFuZApsYXN0CmxhdW5jaApsZWFybgpsZXQKbGV2ZWwKbGllCmxpZ2h0ZW4KbGlrZQpsaXN0ZW4KbGl2ZQpsb2FkCmxvbmcKbG9vawpsb3NlCmxvdmUKbWFrZQptYW4KbWFuYWdlCm1hcmNoCm1hcmsKbWFycnkKbWF0Y2gKbWF0dGVyCm1lYW4KbWVhc3VyZQptZWRkbGUKbWVldAptZWx0Cm1lbW9yaXplCm1lc3MKbWlsawptaW5lCm1pc3MKbWl4Cm1vYW4KbW91cm4KbXVkZGxlCm5haWwKbmVlZApuZXN0Cm5vZApub3RlCm5vdGljZQpudW1iZXIKb2JleQpvYmplY3QKb2JzZXJ2ZQpvYnRhaW4Kb2ZmZW5kCm9mZmVyCm9wZW4Kb3ZlcmZsb3cKb3dlCm93bgpwYWNrCnBhZGRsZQpwYWludApwYXJrCnBhc3MKcGFzdGUKcGF0CnBhdXNlCnBlY2sKcGVkYWwKcGVlcApwZXJmb3JtCnBlcm1pdApwaG9uZQpwaWNrCnBpbmNoCnBpbmUKcGxhY2UKcGxhbgpwbGFudApwbGVhc2UKcG9pbnQKcG9rZQpwb2xpc2gKcG9wCnBvc3QKcG91cgpwcmFjdGlzZQpwcmF5CnByZWFjaApwcmVjZWRlCnByZWZlcgpwcmVwYXJlCnByZXNlbnQKcHJlc3MKcHJldGVuZApwcmV2ZW50CnByaWNrCnByaW50CnByb2R1Y2UKcHJvZ3JhbQpwcm9taXNlCnB1bGwKcHVtcApwdW5jaApwdW5jdHVyZQpwdW5pc2gKcHVzaApxdWVzdGlvbgpxdWV1ZQpyYWRpYXRlCnJhaW4KcmVjZWl2ZQpyZWNvZ25pc2UKcmVjb3JkCnJlZHVjZQpyZWdyZXQKcmVpZ24KcmVsYXgKcmVsZWFzZQpyZWx5CnJlbWVtYmVyCnJlbWluZApyZW1vdmUKcmVwYWlyCnJlcGVhdApyZXBsYWNlCnJlcGx5CnJlcG9ydApyZXByb2R1Y2UKcmVxdWVzdApyZXNjdWUKcmV0dXJuCnJoeW1lCnJpc2sKcm9iCnJvY2sKcm9sbApyb3QKcnVpbgpydWxlCnJ1c2gKc2FjawpzYXRpc2Z5CnNhdmUKc2F3CnNheQpzY2FyZQpzY29sZApzY29yY2gKc2NyYXBlCnNjcmF0Y2gKc2NyZWFtCnNjcmV3CnNjcmliYmxlCnNjcnViCnNlYWwKc2VhcmNoCnNlcGFyYXRlCnNldHRsZQpzaGFyZQpzaGF2ZQpzaGl2ZXIKc2hvY2sKc2hvcApzaWdoCnNpZ24Kc2lnbmFsCnNpbgpza2lwCnNsYXAKc2xpcApzbG93CnNtYXNoCnNtZWxsCnNtaWxlCnNuYXRjaApzbmVlemUKc25pZmYKc25vdwpzb2FrCnNvb3RoZQpzb3VuZApzcGFyawpzcGFya2xlCnNwZWxsCnNwaWxsCnNwb2lsCnNwcmF5CnNwcm91dApzcXVhc2gKc3F1ZWFrCnNxdWVhbApzcXVlZXplZApzdGFpbgpzdGFtcApzdGFyZQpzdGFydApzdGF5CnN0ZWVyCnN0ZXAKc3RpcgpzdGl0Y2gKc3RyYXAKc3RyZW5ndGhlbgpzdHJva2UKc3R1ZmYKc3VidHJhY3QKc3VjY2VlZApzdWNrCnN1ZmZlcgpzdXBwbHkKc3VwcG9ydApzdXJwcmlzZQpzdXNwZWN0CnN3aXRjaAp0YWxrCnRhbWUKdGFwCnRhc3RlCnRlYXNlCnRlbGVwaG9uZQp0ZW1wdAp0ZXN0CnRoYXcKdGlja2xlCnRpZQp0aW1lCnRpcAp0aXJlCnRvdXIKdHJhZGUKdHJhbnNwb3J0CnRyZW1ibGUKdHJvdAp0cm91YmxlCnRyeQp0dW1ibGUKdHVybgp0eXBlCnVuZHJlc3MKdW5mYXN0ZW4KdW5pdGUKdW5wYWNrCnVudGlkeQp1c2UKdmFuaXNoCndhbGsKd2FuZGVyCndhbnQKd2FybQp3YXJuCndhc2gKd2FzdGUKd2F0Y2gKd2F0ZXIKd2F2ZQp3ZWlnaAp3ZWxjb21lCndoaW5lCndoaXAKd2hpcmwKd2hpc3Blcgp3aGlzdGxlCndpbmsKd2lzaAp3b2JibGUKd29yawp3b3JyeQp3cmFwCndyZWNrCndyZXN0bGUKeWVsbAp6aXAKem9vbQoiIiIKCndvcmRzLnNwbGl0KCJcbiIpLmVhY2h7fHN8CiAgaW5wdXQgPSBkZWNvZGUocykKICAjIGlucHV0ID0gIlgiIGlmIGlucHV0ICE9ICJYIiAmJiBlbmNvZGVIdHRwKGlucHV0KSAhPSBzCiAgaW5wdXQgPSAiWCIgaWYgaW5wdXQgIT0gIlgiICYmIGVuY29kZShpbnB1dCkgIT0gcwogIHB1dHMoaW5wdXQgKyAiOiIgKyBzKQp9Cg==