stuart@gargoyle.UChicago.UUCP (Stuart A. Kurtz) (03/18/85)
Here's the listing of the bug fix program for MacModula-2's interpreters. The compiled (m-code) version is also being posted in BinHex4.0 form. (It's difficult but possible to compile on a 128K Mac.) See note in net.micro.mac. Stuart Kurtz ihnp4!gargoyle!stuart Dept. of Computer Science stuart@uchicago.csnet University of Chicago ------------------------------[cut here]------------------------------ (* This program patches a number of potential problems in MacModula-2... 1- Fixes a problem of the interpreter crashing at exit on some systems on a 128K Mac. 2- Fixes SystemEvent trap. 3- Fisex GetNamedResource trap. 4- Fixes local variable problem in NewProcess *) MODULE Patch; FROM InOut IMPORT ClearScreen, WriteString, ReadString, WriteLn, WriteCard, Read, WriteInt, Write; FROM ResourceManager IMPORT SizeResource, OpenResFile, GetResource, ChangedResource, CloseResFile, ResError; FROM Strings IMPORT StrModToMac; FROM MacSystemTypes IMPORT Str255, Handle; FROM MemoryManager IMPORT HNoPurge, HPurge; CONST Same = 11; (* Number of similiar patch bytes for both *) bigCnt = 5; (* Number of patch bytes for Modula-2 *) smallCnt = 6; (* Number of patch bytes for Modula 2 *) Max = Same + bigCnt + smallCnt; GrandSum = 8587; (* Total vertical checksum *) TYPE patchRec = RECORD where : CARDINAL; (* Byte location of byte to be * changed *) bad : CARDINAL; (* Original value *) good : CARDINAL; (* New value to replace original * value *) chksum: CARDINAL; END; buffer = POINTER TO ARRAY [0..32767] OF CHAR; bufhdl = POINTER TO buffer; VAR Data : ARRAY [1..Max] OF patchRec; RsrcHdl1, RsrcHdl2 : bufhdl; res1, res2 : INTEGER; ch : CHAR; PROCEDURE ChangeByte(Hdl : bufhdl; i : CARDINAL); VAR where : CARDINAL; BEGIN WITH Data[i] DO IF CHAR(bad) # Hdl^^[where] THEN (* Verify old byte is bad *) IF CHAR(good) = Hdl^^[where] THEN (* Byte must be already changed *) WriteString('Patch #'); WriteCard(i,0); WriteString(' has already been patched!'); WriteLn; ELSE WriteString('Patch #'); WriteCard(i,0); WriteString(' has wrong byte! File must be corrupt!'); WriteLn; Error; END; END; Hdl^^[where] := CHAR(good); (* Change byte in resource *) END; END ChangeByte; PROCEDURE OpenResourceFiles; VAR macstr : Str255; BEGIN StrModToMac(macstr,'Modula-2'); res1 := OpenResFile(macstr); (* Open resource fork of Modula-2 *) IF res1 = -1 THEN WriteString('Could not open resource: Modula-2'); WriteLn; Error; END; CheckError; RsrcHdl1 := GetResource('CODE',1); (* Get the machine code *) IF RsrcHdl1 = NIL THEN WriteString('Cannot read code resource for Modula-2'); WriteLn; Error; END; CheckError; HNoPurge(Handle(RsrcHdl1)); (* Lock our resource into memory *) StrModToMac(macstr,'Modula 2'); res2 := OpenResFile(macstr); (* Open resource fork of Modula 2 *) IF res2 = -1 THEN WriteString('Could not open resource: Modula 2'); WriteLn; Error; END; CheckError; RsrcHdl2 := GetResource('CODE',1); (* Get the machine code *) IF RsrcHdl2 = NIL THEN WriteString('Cannot read code resource for Modula 2'); WriteLn; Error; END; CheckError; HNoPurge(Handle(RsrcHdl2)); (* Lock our resource into memory *) END OpenResourceFiles; PROCEDURE FixBigInterp; VAR i : CARDINAL; BEGIN FOR i := 1 TO Same DO (* Change the similiar bytes *) ChangeByte(RsrcHdl1,i); END; FOR i := Same TO Same + bigCnt DO (* Change the unique bytes *) ChangeByte(RsrcHdl1,i); END; WriteString('Changing resource'); WriteLn; ChangedResource(Handle(RsrcHdl1)); (* Flag the resource as changed *) CheckError; HPurge(Handle(RsrcHdl1)); (* Let the resource be purged *) END FixBigInterp; PROCEDURE CheckError; VAR err: INTEGER; BEGIN err := ResError(); IF err # 0 THEN WriteString('error = '); WriteInt(err,0); WriteLn; Error; END; END CheckError; PROCEDURE FixSmallInterp; VAR i : CARDINAL; BEGIN FOR i := 1 TO Same DO (* Change the similiar bytes *) ChangeByte(RsrcHdl2,i); END; FOR i := Same + bigCnt + 1 TO Same + bigCnt + smallCnt DO ChangeByte(RsrcHdl2,i); END; WriteString('Changing resource'); WriteLn; ChangedResource(Handle(RsrcHdl2)); (* Flag the resource as changed *) CheckError; HPurge(Handle(RsrcHdl2)); (* Let the resource be purged *) END FixSmallInterp; PROCEDURE Error; VAR ch : CHAR; BEGIN WriteString('Hit any key to Halt...(Files will probably not be updated)'); Read(ch); HALT; END Error; PROCEDURE CheckData; (* Verify that the data has been entered correctly *) VAR i, calcSum : CARDINAL; BEGIN WriteString('Checking data...'); WriteLn; calcSum := 0; FOR i := 1 TO Max DO WITH Data[i] DO IF where + bad + good # chksum THEN WriteString('Inconsistant data in array element: '); WriteCard(i,0); WriteLn; WriteString('Check the data initialization section carefully!'); WriteLn; Error; END; (* Perform an XOR checksum *) calcSum := CARDINAL(BITSET(calcSum) / BITSET(chksum)); END; END; IF calcSum # GrandSum THEN WriteString('Total checksum ('); WriteCard(calcSum,0); WriteString(') does not equal correct amount('); WriteCard(GrandSum,0); WriteString(').'); WriteLn; Error; ELSE WriteString('Data is OK -- Patching can proceed.'); WriteLn; END; END CheckData; BEGIN ClearScreen; (* Data Initialization Section *) Data[1].where := 3358; Data[1].bad := 32; Data[1].good := 103; Data[1].chksum := 3493; Data[2].where := 3359; Data[2].bad := 68; Data[2].good := 26; Data[2].chksum := 3453; Data[3].where := 3361; Data[3].bad := 104; Data[3].good := 68; Data[3].chksum := 3533; Data[4].where := 3362; Data[4].bad := 0; Data[4].good := 32; Data[4].chksum := 3394; Data[5].where := 3363; Data[5].bad := 118; Data[5].good := 104; Data[5].chksum := 3585; Data[6].where := 3364; Data[6].bad := 50; Data[6].good := 0; Data[6].chksum := 3414; Data[7].where := 3365; Data[7].bad := 40; Data[7].good := 118; Data[7].chksum := 3523; Data[8].where := 3366; Data[8].bad := 0; Data[8].good := 50; Data[8].chksum := 3416; Data[9].where := 3367; Data[9].bad := 8; Data[9].good := 40; Data[9].chksum := 3415; Data[10].where := 3368; Data[10].bad := 66; Data[10].good := 0; Data[10].chksum := 3434; Data[11].where := 3369; Data[11].bad := 130; Data[11].good := 8; Data[11].chksum := 3507; Data[12].where := 8608; Data[12].bad := 32; Data[12].good := 34; Data[12].chksum := 8674; Data[13].where := 8613; Data[13].bad := 16; Data[13].good := 17; Data[13].chksum := 8646; Data[14].where := 10611; Data[14].bad := 194; Data[14].good := 178; Data[14].chksum := 10983; Data[15].where := 15881; Data[15].bad := 2; Data[15].good := 3; Data[15].chksum := 15886; Data[16].where := 4279; Data[16].bad := 38; Data[16].good := 40; Data[16].chksum := 4357; Data[17].where := 3370; Data[17].bad := 52; Data[17].good := 36; Data[17].chksum := 3458; Data[18].where := 4558; Data[18].bad := 34; Data[18].good := 50; Data[18].chksum := 4642; Data[19].where := 4602; Data[19].bad := 34; Data[19].good := 50; Data[19].chksum := 4686; Data[20].where := 4646; Data[20].bad := 34; Data[20].good := 50; Data[20].chksum := 4730; Data[21].where := 7426; Data[21].bad := 49; Data[21].good := 33; Data[21].chksum := 7508; Data[22].where := 10385; Data[22].bad := 2; Data[22].good := 3; Data[22].chksum := 10390; CheckData; OpenResourceFiles; WriteString('Patch Modula-2? '); Read(ch); Write(ch); WriteLn; IF CAP(ch) = 'Y' THEN FixBigInterp; END; WriteString('Patch Modula 2? '); Read(ch); Write(ch); WriteLn; IF CAP(ch) = 'Y' THEN FixSmallInterp; END; WriteString('Patching has been completed successfully!'); WriteLn; WriteString('Hit any key to halt...'); Read(ch); HALT; (* Note: Program is intended to terminate with HALT *) END Patch.
stuart@gargoyle.UChicago.UUCP (Stuart A. Kurtz) (03/18/85)
Here's a BinHex4.0 version of the Patch program for MacModula-2. Stuart Kurtz ihnp4!gargoyle!stuart Dept. of Computer Science stuart@uchicago.csnet University of Chicago. ------------------------------[cut here]------------------------------ (This file must be converted with BinHex 4.0) :#9"KG'0S,Na24!"-6d4&66*0-J#3""9Z!*!%Gdm!!rm8!!!"b!!-!Ed!!*M!m!" 3BA4MD!#3$!3!!3#3"`)"b3!3!#X!C9"KG'0S)#-!)'KKFb"KE(*PB@4j)'*PC@i JF'&dBfKPC#%!!&"KG'0S)#-!)'KKFb"hFQpZCb"LHA4P)5"'D@aP)'eeFh3JBQ8 JBfpbFR9`G#%!N!-k!G$V"MJa"N%%+!'j%"A'!VkeZ"%a#L%+B5%'JL%+B"*rrmD &b4Sr)3TL)3D#)3TJ%RrraSA)'KK"!JEY&3`S!1d9$S3%%"RY&3cY&3XE&i35"Zd 9$#J!l481K"B3*Hd9$1d9#rBK"S)K#Q!5Irr')3TLPH`!!J(+!))!@`#26@pNG@a K,6)!!%0[G@aN)'j[G#"[F'9Z)(*PFfpeFQ0P1L"0Ef4eE'%Y-J"$6d4&!!"$B@j ZEh3JFQ9KC#"MEf4P)(*PFfpeFQ0P)'C[FL"0Ef4eE'%Y-J!!6@pNG@aK)$)!!%0 [G@aN)'j[G#"[F'9Z)(*PFfpeFQ0P1L"0Ef4eE'%J-J"$6d4&!!"$B@jZEh3JFQ9 KC#"MEf4P)(*PFfpeFQ0P)'C[FL"0Ef4eE'%J-J#3!dN##HX#%)$U-3BK"S3U"qd @"l)K"Zd'","D5K,rrmJD$)3[%#$Y&3cY&3[fp,+%3!(Y"Jqa83C""Y@-'Jb%3a! Pl48-l48,p[4""Zd5&#%'K&F(l4B(XL%'l3B%X&Y,%[rrb"S-K&`3)1d9$1d9#rE dXS4Y!Hd'$l&4#%%)eB`D$)4`%#AY&3cY&3[fp%%)l4)8l!!#!FX"%J!+!1P$D'& ZCfPZCb"bCA0[GA*MC3!!(J*4k`%8"J%,`!!!#N%'*[("!Irk&!B,%"$!!!!+33B QmF%"rrU%K"!3l48-l48,33EY"KRd33EY%K2XhJ!#!F`"6!!'!2*PFR*[FL!p)!# 3!a!#EZX"XZd'"V!f*J$*'K#%M3IY&3`Q!1d9$Hd9#rEXhJ!#!Fd"DJ!+!2G$D'& ZCfPZCb"bCA0[GA*MC3!!(J*pk`%8"J%,`!!!#N%)*[("!Irk&!B3%4!@`!!!#N% )*[("!IrkK*)3%1d9$1d9#d%)l3BCp%%)l4)6l!!#!Fi"T!!I!3")DA3JB@jj)'Y PH5"dEb")B@ad,T!$+%CTE'9c)(GTE'`JF(*[BQ&LE(NJEQpd)'*P)(9`C'&dC@3 T!*!$#J+Dk`'%Qa!jl48-&!EY&38+a1cH!!)"c`'f!'3"(N0SC@0VD@jR)'4KG'% ZN!-!!%PZBfpZFfPcG'&ZG#"NBA4K)'PZ)'&bFQ&j)'9XC@ePER3k)!!!3fKPBfX JG'KP)'4KG'%JD@jTG'PKE'PkBA4TEfiJFf9MG'P[EL"MBA*PCR9XE(NK!!"8Eh4 KE#"MD'9MDh0eE5!S!!!T)'4[CA-JEQpd)'9aG@&X)'0[FR*PBh3JB@e[G@jd+!! !+5i!!%4KG'%JDA-J6dXJ,5dJ8'&dBfKTEQFJBf&Z)("bEf0PC@3Z!!"3!U2V")5 j$qd9$1d9#`!h&!B"%"E!!!"'333Q!EN3&FB#[V@i%6%))3KJ)3KKZ#%)BVJK#'2 *'KZ%`K!Ml48-*J$Y&3lY&3Z%e4![l48-l48,pLFK#'240m%"rliR%L',b4SXK1i 2l48-*`$Y&3k%pa!Il48-%L',!1d9$N%#%`!!!K#)!Hd9$1d9#rBE%8%#%`!!!K5 )%#,Y&3cY&3[XhJ!#!FJ#9!!d!B&3BA4MD#"0Ef4eE'%Y-MmJ!!"3BA4MD#"0Ef4 eE'%J-MmJ!!"3BA4MD'PZCb"SBA-JBQ9PEL"MEfe`E'9dC@3JFh9MBf9cFfCeE'a j)3")DA3JB@jj)'YPH5"dEb"SB@ad,T!$!!!"@3,bk`!9!C3D!Z`9$D"4""CB83, Y&3$Y"J$Y!3$Y&J$Y%J$Y&4*""")0(R""""!JF8%%%'Gb3335$D9c3335$4pd333 34(9"""!DGN%%%JepGd%%%JdKH%%%%'Kj33334(T""")0cAY""")0)Ra""!"p333 3)(j""")03Rp""")0)j!!%%%%%(D3!"&""""SN!!53335$J'3!"0""")0**!!&%% %%$+3!"9""!#3!"C""")09T!!&d%%%JdPN!!B3333+*!!'8%%%(D3!"T""")0`j! !'d%%%JdQN!!F333!N!!G3333-T!!(N%%%JeBN!!I3335$5H3!#"""!L3!#&"""! SN!!L3335$9H3!#0""")0+*!!*%%%%%+3!#9""!#3!#C""")0DT!!*d%%%JdTN!! S3333JT!!+8%%#*!!+N%%%JfcN!!V3335)D#3!#a"""!JN!!Y3333)T!!,N%%%L( LN!![3335)D@3!$""""!3N!!a3333%C!!-N%%%L('N!!c3335+A13!$4"""$#N!! e3333XT!!0N%%%LVRN!!h33352JQ3!$K""!+3!$P""!13!$T""")q$T!!1d%%%K# hN!!m3333*T!!28%%%#L3!$j""")4"C!!2d%%%JdUN!"!33330*!!38%%%#53!%* """)0JT!!3d%%%K(1N!"%3333)T!!48%%%$+3!%C""")5)T!!4d%%%K(kN!")333 3)T!!58%%%$+3!%T""")56T!!5d%%%K)QN!"-3333)T!!68%%%$+3!%j""")5HT! !6d%%%Kd#N!"33333-C!!88%%%#'3!&*""")G9*!!8d%%%LL4N!"8333#N!"9333 $N!"@3335+*D3!&IhmN%#%`!!!ML)$qd9$"8-l48&61d9#Zd9#d`3Ap)3@FJD![0 "!K-!!!*+L!rY&3`9$1d9"8cY&3VY&3Y-%&r5%&R)'J,e33)6!!!#A)J3+1d9$1d 9#d%#%`!!!SD)%"AY&3`9$1d9"3V%l!!$ra8%5JBJ!!`'&DPq!(idJ%PZ6h9d!*! -"!4,!*!(!JBc!$3!U`Bkk`N`#$%')3BJ#!'r!ELh"K!4kM%0!$N9#1d!!dJ0b"S %%"YB5"!JV4i%5!M)'MK)#-JD%#N!V"S*#1d!!5N"Z6NE(8J3)+dI"5N32kSD%8M Y!!&"#LN32mC)P5N"Z$N9#1d!!ae"!#QU(a-T%$qU(`e"#LN"Z4!raS83,XJD-J! k33ST%$r')3BU+-D&P5%'+LM'KHd!!5N"Z$NU!EJk+L%'Y,DdYLLX(J8T%$r)(#j "#LN32mB!P3!k!$`U+DSI!bcA'K*"#LS32mD&%$V)2#S"Z$SG'5`DDa3,!#S"ZFI !!!!8)3dV%#$'33SV%$r'KCA"!Ir`)3dU%#$'!*88#bV(+FI!!!!@33SV+VN32mC "#LX32mD&PF%"rqj"$L%0%#$Y&JF!XN%1%[rrl4%$X-K84"S0!,*"$K85l4%#X-K 8'`G!%e!5!94"$%%+%$rY&JIXhJ!#"L%"L!!6"BGTEMiJ!!!JGQpXG@eP)'j[G#" QEh9ZC!!JEQpd)'C[G@jN!*!$-!ENk`3`#$%')3BJ#!'r!ELh"N%#!qdA"5%'+2! 65"!Eb4SR40FD$)3$%"$Y&`8"14XB!,*"$%!5&3EY%3L`b6NT'JH%$!RY&`AY&`B Teai&5"!Eb"a$5"!Eb9!33""8l!!#"L)"jJ!T"CP[GA3q)!!JGQpXG@eP)'j[G#" QEh9ZC!!JEhCPFRGbDA4P2b!!!%9%593!!&4&@&3!!#"MB@jZEh3JBh*PBA4P)3! JBf&ZEQpd)'p`C@iK!!"L"a2V"6!)-3BK"L!)!Em"Z,F'K")%l4F&)3BSm"0%eaS -K"83%1dA"3%j'i4)%"[*'RX!XN%-3")9"qd4#,$*15RA'MH%(J[Y&`89#1d!!dJ 3Ap)3@FJH#%J3Ap)36XJF&NMY!!&)%&r5%%l)'JZb4qd4%,!k%"YB'c1b33a!%S3 PK#MY%3H`!-Nj+4S*K#X1l4F&'aLb33a!%K8(l4%)X!$*15ND"i3c$1dA"HdA"LR A(J9)%"[)(+C)%"[*8"&!%96XhJ!#"L-#U!!+"h6V!8!3'JZb4Zd4%,!f!&!3l0i !!JBN!VS!#JGpk`&!%4S,XNIY%4#`0J"3%HcH!!)'*3,-!"i(KZX&-3C!%"SU343 a#5%*!(!K#3&a!,*'3438#1d4#E$)9#%'+!LrF%6A'J8K"J"`'`JK"Zd!!`&8l0i !!JBT!`B!&3A"BA4dC@e`)(4[)(*PB@3JB5"A6e*%)'CbEfdJG'KP)'YPH@*[BA* N!!!D"k2V"$%'3"!D)d%@-3JK#!"`)3J#F8!B(`d!XNC"&L%'l4%*X-K84&!B'`H %1K!Qm"RXhJ!#"LB$1!"4"lcV"M!)-3B!15%'Y,DdYLJk3"!D,K3,p5X3)+`H!d6 A(!`V%##X(`*%'KBT+UXD$#%'+5M'+j8T!EJj&![e(4dE6"3,l3!$+a!JV"i&+a! Eb"`3+a!JV"i%+`M)'M!V#-JD%#N!V"S*+3'j13MY!!%E&5NUUaS3)3BT+-BVP5N "Z$NVl3!"&![Y!!-G15N!b93T+UXD##%'+5M'!*8V9HcH!!)'032B!!i)$1X#-3B K"ZQ"#HPS%"r'KA$T&JLJB!'iF1cH!!)'0!2b!!F)'HX!k3"ikB%*%"rfl!!#"LF $rJ!i#"rV"c%'%"$U-3R`&#%'!("%eaS#l"3,m"8V`J!6!6`8#r!9``!m&![`&F- !2--!+`!YrrRrm2rerq83-#ZV(`8V%$QV9"!`+kXI"5X31DXD&#%')3CJ#YSV%$$ Cf(!8#r!9(4iX'JJK"L%'B-p`l!!#"MF%E!!1#&EV!M%')3ETJ3RTD"!IaS9`k4B )S'!"Z($XhJ!#"MB%KJ!(#'2V!1N!H1Q"#4!IpZ`!!JBS"*)!)`KTk`Ba"K!3kM% *m"BK"J"`40FD!Z`8#r!A%$!VUam&+a!jUe33-#ZV(`8V%$QV'K3K"L%'B!Uk+a! `ZEK`&![`&adHl0i!!JBU"0B!&JL,k`8f3"%D(N%8-3NK#3"`)3N"F5B)[MHb4d% 8&!IY%3U`1"X&*Zd!!HcH!!)'-38!!"3&e@&dG'9YF#"dEb"hFQPdC5"K)&G28N3 JG'mJG'KP)&0MFQ9PEJ#3!a8)S1X%0N!4'KT"&M%))3J!F#%)!R'b4d%@&!EY%3U `0aX(K%i3)r!Cl0i!!JBV"5J!"!Ldk`!0qZcH!!)',!8Z!"d)YqX&-!Ja"L%')!J "[`'iY`B!15%'Y,DdYLJk+5UV(`NK"LNSaS8!V"S1)3BT+-D&qLN"Z$NG'qcH!!) ',39Q!#d)dqX'0cB%kM%+!$JQcXFj)3SS"XBT#V`3-,L9+3Ul15J"Z$JT!-JF'#B !bKS0)3SS"XB3,C8S!EJi*bLX'JSR!ENh%#$k(3dS!ENi)3SS"XD&qLJ!b"`2l0i !!JBZ"Ei!)JMrk`8h0JIU-3N!1#%*+!E'*JUmPLB+ZcBS!EJi*J$)("8R++`D#LF "Z6F3)2SG$5J"Z6JK#5J'aSB3-,Mk+!$)(",X!!)',`B!!#8*)1X&0cB'kM%*&!J (*mI!!!!*%#$k`3(rqa3)!!A!!!!6)3NS"FBQ"p+@*J1r0X%"rr%8#!8!`!%!%#% *+!A'KK!`Z2V"rrrdl!!#"MJ'5!!2#86V!6BQ$p)f*JUU'JJQ%$#i0KX'*K!hZ$B QqZcH!!)'-!CN!"8*8ZX$0cB8#!8Ram!!!!N3)2V"!Irl*Jbrm"JQ#,r`'#B%[r! B*[!Bl0i!!JBb"S`!"`PQk`"!%GFD"3cY!!(X!!)'13DB!!X&k%PZ6h9d,5"'394 "6#"&8P*28MS!!"3*E1X$-!Ja"L%')!J"[`'iY`EY&`D%B4!5l4F&)3BSl4F&l4F '#X6X!!)')!Dq!"J&mN0KEQj[G#"bC@&N)'4PCQ&eE(3JGQpXG@eP)'jeE@*PFL" fD@%J4f9d9QpX)3!!+`Prk`!9!C3D!Z`9'D"4#KBJS&%-&S#J83i@J+"4&"B#S&% @&J*4!ZdA!1d!!1d"!1d#!1d4!1d@!!"3%!"3%3"8!,*"$K86l4%#X-ND"i4V%#c `'HcH!!2r&JQT#F!!$!QeU9-!*6(%8h4bD@jRF`#3#J3*UJ#3"`)*`3!8!")*bZX $%)#h"K3)!5%'!)A(`!!!%#%'+"$raSAY!!("!Irdl0i!!JR#!$B!)JREk`B3J,F )-3Db)3J!K4$r)3B!KERjX$X8#J%Vam!!!"NK"L%'!)8UZ"$raL%)+K$raS@9`3( rkb%'!#%'!)8VZ*AX!!)*b3"i!!S*r1X#0cBQ*kSD"5EX'`-Rl!R%hJ!##F-!LJ! D#JAV"$!)-3BK"L!)!Em"Z,F'!$NT)3DdYV5f++XI#5%'+5M'K3$*'JFT!EJj(4S Tl!R%hJ!##F3![!!d#KlV#6!,-3NK#5!,!Em"Z,F*-!Ja"V)K"LMcX$iK"V5fY,B S!EJZZ6d!2#`YUKm8,#%*Y,DdYLZV(`NK#5`VaS8!b4S9)3BZ,,JSaL%*,#['KC8 X!EJm(5dX,DSD#L%',Lbi+-B!PH`!!JR&!5)!&3T4k`83J,F)-3B8#J!K#!#&am! !!"3K"LS3rmBK##S3rmD&PF%"rr$XhJ!##FB"5J!X#QAV#$!,-3NK#5!,!Em"Z,F *-!Ja"V)K"V5fY,BS!ELb)3NVml$jX!(C243-!#h!!!!5)3BX+-BK#5`VaS@9`3( rmL%'Y,DdYLJYc"S+)3BY!GJSaJ#9l!!##FF"S!!Q#T!!k`B`#M%))3JJ#J'r!EL h#$%'!$XV%2qU(a3V)3LdYV5f+UXI#5%)+bV'K3$*'KBK"LX"Z"$raL%)+bV'KC8 V!EJl(5mK"J!VPH`!!JR)!HS!*3Uek`B3J,F*-!Ja"J!l+b%'Y,DdYLLV(`FV)3N !KDSD&L%'+bM')3NV!EJ3rmD&P5X"Z$XG*bXK"V5fY,BSUaS))3BV+-B!PHcH!!) *`!)b!!`+fHX!&3'8'J,X&344!Zd"!1d!!1d#!1`!!rmA#Z3,!!!-#[@TIJ"[8N4 8CA*YD@jKE!#3#33+j3#3"`),!3!8!!i,#ZX#-3C%'JNK"N9`!&3E#L%'l3!$)3C J9HcH!!),!J!Z!"%,&qX#-3C%'JNK"N9`!&3E%5%'l3!%)3CJ!-ND"5%'B&AX!!) ,!`"1!!3,*qX!!96XhJ!##`3!9!!&#bVV!6BQl3!"l!!##`8!A!!G#blV"6!)-3B K"L!)!Em"Z,F'!$NK"V5fY,BS1LNUUam*)3BT+-D&!+`D$L%'+5M'KI3T!EJj(4[ XhJ!##`B!P!!%#dVV!!hdl0i!!JX(!*S!"!Y0k`!-p1cH!!),#!#J!!3,81X!"r6 XhJ!##`N!TJ!$#e2Y!!MX!!),!!#U!!i,9HX!&3'8'J,X&3C4!Zd!!1d"!1d#!!" 8!&AX!!ErmJYL!!!,E`*8#hB!N!3J03!!!: