PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/share/emacs/24.3/lisp/play
Viewing File: /usr/share/emacs/24.3/lisp/play/decipher.elc
;ELC ;;; Compiled by mockbuild@buildfarm01-new.corp.cloudlinux.com on Tue Nov 11 12:48:52 2025 ;;; from file /builddir/build/BUILD/emacs-24.3/lisp/play/decipher.el ;;; in Emacs version 24.3.1 ;;; with all optimizations. ;;; This file uses dynamic docstrings, first added in Emacs 19.29. ;;; This file does not contain utf-8 non-ASCII characters, ;;; and so can be loaded in Emacs versions earlier than 23. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (byte-code "\300\301\302\303\304\305\306\307&\210\310\311\312\313\314\315\306\301&\210\310\316\302\317\314\315\306\301&\210\320\316!\210\310\321\322\323\314\324\306\301&\210\310\325\302\326\314\327\306\301&\207" [custom-declare-group decipher nil "Cryptanalyze monoalphabetic substitution ciphers." :prefix "decipher-" :group games custom-declare-variable decipher-force-uppercase t "Non-nil means to convert ciphertext to uppercase.\nnil means the case of the ciphertext is preserved.\nThis variable must be set before typing `\\[decipher]'." :type boolean decipher-ignore-spaces "Non-nil means to ignore spaces and punctuation when counting digrams.\nYou should set this to nil if the cipher message is divided into words,\nor t if it is not.\nThis variable is buffer-local." make-variable-buffer-local decipher-undo-limit 5000 "The maximum number of entries in the undo list.\nWhen the undo list exceeds this number, 100 entries are deleted from\nthe tail of the list." integer decipher-mode-hook "Hook to run upon entry to decipher." hook] 8) #@39 Font Lock keywords for Decipher mode. (defvar decipher-font-lock-keywords '(("^:.*" . font-lock-keyword-face) ("^>.*" . font-lock-string-face) ("^%!.*" . font-lock-constant-face) ("^%.*" . font-lock-comment-face) ("\\`(\\([a-z]+\\) +\\([A-Z]+\\)" (1 font-lock-string-face) (2 font-lock-keyword-face)) ("^)\\([A-Z ]+\\)\\([a-z ]+\\)" (1 font-lock-keyword-face) (2 font-lock-string-face))) (#$ . 1608)) #@27 Keymap for Decipher mode. (defvar decipher-mode-map (byte-code "\302 \303!\210\304\305\306#\210\304\307\310#\210\304\311\312#\210\304\313\314#\210\304\315\316#\210\304\317\320#\210\304\321\322#\210\304\323\324#\210\304\325\326#\210\304\327\324#\210\304\330\324#\210\331\211\332X\203`\304\333 !\326#\210 T\211\202L))\207" [map key make-keymap suppress-keymap define-key "A" decipher-show-alphabet "C" decipher-complete-alphabet "D" decipher-digram-list "F" decipher-frequency-count "M" decipher-make-checkpoint "N" decipher-adjacency-list "R" decipher-restore-checkpoint "U" decipher-undo " " decipher-keypress [remap undo] [remap advertised-undo] 97 122 vector] 5) (#$ . 2015)) #@33 Keymap for Decipher-Stats mode. (defvar decipher-stats-mode-map (byte-code "\301 \302!\210\303\304\305#\210\303\306\307#\210\303\310\311#\210)\207" [map make-keymap suppress-keymap define-key "D" decipher-digram-list "F" decipher-frequency-count "N" decipher-adjacency-list] 4) (#$ . 2718)) #@28 Decipher mode syntax table (defvar decipher-mode-syntax-table nil (#$ . 3021)) (byte-code "\204\303 \304 \305X\203\306 \307\n#\210 T\211\202\n\n*\303\207" [decipher-mode-syntax-table c table make-syntax-table 48 57 modify-syntax-entry "_"] 5) (defvar decipher-alphabet nil) (make-variable-buffer-local 'decipher-alphabet) #@147 The buffer which displays statistics for this ciphertext. Do not access this variable directly, use the function `decipher-stats-buffer' instead. (defvar decipher-stats-buffer nil (#$ . 3360)) (make-variable-buffer-local 'decipher-stats-buffer) #@41 The number of entries in the undo list. (defvar decipher-undo-list-size 0 (#$ . 3611)) (make-variable-buffer-local 'decipher-undo-list-size) #@124 The undo list for this buffer. Each element is either a cons cell (PLAIN-CHAR . CIPHER-CHAR) or a list of such cons cells. (defvar decipher-undo-list nil (#$ . 3759)) (make-variable-buffer-local 'decipher-undo-list) (defvar decipher-pending-undo-list nil) #@74 See the functions decipher-loop-with-breaks and decipher-loop-no-breaks. (defvar decipher-char nil (#$ . 4021)) #@74 Format a buffer of ciphertext for cryptanalysis and enter Decipher mode. (defalias 'decipher #[nil "db\210n\204\n\302c\210eb\210\303\304!\203\305\306!\210\202Z\307c\210\310m\204S\303\311!\203/\310y\210\202\312 \210l\203<\310y\210\202\313c\210`\310y\210 \203M\314`\"\210\315c\210\202)\316 \210\316 \210eb\210\317y\210\320 \207" [begin decipher-force-uppercase "\n" looking-at "^(abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ -\\*-decipher-\\*-\n)" message "Buffer is already formatted, entering Decipher mode..." "(abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ -*-decipher-*-\n)\n\n" nil "^%" delete-horizontal-space ":" upcase-region ">\n" delete-blank-lines 3 decipher-mode] 3 (#$ . 4139) nil]) #@669 Major mode for decrypting monoalphabetic substitution ciphers. Lower-case letters enter plaintext. Upper-case letters are commands. The buffer is made read-only so that normal Emacs commands cannot modify it. The most useful commands are: \<decipher-mode-map> \[decipher-digram-list] Display a list of all digrams & their frequency \[decipher-frequency-count] Display the frequency of each ciphertext letter \[decipher-adjacency-list] Show adjacency list for current letter (lists letters appearing next to it) \[decipher-make-checkpoint] Save the current cipher alphabet (checkpoint) \[decipher-restore-checkpoint] Restore a saved cipher alphabet (checkpoint) (defalias 'decipher-mode #[nil "\306 \210\307\310\311\312\f\203\310\313!\210\314!\210edU\204$\315 \210\316\317!\210\320\321\322\323\310\307$\210\324\325!\210\307\211\207" [buffer-undo-list indent-tabs-mode major-mode mode-name decipher-force-uppercase case-fold-search kill-all-local-variables t nil decipher-mode "Decipher" use-local-map set-syntax-table decipher-read-alphabet make-local-variable font-lock-defaults (decipher-font-lock-keywords t) add-hook change-major-mode-hook #[nil "\302\211\211\207" [buffer-read-only buffer-undo-list nil] 3] run-mode-hooks decipher-mode-hook decipher-mode-map decipher-mode-syntax-table buffer-read-only] 5 (#$ . 4883) nil]) (put 'decipher-mode 'mode-class 'special) (defalias 'decipher-last-command-char '(macro . #[nil "\300\301!\203\302\207\303\207" [fboundp event-to-character (event-to-character last-command-event) last-command-event] 2])) #@44 Enter a plaintext or ciphertext character. (defalias 'decipher-keypress #[nil "\306\307\212\212\310 \210g\211\311U\203\312\202:\n\313U\203\307\202:\n\314U\203+\315\312\202:\n\316U\2037\315\307\202:\317\320!*\204D\307\321y\210)g\f\211z\322U\204V \323U\204\\  \"\210-\307u\207" [buffer-read-only decipher-function first-char goal-column last-command-event char-b decipher-set-map nil beginning-of-line 58 t 62 40 decipher-alphabet-keypress 41 error "Bad location" -1 119 32 char-a] 4 (#$ . 6465) nil]) (defalias 'decipher-alphabet-keypress #[(a b) "\303Y\203\304X\203\305 \"\207\306Y\203:\307X\203: \310U\2035\311\n\"A\211\310U?\2059\305 \310\"\207\305 \"\207\312\313!\207" [a b decipher-alphabet 65 90 decipher-set-map 97 122 32 assoc error "Bad character"] 3]) #@33 Undo a change in Decipher mode. (defalias 'decipher-undo #[nil "\306 \307=\204\f\310\311!\210\n\312=\204 \f\204\310\313!\210\f\211A@\314\211\211\211\211@:\2049C\211A@\211\203s\315 A @\"\211\203h@:\203a\316\"\202fB\317 A @\306#\210\2029\320!\210-\312\321\322!\207" [this-command major-mode last-command decipher-undo-list decipher-pending-undo-list undo-map t decipher-mode error "This buffer is not in Decipher mode" decipher-undo "No further undo information" nil decipher-get-undo append decipher-set-map decipher-add-undo message "Undo!" redo-rec redo-map buffer-read-only undo-rec] 6 (#$ . 7272) nil]) #@32 Add UNDO-REC to the undo list. (defalias 'decipher-add-undo #[(undo-rec) "\205  B\nT\211 V\205 \305Z\211S \233\306\241\210\f\211)\207" [undo-rec decipher-undo-list decipher-undo-list-size decipher-undo-limit new-size 100 nil] 3 (#$ . 7933)]) (defalias 'decipher-copy-cons #[(cons) "\205 @AB\207" [cons] 2]) (defalias 'decipher-get-undo #[(cipher-char plain-char) "\305\306 \"!\305\307\n \"!\n\310\232\203\f\202? A\232\203#\311\202? A\310\232\2034\f\206?\310B\202?\f\203> \fD\202? *\207" [cipher-char decipher-alphabet plain-char plain-map cipher-map decipher-copy-cons rassoc assoc 32 nil] 5]) (defalias 'decipher-set-map #[(cipher-char plain-char &optional no-undo) "\226\211\306Y\203\307X\204\310\311!\210 \204\312\313\n\"!\210\314!\314\n!\315\211\211\212eb\210\316\"\211\203P\f\317\241\210\320\321\314\f@!P!\210\322\317!\210\323 \210\324\n\"\211\203z\fA\317U\204h\325\fA\317\326#\210\f\241\210\320\321P!\210\322!\210\323 \210\320\327P!\210\322\n!\210\326\227\330 \320\331\315\326#\205\252\332 \333 \334#\203\217\322\n!\210\202\232.\207" [cipher-char no-undo plain-char bound mapping case-fold-search 65 90 error "Bad character" decipher-add-undo decipher-get-undo char-to-string nil rassoc 32 search-forward-regexp "^([a-z]*" decipher-insert beginning-of-line assoc decipher-set-map t "^([a-z]+ [A-Z]*" ignore "^:" point-at-eol search-forward end plain-string cipher-string decipher-alphabet font-lock-fontify-region-function] 6]) (defalias 'decipher-insert #[(char) "iS\212\302y\210g\303U\204g\304U\204\305\306!\210\307\310\"\210l\204$\311\312!\210\313 !*\207" [col char nil 62 41 error "Bad location" move-to-column t delete-char 1 insert-and-inherit] 3]) #@209 Checkpoint the current cipher alphabet. This records the current alphabet so you can return to it later. You may have any number of checkpoints. Type `\[decipher-restore-checkpoint]' to restore a checkpoint. (defalias 'decipher-make-checkpoint #[(desc) ";\204\303\304\211eb\210\305\306!\210\307\310\311\"\210\312`\313Z`\"\305\314\304\315#\204I\316\317\304\311#\203@\320y\210\321\322!\204@\304y\210\323c\210\320y\210\324\325\326\327\"\330\261\210\331 \210\332\n\333\323\261*\207" [desc buffer-read-only alphabet "" nil re-search-forward "^)" move-to-column 27 t buffer-substring-no-properties 26 "^%![A-Z ]+!" end re-search-backward "^% *Local Variables:" -1 looking-at "^ *$" 10 "\n%" make-string 69 45 "\n% Checkpoints:\n% abcdefghijklmnopqrstuvwxyz\n" beginning-of-line "%!" "! "] 5 (#$ . 9685) "sCheckpoint description: "]) #@235 Restore the cipher alphabet from a checkpoint. If point is not on a checkpoint line, moves to the first checkpoint line. If point is on a checkpoint, restores that checkpoint. Type `\[decipher-make-checkpoint]' to make a checkpoint. (defalias 'decipher-restore-checkpoint #[nil "\302 \210\303\304!\203(\305\306!\307eb\210\310\311!\210l\204!`\307\210`|\210 c\210\312 *\207eb\210\310\313\307\314#\203:\315\316\317\320!\"\207\321\322!\207" [buffer-read-only alphabet beginning-of-line looking-at "%!\\([A-Z ]+\\)!" match-string 1 nil re-search-forward "^)" decipher-resync "^%![A-Z ]+!" t message "Select the checkpoint to restore and type `%s'" substitute-command-keys "\\[decipher-restore-checkpoint]" error "No checkpoints in this buffer"] 4 (#$ . 10532) nil]) #@201 Complete the cipher alphabet. This fills any blanks in the cipher alphabet with the unused letters in alphabetical order. Use this when you have a keyword cipher and you have determined the keyword. (defalias 'decipher-complete-alphabet #[nil "\306\307\211\211\f\211A@\211\2038\nA\310\232\203\n\311 \"\203( T\202\310 B B\312 \n@\313#\210\202\n\314 !-\207" [decipher-alphabet undo-rec plain-map buffer-read-only ptr cipher-char 65 nil 32 rassoc decipher-set-map t decipher-add-undo] 5 (#$ . 11307) nil]) #@58 Display the current cipher alphabet in the message line. (defalias 'decipher-show-alphabet #[nil "\301\302\303\304\305#\"\207" [decipher-alphabet message "%s" mapconcat #[(a) "\301@!\301A!P\207" [a char-to-string] 3] ""] 6 (#$ . 11834) nil]) #@171 Reprocess the buffer using the alphabet from the top. This regenerates all deciphered plaintext and clears the undo list. You should use this if you edit the ciphertext. (defalias 'decipher-resync #[nil "\306\307!\210\310\211\211\212\311 \210 eb\210\312\313\310\314#\203!\315\316\310\211#\210\312\317\310\314#\2032\315\320\310\211#\210\202!\311 \210\n\211A@\211\203PA\321\232\2045\322A@\"\210\2025,\310\323\306\324!\207" [mapping buffer-read-only alphabet decipher-alphabet decipher-undo-list decipher-undo-list-size message "Reprocessing buffer..." nil decipher-read-alphabet re-search-forward "^).+" t replace-match ")" "^>.+" ">" 32 decipher-set-map 0 "Reprocessing buffer...done"] 4 (#$ . 12086) nil]) #@67 Build the decipher-alphabet from the alphabet line in the buffer. (defalias 'decipher-read-alphabet #[nil "\212eb\210\302\303!\210\304\305\306\"\210\307\310\211\311Y\205'\312u\210 gBB S\211\202*\207" [decipher-alphabet plain-char search-forward-regexp "^)" move-to-column 27 t nil 122 97 -1] 4 (#$ . 12815)]) #@55 Display the frequency count in the statistics buffer. (defalias 'decipher-frequency-count #[nil "\300 \210\301\302\303\"\207" [decipher-analyze decipher-display-regexp "^A" "^[A-Z][A-Z]"] 3 (#$ . 13138) nil]) #@55 Display the list of digrams in the statistics buffer. (defalias 'decipher-digram-list #[nil "\300 \210\301\302\303\"\207" [decipher-analyze decipher-display-regexp "[A-Z][A-Z] +[0-9]" "^$"] 3 (#$ . 13353) nil]) #@653 Display the adjacency list for the letter at point. The adjacency list shows all letters which come next to CIPHER-CHAR. An adjacency list (for the letter X) looks like this: 1 1 1 1 1 3 2 1 3 8 X: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z * 11 14 9% 1 1 1 2 1 1 2 5 7 This says that X comes before D once, and after B once. X begins 5 words, and ends 3 words (`*' represents a space). X comes before 8 different letters, after 7 different letters, and is next to a total of 11 different letters. It occurs 14 times, making up 9% of the ciphertext. (defalias 'decipher-adjacency-list #[(cipher-char) "\303 \210\304\211r\305 q\210eb\210\306\307\310\n\"\304\311#\204\312\313\n\"\210\314y\210`\315y\210`)\316 \"*\207" [end start cipher-char decipher-analyze nil decipher-stats-buffer re-search-forward format "^%c: " t error "Character `%c' is not used in ciphertext" -1 3 decipher-display-range] 4 (#$ . 13571) (list (upcase (following-char)))]) #@64 Perform frequency analysis on the current buffer if necessary. (defalias 'decipher-analyze #[nil "\302=\206\303=\203\304 !\203\305 !\206\306 \207\307\310!\207" [major-mode decipher-stats-buffer decipher-stats-mode decipher-mode bufferp buffer-name decipher-analyze-buffer error "This buffer is not in Decipher mode"] 2 (#$ . 14631)]) #@246 Display text between START and END in the statistics buffer. START and END are positions in the statistics buffer. Makes the statistics buffer visible and sizes the window to just fit the displayed text, but leaves the current window selected. (defalias 'decipher-display-range #[(start end) "\305 \306 \307p\n=\204\310\n!\210 b\210\311\307!\204&\312\313 \f\"T\314 Z!\210\315\316!\210\317 !+\207" [pop-up-windows current-window stats-buffer start end decipher-stats-buffer selected-window t pop-to-buffer one-window-p enlarge-window count-lines window-height recenter 0 select-window] 4 (#$ . 14982)]) #@235 Display text between two regexps in the statistics buffer. START-REGEXP matches the first line to display. END-REGEXP matches the line after that which ends the display. The ending line is included in the display unless it is blank. (defalias 'decipher-display-regexp #[(start-regexp end-regexp) "\304\211r\305 q\210eb\210\306\n!\210\307 \210`\306 !\210\307 \210\310\311!\204%\312y\210`)\313 \"*\207" [end start start-regexp end-regexp nil decipher-stats-buffer re-search-forward beginning-of-line looking-at "^ *$" 1 decipher-display-range] 3 (#$ . 15598)]) #@439 Loop through ciphertext, calling FUNC once for each letter & word division. FUNC is called with no arguments, and its return value is unimportant. It may examine `decipher-char' to see the current ciphertext character. `decipher-char' contains either an uppercase letter or a space. FUNC is called exactly once between words, with `decipher-char' set to a space. See `decipher-loop-no-breaks' if you do not care about word divisions. (defalias 'decipher-loop-with-breaks #[(func) "\303\211\212eb\210\n \210\304\305\306\307#\205Ol\204?g\226\211\310Y\203& \311X\204(\303 \303\232\2034\303\232\2047\n \210 \306u\210\202 \303\232\204 \303\211\n \210\202 +\207" [decipher--loop-prev-char decipher-char func 32 search-forward-regexp "^:" nil t 65 90] 5 (#$ . 16171)]) #@370 Loop through ciphertext, calling FUNC once for each letter. FUNC is called with no arguments, and its return value is unimportant. It may examine `decipher-char' to see the current ciphertext letter. `decipher-char' contains an uppercase letter. Punctuation and spacing in the ciphertext are ignored. See `decipher-loop-with-breaks' if you care about word divisions. (defalias 'decipher-loop-no-breaks #[(func) "\302\212eb\210\303\304\302\305#\205*l\204g\226\211\306Y\203$\307X\203$ \210\302u\210\202*\207" [decipher-char func nil search-forward-regexp "^:" t 65 90] 5 (#$ . 16962)]) #@155 Insert frequency counts in current buffer. Each element of FREQ-LIST is a list (LETTER FREQ ...). TOTAL is the total number of letters in the ciphertext. (defalias 'decipher-insert-frequency-counts #[(freq-list total) "\305\306\211\307V\205=\n\211\2030\211@@)\310\311@A@@A@\312_\f\245#\261\210\305\233\211\204\313c\210\nA S\211\202*\207" [temp-list i freq-list x total 4 nil 0 format "%4d%3d%% " 100 10] 7 (#$ . 17566)]) (defalias 'decipher--analyze #[nil "\306\307 #\310\n \"\206\n\311B B\211@\211\211AT\241\210)\312Y\203F \312ZH \313\232\2034\314\2027 \312Z  HTI\210* \312Y\203\210 \312ZHTI*\203\210 \312ZH\313\232\203v\314\202y\312ZHTI\210* \211\207" [decipher--prev-char decipher-char decipher--digram decipher--digram-list #1=#:v decipher--before format "%c%c" assoc 0 65 32 26 #2=#:v #3=#:v decipher--freqs #4=#:v #5=#:v decipher--after #6=#:v #7=#:v] 5]) #@44 Generate the counts for an adjacency list. (defalias 'decipher--digram-counts #[(counts) "\302\303\304 \305#\306\307 \310H\302V\203S\202\"P)\207" [total counts 0 mapconcat #[(x) "\302V\203 T\303\207\304V\203 T\305\306\"\207\307\207" [x total 99 "XX" 0 format "%2d" " "] 3] "" format "%4d" 26] 5 (#$ . 18509)]) #@65 Count the number of different letters a letter appears next to. (defalias 'decipher--digram-total #[(before-count after-count) "\304\305S\211\304Y\203#\nH\304V\204 H\304V\203 T\202 *\207" [i total before-count after-count 0 26] 2 (#$ . 18842)]) #@119 Perform frequency analysis and store results in statistics buffer. Creates the statistics buffer if it doesn't exist. (defalias 'decipher-analyze-buffer #[nil "\203\306\202 \307\310\311\312\"\310\311\312\"\310\311\313\"\313\312\211\211345\314\315!\210\31166S\2116\313Y\203M46\310\316\313\"I\21036\310\316\313\"I\210\202+)\203t\317\320!\210\31166S\2116\313Y\203p36H\311\313I\210\202Y)\202x\321\320!\210\314\322!\210\323\n\324\"\312\241\210\325\211\n\326\"\327\"\31166S\2116\313Y\203\2736\330\\ 6H\33146H36H\"E B\f 6H\\\202\216)r\332\333!q\2107\334=\204\317\335\336\337 \"\210\3128\340 \210\341 \f\"\210\342c\210\325 \343\"\341 \f\"\210\342\344\345 \312#\346\261\210\347\nG\350\\\342\"\21196\312:6\313V\203A\n\211:\203/:\211;@@)\351\352:\211;@A)\"\261\2109:\233\211:\204\353 \210\342c\210\nA6S\2116\202+\325 \354\"\211\312\2116<::\211A:@\211<\203\251<\211;A@)\313\232\204P<@\330Z6\342\355\35646H!\342<@\357\351\360<AA@<\211;A@)<\211;A@)\361_\f\245$\35636H!\342\261 \210\202P+\3338\362\312!\210. \314\312!\207" [decipher-ignore-spaces freq-list decipher--digram-list decipher--digram total-chars decipher--freqs 32 42 make-vector 26 nil 0 message "Scanning buffer..." 27 decipher-loop-no-breaks decipher--analyze decipher-loop-with-breaks "Processing results..." last 2 sort #[(a b) "@ @\231\207" [a b] 2] #[(a b) "A AV\207" [a b] 2] 65 decipher--digram-total decipher-stats-buffer t decipher-stats-mode error "Buffer %s is not in Decipher-Stats mode" buffer-name erase-buffer decipher-insert-frequency-counts 10 #[(a b) "\211A@)\n\211A@)V\207" [a x b] 3] mapconcat #[(a) "\301@!\207" [a char-to-string] 2] "\n\n" floor 9 format "%3d " delete-horizontal-space #[(a b) "AA@ AA@V\207" [a b] 2] " " decipher--digram-counts ": A B C D E F G H I J K L M N O P Q R S T U V W X Y Z *" "%4d %4d %3d%%\n " 100 set-buffer-modified-p decipher--after decipher--before decipher--prev-char i major-mode buffer-read-only rows temp-list x entry] 13 (#$ . 19108)]) #@50 Major mode for displaying ciphertext statistics. (defalias 'decipher-stats-mode #[nil "\306 \210\307\211\310\211\311\312\313!\210\314\315!\207" [buffer-read-only buffer-undo-list case-fold-search indent-tabs-mode major-mode mode-name kill-all-local-variables t nil decipher-stats-mode "Decipher-Stats" use-local-map run-mode-hooks decipher-stats-mode-hook decipher-stats-mode-map] 3 (#$ . 21168) nil]) (put 'decipher-stats-mode 'mode-class 'special) #@59 Make the statistics buffer visible, but do not select it. (defalias 'decipher-display-stats-buffer #[nil "\302 \303 p =\206\304 !\210\305!*\207" [current-window stats-buffer decipher-stats-buffer selected-window pop-to-buffer select-window] 2 (#$ . 21632)]) #@206 Return the buffer used for decipher statistics. If CREATE is non-nil, create the buffer if it doesn't exist. This is guaranteed to return a buffer in Decipher-Stats mode; if it can't, it signals an error. (defalias 'decipher-stats-buffer #[(&optional create) "\304=\203p\207\305 !\203(\306 !\203(r q\210)\304=\204&\307\310\306 !\"\210 \207\n\203U\311\306 \311Q\312\300\313\314 !!\"\243\304=\203F\314 !\202I\315 !)r q\210\304 \210) \207\307\316!\207" [major-mode decipher-stats-buffer create stats-name decipher-stats-mode bufferp buffer-name error "Buffer %s is not in Decipher-Stats mode" "*" assoc buffer-local-variables get-buffer generate-new-buffer "No statistics buffer"] 5 (#$ . 21902)]) (provide 'decipher)