7\XMASMENU MASMENUCOPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<د2? ه!߶2:2a{_:߷ʖ:߷>Ľʖ:=2–!B!6#5ʖ:߷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ڷ"͌#>?͌͘ =_.:;<> Oڅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3ۯ21y_͸2y2ͽ:ط˜1͘A͌>><92^ :߷¥.!_~#fow]ݭގޥ!v"!çREAD ERRORçNO FILE^:߷ ! ~ 3#0 Wx x ڀ ڂ G ~ # 3x~#B!Y~ɯ2:߷=!߾ý:߷=!߾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ݯw4!Y~ʆ͌†t=ʆf ^ T ݯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Y޸psp2mÆÆf ͧÆFILE EXISTS _: É: :߷ʉ=2)ͽÉ T!@k!B}|q=qf^!~2>`~2߯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !߶ Â$$$ SUB"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄAMODEM CQM AMODEM DQC` INIT COMKMDM795 CQM[KMDM795 DQC MODEM7 CQMF!"#$%MODEM7 DQC1&'()RCPM DQC>*+,-SMODEM CQMO./012SQ16 CQMl3456789SQUEEZE DQCs:;<=>?@AUSQ19 CQMXBCDEFGVAXXMOD LBRHIJKLMNOPQXMODEM COMRSXMODEM2 FQRTUVWXYZ[\]XMODMFORDOC,^_`MBOOT AQM5abcdAPMDM LBRYefghijklmnopqrUMODEM DOCstUMODEM28C uvwxyz{|}~UMODEM28C 0UMODEM28HLP8UMODEM32C UMODEM32C VMODEM28C 3VMODEM28H CMODEM CQ LYAMBOOT CQ $-BOSKUG 161MEX114 COM@i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2Ó5ELV_hqx|ÀÄÈÌÓÚÞâ$ͷtE(tͷtͷtͷtͷttt t!t"t#ͪt$ͪt%t&t'z2t!("R!"T:C*R|+"R|*T"R!"Tt4t012P2Q2<:P(2Q+2:P+:<:Q+:P+_ 1!"3"5)>22!"!"!~~jwO1!VsV1!{V  :g|KxGs1%VKW{MLLLh  1234567890-=`qwy[]a;'\zm,./eiou!@#$%^&*()_+~QWY{}A:"|ZM<>?EIOU16T!336&*D+2:$2(Iu1 ## #### ###^^nfut ###vAMODEM.COM 2 !"#$%&'()*+,-./012345656789:;<=>?@ABCDEFGHIJKLMNOPQRSS<=%HTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw~-|7*.PG xyz{|}~'o>:^a3b /#9!)N;O"$ YUA,&_+KJ(ihyX l`E?c@p[WQM1 xtd4{jeTICmF }zsn]Dwurg\VL0kfZR+JV辎~˝?x &%Rm)H GJ8R‘p#%)H G_E!Gt1gJCܐT+LQ5Jߖ\Zw H)z9)Ox}<);<)EHK~^~˕o7~7}t*FwAit.__ϦJScR6W}%#tVRpa.zoann߾ב0ThM`R^)1!%ޖp#%)H GJ8R‘p$*]r~Js4M IUmȥ%zpPR#R7~\w?Gg!ARitFI!߮Stg׋J#QYAəF#2&V&2$ޙ t}9%}u$V<'љfw`܋HiktSNa'LM-H,DwFϱ0u'}$orxZT vO8BQєs!I~P8-k8BUR+AaQ8 vI QGl~Ⲛ4wAUm!I>(D5bԄVoYj0zxiO͓uTȽ$O(^4/m-HCtgK&8jZ&Ra#*DPtd )ㄞ& *$.k#)r۫~RzLkSMBLЊc '5db% j3O`ޙɥ:^ =.DN*+,>ŧ PMRV%1q5#*$"^@jЙ0saH]x} *Z-$o0u {=fb"G(qOiIF;KN0S|5xL-Ú4{N7+¯1bNRZig RiႴκXb]j9Ṡ: 6lIRvPԊ%/! I8vY\Ot$ o:+jӋ+j!nh7ډ/ nWC¦V濟^\QPWPǰ]L>x U0I\VfP$J>ox/ұ^rBFw%GT+tҡrKGt(>$ %e#zzS8(JGx8^Xr/9!J;Ɏx!-)1^>^-?,ܔJی7GVی7-6 h7|aPF݂/5I $ 3L)Ew֦$V zB1Sje3%>Ljt9*ӹ}5x}jK>Kk5V{[J|#\q`K~uDwX~4q0GXJbXxVk%k"|63@0jEQ-+&A_* zz($COǴ  cY{ &|`ifF#QdȺ,3 &šZ浚ɮ zR QII *`y_{}N bb&y/  ZeE#id:9ei$ qTH=zU4BG_eZ~-)\Otv??ٯzb$gο|%50kJ58vOq$z) ;;;1cGr¦V] &ڜcuYCDG ^@1"1. rnw&FrNB ѺhޱGr3}ub1b麬BcDc Hڙ;<11mi($It =$.+3{"'JEMFk`id{AWUѴ18^$oP/孢u9^ KH.e)UxL%J')3?aj 79܌c6St'O>9{ 'l2Gr;M1HEVcuYCk`idN{AIYQf۝0S<Q3őٱ O(o/c +-HCtgK &f2'qY5H#r| LJ/;4ڜwh\KabicsMJlz߻w4s wc;msL[B" QA1)+ rn۝\apnQnB!& 潀Xz2Oh$LgR!KO扂zr"!d~"L3qbbP*d2)#!A@Ҙt&Uˡ2{ lJjż¤:5ftg'.,%mC.ԊwA)W/cl{? -znh7y'L-t!Lݟ0#:R4ţBFP Co$޸00u_qXҨB+L;+[n? ;<Zq?f`́1pC8WaL;KR]P/3P؀H=qUU5g>Zr[hxmKKExgJ0oMyUS`cxmd~*z~VɔZ5~U0o-1ru}spրL-_ WO1iWXf9l GWF#KKL0@ &rL=y/;SWp eG &潀Q`pR,Rx%%vhh'Q7̿Uf7n e{j~0.|xIu%{ϑwb)8kzzMl킘jc&I-+Ic&jgG!J& D0u` e|DIU4Q(.^@P! L:A@Nz0j'DAޙxQx1qd! Akh$ثgJ2ns}hcgYr_bK`8-k9*$BAOFX]Ս1EՋ5z^az ͪ2ԍ1umpZ?\FYxIb"Kᵻ/^XBFC)3zQS58|4\38^_ 2]|zzqREsɖt1pJ`\H|ڻo1pZOFBFCՍ1L Rxfz}5Cx3zep 1q5 Q|3/N|"<ɠB"a{A݊d:mQ /y%O] onY*> !cqEcײ覭TLR^ z2}ݡ2Stnru1Xˤ~^K0CoŕǍŕSv=^n}.6-cCk }.T/ z/tKZ*KA3?p eVQxFh7G$h7Di> Q[(‹lXE!ޠ#a{A,<1`&"vC Ƙyi[!x,Ix HuYä|3Ѫ!p1j|2nwhaiWcSHcUQ^FUQ^hK٧C, KX(~ʴ*A(~/xx>V d~Ԉ%!}v0ˆ'yWH0Ǣ3L&+Ow%q/)L3 WcN˷MfDM&ݗZ _u9xH0y_(Zr_b!]KL'tkw@PQ! [V4OL3 [N˼%$N cQ j^*$B=}$ f2̾`8-s+E!&f2JcD4YA=Od:[!ai̭<~Hbbb&%Lgb+11)aɉ8f2ǚ2_hw1u]w֘Zg֦zi*tY~$Zע}l}vAL,2$"+xC4OƼd:!Jкca~"scs&25ehq]Kd(QMf@] #C~c=a·ܘTWƠ06|w£N|!l9 }e~چxco :-V>2?n mC1 lIpie!& J't($]/ˆ{Q OG5)3(jW݀5DUSW%}/ 8kspָ Oy 6nόlRX޲{}e2|L0.y/ h!&,z) ׁ1tpbb \S+yb"C)E!i^*tWrFkh$󜯖 ~x{ Q1$=Fnw N(L:-*Ht#9X |h؎v@8Mq4 k`.覩QzoWi:w3QyhFv9:njfTtnjf<֌;T8@tK8@tآc@i48۠FRڢc?`Fl[Yx)xz J? ]zpց??qַd󭻾Ԗ1omz[p+T Z }X}tΊ?0xO"C<|ٕYhSK" =;[ům"=;[}o-wV{[\,|9M&^4uŃ} M=asZ ksM;NB Ѻh=ő<`'FrpHb"a$Q4 L{IS>̠exF5D^O䶏Ύ栛nJCGZ Ztӽq!hzPz)z)L(ԊLEs$X-zj%;K4R3{A]0/Oid:#96i/ɐ( 瘟#'%Fȹݙɥ:^ =.D0x8vR;vziHbՎ׳OٗCL9Lj벆 ѭ8ż#$iɨ݊LRubKaL'B4e0!&潀V^Ntz)aP/MxLkSMSQV#96 $*r?F,]5ay/ [q۝lLkSMf`B] ŏR+cMa,XDDΑ|KjIљ(j2JW:5 ψnkZZ_%bb`sXnXDDQ5$$iCL9GXIi/ɐ( v睕b9潀DXi`#J4NUn:c6A`/=Y(jϦʴ6ta6A`/A_(>n֎޿P|V+]K_|V+11 F,]5[` rL{ h2񉤆 '3SCLDsL{IDQd9Lj벆q{A;+=>D9Lj벆q{A1%zITFYfsJS)Ux}=jŬfZ>DsX.k4rXnXDD;+=lLkSMfk@_b9$C(cuYCy;+=>@LDQ :ry/ #xvub"*$"+$bNB]:T֦.·=TUC0jfA_(Z͌*%lLkSMfkA_(կV̗3-bb&Ke #$ȱ܄L睕b9$C(cuYH ' 潀 v睕dғaiv^n0r{$sǙ_g!츐JZtc{[f߮&?5c(q*MsǾf ~hF/;M)ʏ}ьZNSZǾf ~8pz1^@P|g$K뇘4&ID, a"k+"⎳ı~$hX:K뇘ʨ;+ıvqٯpӜlc1cp<p]4?شq-s8^~9=Ǧcx~8^.q8f>6=px>Z'0Z'묕} Z'Pe_F2x25jyrޝqzSܪ[?+{?;{>><䇾CS{opÆmasdaaC&s![I6Ϳwg_g>T/]}Ю]s.si#x}y{}Ub]{}³i|AVЇX>]h§O_MB/ >]^0\.^F>?h4:+Cw7oǍ7A6~5;j$N뮻Cu]w}?:;nRz߱QGS*U* (ݵksWsZT@=^F>х.m9.*U* ⫣f zõzݷ(o}p7Z%?T^XX+q7p3e{IXz2OLW; @L}0潀Xz2OLj6R =cG}##av#qnXwtgwnQzzM'ᵻ #1chς!BLTpb b"tsҀv=[[?6! ڍihF[ͅWڍ앻sl} פa9DE6Ȗ/5zZu쵮{,\wfw7Id]w; 3ls UW]1KiJzqaKa٥v7*㆘4^/~6Fb9=n O>!=^f_FzWڍrL,wAFh77H,w h7`MLw-̮O h7`Ml)h7ͮrWxڍ{.X]&.4ꖤrW57Y] yFwn>:;OMj-fv~UK-I7k7\dN]qSjɼŝMx݄pՒy;=.A wz܀Tcz\JMH5GQ=Fua nta֭fFwvקnSg Ӈ7KOO1>Xÿ>n$~íޜTm30ģ XnTN6Ve;10$@i W fvC4 PWvC ]n GgWdaS+%MmRTPJ^Tcztv{4AGeW,avMd h7; ӾpHR+_N#l,=cű=z5X\Q7zԃ=cKpXwDs09rHb019G]0IFby/ ,[[==9Ynh7ǍMyOtjU{IcqE1h7?Ύo׮A7m$:}ƙt酖fׁqfe9g\E DeFهe?VOOegT?Y!& 24F,%D+$y/ [qL睕?6T#ٵ3Ƥ*gj&Gr3^ZzkL & 9ETa{AmJ_JIuu<{ѓK~-ܔԊrr(CޓaOt>zRx-fWNۋ+j)œa>dž|TW[N ϱIjżcPԊyxry;MIIuʚhWMID|A|`M,䌦}5x蟄511nJj\`PO%>ybmsq-/v5vgb$4ez) ;恧Ӻ^ɥz)|.B^R=NWU2Gr2>RT/ ő\bEb,̢O3Xav l҈fH43.J74[gO+٩uh7/3colx~zQz~z/Ԋy&OX3DwFbE!1hۜ.ceeA AMD|9H.L"s_`}% W"s_`NB vRz*|z:>ntgPdj%;T*ttSVnWB7uK[tytj_ƃ?b7k,DiY!X-k;RՊ_<}ݡG襹և/ϧ J4{={yhگjFwק7,3ϲ[!&I\VfP$J>o GXiOƴ&+3eY=kA(H%1FsyGf{Ⱦk~~E2{cr@(2Z޻nʁwJGÌX~o|%ƚ{\YV.Z>` ~ƚ{w+ה$n;`5/1o|v~K|{> 14>DŽZrbbZ{ѭ8k3I>HQ~eϲ58Ldk,|È_cnjA#k EV̟Osigg^`j%[ =a >v]rͳk׮KGBur:th۷:Zkoo161̈5Z~7 fnد30İx`8{s3o /0b##av#q4>`MLr!;^Ӿ,Z 1TH+ Kz ڍDȺfyzvA]ӱlA]y/ Iil1a^!,<.`<kbR!uYür^@J_R+9D-!D⤮ r$$ha {I*[q[qRfBt+N¼R?1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^χ/ x6U2vVw)C:>ke:>KVQ:>UԲIz~_7beߞ$pr+ :>?~1p:`NdpHKm 4)RF9t 8ő.O(n™.Oud3a ^MPf2S H(gp&<]_PP<1MdZxĆRGT5j&fxU Ոkx)8kdp>=x&(3X0ЛD(gp&HЭ'V,A+7A0C%hdHPJ΄L' Q"nj-MEm;m db5"|{X@(Dc:S 2-H:k,AkGl(%xAee R 23Ux Љ t p_YvCb#S*HnY"aK*LXlpOB6ȴ#Q QAkh   S 2-Qu3a-SPd9nWpv{L%@yX˄H5g-ASZ0ѭo1%,Lv(lQ20E ^*6BF0A Km (D!egBQ[db53t)DlLWI9i5,q"o&k뤁" X1RAy}@7LyBhK*dm1zG\dLn&"Fip;tX˄kjjL"m#2x 3C笶a E5wpT):*(DLBaE53a"A>b;-D>K*2~ęԘEV"CFX"43t UڜU A&VxM֖:15-dCS0-Xpy:@ n$ea A&VlLBG z1HɃe knD5"J`j[eBmf'8{83V ЛL!8S x 8Z&֤F Qggezmfl, ,DnkTQ}0EL[l myGh(`)13 ]maj[pֈL;v$}OP }Cg&wC}&\=>InKp:i{8a )AFp5Mju+j8Vs&hD'-TƂHU, XIn%hL2bxk#82Lz|zZ 1Dc ΄au@Z ¼Џ?WOΈYcP!#8kF _'bOs&T_S̄)QA@c"6`^c'-8Vp<VL5IneU yLj[lD΄'4խ|{Xє9i!+'s"iX"dDIn%­3Ine~4P 5I&T_ A q#5V7խ5b5z!oV#X``gB< |{XФV*vxޯ-C-!OQΐՓ>'4խ`0J +a#xmqY폻3 Mju+L%%PF93!Ns*& }^/#8*hi p& SZ~z|#$Ot >|N'iX"<#Uq&8jk9FM&AVЇ#b/m"41ФV>S֐~rM>'B\G&AXDqC bHMju+qCx?a 's"HMju+qC?=-Rq&8jk9hR[CA#L~rM>'L?.n CؤV`ωvauWW/C怷Sj8HBZJ?OzXCF5LyB Mju+qY#"5V1h ODPpVB i .OT)t T M$T)Ǜ_[ܬwby2VŁ5IhR[CVk?&RF Mju+qY#"5V1h(0a5:B j[ #gB*L<P-$ P&41Pno.O<| np:WxЇ>_2q#5V14խ {Ld ,Lz|zZ-N#NzX#id?&In%5 Fj8͑6fBTvgBHUlMju+n Mju+HYm!#8K$iX"FII6>oFФVၐ42[pֈ&)XD@,CLJ &Djb(gI#mFIn%>Ox>j w<qu VϏ{<\߬Ƿxofy:>|z|‡O77{篏+\-no|Yuuy~z|-no|Yz7xެ.OCLJכ{<߽x=n<\oVͧyw/x={ܽ<\f[ܯz~5^OO+߽^Wo·n [?=py3^+ܽ{\ ?|>vOObi{\ O{q5t|9߯p~z}\9V'-V7x>oVo·^7j􄷸Y9V8z_yq|X78뛇{߽^Wo·n ~{՛^W/CLJ78{>ޜ>7m3^<߽}eu›aeLJ=\?q漿:>|zs>vOO/[W7#w+ܯWЇ#y-w _OVCLJ_Wo|+|]=>ÿ b?<2t|~{x\ϟ -^__?q~us9?-^__?qp}s~:>|_o|+/ b?ܬ겺~[:>|X=+|oz\W|Yeuq5V [?=py.onVo8w7f [?=py3~χ'ܽ:|ϯ|+VOuu3t|~}[ÿrmu'|:>|Y]nˏ-nVozOrmurmu_~p_ޜ~u?t|~}[Y]np~|+'|wx?-Ww7?\ߜ+VCLJ7x w}o/oq~:In%DBZJ&kqLCAFp&ud;3EBZJBT4OL҂&Ї~C< .Ow<>{A %p<dM5p&wЛVP 0qq* 9Qgs0axJr ΄@U8HB"c& d>( x \OI6TvpGj'¨q貐݂3!O) Ll`2΄Q ]#ZHe7?Sb'BDU>L(4%P}вۖ 5%Em s&'y%l`^$~mq<;b)i%p<TgBB c}JD;w:i8tp1@D8pJ,A C݂Ndd2BYm1HSb'ggh x>F߬ФVQq@d2V1ޤV{Ї(ۭj0ڠh|ЇK&h=4B-DjLTo C7j5X6JLT!#8k<2EԶpm^4GԺ5xoV_`Apָ/R[A4@ q_>LTe_'mѤV8a 's"4խobgB idm8t M ͧHLk92I#m#X0TvCg⁵%Ȕ$E5fB󔨠hiyQRv ҂&l384GjbhR[AZG|סp>2Mju+ӲHG&x:g¯EV1Tq#<%dJ V"1EgY}PwV; 8?wgBIn3yJT^4Pt"{ӂy ^/j[χ?WOxrχ8/Ї-yz}\}Ц&8R@d)BmPU 3 =id*ט =Vvg¨"Vє4ebp&Dv"dg¨"8;cC-p?]7G5V14խ,<28ődbCqsa5)3aDvOO_nˏ2/43dgB z"pvg8R6@eb;^Wo·n 0j"J쌍Gpp#*_n 6ՙdD&DpvƆ[)P/?WLCo-`DP{M2- .4&uI*&V9m-y; 7CoRDbhRjE3Epvg¨@De~MꒈU M AhsL56x/Y 7K"V14)͙"8;3aDx-9SQԚ%nClQSA@%47x>{>ޜЇl,J`*(5FVۢa&̮FST3z&#8daD0 5y%hB,LxޠInP4Pc kl4%4@6p&lDQBuVY#V>3 =z%xg逢KXInesJh*hJɓ?:QdC>B@G`D0XP24c*pvQEx `&$Le}ֈ&hiR8;CGp&%Iei-8S"53hJ I#S8$ q-bd2$L'up&<\oФV%0 XI#mzs?= }ψ j,aնhn 2QIm;t΄=VvLUJ $`D敆^ 3zs&[p&gB@%4Mi3!P䠍 [=AmPUlsJh*hJɓ<:QdC>B@G`D0XP24c*pvQEx `&$Le7j"Dv;x>{>ޜЇjbg¨"dcڦE{474tը`^cj[p&hR[ጘ%0F 2ơ7խ@#ug,bPV &24tR =Vn QBuVo4%̄@6p&lDQBuV)ay(q'OZDU  AaQ4} rBqTFM42YЛV0H, dbdـ3!dcDp+LCOd[ΐppU;3!6J*XPGl⻡?{>ޜ~/7_C)A#8J8FMq|Xi #8FMt_~23aDP{M2hgMuI(jL5- ~43 =m9CFV 8Ū ΄Q m 1TijjS }_}*΄&A;|=~_~}Cτ٧Lhn -m`^׋ǯǡl``A f 3pg0T ޲ۖ-<%pp#V(:63h3٧i7Mju+\ω#8Kp710&B#dwz<|~2G^/o8HBZJg&M֖^4PF &Tp&wVPnC߯-db8FM1HgBV8{>ޜЇq M8BF8FM憙4283EIC OO+4խp1!x d`7fqq+TvxJs3Da"QY #8п]W_0&B#F -{"6fԘ Ԣqn￿`M)eޘ [h93!id-6M#m&A1dLg41pS$p&$ "a5M$\єgBj6 )Ɇհa %`^ ! [1j"JSd4vx~#LpOJU^Զ%KQV1O'kbאq OO+4խ^>.j[8FM1HgB>p~z}\9V2231GǨ0Fs&4(  ΄χ'4խpF h>ELCOYm ,>E&k"8I`)g 6Л)Ɇ &P敠q貰y<18FMd^ uo!Rzꢶ(^y8Yc󤼆Lx|xBZeC_j[8FM w՛az?1j"T_c&PHSTۂ3GBZ,1J <V>J4]V1O;SFSAP"<NDU  CA눤U :2Uxk#4"߂38k8YcF0|NrY+7WC W-&q|X>gט +kLQm ΄@ФVy1K`*dgB JhR[FoVo;3=+AeaFSAP"<<%P:"iUL8tķL1NXŠ& ?&p\Vx#SI{-8W8YcZ&l4%`4t FMd^ oV_z}\9Vx)3hJ%3aDCwg`FSAP"<<%PIF86(AO4tJdCWFSLЭInC --8HBZJg&M֖΄HVԶ@(ΎQЇ5D5;ܯvOOCǯI ǨP-3L@!H@ޫmq QB1p&ЈuIkD2L ΄*ЋjTp&wgЈ)8M&C$+j[8FM;:2UpvFs3ad &z¨-0C?V6 )Ɇ `^i}&'yk,bvX5FC5fSrtyM$ܿ` RĢ$HgBRθ้q?`) g ΄HVvLv]}| qg28l3l4%4%183EI)Ny!#8őq ߮/obL΄ ImHhJC3a jLLhbQL0&ߢN1HV~; aDq7P=aDdq~z}\9V>LBQ!hBaP1NXvCg¨qRgBdp:[)`PqT C nᯱ23t)ġoLL(AOJYX=hR[AB?6Z1JJ%yJj[A*.Oۡw6 ,<0-bhRDb p~k*)XP~U A#|b<5"%jLLY(8m>@Upy: #S @'28R@6;\Gp&yR⡏ɷ[p&nqє0 JjLuRW)΄㟏Ċ5daF$P ('DjbEx ,ANZ`BU}"Lkx odmͧH5g fԘ ĢGlSO Q,iKPc*pgBv8[-)S8R2`LXS38Xaz΄x#5a YXŠSr ΄&%N1#c) R)38B3!Ik*Q}ආB3e4%h&<·aw?@#8Wǡ?z3·aw?`)b)1qF.) BY"f 3a Z=q?InnnGjbEδ솎)m0j"D1;*5r ΄_'%zBa˜ yP%TgFSLXSz Ha33!LG LCG Em5>2yQۢE!#8ЫB[sQR kp&'y%l`^3 }D数24bdC 6ՙdD&DpvFSLG TnV1JJy ΄D Z ,CG L5_&g¨3m-܂3 ݦ:SL$pvF̤8R5u^/ AZ^m P#5g2p&jm3l4%̄QR l3p:ߢI]u֤~uDǩ BWB#@Ho &A})a&,A|{XVp{XM⬳&?/bhRDb8őBD_'L #VnΙ0j"pp#Dv"DhJ KPc*;F,4QEpvƆ[)PgMuI(@CG TnVФ.XФ6Y[ZL:3 }DxdG T &>"YAsLYS3`y ^/j[8IΙĢ󛗡}jD5nnp~z}\9Vun&BFz" >L0 FM@DЈ(RI5b톾τQA#"΄nCau8R(:# ]&8w w_c ^#dg)RP敠y:3avnU A#LbL6tl44%S 3- 8+A#Lx葌wx24c*pvg¨K Je2}`Au5v54Iyraua5a3EMkȉBJט ǯGDjbA iMju+;<|q|X^є|Gd`vnyU [) KFghR[XZ9i8&uqY;\ s˨RHuJK(a&j'*;l44%3aTJCy@D;<fQ ΨGSMua^)a&j'*xnSdֈ` 8kF iU8Rz,R[QbĶ;j5p& X,ۿzug2[hD$g{JG M 30;*vCWQ8ő4hdCL)m1<vC>Vzs>vOO/CǗL΄@DЈ&uITnq>=hJ0 SZ#O2t΄au@Z QRM|/ SRb R~y:|{Xє``iC$bLHOugqD&VS ,S* &Pc '2-"$ ]8S@E"gzXxsDZ CĊ5dai )R SPۂ3aDHO1;*5r 4_'%FBa˜ yP%TgFSLC_SA Ha33!LG LCG Em5>2yQۢE!#8ЫB[sQR kp&'y%l`^3 }D数-t2GDHxņޤɴ9mQpp>=޲38+AGII6T0`S)@FjJggl4%nq@v裤$*LHd[ΐnq΄Q%k"p1H-8l3΄@MBgghLj[pp#*hJ KPc*;\G\n.B$ejն8t58R[p&gB&:SFSL%%PF9m9w_-YgM\GL}*x( h{5B 4`=6fԘχnᯇޤ.:kR^` $Tg hJuZL_n.pf #}gpVrs9yC$b-":Qd*L8ѤVr;t΄Q[) >'FSLXSa5"fDp(36H-8l3Ȉ@MB :8Rr ΄&uI*&2Ԋ6g &# 8R 0 3g LCw[5xmhb$OpgBvx>_W\o^>KvF9C8S,%y?gd ,`OQL g gqjۡeIis&Ա)I]&;KGK"4u2m*)Ɇ 2 FM09őB1Hgy*vLФ.S3E(„D8V[p&2b)̄H 3 U A3F)9LyFS䤅Y(Z%ն;KQV1Oiє9i' I0F|KS>k8YcF0|N1„MlzjwC~mhb$a@<Z&3$TO8V7խJY#6= U IisV{<߽^Wo·neCQ<%De hR)V<3  /EY<&5dD ЋEEm q&k"|{XФV*є|΄%6x 5p&0 TbRh8t΄1!x ^/j[8IXa)!O ,CoR[AB;\Gp&/ɷ[p&gB +)g*L` UV&aurb޲oL9i5p&)2d"P">BU&lвoLϫ fB$czQBFdmM @вoLa7΄&h()Ɇ 5&y[j01ROԶg1-SMĬa`L~×PAG/lb/hJh>EHOT2DezQۂ3qOxM$|_հєYp&D?dU `&41o&8VP8 o+4խτFmT0hp|wLj[,A M,JLa-y%)LhĠbi%183EICw+Fh28ŪTv8 CHOTɚ OFSL`ֈ~5pW֘q>*U k8R@9BFxJ c z*a ?&aVp>=XlWL 8.O|}z(p ɰqQ85g ""aˆ, |d ;Z)ۡs&p?ݽB#"p8;G0"˲PLnRU~=xc  F{}FD2[gBE{,Aňjn덯w% J%(6t΄=KF1E0PSVg*Lau4ϏGl4%̄%183EI) ^y/c-{"3!P#=Q:GO 5ޢ8;4"4ԶHOT΄yG L('_ eޘBg<#l4%̄&uIiqJnpwiwV7w_hJ KPc*pgBvx#ٱє0=%P fBFzTַp+pDhJiLua*`AK oOj[΄@Dهє0<%Pd 5GDra:ߠIn0gBqvh|×L΄@DC/ΎeYBE{D?GD5eu2t׷P=b&2D?Q8*U k8RFSL~p&wgBqvhDh|5޲oLs>" (ΎD#34"QL_~[)D!m9c)a&bW5p&T֘qu:gB351N)݂3?bDhJ -I7LaE{l4%̄@N  Pp{gBz貰yJk̄Ȳ,T C-2yٽQ3 %TDPjT%  Mju+Rh^Զ8^W#8ZHЈ8)SJL΄8Q6fB*'*Զz"p&D?7fO@q36856, Qgڪ!Im ߺ|d L5GD$R:3fc-4B &[M$ShJ KPc*CwgB~;\w?}&G5V1h ODC*L<FN Fq}&ǡ5V1h((}NTdLY+410NXŠqd>'*;<_~ЈȚ|N,:Qx:'41ФV1Jb6J*6t1G(>/oqLM$l"<8K$4խDl<ݶY(8dgd Mju+h~rM>'&k"3|{XФV*vC%m s˨Rc;|=/?>yyFSv s˨Rc-X."QĊpGa tRbZBM 3`T.×LٹeT)Ũ-"NL8!ǛЛV"6fyQy)0j"WFSLdrg¨vL[FB[p&g`^ M & ΄Q­@u9iy Y(8K3[FLLa}ֈ Q ƑCF5<%٨mն0j"pp#VvCg'kbhn LuA QB;gVOdCoR[XZ`^cj[p&k*M&CԶCL8!Ǜ#n_28fQ4B hJ jE3k8}YȃjLKv8fJ M$ɷu8ܯ-_WGl4%l0SJhb$aL 8eY$*XQV#1,N*SL[(c)a&ew0SJRc-4B M,JL)a)aɶ%:5DaQHMDl2·qe-F CwФVugL)aLF8ނ38XRFS c&ɶ;|dL)%ɷ[(c)amT08~=—#|YȃjLb)BvCg¯eM0a5 T ب)PdFDFuRbh#|bRZ#jIMm;t΄_'%F bhJh>EgG1jLCEgG>_ۖDhb$aL}Їq^Զ8ޟhJ`n3!8H˜| p˲HT&4b;\G(cbXTַPFSL)8%3!P[h-(Ύ@D6tPMju+\ω0Y@Upy:udQL'4խD47OI6TP& IФV0a5L΄@U8HF`΄ȣ_28Vq 's[p&Dv"F YŰєhLi#Ċ>Kv8M$ɷ_oΏCzQ_oΏGl4%l'410& , M(x@')-є0y F2;(BFp&W7#Vnp K&gSjP[h-·M [A@,CL` U´I]p9b>NX0"5 Jw΄ФV2t~նL8Ċ5da&yJj[p&CdUl/ LyB c-4BhJC jE3k8#|YȃjLkDZ 4„'s"!P&\hbn@eKm LyBB\ωV'gzd)BmPU M D<2ޛl M(n ,m"h-є0Ԋ6g*pp/ yPB F;\G(C#dpM &_WPlZ)`5"{#j!8Rc8ȃ Mju+qS&)y: xmhb$3$q? }5Inak9 .O4QS2%6xeldJ3!N 1MAe`AF4խ%p ΄nv1˔ fB$ d1tFNAmQUap @cCL(4M(dgvh΄nv.v el4%͙ 5Ǜ#|YȃjLkDBx2ŴFQ &+-8HBn%>'868HOQ7+߽^Wo·niCD?85g puș P4  >FMk4ș D#2b,"3{zZ 6Y[F L &[A Ee 8LB4au@Z p^7j}&'y%h,bѤVr ΄BOQM 3aT#&PQp6L_c#S* ,P;IzJdoEm 5p&0 U q|X^p޺YЛGgB z"WF*n F=6f@Gp&'F0BMGu?bDzGo nk׉"c)a&$PlC?2YT1΄BOQ-m Mju+hn S-m F= Z g?bDpgBJCgq|Xp5pֈP敠&OH5p&*d;}}~/ݏۿ;h:gW!#@yG 7Z)[|~;43 ݫLƐ4oЈ6@i)R }7$  ?bD% P#=miwx>ޜЇq5b)!,dpQa@EqτD0U- 8 >%F z"l4%4HSPF0z"l$`)a&,AiM,JpGyY-8$GM O4t̄$RLp&uTp1j"47YȨU^FML3!,dTnV A6fԘ Ģ$Lua*;FhD| !`@M6d C<1j"pЈ'*P/? s>­dd2bDP+ڜ%@#`0j<2~wCL~L + 5FM:AG 1E* ,ˏüfx \)%j[Aj[GV>M ͧH8V O>2;3Յն`AK &PFaugq& 5L x \hJ`OX7F9pf mВD:3?bD% J%(6f˜ -Ir dp M 3a jLLhbQ ·M x \p[o|>kFx,D*`:gt8In-#Я ΄Qa&,A i='*i΄@< .Oh$*;F4խ@#Lx~rM>'dUa&6v TQ8ЫF0|NÕ's"l28UaB dU Ask&A4"O 8UaB #9OI">KHL85;\WC}ֈ$֠?jd-#FM>ZHhJC~"Q5%3R<#[Dp>j"Dv"F YvC%bBB cG1(߿q_ }Y#6Z"p[?bD(Ύ6@i'*:gB~ahSdֈ~5p&TCqp dL85+a)KQV1Oiʉ  E{ XzYSBqv3aƑ938;6fBK  E[3aDhJC7ā$R26"̄@,7 >kDJC*im  &FPH ΄~5&&uIi@UNqĨ0LTo녆~<7Gp&aگ?:_b)V"IL8yP"#FMJUz40NXnC߯L ΄PgB*ayG ?F4խ`)a j 5C &B*a=yG pgBv8sYɘl4%V }HbL<٭x(`նp(A͌E9NJɷ[p&&v js"41вoL!})a&,A@-j!,wV;< |~|D15Lk̄ŧH ǟ^_8H Coك7 hJCy}&,A!3g L M$e7?2238;PJXcƑ;<|>< }Y#VєPLDFqv3 R<#PM 3a jLLhbQLC_C&F5fSrt&A_Vz1l4%쁡>ƐQ}rc<71Ї~I 5i)qu?F4խ`)%5M!qZC q&B*ayG ;3!P4խD47̄)RE@L( LVkPؑSZcPzKg[8;E{l4%0fBK-i١΄JU4>ԘnC&' L(5p&T֘q7ݷ?~ fu/?2~ÇY]n1~ÇY]np~|?F4խSMZ& PQQ}='LdHjL85*U k8Rs<58kơs&Sb,<0J@JQ nx =Xp>=ȃ 4V -2 h##ƍ(BFp&jr0&hfuva^Զ8ެ.wV7Gl4%,0OH,CLHM6o'"QYvد-7ݷ ~#659Qg¨!2~SPgB*ayG ;׋vǛGl4%jr7x)* @15p8Ra^Զ8ެ.wV78?>єɉ8XaƑ=p@YT0HjDAm 5g-BMGmzSTۂ3!ydpDDMju+vQ}ɉlk4"8j+E舵LHa PQ2Z#D*":i pvgBqvp56c17Y q6s }o[3EBZJD dU 23J>S$4խDx 0|N@\ T)TQCo2;6ȘM8S@RЇ~ Ox}6QgM$ɷS ~LXcLFYhsy _򠶅8?oF/L5g-T ΄&%a)SćfB$c3a jLa7_ SGDA\G၆~ӂrgBBնLXS"#8kG|M#8Lt ΄hbcא֦2XĢćߊc&-"C&gBBкY(R }|!|-Y#O"8UaB , <ПW|gelIneCxN ™Ihك7є0tk@Gp=xP8VPLhك7LX& 8V0OH&M ʘ ԲP 8X߾~us9?pp8y۷C΄64B jE3k88—oq_p;oЇ~ [׋5B nkT)- Po-;Jl4%)2 &T)/b$o_/j[pֈ2-V"6Y[60 2E3( 5>NEGOGNG%2G 3( Z>80iiJ2F:Ey>÷ƒ>÷> ÷—> ÷¡>÷«>÷µ>÷>2E:GE>O>>2G:F>`2H>2I> 2H>@2I>>:GD>:I!>:HƊ:E13`  INIT 1.0 for KAYPRO II Baud Rates: 19200 = 0 9600 = 1 4800 = 2 2400 = 3 1200 = 4 600 = 5 300 = 6 110 = 7 $ Select baud rate (1-9): 6$ Select parity (Odd, Even, None): N$ Select word length (7 or 8): 8$ Modem port reset.$vKMDM795.COM 2 !"#$%&'()*+,-./0123455H66789:;<=>?@ABCDEFGHIJKLMNOPQRST<=-UVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{7%o|}~ .*: >PG,r;& 3xS?9)uMK8pR'vk]A/ ~\XONJFzIEDC!tq1lih_Y40$"|mgfedZTB@+(}{ywsnjcb`^[WUL  233C !3d̐p6fBN4"]ox7@x׉ww=,& N.u⅒b(&bHC,k\ԅO)g c~ytv©C#`^9TA`$鼣C]rɫ9y5~y85uh"DsCs빈s=9Vq/R'NDƮ/8</hO͝L^'^HH:"׉*|u`m&EE>5uh<0ڹV|n.2=U<=Ƕ,7r@+XZba{AX<2F0{7|+c`_тԵ1+z"M=ꉠdx0m|8_-{A@WNDfGvlG'r X͡CDT[a+BG5ei,7r@+XB{a`aL4,i zSv& Qo<zV,7Bng{x4Bﵳ55ؠI=`px3 ,&ige`]k|:kٞU,ЂZmРlEf.-ᚁ+So :p~;{Xv&H=3Ơ k>РIQ&8E< Lr@}k 50)mT&E0)}ަqhjRdyxx_BCo~܈ȡGYJ#4i:/Fj]f~֨n#ttC40&?k`Yrgh1=; U_XNp`wߎ9c.si}>' FWnha+lra(qU,|E8ئ#rlE< ~p>dc$Thg9a4g!Tsð0($&]_ G} O:7s+o^:8J/y X CzCwU` z+;$kI cgUǮފOzY x} ~/JL*?IQᓦO!ST^zƴpX &Rk-xਔTxqURk-xh@գ/KiC >8Jb? N?? DX&EEO>U;C9H6J4+ )9>i$NW tv&ÊURx qjg(8di(MK//1 /*bK<<Dxc/wr_=7b Nz|#{㞀>}Fgs;1rk|SE2noYM]=fa /M a'Lߋ7ưF*6a!Hb٨Df"_sSxdFE-Z3/O5i*fɊk=LV֥,kVE,Z7He:#5~*CFvɂc+'>c+>duSsc+&COހnC+G甮B_#0S>*ڼ$:ĝu$tH,!`f r*'GS+G'‰̔a +lz}@TvH'q +yrVR ! kAxlLp'bAܜ==H%h˄ܔZ[CńI_*;D$u챞X"C!/"Xb=K$v:{& ~;{'֕!o>:bޓp)@z10c݉pױ+2ў"(ow1/"h-M950IQYMTh_Ĥ{ELwNqugvNsЂGӷ/A%$'S6eˍSMr#Ei3RGZZȫ8iqr%&?ÇDEeU)H}4s6C8+nbRTpJfy a Y :@5n$95b9t($&;Fl"P_v> xa o6DX$zc4x!IQjThaI`ຈI"YBȊV4b:*G6麢嵢^uş^d]O]An;zЂ4M߾`"bZ' vNs.&!QzYqiZ9fai$SmVvNs.L\2KTCIh Xk9b;]bN@X^Ĥ|^2U i]MSߧqE#[Z辖U*Zw=v}KCnN`RC)m4mfLW1%vHlrm|H8,uQ*SE>dr4-\+6UB&+$v:.:`UٺK+2I&:f{}XmTvNs';$66>$ui)dL'MV(V屲LHb}X:$Cb萃]Cb8 'MG8P9W*GIdkp8:d6"heU{ΪmuX$ց 6uX*G ./muX9}=gScgc!vf+GI+sVe}mb"E|HT9LT!cTW0,`X8rk ϼy$Յ7p\+:<.+cja>:~:žEOsS?.2\_w}EOsSOXTq>-)Hِm>h\MׂIQ9j0=Rzy4HxqwX}=փtO{yoc=‹3 KO3OGZ^{ no ̈o*/3NgH+"baRTSy_2| x*QƇF%xx/oJ0 V0F, - K)It}gw^AAx5^Bďx!bd ݯZ"/iot%X:߲M5rG }N*\YCp؃$LGX1^-dVt/5w"~"pKTd*ÊLB̢$1)*4RUO?48mɫqȘ>URUId-^6VfQ@#Dωhj^hjk L Sy[SۆSst |4qtBަqhjR1;ZUTc?^ʹN܋ :)^eJZ9r.GjV/cRySm)RIhTW"p L[AZ6m0 EuUEdiz+GU l*Il+ %,(5U݇( #Y(Q.jQ>NaԔyE],(5U݇(0jJi^6<iMs =#AަP9E8y~wҩ렫qE g^9 `^@⛛}jCiqU6}/OU 4G:2LdayB}z 2O!oj3ԗ9ӖjS9^Ӽ0yơ^=ӧM˜iKT /iWdp|4q0m{<pS#C6i8CZW!oS)dxGMpFu5n3E @n qjg(yTai۰GiiQaC~ /M*ASSyR֛ i^y.*2l%,LS)ϩ Q.jQ>NAHU;C9E S,|jQn vrBWmާ,)ئS$Q|4qz+0M -SENѨ7U TiB7szLLՔL[DC,֏I66KK%rPQ]ۊ\_?Y9cJ(H˦ mQxWO)Ӑ]Ӗ nr4-\+j6=M!Q {Q663tQG #nSȘ> vMVsmȻSG e]m=K)*?{vMVsm a۔[Tdj8jS }CC;u:aw܂M9(@^M/j3/*r)ZO!)*p4MT ;,`R,ݚ,f°ji \~ҼzrɫLXBp?L:d77``|>Q]ҸKTa#-ϧu|4q3倰>+*2a 0)vOBJ|sOj|SJg$AZ8SoQ)ϩLج-LW %٧ɓ Q[2f0U(5U݇(1} |^jKLBzb}ip}Pa):diyUiIo=>Y8di^UiZ]Gy^Rd`RFiB}~TA(HDH0d(i>ոY>4 Y8D}*Q(ϵp>j2O.daJyNrQS}q YPyy>q]Ta8PN.ALBFy @!nW!cTe1)FnO>hTW6.>S墦pSE |VS4j|*LXV|V!NJӒ"%"@aWϊY/j3a=N"\oXYgE,8]>̫LX]!"@J|sO3UrL"2 "{XgE,K:'AokSxg2Sd yo4 *0d(ȰK:'K|DV >n qj)2l8KŶ@tN>R0ո%jp>6mTRdp^:yGuL yA60նTQΔLYa} @!nWթ`SU(Rd|VBU;C9X?ӧ (/QE \v@H|VN!cԖ N}L:y4~y/҉x_ /vcRy5nC szZ"o&EE~6 `S |8]9)g>˔L;:;a'~\agg?=ɍ~8<'C||HUQ]+2Y$lӺi>8HD8SR[^Rdⱆ<-j+QM5Ye-џXf.2=U aWo<B~VY h7-l?EfGvS5ꭐ'VI1<4} SmTpXH҃/cRû0sg`}W)G)gi% D6)Bk]}B{BQ"r_W>/OCB ^hVNcNut#cq"1GpKEdDFAtR=|"l GU $jȲLX"\, |.5Mx_&墦2Oa8PL{Ts )IT &E=-"m6L^>Lr`@bRVڊLHBKΑ"gk3^n~4rgcۮq)B__e#TO}=g!xb|V Ы=8 @1>vzҫb|V8~5֋/T#x_vBGHqP>xqs)G?FGՋhI}T:,[ՎϿh__ `h"  \vd4: Njh˝(vx';?*8rZʷ|};$}́Q@\B3ob tH0c`MRv?L?L8S.$bܗkp"lFDf@ہX:$1B۝왁3.< Dv'&Spa'!!¶61P>(~\ف=tȥcz[V_~h, é}ɁowۍOzطn@+Zi">Yҍ"&7㥑y89=2ä/F NWr1\FaE!AVn:`?z@*Oi BXQxݍXßks ϵ"&ER ~aR|y~PȮ"QP%gsSW|EwRoj#sd_ D9'wu}FUks7||)6 ^>se@\:W~عɍΕOBM4=iis,zizn-[_#ȆB !O%/:aw܂M9(@^M/j3/*r)d[.I$ VbV%Zpj@k~P xb6 F#yGHTw0Q$2|^ǥM^ ^2>-|.e㩔\t#-M%[U{&W/E`5I",Mm*I݂2O0z5FZl`]1?fiS& ^$4 FT}B\$#Md N6)`  v"ɡ_ԦrOwKhEyvWUh"E#WLJ[А"+X d~J'XvMODEM7.COM 2 !"#$%&'()*+,-./0123456785H6=<9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~*%o7.PS t>-: ;qA3ymzR?xia^K) pMG$~YO98+}wvcU,'ZEf]\X@"|NJFC0 url_WI1/(&sng`[VQB#{kjhdTL! ONˏkj 2k_W1UH C 6oT;xpԈō}..|]cUxy|!wa_Ewcsn 5)PhB 1?ׯU[PC}7l:1uFFRu=.^tSԛc͢R򍌤Pyb7LmwuF:}z\}qݓJ=T_R_o#7GngaS~ 5SQ.Dh5 \wzӞS0:5ZU_U\Go46.V~p5S N:Gb}U2jpv7{nޗJNGͣ*g7PC} 5.M¡C-3b}iIkcF71 PC)P^/&o-OR>h ^؃P2@[-Tʀgҽ̸>"z̀31,ue`}k9|ւV2 10,0,Y‚D Ӛѱӓ\UPH?k4 V á`Aw76farhez03`WYcuѠQk4cY`6g|?ZX3xuQ?eIN+?B~.㌸7g=6"rx<; _M Oj0ICWvuLgfq`.3M|τ{{.9ؽ3 )9#M|چYDPnJW^*V"Q7EoL9ȅsQ0D%.q{,9> PEZ>T\Uf lwSc' 0Xif>`~j( |P8LD+P4P4Epv8ݱwih0<AEu`.Y- a6<-_Y TVkYC=}\Z!ʕ|@EANp-ՒnÆVj(tS+|0P=D%.%1<'HL,OonIeʂ1`.^K[ͿVr%&@E5'Z>c`oK=8Qav|lNu0x*ѼYuNz/'`18B 2?m>zQ䑘;dlC/#1;Ɔ_w1dl֐&!>(Hw>(xl 86z2}28al6:ux`8kx?b7Vn iZ/ w5Xn|KxxwsD ~<Nx;^ʂXF¼4lڢuP9Xۅ7a΀U`搦bf>akMI׺1Xou=C~{aܷC^=bZ1\zHTHL+C[kJB֋u}ZHHL+C[kJB֋u}ާBZ/fZ1\ZSz1XoufH};N`=dQ h- b>Tm Cq*v֋CYk]@xS>~}Hp'Ȅ4VB3C`BP8LD+[ޓn /`'ukDCk(ztȘ!yADR;N/.}U! η%՞GxD ;>`.`! *`wSFЏ4)43ln# 8D{l^"<,͟@/wEA$l0PX{ \ ; J# C Qhsi5;CH$ 9#qKI}[2H\ &(J:eM Q軇)A(s D&<,CL6Z& M(Z! }ؼ aiҏM`H'Ha]4ojD8Ql"N#wMӤߦnDFb"xq k2&<,CLV *`wSF!@!T4=QZ! }ؼ E"s(qyP"NDACsaGICz@Enhy@h=DiL@!T4jTPGo7tw *`wSF.YnԨBwk Q軇)>oiD6 MuD?Ѩw R$oK="B|j1`.R+DFR\4< J=l^OusVsV2saGICz8MD= sV\N LFwFsBzo'ؼ ExX?D_ƃ("H ; JS^VB_P ͡ ET]#q1VR%Bzo'ؼ y.D( 6vUlm{n Tֿt`.`0PXN\l^x{0/q42쌸7['y+\R7~\! ,l1R# Pu5 gQ081(Ta ra\b֋C`al^Ehˏn,^. R6e^ <'qU#_8z6-jL9A%DQ=D#jlO2z1Xx2Nx1N^ƪ֋CC`P} rQԘHsMDS+DioL9P*G!<{`h7ePbJPXxmP} )5&\%ur#?~ucO>BTk2CX;ZZ/ *)P#Lc"! 'q1Tz|4M_o^0{%!Z7`aÏn G>ýݷQ9l `a`վ:E x|T/p##D \ <'qD5&Ҝ UBSCYBŻ*@ hc`;.6<з t&`qBS(?GBsc ::u(#lz(%hXO!vd?:QBMZ! }l>|(&(M4JhO|<CqE[n η%՞Gx;&HNhf}g}Cyl'PS*?/~?+Hx½<4SOX=T&mW@0C}fc9d\ejQ,CIav0;$fQmw"<7z/czM|c=;(.Š;(+Dn"j(?݆]g |1al5b8jD aƼcn/#0OSɘYət׉{#quQ#gЯp:b8ji. S/E?l^"QK( Q.ţQD 0+蟜H$H( rHD0Lxg}PE?lnyFi^"m63FL=-mfcXl:mrZڠa9ۜk,~&>FD'{j}m0̨)?f7k~Ř/gRlcucc韶U_j;2s̃399/׾ӶndKt" r(vaM'#=UVehYf3,Vkkey 1S֔<z,\׷.9,Ȏ r$v[kJ㺾UEZSlP]ZS0MNfkˌ3G|s=g,v%KGa2<,wԩK?5 ?CT{L3(Cp'|=L9ĉb\L!.ꋷG^Q]qtM{"x(G"Sa"/ALvkdE}c\<Ȳoi>8Ã͗a&8׸+ļS!,lbltwz-=̫<4O{8^(xk8;P{Li(CD0@q4 ƣ aa «GyADqK(r(Dg;Jqx4D oVCe1(;ˍ,ykB^7;B#w,,,WPF; CLAND'҉1,Fi.DTG9ѡ\5& .w@|A1]}>.BN$%DB 6֞#$С~b8ď?J@Ao6 w* }tfVC|eө]OPq0 Lq~tڼP$_QidUqQ)U?Uv?Q?Yn*.*]P?2XͿߥ=GNyjff6\A3"5Az!˦](f.yADFgQHD1̢IWK-hTLaTtsUqQ)/E]~TZ?GE])T8I]f^u0IF2:ؽ<4sUD#f[^?ބa ,d^[e8,([8yN]Zbϳ9G-ϳu|%ßg:ԒϳGkv&UH9b {%K0`ЌN2FU6/HtH "ѡ*?Z."4[ڽR4-cť]hhLr\!T5?ſ/B]~{h U[ƊKXѬ \!TDթRTU-cť]hh֏vWGEhm -zA< l>!QxdQid iP5wSc[ 1*"Q衇ȿx **)Z^>&HF*4[?YUr?n,^>f[$h!T*TU|3yAJ7:G]~AQUDI~ɣ. QU.4V4Gn*.*B]~TZ??&HjQ2V\Z߅Ɗfhgqq?yH0ؼ Rk ('&.q!,LdyA$_X},' 1Y7}\?x՝/gff5 ?1T8;LVz,}LUҘgJlWRtb8צ;K1̢㊇Cn-D%! ,Nf6q~R{~R~=ڟ* |1al5Gn!;[HrCLfI,N1k%|4DhCLVۍAXz11a^퟿z{RD$\5!!,L} RNL\$nXR՞#^ N'r(>LģTsṇ-d{ Wn, uIZa\b֋C`al^Ehˏn,^. R6e^ <'qU#_8z6-jL9A%DQ=D#jlO2z1XxvGLMODEM7.DOCX o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXyg^^?>xz{zX+ﶜC|yĎ P$ g9*ίCS2a/Wo\U">7z }~` c(0'IhY\%$!8mKڮhI%q`/_- KDc(<;B_O\K0vY8 G`dѲ14Jlj; >c HsP!O؅=IDäD`e?ħMm$s!s]Nwռ64b.dB [vrtGhY"jcYF0Zi/&GS prѲ<݂⨍e n#D.aE..)>n!Nm,k*T !0J9 P_?<0ZE":w)N%՜н$Gbi齹#uA'^&M:;уCK?PS˪@Ib~Vx$CpS QB߂zjcYLb4 P|Wpa n :KMmv~V߅^qWX` 2 >уLbx$~Vwy /Y%B [v9tD]wZ %pR9tD]6$㜱9XPKMA@m,kEvos b.d>yAGlj˂(swu^ͻT[m,i$0J9JtR(BHC뗯p] ?Pe=DSn˗;C8'2ceE;Bm,(;>EA8]AH2yCrw6ռc#IIoD;>E9I,B."e'b#[?;R /Y%s2wIC掰C< @H;CⒸĻ7?xt :QW! ~Ν`.i'zNm,e>(.Ljme}PY&_Jp=1H CIb! dK*X֝dVyj7eAcpijeq2w7 :whYSΎeqH-;Acpio8yhY-stjcYJ[{5; $!n{5x!{w@m,kp[:H$w=-~]".= Z q߫yuAݛwƲ&!nռ7%Q畝BN27 eqH"D65Sv[tn>c ݬh-;!eѤS#0ZD!8ԣe sVz-vaz?9XX)JPA": AIq^7ƲBq`#[?g~ h;M[?CBIbqѲp0AH.)JPƲ\|}- \g,Lἲ4IJy-LCpGƲJ I-N'm~̇ g3:HGaAF˒e=B\(aτ(9sG_>i'h?,Q˺~2'3P4wt\(A- :+W7qI~'=!([?sN9 \g,jcY_$}umA <9nϨ'넜A eIxGmۜRZ$pMmv%:Gzfn;jVeGH北$Y&%8^ͻ[wD9zMmke}Ac(XBJty^ͻ[A8SYNY.AoGdCƲw2n˗;C8On 4'\P|؉8Q-}p]:!A4EIPzwW/%(sRvrt 0Z#[?Sz Q>[zĩDtJ[&_Jpg|::eqc0nV>ޟAH2yCjޥ [?#?1U b.dﲩ6ru ptK S9I'*,b'\P| $A qza>IF˲6`yꙓptK %Y>%Hz@m,kphY#YQ(oj >7/~t/%CBI2SFa$%`X֓b.dﲁ'猍lLɺFKMAͻAeݝrNQO c j9)ǠDjgn8 /%NE~67^^K c1 )I:q3P˺T:>SxprޢPX;f%%AeG`),»jh9~q+64w|)u%M t2[H3 G%la'L6tM67_?#:]0gG,g ْJQ%B(ْJ"n`9㼲jcYќJ0w#~70+%:[?s4$B72E6V[m?zx>=|5p}>?spX~2Z q߫yje}$~hYx,sR^&uze(E pѲX椸PѲ0,)$~ISm,Tb12w1eqhY"-)\Cp*67b.dt@Ʋ!ѡ"ne$ } BQ9S 9okc1 E܌jcLwX7Pv3Z#I\7w$NIbhYRm,Q\߅0D4F<)>nI"q|e↋ɁKD.1hY\%Ʋ>sa%vbHc,h .kcY !(؉#I#Q&t1Z4F'n8I,B.mFT[m,Lba,;)-a/whjc~][m,Ib12w./ev650eh.@]գ9Tb12eNnG7?!*)\sq3eNnBm}:C=SI-Smt6V[moݖ},%n>[YB3EW#9$%Œ_ƲC|yĎ_](놳jcY?ۛ>ۋl^}/s6<񖏛6|OG-??|XO>=_~W'~oooY[m^}z{ڗqϾ~O9tD]6$㜱9XPKMA@m,kEvos b.d>yAGlj˂(swu^ͻT[m,vRCPM.DOC\  !"#$%&'()*+,-./0123o456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[C?C sC?w5;s.BvF IQ#LېnwԑClC *F)4ҙ8ɔ(_9WM2@vAO~wϡzஊ (hb+!j*inE D hΜ0(s+eA(Z\X =P,mˮ!MTC܈ 5V&E2L ZoGNQ˜6l$IefJh:d-*j =v;Akv\ed?~$+SqB8q>-2Cb*/2:%JG(X* Sqamh \ =[:hnc[As`4WlFm'l 9۬k̻ұ[8{,r|OU@Oc n\MG*lmbrr) =VJYj.ǧ>>RF`91^p kPBڴOBb'L.%t[K =`Z%8|ղ H\_W:T:PcNXr6&aZn퇫p||51经wtϮvK+<#~+1KD''kBp0Um*4UFIɮ9mKPl ..w~_?;?6U|q QY%1@ɮґs.0JGW7+|?CvuySl <Ď$α79=lmbϛ$Jhfsg聝I$US i#*#!u,֢]TCIs h$SkbS.m]ؕ< l !-p)ѳ%ٟ\크.euj遡7WO?}q՞_7W`~sg{>on7WCow_V8= c4WlF`Z%28Jr( =ǜBamr)$SNFJ, 7Ww,23̹h g։sy4 g5fWI. &++ =pq{CvBq#\\®CZ2 *@ B)vb聱"̹CY`הd'P$ɥcmy^Jl 9}r7Ke!\\®j,3,z`C$j 61~oS~xzGBpK-9)$B)vbE5v)lE^rZ)Z$:CL s`"S1 |d'x ,h.x*C:?Xëұɉ1l)͏C7/Vb4sеƐ|)hIc聖b SE|R5oSD~)KsS." Khn*)4/s08R0ZsGI:TrԁVYz@cH>K9J\hsHa߽x~zs~v =p˫]=7g+pR:s'D!w4Y:v Z"a '*i`k5[A貕oa>"؟\|wcse'Ėm*_CmMV( " =?|9?cEVEaFgT,t|yRGFa聬ZDR_[5(5eKUs.,؈C??P ZnS.0MU]h CZKa0MU~5]hyfZ/م1Z'#Ch sp]7֘Bb!m]h18]9mgK[z r/oV+x jNkT1VI$8 uBH(9m0 hz%B5W\sAYE؅ WsGI3EVrEFKa')mz䔵m^sڠF͛*|+]S _P.b-2Z'#*f#aR+ =pKNad]hCۡ7oWkEYEFd$'5Ο~:9@H% A_~7_~SE$9m@@H \zW}*$c(L50''De؆u90 \m./م1[$9m^п^{Qx5кLavEM_\_ q聻*P^)ty⋟}8R WWORvu0m5qP,v9 FddU4eOV||kjc`h&O㋫+wUzJ_\etgO;B)[Z%z~qݢJ.96#Ub :WмR:#:HI0Wh /م֭C?/^ܿ1Ht֜6֠(QdZ֜0)Z&M%bPNBte4WHQJl 51OG*ĕmM 3[D CL6nJtBrBm':CN+pWef#;Q!uUxn-th YO! 洡ElfJ WRw 'TLgS%ild(qʡatd\JbQ0Cӕmr\/2:Tlc * =PmTl%u]&kQŚRJRYZiZ*VbМ6TkW5(ʈm%iGqQؚtćh@2%$!沐Q%Ya oQPCcH^ Zͣ8j,"vJd(qijLQFSWסzGxAxX).L/N;bJAڸx"Va[- 1 W?}xITCԐ6жˡybq,uLhFdS.BDVa5sڬb($$¬Ԑ6-!uh\%u]ض5l&dGkP /P 0=WBh"jIA Qō1[d+-'a1JEA(I*l$I4ϺRV!WM\zf 7:C⋕UFKA(nB) /"96Qz@(k0cxF̳L/,"hv CtvJBӆZrI-.ܿ%5?ڼRNzի/כXc !mhlcNJVl!>Uz`E!uhJaxHU"22iNaa5h.h|qɎ%>s,!at bm '5~ ZsʥP+s.$9uRQzsoes.6Ġd㫫Σl,G،VW9]̗pcj@Tz>J;"RBs.+ =pW3N,tŸ+(s~B(Z&ǐE}EpA9INX"]̗x@8Ïpw|u?~CGwWWп'ұI@m I`E@cH>K9mz6%!' ŦPB)9mQ6XNfr0.?@ABCDEFGHIJKLMNOPQRSTUVW=6HrXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~o9%.*: 1nP>~7d-A,qYE;+xe?FGwN_Q3$k^C{y[K) TSOB lha'"vspmjfc\ULJ/ zutigb`V0}|]ZXWRM(! 8~k q\o^d=)BGnrWzWX nE+TGZ[W@ tm)S^˨]BW,^1zҊn) =#OBKE'@ǜ9KESx3[EInX6*rڰ|@ tQƢǰ VǠ)X+1?rEKE=~xGacX`)L Ԥq8m%==8h )_4Q x2I3:pör_4Q ~=IucVx> /e{7}a,z q̀6nӂ1h )h?O&$8,( 42/~W\8_\, hhz}ԟQe1SZX&)X L V)_4QIH`jpswA` 5a-'2V5≘Ҋb/trE &8%FmX*b许j/X3 Ҋ}ȄZZj'DVe*M^'{?k>a.܊û-" ./x~Cۊv4C)\S|cCj{҅[91<'B+ |ҩj`7w[DA\67Cxos'C5ccX`N Q|L $(p9'zĭ~m`:2>25y|صؼVdG}I|DXaKr3xl_=܊*9f>!,=8H^3PI$8%R5Vɲ;JDt\ +$pxgs<>#ڂϫxпz͝9~oO oQ?  N/|7Õ&ѧx%Q/S|SWںEu7s|uBae?0x'u twaC5{wҲ.>Fnu]!Н~[^ G^JH؛}$es}D:d/IaHл7Sm-vc͒Qׯ?rĞ#GsĞ%n 3zد>cϒT}$:K{!|A6?g<8u MVZ8UM218-|B7Fn =804ᾘ6ZD\u-T"C_bf)O ',z qC&MM}J%pTcXb|>pW|{ĵP }9r:H)>!Mϻ*/1~#%9Ua-u~hصP }y0N 7!\M|B',z q@%I!<#w ',z qHg2IcS"aO'@~ 24ij8r O1,zO2Xs!lM`cX3Xڸ 73'[x"v;GZ\ )fY[B%rgY܊`cXI7:_OzƁ( ޘUr9^Mae*g$/""=GR6Љe,z qSk4f}:1OF9OF >!,,s$e=E8h i9 b;05?Ci%x/b}⾘=GR0=85h )di2q8m%TCQۨs$C9~cX_o1?C)XăMM:pÖS=GGr/|K$lϑЗmǰIbNuh ֩8fB6A!̜cز<'Br38Ea9u Z;?Ae 7y|9Eni œIS2 KI-}?1,Aүk M:uGLh8h:ă3q [?fx{c^z/ZWhKs$5>2~]_<8?T4qAk`1l9I 'n 7>q^^>>hI&IWf=My{3|4p/n>''hv26AHj}dg"MҶ =~;p gpnESr\&*I8N<9M:pÖ1ga۬'2e| [;CZd7E|`dJs~w&OEp-ҷX_" |B'B_ 둾4|²-V"}r7NEf>!|5Ea9WA34:gN1,AZDbR`e,z qp#)%ODoӌ M4ǰd;9yҖX[7cmO}HtǻBL& 6S|"oZE)\'B4mʴL+ 4>>ߚ=O?ǧ[iOߛǧ[ii;=biw! U&?5,1er7x.̇ >zgWnBr7z]~tLɯg$8py>GnO9퓼~O&nVW@ t'/|B],z qzJHj:5i8a[23N]>acXx0t&McXboT=`egFo⾘;v#=bYpcF"0gayOaJҺ0oZ􅣳Ğ#2{ہWH, 0a0&C 8Ĕ`l~ѝXsaNxAaZLaZ/0?VpN_x~ѝDx~;aOυ*W쩩RdȈY,)y{98+ gb/gb}wvO[bv4Ea9 u3^@%I2@6TqeqsB05941)H-`j QSZdX:ݤV(8(J+{oDx3dy Ycq{>*>2ak%MĔf`MA1q7ϫ_ _t GOb(S!/z_!zGD K=zQl3wqPݤăM@AQeAFV\sw*Q}vkk/<jգBbZR=##w4I$;Uy;*mâ7v.N!hԤEr { KR%;Ђ>E&@/RiNMJ$g$0594AQq_L~Oި̯joS+ѧ/wC#Cmi+>3N۶q+= ؿO|ڌCm=h|M~ܘ`k,<ۆ}n('Z`D6qm|6sx-ƢǰI^&;kW!IBPס)pö>sTIG@ tQƢǰMxaJL;MJ4ij"pò(F1,ASN!e ǰ,1Q,z qꏃ>^X8Icǰ,1Q,z qꏃ>^X8cǰ,1O9ϫO˷< bh W{3+fWB{z >qp{1,?Zt8%@ADxrHt&] "hfPǡ)X 4 &BAQZDADЫ@'+Sz[^>ɻ)˼nO.X^b`ZCASr98- \nǰW%`NPXjLnlpv:ɃPXjLnl&pvg#6:p#SKfAI 0Rvl`vrqp6pơC'6\xёK{p#SKfAI}]z l4.eٸ}{6 َg1XZ:ɰ0ڡRm2w14Y{70l0xml)03YT;,f'{|fǁd;.A}K,|on&5=Ak7aXq)7[{7 ,f'{|քή0ѸKN]ga6ƥ,RF,l4.eHm,нg8N`m dX:##pHٽڻK u0T:8NqFZ<3ٽڻK {:]qngjрCog1dvlFp303;Q88 KY}0TCc jYpdvl{KY}8#{4@`,v\2qxFGGv xё_2 ZN2FNn:нgpcql3 K1,1Q,zÒTHŰ. ~iv3(~WӸ/fST\ST5xBOGzpMFZi5=FZapMUX\ST£X*pD~] WjB՝j8g%moT_s};p"vio,̏UVypmX%ʩf|,2B,[V)lYd`GWjZ&%|jg"#ՊFJ<>[VT\X6)N_2nnv)w#/rO=?DpODd0?[>ϖu1'+7N/F/Ç?Ba >:Gy5Z]mᾘ]]IG_Z1V1,ASNALh8p}Y;+GT_G+w~/|=ds1$maWk|jCV1l\ >@deIWɳ$P]7 v~/؛d?ݔ24k7&MN7B:-ӝ' qxFGGv xё_2 ZN2lH].<ŏ?.8f'eg)u"0,ǰ(F ,z KRm#~â'C,E͠ _M㾘-x"$ɩGwD:^ ^D:)>'5зGy6'W%x"tDN=8Sx"ɩ,_M/C LT~T6{%AK @'G[pg.y^J|BBQ䱫 W@ :܂>tAfQФ>0}%H&=zBr\i5biZ!+PێPEF*>"UYȫpX U'QEOSoq깡 uϋqMUjE=PTo: bqM5o1Ӹ*kҌkџVT\ST5tzt,sLQqMU\S ?5:ii5UaqM5 k:S V+cMu5\O ដ_VwFElQ~ugYΓ7*c 8V9%Ҧ0?V[=1fcH_+ٲBoZJeB\9b{DFkr-,W+V)lZQrb٤;}a ྲS+ʝˮ|U.JX]\veWٹ*ˮC=aZS#Ir#) }DO؛;9M9-xN_x$.9ŽL/bNa/9%u_)C=aŰ ˰ ˰ [*A'% 1,ÖJr9Ux$I!C4i5=aaaKb;g"4i?8hA/R 4 tzVq&eX-W[ê<^j$h/PⴐaRtt_`~XKM^}?8-dfn) ŠNzJi4ΰJwKO޿V*͘`J~=D%ȴSgT`~XKPiLɯgvJ [*νxzgPS!/z_!zGD K=zQl3wqPݤăM@AQvSQ.COM 2. !"#$%&'()*+,-.?@ABCDEFGHIo6=>5JKLMNOPQRSTUVWXYZ[\]^_`abcdefghi:JHPjklmnopqrstuvwxyz{|}~%-*"`7L^\'gmB?riCDvnkM9 c VO8/)tpaG@4 UNKE0,(!~{zxqhe_]Q$# sjbZA;31+&}YXWIF|wuld[TR @zΉg;wb*~6Z*vSl[O6/??/.F}8Lj55Sy~r?,OP,/PšEPBJ Bybf m6~d}Օ <@uk?4@X]p4^~wt}2'Cv <}Օ |u}+{-G鰑%{{x^v#7]o +j{f>r{j{_.]>e mfٰϽyw޾#:о#Օ }+\XV;O)(+%H-av)h~ܪŲ@gީʏO%lg+?6{[`}U5j>j-T~fn;WsppDjM7;uo9j-T]v%l*#sJCӥ:`]^.ߛ-8ٟL&17dϦ?r5QI,ɲsSLS7SFةze1\V*Y+CϵzLj+ϧy6myy֧<Ң|kօ/%lj-Ѽ͏$;bliMeWN=o=UgkIL{=[i䙛w[+C ogT{6}r, a~om?ίO7ßZ1A 1@ 1@ }<0=·B撕Iࠛ 5d]u 5'gP(tmcu@CPykm$B}x1`zBXlN}ђl CPsɞCPH!=P)>. t)Ps?ĢB `B>)Լ:|ѢB `B>!ցJaA{ԦORB. zXkE'JP.1T B%@HưP8T -X~ ,Li=,؍|PȹcΣWh/W(` ,(@ |> ,Yc]>m֯[a[}.SK}#Ly`zNtdGr) 5tdw3[\\>6;IPIPsIA(ܰPs 55B%;7IZ-:Me 5[:x`LUƆ(+$/$@s;zSHJdv I)܎1`_R $;cL.R(_ƫ!=fSA}㕧(Qc@6@xB 5 ~CIPsR :Ŀ;=ݢ;D)Qg/C!ّ3Ub_-t?FL=U߹2<\97>5:rN۞wϽ쎍EWbU={}q/^~s;^|3o^>Xtr{t1Qn;:;sf/,cnĶ}4wso]=ێN}ƶ}ݱvGoGsWh,vwwr{D'.涣mw,Ǐ.8;sr\8ձ\}3{Oy`q{3YBQS~af3,όB16+OA(~ PsI!.C!; t@QgZOGLoIcԙ-IP:K(1N7?|K҂_۷~ 5tb]R $;c7֓@X$P9b$a[B]1BPdo_7ƦKPGO]wOm8]z];"^nÁmQ~E۷6\qw87\qwxUwlS9ѱƎ_O|0B;WCB 5Uڌ1R $?$j.ٍc:YuH(\ªHvn_\~JH?$j.c:YHB%ݶ*)1P d|W `at~qUڌaAJlwP d|CB)!_6*YmP B%1c V'+q 5t`UR $;c"k R dSƦnǛp)!)Ps^Z1\CB撾}UR $;c?z1f @HW SB2O PynNng+l?16n.N]̝v>ݹ{^m8}؎>u_ˁs}Aw,oGw.(4wsAtbĶ»r;%7XQw,D <ϗg=|(j.Y~Iࠛ 5dVX@_l PsN6/=ACPykm$B}xOAꇢzP9V'?A[%B撽뼡~(BlveT K!] A(ϴa A(ܟv BͫOPB_@PvΠ=jS ')Ps{AB=ݢ?BPsI)]d BPsI) j$wlg`aMayn BsݾD{Bp,#Ly`zB>.A8R .@(ϴsB_j.PsI} 57l9p< zXkE B%@(ܟv B͍g;R Dkmy A(mJpХuu%\W?>@(ܟv BmKC j.)B}:@(Լ:LO% 5'')B.[TZ-:~AD'S BVƫbw B~UKTPs؁Я{RR jnC{AJ zXkE'n6]ȏP+S! 5/l=IP7/e(\R B%;}= E'~ɦv#?B_˔gBh'. P>O6 t@A(ܰl$Pu 57uxMC j.@8jgZ,B#O) 5'PsI% 5'PsäUz?@(ܟv b$B_#wˆOt'.4},SMu΃Px} B 5)K j.iB%ڠ[tQ)vХ j^ iB%;}C jPsR t@_l*pХU 5IZ-:TPsDP=K% 5IJP=K% 5P?@=KJP?@=vХ#JJP?@=Ĩ B 5'uAxCA(Լ( @*Kv1&iBjpfSv#?BYJ$@Dfw _O)QO |#?BLy`z6 vp) jg>U$P?@ǽ%\J~}CC(ܟv "3X$B `B>Yg[t6PjeӳIKIPs?@W$a}m <`7#Ly`z jO;qjn'.A(ܟv 㞟O6 t@XwB 5dPsJ͓4BC} 5?~' 4By`gCd?[{g=KC jKƫğ'\NcuupIC j[>vVxueTk _L(\dyc:YٺLLe A(?\팤! 5-` MC{mg(PsIC jd.S&rW.۔ȏ2YZPsIHv1 B0:.y 5Ǩڬ2!jh;*K:BQ$Ãy=ݢ3hG{.L˫γ/XG= j>d<@8*KPsN4BKT8TAB 54B憝/J~}CD۔᠛ 5'gSM%Ps? }@(0¡v6lJpХWg_?E% 5Gv6SM:>Tx$ Ddvag}A@DʏJ w &d3,?l:s{)|F"2{Å=#ݽ{,?{& .5XxLLƫ{c0 d$ /dv!`gCϰf?T?yY d$ Ϟ1{g;3>ddE nguZCO R&_L w K4 g:YAkaLą{oʥMi+j厛2hoi o'F2F,XXK;7eaҪTXW?wSaeVM-ʧnڂw4妭޴ho*P+S-̌w?@PMsHV1& vp) jg>U$P?@=W'_ jO;qςPs 5' 5IPs؁Я{Qd(ܟv Be(\6cҥ$a ?'Ym$.%BL˫@ud$P{<$PE]IPs 5D9j3&Mnщ6P ѣxݱN|q\nƭGsm| t $Q6Ʀc :"2+ hD ~ؕ <`&Y B%KƓ4Bn6({vmxd ̀PLnGPs>}1@D] (CDkmO爃]%Kag?tD:4X%K7"Q$ j.YӣSdiM jj+|xK@)=ݢ=ݢȝ6<`7oGw.(7^;pɓ0 xޘ9y$ܶ}<ܱGNc:sܣXnHa͊:S;5?d|֬ ~<ë;EɮlšQgyXX|LyNd/SXPs1auZf${.SX|LyCPʦ+JciLaB:SšgScna'S.,? BeaBDK1X(cR ٹcؾr#8v 9y$,~"fN< c'O'ř'OCo0wɓ'a6r'c}V<0=[XTsXa'YqIKxc5?dec'n1@ec'}W;@:YccIPss:YiKzPXTq )nIc6Pjeӳ;v8,:S`J N_IGNa1IbL(\R Dd;5ǔ'"d/'vI)܎1l_fa?ouJ(d;dd7ʦX,V'+aTuZo$BͣNbw"H Aec"ꂤ$Q6& j."B(؍<<\'.\w΁>z>S, Lj`}L1M36*F~ӳuASO${ƪkR .H'Mu=c5=)LҷI YAc@ucӯBynG)Lϲ4X%; tYRԙj @vN*ak, Pd;4[t3U ⿘)ȏ@y`z*I, VJnc;7xb2F*!.KURy#ȏ@y`z*I+%ٱ={V(iYO4X%=`KURy#ȏ@y`zJ_x~uy+Ps޸4gYo`W+^قw4ve+|-xG}+[sV~je ќk+j{Ww?p@D]짎FR .Hʂd74uAR $Q6Wf )n BF٘F*!6]]4*%$KURdm?U'2F*!3XciJ~ <`x.KUSv5JaB#ȏP+SeiJ2޾]giJ 5k^uѻ uPs1g'.K*%$KURdm, &`A ؕN]Pd'c Y_O4X%dix}(j.Y,0=`xR撥Ά=KHd$KURd2`KUSIt uB(؍gYTԙj.S Dkm Q$c&XnG)Lϲ4Xde=w*d2́d7&~2KUBam-:m:Ye`x*)\c$pХLƫeZ-:ve(Y,v%,, VO'Y_veiJ~ n.])ȏ@y`z*I+ePVf$YJҊ1}w`ydF~Zl.@vΠu$a74XfB(؍2Yd'.@v5Z-:vd;S7On)ȏP+SM%\K IPs`"yw$aAxQgrǃ>_J j.Y,0^$iB%KƋ=lųBynGLy`zDk[tm۔`}MoK)=ݢ3hGv8$ Nk#Ta@8AKX;P@8, V*v*?H)=ݢCi K:*{>A+uASeәjoY6[ W@8R Dkm ڑ΅Lw+@Hβ t;@iҩ=v6aKuznFoZA[Cam-: TAGv=njnSA TKu6=ݢ3xB=ݢ3hGCڠ[t= E'YՁJ lz]J3UA)8BZ-: Ts#{؉`}F@vΠ΅G3 zXkE'Dԙj{^ڠ[tڔx}πaA?q$#=ݢ3x- "{؉}Dkm ^Kv_yLlz v#?BLy`z zXkEgЎ$p.L5oy2 N_kBEcX Q${iNVL&6YP(LR D3^uZ^xR . V#ȏ@y`zR .g<۵->I)Q_xyoG()Lϲ4X}:'Ylkm ^ci&e}?`MwIk?=]2K%$K5!Y,aC`e%IcK%$K5!Y,ah(Yd>iI ؅/dAynG<0=K)Q/g<۵P 3^u}jjeӳIK, VIQ$;U6, }`WB`zXkEgЎ9ISfi M!F~ӳuAw>iMV _e/ʔu |#,vdnd싅6B#svݿY ^gc]<| gAw<օWHVlfwhβE<ύjeyvdnp&ɺVMɺ6WYLE;>{^, !4薉yvۥׇg{hhalOj~}}!vdt+޼w=ZW^47 g%|.(fGv1kAkt.eǬ}Yx8+Yi؛d Ogy^>9'G9{53TKhad#Igeeҗeeee˜CPʦ+JciLaB:SšgScna'S.,? BeaBDK1X(cR ٹcؾr#8v 9y$,~"fNvQSQUEEZE.DOC\ o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[Lۇ?ݗ}{{{>{zww}w?3]oLkoLnkxȣޘw_> C AQboLoӻ/wwy!0,$fsJ75 ?/_ϟyvzHvbHIF p׸Tn{l.U߾!JdT| YgTOޘm>p|֗>Ѵp *o_ƴ~xv{ó_{{~x?ƴ>\v!E R!YzEBA?-̀i 6E*t*0sa a*xmHu7vp@A?-1[d6{%uQˁMCi \4wܶe/KZw}Pl-ޘV*ZGh q\TE:}3$gi5- 6E{i?zzWg!\G7pі-J}Oj8hF7upW|`vU}oLw;FC8Xʲƴ$sQ8آ[`sswޘYPw_pS8-! (ux-'Tf8qYzcZҁgatȣ8B!\QzcZg%Q^",| sk%:ZROg,RnTXpG\<:,w s\`Ƃ ?AQ*fzǣPp A9 C AQ*G- ZGaRzcZuyxo_݀\uyI ޘ:lُN%h,O.c-W 8uyJoLka6-"OȣT`YNoLȣOg\%`)pY\{o10-ܾ¥WqM9:ld9a^* LoL@rxZF~$R~*0J. ޘV[ ;wEqM"A\tĀOtfDN{in]B/0ڲT>h ZR,<\{oLov^G[p>[oL ^ݟ}w|{_~7EoL ol-.q "-K'P7fsQd40ZROgN>חn9`C FA'-Bd}[$:(WƴW{o1wm9[fh薀N CYimY\ '3[:ҁpDb! (g ƴ\qq><U ;-"oܲeA! (i AQ*<~aY__R%Hh!k@Ei}*.cH:< .guyݿ1,K/Ti *Z(aPF>ƴsuӮWwC<•O.{~_^NEbn{I Eӹ7oW9$ ޘg4zK ۇ?{cZ{cZ[CbHU"[v>arqx_tA5q^*>Exzg a͐1x75ڠ>I-WpZ"-Oln|Y`r4zcZ;E7nٲ2dp&oSSh'zcZ-R,oAA-œ>݂8zcZU͢}pI!%hum-9N^ 1TX`tCQ\kEJ 0G[k7h)X zéQ\TeT1"1*fϲzǯ~}oL]NaYT*N"*""ޘV-@pXr|.UF- w |Z|:ƴae,ǠDĩT..iuQ`eTpI80ϋK0Z!ŏ.1gIJ5cAE$͈ !ϲzW| uQz26"-B!BuzcZ@ѪOgPŵ4J' (fȣOgŢFp.dIg-@,;oZepQH A*GsRކ@oLh6D.w(NPc6Tv BoLmR* A]Fv2l-BoLkpF[$md .N>J5BoLA[oLBu>Keeƴ1(8Ia BGz lYvzcZ$q9eq? Z8d {o1h_,A]k+,KlGH7Ւ`Ţ0,$Hk"'F[$|7_=WwzcËpEϲW9kq:,{ޘ֓8AQ*>K7]@ϲ.UzcZ8}^p9%$FxXg\7uY. ɔ(u{SAS--B"Ri}YDR9CK6P-^ ~>Eޘo|zcË!\ysxu7s1SaYxsx]XjHAjџ}rywE?2-D8m[75E!\G\$oi]uyEbdJoLkAxՍg!E-(!H',V7R`Kd\ƴjf%p%fceqpWg!Eg1p6ǝ?LGv 5 ƴj^evnA yTٜG3fzcZ |'5f&Hr\"-Ojƴ޾"o_ƴ"lYY-B>9_*ZޘqQ|J"7 'N "lіMQ(<ƴFKgAP%ON%jlVI.DoLas->klYnzW/•7 { =>.,ƴ|ΌQ ovw]ab/r7pu 1"Epvw]Ev78E0ޘV-QK/.UŒFzcZ?,% nlF A*>aJ`ƴl`2΂JPzK/Qf&hzcZg%Q8%8Fޘ֯I:lsP}x.8y-,.AQ*>K7h*89Y9O ϲó-r7$QuyN6-ݟ~hRElӪE`ehr)tf>KB"Ri}<=p,8y0FĩH pӪE("l.JE:(YQpDoLm-+h薽77?<•}~tawa7sdA"1Fq* )\G>KY *N>gR"ZǠ|čf\ƴVEh)XP}ز;0G[7}zcZGK ،aYHnp:uTqYO;9MoLkoLxx1+/ōƴ|0pD\Thf׿o~KI .i}@Ah|a9J`KEzKޘVI%UQ}ز;E8ƴ- lSo \%E>Z}ز;cG@M*6| buޘg 0-.N-i *.`HC\ђFƴE7. .U*jlհßl}LoL NA b3Zg _~ARf}ޘVT*թ*h8D"1Շ-Խޘ?ـB[|.rZp9c3Z$:\EJ ƴ+\}/%lzؤE,EimY\dScatCavnA"Q\i=?89hEIJv*QEp9[R%zcZ}RnTX ܾ*o_q9E[6.DK8ʦƴn.ETb`E-s9źՍEJdrzcZgNRx޽{\|-(!H,RSɇ1lzіť׻?|ϙ A"l-JoLэA ~+'3ERԥ ޘrS{iNdYԨ>ʨRNŏϙfzcZ6qPN>g2lsdJ؉ ƴE"gS\tؠx{iQbq[`s IpD )\GA"di}.U6p!W.M"dKR(P- 1';RZE^J?J(NPcTpƴ> $Ql>-q˖F3x7ueq={i+nzW/•,.հ砽ƴ|0!ZіťJA}8 Q\8IzcZt?'8 "xZR,{o1w)'R}Q2Z AwNE┃ wzcZ3ff%F"EȣRSYi=. {GrZ-9J,4Req@Ei-h"I1Z` ZE?HQF ZޘR, |ΐE`n! E-9Jƴ4[\zKg!]b,2>+٩ 1Z7ueϙ.!Q$Y䋄ޘ7nٲӯ^+mY\aAyaz9$U[smY$i@ -}{épޘ%WS;!ڠ> Շ-6Eآ[Hn\ƴ^$oqs&ϙa,[oLEanT?q˖P#HhqOũhzcZGKRE -_F[jsP7sZƴ GU* .UlmP\|Il%FoLx-o8,kzW$ >`IX, R}Q%FTo7۝gƴ.EX,(~,KvAF3Z-TiU6PCr쳐"0iwa˙ޘg `3a\XabTݐE>Ei_t"-UJfaO;1w)E޸e?A)n$X%޺ AQ*BpjJqE"8y-a, ƴ&QlO{o1ϠTpl-.gv >O*J7u~qE 7 ;(KlY{W/ypiwaʲ{i=!e\hf'cs-Z jEi-˂ zǂŧ3Q2Tp> .gƴ,_z_ Z->V6"*ϙen.gzcZ>KKh!FIJ" . 6M\ƴw[$pOɧ3'[oLoEI6 j.azKq\RAK\vzcZAOg|`|(쳐"Xds.Uޘֱ\*| (Z<`3ZmѶ 5ƴ2[60ڐ+CzcË9? /LazylޘbWlޘBCe_׽ƴ1pD3=l.XF.Up JoLaH:7d$`3BazzcZ(QNEE&HvDmY\ޘ%;\Sp[oLxx1]~uw :^#µޘֻWo"l~lSo *^$niAAQ(D>ʨRQál]<0,T9IhqƴVK^:x"8y-hآmmPzcZTeTo *Z$! hT͢fe7 Z l88K9 XƴF>ʨئ8E b3Z}ݦC"ƴee[oLxx1]~uw :^#•6ho1f6e8mY$i`tQ!]bVQpYi}FK|KcFf\B(d.pD:,${/xoi_!\yAޘwI`e6IwxHS(l l2cYHn61a5s،Sܶe/5TeToޘV*'}G!\GTR"Rwx6 Ei=٧'K>.> ^9f12,!pmP5"-)6㕏_}i+m[]\(AJEpqM@oLq˖e@Q%"hJ RqX1htZ%o-KI%U2K4f60ڐkD@0["h 7Q'3g8ޘ֣JzWEJTOglFavn @lbiEJ 0I =cv!H꣌*K6.UzcZm[rEJ |o*hq[D%maY1aE-˂B2e8JEa$2 7p1>2> jLA}$肀 ƴ&{i" > jSp9n+1vx^U[oƴ~QFʳ_cs-}oL]} nTo = P-(!Z}QQ9ڂ_~aeqBIv+ޘEJ (ئޒ˸TQ\"p[oL_fߢh)X|e0,1/f߂bA-˂ 7oAReeEgh)Xޘm}!H,R,ؠ۠PY6.}ޘC$_w_p0Z A{c9ڂAe,x`Yv([ I"1[D%f/;w|`t9K7ozcZߥ|KO۠T$ؠ۠D>ʨKm7zcZh薝Y%Eآ[(.bt,".>ʨR4zcZ7"*1QE(TɢR-h\tDzcZJIhf[st[oLMSoe6"*1ƴh" "~-\pDYO>i\tmA/0ڲT>fHpQn@iuQ 1-PTX"ܶ[oL+l[rEJ (8hfN>&ᾷޘE abT SoEzcZg%EkYP( (7FgInx eLޘWT@2e,.-әpD|/uyJoL\(Nb -B>9_Uf7d 7ub/BrDmA`џ}r8(1'AFK,-쳠M(oTzKKgƴj)"Qda^z A],O."ƴ@p!\G>[oLW`Dޒ˰Q\Al9ɧ31z$Z=D"C*A}r-QHoL$> jpDƴ/r?,-oLƴmHʴÖKhFK|B07~;ڐ-d$ n,"Qߎ6$}8Ұ%2G[5ozcZ͠EhCRM%;|BYF-+8@oLuy [ ،!R}%T SoޘEnTX솬5$lT_dn,ƴ)\G0,OERqgSPO?I'če",jnB꣌-m-1ڐ+GaRA F@oLOũ>}pҙׂa%lOg}zcZ[$ܠeθ;nTlF0,K8zcZH-/GbzKExቱ`tiR-66(>0[[I1 ŅFm>i"+.U٧3eH[I1 cqэ*11Do5pWy3ʦRE_R띻"ؠ۠ƴ7fPONr<_]( A*4ׯ.Uh_TEԧ3~JQ'7솬5{a 7׿o~{>1 l䒢FoLk6{SbY}ޘnMSoe6"*1oJ|{".zcZG46(s-h)X|"-KR7UKa>mb !K@ huޘR,`npW>0$9Ogf] 1AQcq A!s-^66(jh|i}E߾{i}H^es-9?|f德ޘ~U}oLޘ~ҥνƴm^*1Z t!ťԽޘևt"^6N%\tD|@8 `YiMn\Xd|.wv>EP}Q--۶h[NޘEvxeΧOXDٲr<>(6r7U0,Scaasfi6OhzcZ2hіEAa, E~75Y\\f, 66("(GU*j8fe7ٗp=$Ogpl~h b6(1Q2gQBAo@toWX1. aD!(߿cl.ETb"DoLk꣌-l9ɧ3hh[d"!(G31jg"" [D%}Нoܲe7?^MpA{il65(/'jgg>I6*n,ȣT؟},E5pW}`s!H7UK\[P% Y'3Gew%"ƴe*wO> o KhxEv+BoLkpAaYȢ ffآT}@oL\$AP}ز;h9l"1$8␒OgzcZT%U{o1aX7_Q2[D%>j lQfF*sCoL_n XwprZіťǂ9-ni= It-[D%X%ON%_^ڦRDoL2(Br}нޘ֯o_o{cZyuy\΄ (g XB01JRj6(1Z(aә! (g XB"/ӯ^9W׿wC̞S">d$`3rx \G0,`ޘE[oLzx1>siWp75 hqJiBrf}ao7EimHm-Q\EaEf{o1uy\_}%5\lEi AQ*5s{?.,?.,.\{iT?SJ2(} !\G>KdCƴwΖ5/nȣ0,9<#"chfߒ}͈ :ٻޘֻ"EQGv§G⢷!Dv<l:,>> aOD>JE l>włzcZGK|iC:ENŏ A(Df%g7UOqKіg;nHW%2,ƴi8pG p* 4t a,ƴ͍jD /lg8̳İßl re1[fƴ!GaYyՇg'\}ٻ _%]GzcZlR>pŒ?AQcT"D ]1. A6 5h_ N1,Nŏ\zcZH G"T?%)F%&1 ئRiT@S"|P\ΠEaY 1Z$lQ@i8 >K`Ocޘ(٩T*10t7ów>m^*'_|i"]-Qg PP%J(E%"g7$HE -NIn>>/@aI6 j,'7uY6En[?ƴa6J0[8\}:E}?Kw_}m7U8 -g;78]$H-BoLcP؊ 6EŇ[m|OOӻ/;<`<ϙޘV°h~'67>wg,QpE}.Uxޘ(٩Tf%`_ಥ3'_|}zn#.U><{q7 <=1ڲT٢ao> 'g?jzcZg oTbrl h}8y-Ei n<>Ex)ئ~wԈ2ڲ,hzcZMD}p<jhK- &NA*I}=?zcZ=?xM%:AvlfY,Xĥ7ubsn|N(8} ˬE] l-ޘ(Gn|as0[$2\\%܀OcOg1E\r8,1l!-\C ";],_ JoL ,Xآ[rl"Iq-Ee67>wg]ޘSq3N.).U>>&8,!H \3ɔޘ_J5 K%-(N}:CEt7U(ϳDI <MR5b"P:zcZG[(!xK;wEN-[% \hGw@oL?@ABCDEFGHIJKLMNOP6=5>QRSTUVWXYZ[\]^_`abcdefghijklmnopqrst:HJ%uvwxyz{|}~P*-7Mr\`^L'VmDiF4/ }kcaOEA?{NB)(~vg]C9+ |pX3&"! xqnljhed_@zutf[ZWUTK;0$ sYRIG81,# ywbQt['OZiE>b$^x|7> [;o#L:ͬj䗯_H34&U3~d:8il;WkN>"ןƙ0*~_M0_0?io~7ͣX~b̪Yv{$`0QHpt~b7,6 `d 7bg&Zg_jluΛĪ([}`F+{G>0J&A QJ#AE@C-,{|-pMʆZmW# o=b]l`]bjƾ6ALO'zg %28omxvڊ!3k[yȑ7nlV8+j`.Ww֖{Sr6)ckz.ֻFwռkp96T3oܬy)yEocx瞶ٳ:.=~vǖνK~Kv,`X`X@'ʧ3}(Lú4JӰ.JAWX\@ΰtOS厙> EQ!*`%EQY W_޷c,_v96r qGú0 RSu uI㎆uuII_[ĝ fHZӰ.|. o͒L+=]GÌŌ"(?"@E>PD+J2|d6E>PDdO 2x*ecL(Lff({!hX*iXj:NzѰ.U{zܩjƌu3]Yΐ@>0ؕm*:j)`ޞ{n}5oP6Ljjw]Tix2gV3Ozg}8;sh.`0Ɨy/pwyoó7V )Y☵C4qcYQSp2ܛR6xlSеYNC^s5 ^ۆsExfM,-7xIӓFg|ggYTtS.qc˸+qc7n<95bjb:o9Ɗ!OwPDa]5P *ԙ͠w- L& LúqPYW3f4Tؕ;Pt,EuF B޵ %7 댢iXݼ"P *3h4@iXA*ogv1 ""(?"ڊRcQ*?X4YgK43 뒢:Ӱ.9oގ&Lúlcmw(y [&3 1qWPl:jƌM}N6Prð;\Nhlfvq`LúM}|ʷ8&Lú ^«;GՙՙфSvax Ό&/#h]좉|;b"?]=g6a00VՌ)#h]uuf4dؕ=2&uVEuFI ci1댢u@!ָCu넊&Lffs&[R4Qg֥G[&;:Ӱ.Sva,c+J@",J:Ӱ.)YtV4\g"(?"j 3 &[ By(3V%h(:kE>PD>Ӱ.CX­(3V%#[Qg PgXJX,T;Rq'W o҆Ŋ(!qO0Umtg_ Ŋ׳[,`]0xq>gYnyCf)ήZ7yP[ y5Ӕb ]v˼o/(SiJs o҆N0:Datpm)։rL_r~mJم_%Fkg?@ `%%P㎂M"eƲO;kgŅ\OίM%iXLbt~ma,}:X$Fk@E9(wX'z;U;Ktrp-\| óSӰ.)kqa,}VR);e k«;GdK֥wlZ irڀkWwȖ5K5(،;eax۪ hXS㎂͸a] c7JYAѰ.ո`3hX֓|(wX':%UKpw19P6&P$0 뒢60 Rúl &xl`z9q/ 뒢60 Rúm@rcl/om@4Kw4˖5K5BL>m&&{QzxMӰ.iѰ.[ְ.QJs$xl&iX4hX-akXw0ȠI`%;eK%hE>PDA/K^^huI㎆uuI QKs&9ф ;'K[pLrc|a]Ҹa]a]bc`MӰ.iѰ.[ְ.Q~A4Kw4˖)i@V&iX4hX-aBMLrcj4!AaRV$0  %l ŮcЫ@!ehuI㎆uu)qaH6E4Kw4˖5KLI cCǠI`%;eK%4@B˒Ů⁸a](L&Ӱ.)jӰ.5KAN~w a]Ra]M$0 뒢0 a] 6QXW3fXw4 6H;\mJ+hb]14K|`֥ڭ`MӰ.)jӰ.5˖Li6|`\͘w*1#:x%ܡbgGt }Z߹/?{paa♵-Y8PRjQh4vևeqGú NOمaJYw 2]K0wz۸(v?Fm({;֥urPPKNO;fcԸ`39Q<bpѰ.b~{`ߦh;P w4K [I6E `F(Y@!e&9(xDX}J=0J="XZ 0o8w4Kߞ倒r(hE9#DѰ.)J3nEE9(wyrjhԐW3Mimq<}j߾SЉ$UC6PR*2)ZúTL&qa](Lf>`K4SUPQ̮klJY?$^{%%. ma]R-akXF1lQa,4KJ\) jMVՌ)h fHi-)iXeK%VlZf4KJ\%l 뒒XzaӰ.iܩjƌ6E>0 l [úTlZf4KJ\%l 뒢:0JVj` 6Lú.[ְ.9`B>0 l [ú4T4LA끩j` 6 0 oS6E@IG:0zŮU(Ux#S2`F1JUx фrj.86%.)@9`%%.ph A`KS`Jj̮ӷ4P*e|FQuINW3f4Ԗ5KJbM!W!&rHjƌI`K4qKJ\9o:mq/J\ )|hE9`%%. -akXeKE3l 뒒BX |;\mM(OoN . *R)$.p8r V=iX)Ӱ.)q+%l RV`\͘bm?z6jƌ*1#_ ?8 6 |5%.ڭ`X?)(wXr0 Tc-q^ .pNمmRa]Raż>:0 뒢 fHi¦ Lú6n%Tp5cFu Lú F1eZ4Kr*1# w02 KمmiXAF1凌_-Eu`%E9`\͘PMQuI mJܩjƌo)Ӱ.)q ^*ܡb(*wXW3f4TC;lbG1dKQ̟߁8X;7"kr8;RR厙>Ӱ.Q/N@+iX(旧v4K oS6E !@(O;J`TúXVi @օ#ֽ;J`%6{wui4!mʦ3Duڭ`Ӻw.A! fHiw]YFQ̟>VjƌjqGYݕGQfV{XXGQ'qw]5#(VՌ)q(XkF=#P㎲+*1#%`z󈥏XkF#qǠh% fHi(^nĺwuxXX .F+}dq..Aօ#*PPKNtb1Ӈq'4P!)ĈrZu"rLMdcRƲ+=3x`[MhB)Vu"rLMďDa,|`FOMhB)Vuߥ3}qg4Fz9gry]0/{jƌ9|O/<7{SjƌĀUp5cFJC5T쁍HƲOzAȩ9r dܔո` )q OE!;R;fh%0FB>0 (#+:щrL`4P"P|$T;R;f ؔAl[&q'0xBú,JNP#.D=gkcix-ۅK߉kN_5Z|,x Ug&Prð(ŐhE!PRC>0 @IGR b_@ہPR&PJ=Bb 3R2ja,=@ <$а.)) !/Rva,{JJ1O`ܛ½|)q'jMO>\͘؈|`ڭM(JNO;f <gn\L\ 5޶ cxc 28*1ԁո`x"HM TúnE%.uIIºq1q'0x"` 6ubܡb1G\~vʞt1(ň װ.)uNbX'ʧ3}qg4F `%%.pAQuI mU+(Lúq3RbW&kZ(Lú6(Ӱ.)q d䔜mTQj)։rL_Y2QXW3f4Tؕw*1#I\`TQj)։rLq'Ը`%Up5cFJc#jƌj,?j]UQj)։.H;f]*ɘh֥|` 6 .]L&Up5cFJC5Ը>;F186TtMt)` qF1ߓ>(Up5cF rG .ph%EؕG˄%"] L&Up5cFJC5Ը틑˄` jƌjqG;F(9Lg_8nf8f_g-7I\kXm/]jƌC\S^ú$nJ`\m8޶#w#F5K80 ])a]Rt%G$l[u{ VՌ)z`\dHi4T RVЕ*0#źfK[`{q/Up51#P5K)$.Q".; c[0 fHilD9`\͘P [AwjÌt% 6Hni^@ `*: L&rQJBWjÌ JG-t' fHilD?3]ٛZh=X0 oSva,!фSva\KR;fhBp\. %|v.B>0 Rva\KR;fhBpS. %|!ф]&RD厙>bW_"jƌj4?RR厙>_I )#+1#WXD\+`["".&nqhutq3J\+)q3A^Q)>BqG!.pF |%%.p&H+G U;K4q'4K bW!h95G oqI|b+ !*eBO gmO}Rg|C(#]ʵs٥sq!YGN#aa,`PXEBH*:qFJ٥3?rSa)<FGIapѓTGBMNJ\X&& !*er<.!bdSBKv];e|T TU$䑰0  &O C83aѓ¤$ThN#a4z$>,Ȧ䑰0s/yR& ǹcnwb8GRl7Sڿ&w?,K1G sXWȦDžd];i򸐒 u0yRؕ}w., `}o幋ԉuI;J8'JR|C8qb+ AS]s[>i0';Dž*TRJ3`gރOLl%!Si2]Iaa,}\pR} ɻT-&O cБPE4y,9աa]uv5^D3>ֺҙ[+wz` FBέ<\;[Jo 9C _Drtk֗ X<`zj}sK[Gim}@zW oXEB'!!DW X[>'RL}Vp ؗ.9gd%yo>xB)JN=ry:to)Ӱ.)q ^*ܡb(*wXW3f4TC;lbG FROMXMODFQRTOXMOD FQR݁XMODEM FQR"lXMODMFORDQCϵvcFROMXMOD.FORK   "!$#%&'(*),-+./o0214356879:;=<@>?ABECFDGJHI#Gۚ72 |çӷ}Niӛ9ͥ%ᕰNNݠ["܂weѬ&W־.n,wµ㝼eƋnw|*>FelE) n^',kÇ?XPڶi~}y{`lmn7"|kb*MV] G3z,Y׏lPdհ npŲlDX9֫*yLkVY۟Z]+Ç?=kS&9{ݬt.xĞ+kgUFf.}µ'~(Kp?n/nk''~(Kp?teƋn|*~pv#}Çwt .^i5>K;ؓbBi 6>19XcO+1ڷ4nhڄ-X,@Iz%WY>^ja_m->,bOXvcw/kg佫O>^jք |Ş`ckg70\t}էtZ&Ç7+ZnbYfX,`#O9eIfX,j7qD :G߶?j=e5bGrc0eX,@D~R\^h#vj뾶N;?R;LJB9Ҥ/6VmrS=']}JS8bcmrէUOGjvV[KkkF,kd#j92"? GlOni@v6+9)1rj'٬GjhM]Æwv6,a]fe u_[IV[)Z(G4I vbc'7Փ}է45#5~ΑNptf5?FkZZ[5b hM?wnV.Çwzaquroir=\TX?dҦI c,(v򫬝Jkk|Ir5a`}ag.s ;KjhM{j-{-X,Gre m{vG3z|Ӟ"ŲvgϒˬWr,9&6,-cg ŲҶ=`*M]Xf\[(?Oo7*>a ExmX|%Gd]Xe$KPAyMm?vӃ{,e9?VǏUL E 5sLC=[(OVcP罧ȪaSf+\rjoMr9?k|Y93y6_>5~~iwjp:cďU35aB1/^Ʋo7ƦG+9X,xi12k|dcJ3G(#y{0>ŏUNc=9,- Ial] z[}t :ǻJEfg *M]Xf\|6|#~*3Z@ABCDEHFGI' }'⤳4^fxo,%7`g\2\Kqƽ\mtsrZEUd6^;R5kiK:ڂ) GfM8M P4AԧniS\ʦ wmo^#w+cF@nehMf3IլGZ)[PW!}[@UHx._ ;QL ia]AJZwBZAn (9V4yQ7ԐB`WggP..=ȍQSucH3æOqb󢩳pQ(ZJѠR&RSAOvR5βMKye R.KH番YNzv=Rܦ{R|{ao⽰WgiB`CR5ۡ =KlgCk)nw_J|~duo^]#^;GZ)zY' ;YOv{ RwR6,Un(H+eCR5fA]wNz"w+cF;I/B힤?Q3=#ꓥj!I 54%HR5ף7H/ɮ>yjք6,Ry Rng٦-Hx/86U'+U&M/Z;p˕:mAdג{q{{o,Jլ 54%\[ĩOے6)Gieo :JG|0p.H낔q]13*s,K(HA%oysnAn9X -H 'i|Ԃ]1HII/ZXroION0$Vu @݂t|5젋c`H삏ZSAA.x|;HR5 RvNjc`HTT|HR5Xro {5]h>?H}wo-gcɽ'iOD);ck3RnYfHլ )Nq=J+~'番YN[$i+k)n⽔,V7K{^ˑi W;= :nisߑYNSB;=#U&.cM$N}G`ז">i-R|pm)ngj68_ϯݥ}/Np$ւ#1|?0lhkVژLƒ[i;6u"8ךT:l4u(UNj]ƭCb%PRܦ.8_GZSM]p$r!5G6j8 }Fr @]Kq4X.4sŐ yz-moysnA'icɽ9'WRRܦ\eun&zVAlC:q{o,f1vۙOv6Z۴a^GCb%PiCR5[ث;0:!ؚTͺ8gE-8Çts,mkm&z6'i?9X ԵISM+]\ͣk)nGũ;R|.nߑV0N̢-Hx/86U'+U&M/Z;p˕:mAdג{q{vXMODEM.FORh ! "$#%&(')+*-,/.0213o456798:;=<>@?BACDEGFHIJKLMNPOQRSTUVWYXZ[]\^_b`acgedf}3Zl[?'r} 45Gd§ēCɂƗ4vycV2Z+;ɹ~̗.S09 lb!_kn-R25gT9{}މxBMTZl[5yo/%-ע ȶCz 71_JZ<RA2>Mc>գ ,l@;:KQŶl1ߘ}N]zJj`~`YMeEE>>pN}BO]BHSs~L|u̗9/) c1)(C~'pD{@:CA3 0cY|X8w/ F1ikDN#P<1Q1>P[#,%>pk)@܏CjySdy#b@hGҔfEEQ`^-J1YblocGZVO"y* c>2' juV3Տ7}ׯ:fzYaũq8"La<]|J<9mⓏNŸV'u..E/]%J֘uꕲOe?%JsQ_yJ<9)P wQ_9zc>2Ԡ>,032V`,>e3{+hޢ6X1f*eX3A4 *aX"}f+0/ΔE2LeGSjf{þLe /5i{þLe- B5f*eX6_#~<XcHJ1SXޏFH13BPbLw1SylTZl[6}_>S6[~:#E8"<~}Q 8"2j&u-~Pg:W\]dS/%Qov[;# ^SSL!ŏ7E>#$v¨9)q[13BnWG)^;昏u2585LAqܫ#NKݭu25H\V*cdv<qj8Ǐo^ޱTӘ)3f}LTSzR9#a|ESSRT1(%*QL 8"2pOKP?1SQ3" );vj򌙢+^`§ēC3-_rŋ,Tm|L2ƥ6T1DD%)GDFi w̔DԌ*b̔z=.)cm 03{Ώz?DTR E5߫c]LQ\u̔Tdyc0LNE_*J<9,Z=u5?NE_QKe/Gb'ɆTYG#^3Z}.UxL[џJ6V7昏4%sYyկ<޹ш1IP'=ŬSXA,*wU#rSj(ۧ,@|F>S_1SwxLQ$AxF a_cT^"/ޢ613B%tE玙.ɫdmc]>wD,t ֎V'^>cT^"/[џJ6VF?ym1LO'񌙞OޘQ6`! ^bKbԜPg*C#*OsŘCʧeƂ~̔w3B%t`<9sLQgSɡd/Lpz.Q:#mRKb8@;?s[DeuP*o1S/}9>73gTza<3g bK(\>w̔.#zc0L)<3-O'yJ<9,-a<9)E>#Q90j)z}屸-`|J<91SzF"Sɡd]>w̗RylT>%Jz=%J֘)j~1|$}Fŋ0G#͓^q8#><h12Bb=1y֎W a<h12Bb=_Jebg%EН A fԛݖz`kL|)=1x"ފ7[Vr,#ߴa7D.Q:fJu*R5UUսT}q;{u̔)j~1Lu*RUA5߫cg`@hp۵5>{w1pDؕ0~kT13mE*YXߘc>YHT0jE z'bTq,BKSy4O%<5|$,}Ѱqxe_ͩc8ߊS:tJ1_Ju*_*k X˾pnNULsTY;Wr0_E\S4ws:fJ-c|d\hDNçE #XR 3y)ޱsIx`TbU6h` Lzͨ ^!;@a}nt%*QLNE_*/,!s[/ HTV r3-A`mc>\%|>Vi?f[SsG9wդgKi_l쏩#zդ%*QLzu0ݥo{Q9wQLzu0 Goqr^ SɡdRZٹ@}˧ēC0|>'-@_AGSɡde>;f[)P?9]ṳYZٹ]ܚO'6;?[LzKc5?c>rŋ9~ ;Kg*!NhQ nErVƺ#XRSy%|e`mc̔0 nE15w?ym T&w̔0 WhdíO^%kK T&w̔byKT:Reyƞ[џnN%d )꘏4b TF ;^Udi _Z(s,ԧ^c̤;v~i̔B87{q+%*QLzKi gjwr+J6&߫c&ޱ3e̔!`d cW9FέO>昏,m}͓^qڑb8,3:.PrZ<}9ǽNw@w1 [R :>㎙ҽcg4&ǓRi gjwk"K`þoS{u̔Tlk"K`þoS{u̔c}NSJWrJ1R^bS5[/Fp+Io)\.U:rŋ܊{}:#S_"0D+^ c&ܕX02jꎙg`:8fJQ ctع񌙢sGW8Tarvޢ6a'pD05c>*]9e¨w~V_AS!?rD|3=a8sLAB^>wD,t sLAB^>w1_*\.U~U1_*SnE`{uG2ag"0J0ꋢ 1sA4(dgퟭcg`:8fdtp]]SOޘ|"̂6cS1r^3nYR[Oʹ+1Lʹ+ϘIR3fZҪcOFט J%<5(󷞳0ꎙ n 3q:#rn0 Q ~ OFRM}~{c>R |>Pj]ࠉZGuˊGm%SsH Fmm/5b+}{P:o/ k̗Lyܗy*vl-6٭cyu vZeRTRy7#siz'zcG>#Xo1[z <Ƙ|F`'p g " cun .JPHQsHK0*Ԝx*Q1ȾX1ߘ̥u+^ǘ|F>zc>!(# HO^RG#r~_n `@`'*ru O1u-@%*?T*Ԝhs>%J֘oG~U0o+J35HE+*e}|c>Ғ 2' qE4Br<>f:ƘT{,*箌NŸǢ1+e4r^3qk{P\ۃʘcTZٹ]<<(:f;Ow1_Ju0ݥr%z01_Ju0[K9wtm1-)}Yy1S02m9cw9v|=ʹ+ HY 潪HaXR*1YH*1޲=́ ݹ 1޲=(2*:<t^1޲=dTtxLΥ^;KzKi gjwn^ۃT1_[J`8;ϣ=(AeG}.XOc&Fi[l 3-FFi[HOsE\5:f+5JƘIkF4B^@HӅӫRZٹ]0}.XO/-u0[k[P9ۃK^s3-ʹ+ܕj=(|Io)\R9wD`,Bxۃcpv.Goq/ܕKҘc&p}.Q:fT]ɜ}R]qLz2'r@D/cYZٹ]T]D/X՗:Kzu0[\*\LzKc5)j1 V3E|2:| J%<5*6|FV綀|T{,*\|uꕲzFV]D/|i[x|!(󷞳-`c[01_ZҪc5:Sۍf9;nl:? R߰MjnxQlnnn_[Mmcvxx+a4d_[onSkvne[62m4#% xz9(tP y*-s*?rL`7ɦoU|6oSM6]uL`e֌NJ.aF}1mn?fL``7֘6n:`_uQ~|qŧēCQ{ݲzēCO'u:nYn[5ߊWxm5~^VͿM4&uOej/(syd3pvv*O'"Nx˨mL`fؖsQG1˒djoE=5jo7;;&uY2l: ů)k6ePGwjvuD]V3-bc2[:VͿMטeP2&uY2g77߿,A6g{fY=&uY2_)5ev[Q2+Q@9X1&uY2IoԜK@`pz.Q:棞J`8;ϣtٽ]7wG=pvv*!`FwG,1TZٹ@=zKGus|Si gjwA f A E0&}@_AG%bԌz}|ly>@_AG%bԌz}|l 1u8ܽݭi~.mG=pvv*}xcEp:棞Tl!kN!E06l\ۘ)\.U@iSVX8UzZҪcR`_F:Xi gjwp*cl^vCYg:}k3Ai S2cAx}zY6 -عBShX1ӶMT{,VzYc&s!Nf+0- ߘu-h'ƘeP?܋zK},A6gus/m6cűTxpLdX֩j'ƲN5QU^bp8VFf;~v/?g|ͽ>y3c>J`8;WKSű2d77{9nEɛQ/:u|x۴O??m6&ܲ?cROu0ݥJטeP?,A6g{]tf"Fc`[l\uLiJI,j~1c~bcL`u0ݥJBV_{uL`6K?n!qI̾5dt1Kxj~4B*HTd:%<5(! <`:95Ǜ"˫oEXcS c1X2)A+ 4hIBbGİh DAWR15x+.|:;pDd6ZMv>[^潀0joM;Ku0ݥJ{A*"^sG*;l 4Bejo?iJc>]ӘFosY]޶6;旄Z^? 1u|x9)WXO!.)LVw? :-~j:&ۿf+0w[B#D7f*eXDmisWp{0xuטlcݚaTV#~N5f*eX<}fh<2*(uט/mn&{Sl)[}Lbkk&of^վ4: +k>Sm+4bșo~cl~j__O{̴vmm~ڗWm7?mk;_ٍoc>F'S`F,Z=12^om9 dwk7ZlKos7z/];fYڍF?Ѻ7ZlkcvӶoc>U+w=Ȳ1fJ_ٍWvc_lݭ6/6c&_vj7mo~c&;|$Jw=Ȳ1fJ_ٍWvc5onլִ3[vj7mo~c&ִ?fj'56Zmn_4fodgG>S_vTb1j>fzF"|c>2 n܃0-f1jBZHM?ɳ7b!X:^}1|NKe&X|c:ld}"ru]LQ11Kxjh1O;#W*dy!_c&u*+."NǺh<1ӶAr| <3qXץc-WʎdZ}.UsT6X|tT6Xkce|Ԍ*YXclc1:ce|Ԍ0^9$vA}1:9Ku*_*O'͓c>22r%LS ښ{S:©X}]>H#D/"pDQŨ~NcEp8.ű1_*SRy4O{Gzc8ߊS:{~cTlvbXFd덙Ri gjwvbXFd덙RRLRE-}ct'uı\ṳpvv*kG'$9OC\'^3-u*_**F a_{}:f[)E0fJ#^{?f cGxq4"w̔̓G)j~1 V3Et?O^h~76Lu0e?؎ϏV}so#vp|XMODMFOR.DOCS  ! "$#o&%(')*+,-./1023456789:;=<>@?BACEDFGHIJKMOLQPRNEDFm|JJ2?6"ҍ 0CMZP;Vb;o`P̷پ o!50}LVϓ~G9L˦YJrG9LH-ڐ0}Igb3Tu/6"ҍj+_0؈H7*+<j,'u*Kذ{[yYvOM)K-9K>D2ǥ(u027ʛnC_QcA#q4j'L֫u0r5ԙNU"Pa֗$:b8ӑ|t4wi\ Xk4 y /.1Rd!b#" =/M3[&OPC=԰A/}Лs0G6mO5NaUnr>԰6-\Q_ۛzXirkU,T[⛜ CGab#" tg{49G6g/N}/f֫c#"XPt4KP؈H7V{mvT uPIVW֗MOpi*G c}W 9?6"ҍ$!b#" t^>X%6aEM_|q[ZSUSlD ~xS#Vg]7:WUn>|A>԰^5[_'}w_%c}±_/4@ gz[q~i*[wWduL4KP*~T&6" $n/>v} YW=\U Q؈HəMћ 8FF[ii;u4[]/tgFD9vpKP 5y+$jոG#Yk=ӛ~d{BFDoձ3yBI(ѐ˭ 9¡Ѩ>~5@gz=Q\|}IO{G>vpk%'I߈H7οS?oui*̇s::b~G'i簟!hn>!d:$aPC}䞷%7JʛzZBW|lR]Ѵ%_wloKEB;VG~gmN_iԷOc#"ݜt@ 7)[ʍ&I;Gc]9G>l5Mr0#6'Y[TŇX0L A%[֯Yc 3nAdֵW_j+_* >!9"N 1N ͋ XMODEM ver 5.2 [CRC capable] :^CB:]RX2 :]T SʩR͝ [Invalid option on XModem command] Must be S for SEND; R or RC for RECEIVE $͊͠P6 2 1D: ZUg÷> gÚ ͊!e>CD#>OD#>MD͋ Auto Renaming Filetype To ".OBJ" !Ae~#6DOBJ#W͋ File open - ready to receive ~K+lc+~Ú !]~ ±͝ [No file name specified] $ ~?ʿ#³͝ [Can't use wild card options] $2  گʲ7: >: >>C : <2 ~͋ [Unable to receive block - Aborting] ͂͋ [Incompletely received file delete] ã \<͝ [Can't delete received file] $2 گWگ/z2 ͳ !گw,: Qگ: G: %<£گ +> > :  : / ͳ !~ ,Ly z {  ڠ: <2 ͝ [Can't send sector - Aborting] $r1N Ҧ> ҳ>  ͝ XMODEM PROGRAM CANCELLED $: <2 !|> * #"    |{0\<͝ [File Exists - Use a different name] $2h2|\<͝ [ERROR - Can't make file] Directory must be full $>?2h>2 \<͝ [File not found]$\<: o&T: _)))))))" =!oF+++: x2 ~2 2h2|\<;͝ [Open error] $:]K:^{͝ [This file is not for distribution, sorry] $!g~#KM»+~O»+~C»͝ [Can't send a .COM file] $͋ File Open - * ͋͠ (͋ Hex) Sectors (approximately >* Z&͋͠ mins, |o&͋͠ secs to send at 300 baud). [Control-X to cancel.] O)|jg}o^G\l&w\<͝ [Can't close file] $ ک |Ġ{0g |t }t : =2 * ͨ " : 7P \"=1͝ [File read error] $! y7>2 y2 !P " * !ͨ " : <2 : OP \Ÿ! l2 !P " ͖ ͝ [Error writing file] $P7ͼ O ã  x ͼ O2  CO ʣʣ6 2 !l\ͪ 2|2h_}  چ 0g ~ʘ g #Ì ã  *N ~#ª !" O* yO}o|g |g}!o " ͼ ͼ * T]* |>CP v^XMODEM2.FORf  !"#$%&'()*+,-./01234o56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdehaa_G3ZG"W ha$APH  DCⒺ6KcW tJ-2Ԫw%֡:zqI,K10`˟K-wn2j6BxY(7{jw\vlZaq:YBK J~nIW!F{ZhS$+|߆(7c֞)0GW~4Z-aqWlh,0e QyƝO)#IrF %rF z~Yr((I A @T(HАrE 2Z`/7$ *!8!k&wb+-D@@"A 8+'(HPB%!rm\Rߎ #%ҽ+W`CQXj0ZQB@3*| KRQB"1%(*&+ -d=xy)OwnFۃHnگp]& _B4A&(RE --1o Dh+BjaFs%r?twz0m\ }Kb$mӼO+UeZ}Rd3Lzf=4Hn UFHn=5h$r6E/fjG?Sb& ܐ3Z!|Rhb#{FE>*RUF[+BHREK)Gr֊#b-BF +)z1W5S;y2ڪNыfL+pChkIb֎r[q&W(7Â^3ިHREW"hkEE]H奬T ˎ&kAp CCwd"ĈD(U//\e"zhKPH 7oF+W뚩ϥT>ErU%foǩ7ZbD"W*R]H9VAm4ZGAqѐ5ڦ\^L([Vu^L6dZrF[+OMv$cr- RFE>*RUF[+B$K.UUF[+B׊ U-I#5㠸hH\RmSb\Akv}eUe0V )2DIcKԣr3,5㍊ }.Uz)V!I<*R}R惗H2RE*(',;دEbˋr3* 9ޑ֊#̥Tm1^+6ڒ+Ti$ Rhs z]3o+*lɴ7䌶VH1hb#{lIzTn7*'TէH= 8F[+B$K.UUF[+B׊ Um(&:m+#{cOwc߶xzꍶ#{KaFaq^dی"KlC"#zH*Ǹs[̱%A2Ƙ]"mGR9-c#IwgWwgFEJVAmF-idMZ#$rE"ե#hPATa)m+ovKoMA0d]_HF[f$^\\׮Ifp9g(a~D`*Uk~DMʱj)# Fm)"JhmK"%~)UF[f$ARz)|h+|zRαF[f$ѨY?mo["x Q&G0hL!0*4# ѐ5 ߶E4$.E4$.kh-S!Z4$.khH\R׮Lіܩ BDF R9< `h; 2$ywO CKLӫh; 2$1mGA$/mGA$6/vdhIb̟jZboWF UKdZbF.\j竩vdhI…KT|55ڎ -1IjjZb )j竩F[?"W.ҼTէH'_V֊ 3ޱqoNϒ_G4~,I2h:q ܐ3ڑTq8g>*RUG%bm1^+6ڒ+TiUe- 9Icc!K%Iz-DF[;1nǸ!qI] .$q ꍶ UmGR9-*RUiDOO)$¶sw[I7ڎrіR|j]G/.k$+ CP<m!(Fdbl_P{~WPP"r3HIB%H hy: R9V-͙E" گĝtؼ;B`ՒhaGR9-MA0yV5&b" c*pChk] CPG7䅮"H`R:I$APHF[څ!( O+#Dp<{Ee"nԬɫhkEWq!*-DF[[x*֊%u\4$.kH\QxJH䊄 hH\Rm1;ECⒺ6*#{%umECⒺhKPF `/qF"*!Iz$ ."(-qfjG3b,_*Q\4pC_m)&2Z}wі\J>Q} F>Ѽb+$3ڒ+6Z5ڎ -1IO+(pZjZbXgZb,̟WFQ%&r3vdhIb_-~-V-vdhIBRpFQ%& .Qh; 2$Aj竩vdhIFm\BKREW"*KqzωwioYāgeeR0#K,IxYuDᡯ 9Ic\3\HS$W$=Ҥ7ZbVl%WhH*Ǹ#D8+$ިHxzꍶ#f!FBJ!zjɓ06&+SmUY )*pChk)WߧF[r*6ږJ&NOM$wS:zqq]&9_m$"r30_|P3 .ch$H䊄 h;7S+c:2Z؃TL}U!)W^|z-K?f XKxnH JH ׭/q: EVS$V4A*Ǫ9UZUF.\j+J8K)x1,(gUe洘&HX ܐ3ZX;-pȻD` 8U,(mA*>*pȻD` 8U,(m̳Ƿoߌ U- Iz #bdUe-&ݱ̳tjB͜ŘА$^Bv8+XmGIyKF[Ub2f2^n*pChkGR9-'(R1k/Y٤7ڃTL}U1NPb,^rIo"zhKPbBᴀ8^A4A$}F[Ub&iQrF[{SfO*pChkA*>*x*  }F[kg=}f UmmdeGh IΧW` %% I0#:zq5IW@v%F[+B`*WbBu20hkEWjYUe S}ozߎ"xgYmry+p!(4#K(;'Xygγ,*\+YTQٯhC`챾2mTBxY_B <sC$'SKV0qgQrF[kR1V:zqhH\Ť7Z;7%Wh]cc8ϸC4$.T ̂rAG$ $DCⒺoF[+Ե֊#DB $A !`/\ѐʔ##KQQM@"2%7^B4$.k3Vߧ(x;6ZbU:`/s"2hUe- 90E+S7wݨRm!FtBHQ'eN$WT-UBR"y>ˇZU*nԬ?XM6dj]Y;9m'*lɴ7vǃTL}U1ގ35kryo?btZQ&G0Zt:?^翬vǙgo߾m%Whk)&2Zw=#$ RT@4$.k2=DCⒺhkm櫜HLieQ4$.k!qI]DUe\Qx2O$z2ZXkR1y5VڃTL}~^MDCⒺha=HTtZA4$.kW&Wө \ KyVF[kUYC4$.kWf *pChA*>*X!qI]myZr*\J$A y"8)*z$pCXG/.p]&phh^\@kwhk ы5㏕2%Izu +Ue %&o&LG+pChkA*>*Iz` ̂rcD-%&<Q ɣgbuX !\ՉFzBF[kg=h0aJ^\PrF[kR1V:zq5IC1鍶<{|hk4ZSub8Hń5^84#$Mx$GTШH8H41ڃTLt:$tZN$ZUYWy|_tjme^=߇hkg=Goө|c\3R1!`/'XdfhkGR9eTLH$ k/Y٤7ZbVlhhH@"^_23A1%#yqqiFP km:zqq]&9_G/.k$2Z·А$$ RTHң]B"^ |Z+ב֒^ 9ObBrD!$ˤ7Zbw\/_2ڙgh@1HJ/<(0fAÌDH1|tuApX^fA9o߾Y+c:2Zb6ڃTL}U!Iz$^b^\}^G/.k$Vb*|y0WF[kEZ֒+Ti$m̳tj%Wh0$H=RS(KOQ}Ҽb+>Q} F>Ѽb+$3ڒ+6ZVF[U 3өV$! 'x[rF y,p=hkE3bQK 2/+UeMx9$D7䌶֊#Fm5Z#?֪&3|*r[qQ9{l-H*Ƿ܃Gn#Q9#O\5$DRLd!ha?ownq|6F ;-%MFT}QUF[kR1տBTէH2ZͧF[KPіb"w^}*%WhkrTGr"j.I&H-BFmg챚N6ZeR#*GVl4hӌ$16!|Gm8|ǗIbI!&mo ^}7sYF[?"W.*\Q9q.񡯌~D}.UxqNK~3"HŒw,}yg $||% / h޿4VF[UyB>V֊#F&Zdeeɗ!gVwm-BF[DTV1X4Am&_VF[+Bu, L|OMV57䌶JN:%WhKPvhK0ZM%J m^byv:F !IxY Ztjw\GF ;-PE$$덶7sY?2j>Vy|oE>j>^lc%WhaGR9żϒ SN$ / >Qh+OT2JN:-hmSc3bQL 2&R/w`z(U$h IVFgJy5C4A$$ / ԒBI#A)y 2&y[=C0ڊ& mb{rL3yhLQ*UKF[;H·/#gI"J&fՒѶ0h[(L̪ ˎ&/FmNjo ~]eyx>VF[U#OfH.Gh[2}1hzӄErXMSkK/s֎r|=r4sT UmG>G>ieUe=i2I$WrF[K>',;mȧhk%q'і\JI{|ySziS5sTէOŽr|=rT|49*GȧO#*r rzӧOŽr|=F>eOY9iĝtF-h`5Z+בі|9hbĝtF[ri?1ڦn-}F-W#Iw ʍ:h I"ypDdL#քhE6ZH// *1D$| Ihӌ$F^96F?S"D/·wx$o_F^96h;|㧕VwmF-gMZ#(F @D 2amcDfM`mË1ėF͚hmf|j0m%q'і\ax6uk;VЍ !E^_++S}1H-nTn㫈J`KEc_%'3#B$ۖ\AWǻha+DW?H2)ﰚ—0r.fw#(: \!F(F @э !KP W& B(R`R9^ougk!鱾2%p#}7kЍ !Ee$.2#+?`}e/ѨY Dr&0,HNF r3H4b' BQ )1B !FL I#oX_.1քQH ܨ;V37ʡQKy_@4$.kF aQ$!>xyIKWH:<"8rе%9V)= 1fݯF  $(4# 1RJVnfUiF+V9I4jmcDm^!4jF[f$V׊c^+n6Z؃TL}U\RBh[x*;|ШY?7ZX{ϫtZF͚!W&N֖^YM+]_VF[[x|5X+N%Wq jqh!5d0Iz$H%#5dkŘԔ\CWԫ2UO֮ǹJM5TpEz <2ZVUjJ+}nԬ2~_-|Я׊ha=HTt:Zq^+y1Z3bH pd`ZGiRSr2Uev}e;:L~r,} *Ptm{c*#amݿ ^ Gc`-|c}eP\Qz GIVF kA*>iW&U2VԔ\G@^UZ+6ZۨY3W)nԬɫOkha=HT[{4j%DjTͰV\obj:VQ&G0hk*fB*pChcf\wQ2a2ZR1VGfMIⵗxϫtZQ&G0ZKP֒+ o%Wh+;錶 6uk;VP*'0Zr*5o!.Vޡ\ ?JJ]d(F͚F %I ٹnT)pP܀ I)-rL3hԬV/B_5kr®LŠ#Q!WhaEݨR+SehaF?lÒݦ>6CTFc?,wUFcvY -6FvX>`j]7nYcnx~i;cqv;y{;n^-=8᷻+,~<<-_ »G `ғ#G$ OFcv= ;M_zowÀp>? ohߎ -1IgV-_f1|f1|8pFcvY `rLseϔB ochH\R-+|zѐѐB bnGN~ޜSޝ>X1N~^\,$[{^ybh{Ϸ =K 0_1;q7o|'c=~T{uj G _Xx׻Ӈayi:UU䴝x׻Ӈᡪ΋9l46CU*o* S}oz$ܥyϋh[ۃTL}~N[忝2Z`oR1VG]9q.-KPXMS^W}]<*^t6pܼ݃ϿRo^-X.ޝU5~39? w Wh=HT[) jw |U7Z`oGR9ec5E"]V-F 1^+6Z`\J ]ūacR1V$SnRWzhߒ+Ti1hbBr )Fcv<qaicPa`x6uk;V@N,DdL2gB"]Q`IODP2I^mW&$YXmcZi~DP\Th; 2$ц׬Zr!Zc#IL Ɍ? 0"Xa32ںM6ڪ9Uzݕ%V4A6fRe#rR9*@F {Ϸ =JTjVnm%q'і\axؿ=>#޼یqwWw!oqw[TFc?,wUFcvY -6-c|r/o;,n<=W-^apan<`Ưx1lFvޜ8v ip6zN7 ~8|y{q3z?~[հ|0a@i0-یaxS+ *K$%HNd4oGA$R3|Yn>[n>[8[,W0V^2OaY;}ysƯNywbvX>,Ǽ;}yrb6i{~c=HT[%UEFcva90^f((+#Iww d4owov:6 9.?/Ozj2rFc4w?/?lx&hy_}<ϛ0~u&Ӹޝ> U'u^,9g _w!c_͛ak4v*cǯZBTb(D»"/OI2\_l e2Z`H*Ƿ܃\Tq꿭WySe8/wyϋh/|Ѓ\Tq꿭WySe8/wyϋhߪ>/wzUML?/vwݢհ1{Xwwɛ99mFc:/w眳͐'cr6_կ/r-?6h4oUY*pCh$3 U=6z5|Ѓ;I7OE__]hh+GGFF @C#t PP!+@SG #בZr"vB\zLJcD?C"Œ2.1$=9$-tML-B+D QH k*$pb4$f!c>*Ҽ0M}BPJ~y+=HT[kh+"IoN:(b4ڊ#F!c=~ɛyj]q|\26㰽=㷻ū|< F7va3v9^ <~.ǕF KII$[BD!#I X.~;ο~<>Za0`,qbBJ!FZnŰ_-bNdsZLw?^q|w?mW*__m+ 洘΋xy΋2nŻh;lOF?lÒa=mb|w珻ha:KRvwma[/2ڎ_-b[b|4ڎ_-bhnvðݞb|4bBa=m?vh/G88,__C& ~yW?V2.~0hӌ$HJ/mo[BR^ 96h; 2$h; 2$ARFWSmx ׵k%HJ/vdhI *kL6D4A*Ǫ%LN d3L/ 9#2z8Xd$ThkR1VKFAB!,RRVF[ʚR0!)j+pChkA*>*pCP)X*JhkH*Ƿc\3{9r%+7F[kEZ֒+TiA\O,abhHrhkP1,і\J$3ڒ+6O$ц׬Zr!Zc#IL Ɍ? 0"Xa32ںM6This is a document about XMODEM.FOR and associated files for the VAX. By J. James (Jim) Belonis II Physics Hall FM-15 University of Washington Seattle, Washington 98195 The files in the package are: XMODEM.FQR sqeezed XMODEM.FOR, equivalent to XMODEM 5.0: binary files, with checksum or CRC, most timeouts, no BATCH, in VAX Fortran (special I/O dependency encapsulated in two subroutines so it should be translatable to other Fortrans). works up to 9600 baud on a moderately loaded VAX 11/780 running VMS version 2.0 (commented out portions allow cleaner program for version 3.0 and up) TOXMOD.FQR squeezed TOXMOD.FOR converts VAX text file (variable length records with no CRLF) into CP/M compatible file for transfer by XMODEM (fixed length 128 byte records with CRLF at ends of lines). FROMXMOD.FQR sqeezed FROMXMOD.FOR similarly converts CP/M file from the form received by XMODEM.FOR to a VAX text file. XMODEM.HQP a VAX HELP file about the three programs. CPM.CQM a VAX command procedure file defining XMODEM,TOXMOD,FROMXMOD as foreign commands. QIO.DCK an INCLUDE file for XMODEM.FOR defining a COMMON area. The file format produced by XMODEM is 128 character fixed length records. These files may PRINT and TYPE reasonably, but to edit them on your VAX they must be converted to ordinary VAX text files by FROMXMOD. If you forget which files have been converted by TOXMOD or FORMXMOD, just do a DIRECTORY/FULL to see the file format on the VAX. Similarly XMODEM will only send text files reasonably if they have been converted to CP/M form by TOXMOD, otherwise the FORTRAN input statements in XMODEM will append lots of blanks to each line of text and no carriage returns will be sent. A version of MODEM7 for the VAX is also in the works. Watch for it in the late spring of 1983. XMODEM is also available from the LOCKE COMPUTER CENTER at the UNIVERSITY OF WASHINGTON for the PDP-10. If anyone hears of XMODEM or MODEM7 available for other MAINFRAMES especially Control Data CYBER or Digital Equipment Company PDP-10, PDP-11, VAX I would like to hear about them. Send mail to me at the above address. vcMBOOT.ASMV  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOoPQRSTU5SYk|Ix,aTDzyZ77xO6'5^V >./Yw͌d,a5`ENrjP_5nYm4h5^K,fūiخz@|ysyټT3:I5}}»8oV fjf;ڜlט8[la6/K,X4,^>-ʹ~g׫W fyn.\L' Sm5/N<%`hynYެqv1dt0G)kl7KZ.ޯ֫/%ify.MϛY?0LOOjr^l]|jt|ӬidtWfn}5m.1?ŻO_bƇ ?WfTO' YontYnfƻfZ ^ lY2f+{,ϯ&SyZm|8Y=i.&]zyjrZlg Fsѽ0՛ .6lXL'i35f57Nk,N˧O ͻ5N6k-Sl.L \l~7NVk.4YbZ`ZnW儗mT_b:iT3>z왌]l Z0L8U%ȮѽѽvPէQUz>Amt/3BFtFO na5.{ E1NUE {&HveZhT:_q مf`Ԡ!/je``D'$BUz+``D'$Ƣ Q(L5SQXѽߐkh9ST E^f*d$&@v=Z6= N uFsCv=Z6hn(wHbZЗgȩ}DN~dkP{T&L|~+0zowHIBe]$ɦ0L!eh},^f:I69hS >P&ڠ}0zd @)`g@v=)`7@v=fS̈́"[*5pjpgJ)+Ȯg7z;k$$Al6D SdAv=w肁0R ZQ$;d]NCv=w}dh)YAv=5``,jhQFaJi5jȮ0c/$CwwL:MwHIƣ0A -PKv-Ԉ>"Y' 뽑T3!R L:ebث+u]Sd!dVcxdJi5jȮ#SySAv=00uwdcd2W&dd&}q ]hj&N L:eb}u%Ȕ+iȮ#SNzuZq`J9o*Ȯ~`J)!6Y50\u]$2L-0)YL _e`J֕:Ȯ00%Jv? L:Mr;0)ط_>jeSsP be6V;&vU}J2LjА]Gke6Vömj>ua[´3Ȯ/ke6Vömj8o<.L5hCzL5Sd$@v=1yu)sȮ|znq3) Ȯ3S |/L|/j``[taj&Ӏa3yR1 ѡΙOJ59!f1"J&YkYc#\˧qVzgBtLPUG&k)0Ab \UhCd 8+=v3,U`j&#:(#B&YDŽsTL:McD6Lpc;HqVz-\2մƴ>Rf9l0-7K<2uPzgcD10FtLP>F]LPǗki0LPUńkh5!2:MT3!>;dk0ɈN!#YLs@NcuZ ]hj&N LFt:e#|Hi5vLPU@NQ3A -S̈́b4="P6%]LjШߊAS'.]߶N aj\x"fadZ gFtbZdk0 !#Y缩 مfBh1 .و}e l£1T{x{&lJڙՠQ1}DöPZeBtʦqxo@ ^{eD6V4$3L3 !ѺLA9lfdZ >j&(#]%L8KT3i5!B!ڗ6D&(#?6D&(#BaplCJ -XhQF9JϱL5Vc|j, &(#ue|Y-E gVcj&FLj{EΙ|(WLP>FhK"Oahϥ eS#j&"T{x&!Z+T3i5 |3AEL8Sj,5TPkh5;0jτkh50AUb QLL5Vcƀn>0AEL8 ZEfB9EcBt2LY3Z&*@!1LAQWfj,3P>FhK"OapXhQFA:?2uPz|&WWL5Vc&(# g ZEfB#왐ƀn>0AEL8Sj,5TLPc57 gVcj&FG#PVcɖ i P 4`;_v?0LZjHc@7|ТF&)h5њ ɎHgB gZjLHv&(# g ZEfJ5ḧ́<KLHvD7{&DQDlR gТFΙgJ:&kj-fҢFΡ|(WL8K(T3Ϋs1^3LEC՗Ugw ɎPgZdkT${d2bdZ SS2uG&Hves@d1AUɺfYFP Ug uΛ Z S; i@b:g|gHc@7|ТF&eYm"g3Ec|gGc52,+jsτ4#Ec1Bi0Lp֠ g%1xdBVd<(-BL(ƣ22AaD҆xVuLHc|-LY3A_3Ab \U@NC1ew0}qLP>F]L2*LP>FJ|P:Ll3/UL8H0!Uÿ0,U-L5S҆xVuLHc|-LY3Ak&(#Dxu%Z[7P>ɟ 8+=ǖ -X}N1~<2L*҆xVuLHc1A9[gLP>F> J|<h Q>j{]D!:QL8U[&Ӏa|cDopL(Ct(*Gr2!d τb< 8j{EGr2j}̈́dG3!u}T3{+T}00DŽ/:&1@͏1A9[Oܪ i P Lj„VP 00jτ|{-Z3! ~` jx45NgB1ET]˄x0̮[&!:QL5..y7w~`BRT3k]\LP>FXixu%Z[{Loц(Y9 g6L55T3!h}1*3!~gB#3A -S͔(7?j&85gl Fs3{2uĊ >$;&* Yը مfBhM@H)s@NcuZ ]hj&9ҽ CٔTw3YA~+Ohj dt}ۊfS_ :3q- B ]hj&]#k&8!L8H&0) DŽ|top(&TcB1 Z S̈́"[nLI ^#d$7$2L-Fs3%5x PlD2mQDp=ua[cq-2!:eSR8o50:e#$2L-SS̈́x0=Sd;8pa;&810,_öwLHcou` uĊ ]hj&h1@oޘ!h1H}1ha-g|0w0!~-Sd*A՗UgB՗ pL2``B#FsW |dBe+ LlDŽVP UgT3 PecB՗X7P>F|| 00*[c Z St.w!ˀ U_8&T}00r2|dBe+ LlDŽVsv`T3XiS3D)*VHvL8Fc !b`Yb+)J"Ii0lDŽ4_|-L5S: Lj+m:(=v>:Gb`,\(, Y'A9f`PWL(0LɎrxExT3%; Ąb)B>OFDŽ|dGaT3i5l:왊(-\=h \=6g**Ếe*BZ{&LxuW亾z|d 1?Sd!dVcxdJi5jȮ#SySAv=00uwdcd2W&dd& ceiver $4TranMTS OQJ0ZPRO OQJ2{CONFIG OQJ MACRO LIBZMOD OQJMTS DQC28 !ͺ(2ڤ5O:=vGMTS.OBJ 2 !"#$%&'()*+,-./012<63456789:;<=>?@ABCDEFGHIJKLMNOP 54QRSTUVWXYZ[\]^_`abcdefghijklmnopqrs">Gtuvwxyz{|}~`:ZOw=Yq3XAoyH! k@ [-_9sp\;0& R1%~|{vtbVFE*xuljgdca^]WTPLKI?8.,+('$# z]94V}ɧC]|ov񻗿ſ?d=׳OeI/eG {)m冈$"@_3@3 / aJQ+qhD!M&R4,U)GQ`vվM0h,7Dn| nVSٳAU{tGGwY d<@py;[OS~" WTۮ'1awv=}|vKŶlgM6u3{1a+%󱠛K^bx0jK5kK_Y[6kk_fm/5kpϛ1_f0I+ l$ァBs0zw\&L] |7\ |һn0T_һn0TyW&T?7!z:pOzO>wY x "} @pflg uz׻`߶8d{;zWo[hX x "L) NX0,Y)}*n-;MQN”#Z.kޅoB#8$Li*38f Sz*;=v7zz86ޥh0"*;=`-/Z” Xf!khc^/ *,i3 "ABMjگv7` v*0o?砣E6m?ѝGshW{6n}n?7}\7z=C6׉k0= N૝ͅCe_T•r"FA@t̂m&@y/AC%9(A@=NhtJ=3WЙfm&@yYCo%0%X0/ *,?Arm.7}o~6NFҟĦ9лz36-of`3*ke};ZV@Vs~hD)_Dr\{sFj6s۬:}k?cZ]"@7,o}y~5hޭρo=q՝Lo3GCԜEnHo8}9Ǚ6ӝЙf^_379n?gj~\=ym_,^ŗ{e:z}=x_._KھYԋ/" /eK˄z}d ђ |{ { @wNf‘@^oDTI=o%70_Gwz@[/-J(Ao@D"* HD|]& B"c>wY d<A,Н8s#Z r5ؤHۊL[lF}ȃEd |;{ρ -ρozˁd "vY”#ډ{j};'zMΦGC)ڼܣ9лcoO=3b&w]S#o&~_}9/0.,7)GQh7f%8_=`^}՛` V#Xn SAr.f0j&wbD-"@x:#S]_g :Mގ6KL+V.v55Rekɗvrm&oGDd9PDׂ V{;Z,T`yG+V٠,wf ,71#Jm+/7+[KAo)}p9_܈HZO {\-!z$FrqSdܔclhRekFvelp~{7k˾&-qEai2U|WjknVAq$)haO7N272=.k <%q9\nj|!fAq k+ jx%Ɓ^+Aq %?%ԫWbw. "8;1QIgZ.ki E0Ϗh]O) nt-nvpR^z®vrv؂q.ep,;y:]Ox1 e”~2 MbtgO$ђHh /Ƅ+ * ( *`գlݥw7v;;4[>;wvb#q|9ą$ *wQ,jE4Ef/ίwvB޹f`nvneZ8;[hI8P30nr7Aى:׭j+觡w7/9;[٭VpR[~+Y-!r#߭x=SB񔰇Z”䇨G ~PrvbNB{֢J6Z]BFA`ju.ޭw#!YxU9V&_S(f ٩9.Ԋi05Sݥ({_`5""~R oyG+X`Iؿo&x@Ja5fk`YW.MW5˯.s 1 zWo vurʹAQBN.4Wbcn[~'* S -xf&h "xGc׮9KB6Dkgɵ/ڙ3ڗNN3gh䝱IZ;KD?ط ] y]yݱ/ѓWlL >"M(OwSԗ˼i$(=<0eecF-I Rs2ɲ1}P@!5W.cS$iFw3iù'Ύ{Ag&S'StfX$Y6z tRAOZ.c餚zRta@%4lj]LU:;<0HӴ* e(=<0(]LU:;<0tJC&5Tsj^Y62ɋjԢT&5cJhR!J^TsԗTIu,y٘O䣧h,KƹZS!}N7(Iu(JSbH S1sRd 'U*Sɋjt2wyY6ΦLiPKyK'LQdT:~PR^6I5G!5G?ST)!ԢTR^6 9J/S(~3B1ޠLͥ6rjNQ^6Φx!˨ry:NǓTLTR^sL2ޠ\.2F0ʩ\)>,+OiLrIO dtP,ʲe0Iԗz(I3EU|ڝ5?6yeE~:iܣkDy2BSB2J\†Jyz`E_ z"5Dt//x!|{ _{6@ktltg*u*G׈t_ d҅"Mәd&ӹ N@Dj4ѕ_^AC2@~\ "","",0,0,0,0vZPRO.OBJ 2= !"#$%&'()*+,-./012345675H<89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]6P^_`abcdefghijklmnopqrstuvwxyz{|}~ o?%:7R>.G*F93)_;[ZV0"z/\- ES e]N& `O KTAfrUws#^!W,hMD$q1icQJ(l8yxpmjgdaLB@'tI+nbC|Y4k ~u}X{v%0>ro@@Ib'co*[O,7ҬՕdzY+M*\^Z>yЭfֶ5REUfoXt!3 pn0x@'4>DǝqZ Y=gֶ'#iҚ0,,Z=KtV+Z' ǺԷ֧+0U%Z&ֺ*d`==-b,Bզ&<^3ro)+!1&1&1&1&zKk=c c̒91Zc"K J L͹7^Sƙ/al^W[ i4}};V , -w›fOr1WtZ_ozK޲ XRn,ZLKŴ,wY-wY.2{/>VW UEW 9q@Z?hwi+菳Ssvݿ.<0ѹ NN l Ж[= Rmyڏ|x?7Bu?{V7*m/$/i2%CdzfT\\*{Q,ټh0JYe00nS =+HFc;h&WdDPh>=4q0NBs!9 < )S$XDR̜"|6ʅ+gŅ+'-PɅބˇ߄$nu Kې&&3 Z-M(|a2mARiˇEjtWtv[ƖRcą{̜4?GEs98m̑I9~!טT6Z!⾀|6(\=ڤtZ?l({,8`n'yP+mZ' [/ !'zF{r! u": ۖCPYe*7`P_}wCֵIr 9= :ՈոF@v5 m@ J<ܚeJUaT֝Їox<SpP6HP ;ns6 Lxg/ "9 Pg gP+u6T+` ۠lp<@oo@ ـ@ෂ5ćou67 nkx!-iUB3(h.P.$`^=;П +f4l vW0<*җr&Z:' @k,kl Lrl Cpɏ/9#{&!g/d0g1,f'esg]gs<ٓݒ-l7ϲ%ÅןClgْ*BG ~Mmzp) ap?gywmkȫlJe'LB")@kԘh<:u:|DA69[h͇6俣U={(0xV imĶ0<>|t)<%0l_rg܃&>-/L÷Ar>p)4J47mԑn+ H.=K@mIGǶb<ᮀ~AoU)ɡTdD+Ao 1>2VpK9ݬn81>wq7G{:U;"(~+' )R_@oS$x(&MRAdد&)yn=>N>^S@a.zK(SFToCC-Sbep=ܢ|~6w!Ϧ5jU Ԫ̄>|]Ywr;{x~mp ]6}Ϧ|MAMt7Vi>Z.@kE2Ejt x.r Kx+Oq𓸭=| 7I+ ªg m5`W̲D2EjtK\MW? (̕nU~B`!z D6\5XA' U rkK@yAhlE7(h7ܲn&䆓]氶j|!fѺySs0/Kx1{L?qΟыk!dNK9bNtPYI'ً+,t||7+\P8Ѕ9P8,\3厍L h(LD>(Nџ; ~ΟAf@$eǶUX 8`[C/%Eݑ͖d][@ d' N!WO@|wxy9 *"o}ꩌZ.Ū&<m3;ʗrs"/&#/bU:g&֯?h(Dgs:,Ͳ1b *%3~c9 "Bo`r{WP%;@OB'L;!H4j!_NO! 'wPaK 6MU. nI*6MBB^LU$Bted| ; U A#=? fBpW&mI< -$pOҤL&U$ܦI&[M|i[S&UcEr˹ '8[w6MwDis'Eܩ?  v ]#NCry. Nmǀߊ&`#b]!OmI- %LfBNۦSAo;(pEݑY| 7ם-92 di(᰷ȑyaWG&թGhE:h/4  Ί(}Vb oSNyMT5MŖj, fB0mpW}+F_ryߪ?VF,DKR` w$PjEc+ E&B <4wX7oj\ZjrA1@D:mJxhSBM ' FQ8rEv[d)ѽb,q+˝\l:gĭ,7\l:gĭ,yuc[Ynp+\p1<ߜ:ٽb,q+˵ͩ+rg;"W.6/7yuH|nfp,`Wĭ,7\j/Y`e7͑y˺{ӣӱ~ Uzk3x6}NKo4-/qta3x6}'@I BB~AouVdDV ۷n'wN2//OoP%~(pv)kX(h|[\>̫1-j-אa!4Z ؖ$ؖD*H{ 0uҥ$.YpuΩNP DUژ")nyVB' :}KȷRh/rzn?J<=9yff;YġYzY#%ܧMdLtTC/zda:aJ|6}eRI y\2! B)pߤx}?UJ h ylHk Qj*6œL <ʽrԣ⒑oRR&V'[RN8Ճns'Xd"DCՑJ5~HX#c_Wh؃J=>.=<9uW?r,8\YѿM rs[pjzUǤi!I1nZn:1nZ(9q+.VM U◭.?a#'$B2b9"H_E[C뮇 /VP9\4r9.pyQOA.K/Վ/1b#/@%gC#[NyC7]3Csy5_iwy q@[ȃ , k[}s<%%2Wѽ Id6WV6{lEbf -Θ p- a p fB0<zhW] [tMlT,+)pTӱٲ_9Q޺Id6}ml@(toId6ϖ{w=' [쩓l6 zNId6^/-8lAωBk=uo*)pT'[sнuId6][sнuId6?HW JR9QfUw#o~kDfJlх^*VpKWJZQuI\O2%UO=Yy>d y6 \QIGd-,pizd%N?,q%R~+ICD2Ejt1LF}UaR}2yZWӃ1G_M1iYOsKciY,SsUBLktc $ ɒH V7 jna!  _tasSb|CMT&Ä&-U'}1t>&`_LV}"PK/4; n[ 9xLV|-PQ5Ek(9*-> a pj!yB4Y@nq w*QX7Xn*XQ7ֺr>F:Z%Å-..@%(apEr0 [r򀹝J-򀹝h)\xlKmI-YD>(P.BZdx@:*,qEtUX֋N@-\oB*^bIYը 1z!)kҴUaRY Ue9bUւ-VNj_[ B UTZU $dym`BLBkkUe&$7hRUAIHEE,'$g2VU粳%ū|ȕSWgS-o[RJ]A0!¤|ŧBM hy 7qX~+o7PYO;L|b9 W=qqiY g'߂u G>,$ؖbp0,êRKIHEETb2\[* \[*^-Oa'U?׎O!_KO] %YN9^]*~k9ްRwk!iY)SF }SМGsNyaHxhF9{~bˆ]+wE@΁\Kv4G'<=zh',٪#kB: Qo\S ݓK-R)z|}ܿY8ZuF];=hL(SF |ӣOF Կ@ Daz [U(SF [@~IVS$[b>I/N I(SFZlz_ʷ+p_` AT(SFO|~)ߊ-k{ 4U(SFt_ʷKV \o@ A@"57Ps OHʷV[p+$ )R 2(VF=~)ߪp t {<@[= )R  D/[R*)ޅ!VtVcCD?ebxa)(a<#SoLI@'6mTS<(gON(@9J\** )R ᮾQY.^ JE~1\8GU T9 q5* )R hŕ8#X"oY1LZv`-![A$Ǹ~(?E(/hwCiP J)* %#oai$FؕDB~Ff@e><-Pg̾ J&dqSPY yNixJ@f`&YmNvD?@pN4|XoҺiJk" v 4 p)M ^4 xMMGwd-j@c.%օ;6keڑ)xtj4l{J!@MCfZ7i.Z3:\J@\.Bv.CU@s\&k-|)q|C.[ QecR ߊ|PX7CYW!eBpft>òn&:}s%}x42үG@7nF(Ѝ͐Pzw A$ŭZShfd2 )t pќU *Uo2dEz?ȷ@NL<$ |u8mbxVjTIL)*/*w}`'6nx47H>CfeA68m3 .܌͚́!t3~(i])(p 0P{3:wxJ͚U&˥ -PЏC]]*Df@g6#`Џނ--~>8t"?2ZiVMKIZ==ntnbaep \ Ms?@pPvLGw8e۬ےn=6J[ۺ:ouR҉3e: Vi2mI%^I_ޭWg!򠴬?oX ІE{uh id=G[=z),^90܉̀= [8 ]b\jt@ȏA|\J"?˥FPjtɽ l؋>̿ >.%^̿?/J.[Cr-F*ExD *=ݖ+^NtN- t4G[NkvdpzF"!Yh Yˣh<Db~L3V˧\yM4z%"#},qe]c`,wZ>4SDfGE7=Zw~|pesv;|虈lrΪ]IpcwDS ~I@ȷ.|+VIq«VWGEбm^=UӢ?Vk!izd>mqG[zN-|6_]n]m|=G,Qষ-^nz z&^5IsVBqYWYW2<%0xO\򭒽Ee?GoA'_V"C@ق GG w`['!z)Pz a_Vn/|!%Qgї'LJRM>Kn Bo[RU=|=?<X@60tJCh@.V U/NDu~+Ã{ aҝ!J9Q`ق盨BFp! wn^b#aB;ˋ}\pv݆яP0 n./,w3cGj>?D'b~t3-|Ωq5[@1lG.y=I`^}S:b;c٘LDM_率!H ü…<ʅ<|d0p$).Yt>f;zZApyh.wVM║ kk}1قC,'+2\R Du~+l6FܳAMhZV3Ԡ*犛4E0l|r h{E[RxYu?ǽ=w#h Bh B ΜނfG3<] pa8i }1>bzЫ9 J9 U9AQka j5dG1i}fS4( EeDwVӠ*銌#l|jaXO` U--+l$ðUa`bz \ )kz N`,iasê/JHj6DX]nP&̨֊&Vg@f?ec1+ JR>߄? u_x .%8c9A65ja! GvͨZX3u⒩fXzaFN d]3۹^nh9tec1)k:͚@6*e@Mai{Uz!bt b؁v-g9 Ǫ*:zp*j&<}MRe9."9_>|],s;A"|4/+mY57'ȮU Gy+[GP.,#`_ "J`,&eb@oV1e@B~/q>kf[ ~+)r?rKF%YYuvRjH&j5PzhhkLfsk6=4*ˢjpFeY^N*iUm2AVLjl{52JzAJyZIxflɦi`zN߬- Ho^HyFS1)*AN*AyesQR8GU҃7h3*pUIO#75iU%}_4הMVh2j4R8GU҃sA2˨H ~܆I%yI /PR1Ac֬5+j+TE'&]֔-&M6Eʂ`_  iQWZTbfs{Q9[[dip٢޲&L#&Jza T%=͊IUI΍z5Rcs߫HZU6E3ڎ 1AO'E64Hta JpgZU%Ýшt2*1bcND^MU#&ȫ!ynFOt@Un &]1^-$6cs{52}nNTe1o pg42˨Te&1Ɇ pg42˨H%ieZ5jT%*/iR38ޠ*r15Q[14f͊zk޾YJUQI5FImF̍ڢf+S$K}5 j$37mtw)65幵U 196h2j4bx+RUCLW -/ZLAF2ldzPBbQYW#(-U?l$c̚֐YOUEeMFFooIjArfG!U!sIl1*~/1޹ƨ $y${5oDQU!ۉIk}VCjAL7c4/)5lAbx+RUA$]}A]1^-$(-Uqb< v#Ff5ZELԔsɰI٨;*-$]޲QF^LwhSS[+P;1oL;JTU`탪f[<gXk@g}u_vQoc[D=Ov12MXTɶ~u/pvo)pk3}Yf0c }x,3\*C-&ƥHcKW6.xNiRقMqlU_kq?_Stz9b3&GqPA x7;.(|)Pc([3q9˓/.7lKz-{bN6<]^rqK%N@- vB <%0vB.Y{-(qX]bxP+0+ 1neE]?wMaVRi  j?}<rW,"G><{-\|0;"[wq?8.>Ef!ҋ>?@ABCDO5<EFGHIJKLMNOPQRSTUVWXVr>YZ[\]^_`abcdefghijklm=6oU:4&%$nopqrstuvwxyz|lecI3{|} 7v{cd9Hsګѝf;:uP1npTG{tNݣ`{9H!MR֬S&$=k#ǙnV ΒϬu3RTvg?%4!MRIk$)'i~;.6T_sCzE9!^!_:JU:1z%  cf8J0!U)lsJ0af,f(erb8J0!=>#vmVa\X&'IX Qf8J0dз%'>x9`-`IΉŰޜP3z%` X2ۋ}9D%&s( [a9]mf87# `GB=='sKEHS<)6sk!Md{s+{&g{IX QNx,Eɉ`xa]ܼpXa Xsb1l7- ^ F< G_r`ܟΡ+lKrN,t+[A^KV=3=X&'s( [a9]mf8]J5Vf}2`\60XA`I3 bl7- ALv0i1qʯm#" >//H,t%*Yb XA &ˀqH`%= |4ޜP30TyW&T?7!z:pOzO>wY x "} @pflg231 0711.<<0 Sys Default g;n^system logoff John Doe Computerville, MD 301-555-1212 system command system command This is a line with no c/r" ^nothing in this one "" <<1 PMS Santee Ca. #1-714-443 8754#6 g;n^logoff command with no comments John Doe Computerville, MD 301-555-1212 general14^download programs general15^upload files/programs %='%:N'%?John Doe'%?Computerville, MD'%?301-555-1212'%?Y "" <<2 The Source #your access number#6 off^Source log-out hp26^Telenet terminal identifier c 30138^connect to sys11 id tcz123 buzz^logon code mailck^check your mail mail read "^send partial command *'*'%Lhp26'%@C 30138'%>id tcz123 buzz'%>mailck'\R" "" <<3 Local ABBS #676 4121 ^nothing here ?JOHN ?DOE ?COMPUTERVILLE, MD ?301-555-1212 $$ vZMOD.OBJ 2 !"#$%&'()*+,-./012345=<566789:;<=>?@ABCDEFGHIJKLMNOPQRSTyoc.\H*UVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{%>:E)]F-!nG|}~Q |jXJ?7re[P/# wsmlYKD98(&$  zvthgdaZWTLBA;1' :B$_&2ɗI|R5L /B  v{ڽ@RS^x~[D{* ^A!LþmBEEv Uٓhm%N,o_!=DE( SObP@΁R滀` UQhߜ=k|7烵gCߜg滋YJ.T PO;F >!t. 2X*zRJ1TI {P]9ZOj؟%ŘS}(b)z^dWm%ŘS2P]-N9ZRtcSPa9.Ni!I4#j,ЫP@4B@ţFhMQc$( IP@6=kn"}Gl GxF49*$v1lz\x"br@~ Il)bٶS|'OsyJ%X'\̶b3;<>w/8ǝ%῜ZUEs7Vl{SmW:k/ g"y Ýtw[r|/y}P@~}vVj/31n6NбO>m aI>K$.ˠRlpD04LLsbLT!x eZ> OPSM\ (8l };<aU 2`Uw%] v`tv:0%=gPaOZ'xOoI׬I feiS?"7$l4zϻV|?`ڴ+$ҧ-މ$$C5%:lӰŅ2QSE` dH#aK49hӘ`Z֋.6І?lIsEITې?@ABCDEr_;"FG Zir g7mqz?mOJlqxFG%&F!+1.Pm@=Agl|wh.PSq2L v}h. \[,-3 [B.+\\qfg\g\ !#7l)~al8ѢVݡ@@/6H\ FIP|W⍀*;ZmBj=6tt'zVY`NJ@v(-o2LC< hgV|cbΜ7lg0ÐL`!1d! iVfCznD+zq5MWz3,]W}tg=w>uvRjH&j5PzhhkLfsk6=4*ˢjpFeY^N*iUm2AVLjl{52JzAJyZIxflɦ March 14, 1983 A new version of UMODEM, the UNIX version of XMODEM, is now available. The biggest enhancement in this new version of UMODEM, Version 2.8, is the modification of the program to make it transportable to VAX/VMS using the DEC VAX-11 C compiler. There are also a couple of bug fixes and a small enhancement to give the estimated transmission time for a file. The program has been tested under VAX/VMS and 4.1 BSD VM/UNIX, the only V7 UNIX system I have access to. The UNIX version of the program consists of only one file, UMODEM28.C. Some of the VAX/VMS enhancements are included in that file, but most of the VMS support subroutines are in VMODEM28.C. Under VMS, both of these programs #include the file VMODEM28.H. To compile and link the program for your system, use the following commands: VAX/VMS: $ cc umodem,vmodem $ link umodem,vmodem VM and Version 7 UNIX: % cc -O -DVER7 -o umodem umodem.c JHU UNIX: % cc -7 -DJHU -o umodem umodem.c The system-dependent code for each of the three operating systems appears in #ifdef blocks. Note that the symbol "vms" is ALWAYS defined under VMS, so no compiler switch corresponding to the UNIX "-D" switch is needed on that system. Since I haven't compiled the program under JHU UNIX, a cannot guarantee that everything will work there, but both the VMS and VER7 sections of the code work, and I don't believe I did anything to the JHU sections to make them break. Besides providing a CP/M-VMS file transfer capability, this program now provides a Version 7 UNIX-VMS file transfer capability, which we didn't have available to us before. The ARPA net problems noted by Richard Conn in his notes with Version 2.7 of UMODEM should be present here also, as I have not modified any of the ARPA net code in the program. Please do let me know if you find any bugs in the program or make any improvements to it. Thanks to Lauren Weinstein, Richard Conn, and Bennett Marks for working on the program and to the C Line for making the program available to me. Walter Reiher Department of Chemistry Harvard University 12 Oxford Street Cambridge, MA 02138 617-495-1768 (! BIT7) parameters |= TT$M_EIGHTBIT; /* EIGHTBIT ON */ *iptr = parameters; if (stty(&ttysnew) != SS$_NORMAL) error("SETMODES: error return from STTY", TRUE); #endif if (PMSG) { printf("\nUMODEM: TTY Device Parameters Altered"); ttyparams(); /* print tty params */ } if (ARPA) /* set 8-bit on ARPA Net */ setarpa(); return; } /* set ARPA Net for 8-bit transfers */ setarpa() {# /* * UMODEM -- Implements the "CP/M User's Group XMODEM" protocol and * the TERM II File Transfer Protocol (FTP) Number 1 for * packetized file up/downloading. * * Note: UNIX System-Dependent values are indicated by the string [SD] * in a comment field one the same line as the values. * * -- Lauren Weinstein, 6/81 * -- (Version 2.0) Modified for JHU/UNIX by Richard Conn, 8/1/81 * -- Version 2.1 Mods by Richard Conn, 8/2/81 * . File Size Included on Send Option * -- Version 2.2 Mods by Richard Conn, 8/2/81 * . Log File Generation and Option Incorporated * -- Version 2.3 Mods by Richard Conn, 8/3/81 * . TERM II FTP 1 Supported * . Error Log Reports Enhanced * . CAN Function Added to FTP 3 * . 'd' Option Added to Delete umodem.log File before starting * -- Version 2.4 Mods by Richard Conn, 8/4/81 * . 16K-extent sector number check error corrected * . Count of number of received sectors added * -- Version 2.5 Mods by Richard Conn, 8/5/81 * . ARPA Net Flag added * . ARPA Net parameter ('a') added to command line * . ARPA Net BIS, BIE, BOS, BOE added * . ARPA Net FFH escape added * -- Version 2.6 Mods by Bennett Marks, 8/21/81 (Bucky @ CCA-UNIX) * . mods for UNIX V7 (Note: for JHU compilation define * the variable JHU during 'cc' * . added 'mungmode' flag to protect from inadvertant * overwrite on file receive * . changed timeout handling prior to issuing checksum * -- Version 2.7 Mods by Richard Conn, 8/25/81 (rconn @ BRL) * . correct minor "ifndef" error in which ifndef had no arg * . restructured "ifdef" references so that other versions * of UNIX than Version 7 and JHU can be easily incorporated; * previous ifdef references were for JHU/not JHU; * to compile under Version 7 or JHU UNIX, the following * command lines are recommended: * "cc -7 umodem.c -o umodem -DVER7" for Version 7 * "cc -7 umodem.c -o umodem -DJHU" for JHU * . added 'y' file status display option; this option gives * the user an estimate of the size of the target file to * send from the UNIX system in terms of CP/M records (128 * bytes) and Kbytes (1024 byte units) * . added '7' option which modifies the transmission protocols * for 7 significant bits rather than 8; modifies both FTP 1 * and FTP 3 * -- Version 2.8 mods by Walter Reiher, 3/12/83 (Harvard Chem. Dept.) * . Added definitions needed to run UMODEM under VMS. * Support subroutines are in another file, VMODEM.C. Both * this file and VMODEM.C #include a third file, VMODEM.H, * when being compiled under VMS. All of the additions here * are imbedded in "#ifdef vms" statements EXCEPT the addition * of upper case synonyms for some of the command-line * switches, since VMS changes the command line to upper case. * To compile under VMS, no switches to the compiler are needed. * . Fixed bug in the handling of long files (i.e., >255 sectors). * This file now falls into this category. * . Included code to cause the program to exit when in send * mode and it receives a CAN instead of an ACK from the * receiver. This program, in receive mode, sends a CAN * when it encounters a fatal error. Comment out the * "#define CAN_BOMB" line to disable this. * . Small patches to get it to work under 4.1 BSD VM/UNIX, * as running in the Harvard Science Center, where there is * tighter checking of addresses vs. ints. * Use -DVER7 for VM/UNIX. * . Make text mode transfers accept lone CRs from CP/M (as * opposed to CR/LF pairs) to UNIX. This permits overstriking. * . Added report of estimated file transfer time. * . Removed some more [SD]'s which weren't marked that way; * removed some unnecessary subroutine calls by pushing them * into "JHU" or "VER7", as appropriate. * */ #include #ifdef vms #include ssdef #include tt2def #include ttdef #include "vmodem.h" /* #includes for BOTH JHU and VER7 */ #else #include #include /* Ordering for these two */ #include /* lines is important */ /* JHU UNIX tty parameter file */ #ifdef JHU #include #endif /* Version 7 UNIX tty parameter file */ #ifdef VER7 #include #endif #endif #define VERSION 28 /* Version Number */ #define TRUE 1 #define FALSE 0 #define SOH 001 #define STX 002 #define ETX 003 #define EOT 004 #define ENQ 005 #define ACK 006 #define LF 012 /* Unix LF/NL */ #define CR 015 #define NAK 025 #define SYN 026 #define CAN 030 #define ESC 033 #define CTRLZ 032 /* CP/M EOF for text (usually!) */ #define TIMEOUT -1 #define ERRORMAX 10 /* maximum errors tolerated */ #define RETRYMAX 10 /* maximum retries to be made */ #define BBUFSIZ 128 /* buffer size -- do not change! */ #define CREATMODE 0644 /* mode for created files */ #define CAN_BOMB /* Enable bomb out on receipt of CAN */ /* ARPA Net Constants */ #define IAC 0377 #define DO 0375 #define DONT 0376 #define WILL 0373 #define WONT 0374 #define TRBIN 0 /* JHU UNIX structures */ #ifdef JHU struct sttybuf ttys, ttysnew, ttystemp; /* for stty terminal mode calls */ struct stat statbuf; /* for terminal message on/off control */ #endif /* Version 7 UNIX structures */ #ifdef VER7 struct sgttyb ttys, ttysnew, ttystemp; /* for stty terminal mode calls */ #endif /* VMS structures */ #ifdef vms /* * TT_INFO structures are used for passing information about * the terminal. Used in GTTY and STTY calls. */ struct tt_info ttys, ttysnew, ttystemp; #endif FILE *LOGFP, *fopen(); char buff[BBUFSIZ + 1]; #ifdef JHU int wason; #endif #ifdef VER7 int pagelen; #endif #ifndef vms char *tty, *ttyname(); #endif char XMITTYPE; int ARPA, BIT7, BITMASK, DELFLAG, FTP1, LOGFLAG; int MUNGMODE, PMSG, RECVFLAG, SENDFLAG, STATDISP; int delay; main(argc, argv) int argc; char **argv; { char *logfile; int index; char flag; logfile = "umodem.log"; /* Name of LOG File */ printf("\nUMODEM Version %d.%d", VERSION/10, VERSION%10); printf(" -- UNIX-Based Remote File Transfer Facility\n"); if (argc < 3 || *argv[1] != '-') { printf("\nUsage: \n\tumodem "); #ifndef vms printf("-[rb!rt!sb!st][p][l][1][a][m][d][y][7]"); #else printf("-[rb!rt!sb!st][l][p][y][1][7]"); #endif printf(" filename\n"); printf("\n"); printf("\trb <-- Receive Binary\n"); printf("\trt <-- Receive Text\n"); printf("\tsb <-- Send Binary\n"); printf("\tst <-- Send Text\n"); printf("\tl <-- (ell) Turn OFF LOG File Entries\n"); printf("\tp <-- Turn ON Parameter Display\n"); printf("\ty <-- Display file status (size) information only\n"); printf("\t1 <-- (one) Employ TERM II FTP 1\n"); printf("\t7 <-- Enable 7-bit transfer mask\n"); #ifndef vms printf("\ta <-- Turn ON ARPA Net Flag\n"); printf("\td <-- Delete umodem.log File before starting\n"); printf("\tm <-- Allow file overwiting on receive\n"); #endif printf("\n"); #ifdef vms exit(SS$_NORMAL); #else exit(-1); #endif } /* * Initializations */ index = 1; /* set index for loop */ delay = 3; /* assume FTP 3 delay */ RECVFLAG = FALSE; /* not receive */ SENDFLAG = FALSE; /* not send either */ XMITTYPE = 't'; /* assume text */ FTP1 = FALSE; /* assume FTP 3 (CP/M UG XMODEM2) */ LOGFLAG = TRUE; /* assume log messages */ PMSG = FALSE; /* turn off flags */ STATDISP = FALSE; /* assume not a status display */ BIT7 = FALSE; /* assume 8-bit communication */ ARPA = FALSE; /* assume not on ARPA Net */ DELFLAG = FALSE; /* do NOT delete log file * before starting */ MUNGMODE = FALSE; /* protect files from overwriting */ while ((flag = argv[1][index++]) != '\0') switch (flag) { case '1' : FTP1 = TRUE; /* select FTP 1 */ delay = 5; /* FTP 1 delay constant */ printf("\nUMODEM: TERM II FTP 1 Selected\n"); break; case '7' : BIT7 = TRUE; /* transfer only 7 bits */ break; case 'a' : ARPA = TRUE; /* set ARPA Net */ break; case 'd' : DELFLAG = TRUE; /* delete log file first */ break; case 'L': case 'l' : LOGFLAG = FALSE; /* turn off log report */ break; case 'm' : MUNGMODE = TRUE; /* allow overwriting of files */ break; case 'P': case 'p' : PMSG = TRUE; /* print all messages */ break; case 'R': case 'r' : RECVFLAG = TRUE; /* receive file */ XMITTYPE = gettype(argv[1][index++]); /* get t/b */ break; case 'S': case 's' : SENDFLAG = TRUE; /* send file */ XMITTYPE = gettype(argv[1][index++]); break; case 'Y': case 'y' : STATDISP = TRUE; /* display file status */ break; default : error("Invalid Flag", FALSE); } if (BIT7 && (XMITTYPE == 'b')) { printf("\nUMODEM: Fatal Error -- Both 7-Bit Transfer and "); printf("Binary Transfer Selected"); #ifdef vms exit(SS$_NORMAL); #else exit(-1); #endif } if (BIT7) /* set MASK value */ BITMASK = 0177; /* 7 significant bits */ else BITMASK = 0377; /* 8 significant bits */ if (PMSG) { printf("\nSupported File Transfer Protocols:"); printf("\n\tTERM II FTP 1"); printf("\n\tCP/M UG XMODEM2 (TERM II FTP 3)"); printf("\n\n"); } if (LOGFLAG) { if (!DELFLAG) LOGFP = fopen(logfile, "a"); /* append to LOG file */ else LOGFP = fopen(logfile, "w"); /* new LOG file */ fprintf(LOGFP,"\n\n++++++++\n"); fprintf(LOGFP,"\nUMODEM Version %d.%d\n", VERSION/10, VERSION%10); printf("\nUMODEM: LOG File '%s' is Open\n", logfile); } if (STATDISP) yfile(argv[2]); /* status of a file */ if (RECVFLAG && SENDFLAG) error("Both Send and Receive Functions Specified", FALSE); if (!RECVFLAG && !SENDFLAG) error("Neither Send nor Receive Functions Specified", FALSE); /* * If receiving a file, first check to see if it exists. * If MUNGMODE is off, then abort with error unless we're running * under VMS, where CREAT() makes a file with a new version number. */ if (RECVFLAG) { #ifndef vms if (open(argv[2], 0) != -1) /* If file exists */ { printf("\nUMODEM: Warning -- Target File Exists\n"); if ( MUNGMODE == FALSE ) error("Fatal - Can't overwrite file\n", FALSE); printf("UMODEM: Overwriting Target File\n"); } #endif rfile(argv[2]); /* Receive file */ } else sfile(argv[2]); /* Send file */ } gettype(ichar) char ichar; { switch (ichar) { case 'b': case 'B': case 't': case 'T': return(ichar); default: error("Invalid Send/Receive Parameter - not t or b", FALSE); } return; } /* set tty modes for UMODEM transfers */ setmodes() { /* Device characteristics for JHU UNIX */ #ifdef JHU if (gtty(0, &ttys) < 0) /* get current tty params */ error("Can't get TTY Parameters", TRUE); tty = ttyname(0); /* identify current tty */ /* duplicate current modes in ttysnew structure */ ttysnew.ispeed = ttys.ispeed; /* copy input speed */ ttysnew.ospeed = ttys.ospeed; /* copy output speed */ ttysnew.xflags = ttys.xflags; /* copy JHU/UNIX extended flags */ ttysnew.mode = ttys.mode; /* copy standard terminal flags */ ttysnew.mode |= RAW; /* set for RAW Mode */ /* This ORs in the RAW mode value, thereby setting RAW mode and leaving the other mode settings unchanged */ ttysnew.mode &= ~ECHO; /* set for no echoing */ /* This ANDs in the complement of the ECHO setting (for NO echo), thereby leaving all current parameters unchanged and turning OFF ECHO only */ ttysnew.mode &= ~XTABS; /* set for no tab expansion */ ttysnew.mode &= ~LCASE; /* set for no upper-to-lower case xlate */ ttysnew.mode |= ANYP; /* set for ANY Parity */ ttysnew.mode &= ~NL3; /* turn off ALL delays - new line */ ttysnew.mode &= ~TAB3; /* turn off tab delays */ ttysnew.mode &= ~CR3; /* turn off CR delays */ ttysnew.mode &= ~FF1; /* turn off FF delays */ ttysnew.mode &= ~BS1; /* turn off BS delays */ /* the following are JHU/UNIX xflags settings; they are [SD] */ ttysnew.xflags &= ~PAGE; /* turn off paging */ ttysnew.xflags &= ~STALL; /* turn off ^S/^Q recognition */ ttysnew.xflags &= ~TAPE; /* turn off ^S/^Q input control */ ttysnew.xflags &= ~FOLD; /* turn off CR/LF folding at col 72 */ ttysnew.xflags |= NB8; /* turn on 8-bit input/output */ if (stty(0, &ttysnew) < 0) /* set new params */ error("Can't set new TTY Parameters", TRUE); if (stat(tty, &statbuf) < 0) /* get tty status */ error("Can't get your TTY Status", TRUE); if (statbuf.st_mode&011) /* messages are on [SD] */ { wason = TRUE; if (chmod(tty, 020600) < 0) /* turn off tty messages [SD] */ error("Can't change TTY Mode", TRUE); } else wason = FALSE; /* messages are already off */ #endif /* Device characteristics for Version 7 UNIX */ #ifdef VER7 if (ioctl(0,TIOCGETP,&ttys)<0) /* get tty params [V7] */ error("Can't get TTY Parameters", TRUE); tty = ttyname(0); /* identify current tty */ /* transfer current modes to new structure */ ttysnew.sg_ispeed = ttys.sg_ispeed; /* copy input speed */ ttysnew.sg_ospeed = ttys.sg_ospeed; /* copy output speed */ ttysnew.sg_erase = ttys.sg_erase; /* copy erase flags */ ttysnew.sg_flags = ttys.sg_flags; /* copy flags */ ttysnew.sg_kill = ttys.sg_kill; /* copy std terminal flags */ ttysnew.sg_flags |= RAW; /* set for RAW Mode */ /* This ORs in the RAW mode value, thereby setting RAW mode and leaving the other mode settings unchanged */ ttysnew.sg_flags &= ~ECHO; /* set for no echoing */ /* This ANDs in the complement of the ECHO setting (for NO echo), thereby leaving all current parameters unchanged and turning OFF ECHO only */ ttysnew.sg_flags &= ~XTABS; /* set for no tab expansion */ ttysnew.sg_flags &= ~LCASE; /* set for no upper-to-lower case xlate */ ttysnew.sg_flags |= ANYP; /* set for ANY Parity */ ttysnew.sg_flags &= ~NL3; /* turn off ALL delays - new line */ ttysnew.sg_flags &= ~TAB2; /* turn off tab delays */ ttysnew.sg_flags &= ~CR3; /* turn off CR delays */ ttysnew.sg_flags &= ~FF1; /* turn off FF delays */ ttysnew.sg_flags &= ~BS1; /* turn off BS delays */ ttysnew.sg_flags &= ~TANDEM; /* turn off flow control */ /* make sure page mode is off */ /* ioctl(0,TIOCSSCR,&pagelen); This is [SD]! */ /* set new paramters */ if (ioctl(0,TIOCSETP,&ttysnew) < 0) error("Can't set new TTY Parameters", TRUE); #endif /* Device characteristics for VMS */ #ifdef vms int *iptr, parameters; /* * Get current terminal parameters. */ if (gtty(&ttys) != SS$_NORMAL) error("SETMODES: error return from GTTY (1)", FALSE); if (gtty(&ttysnew) != SS$_NORMAL) error("SETMODES: error return from GTTY (2)", FALSE); /* * Set new terminal parameters. * Note that there are three bytes of terminal characteristics, * so we should make sure the fourth byte of the integer is unchanged. */ iptr = &(ttysnew.dev_characteristics.bcharacteristics); parameters = *iptr; parameters &= ~TT$M_ESCAPE; /* ESCAPE OFF */ parameters &= ~TT$M_HOSTSYNC; /* HOSTSYNC OFF */ parameters |= TT$M_NOECHO; /* NOECHO ON */ parameters |= TT$M_PASSALL; /* PASSALL ON */ parameters &= ~TT$M_READSYNC; /* READSYNC OFF */ parameters &= ~TT$M_TTSYNC; /* TTSYNC OFF */ parameters &= ~TT$M_WRAP; /* WRAP OFF */ if (! BIT7) parameters |= TT$M_EIGHTBIT; /* EIGHTBIT ON */ *iptr = parameters; if (stty(&ttysnew) != SS$_NORMAL) error("SETMODES: error return from STTY", TRUE); #endif if (PMSG) { printf("\nUMODEM: TTY Device Parameters Altered"); ttyparams(); /* print tty params */ } if (ARPA) /* set 8-bit on ARPA Net */ setarpa(); return; } /* set ARPA Net for 8-bit transfers */ setarpa() { sendbyte(IAC); /* set B O S (Binary Output Start) */ sendbyte(WILL); sendbyte(TRBIN); sendbyte(IAC); /* set B I S (Binary Input Start) */ sendbyte(DO); sendbyte(TRBIN); sleep(3); /* wait for TIP to configure */ return; } /* restore normal tty modes */ restoremodes(errcall) int errcall; { if (ARPA) /* if ARPA Net, reconfigure */ resetarpa(); /* Device characteristic restoration for JHU UNIX */ #ifdef JHU if (wason) /* if messages were on originally */ if (chmod(tty, 020611) < 0) /* [SD] */ error("Can't change TTY Mode", FALSE); if (stty(0, &ttys) < 0) /* restore original tty modes */ { if (!errcall) error("RESET - Can't restore normal TTY Params", FALSE); else { printf("UMODEM: "); printf("RESET - Can't restore normal TTY Params\n"); } } #endif /* Device characteristic restoration for Version 7 UNIX */ #ifdef VER7 if (ioctl(0,TIOCSETP,&ttys) < 0) { if (!errcall) error("RESET - Can't restore normal TTY Params", FALSE); else { printf("UMODEM: "); printf("RESET - Can't restore normal TTY Params\n"); } } #endif /* Device characteristic restoration for VMS */ #ifdef vms if (stty(&ttys) != SS$_NORMAL) /* Restore original modes */ { if (!errcall) error("Error restoring original terminal params.", FALSE); else { printf("UMODEM/RESTOREMODES: "); printf("Error restoring original terminal params.\n"); } } #endif if (PMSG) { printf("\nUMODEM: TTY Device Parameters Restored"); ttyparams(); /* print tty params */ } return; } /* reset the ARPA Net */ resetarpa() { sendbyte(IAC); /* send B O E (Binary Output End) */ sendbyte(WONT); sendbyte(TRBIN); sendbyte(IAC); /* send B I E (Binary Input End) */ sendbyte(DONT); sendbyte(TRBIN); return; } /* print error message and exit; if mode == TRUE, restore normal tty modes */ error(msg, mode) char *msg; int mode; { if (mode) restoremodes(TRUE); /* put back normal tty modes */ printf("UMODEM: %s\n", msg); if (LOGFLAG) { fprintf(LOGFP, "UMODEM Fatal Error: %s\n", msg); fclose(LOGFP); } #ifdef vms exit(SS$_NORMAL); #else exit(-1); #endif } /** print status (size) of a file **/ yfile(name) char *name; { printf("UMODEM File Status Display for %s\n", name); if (LOGFLAG) fprintf(LOGFP,"UMODEM File Status Display for %s\n", name); if (open(name,0) < 0) { printf("File %s does not exist\n", name); if (LOGFLAG) fprintf(LOGFP,"File %s does not exist\n", name); #ifdef vms exit(SS$_NORMAL); #else exit(-1); #endif } prfilestat(name); /* print status */ printf("\n"); if (LOGFLAG) { fprintf(LOGFP,"\n"); fclose(LOGFP); } #ifdef vms exit(SS$_NORMAL); #else exit(0); #endif } /** receive a file **/ rfile(name) char *name; { char mode; int fd, j, firstchar, sectnum, sectcurr, tmode; int sectcomp, errors, errorflag, recfin; register int bufctr, checksum; register int c; int errorchar, fatalerror, startstx, inchecksum, endetx, endenq; long recvsectcnt; int lowlim, nlflag; #ifdef vms char inbuf[BBUFSIZ + 7]; #endif mode = XMITTYPE; /* set t/b mode */ if ((fd = creat(name, CREATMODE)) < 0) error("Can't create file for receive", FALSE); printf("\r\nUMODEM: File Name: %s", name); if (LOGFLAG) { fprintf(LOGFP, "\n----\nUMODEM Receive Function\n"); fprintf(LOGFP, "File Name: %s\n", name); if (FTP1) fprintf(LOGFP, "TERM II File Transfer Protocol 1 Selected\n"); else fprintf(LOGFP, "TERM II File Transfer Protocol 3 (CP/M UG) Selected\n"); if (BIT7) fprintf(LOGFP, "7-Bit Transmission Enabled\n"); else fprintf(LOGFP, "8-Bit Transmission Enabled\n"); } printf("\r\nUMODEM: "); if (BIT7) printf("7-Bit"); else printf("8-Bit"); printf(" Transmission Enabled"); printf("\r\nUMODEM: Ready to RECEIVE File\r\n"); setmodes(); /* setup tty modes for xfer */ recfin = FALSE; sectnum = errors = 0; fatalerror = FALSE; /* NO fatal errors */ recvsectcnt = 0; /* number of received sectors */ if (mode == 't' || mode == 'T') tmode = TRUE; else tmode = FALSE; if (FTP1) { while (readbyte(4) != SYN); sendbyte(ACK); /* FTP 1 Sync */ } else sendbyte(NAK); /* FTP 3 Sync */ nlflag = FALSE; do { errorflag = FALSE; do { firstchar = readbyte(6); } while ((firstchar != SOH) && (firstchar != EOT) && (firstchar != TIMEOUT)); if (firstchar == TIMEOUT) { if (LOGFLAG) fprintf(LOGFP, "Timeout on Sector %d\n", sectnum); errorflag = TRUE; } if (firstchar == SOH) { #ifdef vms /* * Under VMS, read the whole block at once. */ if (FTP1) { raw_read(BBUFSIZ + 7, inbuf, 5 + delay * (BBUFSIZ + 6)); sectcurr = inbuf[1] & BITMASK; sectcomp = inbuf[2] & BITMASK; startstx = inbuf[3] & BITMASK; } else { raw_read(BBUFSIZ + 3, inbuf, delay * (BBUFSIZ + 3)); sectcurr = inbuf[0] & BITMASK; sectcomp = inbuf[1] & BITMASK; } #else if (FTP1) readbyte(5); /* discard leading zero */ sectcurr = readbyte(delay); sectcomp = readbyte(delay); if (FTP1) startstx = readbyte(delay); /* get leading STX */ #endif if ((sectcurr + sectcomp) == BITMASK) { if (sectcurr == ((sectnum + 1) % 256) & BITMASK) { checksum = 0; #ifdef vms if (FTP1) lowlim = 4; else lowlim = 2; #else lowlim = 0; #endif bufctr = 0; for (j = lowlim; j < lowlim + BBUFSIZ; j++) { #ifdef vms buff[bufctr] = c = inbuf[j] & BITMASK; #else buff[bufctr] = c = readbyte(delay); #endif checksum = (checksum+c)&BITMASK; if (!tmode) /* binary mode */ { bufctr++; continue; } /* * Translate CP/M's CR/LF into UNIX's LF, but don't do it by * simply ignoring a CR from CP/M--it may indicate an * overstruck line! */ if (nlflag) { /* * Last packet ended with a CR. If the first character of this * packet ISN'T a LF, then be sure to send the CR. */ nlflag = FALSE; if (c != LF) { buff[bufctr++] = CR; buff[bufctr] = c; } } if (j == lowlim + BBUFSIZ - 1 && c == CR) { /* * Last character in the packet is a CR. Don't send it, but * turn on NLFLAG to make sure we check the first character in * the next packet to see if it's a LF. */ nlflag = TRUE; continue; } if (c == LF && bufctr && buff[bufctr - 1] == CR) { /* * We have a CR/LF pair. Discard the CR. */ buff[bufctr - 1] = LF; continue; } if (c == CTRLZ) /* skip CP/M EOF char */ { recfin = TRUE; /* flag EOF */ continue; } if (!recfin) bufctr++; } #ifdef vms if (FTP1) { /* Ending ETX */ endetx = inbuf[lowlim + BBUFSIZ] & BITMASK; /* Checksum */ inchecksum = inbuf[lowlim + BBUFSIZ + 1] & BITMASK; /* ENQ */ endenq = inbuf[lowlim + BBUFSIZ + 2] & BITMASK; } else /* Checksum */ inchecksum = inbuf[lowlim + BBUFSIZ] & BITMASK; #else if (FTP1) endetx = readbyte(delay); /* get ending ETX */ inchecksum = readbyte(delay); /* get checksum */ if (FTP1) endenq = readbyte(delay); /* get ENQ */ #endif if (checksum == inchecksum) /* good checksum */ { errors = 0; recvsectcnt++; sectnum = sectcurr; /* update sector counter */ if (write(fd, buff, bufctr) < 0) error("File Write Error", TRUE); else { if (FTP1) sendbyte(ESC); /* FTP 1 requires */ sendbyte(ACK); } } else { if (LOGFLAG) fprintf(LOGFP, "Checksum Error on Sector %d\n", sectnum); errorflag = TRUE; } } else { if (sectcurr == (sectnum % 256) & BITMASK) { while(readbyte(3) != TIMEOUT); if (FTP1) sendbyte(ESC); /* FTP 1 requires */ sendbyte(ACK); } else { if (LOGFLAG) { fprintf(LOGFP, "Phase Error--received sector is %d ", sectcurr); fprintf(LOGFP, "while expected sector is %d (%d)\n", ((sectnum + 1) % 256) & BITMASK, sectnum); } errorflag = TRUE; fatalerror = TRUE; if (FTP1) sendbyte(ESC); /* FTP 1 requires */ sendbyte(CAN); } } } else { if (LOGFLAG) fprintf(LOGFP, "Header Sector Number Error on Sector %d\n", sectnum); errorflag = TRUE; } } if (FTP1 && !errorflag) { if (startstx != STX) { errorflag = TRUE; /* FTP 1 STX missing */ errorchar = STX; } if (endetx != ETX) { errorflag = TRUE; /* FTP 1 ETX missing */ errorchar = ETX; } if (endenq != ENQ) { errorflag = TRUE; /* FTP 1 ENQ missing */ errorchar = ENQ; } if (errorflag && LOGFLAG) { fprintf(LOGFP, "Invalid Packet-Control Character: "); switch (errorchar) { case STX : fprintf(LOGFP, "STX"); break; case ETX : fprintf(LOGFP, "ETX"); break; case ENQ : fprintf(LOGFP, "ENQ"); break; default : fprintf(LOGFP, "Error"); break; } fprintf(LOGFP, "\n"); } } if (errorflag == TRUE) { errors++; while (readbyte(3) != TIMEOUT); sendbyte(NAK); } } while ((firstchar != EOT) && (errors != ERRORMAX) && !fatalerror); if ((firstchar == EOT) && (errors < ERRORMAX)) { if (!FTP1) sendbyte(ACK); close(fd); restoremodes(FALSE); /* restore normal tty modes */ if (FTP1) while (readbyte(3) != TIMEOUT); /* flush EOT's */ sleep(3); /* give other side time to return to terminal mode */ if (LOGFLAG) { fprintf(LOGFP, "\nReceive Complete\n"); fprintf(LOGFP,"Number of Received CP/M Records is %ld\n", recvsectcnt); fclose(LOGFP); } printf("\n"); #ifdef vms exit(SS$_NORMAL); #else exit(0); #endif } else { if (LOGFLAG && FTP1 && fatalerror) fprintf(LOGFP, "Synchronization Error"); if (errors == ERRORMAX) error("Too many errors", TRUE); if (fatalerror) error("Fatal error", TRUE); } } /** send a file **/ sfile(name) char *name; { char mode; int fd, charval, attempts; int nlflag, sendfin, tmode; register int bufctr, checksum, sectnum; char c; int sendresp; /* response char to sent block */ mode = XMITTYPE; /* set t/b mode */ if ((fd = open(name, 0)) < 0) { if (LOGFLAG) fprintf(LOGFP, "Can't Open File\n"); error("Can't open file for send", FALSE); } printf("\r\nUMODEM: File Name: %s", name); if (LOGFLAG) { fprintf(LOGFP, "\n----\nUMODEM Send Function\n"); fprintf(LOGFP, "File Name: %s\n", name); } prfilestat(name); /* print file size statistics */ if (LOGFLAG) { if (FTP1) fprintf(LOGFP, "TERM II File Transfer Protocol 1 Selected\n"); else fprintf(LOGFP, "TERM II File Transfer Protocol 3 (CP/M UG) Selected\n"); if (BIT7) fprintf(LOGFP, "7-Bit Transmission Enabled\n"); else fprintf(LOGFP, "8-Bit Transmission Enabled\n"); } printf("\r\nUMODEM: "); if (BIT7) printf("7-Bit"); else printf("8-Bit"); printf(" Transmission Enabled"); printf("\r\nUMODEM: Ready to SEND File\r\n"); setmodes(); /* setup tty modes for xfer */ if (mode == 't' || mode == 'T') tmode = TRUE; else tmode = FALSE; sendfin = nlflag = FALSE; attempts = 0; if (FTP1) { sendbyte(SYN); /* FTP 1 Synchronize with Receiver */ while (readbyte(5) != ACK) { if(++attempts > RETRYMAX*6) error("Remote System Not Responding", TRUE); sendbyte(SYN); } } else { while (readbyte(30) != NAK) /* FTP 3 Synchronize with Receiver */ if (++attempts > RETRYMAX) error("Remote System Not Responding", TRUE); } sectnum = 1; /* first sector number */ attempts = 0; do { for (bufctr=0; bufctr < BBUFSIZ;) { if (nlflag) { buff[bufctr++] = LF; /* leftover newline */ nlflag = FALSE; } if ((charval = read(fd, &c, 1)) < 0) error("File Read Error", TRUE); if (charval == 0) /* EOF for read */ { sendfin = TRUE; /* this is the last sector */ if (tmode) buff[bufctr++] = CTRLZ; /* Control-Z for CP/M EOF */ else bufctr++; continue; } if (tmode && c == LF) /* text mode & Unix newline? */ { if (c == LF) /* Unix newline? */ { buff[bufctr++] = CR; /* insert carriage return */ if (bufctr < BBUFSIZ) buff[bufctr++] = LF; /* insert Unix newline */ else nlflag = TRUE; /* insert newline on next sector */ } continue; } buff[bufctr++] = c; /* copy the char without change */ } attempts = 0; do { sendbyte(SOH); /* send start of packet header */ if (FTP1) sendbyte(0); /* FTP 1 Type 0 Packet */ sendbyte(sectnum); /* send current sector number */ sendbyte(-sectnum-1); /* and its complement */ if (FTP1) sendbyte(STX); /* send STX */ checksum = 0; /* init checksum */ for (bufctr=0; bufctr < BBUFSIZ; bufctr++) { sendbyte(buff[bufctr]); /* send the byte */ if (ARPA && (buff[bufctr]==0xff)) /* ARPA Net FFH esc */ sendbyte(buff[bufctr]); /* send 2 FFH's for one */ checksum = (checksum+buff[bufctr])&BITMASK; } /* while (readbyte(3) != TIMEOUT); flush chars from line */ if (FTP1) sendbyte(ETX); /* send ETX */ sendbyte(checksum); /* send the checksum */ if (FTP1) sendbyte(ENQ); /* send ENQ */ attempts++; if (FTP1) { sendresp = NAK; /* prepare for NAK */ if (readbyte(10) == ESC) sendresp = readbyte(10); } else sendresp = readbyte(10); /* get response */ if ((sendresp != ACK) && LOGFLAG) { fprintf(LOGFP, "Non-ACK Received on Sector %d\n", sectnum); if (sendresp == TIMEOUT) fprintf(LOGFP, "This non-ACK was a TIMEOUT\n"); else if (sendresp == NAK) fprintf(LOGFP, "This non-ACK was a NAK\n"); } if (sendresp == CAN) { if (LOGFLAG) fprintf(LOGFP, "This non-ACK was a CAN\n"); #ifdef CAN_BOMB if (LOGFLAG) fprintf(LOGFP, "Exiting: got a CAN from receiver.\n"); close(fd); restoremodes(TRUE); sleep(5); /* Allow other side to recover */ printf("Exiting: got a CAN from receiver.\n\n"); #ifdef vms exit(SS$_NORMAL); #else exit(-1); #endif #endif } } while((sendresp != ACK) && (attempts != RETRYMAX)); sectnum++; /* increment to next sector number */ } while (!sendfin && (attempts != RETRYMAX)); if (attempts == RETRYMAX) error("Remote System Not Responding", TRUE); attempts = 0; if (FTP1) while (attempts++ < 10) sendbyte(EOT); else { sendbyte(EOT); /* send 1st EOT */ while ((readbyte(15) != ACK) && (attempts++ < RETRYMAX)) sendbyte(EOT); if (attempts >= RETRYMAX) error("Remote System Not Responding on Completion", TRUE); } close(fd); restoremodes(FALSE); sleep(5); /* give other side time to return to terminal mode */ if (LOGFLAG) { fprintf(LOGFP, "\nSend Complete\n"); fclose(LOGFP); } printf("\n"); #ifdef vms exit(SS$_NORMAL); #else exit(0); #endif } /* print file size status information */ prfilestat(name) char *name; { long bytes, Kbytes, records; #ifdef vms bytes = filestat(name); /* Gets file length */ if (bytes < 0) { printf("PRFILESTAT: error return from FILESTAT\n"); return; } #else struct stat filestatbuf; /* File status info */ stat(name, &filestatbuf); /* Get file status bytes */ bytes = filestatbuf.st_size; #endif Kbytes = (bytes / 1024) + 1; records = (bytes / 128) + 1; printf("\nUMODEM: Estimated File Size %ldK, %ld Records, %ld Bytes", Kbytes, records, bytes); printf("\n Estimated transfer time at 300 baud: "); printf("%ld min, %ld sec.", bytes / (30*60), ((bytes % (30*60)) / 30) + 1); if (LOGFLAG) fprintf(LOGFP, "Estimated File Size %ldK, %ld Records, %ld Bytes\n", Kbytes, records, bytes); return; } /* get a byte from data stream -- timeout if "seconds" elapses */ /* NOTE, however, that this function returns an INT, not a BYTE!!! */ readbyte(seconds) unsigned seconds; { int c; #ifdef vms c = raw_read(1, &c, seconds); if (c == SS$_TIMEOUT) return(TIMEOUT); #else int alarmfunc(); signal(SIGALRM,alarmfunc); /* catch alarms */ alarm(seconds); /* set the alarm clock */ if (read(0, &c, 1) < 0) /* get a char; error means we timed out */ { return(TIMEOUT); } alarm(0); /* turn off the alarm */ #endif return(c & BITMASK); /* return the char */ } /* send a byte to data stream */ sendbyte(data) char data; { char dataout; dataout = data & BITMASK; /* Mask for 7 or 8 bits */ #ifdef vms raw_write(dataout); #else write(1, &dataout, 1); /* write the byte */ #endif return; } #ifndef vms /* function for alarm clock timeouts */ alarmfunc() { return; /* this is basically a dummy function to force error */ /* status return on the "read" call in "readbyte" */ } #endif /* print data on TTY setting */ ttyparams() { /* For VMS, report that no information is available and return */ #ifdef vms printf("\nUMODEM/TTYPARAMS: "); printf("TT device parameter display not implemented under VMS.\n"); #else /* Obtain TTY parameters for JHU UNIX */ #ifdef JHU gtty(0, &ttystemp); /* get current tty params */ #endif /* Obtain TTY parameters for Version 7 UNIX */ #ifdef VER7 ioctl(0,TIOCGETP,&ttystemp); #endif printf("\r\n\nTTY Device Parameter Display\r\n"); tty = ttyname(0); /* get name of tty */ printf("\tTTY Device Name is %s\r\n\n", tty); printf("\tAny Parity Allowed "); pryn(ANYP); printf("\tEven Parity Allowed"); pryn(EVENP); printf("\tOdd Parity Allowed "); pryn(ODDP); printf("\tLower Case Map "); pryn(LCASE); printf("\tTabs Expanded "); pryn(XTABS); printf("\tCR Mode Enabled "); pryn(CRMOD); printf("\tEcho Enabled "); pryn(ECHO); printf("\tRAW Mode Enabled "); pryn(RAW); /* Print extended terminal characteristics for JHU UNIX */ #ifdef JHU stat(tty, &statbuf); /* get more tty params */ printf("\tBinary Mode Enabled"); pryn1(NB8); printf("\tCR/LF in Col 72 "); pryn1(FOLD); printf("\tRecognize ^S/^Q "); pryn1(STALL); printf("\tSend ^S/^Q "); pryn1(TAPE); printf("\tTerminal can BS "); pryn1(SCOPE); printf("\r\n"); /* New line to separate topics */ printf("\tTerminal Paging is "); pryn1(PAGE); if (ttystemp.xflags&PAGE) printf("\t Lines/Page is %d\r\n", ttystemp.xflags&PAGE); printf("\r\n"); /* New line to separate topics */ printf("\tTTY Input Rate : "); prbaud(ttystemp.ispeed); /* print baud rate */ printf("\tTTY Output Rate : "); prbaud(ttystemp.ospeed); /* print output baud rate */ printf("\r\n"); /* New line to separate topics */ printf("\tMessages Enabled "); if (statbuf.st_mode&011) printf(": Yes\r\n"); else printf(": No\r\n"); #endif /* Print extended characteristics for Version 7 UNIX */ #ifdef VER7 printf("\tTTY Input Rate : "); prbaud(ttystemp.sg_ispeed); printf("\tTTY Output Rate : "); prbaud(ttystemp.sg_ospeed); /* print output baud rate */ #endif #endif /* END #ifdef vms...#else... */ } #ifndef vms pryn(iflag) int iflag; { /* JHU UNIX flag test */ #ifdef JHU if (ttystemp.mode&iflag) /* Version 7 UNIX and VMS flag test */ #else if (ttystemp.sg_flags&iflag) #endif printf(": Yes\r\n"); else printf(": No\r\n"); } #endif /* Extended flag test for JHU UNIX only */ #ifdef JHU pryn1(iflag) int iflag; { if (ttystemp.xflags&iflag) printf(": Yes\r\n"); else printf(": No\r\n"); } #endif #ifndef vms prbaud(speed) char speed; { switch (speed) { /* JHU UNIX speed flag cases */ #ifdef JHU case B0050 : printf("50"); break; case B0075 : printf("75"); break; case B0110 : printf("110"); break; case B0134 : printf("134.5"); break; case B0150 : printf("150"); break; case B0200 : printf("200"); break; case B0300 : printf("300"); break; case B0600 : printf("600"); break; case B1200 : printf("1200"); break; case B1800 : printf("1800"); break; case B2400 : printf("2400"); break; case B4800 : printf("4800"); break; case B9600 : printf("9600"); break; case EXT_A : printf("External A"); break; case EXT_B : printf("External B"); break; #endif /* Version 7 UNIX speed flag cases */ #ifdef VER7 case B50 : printf("50"); break; case B75 : printf("75"); break; case B110 : printf("110"); break; case B134 : printf("134.5"); break; case B150 : printf("150"); break; case B200 : printf("200"); break; case B300 : printf("300"); break; case B600 : printf("600"); break; case B1200 : printf("1200"); break; case B1800 : printf("1800"); break; case B2400 : printf("2400"); break; case B4800 : printf("4800"); break; case B9600 : printf("9600"); break; case EXTA : printf("External A"); break; case EXTB : printf("External B"); break; #endif default : printf("Error"); break; } printf(" Baud\r\n"); } #endif 1 UMODEM UMODEM is a program which is used to assist in file transfers between a microcomputer running the CP/M operating system and a minicomputer running either VAX/VMS or Version 7 UNIX. It is an implementation of the CP/M User's Group MODEM file transfer protocol. UMODEM supports both text and binary file transmission, error detection by checksums, and automatic error recovery. To transfer files between the microcomputer and the VAX, you must have a compatible program running on the CP/M system, such as the popular MODEM program. MODEM is in the public domain. UMODEM is identical in function to the XMODEM file transfer program found on most CP/M Computer Bulletin Board Systems and the SNDRCV programs used with VAXNET. 2 Qualifiers UMODEM reads the command line to find the switches governing its operation and the name of the file to be sent to the CP/M system or created on the VAX. Switches begin with a "-", file names don't. Each switch is one-letter long and multiple switches are permitted (such as "-lrt"). The most important switches are "r" and "s": "Receive" and "Send" a file. 3 R Receive a file on the VAX Used in conjunction with the "t" (text) or "b" (binary) commands. Creates a new file on the VAX with the name given by the file name argument. A new version of the file is created under VMS; an error message is sent under UNIX if the file already exists. 3 S Send a file to the VAX Used in conjunction with the "t" (text) or "b" (binary) commands. Sends an existing file named in the file name argument from the VAX to the CP/M system. 3 T Text file transfer A qualifier to the "r" and "s" commands. Selects "text mode file transfer": converts CP/M CR-LF record delimiters into UNIX LF (or VMS LF stream file) record delimiters. Handles VMS CR-LF pairs properly. This is the normal mode of file transfer. 3 B Binary file transfer A qualifier to the "r" and "s" commands. Selects "binary mode file transfer": no conversions are made between CP/M file format and the VMS or UNIX file formats. 3 L Log file suppression This qualifier causes UMODEM to supress the normal action of logging its activity to the file UMODEM.LOG. If this switch is NOT present, UMODEM will create a file called UMODEM.LOG in the current directory and write statistics regarding the file transfer to it. These statistics include the name of the file transferred and its size. If UMODEM.LOG already exists, the new information is appended to the old file. 3 Y Display file information only--no file transfer Displays the size of the existing file specified in the file name argument and an estimate of the time needed to transfer the file at 300 baud. No file transfer will be performed. This information is also displayed when the "s" switch is selected. ! 3 M ! "Mung mode"--permit file overwrite on receive (UNIX only) ! Use of this qualifier to the "r" switch permits the user to ! overwrite an existing file on the UNIX system. Normally, UMODEM ! first checks to see if a file with the name specified in the file ! name argument already exists before attempting to create a new ! file and stops with an error message if such a file does exist. 3 File name The file name is any legal file name. If no directory specification is present, the current default directory is assumed. Under VMS, logical names may be used. 2 Error recovery UMODEM permits up to ten retries when a transmission error is detected. If this limit is exceeded, UMODEM will quit with an error message. If UMODEM is invoked with insufficient parameters or encounters an error in opening the file you specify, an error message is sent and the program terminates. In addition, the program times out if it doesn't receive the acknowledgment it expects from the microcomputer within a minute or so. If you inadvertently start up UMODEM, just don't do anything and the program will stop itself eventually. See the subtopic "Operation" for more details. 2 Operation UMODEM is an implementation of the CP/M User's Group file transfer protocol of Ward Christensen. Files are sent in "packets" of 128 characters each. Control information is prepended and appended to each packet to identify the packet and provide a means of verifying the integrity of the information contained in the packet. UMODEM waits for an acknowledgment from the other computer before beginning a file transfer. If it has to wait too long, it automatically quits. This "timeout" feature is important, as interrupts (^C, ^Y) are disabled during file transfer. The cyclic redundancy check (CRC) method of error detection implemented on many CP/M systems is not yet available; the checksum method specified in the original CPMUG standard is the technique used in UMODEM. 2 UNIX-VMS_file_transfers Since UMODEM runs under both VMS and Version 7 UNIX, it is capable of transferring files between such machines when used in conjunction with a virtual terminal program such as VAXNET, which runs under VMS. Naturally, the same procedure may be used to initiate file transfers between a VMS machine and a remote CP/M system from the VMS machine. UMODEM/VMS translates the logical name TT to determine which terminal to communicate with. Normally TT corresponds to the terminal you are currently logged in to ("local"). By issuing a "$ DEFINE/USER TT term" command before invoking UMODEM, one may perform transfers over a different terminal line /* * UMODEM -- Implements the "CP/M User's Group XMODEM" protocol, * the TERM II File Transfer Protocol (FTP) Number 1, * and the TERM II File Transfer Protocol Number 4 for * packetized file up/downloading. * * Note: UNIX System-Dependent values are indicated by the string [SD] * in a comment field on the same line as the values. * * * -- Lauren Weinstein, 6/81 * -- (Version 2.0) Modified for JHU/UNIX by Richard Conn, 8/1/81 * -- Version 2.1 Mods by Richard Conn, 8/2/81 * . File Size Included on Send Option * -- Version 2.2 Mods by Richard Conn, 8/2/81 * . Log File Generation and Option Incorporated * -- Version 2.3 Mods by Richard Conn, 8/3/81 * . TERM II FTP 1 Supported * . Error Log Reports Enhanced * . CAN Function Added to FTP 3 * . 'd' Option Added to Delete umodem.log File before starting * -- Version 2.4 Mods by Richard Conn, 8/4/81 * . 16K-extent sector number check error corrected * . Count of number of received sectors added * -- Version 2.5 Mods by Richard Conn, 8/5/81 * . ARPA Net Flag added * . ARPA Net parameter ('a') added to command line * . ARPA Net BIS, BIE, BOS, BOE added * . ARPA Net FFH escape added * -- Version 2.6 Mods by Bennett Marks, 8/21/81 (Bucky @ CCA-UNIX) * . mods for UNIX V7 (Note: for JHU compilation define * the variable JHU during 'cc' * . added 'mungmode' flag to protect from inadvertant * overwrite on file receive * . changed timeout handling prior to issuing checksum * -- Version 2.7 Mods by Richard Conn, 8/25/81 (rconn @ BRL) * . correct minor "ifndef" error in which ifndef had no arg * . restructured "ifdef" references so that other versions * of UNIX than Version 7 and JHU can be easily incorporated; * previous ifdef references were for JHU/not JHU; * to compile under Version 7 or JHU UNIX, the following * command lines are recommended: * "cc umodem.c -o umodem -DVER7" for Version 7 * "cc -7 umodem.c -o umodem -DJHU" for JHU * . added 'y' file status display option; this option gives * the user an estimate of the size of the target file to * send from the UNIX system in terms of CP/M records (128 * bytes) and Kbytes (1024 byte units) * . added '7' option which modifies the transmission protocols * for 7 significant bits rather than 8; modifies both FTP 1 * and FTP 3 * -- Version 2.8 Mods by Richard Conn, 8/28/81 * . corrected system-dependent reference to TIOCSSCR (for * disabling page mode) and created the PAGEMODE flag which * is to be set to TRUE to enable this * . added -4 option which engages TERM II, FTP 4 (new release) * -- Version 2.9 Mods by Richard Conn, 9/1/81 * . internal documentation on ARPA Net protocols expanded * . possible operator precedence problem with BITMASK corrected * by redundant parentheses * -- Version 3.0 Mods by Lauren Weinstein, 9/14/81 * . fixed bug in PAGEMODE defines (removed PAGEMODE define * line; now should be compiled with "-DPAGEMODE" if * Page Mode is desired) * . included forward declaration of ttyname() to avoid problems * with newer V7 C compilers * -- Version 3.1 Mods by Lauren Weinstein, 4/17/82 * . avoids sending extraneous last sector when file EOF * occurs on an exact sector boundary * -- Version 3.2 Mods by Michael M Rubenstein, 5/26/83 * . fixed bug in readbyte. assumed that int's are ordered * from low significance to high * . added LOGDEFAULT define to allow default logging to be * off. compile with -DLOGDEFAULT=0 to set default to no * no logging. * */ #include #include #include /* JHU UNIX tty parameter file */ #ifdef JHU #include #endif /* Version 7 UNIX tty parameter file */ #ifdef VER7 #include #endif /* log default define */ #ifndef LOGDEFAULT #define LOGDEFAULT 1 #endif #include #define VERSION 32 /* Version Number */ #define TRUE 1 #define FALSE 0 /* Compile with "-DPAGEMODE" if Page Mode (TIOCSSCR) is supported on your * UNIX system. If it is supported, make sure that TIOCSSCR is the * correct name for Page Mode engagement. */ /* ASCII Constants */ #define SOH 001 #define STX 002 #define ETX 003 #define EOT 004 #define ENQ 005 #define ACK 006 #define LF 012 /* Unix LF/NL */ #define CR 015 #define NAK 025 #define SYN 026 #define CAN 030 #define ESC 033 #define CTRLZ 032 /* CP/M EOF for text (usually!) */ /* UMODEM Constants */ #define TIMEOUT -1 #define ERRORMAX 10 /* maximum errors tolerated */ #define RETRYMAX 10 /* maximum retries to be made */ #define BBUFSIZ 128 /* buffer size -- do not change! */ /* [SD] Mode for Created Files */ #define CREATMODE 0644 /* mode for created files */ /* ARPA Net Constants */ /* The following constants are used to communicate with the ARPA * Net SERVER TELNET and TIP programs. These constants are defined * as follows: * IAC <-- Is A Command; indicates that * a command follows * WILL/WONT <-- Command issued to SERVER TELNET * (Host); WILL issues command * and WONT issues negative of * the command * DO/DONT <-- Command issued to TIP; DO issues * command and DONT issues * negative of the command * TRBIN <-- Transmit Binary Command * Examples: * IAC WILL TRBIN <-- Host is configured to transmit Binary * IAC WONT TRBIN <-- Host is configured NOT to transmit binary * IAC DO TRBIN <-- TIP is configured to transmit Binary * IAC DONT TRBIN <-- TIP is configured NOT to transmit binary */ #define IAC 0377 /* Is A Command */ #define DO 0375 /* Command to TIP */ #define DONT 0376 /* Negative of Command to TIP */ #define WILL 0373 /* Command to SERVER TELNET (Host) */ #define WONT 0374 /* Negative of Command to SERVER TELNET */ #define TRBIN 0 /* Transmit Binary Command */ /* JHU UNIX structures */ #ifdef JHU struct sttybuf ttys, ttysnew, ttystemp; /* for stty terminal mode calls */ #endif /* Version 7 UNIX structures */ #ifdef VER7 struct sgttyb ttys, ttysnew, ttystemp; /* for stty terminal mode calls */ #endif struct stat statbuf; /* for terminal message on/off control */ FILE *LOGFP, *fopen(); char buff[BBUFSIZ]; #ifdef JHU int wason; #endif #ifdef VER7 int pagelen; char *ttyname(); /* forward declaration for C */ #endif char *tty; char XMITTYPE; int ARPA, RECVFLAG, SENDFLAG, FTP1, PMSG, DELFLAG, LOGFLAG, MUNGMODE; int STATDISP, BIT7, BITMASK; int delay; alarmfunc(); main(argc, argv) int argc; char **argv; { char *logfile; int index; char flag; logfile = "umodem.log"; /* Name of LOG File */ printf("\nUMODEM Version %d.%d", VERSION/10, VERSION%10); printf(" -- UNIX-Based Remote File Transfer Facility\n"); if (argc < 3 || *argv[1] != '-') { printf("\nUsage: \n\tumodem "); printf("-[rb!rt!sb!st][p][l][1][a][m][d][y][7][4]"); printf(" filename\n"); printf("\n"); printf("\n\trb <-- Receive Binary"); printf("\n\trt <-- Receive Text"); printf("\n\tsb <-- Send Binary"); printf("\n\tst <-- Send Text"); printf("\n\tp <-- Turn ON Parameter Display"); #if LOGDEFAULT printf("\n\tl <-- (ell) Turn OFF LOG File Entries"); #else printf("\n\tl <-- (ell) Turn ON LOG File Entries"); #endif printf("\n\t1 <-- (one) Employ TERM II FTP 1"); printf("\n\ta <-- Turn ON ARPA Net Flag"); printf("\n\tm <-- Allow file overwiting on receive"); printf("\n\td <-- Delete umodem.log File before starting"); printf("\n\ty <-- Display file status (size) information only"); printf("\n\t7 <-- Enable 7-bit transfer mask"); printf("\n\t4 <-- Enable TERM II FTP 4"); printf("\n"); exit(-1); } index = 1; /* set index for loop */ delay = 3; /* assume FTP 3 delay */ PMSG = FALSE; /* turn off flags */ FTP1 = FALSE; /* assume FTP 3 (CP/M UG XMODEM2) */ RECVFLAG = FALSE; /* not receive */ SENDFLAG = FALSE; /* not send either */ XMITTYPE = 't'; /* assume text */ DELFLAG = FALSE; /* do NOT delete log file before starting */ LOGFLAG = LOGDEFAULT; ARPA = FALSE; /* assume not on ARPA Net */ MUNGMODE = FALSE; /* protect files from overwriting */ STATDISP = FALSE; /* assume not a status display */ BIT7 = FALSE; /* assume 8-bit communication */ while ((flag = argv[1][index++]) != '\0') switch (flag) { case 'a' : ARPA = TRUE; /* set ARPA Net */ break; case 'p' : PMSG = TRUE; /* print all messages */ break; case '1' : FTP1 = TRUE; /* select FTP 1 */ delay = 5; /* FTP 1 delay constant */ printf("\nUMODEM: TERM II FTP 1 Selected\n"); break; case 'd' : DELFLAG = TRUE; /* delete log file first */ break; case 'l' : LOGFLAG = ~LOGDEFAULT; /* turn off log report */ break; case 'r' : RECVFLAG = TRUE; /* receive file */ XMITTYPE = gettype(argv[1][index++]); /* get t/b */ break; case 's' : SENDFLAG = TRUE; /* send file */ XMITTYPE = gettype(argv[1][index++]); break; case 'm' : MUNGMODE = TRUE; /* allow overwriting of files */ break; case 'y' : STATDISP = TRUE; /* display file status */ break; case '7' : BIT7 = TRUE; /* transfer only 7 bits */ break; case '4' : FTP1 = TRUE; /* select FTP 1 (varient) */ BIT7 = TRUE; /* transfer only 7 bits */ delay = 5; /* FTP 1 delay constant */ printf("\nUMODEM: TERM II FTP 4 Selected\n"); break; default : error("Invalid Flag", FALSE); } if (BIT7 && (XMITTYPE == 'b')) { printf("\nUMODEM: Fatal Error -- Both 7-Bit Transfer and "); printf("Binary Transfer Selected"); exit(-1); /* error exit to UNIX */ } if (BIT7) /* set MASK value */ BITMASK = 0177; /* 7 significant bits */ else BITMASK = 0377; /* 8 significant bits */ if (PMSG) { printf("\nSupported File Transfer Protocols:"); printf("\n\tTERM II FTP 1"); printf("\n\tCP/M UG XMODEM2 (TERM II FTP 3)"); printf("\n\tTERM II FTP 4"); printf("\n\n"); } if (LOGFLAG) { if (!DELFLAG) LOGFP = fopen(logfile, "a"); /* append to LOG file */ else LOGFP = fopen(logfile, "w"); /* new LOG file */ fprintf(LOGFP,"\n\n++++++++\n"); fprintf(LOGFP,"\nUMODEM Version %d.%d\n", VERSION/10, VERSION%10); printf("\nUMODEM: LOG File '%s' is Open\n", logfile); } if (STATDISP) yfile(argv[2]); /* status of a file */ if (RECVFLAG && SENDFLAG) error("Both Send and Receive Functions Specified", FALSE); if (!RECVFLAG && !SENDFLAG) error("Neither Send nor Receive Functions Specified", FALSE); if (RECVFLAG) { if(open(argv[2], 0) != -1) /* possible abort if file exists */ { printf("\nUMODEM: Warning -- Target File Exists\n"); if( MUNGMODE == FALSE ) error("Fatal - Can't overwrite file\n",FALSE); printf("UMODEM: Overwriting Target File\n"); } rfile(argv[2]); /* receive file */ } else sfile(argv[2]); /* send file */ } gettype(ichar) char ichar; { if (ichar == 't') return(ichar); if (ichar == 'b') return(ichar); error("Invalid Send/Receive Parameter - not t or b", FALSE); return; } /* set tty modes for UMODEM transfers */ setmodes() { /* Device characteristics for JHU UNIX */ #ifdef JHU if (gtty(0, &ttys) < 0) /* get current tty params */ error("Can't get TTY Parameters", TRUE); tty = ttyname(0); /* identify current tty */ /* duplicate current modes in ttysnew structure */ ttysnew.ispeed = ttys.ispeed; /* copy input speed */ ttysnew.ospeed = ttys.ospeed; /* copy output speed */ ttysnew.xflags = ttys.xflags; /* copy JHU/UNIX extended flags */ ttysnew.mode = ttys.mode; /* copy standard terminal flags */ ttysnew.mode |= RAW; /* set for RAW Mode */ /* This ORs in the RAW mode value, thereby setting RAW mode and leaving the other mode settings unchanged */ ttysnew.mode &= ~ECHO; /* set for no echoing */ /* This ANDs in the complement of the ECHO setting (for NO echo), thereby leaving all current parameters unchanged and turning OFF ECHO only */ ttysnew.mode &= ~XTABS; /* set for no tab expansion */ ttysnew.mode &= ~LCASE; /* set for no upper-to-lower case xlate */ ttysnew.mode |= ANYP; /* set for ANY Parity */ ttysnew.mode &= ~NL3; /* turn off ALL delays - new line */ ttysnew.mode &= ~TAB3; /* turn off tab delays */ ttysnew.mode &= ~CR3; /* turn off CR delays */ ttysnew.mode &= ~FF1; /* turn off FF delays */ ttysnew.mode &= ~BS1; /* turn off BS delays */ /* the following are JHU/UNIX xflags settings; they are [SD] */ ttysnew.xflags &= ~PAGE; /* turn off paging */ ttysnew.xflags &= ~STALL; /* turn off ^S/^Q recognition */ ttysnew.xflags &= ~TAPE; /* turn off ^S/^Q input control */ ttysnew.xflags &= ~FOLD; /* turn off CR/LF folding at col 72 */ ttysnew.xflags |= NB8; /* turn on 8-bit input/output */ if (stty(0, &ttysnew) < 0) /* set new params */ error("Can't set new TTY Parameters", TRUE); if (stat(tty, &statbuf) < 0) /* get tty status */ error("Can't get your TTY Status", TRUE); if (statbuf.st_mode&011) /* messages are on [SD] */ { wason = TRUE; if (chmod(tty, 020600) < 0) /* turn off tty messages [SD] */ error("Can't change TTY Mode", TRUE); } else wason = FALSE; /* messages are already off */ #endif /* Device characteristics for Version 7 UNIX */ #ifdef VER7 if (ioctl(0,TIOCGETP,&ttys)<0) /* get tty params [V7] */ error("Can't get TTY Parameters", TRUE); tty = ttyname(0); /* identify current tty */ /* transfer current modes to new structure */ ttysnew.sg_ispeed = ttys.sg_ispeed; /* copy input speed */ ttysnew.sg_ospeed = ttys.sg_ospeed; /* copy output speed */ ttysnew.sg_erase = ttys.sg_erase; /* copy erase flags */ ttysnew.sg_flags = ttys.sg_flags; /* copy flags */ ttysnew.sg_kill = ttys.sg_kill; /* copy std terminal flags */ ttysnew.sg_flags |= RAW; /* set for RAW Mode */ /* This ORs in the RAW mode value, thereby setting RAW mode and leaving the other mode settings unchanged */ ttysnew.sg_flags &= ~ECHO; /* set for no echoing */ /* This ANDs in the complement of the ECHO setting (for NO echo), thereby leaving all current parameters unchanged and turning OFF ECHO only */ ttysnew.sg_flags &= ~XTABS; /* set for no tab expansion */ ttysnew.sg_flags &= ~LCASE; /* set for no upper-to-lower case xlate */ ttysnew.sg_flags |= ANYP; /* set for ANY Parity */ ttysnew.sg_flags &= ~NL3; /* turn off ALL delays - new line */ ttysnew.sg_flags &= ~TAB2; /* turn off tab delays */ ttysnew.sg_flags &= ~CR3; /* turn off CR delays */ ttysnew.sg_flags &= ~FF1; /* turn off FF delays */ ttysnew.sg_flags &= ~BS1; /* turn off BS delays */ ttysnew.sg_flags &= ~TANDEM; /* turn off flow control */ #ifdef PAGEMODE /* make sure page mode is off */ ioctl(0,TIOCSSCR,&pagelen); /* [SD] */ #endif /* set new paramters */ if (ioctl(0,TIOCSETP,&ttysnew) < 0) error("Can't set new TTY Parameters", TRUE); if (stat(tty, &statbuf) < 0) /* get tty status */ error("Can't get your TTY Status", TRUE); #endif if (PMSG) { printf("\nUMODEM: TTY Device Parameters Altered"); ttyparams(); /* print tty params */ } if (ARPA) /* set 8-bit on ARPA Net */ setarpa(); return; } /* set ARPA Net for 8-bit transfers */ setarpa() { sendbyte(IAC); /* Is A Command */ sendbyte(WILL); /* Command to SERVER TELNET (Host) */ sendbyte(TRBIN); /* Command is: Transmit Binary */ sendbyte(IAC); /* Is A Command */ sendbyte(DO); /* Command to TIP */ sendbyte(TRBIN); /* Command is: Transmit Binary */ sleep(3); /* wait for TIP to configure */ return; } /* restore normal tty modes */ restoremodes(errcall) int errcall; { if (ARPA) /* if ARPA Net, reconfigure */ resetarpa(); /* Device characteristic restoration for JHU UNIX */ #ifdef JHU if (wason) /* if messages were on originally */ if (chmod(tty, 020611) < 0) /* [SD] */ error("Can't change TTY Mode", FALSE); if (stty(0, &ttys) < 0) /* restore original tty modes */ { if (!errcall) error("RESET - Can't restore normal TTY Params", FALSE); else { printf("UMODEM: "); printf("RESET - Can't restore normal TTY Params\n"); } } #endif /* Device characteristic restoration for Version 7 UNIX */ #ifdef VER7 if (ioctl(0,TIOCSETP,&ttys) < 0) { if (!errcall) error("RESET - Can't restore normal TTY Params", FALSE); else { printf("UMODEM: "); printf("RESET - Can't restore normal TTY Params\n"); } } #endif if (PMSG) { printf("\nUMODEM: TTY Device Parameters Restored"); ttyparams(); /* print tty params */ } return; } /* reset the ARPA Net */ resetarpa() { sendbyte(IAC); /* Is A Command */ sendbyte(WONT); /* Negative Command to SERVER TELNET (Host) */ sendbyte(TRBIN); /* Command is: Don't Transmit Binary */ sendbyte(IAC); /* Is A Command */ sendbyte(DONT); /* Negative Command to TIP */ sendbyte(TRBIN); /* Command is: Don't Transmit Binary */ return; } /* print error message and exit; if mode == TRUE, restore normal tty modes */ error(msg, mode) char *msg; int mode; { if (mode) restoremodes(TRUE); /* put back normal tty modes */ printf("UMODEM: %s\n", msg); if (LOGFLAG) { fprintf(LOGFP, "UMODEM Fatal Error: %s\n", msg); fclose(LOGFP); } exit(-1); } /** print status (size) of a file **/ yfile(name) char *name; { printf("UMODEM File Status Display for %s\n", name); if (LOGFLAG) fprintf(LOGFP,"UMODEM File Status Display for %s\n", name); if (open(name,0) < 0) { printf("File %s does not exist\n", name); if (LOGFLAG) fprintf(LOGFP,"File %s does not exist\n", name); exit(-1); /* error exit to UNIX */ } prfilestat(name); /* print status */ printf("\n"); if (LOGFLAG) { fprintf(LOGFP,"\n"); fclose(LOGFP); } exit(0); /* exit to UNIX -- no error */ } /** receive a file **/ rfile(name) char *name; { char mode; int fd, j, firstchar, sectnum, sectcurr, tmode; int sectcomp, errors, errorflag, recfin; register int bufctr, checksum; register int c; int errorchar, fatalerror, startstx, inchecksum, endetx, endenq; long recvsectcnt; mode = XMITTYPE; /* set t/b mode */ if ((fd = creat(name, CREATMODE)) < 0) error("Can't create file for receive", FALSE); setmodes(); /* setup tty modes for xfer */ printf("\r\nUMODEM: File Name: %s", name); if (LOGFLAG) { fprintf(LOGFP, "\n----\nUMODEM Receive Function\n"); fprintf(LOGFP, "File Name: %s\n", name); if (FTP1) if (!BIT7) fprintf(LOGFP, "TERM II File Transfer Protocol 1 Selected\n"); else fprintf(LOGFP, "TERM II File Transfer Protocol 4 Selected\n"); else fprintf(LOGFP, "TERM II File Transfer Protocol 3 (CP/M UG) Selected\n"); if (BIT7) fprintf(LOGFP, "7-Bit Transmission Enabled\n"); else fprintf(LOGFP, "8-Bit Transmission Enabled\n"); } printf("\r\nUMODEM: "); if (BIT7) printf("7-Bit"); else printf("8-Bit"); printf(" Transmission Enabled"); printf("\r\nUMODEM: Ready to RECEIVE File\r\n"); recfin = FALSE; sectnum = errors = 0; fatalerror = FALSE; /* NO fatal errors */ recvsectcnt = 0; /* number of received sectors */ if (mode == 't') tmode = TRUE; else tmode = FALSE; if (FTP1) { while (readbyte(4) != SYN); sendbyte(ACK); /* FTP 1 Sync */ } else sendbyte(NAK); /* FTP 3 Sync */ do { errorflag = FALSE; do { firstchar = readbyte(6); } while ((firstchar != SOH) && (firstchar != EOT) && (firstchar != TIMEOUT)); if (firstchar == TIMEOUT) { if (LOGFLAG) fprintf(LOGFP, "Timeout on Sector %d\n", sectnum); errorflag = TRUE; } if (firstchar == SOH) { if (FTP1) readbyte(5); /* discard leading zero */ sectcurr = readbyte(delay); sectcomp = readbyte(delay); if (FTP1) startstx = readbyte(delay); /* get leading STX */ if ((sectcurr + sectcomp) == BITMASK) { if (sectcurr == ((sectnum+1)&BITMASK)) { checksum = 0; for (j = bufctr = 0; j < BBUFSIZ; j++) { buff[bufctr] = c = readbyte(delay); checksum = ((checksum+c)&BITMASK); if (!tmode) /* binary mode */ { bufctr++; continue; } if (c == CR) continue; /* skip CR's */ if (c == CTRLZ) /* skip CP/M EOF char */ { recfin = TRUE; /* flag EOF */ continue; } if (!recfin) bufctr++; } if (FTP1) endetx = readbyte(delay); /* get ending ETX */ inchecksum = readbyte(delay); /* get checksum */ if (FTP1) endenq = readbyte(delay); /* get ENQ */ if (checksum == inchecksum) /* good checksum */ { errors = 0; recvsectcnt++; sectnum = sectcurr; /* update sector counter */ if (write(fd, buff, bufctr) < 0) error("File Write Error", TRUE); else { if (FTP1) sendbyte(ESC); /* FTP 1 requires */ sendbyte(ACK); } } else { if (LOGFLAG) fprintf(LOGFP, "Checksum Error on Sector %d\n", sectnum); errorflag = TRUE; } } else { if (sectcurr == sectnum) { while(readbyte(3) != TIMEOUT); if (FTP1) sendbyte(ESC); /* FTP 1 requires */ sendbyte(ACK); } else { if (LOGFLAG) { fprintf(LOGFP, "Phase Error - Received Sector is "); fprintf(LOGFP, "%d while Expected Sector is %d\n", sectcurr, ((sectnum+1)&BITMASK)); } errorflag = TRUE; fatalerror = TRUE; if (FTP1) sendbyte(ESC); /* FTP 1 requires */ sendbyte(CAN); } } } else { if (LOGFLAG) fprintf(LOGFP, "Header Sector Number Error on Sector %d\n", sectnum); errorflag = TRUE; } } if (FTP1 && !errorflag) { if (startstx != STX) { errorflag = TRUE; /* FTP 1 STX missing */ errorchar = STX; } if (endetx != ETX) { errorflag = TRUE; /* FTP 1 ETX missing */ errorchar = ETX; } if (endenq != ENQ) { errorflag = TRUE; /* FTP 1 ENQ missing */ errorchar = ENQ; } if (errorflag && LOGFLAG) { fprintf(LOGFP, "Invalid Packet-Control Character: "); switch (errorchar) { case STX : fprintf(LOGFP, "STX"); break; case ETX : fprintf(LOGFP, "ETX"); break; case ENQ : fprintf(LOGFP, "ENQ"); break; default : fprintf(LOGFP, "Error"); break; } fprintf(LOGFP, "\n"); } } if (errorflag == TRUE) { errors++; while (readbyte(3) != TIMEOUT); sendbyte(NAK); } } while ((firstchar != EOT) && (errors != ERRORMAX) && !fatalerror); if ((firstchar == EOT) && (errors < ERRORMAX)) { if (!FTP1) sendbyte(ACK); close(fd); restoremodes(FALSE); /* restore normal tty modes */ if (FTP1) while (readbyte(3) != TIMEOUT); /* flush EOT's */ sleep(3); /* give other side time to return to terminal mode */ if (LOGFLAG) { fprintf(LOGFP, "\nReceive Complete\n"); fprintf(LOGFP,"Number of Received CP/M Records is %ld\n", recvsectcnt); fclose(LOGFP); } printf("\n"); exit(0); } else { if (LOGFLAG && FTP1 && fatalerror) fprintf(LOGFP, "Synchronization Error"); error("TIMEOUT -- Too Many Errors", TRUE); } } /** send a file **/ sfile(name) char *name; { char mode; int fd, charval, attempts; int nlflag, sendfin, tmode; register int bufctr, checksum, sectnum; char c; int sendresp; /* response char to sent block */ mode = XMITTYPE; /* set t/b mode */ if ((fd = open(name, 0)) < 0) { if (LOGFLAG) fprintf(LOGFP, "Can't Open File\n"); error("Can't open file for send", FALSE); } setmodes(); /* setup tty modes for xfer */ printf("\r\nUMODEM: File Name: %s", name); if (LOGFLAG) { fprintf(LOGFP, "\n----\nUMODEM Send Function\n"); fprintf(LOGFP, "File Name: %s\n", name); } prfilestat(name); /* print file size statistics */ if (LOGFLAG) { if (FTP1) if (!BIT7) fprintf(LOGFP, "TERM II File Transfer Protocol 1 Selected\n"); else fprintf(LOGFP, "TERM II File Transfer Protocol 4 Selected\n"); else fprintf(LOGFP, "TERM II File Transfer Protocol 3 (CP/M UG) Selected\n"); if (BIT7) fprintf(LOGFP, "7-Bit Transmission Enabled\n"); else fprintf(LOGFP, "8-Bit Transmission Enabled\n"); } printf("\r\nUMODEM: "); if (BIT7) printf("7-Bit"); else printf("8-Bit"); printf(" Transmission Enabled"); printf("\r\nUMODEM: Ready to SEND File\r\n"); if (mode == 't') tmode = TRUE; else tmode = FALSE; sendfin = nlflag = FALSE; attempts = 0; if (FTP1) { sendbyte(SYN); /* FTP 1 Synchronize with Receiver */ while (readbyte(5) != ACK) { if(++attempts > RETRYMAX*6) error("Remote System Not Responding", TRUE); sendbyte(SYN); } } else { while (readbyte(30) != NAK) /* FTP 3 Synchronize with Receiver */ if (++attempts > RETRYMAX) error("Remote System Not Responding", TRUE); } sectnum = 1; /* first sector number */ attempts = 0; do { for (bufctr=0; bufctr < BBUFSIZ;) { if (nlflag) { buff[bufctr++] = LF; /* leftover newline */ nlflag = FALSE; } if ((charval = read(fd, &c, 1)) < 0) error("File Read Error", TRUE); if (charval == 0) /* EOF for read */ { sendfin = TRUE; /* this is the last sector */ if (!bufctr) /* if EOF on sector boundary */ break; /* avoid sending extra sector */ if (tmode) buff[bufctr++] = CTRLZ; /* Control-Z for CP/M EOF */ else bufctr++; continue; } if (tmode && c == LF) /* text mode & Unix newline? */ { if (c == LF) /* Unix newline? */ { buff[bufctr++] = CR; /* insert carriage return */ if (bufctr < BBUFSIZ) buff[bufctr++] = LF; /* insert Unix newline */ else nlflag = TRUE; /* insert newline on next sector */ } continue; } buff[bufctr++] = c; /* copy the char without change */ } attempts = 0; if (!bufctr) /* if EOF on sector boundary */ break; /* avoid sending empty sector */ do { sendbyte(SOH); /* send start of packet header */ if (FTP1) sendbyte(0); /* FTP 1 Type 0 Packet */ sendbyte(sectnum); /* send current sector number */ sendbyte(-sectnum-1); /* and its complement */ if (FTP1) sendbyte(STX); /* send STX */ checksum = 0; /* init checksum */ for (bufctr=0; bufctr < BBUFSIZ; bufctr++) { sendbyte(buff[bufctr]); /* send the byte */ if (ARPA && (buff[bufctr]==0xff)) /* ARPA Net FFH esc */ sendbyte(buff[bufctr]); /* send 2 FFH's for one */ checksum = ((checksum+buff[bufctr])&BITMASK); } /* while (readbyte(3) != TIMEOUT); flush chars from line */ if (FTP1) sendbyte(ETX); /* send ETX */ sendbyte(checksum); /* send the checksum */ if (FTP1) sendbyte(ENQ); /* send ENQ */ attempts++; if (FTP1) { sendresp = NAK; /* prepare for NAK */ if (readbyte(10) == ESC) sendresp = readbyte(10); } else sendresp = readbyte(10); /* get response */ if ((sendresp != ACK) && LOGFLAG) { fprintf(LOGFP, "Non-ACK Received on Sector %d\n", sectnum); if (sendresp == TIMEOUT) fprintf(LOGFP, "This Non-ACK was a TIMEOUT\n"); } } while((sendresp != ACK) && (attempts != RETRYMAX)); sectnum++; /* increment to next sector number */ } while (!sendfin && (attempts != RETRYMAX)); if (attempts == RETRYMAX) error("Remote System Not Responding", TRUE); attempts = 0; if (FTP1) while (attempts++ < 10) sendbyte(EOT); else { sendbyte(EOT); /* send 1st EOT */ while ((readbyte(15) != ACK) && (attempts++ < RETRYMAX)) sendbyte(EOT); if (attempts >= RETRYMAX) error("Remote System Not Responding on Completion", TRUE); } close(fd); restoremodes(FALSE); sleep(5); /* give other side time to return to terminal mode */ if (LOGFLAG) { fprintf(LOGFP, "\nSend Complete\n"); fclose(LOGFP); } printf("\n"); exit(0); } /* print file size status information */ prfilestat(name) char *name; { struct stat filestatbuf; /* file status info */ stat(name, &filestatbuf); /* get file status bytes */ printf("\r\nUMODEM: Estimated File Size %ldK, %ld Records, %ld Bytes", (filestatbuf.st_size/1024)+1, (filestatbuf.st_size/128)+1, filestatbuf.st_size); if (LOGFLAG) fprintf(LOGFP,"Estimated File Size %ldK, %ld Records, %ld Bytes\n", (filestatbuf.st_size/1024)+1, (filestatbuf.st_size/128)+1, filestatbuf.st_size); return; } /* get a byte from data stream -- timeout if "seconds" elapses */ readbyte(seconds) unsigned seconds; { char c; signal(SIGALRM,alarmfunc); /* catch alarms */ alarm(seconds); /* set the alarm clock */ if (read(0, &c, 1) < 0) /* get a char; error means we timed out */ { return(TIMEOUT); } alarm(0); /* turn off the alarm */ return((c&BITMASK)); /* return the char */ } /* send a byte to data stream */ sendbyte(data) char data; { char dataout; dataout = (data&BITMASK); /* mask for 7 or 8 bits */ write(1, &dataout, 1); /* write the byte */ return; } /* function for alarm clock timeouts */ alarmfunc() { return; /* this is basically a dummy function to force error */ /* status return on the "read" call in "readbyte" */ } /* print data on TTY setting */ ttyparams() { /* Obtain TTY parameters for JHU UNIX */ #ifdef JHU gtty(0, &ttystemp); /* get current tty params */ #endif /* Obtain TTY parameters for Version 7 UNIX */ #ifdef VER7 ioctl(0,TIOCGETP,&ttystemp); #endif tty = ttyname(0); /* get name of tty */ stat(tty, &statbuf); /* get more tty params */ printf("\r\n\nTTY Device Parameter Display"); printf("\r\n\tTTY Device Name is %s\r\n\n", tty); printf("\tAny Parity Allowed "); pryn(ANYP); printf("\tEven Parity Allowed"); pryn(EVENP); printf("\tOdd Parity Allowed "); pryn(ODDP); printf("\tEcho Enabled "); pryn(ECHO); printf("\tLower Case Map "); pryn(LCASE); printf("\tTabs Expanded "); pryn(XTABS); printf("\tCR Mode Enabled "); pryn(CRMOD); printf("\tRAW Mode Enabled "); pryn(RAW); /* Print extended terminal characteristics for JHU UNIX */ #ifdef JHU printf("\tBinary Mode Enabled"); pryn1(NB8); printf("\tCR/LF in Col 72 "); pryn1(FOLD); printf("\tRecognize ^S/^Q "); pryn1(STALL); printf("\tSend ^S/^Q "); pryn1(TAPE); printf("\tTerminal can BS "); pryn1(SCOPE); printf("\r\n"); /* New line to separate topics */ printf("\tTerminal Paging is "); pryn1(PAGE); if (ttystemp.xflags&PAGE) printf("\t Lines/Page is %d\r\n", ttystemp.xflags&PAGE); printf("\r\n"); /* New line to separate topics */ printf("\tTTY Input Rate : "); prbaud(ttystemp.ispeed); /* print baud rate */ printf("\tTTY Output Rate : "); prbaud(ttystemp.ospeed); /* print output baud rate */ printf("\r\n"); /* New line to separate topics */ printf("\tMessages Enabled "); if (statbuf.st_mode&011) printf(": Yes\r\n"); else printf(": No\r\n"); #endif /* Print extended characteristics for Version 7 UNIX */ #ifdef VER7 printf("\tTTY Input Rate : "); prbaud(ttystemp.sg_ispeed); printf("\tTTY Output Rate : "); prbaud(ttystemp.sg_ospeed); /* print output baud rate */ #endif } pryn(iflag) int iflag; { /* JHU UNIX flag test */ #ifdef JHU if (ttystemp.mode&iflag) #endif /* Version 7 UNIX flag test */ #ifdef VER7 if (ttystemp.sg_flags&iflag) #endif printf(": Yes\r\n"); else printf(": No\r\n"); } /* Extended flag test for JHU UNIX only */ #ifdef JHU pryn1(iflag) int iflag; { if (ttystemp.xflags&iflag) printf(": Yes\r\n"); else printf(": No\r\n"); } #endif prbaud(speed) char speed; { switch (speed) { /* JHU UNIX speed flag cases */ #ifdef JHU case B0050 : printf("50"); break; case B0075 : printf("75"); break; case B0110 : printf("110"); break; case B0134 : printf("134.5"); break; case B0150 : printf("150"); break; case B0200 : printf("200"); break; case B0300 : printf("300"); break; case B0600 : printf("600"); break; case B1200 : printf("1200"); break; case B1800 : printf("1800"); break; case B2400 : printf("2400"); break; case B4800 : printf("4800"); break; case B9600 : printf("9600"); break; case EXT_A : printf("External A"); break; case EXT_B : printf("External B"); break; #endif /* Version 7 UNIX speed flag cases */ #ifdef VER7 case B50 : printf("50"); break; case B75 : printf("75"); break; case B110 : printf("110"); break; case B134 : printf("134.5"); break; case B150 : printf("150"); break; case B200 : printf("200"); break; case B300 : printf("300"); break; case B600 : printf("600"); break; case B1200 : printf("1200"); break; case B1800 : printf("1800"); break; case B2400 : printf("2400"); break; case B4800 : printf("4800"); break; case B9600 : printf("9600"); break; case EXTA : printf("External A"); break; case EXTB : printf("External B"); break; #endif default : printf("Error"); break; } printf(" Baud\r\n"); } (a "remote" line) than the one you are currently using for your interactive session. See the following example. NOTE that UMODEM requires that the remote line be set to EIGHT_BIT operation. This is done automatically when UMODEM is used on the local line, but must be done manually when using UMODEM on a remote line. 3 Example UNIX-VMS file transfer initiated from the VMS system using VAXNET. $ set terminal/eight_bit remote ! Needed for UMODEM, but $ vaxnet remote ! not VAXNET % umodem -rt vms.file ! Start UMODEM on the ... ! remote UNIX system UMODEM: Ready to RECEIVE File ^/ Q ! Get out of VAXNET $ define/user tt remote ! Temporarily redefine ! logical name TT $ umodem -st vms.fil ! Sends file from the ... ! VMS system UMODEM: Ready to SEND File $ vaxnet remote ! Back to remote terminal % ! operation. Remember ! to log off! 2 Problems/Questions Contact Wally Reiher: username REIHER, MB9-19, 495-1768. He has a version of MODEM configured for the Heath/Zenith-89 microcomputer system which is in the public domain and free for the asking. /* * VMODEM * VMS support for UMODEM program * * Defined herein are some utility routines to make the UNIX * program UMODEM run under VAX/VMS C (Compiler newer than V 1.00) * * ASSIGN_CHANNEL Calls the VMS System Service $ASSIGN * to assign a channel to a device. * The routine currently has the device * "TT" hardwired into it. * GTTY Gets terminal characteristics, almost * like the UNIX GTTY system call. * FILESTAT Provide FILE STATistics under VMS: * calls RMS to find out the length of * the file specified in the argument. * RAW_READ Reads characters from the terminal * without any echoing or interpretation * and with an optional timeout period. * RAW_WRITE Writes a character to the terminal * without any interpretation. * STTY Sets terminal characteristics, almost * like the UNIX STTY system call. * * Some of the ideas used here were obtained from code written * by Max Benson and Robert Bruccoleri. * * Walter Reiher * Harvard University * Department of Chemistry * 12 Oxford Street * Cambridge, MA 02138 * March 11, 1983 */ #include descrip #include iodef #include rms #include ssdef #include stdio #include "vmodem.h" #define TRUE 1 #define FALSE 0 static char tt_name[] = "TT"; static short tt_chan = -1; /* Terminal channel number */ struct tt_io_iosb /* Terminal I/O IOSB */ { short status; short byte_count; short terminator; short terminator_size; }; /* * Terminator mask for PASSALL reads. * Permits reads of all possible 8-bit characters. */ int t_mask[32] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct terminator_mask { short size ; short unused ; int *mask ; } termin_mask = { 32, 0, t_mask }; /* */ assign_channel() { /* * ASSIGN a channel to the logical name TT, which is usually * the terminal. */ int status; $DESCRIPTOR(tt_descriptor, tt_name); if (tt_chan == -1) status = sys$assign(&tt_descriptor, &tt_chan, 0, 0); else status = SS$_NORMAL; if (status != SS$_NORMAL || tt_chan == -1) error("ASSIGN_CHANNEL: error in SYS$ASSIGN\n", FALSE); return; } gtty(tt_characteristics) struct tt_info *tt_characteristics; { /* * Gets terminal information from VMS. */ int status; if (tt_chan == -1) assign_channel(); status = sys$qiow(0, tt_chan, IO$_SENSEMODE, &(tt_characteristics->dev_modes), NULL, 0, &(tt_characteristics->dev_characteristics), 12, 0, 0, 0, 0); if (status != SS$_NORMAL || tt_characteristics->dev_modes.status != SS$_NORMAL) error("GTTY: sense mode QIO error return.\n", FALSE); return(status); } /* * FILESTAT * Provide FILE STATistics under VMS * * Calls RMS (ugh!) to find out something about the file whose * name is pointed to in the argument FILENAME. * Returns the number of bytes in the file, returns -1 on error. */ long filestat(name) char *name; { short lastbyte; long blocks, bytes; int status; struct FAB fab; struct XABFHC xabfhc; fab = cc$rms_fab; xabfhc = cc$rms_xabfhc; fab.fab$l_xab = &xabfhc; fab.fab$l_fna = name; fab.fab$b_fns = strlen(name); status = sys$open(&fab); if (status != RMS$_NORMAL && status != RMS$_KFF) { if (status == RMS$_FNF) printf("FILESTAT: File %s not found.\n", name); else { printf("FILESTAT: Error in $OPEN of "); printf("file %s, status = 0x%X\n", name, status); } return(-1); } /* * Pull out the end-of-file block and the first free byte in the * end-of-file block from the XAB. */ blocks = fab.fab$l_xab->xab$l_ebk - 1; lastbyte = fab.fab$l_xab->xab$w_ffb - 1; bytes = blocks * 512 + lastbyte; status = sys$close(&fab); if (status != RMS$_NORMAL) { printf("FILESTAT: Error in $CLOSE of "); printf("file %s, status = 0x%X\n", name, status); return(-1); } return(bytes); } int raw_read(nchar, charbuf, seconds) char *charbuf; int nchar; unsigned seconds; { /* * Read NCHAR characters from the terminal without echoing or * interpretation. * If the argument SECONDS is non-zero, use that as the * timeout period in seconds for the read. * * NOTE THAT THIS FUNCTION RETURNS AN INT, NOT A CHAR! * That is because of the possibility of a SS$_TIMEOUT return. */ short function; int status; struct tt_io_iosb iosb; if (tt_chan == -1) assign_channel(); function = IO$_READVBLK | IO$M_NOECHO | IO$M_NOFILTR; if (seconds) status = sys$qiow(0, tt_chan, function | IO$M_TIMED, &iosb, NULL, 0, charbuf, nchar, seconds, &termin_mask, NULL, 0); else status = sys$qiow(0, tt_chan, function, &iosb, NULL, 0, charbuf, nchar, 0, &termin_mask, NULL, 0); if (status == SS$_TIMEOUT || iosb.status == SS$_TIMEOUT) return(SS$_TIMEOUT); else if (status != SS$_NORMAL || iosb.status != SS$_NORMAL) error("RAW_READ: read QIO error return.\n", TRUE); return((int)*charbuf); } raw_write(c) char c; { /* * Writes a character to the terminal without echoing or * interpretation. */ int status; struct tt_io_iosb iosb; if (tt_chan == -1) assign_channel(); status = sys$qiow(0, tt_chan, IO$_WRITEVBLK | IO$M_CANCTRLO | IO$M_NOFORMAT, &iosb, NULL, 0, &c, 1, 0, 0, 0, 0); if (status != SS$_NORMAL || iosb.status != SS$_NORMAL) error("RAW_WRITE: write QIO error return.\n", TRUE); return; } stty(tt_characteristics) struct tt_info *tt_characteristics; { /* * Sets terminal information from VMS. */ short *f_ptr, *p_ptr, *s_ptr; int status; struct tt_mode_iosb iosb; if (tt_chan == -1) vuCMODEM.Cg  !"#$%&'()*+,-./0123456789:;<=>?@ABoCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef{>-(#]doo20EG.:o|D-TGTpl `RF6ua e!Nlt(|*ky b Ծa( RSRl|.Wwv%{` q2#G&Pl` Jk)Y#pO,{"d7g|mLKC .K?2{_uLO?';%J&E$_,%1؃{]h_~ ȥM켅倅/ oٛ7J/:[%m=`/J4L`m˰(`[%8UwJ\e`K 4}A50xk[ a)A]h]p7cJY6 ݳJLgкH#{*,|,~-#PKy ^)QrA |2G&ui( %a =x X2cJӖS dk`y=[dK l H i(ri;o` ,A'ϓy"\`4Lg m7ܟ%do0)#к`$y[8vFLKZ g1!E [iJ,b ё{4x>@d}AuD*!Qpmg1)#к_8aJ %.Cd2>XcUSqpGJkGprɥ;%J2D02:{J䭥Ĩ}A5-%Neǔ-A {0~YiOY{*%b˶ #g J`ʡKy{Dɼ',Edo=aedL g=].vwߡ$ 4T7 .b0ȄevHmg(i g(1%j B"y}K@Hb-P$l L k(cH8uѷ}`CBtegry&G&!oPSu*;(X}xD_ެ0aKޗm)!L[{$_%,g[cqKF Ծp٥ۈO!@@8@IQPLM@G1%E`0Ȅ(#ER_'>{Bzٵ%lLD}O"}TwJVJ>|SDSL G˗9Fm(:vunN=g97 {<잭8^E&c0}-k l L/T%w-+)e4GT`gk_PTΔh1P"SѰd pDpDk2le3%h(܆ gJW)#<Sok_PݰdSo_+ѷ)#ם5pD߾r ŔpTLJ16a/_vJ:"6#٢WJ+j#|_}$[Tϕs%J>W3kg0]0!_՘8{_RrD١9\' /p:L.W8ӫ".#^ P(:lDkC\ gl2T^lqD }^ f+%H0ĥ\wz5!./0[)9Wė|_Ɨ|`*!-0]0=j_PJIꃁ/>tJΔ޵[.y8UDNjKó|/>T^͐ m"-s%JR֫b)p{8ήe2ǘ)ц4j͗SrDIulTT3%Y4 L%::N=?%Ӥ*)yrA?O?SS%ZY^ 0 6UD똂m4 LUDi(fSPx)yJpYN!`ʡ:%ZO 'B$7Jͅl({Do:%Zln6of 5U j[flCMUD멡SSxFփqs# 6UD똂ml1Su9>܆NSCID ?()DqF=CSuJ O:%ʖ(z0rn6v $_op6_.N>WrDjD>o[ri;o#8i*%gJHmYo8vJtLO՟SDYfr;{gfﰩ:%w-5͵3S?2邛?Umt3y/pLͯ9^3SmTJ,fsa/3'o?la=fxŵ3S_uJ -1H2"`}D\;9rrS)b=Ɲ2kg"W™,fsaKpֱ -n&mNֆ4x7s%:Rb[֣N>]KMv L˼zyy™]nNPrɴ[DJl˺n\Lb=ƝϕhMm$)ZGJlNJZOS3ѾS 3%Zk_PݬwSP#j^p/~`Ru`zuD+w-5͵3S?j ba*|a|\ fz>yR^p#{1f+%&0S=phz>y™,fsao<&ݼd ;{twwM)b=Ɲ}DSIֆ4ǝs%JNPrɴ[DJl˺R`0i;%2"%e)9SS 3-fidNVѾӫ`>G.= bJ f+%Jt TG#>0^?tT_pD!9ڙȩhK}Aus^uJ%׾ؖu)ڗ|_#%e]uJ^IJ;%ZgoOzyymF|2-sw>_ߏ*)Zk_PPuJ.YnfiCɩ %>h='zY^h}Dk_} eOI,SP#j(ڙȩ t~_uJvv&rG/^elNF™l `l.Gd$j[*&XT!.z<ލ;%Z+њHpv&rGqDkmKc{)њHpv&rGa{>h,fsa&_2E 'TfLhMm$)ZY3~8A{13mڙȩ"0S=p:%ZMuΔW/Cds2v&r;%MsLԏ b桪Fa{>ۯSCID߾rv&rG/^elNFRoyH`;%Zs%Z+J`l.d"Rbo:L06UDXݸSrDIcCM 5uJΔ8˹laCMUDd?mlikhwLֆ4x7s%z]K#םmKc{)9Wd5CvmiqGe>!G8u _(ɮyK˕ٴ̝gɗ;%gJE)(rDI#\eo™g2~Qhr]Jzj(hֻkaJz5C}`aU1@ٵJz5MQ"`RiZj޽ߏlZׯ1!tZfH޲-J6ĥH)9WDIOmCdג 5UJR fٵdCM3%z0rn6B{J blCMUDܜ&sҌmn\La 7s%bSrDj3L00Xvև[LӅ!=" c_q >{0%ɜ46T)I}0PSLv)--"%N1[DJ|=tJt, [i/E$[>Nr椱j4ZǻqDkC\xwJtĶGNd3<(ٛ*)ڗ|_&-RL lǰtS:6CX|lDHSi4GJ9y&Rb[xɿ ?o۾hr)q*HmY~ Or* uOSLL(ZGJlN:{ӤadNe~J>ݻO}J}r3Y^ڵt?-s5ݸ™}u0rn6Op]T}b=Ɲ}\:-Rh|)\FMĩ4f4ؖu3%Z8˹\1%r@QmFJJcN:-Rh|)\FMĩ4f4\Δh}/n&UDk1k .P{C>X8Fh b1[)ZG2'h qi,v;%Z+њH8S .6am7vSuJֆ4x7h}D+9Wd5SNqLzLeo\d,x1"%N fFDJ lYOɀle2T.Qh]H C#*J07XNnP" %|Zws HQ&_27DF"=H"{22Qf1.q|7%g=?`W2-ediO=Ey_ B{ #Rbo*%(9MGđRcNeނ]M9S,]M3%YFĩ4fKx;%:`Ni^dDxGd7x=Njv&rmnDk xkg"FXNnNf8 =ElDkkg"~4}pDk)q* tC)Z4Ҙ׆B1]pPUчpD߾ZIJ;%UIȜL˼~=|ûwүGΔۯ.YnfiB1]pPUP SLs|w\uJeOI,kSo_+ѷ\nfSzPLW5rsLԏFݼR6ĥ\kg"~4ZNn*)Zܼ hT8So_ Y^-`9IԶTlN}eKcwNF™}elNFMD߾J޲%uJJ>W5rsLԏFz|^)ZY^cj%bM:%J~"ѾSiZj b6_ֻJֺS/q)њ]M?;%\^fpOiKCꝥ;VJ/rrSuT7Mk_P,'7UDXݸSrDȚƆ*%3jꔜ)уqs1Wٵ4||)ц4ǝs%J bঠ"X)qQPrR씜).qvhɼ Ǖ qi,ó|RuJiZB]AEJGW8Sh|2qDkmKcM擪Shͳn/UW3>ٛDKlDkmKc1:w]F.y8\&+%ZkC\ gl2T7h&_2F? ݻɗܡRvCsO^pu\>W4d>:%\6ĥ_ֻNɹ%a 7 G܆Nəp|H'M7HdNS}/n%׾YNnΗ|_f9:%b=Ɲs%JR#IS)9S]nٵTL9>RsZh=g97 {aFG*6[mh=ϮSϕ+Q!{ ȴa:%IS)9S]nٵTL9ekUDZv-O\uJͅo#R#-6TuJgzr)JΕ 9Yj*%gJiZB.y8\&+%Z;;4gꔜ+Ql|AX%=CS)9S,fsa/x:"T.3%z0rn6/ǡ,qSl=g97 {|GٵdCM7UDY^_q<&[cv-PM)уqs||oǥM)уqsSrD]h_~Jə CH A 1xf+%E uB/~@ )Ѿ9\'$ӫ!X:a 0BJ#|qulq ^ J%r>o'W^p|][#P$lDp9̷_jH ǵ/xw-&<j㸅qlDp9̷Ruz5`- -KVJf+%J8gI)9S qi,~tcx#q Mhɾ𷿡I?ه 4O[uJΕ(=*Rrd5 #}G(2:{j>J %P8C/lDͅ=rpwwwa7UDӉꔜ+Q28<dʢ0R,cNəF2 {DbpO L _<f+%JΕ<%[oGa{>h,fsa&_2E vSYAMBOOT.Ca  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHoIJKLMNOPQRSTUVWXYZ[\]^_`g{rL),R6xl|>,:jCCF#5VM/lQBm<^&o`}=d)Ԑ{*ʹ"f|Z:@Q7(XQ0>"sCԢEx4D7 ,ZuhInLWT0ޅUSH῿fE'UPzhʂJF֒J8Q-,lN[K % K N+R,C^`#|ZAG0@rٹ1H:4PkXNt@:\ *c`# =S R#Զa8BBA\'vM!xQ*XwB L> WCKB GMcWƒ*.1BQ7@pRU0U.s#,l B+mMh.Ѩ5hCP*)6t<ϧpRiWPDm l1sx9_L&=M!+ R#,lUxDxqO߀Gy S%X؜W@86t͡ phs|W1Wy9xDT!8th1hR}(ta$xh Zf Kݻw |ka,Hy+#Bm z ,0jTeQwFm|Y`pO/ LCX~|Y`a4G/?t- B?OzHO3Fm!_ ,0ja:^_A\Kyӷ[q |Y`a:9\C_AN6Ky/mUxDP0}{6aLeQ÷=b|Y`f \H`myQ >Q ]F&ۡs3?[)87^,?mCq@p.닇/+*L+t>gpR6 >38䕫JM #3Pv3f[R6.6,GQ7 7y)Xm=BNO7W7%zp >ܔ勐,JF֒JY)Xisknab2APWFL[sk6Y)XTAHa`)uDP?bhmu2hsDP?b#I٭GS@Ǩ\L2)h : =1 Eʾ\mk[`z4EV w*`m-NRGHڴi>;U*'ڴi|?CV xBf5/ ֶ:\m](@`suUR`yR!Kڴi>;O*d)X\i|? l w*cTJPd`YXG >Y)xW=z6m{18dkx9 "#,U.Ȓ_" _ҍV=|5Bm  J[B$ٺ J/uN[ 8[`{g46)M1@u&X ,[FŴ5VС~Jһ`b|L1+˖Q1mCeС~Dxnf#jJRt L1h4e#XʰRV %+X Eh0OO,.`|4R F@>Û@ 8:H&Ԙ vU 3R`NG\N4N9[`@2x4ɶh Pcuh2KIr20&Rn] M@pU R* vKismuh WJRztD݉;F%:XqɣS& ?;~Zg`)uLr9Q%N~u w>1`GңS&_*K)ڎy}p?Kx[ :6W.իu)X^?GKɵ,8~t?k.!-iҞkP,*f m\(6USV _ 𪃴WR~,uL)M+t>_bP4`}cuLBr2)36/-ibL+t>aNd .? %x,[FŴYS -,cYY)X]RbtLGrU'}&XJIr2a:`):#M^a;:tt8`G~nI֬H06 , UNdT R6aG~ ^A7KYɱ,,`):#M^|g-ibܚ F+XlfD|V &xEݺ,ILX.T:ux>y3RR6WX*+KtR,m-N0+m-N0+m-N0+KBh4w $j*Pc)xGlI֬£6ǠOf&Ԙ)M2MF`+X꘢# *P teFQ#XʖQ1mn4'0(i3jJR Gɨ,wQ vЏ`Ir20* & rRN{t>|)xG6mau Pd@6~J Bz@=:_;Xg#XJ!iӦ `?VW`)%ɀ6mҲ>}LPd'})XJ!iӦ `?VW`)%ɀ6m F+?mCׯ{]U `)ix}w0L~&T9ЦMR, UN|Зw%2;նi:fնi:fնi:f`Ir20&R`Xt2;iu2&U: nyJRFXH7]1+Kْ6*ͭ5=z,63PcV rup]mNh)#XTAHڴi>;U&XJm4!+ |h -"3JF֒Jl\-֒mAikB,luXX C |@U%'i`V:4c!XDT%FKh6b2Ǔ1 ,XQe]\)xG0@r'x;psO{7H"o 9:XC߾Ar]>Xw >ۃ=L0~1w&_>,:jCCF#5VM/lQBm<^&o`}=üT(   ï 0IÂQ4NúF$t0I0I `GGGGGX;> ((ABDEKLQRSTVX <<MEX HLPINI.MEXSRTELMABDEKLQRSTVXABDEKLQRSTVX0I++0I un-installed ++ ͯ 0I ++ Dialing overlay ͵ ,R2 y7! J~#fo> IIOH0IVIVV4V/PVXJ5 5W<y ʫG ʂQ ʔIc=Y=P{H͹G H{H<ʪW<ʫGùG!]͋JDM xt!9"\1\mSk*U G)!2Y:6X* "w 1\͋S0I MEX (Modem Executive) V1.14 *4X|-0IClone Level H͞G0I(for aid, type HELP or "?") Copyright (C) 1984, 1985 by NightOwl Software, Inc. }wP!F:Z#ʩ~ ʔx29Z{J:4 >2W2W!p " Z!Ä:W0I [TERM file open] 2W͏G1\!HSP2X ͪW!W~65:W1,R0I=READ aborted 29Z!W:9 /V͈I=!AHͿH>>HHX͂QX.  ʅ: o͏G͖ڒ͖ґ:W:; :X*½͌V:W2W* ZI" Z:W2W4V!y s":W2W͘J.í.͖0I=++ Unknown Command ++ $0I=++ Argument error ++ $=0I=++ Syntax Error +++ AI2W2W,R0I =READ parameter error: line #*:XH4V¨" Z7G~#ͶH xʨ~" Z!W~w~#foѷxÚ ȷ*R ͋J"YͷW͋J"YG:T 怰2T ɿAL .BEL*BY6JCOLfCA^CAL^CLLCPSJCLONŇDEU!DIA[DIDSL>EREXISJGLOBA-HELI KEـ"KEYӀ"LOA"LO{PHONPREFI4REAGREΈSAV"#SENDOU\SEG!SLEESSEWSTA$SUFFI=SYSTESJTER>TERM>TYPAWR!OFNOYEPOK|.PRINg.WAIu.͞VG! ~6H ͒ͪWI5w: ʯ ͞*W >2_X* Z"gX:W2iX!"dX2fX=27X4V'4Vғ:fX4,R#n͟¨͌V͇ͥ͹> J>*J~27X>27X!jX~Vͥ͟!fX~6t0IDialing: :7Xn>b|0I: Try #*dXH H>bo&<)~#foJ0I Connected @2X:O0I :_X: -?:: -?O*dX+|-?0IAny key to enter terminal mode...ͪW-?H t ¯-?0IBUSY Â0INO ANSWER Â0IABORTED ,R0IMODEM ERROR 0INO RING 0INO DIALTONE ͏0I Enter choice or phone number (ret key quits): X͂Q:X^:fX4͌VIVډͪV*dX^P*dX#"dX*gX" Z:iX2WÂ> J0IALDS #: 2X4V:Wʏ͇4V͹!< ~6w0I not found7vV͹J4VD͇|!*:7Xw! !jX{Jͭ:jX#V-V!ͼ$!jX {J͇|-F>27X4V/P427X*bX:8 O͚W ˜͞GxžG:W70I[phone library empty] ~ A!< :W x0I Phone Number Library x͞G0I| ͟I0I =͟I:W5:< > H~O#+ɯ29X:8 O*bX!+ k sS:9XF+Nwy#xͪIV =?̓V Ž!jX6 #°!jX*bX:8 O >+J 7~͟#~# Hb?# 0I =++ Phone library full ++ 7ɯ!>28X:Wʄ0I=--> Illegal STMT in line *:XH͞GH,R7YVY œ!({JND 0I READ active >2W!T ~w!":X8Z*]X^PZN29Z" Z:W2W>2>X4V?+!>X~4!8X454< Op#s#r:8X7 MEX* Z IV{B͌V}#͌VMB ?!>X?_!?X:+ *w z!\"w 2, " 226X\V ::*4X#"4X>26X*XiUͷW®DM!\5<"4X);ͪV0IZZzzz...|H+ ͒ͪW: 2XP2YX!\͡JͿKKL:Y_PX!\͡JͿK:] 4P< 0I Erasing: >K:XVn0I Ok? ͳHYn0I NOT v͞GP0IErased 0I Available commands: !I0I Single char commands: T,E,L,R,S Secondary options: A,B,D,E,K,L,Q,R,S,T,V,X :/ c:W̺4V*X#~#foڔ4V?U͌V4V40I Help is available for: ~͞G*X###͖Ҕ0I No help available0I for "~ ##HÇ*X"X>!Js#r!P2Xr͑*XGG!b  {JND *X#0I Help file format error! 7F:o # >2WP*XPP!7>2XX!\"X͡JͿK:X` *XP%H ͪW̹G : Kr¥Ñ:XA:X*XP0I ++ Done ++ 0I=++ Illegal file name ++ 7 7͞GB:W0I[ANY KEY]͹G0I : O:X *X###I* Z++!Y͡J!X~#\!Y[~!YN!Y[~<\w~#~\w~P< YP pw!XpU: <2YL5! 45ʐ*X !X *X : 0I =** Reply: ** G 4: O<oH͌ }ÂN # 7?q ~4G:( x? :_  2WHC U y=7?͌HI  : G7H> 7ͪW705 5q 0I =+++ SENDOUT aborted +++ 70I =++ SEND failed ++ 7!XpU~# ~}:- * N#!B[pUF{J0I=++ File: *XI0I not found ++ 74! PP: Xw.":Wʞ!0I Delete APPEND file (y/n) ?ͩH͞GYʞ!0INOT deleted ;DErasing: YP2W2W2W2W.":W!0IFile empty; X!;DClosing: :F:W!O"ͳ!YP<7?0I++ TERM file close error ++ 7:W0I=++ No File Open ++ <*X"Xn":WG*X{J"Xͳ!7ͶHF#w"7: 2X4VҔ":Wʺ#̓V2XG͑@·"0IIllegal key name7vV*X|".M*X#pU6x:Xv#ͦ#W#*X#v#͒#N+:Xwi#$U>2W>2X͘$#*`XG##2W);*$U!D$>2W=2X*`XG>H$:X;<);:X*Xw#N +"X*X}o|g"X:Xͦ#T] *X "X"X͠#͠#G͠#–#É#~#*X457#N+ ë#*X~#0I ~#H>=H#͞G##F##~##>"H^$ H>^H@HHH!$9$\ND !$9$ ::\V!e`$0IUnknown file type7u$ D$~#fo"`XPHNKEY"PHNKEY#!X" Z2W6Dұ$);7ʬ$ ʤ$ w#:W<2W¤$* "W" !W~6$P*W|" !"W: 2X!G4VI''͖5%!'>^#V#N#F#͖1%=%44VI% 4mVͲ&^#V#F#N#fig%454'f%/n%/!|%x%!%AION OFFڍ% 4Ͳ&~#foښ%w~H>HH H#I#%͞VG!~xͲ&^#V#F%##o&xSPH͟I:W%*X"X0IBatch filename buffer: :$ !USPH0I names!&"&:XW!XH&*X*) !XH&͞G*&͟I"&0I buffer: Size=N#F#bkePH>G0IUsed: ~#foePH^P>$G0IFree: HCAPKEY͟I H0I -- Misc: --!'I&!'I'!(I'!(I͞G0I -- Switches --0I -- Characters --0I -- Values --0ISet to read-onlyU'e'u'&!);%>Â''!,%>Â''!,% >!y”'͞GÙ'>)G'7͚W«'J „'';%(%(%&BUFFE%BUFFER%TER@SWITCU'CHAe'VAu'BAKFILm)BELO)CAPTURŧ+CHECKSUͩ)CI)CRË)DEBUǙ*DECIMAk+ERRI!*EXCLUDŷ*EXTEN+FILTE]*HEM+INITFIL*L1)LIS{*PRECH+QUEUʼn+RU)SILEN*SODELA+SPLI/+TA,WTECH?*XLIN*XO)CANCE:,ESp,SEU,TRIGGE,ALERr-CLOC0-REPLً,RETR,RTIMQ-PAGŴ-SEARCȓ-WCHA,WECHϬ,WLIN-RUB: bs-to-rub conversn..LF: T-file linefd apnd...BELL: console bell....... BAK: backup file creationCRC error check mode.....CHECKSUM:error check modeCIS: Compuserve protocol.+ , XON: T-file xon/xoff testXLINE: T-file EOL XON wt.ID: MEX ID in error msgs.. WTECHO: wait-for-echo....( FILTER: contrl char trap.LIST: printer device.....DEBUG: T-modem hex disply2 EXCLUDE (ignore SYS fils)3 INITFILE (startup file)..4 SILENT: READ cmd silencer9 EXTEND: READ cmd extender; SPLIT: phonelib split....< HEX: input radix......... DECIMAL: input radix..... QUEUE: T-mode queued I/O.Q CAPTURE: save-in-memory..WWPRECHO: echo modem to lstWSODELAY: SENDOUT time dly_ TAB: console TAB expandera TRIGGER char for SENDOUT. CANCEL char for SENDOUT.. SEP (cmd line separator). ESC (T-mode escape char). REPLY wait-time, SENDOUT.  secWECHO SENDOUT echo-wait..  secRETRY: SENDOUT retry-cnt.  WCHAR: T-trn chr wt delay msWLINE: T-trn lin wt delay d msCLOCK: speed of CPU...... RTIME: rcv file wait timr5 ; secALERT bell count.........:  SEARCH mode..............=  PAGE: lines per screen...  4V.?-.\V!> \c/0IGlobals: ! >  ~H#.! >  {J4V7.].}<4|4%"0 0IAlternate D/U: *0 |AH}H>:H\V*[4VڞG:WG͟Ig.ͩH&VͪV&V!B[4Vڣ.͞Vw# Œ.!B[{J͍/:WCbͿK2W2W:WR!g0.S!/.>A2 ! 6BT>E.2W>L2W>! ]ͶH2W c/: /2 :WDEMLTCS U2W͍/: /0I=Batch-send ready ;1t>2Yb3͞G2 H/>B2 ><æ=:] ʤ:: 2 !}2 "D3+"F3:;$Jx2=͙9r1P;J0>2 ͙9i8͇8:W<ĸ88(0:ͩ10> ><8`0=L0è9);æ=2X> U:2W: ›00I=Batch-receive ready t: ¶02Y)40>B2 æ=:] ʤ:02 HV3G͞G̀G!"D3 :>2X:$JM3: 16IReady to receive :W16ICRC>C+16IChecksum>6I mode Waiting...<5]12;J:l1E1<Jl1";æ=><: * |…1}ڣ1:L3G*F3}* ?Py!L3>K2 >K2 : ¶1* " ɯ2Yx5*X"Y5!\ Z͡JYN;2:3 1:f1*Y :X;2![~)!#2#~w+F5#2=!ww {J"Yx2\!Y41!Y51*X"Y: R2<>2 0I Multiple errors... :Wʋ20I Aborting 0IType Q to quit, R to retry: ͹G͞GͶHRQI2!\: ªI*D322* 733*D33: : 3!C3~60I >-HH>2C3* #*3: AIH Received # Sending # ͏<7 !]~<͋<33#3>u<0I ++ ERROR sending name ++ xP=l13>2~Y!]͏<>2}Y͏<2}Yґ46IFilename timeout 44ʭ4l1w#}4^42~YyQ<͋<4ʶ4 ʶ4 ʶ4!\G66I++ 2~Y4T42~Y2~Y͙9><͏<4è9*NQ:Q '505i5'5*HK:Q '57?>!WW7:Q >05i5>!W'W*W| 5q5!Y6!XN# 6 A#5~ 5#5~ ʘ5"{Y+#5~ ¨5:Y<2Y#5~ ʺ5è56 *{YZ~ 5# 55> #~ 5"{Y>2 >2Y2}Y͏W6:W>W6>C2W͋< 7W͋< 7/ʶ7: =60I ++ Bad sector # in Header :6z2 >2 !"W*J3*H3͋< 7w#z72 :W8Q͋< 7:8: G: @8<¨9͏< 7 8lP7: =60I ++ CRC error :66:6l15R8: Ҩ9: * H0I ++ 2: >w8><: <: /<>2 !"W*H3: ¤8~#<z¤82 *W|<}<>2Y2}Y͏<͏<Ҹ9>B2 2W:WRo60I =++ File Cancelled ++ =: : : : > :>*D3J"D3* #" }\bk #~?ʘ: 6: ):y ʞ::W‘:!9Z:Z‘:: ʑ:P0IFile exists. Erase? (Y/N): ͩHY7͞GÑ:\P 7ͪ:7ͪ:0I++ Null filename ++ KP7?0I++ ERROR: Directory Full ++7#P*}" !"} ; OKP7? H7);$J\P<7?0I ++ Close Error ++ 7*H3: _;!s;_;!W5;* yJ" : 7*XPP;! :X’;2W*X" Ps;>2 yñ;: ;*H3!;;* yJ" !W4~!X7?!WNp*X!\)<*WDM!"W*X!Yx5<" PPY<>J x5<0I ++ DISK full: saving partial file ++ ,;7:5 G*] <Ҡ<͙97ʫ<.·0IAwaiting ready signal ͞G͙9͋<ʨ9C!=w=!=r=P=è9: F#: AI6I requested x2WCRCChecksum: =: =͞G!\ͪI0I Transferred !\GaSq5͍/:Y/Û0>K2 ͙9R>: 6J: L>q2W2W: >/2 2 ! ~6Q:W:WF>: F>: >2W͞G-?ͧ>0I [Transfer Completed]  ʑ> ʑ> ʑ> ږ>Җ>HH>(HH>)H0I =Disconnecting... eɯ2 ͘J>>2X! ~6B4:] :W>OE-?!*X"X![Y {Jկ2W: #:͹C!"W>2W:` 2W:X!9"X"E:WOE?ͿW> \Fh?x?I?Ͷ?͕W*XͫG͹GGQ@?5L5G:2 š?:ʒ?xGI@ @*Xp#"XxH H!X4~Զ?:XG>4G??~# ?>.~?H?͞G!X"X2Ẍ́J!W:WrF>  !W:?:@x:&@x:@&@ rF:Ẅ́J>  &@  :+ \`@:`@!X~6: u@7?67ɸ͑@G7xͦ#?#>  7xͶHGEZ??@)B~rA#~wA##~}A#~A#~6B#~A@*X~0I Keystrings: ͺ#0I Terminal Control Sequences: : I0I + E: Exit terminal mode ?: Print help msg )BAxjA~^#V+ I#XÀͧ>Z?:!W~/w͞G͵EÖA!W45£Ä́E2WOEɹAAAABBSend BREAK to remoteDisconnect modemToggle printer on/offMemory-save onTransmit fileMemory-save off@NPSTU: !"B! !\G!lG0I File name? (RET quits): X͂Q:XBX!\͡JPB BB!HC~CͪW7#B C:CH:ēC 5CH4 :¢C:W NC>C:QC: O:WaC YC!:ʀC!:WʀC:WʀC!͋J:ēC{…C5L5̢C5°CL5ͪW¢CBP/D: C͋DCNDC;DCreating: P:;DExtending: >2W#P!!N#F p+q!PG:FDɯ! w! wAI!YͪI0I...+~#<‹DeD6+6#:= xD=~D=ʖD~D/QÁD*0 r+s#/DP7?xD~D:XD:W¸D3:;D:WL^_<2X!w:XD:p;E:W>D2_<2X!:W~E:XB~E7E?0I =[Term: : I0I + "?" for help] 0I ASCII capture :W!|EpE!tEAION :OFF 0I --> No ÞE0I --> 0ITerm-File Active 0IPrinter buffer :WE0ION 0IOFF :Wx:F> E> HF:XͰFyFFF!WWF FO":Q 6F*W|6Fx?!FͭF>2W*Xp#"X!W~<wZF*W#"W:G!W'WOGxHE͠FͰF05\F*WͷW*W}|ҁF͠FͭF:W!WxW>!>q54!?͋JDM5FL5 xF7!?͋JDM'5F> xF7>:H6# 6 #G6#G PPP#H> H> H* G:XG: 2X* G* G* G=!W HH> H>:W05 ̈HZH!WO DH:a > DH~HZH_HyTH: ZH* G vH sH54 464~vH H~~H!X~ʥH5¥H: w * GK> ͹GͶHH͹Ga{_)!o& H |H{I|H}HH I0HI0I: AI͞G ,I0ICTL-@HAI>2WAI~ʁI:WWI: }I~=lI lI:. ĈI|I~H }I }I #DI#2W* #F#͟I$HÔI~#HàI~==!AH+~#)!H>:H#I~ >.H~# HI͞G ~# HI##I H I͚WJ<$J$͔IH͞G$>2W: >è90I =++ Exit to system ++ :Y_1!P:W!h*Y G:*\~#{Jq5x4:T]=‘J* Z!\2X>J##" Z:W2WJx2X ~ J#Jx2X4VJ͌VͶH2XɅo$K!KxOy`K6# 6 #K6#K4VͪK#&K:5K̓VAHK@͌V:PK͌V:0OxGMKzK.ytK jKzK͢K*ʒK?‰K zKÛK>? ”K͢K›K̓VҫK~., :=ȷ!lZ{J2|2h=!A2SM2{M!]:e K 6?#K2MP!"X: 2YLPH͙GÃMG͙GxʈMHNÈM6 ͞GF#6#w#,N~TNͶHGͶHMN#7N#NN7#P2h:WžN>2W!\ Z N:\2,Z! Z\ NPN!,Z\ NP! Z\ NP<7N2W=Ɓo&-Z N] N2h2|~# xN0IFile open: * H: 4O0I (H0IH)0I records Send time: !O7P^#V* ?Pi`H0I mins, !O7P~SPͷW{O&H0I secs at :O͞G6ICTL-C cancels  0`@J0(   *Y!yg)ҒP>g>!o†Pr$s%# |P*WO*Y ~W$^"WP\YQQ"X/Q"X2X=PgoDQQ:XyQQ<Q=!<)!*XDQy)Q"X QQgo\Q] Qy!"#$ɯ2YG:9Z2Z2 ZQO*Z"]XXRQ6SQQ: Z!9 HßQXRQ6SQ"Z> y29Z#" Z*:X#":X2W2W:W RR8ZM!9Z~#"Z>9Z2 ZPYPP7:WYP!T ~w2W2W2W!Z8ZNkR"7?:Y/2Y>"ͿRR{7?:W>{RV`OҢRR:`>2WkRR}£R~#2W~#fo"   {J2}Y2~Y2W!   {J*"G"G"G"G"Gɯ2A[29Z>28Z!:Z"ŹW::ʬS2X:6XS*X" S:8 !+SPT"bXxS 6 #S*) "XT"X"X6* "X*6 "WT"W:/ 'T:o !SP'T6#"X!$#"X:% T"X6:& T"X6#6 !T"Y* iU" :$ T"Xz2X!" ~+"xV fV"ʫUͯU UYString too long.p/U^_V@4a4@_VRUNUTV/O4UVxGG Ux> > > > 0:?0A[?GJ4V44V:W7* Z~ 7?͌V4V:W7* Z~fVV4fVͶH͌V44V4>=GfV4͌VͶH!W~75* Z~#" ZͪV|}ͱV:  ʼV-VVV͌VIVV4IV͌VV_ySPV$V# ͶHVy W7AG?77.W#W7wɷ.W~N#F#^#V#SW~#FW~FW7+4#MW4###cW~#7+~w#bW5#~#fo#}wW|wW!s#r >2X2X!WW5NHSͪW7̹G7?ͫGĹG2Wɷ|g}o>2Wɯ2W[MEX] #CPM/MEX,CC,HC,PA,PL :+ x\\\ɯ2X7:X>\_I\!\~7͂`#\L6]_G_o_g!_w#]K_ѹ>/1]yJ>.͂`7AI?U>02Xi^!\G!D[" Z:A[==2WJ2[:C[2X:B[D]> !`AIaS̀G :L^:L^2X_^¦]!B[~#͞Dš]Ñ]:XBʳ]>͞D:X]3;L^.͂`R>7UL^> U!8`AIaS:;L^2 >2X>.͂`_.L^!B[D)^w#^x2A[^^x2A[^>!A^^);R>7ͫGĩH!O`AIP>͂`Û_>2 >.͂`2 :X<:x^>02X_ʗ^{^G6R8>/͂`{^C{2X!B[_2X>2 _ʸ^w#ì^2 K_^:XO:X^x2A[:X6R8>/͂`{^L^>.͂`{^!A[2X2 "X:X<: _>02X*XF#>ͬ_:X`ͬ_>2 ~` O_:X~O_G_G_O_>ͬ_~@ͬ_#'_2 >ͬ_{ n_>ͬ_{@ͬ_%_Ž_zv_ s_>ͬ_q_./ʢ_v_*XI?G,9R8 ___ʛ_____z__͂`k`k`_ʛ__`2X`_`zW{_z = Begin CIS Download = Begin CIS Upload = Aborting CIS transfer 5}`L5=C^= 5ʔ`C^È`4