diff options
Diffstat (limited to 'support/vvcode')
45 files changed, 38632 insertions, 0 deletions
diff --git a/support/vvcode/00README b/support/vvcode/00README new file mode 100644 index 0000000000..247390903d --- /dev/null +++ b/support/vvcode/00README @@ -0,0 +1,10 @@ +THIS SOFTWARE IS STILL UNDER DEVELOPMENT!!! + + +Use it at your own risk, and be aware that the software and documentation +may change at any time. + +The author can be contacted as Kempson@tex.ac.uk, but please do not mail +him except to report bugs or offer improvements. + +December 1992 diff --git a/support/vvcode/binaries/msdos/vvdecode.boo b/support/vvcode/binaries/msdos/vvdecode.boo new file mode 100644 index 0000000000..d2fc3532e6 --- /dev/null +++ b/support/vvcode/binaries/msdos/vvdecode.boo @@ -0,0 +1,1528 @@ +VVDECODE.EXE +CEZ@07D00@0P~3oomQ3X00~6?P000040ne1ZLP00~J0@00~~~~~~~~~~~i^_h9;XTFS@:d<<dQ +Rbh208\N;02>fZ>B08`6T0297X`0RBjX0>R10L@nRP2;ah_H^Omoo?:^hf539SP5MOJ0cH3gfHT> +RP2i0@3Chh?328?Sn8TNSP2<fR_ZRci8=H7o009c1kl00XTnB3F1abI6LRP3?V0dLR:a1=?_Ac__ +LQV3?TPe07@7PciP=01e3[l043__M`N;oN\3jM`1Rml3fXTNX0297Z@0XI00:mR>`;A:EldQGm?W +nXkBRnOk<l0^SPJ=0[mJ>[TVAR_?o?>ZPchb=1AfAh0nTP03LT1g1h0nT`0NLSNh0ERk0P3=8G8Z +]6N;7S8dcB5b8;A8^`40cB5b5d2SZ018S\2dBLdQLPZh0ERk~2cB5c0nUK0K@0cAZ95YH0R@jH +00[0M0bh@02>`;]`02K61`4ckBj>1Xd2_T8j_eXjj=00ocJ80?lfQP3o=X@0j:8[D>RSHbj>1Xd2 +EUNnFSZoFS[X[@1OG\=FEbj>1Xd2<l2;l;T_02H2183D04KRmbeL3G@9^AT0^Rl0j=`0Gek3Rnbd +C8Y60\dQ^@h0^TP0jMD07[P0=LdQRAid08`6MP2h13G=8HTNN02<1WX0^0DecB697W`0S0In0;P6 +=LdQRAj008`6PP2h02F<bXkJ^Z01cB4O`ajh02G55W@0cB4O7[P49LDFN03=8AlN^0DUaAIl0<dQ +7ajh1RG55X00cB4O`h7n@SYd13;Tj`:doh_GRmhkgg@S9X0oog@HPOi2>W@69SYW0N\49SQW0GL6 +9XYW0H_CPl<6jmTkeg@KRmXVP3l09\H7o`Id1bKoG`87jk4VoeL21n^Z`kA0^`80cB73^Ah0^UH0 +;XhNS@;Xj_nh0`1@j85R~20@1ERnb3k79FEh]f18]n33TVW01b0nPjMh1l0`5e6omd15OXnIAI +FENh4P=@<l1@j65>Pl@6\07[J8e6SU3oMPKXkR1IFHQ6oh1no`5d5[SE?E2h5P=@^040D>RlG8?4 +1[00jm>=AXi@^3l3D?lfbc_XN9:3a0JheCe@ocK;>kP1053XU5b3a0IGSDJ>D?mf2_mf2>SI5X?4 +28Q6ohY6on^FGej;iEg3EH_\Pn`nEULi9Y`0LP?XVWJhFC]@ocIc>[QV0e3o=\\kj22BPl@8^=Dm +D?lfbc^h0@1@j3aLPl@6ocJ_>olf[C_o=W<j^8d3D?lfbc_Xm963a0ZheCe@ocK;>kP1053X45b3 +a0K7A_`00<M6nP0@^;@3D?mfn^QF<UUIRDKVadKd~2RdKVRDK^^7DjD;QI>e3o=\lkocIL>S?0 +^P08D5;XLC63a0b;l0_fMCR;7ZXkmdL2801d2KSE?E2h`P?[1kSE?E2hj`=@^0@0D>RSFh?41S?0 +D;QI>e3X34MIFNQfCnRHG8X4V=7PRmR3_hHnogDi^5TkD?lf[c_o=ZdkRPBHD8X4V52h1PA@ocK; +>nPcTH?43[SE?E3o=\\k^0@0D>Q?Fh?41^QCG>\>RPBHdN2;f8^7QSj9A_16Pgk`07d`ogK`^3d4 +D?lfbc_XmY23a0JheCe@ocK;>kP4053X4U^3a0IF^5TkD>QmAUUIj0aLPgk`07@3jJ01^7DjD;QI +>e3o=\lkocIL>S?0^P08D5;XPC23a0b;l0_fMBBheCe@^5d4D;P4053XaeZ3a0Hc`52hFC]@j316 +FEWXVTkX_5^h9@5@E[QI>e3X?3J3a0J9A_:;A_8m201d23d>07@bjAP1ocJ_>olf[C_o=W<j^7P4 +D?lfbc_XBi23a0ZheCe@ocK;>kP1053XIeZ3a0KY]`B3?V@j0W@aocI[0KRO153o=\\kj1f@Pl@6 +^=DmD?lfbc^h101@j3UJPl@6E[QI>e3XY4EIFNPcFh]6l[X50?OZ1BD1D5JhFC]@j4hkPl@6SDK\ +D;S5152;A_:j1@3gjX_HokLX0NP_T8?41_l6LcZ;A^`k1W<jM3CoM^co=V\1^<T4D?lfbc_XZHn3 +a0RheCe@ocK;>kP4053XaEV3a0IF^5TkD>P`AEUIj;mJocJ_>olf[C^;A^a8D;SL153o=\\kj6n? +Pl@:^=DmD?lfbc^h0@1@j8]IPl@6^5TkD?lfLc[Xj@EIFNW40kSE?E2h0`E@^0@0D>QYFH?41UJh +FC]@j=A4FEWXHeZ;A_050P2k0`2Imo_Ah=7PRDKfPciJ>P1d2olfFS[X0I9I0DKfE^SiTETkA_Ic +=UKXki5ID?mfm[PH1E3o=\\kj>R>Pl@8^=DmD?lfbc^h0`1@j0AIPl@6E[QI>e3XKdAIFNU30h<n +dcX3M@?Y^@2;A^J9A^j;A_29A_k[7omfkUKoM_kX;P>3a0J9A_R3aPB;A_P1A^j;A_PYA_j3O_h0 +Om\con\fRekVX5Dk<P4Tok@0dN3Ah8_HRhN=@8^GRd1@DX\FEc^QEC^a2>PAGe\cf5Pc`Z=G>hTN +EC]7>gk`L\F0?^P00GDN<oo[5H]NiXX1]03Ah8_HRXOE>h]NiXP1Ac]nl7;V^>TjD?mfiX]6l9UB +D>R=FH?428]6l9T11U4k4AIC>nUm0X=nm01d0nV60He6`U1F^080D>Qh0X?41XU6n8Y6`YRI9Ol0 +Pn80\@SXJej9E^B9A^::A\>HVBGo08?R0056hQ5Fi8=ni01l5WD6PgkR078>PgkT07`kO`J3O^;o +MS?oM^CoM^:h>PE@ocK;>nRDSH?42;SE?E3o=\\k^0@0D>R`Eh?41UJhFC]@j1]3FEWXZUR;A^B; +E^8kA_am0nV507l5>eKjMWkoM^;oM^KXgVmIFHU6iX=niP1e:Omfi?mfh[QO1E3o=\\kj3R=Pl@8 +^=DmD?lfbc^h101@j5AGPl@6j5QHRdKTReKRRDKlREKjP3j8@05e;[RC1E2h4S=@j3UnFEWoM^Co +M^:hV`E@^18cD>PVOX?42;S?1E2h4S=@j1QnFEV;A_29A_j;A^J9A^koM^iFogKnj5<1Pl@6RDKh +PlH4Rek^RTL2Rek^R0OoA^k[6OmfkUKoM_kX<063a0J9A_R3aPB;A_P1A^j;A_PYA_j3O_h0Om_7 +A_@108]6i8]FhXU6jXUFj8=^l0;[;H]6l8U6o^\OogK^E_mfo^S\08?41XU6n8?618]6n056kX]6 +n2U6oX=noP1ofh]6l9TYA^PIE^Z3O^X0OP?Y[P1e2H=nj01f0nVS03?ojcJ;G^JPEC\b0BCo]03A +h=7PRmR;Qhe0RiN;@51BRaIG>j5E>k48j;5LFc?HF3?2XeLkRAiE>dLkO^9baH0nj001MAhcon\E +RekVRP6d0=7PRmR:QmDkRekVR057>gkRL^J3?T<k0gDB^>TjD?mfi_mfi?mfh^QfEn\@^>TjD?mf +i_mfi?mfh^PDEh?42<M6m000RdKTReKR0AIA>a46Dc_Yb?WoM^KXhF]IGej;iEg3EH_\Pn`<EULi +9Y`0LP?Xc6lcmX=n105m0nWN08]N1XX7V=7PRmR3_hHnogDo^5TkD?lf[c_o=ZdkReh6RPNHD8]N +1XX7V52hd@E@ocK;>nPTRh?43[SE?E3o=\\k^0@0D>Q0EH?41^Q4E^\AReh6RPNHdN2;f8^7QSj9 +A_j;GPJ:A`6HdN2;f8>oQSkoMD6hFC]@ocJ_>olf[C^;GPJ:A`6HD8]N1XY70IQ@^0P6D?lfbc_X +`8Z3a0jheCe@ocK;>kP4053Xg5B3a0KXh5G[3h]N1XY70ISAh8_HRkn6?X]6o]7PdN2;ek44doX; +`XU6n8]N28Y6n8P7AX=n109m0nV108]N1XY70YSAh8_HPkn6?_me@KQI>e3o=ZlkocJ]>h]N1XY7 +0YQ@Reh6RTL2V52h?`I@ocK;>nPjRX?43[SE?E3o=\\k^0@0D>QFE8?41^QJEN\BReh6RTL2V=7P +RmR;QhHnRDKlRlNa1=?PReKldO[AnP_2RDKfReh8RTKfR4L1AX=n10=lO8]N1XY70iSAh8_HPkn6 +?_me@KQI>e3o=ZlkocJ]>h]N1XY70iQ@Reh6RTL3V52hMPI@ocK;>nRcRH?43[SE?E3o=\\k^0@0 +D>S?Dh?41^SCE>\BReh6RTL3V=7PRmR;QhHnRDKjRdKl\@KCh0]6nXU6m8]N28Y6m8Q70TJ;a^\0 +Gej;iEg3EH_\Pn`8EUN;MPHi9Y`0LP?X^Ff3OPASORNhH`1@^:d6D?lfbc_X?HV3a0JheCe@ocK; +>kP4053XFE>3a0KXGEC7A_P108]4EX]DE8U6o8UFn[Qe>U1FocK?>olfG3Xc`;X0251Bj<dXPl@< +RoP;og@3jHD1ReaAmdL2801e0nUG0H1lD`5e=?mfn;SB1U3o=\\kj=28Pl@6^=DmD?lfbc^h101@ +j>aBPl@6<l1@^5TkD>QE?UUIj>ACjfR0?XQ00GD[^?@6D;PB<e3XcgUIFOmfn;Sl1U2h4S=@j;mi +Pl@6^2h7D;PB<e3X\GUIFH0nR401MBnh<0M@^18cD>RMNEUIE_mdE_mdE;Ph1e2h4S=@j8UiPl@: +^6L7D;PB<e3XNgUIFH]6n3d107@<?@80M7Lm0`1dBn]`P3j8@05e:KQY1e2h4S=@j5=iFEUF^747 +D;PB<e3XAGV3a0JhU@M@^18cD>PgNEUIogAAj9^6FLM4EP00adAD~2adKh0P3YQP5FogH4^9L7 +D?lfbc_XeXN3a0RheCe@ocK;>kP4053XlU63a0KXmU;oM_Rh^PM@ocK;>nR`Qh?41[SE?E3o=\\k +^0@0D>S<DH?41S?0D5KX>3eIFNS7D^\Q^=DmD;SL1e2h101@j:aAPl@6<l1@E^PH?EUIj895j:AB +Pgkh0WERRdAFReAD>dKlO5Me1C]FnW9@P3j8@05e;;S_1e2h4S=@j7UhFEUFogH4^?L7D;PB<e3X +J7R3a0Rh:PQ@^18cD>QJN5UIE^SD:5UFogH4j1h7FEW7A_P30<M4EP00adAD~2^2D1D5MFj;l\ +Pl@6RDKnPgkn3GE4E[QV0E3o=\TkogH4EnQM7h?42S`1MB_oM5KoM5CoMPBh;0Q@ocK;>nS4QX?4 +2[SE?E3o=\\k^040D>SPD8?41^]]jdb0?[P00GA5Pgkn3gDoE[Q`0E1Gj<@9Pl@6RoP;ogDN^=Dm +D;QC252h101@j:]@Pl@6<l1@E^PG?5UIj:IAocIc0KQ5?U3XUXQIFN\L^7DjD5Ko=\lkocIL>S?0 +^P08D5;X62J3a0b;n>U8oEmNRnEM`eF;k8?\LUHi9Y`0LP?XTF[71Zlk~2a`J]>`00a`Ic>P40 +^5TkD;P90E3Xb0AIFKQ`252hD@1@j8\VFEV;l3?0D3?0D5Hc`52hFC]@j:=>Pl@:P3kF005e2<L6 +JcX10>\EP3j\>`5e2<L6JcX00>\6a`I[>P80^=DmD?lfJcYF^<L0D>S9;h?42;Re252hYPQ@^9`8 +D;Qn253o=\\kj9Z5Pl@:^=DmD?lfbc^h0@1@j;I?Pl@6^5TkD;S1253o=\\kj7J5Pl@6^=DmD?lf +bc^h0@1@j99?Pl@6P3kF005e1KP=2N\3^149D;SW253o=\\kj4J5Pl@6^=DmD?lfbc^h0@1@j69? +Pl@6^=DmD;PD2E3o=\\kj2:5Pl@6^=DmD?lfbc^h0@1@j3i?Pl@6<l1@j2aOFE9@j;Y>FEVhFSY@ +^5`jD;QT>U2ho@1@^?L0D>PR48?42[PU0E2hFC]@ocIT>^Pg2h?41X<nI3X2M0?YQ02hHSY@^4P1 +D>Qc7UUIPciR>P1n:kQI>e3o=V8j^3X9D?lfbc_XXXB3a0RheCe@ocK;>kP4053X_Tj3a0KX`To6 +1WTj0;Qi>U2h5@5@^5L1D>R27h?41[Qi>U2h6`5@^581D>R]7X?41[Qi>U2hH@5@j;DPFEVhNCY@ +^7D1D>Qd8UUIjc_71V8j~2aPIi>P371]<j0@371]4j~2a`KO>P20a`KM>P40a`KG>_ooa`KE>_oo +a`KK>_ooa`KI>_oo^60jD;QL0E3Xb1mIFKQN>U2h>@5@j14MFEWo=\Tk^7X9D?lfbc_XhH>3a0Jh +eCe@ocK;>kP1053XoDf3a0JhACi@^400D;Re053XR@n3a0JhQSi@^001D;Q5?U2h@01@j1ThPl@8 +a`KA>`00a`KC>`00P3kX005d4KRP2E3o=Uhjj=TiFET;`7A6SDJ>D;RV2E3o=Uhj^>\0D;SU053X +Oo23a0Z8A_n0O_l1MA6hO`5@^=4kD8e6SU3X@3S[3kSE?E2h[0U@^040D>Q[CH?41X<ndC\0M@?Y +aP23?]<k07D3jK`0ocKA>olfGS[XKSUIF@_0M4co=]<kocKA>kSE2E3o=\\kj0:3Pl@8^=DmD?lf +bc^h0P1@j1i=Pl@6ocIN>[P32U3o=\\kj=j2Pl@6^=DmD?lfbc^hoom@j?Y<Pl@6ocKC>kPR2U3X +4CUIF@_0M4co=]<kocKA>kPX2U3o=\\kj:F2Pl@8^=DmD?lfbc^h0P1@j<5<Pl@6^78:D;QF2U3o +=\\kj862Pl@6^=DmD?lfbc^hoom@j9e<Pl@6jeVhN0Y@ocIN>^Rb>5UI2l1dB?lfGSZhOPY@ocK; +>nQ:PX?41[SE?E3o=\\k^080D>QVC8?41[Ri2U2hW@Y@ocK;>nPVPX?41[SE?E3o=\\k^?ooD>Q2 +C8?41[SY>U2h5@5@^7TjD;S=053XhQ23a0RhjCY@^1\1D?lfH3ZhNCY@^;\0D>P=3h?42[SY>U2h +NCY@^=T0D>Pk4X?41[SY>U2hNCY@^=l0D>Q^4h?41[QV>U2hjCY@^?40D>Q04H?41[SY>U3o=\Tk +ocI[>[P?0E3XY@:3a0RhRd1@^;S]^R23D5:h005@j6HXPl@8a`IG>oooa`IE>oooa`IC>`00a`IA +>`00a`K3>`00a`K1>`00a`Ig>P00a`Ie>P00E^R_HEUNRnEM`eF;k5IGRgh4RgH6>BJL0783j9QU +P7d30G@W^=l:D;Ro2U3o=\\kj1b1Pl@6^=DmD?lfbc^h101@j3Q;Pl@6j3a<adAA~2adAH0@37 +A5X10<M4G_ooadALooo7A6;oolM4H?oo^>`:D?me1>SKPUUI2l1e5KS^2U1Fj?b2FEW7A57b<\I4 +D`7[Come15KXj89IFEJhm0Y@<l1@j50lPl@6P3j8@05e:KSh2U2h4S=@j<YaFEUF^00;D;PB<e3X +_763a0Jh9P]@^18cD>R^LEUIE^Rk?UV9A563O540MBAF^2P;D?lfbc_XFh23a0JheCe@ocK;>kP4 +053XMdZ3a0KXNd^0O5<1M0UFj510F@[0MCV0?XQ00GDY^4H;D;PB<e3XFG5IFEJhCP]@^18cD>Q; +LH?41[Qg2e2h4S=@j3eaFEW6A5<1E^PNB5UOGUg3EH_\Pna8EUN;OPB;MPHi9Y`0LP?XAfAG^7T; +D8e6nU3Xe7n3a0IFSDKjD>RE?eUIE^QY?eVH2l1e@5IG^7l;D?lfbc_X\7n3a0RheCe@ocK;>kP3 +053Xc4V3a0IG^9l;D8e6^53XSgn3a0IF^500D8e6^53XS463a0J0?XQ00GDY^<H;D;PB<e3XXW1I +FEJhcP]@^18cD>RDL8?41[Sd2e2h4S=@j8I`FEUFj9<mFHU4DH=lD@1e95JhmP]@ocK;>nPcOh?4 +1[SE?E3o=\\k^0@0D>Q?BH?41^QCBUIG^1<<D?lfbc_X3Wn3a0RheCe@ocK;>kP1053X:TV3a0IO +GX_UGL=ERnb3k0IFEh]n18]f2STVW01b0nQ3HlM4D@00^3X<D;QA053XEamIFHU6n[Q:352hD@1@ +j4LOFEV9A_jhE`a@^540D>Pg7eUIRDKlP7d30G@3jJD0^6<<D?me1>RHP5UI2l1e5LI4D`6hI@a@ +E^ReP5UIadAA0S?[O_me15KXYH1IFH0n<@41MC;oMPSX]SiID?mfn^R>P5UI<l1@ogKlogKn<l1@ +ogKjj?m6Pl@:E_mfo?mfo^SR>H?41X0nR401MBVhK0a@^18cD>QLKeUIE[Qd352h4S=@j4i_Pl@6 +^9\<D;PB<e3X@6mIFEKoMPKXeCaIFHU4DN]jP3ha0@5eC?mf2>Po?UU@E^PIP5UIP3j8@05e:KRM +352h4S=@j0U_FEUF^:D<D;PB<e3Xnfj3a0Jhc0a@^18cD>S]KUUIE_mf1^R2?5UIRDAAjbNhkPa@ +^<h<D?lfbc_XUgf3a0JheCe@ocK;>kP4053X\dN3a0KX]dR3O540MBAF^?\<D?lfbc_XKGf3a0Jh +eCe@ocK;>kP4053XRDN3a0KXSDQF^1X=D?lfbc_XBGf3a0JheCe@ocK;>kP1053XIDN3a0J0O5<1 +M0UFj44mF@[0MCV0?XQ00GDY^40=D;PB<e3XBViIFEJhB0e@^18cD>PlKX?41[Qa3E2h4S=@j2i^ +FEW6A5<1E^P?AEWoM_kXBUeIogKlj4=MFOmfn^PlGEUOGX_UGL=ERnb1k0H2EULi9Y`0LP?X9V6; +GPK6A`80^7<=D;Q1053X>1eIFH_hSHKjoE2hN`e@ogH4j?ilPl@6RDKlPgkl0GEISHKjoE3XgcMI +SHKjoE3XM7mIRo23oT1o3Hf6n_e@EnROOUUIjc5F^8D=D?lfbc_XG7b3a0JheCe@ocK;>kP3053X +N4J3a0Hc`53oMPSXhS5IFC?0jKD0j`?61@1Gj2EoFH_`^7DjD?mf2?lfcc_o=U`j<l2j00Q@D^SR +6h?438U6oX=noP1e8[SE?E2h\0e@^0<0D>PUAX?41S?0D?mf2>R?<EUIj?TijjRh9@5@ogKnogH8 +j9\QPl@6?OooM0;[9omfo^RnOUV;eP?@Ro:3oT1o2omfoUOXOgeIFN\7E[S=3NU5onUdoeOXVGiI +?D00M0MF^?P=jC7oReh6aTL20H]N1XUo0h]6o^U8oemNRnEM`eF;k87\40QFEh]f23TVW01b0nS> +GlM4F040adAJ0@37A5koolM4G?ooadARooo7A63oolM4EP00adAD~2E^R5>EV9A563O540MBAF +^2X>D?lfbc_X9G^3a0JheCe@ocK;>kP4053X@DF3a0KXADK6A_T0jDh1PdAD0H=DEP1FSHKfoE0c +`;X00U1Bj>`mPl@8REKnRDKlPgkn07lfO0J3O_`0Lbj;G57gA`8P07@3jA\1^=DmD;QD3U2h0`1@ +j>U4Pl@6<l1@E^QE<5UIj;lhjOX0aTKf0;PS052=Q_KmD>Rh<5UIRoP;og@3aPD0SHKfoE3XgcEI +SHKfoE3XM7eI2l1e0nVm08f6l?M@SHKbnE2=Q_CkD;Qi3U2=Q_KmD>RnNX?42XU6nX=nnP=d7kSE +?E2hPPi@^0<0D>Q]A8?41Xf6m_e@E^SG;eUIjgN0?XQ00GDm^;@>D;PB<e3XE6]IFHf6l?M@SHKb +nE2=Q_CkD?mdE_mdE;Rl3U2h4S=@j39[Pl@>^?H>D;PB<e3X96]IFOmf18f6m?]@j3<`FET;`7DR +ogH6SHKbnE3X8S1IF@_0MA6=Q_3gD?mf2^SaNeUIaTKi0H1nn@5d0nVYoUKXHQ]IRTKij`1OGX_U +GL=ERnb3k09FEh]f1STVW01b0nSbGKQe>U1FocK?>olfG3Xc`;X0251Bj4@IPl@<RoP;ogE7ReaA +mdL2801d7?lf;`6hn0i@ocK;>nQBNH?41[SE?E3o=\\kj`RheCe@^1\?D;P4053XI4>3a0Hc`51F +j=0^FEWX>SOXG4CoMPQGE^SP7X?41XU6oX=n109dBh]NoX?k47M1dN<^ojNL7X]6o[X50?OZRmSo +]bD1^3H?D?lfbc_Xj7R3a0JheCe@ocK;>kP4053X14>3a0IGE^Qb;UUIj054j`;[08]NoT>3na5f +0nUX0M7S;_nWN1kYQ`6;A_jj1@3gjX]N20?HP7l20GDiRdKn^PD0mnZ;GPP3f?lg^68?D?lfbc_X +PWR3a0JheCe@ocK;>kP4053XWT:3a0IGE^P<;UUIj9]3^<TkD8]6o[X50?OZReH80m1BocIT>UIG +j2HGPl@:jCT1RdKn^PD0mnZ;EPP3d59GE^Q86N]ORdKn^PD0mnZ;GPP3f81o0P5e>H]6o[X50?OZ +Reh80mSo=kQg3e3o=\\kj01hPl@6^=DmD?lfbc^h101@j1a2Pl@6EeKXRReIFNPI@h]6o[X50?OZ +ReH80m1BEeKX=B>3a0KYX01FRdKn^PD0mnZ;EPP3d59Gj>CjPl@6RoP;ogDN^=DmD;R<3e2h101@ +j<]1Pl@6<l1@E^Pg;EUIj<I2jGl0RdKn^PD0mnZ;GPP3f?lg^:T?D?lfbc_XLGN3a0JheCe@ocK; +>kP2053XSD63a0IGE^Sk;5UIjb_[:KS[3e2hb`m@ocK;>nQ2Mh?41[SE?E3o=\\k^0@0D>QN@H?4 +1^QR@^\0^7DjD5Ko=\lkocIL>S?0^P08D5;XhAJ3a0b;n>VJoEmNRnEM`lTLl1g`7L`L:1i>7CTM +:1i>7BPNCQe>7DhMCQdX7RPN\ae>7GXLNQbd77XLNQaj77XLNQbd77XLNQaj77XLNQaj7;@LNQaE +Rnb3k0IFEh]n2STVW01b0nP@FlM6o000jL`1^7DjD?mf1_lfcc_o=U`j<l2j00Q@D^QH5X?438U6 +oX=noP1e0nV]0EOoM_koMPKX<ab3a0J;l8?n0g@3jLT0Pgh40W@^RlJj1@3gjX_Hoc6hn0m@ocK; +>nQ6MX?41[SE?E3o=\\k^0@0D>QR@8?41^QV@H_6^PD0mnZ;e`?@D_mfo_mf1^R08H?41X]620EX +052h9A1@RlJj1@3gjX_Hog43j61fPl@6RDKjPgkj0GDAReh8PgmZ07m;O0J3OfP0Ld>;a[X50?OZ +RmSo<KPY453o=\\kj<UePl@6^=DmD?lfbc^h0`1@j>DoPl@6ogKnogH6j4l[FEV;a[X50?OZRmS6 +@@80jL40Poh6M0?Y]`23OP@2M2j;a[X50?OZRmSo<KQ<453o=\\kj7EePl@6^=DmD?lfbc^h101@ +j94oPl@6j9E0RlJj1@3gjX_G0m1BogKnogH6j:lPPl@6RdH81F`0D;Qi452;a[X50?OZRmSoL@?X +SgF3a0J9A_Z3O_X1M4>;a[X50?OZRmSo<KQm453o=\\kj0UePl@6^=DmD?lfbc^h0`1@j2DoPl@6 +ogKnogH6j8lZFEV;a[X50?OZRmS6@@80j`;[3?m6o8=no09m0nT[oUmNRnEM`eF;k5IGRgH8Rgh: +>BJL0783j1UIReh4P7l30GDSa`@10<L5~2Reh<a`L00;SE?E2hX11@^040D>Ri?X?41^]>Reh6 +P7l30GDHa`@30<L5~2Reh<a`L00;SE?E2hba3[8\L40P2hmQ1@j54_FHT5^?T@D>Q7;eV;GPb9 +1kSE?E2hna1@^040D>QY?X?41UmNGL=ERnb3k79FEh]n18]f23TVW01b0nR4F81m0`5eG_me18e6 +SU3X@7IIFHe6SU2h9Q5@<l1@j:D_Pl@6E_mf1Xe6SU3X8R>3a0JHRDKnPgkn07DWSDJ>D;PZ4E3o +=\\kj==cPl@6^=DmD?lfbc^h101@j>lmPl@6j?<njg60?W810GDI^5TkD8e6SU3XfWEIFOlfL`5F +j=1eFEW[DJ5T>Sd107@<?@80M38m0`1d6n\[^54AD8e6SU3X[GEIFKQP4E1Fj:=eFEW[9;RQ4E2= +AXi@j9AeFEVh\17[iKSa4E2=AXi@j89eFEVh01;[dhe6SU2h@A9@ocK;>nPiLh?41[SE?E3o=\\k +^040D>QE?H?41UJhJ19@ocK;>nPHLh?41[SE?E3o=\\k^040D>Pd?H?41X_61B00D;RA4U3o=\\k +j?9bPl@6^=DmD?lfbc^h0@1@j0hmPl@6Gej;iEg3EH_\Pn`2EUN;OPJ;MP`i9Y`0LP?X9eOoMP[o +MPCX`1AIFHU6oX=no_md2H]6oXU4F^V40;Rj4U3oMPSXk2QIF@_0M4SoMPRh`A9@ocK;>nR5LX?4 +1[SE?E3o=\\k^080D>RQ?8?41[SE?E2hn19@^?ooD>R??8?41X=lF01e1KP10>\3^040RDAJjbbh +<A=@ogH8j9@XFET;`7D;PgeJog@5RdEJj`j3O5P0M@Fh0@3[0kP108U4FX]4FSd107@>?@80M0Lm +0`1d1^\6jaO[5N\CPgaH07D5^040j`>h0@29A5[[08=lF_md;8]4F]7PReh:0mSo=kPh4e3o=\\k +j=EaPl@6^=DmD?lfbc^h0@1@j?4kPl@6Gej;iEg3EH_\EUN;OP@i9Y`0LP?X45J0O@<1MAooM@Co +MPKXcG=IFOmf1[QN4e0c`53X<bf3a0J`0N]T<oJhHQ<;`7@V^70CD>Q[M5T;`7HJ^7hCD>R8J5V; +l0_fM0aFj5AdF@_0MP=FjbL;mWD]^8`C2l1d9[RG4e3X>WAI2l1f6[RR4e3XgC1I2\1d3[R]4e3o +MPKXFg=IFN^L\03[VUmNGL=ERnb3k09FEh]n1X]f2STVW01b0nQ\EOmf2?mf1>SO4eUIRDKnPgkn +og@8RdKnRDAHja>3OESoM0R;AER9A5S[1LM4F000RdAH2l1d1cd107@2j`;[9_mdF;Rh4e3o=\\k +j;Q`Pl@6^=DmD?lfbc^h101@j=@jPl@6j=PkRdAHdN2;GPP3f?lg^=`CD?lfbc_XRG23a0JheCe@ +ocK;>kP1053XYCZ3a0IOGX_UGL=ERnb3k0AFEh]n18]f23TVW01b0nRnE81m0`5dAH0nR401MBNh +0aA@^18cD>QfHEUI^0\DD;PB<e3XJF5IFKPk552h4S=@j5aQFEV;GPJ3OeP0M@O7A_h00>\5adKn +803[=lM6o_ooSDKnD;Pm553oM@CXGG23a0J9A_b3O_`1M@f3O_h0O0N1O_ko07h;^40DD>R81EWX +3C^:A_hTohP4Reh6PgmJ0WDXRPBHD8X4V52hKaA@ocK;>nRbKh?42;SE?E3o=\\k^040D>S>>H?4 +1UmNRnEM`eF;k8?\15IGRgh6RgH8>BJL0783j>MCE_mf1>PU4eUIREKnRDKlPgknogD6Pgklog@> +RdKnReKlRDANREALjbB3OEkoM@J3OEcoM0j;AEj;EEb9A5j9E5c[2\M4G_ooadALoon3O5koM@V3 +O5coM@?Yc023O5X3MDR3O5h0O1Me1X=lG05b3h=lGP1l<Wl7PGaLoGmf:OmdG_mdG;RN553o=\\k +j?1^Pl@8^=DmD?lfbc^h101@j0`iPl@6j10jjdb3O5X2MDJ3O5h0O1Me1X=lG05b3h=lGP1l<Wl7 +PGaLogmf:OmdG_mdG;S<553o=\\kj:9^Pl@8^=DmD?lfbc^h101@j;hhPl@6j<8iPgaJ0W@6PgaJ +0gDVogANogAL^?dDD?lfbc_XKFj3a0RheCe@ocK;>kP1053XRCR3a0IOGX_UGL=ERnb3k0AFEh]n +1X]f23TVW01b0nRRD_mf1>QB4eV9E_j9A_b1O_h0P7D6Pgkl0G@>RdKnReKlRDAVREATjbF1OFH0 +P7D6PgeT0G@>RdEVReETRDAVREATj`[7A6H0P<M4I040PGaV081e1X=lI05d;?mdI_mdI>QQ9UUI +D;PT5E3o=\\kj<Y]Pl@6^=DmD?lfbc^h0@1@j>HgPl@6Gej;iEg3EH_\Pn`>>BJL0783j0MBXELk +RaIE>h?bocGooj=G>hTFEC^QMcZ;5WDj0AK1>a46`c^h9@5@^7TjD;QI>e3o=V@jj:gfPl@8P3h< +0@5e484nZS_b<W@8^5TkD>P83eV0?Q810G@:P3ha0@5d0nWI084n>S\2<gD3jLh0aTKo08<n@c\2 +M0?Y^03o=TLkocI5>olfDc_o=U4kj0Lm2l9e0nVN0:5C>h\FDC\35TDk4`I7>h?2oaGoohU6n8UF +m_lfAc_o=TDkogKhogKfj<DlREKhRDKfRdkhRekfRaI7>j55>nPj?hUFo8U6nZ5C>h\FDC\YE_XI +A_c7A_@00<M6lP00jbNhjCY@^6HjD3?0^P40D5;X4CR3a0R31U4k0H<FDc\0PdKb0H=Fm02;A_B; +E_8kA_alcWD5>eKjL\O6A_l1^>TjD>PN3UWo=\<kocK1>kQ:5E3o=\\kj5=\Pl@8^=DmD?lfbc^h +0@1@j6lfPl@6ocIc>[Qb5E3o=\\kj2m\Pl@6^=DmD?lfbc^h0@1@j4\fPl@6P3hf0@5d0nVT0:7S +>X\FhCXk1U<kMC0k5U4kMB[o=U<kocIA>kRH5E3o=\\kj>Y[Pl@8^=DmD?lfbc^h0@1@j0HfPl@6 +jfGo=U<kocIA>kS45E3o=\\kj<1[Pl@8^=DmD?lfbc^h0@1@j=`ePl@6P7ko0GD?X6HjV52PISZH +D;S[5N\;ocKS>_lfhCZh6AI@ocK;>nR3Jh?42;SE?E3o=\\k^080D>RO=H?41^\XocIC>olfDC^h +AQI@ocK;>nQIJh?42;SE?E3o=\\k^040D>Qe=H?41X0nA@41M0?YR02QicZ;5^Dj>`IG>gDY>aIE +>gDSocIG>olfEC^hO1I@ocK;>nPDJh?42;SE?E3o=\\k^040jdWo=ULkocIE>kRZ5U3o=\\kj?5Z +Pl@8^=DmD?lfbc^h0@1@j0dePl@6ocKW>_lfiCZhdaI@ocK;>nS9JX?42;SE?E3o=\\k^080D>SU +=8?41^\XocIG>olfEC^hoaI@ocK;>nROJX?42;SE?E3o=\\k^040D>Rk=8?41X0n?3\1M1N1?Tlk +081e1h<nCC\1M0RhjCY@j84aFH0nbP01MA21?RHn4S=d2;SE?E3X3@aIRnEM`eF;k3TVW01b0nR\ +C[Q`5e2hHAM@^5LGD;Pg5e2h4S=@j6EKPl@:ogH4^7`GD;PB<e3XE5^3a0JhRaM@^18cD>Q6FeUI +^<HGD;PB<e3X>E]IFOlf[`2hjQM@^>0GD;PB<e3X95^3a0Rh1aQ@ocJe0;P4652hkAM@^18cD>P: +Fh?42_lf8@6hE1Q@ocHM0KQB653o=Ql1^50HD?lf6`6hC1Q@ocJk0;Q9652h2aQ@^18cD>SDFX?4 +6?lf`@2hH1Q@^5HHD;PB<e3X_UZ3a0RhOAQ@ocK[0;Qj652hHaQ@^18cD>RTFX?42[RM653o=\L0 +^9XHD;R1652h4S=@j8YJPl@:^>@HD?lfc@2hhAQ@^:4HD;PB<e3XL5Z3a0[o=]<0^?8HD;SX652h +4S=@j5YJPl@8^1PID?lfl@2h5AU@^?DHD;PB<e3X@5Z3a0Zh<QU@ocKI0;P_6E2h71U@^18cD>PV +FX?42[Q=6E3o=]l0^4XID;Pf6E2h4S=@j0aJPl@:^6\ID?lfi@2hJ1U@^54ID;PB<e3XlUV3a0[o +=_L0^7TID;Q_6E2h4S=@j=aIPl@8ocKm0;R76E2hO1U@^18cD>S6FH?42<L6RD040>Rk<eg3EH_\ +ESTVW01b0nSKC<L6RD010;h045KXVTUIXl\kPck;>`1e65JhRQU@^18cD>R7FH?41\L6RD040>Ql +<h0nR401MBbh_QU@^18cD>QYFEUI<l1@E[S66E2h4S=@j5QIPl@8^?LID;PB<e3XBUUIFKSi6E2h +00Q@j948FEVScc^h1AY@^008D>R125UIXldk^0l1D;P90E2h[`1@^1@JD;PA6U3oMPKoMPCX]b^3 +a0j0?\@00GD8^1PJD>QboEV0?[800GDGP3k:005d2lH6bP01a`K;~3aPJ8@060?P`10G@8^2LJ +D>Q5oEWXF>7XBmGXgOWX`C8c`>\0GUg3EH_\PN`60UIGRgH4Rgh:>BJL0783j=5;^4TJD8f6n_e@ +j95YFEV=Q_[mD8e6oU2hBQY@E^R_Ih?428U6o8=no09m;_le^5PJD?lfbc_X<VN3a0JheCe@ocK; +>kP4053XCS63a0IFogH<j;XLFEWXBC:=Q_[mD>QR8UV;A_hkAPIe5Hf6n_e@ogH8j?UXFET;`7D4 +\07[1;00joYOGX_UGL=ERnaFEh]n18]f1STVW01b0nPdBh1m0P5dCKQh6U3X]b5IR@BheCe@^7hJ +D;P1053Xg323a0JheCe@^:hJD;P2053XbS23a0JhmaY@^=HJD?lfbc_XRVJ3a0JheCe@ocK;>kSo +on\TogD3j6\QFHT4ocBhoAY@ocK;>nQTIX?41[SE?E3o=\\k^040D>R0<8?41UmNGL=ERnb3k09F +Eh]f18]n1STVW01b0nRKB\L5~2P7`20G@D^=DmD;PS6e2h0@1@j4T`Pl@6jeUG^5<KD?md0nQ_ +IX?41XU6oX=noP5d8?md0old^5LKD?lfbc_XkfF3a0RheCe@ocK;>kP30>\KocFhOA]@ocK;>nSB +IH?41[SE?E3o=\\k^040D>S^;h?41UmNRnEM`eF;k8?\0UIGRgH4Rgh8>BJL0783j0M:adEJoon0 +O081M1FheCe@^:DKD;P1053X]2n3a0KYQP0c`50c`53oM0?oMPKXcPb3a0R9A_j;A_hm0@1d33d2 +07@7?@<0M0;[=8]6o]7PReh60mSo=kSE6e3o=\\kj41UPl@6^=DmD?lfbc^h0@1@j5`_Pl@6RdKn +RDEJjbOoM0?o=;Sk6e3o=\\kj1=UPl@8^=DmD?lfbc^h0`1@j2l_Pl@6j`3[05mNRnEM`eF;k8?\ +0UIGRgH4Rgh8>BJL0783j4A9adEHoon0O081M1FheCe@^1\LD;P1053XlBj3a0KYP00c`50c`53o +M0?oMPKX2`b3a0R9A_j;A_h;`7@7?@40M0;[=8]6o]7PReh60mSo=kQ<753o=\\kj8=TPl@6^=Dm +D?lfbc^h0@1@j9l^Pl@6RdKnRDEHjbOoM0?o=;Qc753o=\\kj5ITPl@8^=DmD?lfbc^h0`1@j78^ +Pl@6j`3[05mNRnEM`eF;k5IGRgh4RgH6>BJL0783j8Y8P7d20GA=^9<LD>P=7eV91;SE?E2hVQa@ +^040D>Pb;X?41[SE?E2hbQa@^080D>PP;X?41[PI7E2hmAa@ocK;>nSPHh?41[SE?E3o=\\k^?oo +jbCoM@?X`AiIR@Co=;PP7E3o=\\kj;YSPl@6^=DmD?lfbc^h0@1@j=H]Pl@6GeiM`eF;k87\20AF +Eh]f18]n1STVW01b0nS`AlM5G_ooadELooo7AF;oolM5H?ooP7`20G@W^=DmD;Q67E2h0@1@j8h] +Pl@6^=DmD;Qf7E2h0@1@j7`]Pl@6jFd1SHKhne2=Q_[mD;RV7E3oM0?XV6>3a0R9A_j;A_hm0@1e +0nVE03d207@3jAT1RlL5H01@^:`MD8f6n?]@j6eSPl@6RDKlPgkl0GDLPgeR07`FM@J3OF00LPj3 +OF80O39o1X=mH?mf:\M5H_ooadEPooooM0?o=;R`7E3o=\\kj<MRPl@8^=DmD?lfbc^h0`3[7ome +H_meH;SJ7E3o=\\kj:IRPl@8^=DmD?lfbc^h0@1@j<8\Pl@6jK<0RlL5G01@^04ND8f6n_e@j>1R +Pl@6RDKlPgkl0GDLPgeN07`FM@J3OE`0LPj3OEh0O39o1X=mG?mf:\M5G_ooadELooooM0?o=;P5 +7U3o=\\kj3YRPl@8^=DmD?lfbc^h0`3[7omeG_meG;P^7U3o=\\kj1URPl@8^=DmD?lfbc^h0@1@ +j3D\Pl@6jbOoM0?o=;QE7U3o=\\kj?9QPl@8^=DmD?lfbc^h0`1@j0h\Pl@6j`1OGX_UGL=ERnb3 +k0AFEh]f18]n1STVW01b0nPUA\M5IP20adET0@20O081M1BheCe@^7\ND;P1053XcB^3a0K[L_md +0nR43EV9E_j9A_b1O_h0P7D6Pgkl0G@cRdKnReKlRDEVREETogEVogETj?@IFEU@^:\ND?lfbc_X +GF63a0JheCe@ocK;>kP10>\Nog@3ocBhdAi@ocK;>nPmHH?42;SE?E3o=\\k^0<0D>QI:h?41UmN +RnEM`eF;k8?\15IGRgh:RgH<>BJL0783j795a`@00;Sa7U2h0@9@j8L1FEV9A_j3OPP2MEKoM_jh +11m@ogH4j4QQPl@6RDKlPgkl0GD;ogKnj<TKFHT4jc3o=KP>7e3o=\\kj<1PPl@6^=DmD?lfbc^h +101@j=`ZPl@6ogH4ogH6j4HFFEWXeB_[E?mfo[Pa7e3oMPCXlV23a0J9A_b3O_`1M@_oM_kXLa]I +R@C[<?le^3lOD?lfbc_XJV23a0JheCe@ocK;>kP4053XQRZ3a0KoMPCoMPKXl1EIFNQo:oldj9\K +FLI50P7oM_kXVd1IGej;iEg3EH_\Pn`8EUN;OPR;MPXi9Y`0LP?XP4CoMPaFogH6ogH4j0XSPl@8 +REKlRDKjReh4BlH008=no01o37`6Pgkj07<4<l3[KeKXgF9IReh>0@N3E`80^0X0D5KXTaMIFHU6 +oX=noP1d28]No\H70>\;RdH4B8_F0m29E_j;GPb3Ae@1PeMF00_oM0F0?@1e1>\QjaaGj95RFHU6 +n?mfn5MFj;lFPl@62l1e1@=fn>\3jFKoRlK[SemNRnEM`eF;k8?\0UIGRgh6>BJL0783j<Q3RgH4 +E^R=@5V9A_j3O_h0MBYG<l1@E[R97e3o=\\kj41OPl@:^=DmD?lfbc^h101@j5`YPl@6j60ZjcB0 +?XQ00GD]^;@OD;PB<e3XBe1IFELc`51F^;`OD;PB<e3X>E23a0ZhlAm@^18cD>P[D5UIRdKnj`1O +GX_UGL=ERnb3k09FEh]f23TVW01b0nPj@lI40P37A0<00;Sc7e2h0@9@j4[oFEV;n5Nh1R1@ogH6 +j1AOPl@6RDKnPgkn0GDSEkP@853o=\\kj9QNPl@6^=DmD?lfbc^h0@1@j;@XPl@6jbgo=;Pb853o +=\\kj7ANPl@6^=DmD?lfbc^h0`1@j90XPl@6ogH6ogH4j?XCFEUGj;@nFEmNRnEM`eF;k8?\0UJ; +MP@i9Y`0LP?XWD:3O540M3CoM57XADaIRDKnPgkn07@TE[QE853o=\\kj1ANPl@6^=DmD?lfbc^h +0`1@j30XPl@6j0lLGX_UGL=ERnaFEh]f13TVW01b0nQ=@X1l0`5d=80nR401MBNhKB1@^18cD>P5 +CeUI^7DPD;PB<e3Xn4iIFKR[852h4S=@j>]>FEVhoooYP`0c`52h0@1@og@4ogH6j?T4Pl@8RoR; +gh?k0gL?dN<^ojMF>>\Ojag[6n\Iog@4^:dPD?lfbc_XLef3a0Ko=\\kj1ScFH0nR401MC>h`B1@ +^18cD>R=CUUIRlOAh8]N1P?HocNhbB1@^18cD>QeCX?41[Si852h4S=@j6M>FEV;anUjoemNGL?h +=o@glSOf=eF;k5IGRgH4>BJL0783j7=1P7`30G@cP3j8@05e9kSk852h4S=@j2]>FEVh0b5@^18c +D>PNCUUI^3DQD;PB<e3X4DiIFKSoon]k<l1@^040D?md1?mf1^PP18?428_hRlL;`7@7?@40M0;[ +0^\Iog@4^3LQD?lfbc_XXEb3a0Ko=\\kj4KbFH0nR401MC>hBB5@^18cD>RkCEUIRlOAh8]N1P?H +ocNhDB5@^18cD>RSCH?41[Qm8E2h4S=@j9E=FEV;an^3GeiM`eF;k8?\1UIGRgH4Rgh6>BJL0783 +j:A0P7`30G@gP3j8@05e9kQo8E2h4S=@j5a=FEVhQb5@^18cD>Q?CEUI^<@QD;PB<e3X@TeIFK[o +okSoonTG0LM6o_ooadKloon=A_a@^<HQD?md1>Q<G8?41XU6nX=nnP5d6Omd1;S:8E3o=\\kj<iK +Pl@6ocK;>nQclEV3OEX3MDV3O_h0O1Me1X=no05b3h=noP1l<gl7PGkloGmf:_mfo_mfo3?0^_eo +D58c`;X1051B^>lQD?lfbc_XPE^3a13o=\\kj2KaFN]=PgeJ0WE7Pgkn07`GM@J3O_`1LPn3O_h0 +O3=o1h5no?moMR[oM_koM_`c`;[oOe1B<l2j0@1@D[PT8U3o=\\kj39KPl@@ocK;>nSGl5V0?XQ0 +0GD^^5TRD;PB<e3XC4aIFOmfo_mfo;QQ8U2h4S=@j3U<Pl@8^:4RD;PB<e3X:daIFH]FoX]6o>WV +oUmNRnEM`eF;k8?\15J;MP@i9Y`0LP?X=cn0O0<1M3J0?XQ00GDW^:<RD;PB<e3Xkd]IFKR[8U2h +4S=@j>9;FEVhib9@^18cD>SEBeUI^P20^040je>3O0@0M0R;G0B0?`1e2Xe6o53XY3AIjc?oM0CX +IPIIREKnRDKlPGkn081e7h=no05e6Omd1;SY8U3o=\\kj5AJPl@6ocK;>nSikeV;E_j;A_c[Zej; +iEg3EH_\Pn`4EUN;OPHi9Y`0LP?XSch;og@5P3d0M@JhoooYm`37A_cooc?fjIP0RlJj1@3gjX]N +20?HocOXmEaIRDKnogKnEh_6^PD0mnZ;GPP3f?lgj1HAPl@62l1eIX0nR401MCJh4B=@^18cD>P3 +BeUIRlJj1@3gjX]N20?HocNh6B=@^18cD>SXBX?41[Q48e2h4S=@j=Y:FEV3O_`0O@F9M_c[7[SE +?E2hAR=@^0<0D>Re8h?41UOoMPCX8@mIFNUIodJ;a[X50?OZReh80mR3?`1d0nUDoh=no01m=H0n +R401MBVhGb=@^18cD>R2BUUIEkQW8e2h4S=@j7A:Pl@6^9XSD;PB<e3XITYIFNT;on\6RdKlj@Ko +Gej;iEg3EH_\Pn`4ESTVW01b0nQc?C?9je_7A_h008U>o3?fjc>;A_j;E_b3hP4U~22m1d4X]6 +oX]Fo=7XdMXcEPHcAPS[2X]6oX]Fo=7XdMZ9A_j9E_a6Poh8L\R;`M7PdN2;GPX3f8]6oX]Fo8U7 +0XTG@C]>17:PGX_UGL=ERnb3k09FEcTVW01b0nSi?8=n1P1d28]N1X0o07D6^?kojI<0ogH6j6mK +FHU6o[oooc?fjfn3OPP0MA:;a]7PReh40mSo=nQ@FeV9A_j3OPX0MBWoM_koMPJ;a]7PReh40mSo +=nQ\3h?41P_0M@b3oome18_nj`>oo_o[9omfo_mf1X_6dN2;GP@3f?lgj>h>Pl@62l1e38?oogD4 +Rok[0konodJ;a]7PReh40mR3?`1ePh_7jF[oGej;iEg3EH_\Pn`:EUN;OP@i9Y`0LP?X>3b0?XQ0 +0GDa^9`SD;PB<e3XmTQIFOme1_me2?me2[RT8e2h4S=@j>18Pl@:^<hSD;PB<e3XdTQIFH0nR401 +MC2hd2=@^18cD>RnB5UIocGoM@;oM@Bhf2=@^18cD>RYB8?42[P2952h4S=@j9]8FEV3O@Y6O@Lc +dS?0jF@1adKn~2adKl~2adKf\PO[Ah56o6d1PeKn08]6m[\409Wgn`_BMBj;A_JkI02Imo\;dWD= +RdKf^i01VOOk2m9e1KP10>\2<l0m0@1e28=6o063E_h0odKfRdD:1F`7>dKfOjk7A_H00>]MRekf +dN>;Qg4OV@56o15FoX=nmP5eA8]52PE\1k\409Wgn`_BMCB;A@X5K0NkI02Imo\;dWD@RdD:1F`7 +^i01VOOk2m9e1KP10>\2<l0m0@1e28=6o063E_h0odKfRdD8>dKfOi^;A@I8V@56o15FoX]>oX]N +o;X10;R0DNSL:52;A@ABVE1B<m:h40iIFnS::5]I0lPCfX]50YUADe1B<m:h?01IFnRb:5]I0lPC +fX\5V@?84mZ9G_Z9C_R0?XQ00GD^^0@TD;PB<e3XE4MIFOmfn_mfn;P<952h4S=@j457Pl@8^3<T +D;PB<e3X<dMIFH]FnX]6n>VIoUmNRnEM`eF;k5IGRgh4RgH:>BJL0783j3hjadAA~2adAH0@37 +A5X10<M4G_ooadALooo7A6;oolM4H?ooP7d30G@aP3j8@05e9kPe952h4S=@j==6FEVh?BA@^18c +D>S6AUUI^7LTD;PB<e3X^DIIFNWP08=m101dEOme15KXXeMIFEJhNBA@ogH6j0\APl@6P3j8@05e +:KQm952h4S=@j8E6FEUF^8DTD;PB<e3XMdJ3a0JhZRA@^18cD>QYAUUIE_mf2>Sn4eUIRDAAja>h +[2A@E^Q=EeUIadAA4S?6A5<1PgaA07DTE[Rc953o=\\kj?eDPl@6^=DmD?lfbc^h101@j1TOPl@6 +j1dPP7aC0G@9E^Sb55T:`7DiP3j8@05e:KS?952h4S=@j?]5FEUF^=LTD;PB<e3XkDF3a0Jh0BE@ +^18cD>SOAEUIaTAC0EKX`1aIGeiM`eF;k8?\0UIGRgH8>BJL0783j>`haT@20<M40`00^0<UD;P1 +0U3Xo?AIFH_hEkP99E3oMPKXaUB3a0J9A_j3O_h1M@iGj4T?FHU40lI40P7[;Old^10UD?lfbc_X +>eB3a0JheCe@ocK;>kP3053XEaj3a0KoMPKoMPCX`@UIFEOXNcAIGej;iEg3EH_\Pn`FEUN;MP@i +9Y`0LP?XHcS7A_h0P<M6o0402oId1H0l07D9^P20^040jH01P3j8@05e:KPc9E2h4S=@j0E5FEUF +^3\UD;PB<e3XmdB3a0JhJbE@^18cD>SYA5UIadKd\PO7A_810<M6l040adK^~2adK\~2adKZ~2 +SDKZD8e6k52=A^i@SDK`D8e6lU2=A_A@^6dUD5KXeU>3a12;n8?o0G`5Pol6ORAF^8\UD?lfbc_X +Ee>3a0JheCe@ocK;>kP3053XLaf3a0KYE_n1O_Bb1g`7PGkdm@Mn2?mfm;R_9N_:PFkdK0N3O_81 +O0J3O_8<OPSoM_:hi2G[\Om>lX=nl05l1X=nl1mn2?mfl;PC9^^JPgk^07`6Pgk^5gh8ogK^^40V +jhJ3O^`0O0J3O^`kOPWoM^bhKbKYLOn3O^X0O0J3O^XkOPWoM^ZhX2KYG?o7A_H00<M6n000adKj +~2SDKZD>S0nUV9E_j9A_b0?XQ00GD^^=4VD;PB<e3X`d=IFOmfo_mfo;SI9U2h4S=@j;13Pl@8 +^00WD;PB<e3XXT=IFH]FoX]6o>UmoUmNRnEM`eF;k8?\35IG>BJL0783j;0faTKe0KP29e2h011@ +j<GbFEV9A_J;MP@con\1AX0l07@<RPBHRmSfQn\a0GG^P3`0M@GY107[0hUfn>\1AX0l07@?RPBH +RmR:Qn\aV:T107C[RGKlRdKl:dKh@8U6n_mfn_mfn?mfm^PdEH?41X]NmP=Nn\H708_7dN2;EPH3 +d8?215:h2bM@ogKfj21BPl@6RDKnPgkn0G@[ogKfRlM0D;P?9e3o=\\kj9iAPl@8^=DmD?lfbc^h +0`1@j;XKPl@6aTKe08_7dN2;GPH3f8=o1?ml48_7dN2;GPH3f85o1?l0OSB;ad1@RlOAh8]N1P?H +ogL4^40WD?lfbc_XBe63a0RheCe@ocK;>kP3053XIa^3a0K6A_D0RlOAh8]N1P?HPgl4ogD?RlOA +h8]N1P?HRdH8RDL4AnWPoX1nm@5e:h7o005d9ENhLRM@ocK;>nShD8?41[SE?E3o=\\k^0<0D>PD +6h?41\I6m@3oM_KX?C5IRTKej`1OGX_UGL=ERnb3k0YFEh]f13TVW01b0nPP=KRQ9e2h0@9@j3Wa +FEV;n<M4F040adAJ0@37A5koolM4G?ooadARooo7A63oolM4EP00adAD~2E^S83UV9A563O540 +MBAF^:PWD?lfbc_XJ523a0JheCe@ocK;>kP3053XQ1Z3a0KXR1^;GPS61`36A_\1ogH8j3MCFHU6 +o8=4E063E5H0EULc`;X00U1Bj2HCPl@8REKhRDKfPgkh07leO0J3O_H0Lbf;G57gA`8P07@3jI40 +^=DmD;S?9e2h0`1@j2<JPl@6<l1@E^R?1EUIj?T=jfS6QOl10;P:051Gj?H5FEV9A_j3O_h0M0J; +G_k61`1Gj;UBFH]Fo0?@REKlRdKl>dH6O`]GogH8j7EAFEW[<?mfo;Sa9e3o=\\kj9Q?Pl@6^=Dm +D?lfbc^h0`1@j;@IPl@6EeKX8PEIFLI6n`3[0nT]oh]6o3]61WdWogKl^20XD?lfbc_XGDn3a0Jh +eCe@ocK;>kP3053XNAV3a0K6A_\0E^Sgl5UGj9l_FHY6nn\0Gej;iEg3EH_\PN`F0UIGRgH4Rgh6 +>BJL0783j7hcadEH0@37AEX10<M5G_ooadELooo7AF;oolM5H?ooadEF~2adED~2EnPe3EV9AE63 +OE40MBAG^54XD?lfbc_XeDj3a0JheCe@ocK;>kP4053XlAR3a0KXmAVhMBQ@^00@D>PmkeUIRDK\ +Rek\aPL0aTKa0NT\0_mfk>RADEV9A_Z3AE@1PeEF05N=Q^[mD3?0^P02D5;XO163a0R9E_j9A_b3 +O_h0OcYl1X=no01c<X]MDOM70R00M0?Yk`6heCe@^80XD;P3053XNAR3a0Hc`51Gj>D3FEWXC`c6 +A_40jL41aTKX2\I6j@2h8`1@SHKZoE3X@0AIFHU6n8=nn01d3h]Nn<H72_m6n8]Nn<H70;P:052= +Q^[mD>PJ15UIRDKfPgkf07@6RekfaPLPSHKZoE3XfE1IReKj0m29E_Z0O081M@n0O0`1M@V0O0L1 +M@?Y]`1FSHKZoE1Gj7kcPl@6RDKbRekb@h?k0gMbdN<^ojOUBNVA08]6l[X50?OZRmR0N081MCf; +A_:j1@3gjX_Hoc2hWbQ@ocK;>nQjCH?41[SE?E3o=\\k^0<0D>RF5h?41Xf6j_e@EnP00eUIaTKa +0>\IRdKb^PD0mnZ;eP?@DXf6j_e@EnRUn8?41^\Y^>PXD;S8:53o=\\kj2Y=Pl@6^=DmD?lfbc^h +101@j4HGPl@6j4XHj`3YV@2=A^i@^?@XD?md3NQSCH?41XU6m8=nm05e3H=nkP1l1h5nk_l0ORSo +M0goM0Zhn2Q@ocK;>nSEC8?42;SE?E3o=\\k^0<0D>Sa5X?41^]4PGkj011o3hf6j_e@ogK\j7M> +FEW[=?mfn[P\:E3o=\\kj9Y<Pl@6^=DmD?lfbc^h0`1@j;HFPl@6SHKZoE1Gj202FEW6A_40j`V0 +O_41M@?YboeGj1k^FH1l0P5d:?ld^5PYD?lfbc_XDdb3a0JheCe@ocK;>kP3053XKaJ3a0K6A_40 +jgN0O0`1M2WoM0ZhPRU@ocK;>nPTC8?41[SE?E3o=\\k^0<0D>Q05X?41\I6l@3[B81l1`5d:Omd +1KR\:E3o=\\kj?E;Pl@6^=DmD?lfbc^h0`1@j14FPl@6aTKa0>\Iog@3j<\6FH]N28T7og@8j;l6 +FH]N28U70X1nl@5e4_mfk_mf2?mfk>QEnH?41XQ6lOmfk>P7;5V:A_6Hj`1OGX_UGL?GAmY7fTOJ +AeF;k5IGRgh6>BJL0783j>@_<oK[3X_6dN2;GPX3f<L7oom6>gH8O>dcm^];Rmj:0ISAh8]N2P?H +PcooMA2;gXX1V=7PReh:0mR9=n\YRmj:0IQ@^=HYD?lfbc_X<4^3a0JheCe@ocK;>kP3053XC1F3 +a0KXD1I6>gH4O;1OGUg3EH_\Pn`2EUN;OPB;MPHi9Y`0LP?XGRmG^0\ZD3?0D>RD1X?41\L4~2 +ad@2~2EUOoMPSXZO^3a0J9A_j3O_h0OBAG^0lZD?lfbc_X`4Z3a0JheCe@ocK;>kP4053Xg1B3 +a0KXh1EG^3TZD?lfbc_XW4Z3a0JheCe@ocK;>kP1053X^1B3a0KoM0;o=;QP:U3o=\\kj7M:Pl@8 +^=DmD?lfbc^h0@1@j9<DPl@6Gej;iEg3EH_\EUN;MPB;OPHi9Y`0LP?X[bh;og@hE_mdE_mdE;R@ +:U3o=\\kj39:Pl@:^=DmD?lfbc^hoom@j4hDPl@6EkR_:U3o=\\kj15:Pl@6jaEFogAFogAD^;XZ +D?lfbc_XnTV3a0ZheCe@ocK;>kSooe3X5QB3a0IOGUg3EH_\Rdh4>BJL0783j3T^<m;[4X_I0mZ: +1cY61WD6Rl43`^\>@X_I0mZ0?`1eiC?0jo1M`eF;k8?\15IGRgh4>BJL0783j00^<oK[F8_NRP6H +RmSfQn\a27@<Rmj:0IQ@j00TFN\5Rmj:0IR9A_j;GPJ:09R;f?J7jc48M0f;GPJ:09Q@j=`SFN\6 +Reh6RP2HRDKlRdKn>dKlM0R;A_h[A_c[54J;gX0i07FQReh6P3P0MITc`>_ZGej;iEg3EH_\EX]> +18]f1STVW01b0nQh;C?Bjb:;f@?JRPN;fSX0M1F;f@?JRPN;fSX0M0Fh0@3[0S?0jaY2>eH8OA2; +f@?JP3l0MM2;fX0h07G9<l3[i5iM`eF;k8?\15IGRgh4>BJL0783j28]<oK[F8_NRP6HRmSfQn\a +27@<Rmj:0IQ@j28SFN\5Rmj:0IR9A_j;GPJ:09R;f?J7jc48M0f;GPJ:09Q@j?hRFN\6Reh6RP2H +RDKlRdKn>dKlM0R;A_h[A_c[6DHkMPQm3h_NP3T0MIb;GPJ0>01eU3?0jnEOGX_UGL=ERnb3k09F +Eh]n13TVW01b0nRD;5OX84]IRDKnRdKnB8_`ja2;gXX1>TH6M@J;a`?6j`U>2oImk3?0joEOGX_U +GL=ERnb3k09FEh]n13TVW01b0nQB;5OXgTYIRDKnRdKnB8_`jaV;gXX1V53oMPKXk_eIF@_0M0J; +a`?6j`U>2oImhc?0joEOGX_UGL=ERnaFEh]n13TVW01b0nP:;3?fjaV;gXX1V53oMPKX\_eIF@_0 +M0J;a`?6j`a6Rmj0>@1eh3?0jo9OGUg3EH_\Pn`LEULi9Y`0LP?XcB^0?XQ00GD^^=TZD;PB<e3X +RcQIFOmf1_mf1;SQ:U2h4S=@j7PhPl@8^0\[D;PB<e3XJSQIFH=n1P1o>7`6Pgh407<`ogH6ogH4 +^0d[D?lfbc_X4TN3a0RheCe@ocK;>kP2053X;Q63a0K7APH00<M61000adKf0@37A_B0DLM6k^41 +adK\P3>;A^j;E^b1`X1A5@40RDKZREKX_[87RlJk102Imo\;dWDPRlJkI02Imo\;dWD<RlJkT06I +mo\;dWD8RdKZReKXj`J;A^j;E^b9A^J9E^B;APJ;EP@kA^Il5GD5>eKTLPj;A^J;E^@YEP@IAPK[ +0^\3A^^S<on;gm7SRhMa7iV9E_:9A_23o`5e;8_6^`@0VOOk2m9e88_6^f@0VOOk2m9e38_6^i01 +VOOk2m9e28=6l063E_80RdkfRekdReKbRdK`j8\H>eH6Oaie1C]617LGRdkfRekdReKbRdK`j70H +:DH46EH6j`;[0dO[RDOoM_KoM_CoMPKoMPCXb1F9A_koA_koM_KoM_CoMPKoMPCX`QF9EPJ9AP@c +`;X@3U1BogH6ogH4j9dERDKl<l2j40i@D_mf1_mf1>RI5HUF1XU613?0^S`0D5;oMPKoMPCXM1F9 +A_Xc`;Xl051BogH6ogH4j70EREH6RDH4RdH4RDKhogKhogKjogKlogKnEeJh=R]@^8a4D>QGAH?4 +4;QD:e2hS4A@j1A7FEV0?XQ00GD\^5T[D;PB<e3XK3IIFKR<A52hHB]@^18cD>QK=X?41[RI:e2h +4S=@j4dfFEVhS4C[05mNRnEM`eF;k8?\0UIGRgH4>BJL0783j5`YE^SXAeU0RDKnogKnj1TVFH_h +2ome9eKoM_jhVb]@ocK;>nS@A8?42;SE?E3o=\\k^0@0D>S\3X?41^S`3eIGj>I6FEV;an\0Gej; +iEg3EH_\Pn`2EUN;MP@i9Y`0LP?XnRP;mW@5P3`0M@B;a^\XE^QiAeV9A_j;aP=6oTR;n>\4aPD0 +Cc_nLPb:1IR;f?J7jc41MNc[e5mNRnEM`eF;k8?\E5IGRgH4Rgh6>BJL0783j:PX<l1@SDK`D8e6 +mU2=AZa@ogH8j>@<Pl@:RDK^mdK^0P1e4`_fM0nh201@EXe6mU3XI4N3a0KgA^h407DC2omd3kP4 +051GSDK`D>Q:Ah?41_mf23?0D8e6l52=A_I@SDJ\D>Pb1H?42UmNRnEM`eF;k5Hi9Y`0LP?X;RSo +MPBhcb]@^18cD>S`=8?41[PB<e3X?c9Io`kb<W`>Rakl<_l6o3::1k@0j`RhlS9@j6liFH_`Poko +MANheCe@^=\[D;P3053XZPf3a0JnCP3[4_J4jc48M0MFj>\MFN\2RlJ;l8?nCW@5PoiIMJZ3oUUe +1;01j`:`0>\0GUg3EH_\PN`T0UIGRgH4>BJL0783j9XWadAHooo7A5[oolM4G_ooadALooo7A6;o +olM4H?ooadAV0837A6@10;Sj:e1Fj1\dFEV9A563O540MBMF^?d[D?lfbc_Xk4:3a0JheCe@ocK; +>kP3053X20f3a0KXi`3YgP1Fj>@2F@[0MD60?XQ00GDY^1l\D;PB<e3XkC=IFEJh9ba@^18cD>SO +<h?41[Q@;52h4S=@j=4cFEUFj4_TFLI4D`77A5400>VD0?mdDKP00U2h0@1@SHKjoE3XU3B3a0R9 +A_k7A_`003?ojaV0^o[m3GDARmm3SHKjo@?HP3l:M@?oA_a7RdKnB3_7MmmFj?OSFLM4D@00RdKl +^U00mnXkA_ic1lM4F000j`G7A5P10<M4FP40SHKLoE1Fj;92FEV9A_Z3O_X0M0MF^58\j@goRhKd +oH^Fl_f9A6J9E6AOGX_UGL=ERn`i9Y`0LP?XB2Ko=Y@0j<=4FE2hM2a@ocK;>nS=@H?41[SE?E3o +=\\k^?ooD>SY2h?41Ug3EH_\EUN;MP@i9Y`0LP?X32J;A5P;`7@7?@40M13[4kR9;51Fj:LbFEV; +n>\\^8`\jo3oM5RhSba@ocK;>nQf@H?41[SE?E3o=\\k^0<0D>RB2h?41S?0jbh;ogDVE[R`;53o +=\\kj4e1Pl@6^=DmD?lfbc^h0`1@j6T;Pl@6j4Sojm:;an_@GeiM`eF;k5IGRgH6>BJL0783j84U +Pgh40GA9E^Rf05T:`7A0Pgh40WDdE[SB;53o=\\kj?U0Pl@6ocK;>nPKoEVH2l1e5[SE?E2hlBa@ +^?ooD>P82h?41S?0jgG[1UJh1Bg[9h]4F0_0M0Lm0@1d4>\C^1H]D5KXcC5IFH_hjb>h6Bg[l?md +F;PL;E3o=\\kj9a0Pl@6^=DmD?lfbc^h0`3[[P_oMBIF^3d]D?lfbc_XO423a0JheCe@ocK;>kP3 +053XV0Z3a0KXMok[Rh_7jhUOGUg3EH_\>BJL0783j;DT<l1@ogH4j;hTFET;`7D5^040j`8c`>\0 +GL=ERnb3k4aFEh]f18]n1STVW01b0nR490_fM@;[:3?0D3?0D8e6mU2=A[A@EnRm28?42ULc`51F +SDKfD8e6]53XA`63a0YOGX_UGL=ERnb3k0AFRgH4>BJL0783j3dTReaARTL4V8U6o_mfo^SV45V9 +A_b3O_`0M@J`0N\6j`B`0>_hGX_UGL=ERnb3k19FEh]n13TVW01b0nP095OXS?YIRDK^^2h0D?mf +k^RVmEUIRo0;mW@H^0@0D5J=A_1@j<Q2Pl@6aTKd0<H40>\=^60]D8e6l53XSd5IFKP8053oM^j= +A_I@j:52Pl@6aTKn08e6mX_`jaF:19Q@^64]D>QBmEUI2l1e0lH4GdJ0?01eiXe6lH_`jaF:19Q@ +^:\]D>PamEUI2l1e0lH4GdJ0?01eiXe6mU2h[4A@j2]1FEV=A_1@^:a4D>Rf@5UI^:a4D5OXiD1I +F@_0M2Fh[4A@EkSe;E3o=\\kj<\nPl@8^=DmD?lfbc^h0P1@j>L8Pl@6^:a4j`1OGX_UGL=ERnb3 +k0AFEh]f28]n33TVW01b0nSk8[PV;U1Gj;m0FEV3OP@0M4f;GPB0?`1dAKQ0053oMPAGj891Pl@6 +ogH4j5m1FHU6oX]NoP=N18Y7oiQ@^2L^D>Qam5UIRDKlPgkl07D@Pgkn@7d:^2X^D5OX141IFH=n +1P1d3[P8053oMPIGj3M1Pl@62oId9H0l07@PP3`^M0nh;2i@EnSH?eUI^0<0j`>h101@EUOX3T63 +a0IOGX_UGL=ERnaFEh]n23TVW01b0nQ:8_mf1;P^;U2h4S=@j0`_Pl@6^18cD>QK;5VhlS9@ogH6 +EnS<;8?41X_`2oIe6;SE?E2h<Ri@^0@0D>SE1h?41^RdnnSF2;P:051Gj;GcFEV;l0_fM0?6101O +GUg3EH_\Pn`6EX]f2STVW01b0nSK8LM6oP00adKl~2jdOoM57XCc=IRDKjPgkjogDTReaAmdL2 +401d2;[ookSnon\oRdKl2dKnM@Rjoonhooo[k^\UReh80eklRTKjR0N3A_`1PeKn08]6oX]Fo3]6 +1Wb^M@DkEPAbYh]FoX]6o>^oGX_UGL=ERnb3k09FEh]n28]f2STVW01b0nQB8OmdDOmf15OXkR^3 +a0J9A_j;GPA;aP40Pgkn07DTReaAmdL2401d2;[ookSnon\KReaAmdL2801d2;[ookSoon_\EnRM +?eTcd^_SGej;iEg3EH_\Pn`4EUN;OPR;MPXi9Y`0LP?Xjb23O5P1MAIFEomf1_mf1>Qaoh?428UF +oXU6o>\mReaAmdL2801d2;[ookSoon\cogAAogH4^040D5OXJ2j3a0S7A_h008U6o8]LDOM70Q00 +M0Rjoonho_o[dh]FoX]6o>_;Gej;iEg3EH_\Pn`>EUN;MP`i9Y`0LP?XL237A_800<M6o040jOl2 +RdKldN2;GPH3f8\7RDKnP7`30GD5aPJ8@060?XQ00GD[^58^D;PB<e3X1beIFOmfo[QJ;U2h4S=@ +j?L\Pl@6^8D^D;PB<e3XjBaIFH]NoXX7V53oMPSX`_5IF@_0M@?Y@P:hQbi@ogKnj9@mFET;`7D3 +jBl2Pgkb07@7ogKbj=lKFH]6oT1@j6WfFHU6l_mf2_mfl^RaleUIRDKfadKd~2Pgkf07@=Rekf +aPL0RdKf@8U6m?mfl^Pi?UV9A_Zoooo7A_P00>V50?mfn_mflX]6n;X60?OZRmSo<>Q?lX?41P_0 +MFH;oge0RgkhP3j8@05e=;R9;U2h4S=@j3D\FEV;A_Rj1P3gjX_Hoc2hTBi@^18cD>PL;8?41[Rm +;U2h4S=@j0h\FEW[8X]6o=7PReh60mSo=kRo;U3o=\\kj;`jPl@6ocK;>nQQd5WoA_R;A_Rj1P3g +jX_HPcP0M0?YJOl;ogdRRdKldN2;GPH3f?lg^=P^D?lfbc_XPCZ3a0Ko=\\kj2K@FH=nmP1eE8_7 +^PH0mnZ;f81h0P1e9h_7^PH0mnZ;f?l`^1@_D;S_;U3o=\\kj4LjPl@8ocK;>nS\ceW[6h_7^PH0 +mnZ;f<I00`6;akX60?OZRmS7@0@00>W208]Nm80o07DURdKldN2;GPH3f?lg^1L_D?lfbc_XoCV3 +a0Ko=\\kj:;?FNVE08_7^PH0mnZ;f81h0P5e9h_7^PH0mnZ;f?l`^6<_D;Pj;e3o=\\kj<HiPl@8 +ocK;>nQ[ceW[Gomfm>RZm5U@RlNj1P3gjX_HF8U018_7^PH0mnZ;f<I00`60?XQ00GDd^6H_D;PB +<e3X_2YIFH_7^PH0mnZ;f?m`1;Q^;e2h4S=@j:<ZPl@6^9X_D;PB<e3XUBYIFN]JjeR;GPj0O`<0 +MAn;GPk6A`<1RdKldN2;GPH3f?lgj33dFH]N3XU71>\`Reh@P7l307DOReh@aTL30H]6o=7PReh6 +0mSo=nP8m5V;GQ29A`C[2;RL;e3X\<iIodKlRdKl>dH4O@?Ym_aOGX_UGL=ERnb3k09FEh]f13TV +W01b0nPo7H0nR401MCBh^Rm@^18cD>Sm:EUIRlH5I01@j<8PFE1F^<8_D;PB<e3Xi2V3a0RhkBm@ +^18cD>SF:EUIRlH5I01@j4LPFH_hPgd:D7ePogAVogATj0_aFEU@E[S_;e3o=\\kj7<hPl@8^=Dm +D?lfbc^h0P1@j8l2Pl@6^=DmD;P?<52hoom@j7d2Pl@6E[Q7<53o=\\kj40hPl@6^=DmD?lfbc^h +0P1@j5`2Pl@6ogAVogATE^Qh18?41XU6oX=noP1d;h_61F@0D>PC85U@E[Qe<53o=\\kj?hgPl@8 +^=DmD?lfbc^h0`1@j1X2Pl@6j?Wej`1OGX_UGL=ERnb3k09FEh]f13TVW01b0nPa78]LDHY719R; +n8]4F0_0M0Lm0@1d4N\D^020D5OXK3IIFHU6o^\\^010jnnh^c1@^9\`D?lfbc_XT3N3a0JheCe@ +ocK;>kP4053X[063a0KX\0:3O_h0OBAF^<T`D?lfbc_XISN3a0JheCe@ocK;>kP3053XPP63a0KX +HOEOGX_UGL=ERnb3k5QFEh]n1STVW01b0nRK6`_oM0?61@23OPP0M0J;GPS61`23OPX0M0J;GP[6 +1`23OP`0M0J;GPc61`37A_X008=n101d28]N180o07D6RdKjjJ<0ogH4SDJXD>PI>EUISDJXRo2h +jC1@E^SHkUUIRDKnPgkn07@\Pdkj20_oM1k7A_`00>\9RPB81DI7odKlPgkl@7d5>gKnM^c61@3o +A_j;M_jh;P1@E^Rgk5UIRDKnPgkn07@PPdkj18=n2P1d4;P4053oM_koMP[XbcV3a0J;G_k61`20 +?01d68=>nP:3OPP0M0jh201@E_mf2>RX>H?41^UGoemNRnEM`eF;k8?\8UHi9Y`0LP?XWQZhk31@ +j50]FHU6oX=noP1e8[S_<52=A]i@j4hhFEVhlc1@SDKND>SI=eUISDKND>PM<eWXTSb=APA@j:dM +FH_`Pg`@07hARaHZ>Z4X>PG`lH?Bon\;j`V;5RXjXBPjjo=NRnEM`eF;k8?\15IGRgh8>BJL0783 +j2DJadKn0@0cmX]N14>3n`Eg;M7S;_nWYf37A_ck<>]9adKlo33[4lM6o04aj`c7A_`<<N\5adKl +5C6n0@3[:[Pn<E2h7S5@ocK;>nQb=H?41[SE?E3o=\\k^0@0D>R>oh?41^RB0>R?08=n1P1d28]N +1X0o07DARdH4>`J9@7h6RdH4XhU0jej3OE40M@G7A_h008=noP1d3@_fM0V1OE4B<gD2<oH;mW@D +ogH6ogKl^4\aD;PB<e3X?2J3a0R3O_h0M1?oMPKoM_bhDC5@ogEAj2<VPl@8RdH4>`J9@7h6RdH4 +XhU0Gej;iEg3feoDGmAOhUoYGo1OEH_\>BJL0783j2<IRaj9@8?k17LJdN<^ojOYH3?0D>PZ15W[ +3kP10>_d^080jnnh0`3[jUg3cf3?H=QPgF3RH5F;k8?\15J;MPXi9Y`0LP?Xg1S7A_h00<M6o000 +ja[oM56;GPP3G_b:1iQ@j:X^FEV3A_`1PeKn08]6oX]Fo3]61WcKM@DkEPAbe5j;iEg3EH_\Pn`4 +EX]f2STVW01b0nR<68]61X]F18U6oXUFo8=lGP1lDWl6PgaL07I:RdANReAL>dKnOcml1C]Fo7<h +ogANogALogKnogKl^5LaD?lfbc_XhS>3a0bheCe@ocK;>kP3053Xo_f3a0J;A5j;E5b9A_j9E_co +M57oM_bh0@1@ogH8j<<XPl@8GX_UGL=ERnb3k0QFEh]n13TVW01b0nSl5kP4051Gj?P[FEV9A_j3 +O_h0OBYG^94aD?lfbc_XMS>3a0JheCe@ocK;>kP3053XT_f3a0KXLO6hoooY;06=API@j0@KFH_` +R`Bk0P2Imo\U7`0U7`20I_SP24KhRd@29Cl09Cl0PFKh7oRa1M?P2DKhRd@49Al09Al0P6Ki1m7P +dN3Ah0Q6nH]41RDO02DO081Vn^08A_Z;A0Q09@l09@l0PFKj7oja1M?P2DKjPg`:D7dLP6Khh85V +n1ohP6Ki1h1Vn^21I_XOoX1Vn`7[5H]42PF`obEo02Eo081Vn`7Ah0Q6nhe6n53oM_kXg0]IFHU6 +o8=no01d=he61U3XW1YID5NhZC5@ocK;>nR7<X?42;SE?E3o=\\k^0<0D>RSo8?41^R2l?mfo^RZ +5eWY1oooM_kXX1MIRDKlPgkl07dTEkS?<E3o=\\kj4TbPl@6^=DmD?lfbc^h0`1@j6GlPl@6jM?n +<l3YdOiOGX_UGL=ERnb3?^Pa87D5^040ja>;7^PadN>;APB9Qoi4o`KX<C?0GL=ERnbd@c;0ReH4 +cB5b2H]N1XT?<l3[153Xm@9M`eF;k;A3\06;EPB;CPK=8G84<l3[153XfP9M`eF;k5J;MPBd6LdQ +]010R@ANGL=ERnaFRgH6RUH4o\Zd3\dQ]02915iM`eF;k8?\35IGXBXjRaHX>XU6n8UFmZ4\>XU6 +m8]>18]F1X_aRoZkh04Sf[45dn^3hQni0?hScm7YQ\gf`@=e1X3k0WH1@]7SRil8>P?JBhUNo831 +2XU>nX_1@=7XdNP3f;Q]0OOQ0mRh`:Sghm7PdM:FRmY@\@?Cj8QVo\I6o`19d^Ri?026`OKT0l6a +??OQFH?Q7m7Q0l4BeP?64m<3A_HCE_R3O_@0M2E@D_mfo_mfo3?0D?mfn^SV>0_0M0Fh40k[0S?0 +Ro1JF2_6PmX0Gej;iEg21033EH_\EX]f20_fMAk[3_l>j36;7^PadN?oUoi4PckX<@1ejnR5W?lF +k3;X3YgXSYb3OPH0MA<;mWD8oaK^<_lFl3;oMPCXWYaIGUg21P1ERn`c`51@ogH4j:KoGL=ERnbh +0@1@<l1@ogH4j9CoGL<c`52h0@1@<l1@j8Go`kP1051@<l1@j7Wo`eF;k5J;MPBd:\dQR@b9E09N +GL=ERnaFRgH4]2c=8HT<RE@2GUg3F@iA<lW[5UT>DKT10>\>F@iA^@80j`II3U6i0`1EEUN;k8_i +RdH:ReH<Reh>Rdh@2lUe20_BM6T;fgAUmlL107DL2m9i2_OJmmR3fP23c``;bGT:mmWgfh?I08?g +18_Y^B00Ec?o<oKAh=7BdMKAec_mLP]g13_cLPD[la_m@>;WFoO30P1d1X_6RmOAjoO3101d1oOJ +mmR3fP1OGUg:203gloO70P1d0I8cd^_]F`iCP?T@La2;f=?Pdn;ffH314=?[2m?;P>T@TS?0dn;; +F`iCP?T@La2;f]?Xdn[ffH314=?S2l?;P>T@TS?BdnS;EH_\EX]f10_fO1F3oUQn0kiG08TfHSB: +Q6@dV8_`j`gggX?n8goYa`IR=?ooRCJD0;SooeiM`P80EH_\EX]f15KX_?n;aUiM`P80EH_\^014 +Reh4cB6B9H00GL=ERnb3k29FE`J;OPXN1h]N28?k97MHP?\2LU>;APb;CPh;bGdAP7h607@;aPD] +AoOImmR3f@2=M]kS3i4[d_OcTOOcR1A6h`W[lB_Bmo>854H;`7GeSDkNmmT3c_a>RP@\2W<413[[ +0`961:[Rkk00ZPN;APYOGX_UGL8<05F;k3?0D?mf1_mf1;P:052`052`HE3XJ_mM`P@0EH_\Reh4 +dN>1Yc@doofd@XY62X]N18]>28]F1\dQLP;[1E3Xi?jIGL=ERnaFRgH8ReH62oIe0khnAOmf10_B +M@Fh_SC[0X_2D5KXLPeIFE3XT?nh`SA@E^RU;eUIRlINGL8605F;k8?\0UIGRgH6Rgh4ES?0D8<m +ogD5^080j`>h0@011H\5D>RNoh_`SDKnD5KXW_]IF@_0M=N;aUmNRnEM`P@0EYJBQL1d0_OSh`FA +mnH3`IKgh`?FG\=ERnaFEak5MPC4OPSldNWcYA?9lj@OGeiM`PP0EH_\Reh4dN?gQc@d0P1d1[P5 +053[4[@oReh4Rdh8ReH6cB5b0^\4D>P7oUg3EH_\Pn`ZEUO7A_`00<M6nP00jaV;OPcfA_lPM0O4 +?H=630C3RcdN1h=630;31_b;MPZ\2\1dGS`UM5fHUom6n_mf2?mF15T;`7`VV0_oN3:0_LPd0GD[ +T`[KN1R0_lPd0GDAodKjogH8oeH4F@_0OnKYCP?oMPQCoeH6FEWoC_[[\3_7M:coMPQ@oeH6FEWo +C_[Y@@?Y?P?7A_KoolI6o`2\V8Uf2YL;og`IRYg8=3;oPo\EMP?Y2@?AhbkoYkA\UnUgonT?0h1> +o`7[e8?_<8MnmP_oO<Zh2P3gi`56m^_0P4ko2>^jP4ko1>^dP4ko0^^^P6Kogn^XP4ko8>^RRdKj +:m;fA_l1M53[UKh80>\<_PX0j`Nn403[0S?fmlLP07D9PomHM0B0C_l4SDKhD8e6nU2;A_HUogm@ +E_mf2?mf1_mf1>Qh0h?43X=nn01n6?I6o`5e3om6o>RgoZ_fA_l4M0:BZnW6oW`3jFP2jE42j000 +jFH2ogH8D?mF1UUIodkjPFKfogoX~2jGD2DS`jM1D;`7h<ogH8D?mF1UUIodkjFXcKja_X~2jED2 +F`_0OQ1BDomf253oEPIIFOm>nU]JmTKo0GD@j4SnodKlTZ_fA_lPM0:CZnUCo^WS0He6n52=A_Y@ +^?mo8dKfD?mf2?mf1_mf1>PE3X?438=nn01n>8Y6oiRY0@1e:NP5o_m6o?I6o`Ad1KP40>\=mTKo +27@5^0P0j`8c`51Gj>@=Pl@4jO[mj=l=jOCmj=T=O9cYT`7X~2jI@1mTKo0GD6j<;modKlPFKf +ogmd:OI6o`5e0J[oA_X6ogH8oeH4F@L;`7hB2\1h2I>0_lPd0I=n1Om>mWoG1_mf253oEPIIF@Oo +C_[fA_l1M@>`0:[YT?gfA_l1M@?XK?f;M_H;mWd3_P40M1[oA_X6ogH8oeH4F@L;`7`FmTKo0GD1 +ZTioi_I6o`5e0om6o>UEoNWU02_0o1H7SGkF^A00lj^\P6KokcaNM@F0C_l@[;@0R]2;n;43dnni +1`4Rb];U26_F[3`0M2HlGG@U?2eehCXDMmf0?5edf:`Z`WCU0]3@aH?G00Q[e_k8MOC[eNVL08Uf +2X5Vm_moRgKfmTKo0GD3j<KlCWa@odKj1_mf2?mF15T72l1lCiJ;g[43dnji1`4Rbm;UQ6[FUY=d +2?I6oa1d2>\?mTKo47@9mTKo0GG4Z^_11_mf253oEPIIF@OoC_Y6>gKfO@WfA_l1M@KoA_b`0:[Y +Ooa6>gKfO@cfA_l1M@J`0:[oA_coMPRhoom@oeH6FEV3O_`1Pekl00N;A_cYQP3oA_[oMPSoEPAI +2l1n4`[0N0VCP;o8=06CM>EIPl43on5dn5W[_b_B^@@0odkfO4EBDOm6n_mf2?mF15UIFP_0OSGn +bG`aR^R0kC1b:X3m2W8GP>dALR20o@Ib2X3]878FP?d6La60a@[Ah]7RdN;AhP;EjkH[`83i17@6 +FH?10ooQFNUOoemNRnEM`b5\8F`QK0]Y4VTHJNYZG6ULJFIY:VX\JCQY<VUGJHiZ:6]:JF5Y_6Tn +JDAYDh3[<78RP?\9MQ:0nbYg1H3[1n\3P>\WP?\9MP\jfG<7A4Ch]`3[0U_i`eF;k8?\1UIGaTKo +0<M6o000adKj0@3oA_coMPSoEPAI2l1lJ9RCm\>0M@Rojc7f0@5ehi?oCPalFS`[M0Ll;GDFoTKo +odh<O4[oA_coMPSoEPAI2l1l=B_fRoj;CP[SCH?i97L^P?T2LRTl<7E[P?T@MFCoCPal<_m6o?mf +2?mF15TlN7AA?5QdCN]cadKjooo[1LM6nP00ogH8D?mF1UUIodkl:l2IjJL0jI@0?337APX:07DS +odh<O>ooA_coMPSoEPAIadH:200lN7@4?5Qe;LM62Q00jaN;CPZCj?GnTg:`U^\:U_MV2P?`4oYe +;?m>37a<odKlogH8oeH4FH]>2Y?XcojCLmg[:YKghIN7b_OR0oLC`ILBeWE7odh<O23oA_coMPSo +EPAIRdh:TnRSoY=ce_mf253oEPIIFOm>o8_GUX1no`1d1oOJmmR3fP2;OPj;G_`17H]n48]NnXTM +jaJhoonjogl2A_n0e023dP37A_X20>_HGej;iEg3EH_\E[@[RgH4R`b;E0;=8EiM`eF;k5Jd;H]f +18\<Re@2cB5NGL=ERnaG^05GReh4Rgh6R`f;E@;=8G84<l3[153XP_MOGL>j1@0k5S8dLb^;f]7S +ahLd=000RmZa1=?SaXOf<_n;`]?P1O8bRm[ChhV703=2>aHb=7;EX?HbV53XS_MI2l1e1X4Vm3;o +oKP00U3g1_@b009d1KP10>\2<l1@<l1@^?8bD>QE9H?42:06<iQ@j5[gF@_0M@J19P@coofh009@ +m`H4<`02M0Fh0P3[0S?0D3?0D;P2<e3X8BF3a0S3EH_\Pn`8SDKhD8e6o52;GPCoM`;o=nRg:X?4 +28e6o53XnOiISDKhD>P4oeTc`8_UGL=ERnb3k0aFRgH4SDKlD>R9mEV=A_Q@j9CeFHe6n52=A_a@ +j68YFEV9E_J9A_@;mW@;RdKfReKdRD@2RAB;E_J;A_ANRnEM`eF;k;P1050c`51@ogH4j4kgPl@8 +GL=ERnb;EPB3n_me1KSoon\JR\:d08_HmXO[<@Qd2H[2]005h?o[18[2]01M`eF;k;A1ReH4cB5b +13?0j`A@j1?fGL>:a^P208[2e126h>P208KP190W540WZ\=ERnb1k9H0EUO7A^h00<M6k500adKZ +~2jdIG^Ooo<\3b[_OABEo3=XP5Aoi>k7D_De5B1Xf6J_l[n8f6J_m@Eomf2?mF2P_0M@G7A^X1 +0<M6k5000Gk^SKiZo`MJFE_31_b=_V[oRGklRgklRgH6[0[0M18l9G@A=XP5Aoi>k7o^j:cojnWY +e@>9M_2\?2EdihUno3?9RDkbRDknR4keadKhooo7A_Koon\1[3;TRm2;f83[883kH7<CRYmA=H?k +5gH3jHP3dN<^ojOEM>Un0h3m07OhPdkn0N_@P?d0Mnf3C_h2jlF0o@1ghX1nmB]d0hQFmN^ePfKn +gn\4Pdkn8;D5jjN0o@1gCOM6oP80MBV3C_h8]@7[TnTc0h]n13J;1H=610:0o@9c4P_0N@Kgf8=> +oP:9A_Re0nU_oh3m17GGRDKfo\GYH_n0o@Acb[D4odKfjEGoTR``V83m0WLI]@:7A_P;`7cAdN2; +d=7PdN03`P56n>Tcoh3m17FKQdKf2l1d]M7PRm3Ah=7P0l81A_KY5on3C_h@jFGoPDkn0063I_k_ +jEWo]`S[2[L:j`Zg4;?Y0][6A_D0R5Kk<m:8E_Z;OP@fR`G[4;L:aTKj0HQFnh]n13J;1IU7AhUf +1_M6oQ00M0DfRaE7AhUn18en^`_0M@d;dWD9Pgkf07D7jFSnPdkn159@Eh[7V52:A_Y@DnQ1m1H7 +ReKf2m9m0nWb0>Wm08QFnhUf1Xen^X]N13Ko=d=3REh4mdKn801d43J;5d=3REh45POXWOf`>ZXF +1e[XU?dfaPD0aTKj08=Vo_^=C[X[nHO?ReKf>m5o0X_AjIl0RGH6R5KkRgh4=X\5PdH40QH7SGjk +<^@fR@Fi0@3Y`P29MPJ8E_^;OPCgA_hP07D==X\mPdH40Qh72oo[2cK4?H=610B<`0_7M@DN1km: +=NQEoC]>mWH3RdkfjHD0RGH6R5KkRgh4Rdkf2lUm0kT605MASEjkDe:h0@0SA_i@RdKnZ@01M0Vh +2023AP@:j`N3AP@8^0H0D>Sb11H7SGjkmdKn201d68]Fn0_BOQ7Xmo`VP3d]M@59:m5n0hUFlRJ0 +?Bed2hY6m@[0M1A?9XP5Pgkb07h:Rdkf2lUm0om>l^S5o8_gRgklRekh^0D08dKn?@D0MA>:I_^0 +o6me3H=nlP1o1LM6lP40ja^0o7Qd1H3lF7DAPdkn@4];Pfkb0Wd5adKb~20dkbmdKn0P1e3>\6 +\23XO_a;>mUom_M6oT00M0^`<>Q]o8Y6nnQWo8]FlP_BORL[bR_J9XX4?2ed23`PM0@l:gD79ZcX +B?a9BhO:h`N`<>Pmo>;iQl[S4R_I9Z`fR0E7oTk\O`?X<?cRl0_KOPV;bk0Pj1[lh_WYF_b9MPJ; +OPCgA_hP07D;=X\mPdH40Qh7j`Lfa3f3AP@4^500:TK\0dK^9XT5mdKn401d1dM79\L5~2jA_l +RgK`Rgkl\2GXc_^\2\1en81nk51m0nS9n`N3O^X0M0Fhooo[0h]6kUmNRnEM`PP0?G4WLG9a<W6P +LJeajg7bLOMaFg4PL_ia0W86LWYb9g?:L^YbJGBUM:EdYGA=LE=aEH_\EUN;OPCoMPKXGb=IRo10 +D?mf1UOXfaN3a0J;a`?6GeiM`eF;k8]618_DPNX00S_2L`NSW00c`>\9a`JD00P0^?ooGL=ERnb; +APB;EPH31Y`0Pm80RlP;dWD@PL400W8:>lac1XL6W03[2LL6U0080;Sooeg3EH_\ogH4j:CoFEg3 +EH_\RdH4VE9@j;OoFEUM`kZb=N\3^[Le^@D0]42k0P3=8KTW0;Zl=KA0cB7Y`8aERnb;EPRdA8Y6 +1X]N18]>2\dQLPb3OPH0M@B;`^\6j`A@j7?`GL=FEh_dRe`6Pn\4LPhk7^HeM0GX@P3[0nP305mN +`cTNi3Ed8h]g0_H40G@6RCKV=N\P>cKT=G@=RmkXE02;A`:SiSG[3H_N<l2Si3FSiSFSj3ECj?Kn +Fl?o3c\Ni3Ed68]g0X\4Z05e3`<7R@B;?`?kRGD2Rmk[0nPb08\o0o^;1JP1M0730@N;m`?`RE`2 +Rmn;O`Hkgg@>RCkX=H]g18Ue18Ul1\?71^Pe~2`h\fj3D;mW@@Rg`6RE`6REd4RGl6RGL4`hTN +j3F9G`B9G`K3EUN;m8]41P_0M5851@1b=RGnocd807<3^0P0PckT=@1d7h\Nj3D;fg@=Rm<i1g<J +Rel6>mYemNQV0>\Qj8X0jacX703[5c?0ja>;l8?623TgLnWXJooo1h_31@@0Gek3D3?0D53X=_iK +FbD107@9<m9BD>PXoU]KF50cfe=@j1gnFe\moomd58_HRAkT=HTNiSEH@8T7Pl<4Rl?3Fc?0`e0c +fe=@j?KmFe\moomd5X_HXNHeRDL2RAkV=EQ0R@N3``B;`l=H<l33:@N;l`<gRoh3n42918UL0XUe +0X?618_6`h_\De1AD>PEoe^;f0_0M1lN1ob;n8]foX\<PlH4EX?Y1M7YljF9A_kX9?iKReknPl@6 +`h_2Pl88>m5g=H_A>akV=GD?R@Oo1`?3De3XBoeKFn\NRo\3n8UM0R_@:AN;m`?bRG`2@XTERl^; +gnPgoX_IPl<4`eIGEH_\Reh8RdH:2l1d=`_KM2f3j`B;3dV;d8?21H?RoX?j27<3^PP0>lYb37L5 +Pl<4j`SXQoo[0nQ?oh_3j`e@j6Gnj`ICj93m<l1KGEmN`olV>S[o9S`jobHn>_lV@3X008l6kSF? +1_0eS`Kb=Bj<7VIhRCKd=HTnmSGlSPJ@0;j003;T9Za0S<F7eY>;=XX0ATJi0@20?Y800g8ASPJ< +08_n\Glb`?:^hfj0lGm@Rl43`d0Uo_n;o2_hLUb;i`HO5PMABO>T<\2ZS]f7lXOIRl>;d4?X6@1g +1g90j180MoTl87@8?0ed13`9MNPb`>_T2l1d1d:Z2\1e0D>6h3;0nN<E[4T\8W@?128lG7D7P3`R +M@:\B@_f`nUFRET3bRj>7VIhRAkZ=D<3fh_dRn`[jg;VRnF9;^`eh`j9MP23a@8f[0[0h?Ydl3?0 +RDH0;XhNIWR;=_@eRckf=OlflSGo=_0eXNXeXh@0XN`eXhH0obK^=EIGR`j:057X:oeIRoP;`7@R +7Qh7SQj<03?fo?>T7h_h1_lfSP3X3OeKRmP7XoPe2l1e0nW9R3?0^OooP3d0M0b9?h?30_:^9SP5 +MOB91emNXOPeXhP0`e=dHF=[86mfIG9VK6mg8@d:98cKS<R>f;[@NK@9cB6>fnTJjeF;k3?0D?mf +1>RQ05UIRm23n_md6_M61P80M0Kg`P40M@@c`>\9a`JD00D0^?ooGL=ERnaFEeF;MPCl:l2I^@X0 +]`2ojc6:74Kf0@5en;d0083k:g@6P?\]M@A5RQa6P?\iMbj0jc1b:OOQ0l<BeWC[ja:;n[T:0?OQ +UhOAmn:BU`?34m6:74J0ncUg1H3[<7?QCG`7mm[gf8?J05eOGUg3EH_\ogH4j8OoFEg3EH_\Rdh8 +]4>:APJ;EPC=8G83TN\4D>RFjeg3EH_\ReH4>aHb=789^0H0D>R1jn\?Rm[AhlN7=3@005;X0`1I +GL=ERnbd?X]N1<dQLPcAhlN7=3@003?0j`A@j5;[GL=ERnaF<l2j?01@D_mf1_mf1>QKjZ=VAC?0 +^S`0D5;oMPKoMPCX>NZ9EPJ9AP@c`;Xl051BogH6ogH4j3;ZXfQ5<l2j?01@D_mf1_mf1>P@jXUF +1XU613?0^_R8D5;oMPKoMPCXn^V;f=7PdN2SL4F31W15AX_3^[D5mnZ;l3?0^_R8D5;oMPKoMPCX +h^V9EPJ9APBi>2;g1W150`1e0h?168_1VC]F1W`7OahkAPAg6H_1^aP0VOOk0o3o1W15Rl6I:DH4 +6EH6jlZ3OPP0M4Z3?R`j07A3<l2j601@D_mf1_mf1>R9jE0c`;XH051BogH6ogH4j6WYD3?0D:5` +A@Fjoe3XMR4;`7@@PdH40H=F1P371WI50@3[1\L6MTD003?0^QP0D5;oMPKoMPCX@>VSJTDc`;XH +051BogH6ogH4j1kYREH6RDH4XgA51@@00o2;a[\703?Bmo>95W95PdH40H=F1P3g1W150`1e<X=n +1P1l4Wl6Pgh4?7H:Pfh40H=N1P3[6X=n1P1e58=n13ae3\L6KTD10<L6K4DM0>\ha`I^A@00jaB; +7Vi5RXOj=IRI:DH46EH6o`I^AH\NKTF:QoXeV9TkEPIlgGD5>dH4L]J;APBSK4FhITENGL=ERnaF +RgH6Rd@:1F`7D?ldog@2og@4og@6Re`8dN?o]cXfRe`<dN?o]ahf^4lgD?mf1>QY68?44UiM`eF; +k3?0D8]N1?mg0_lgj=OmPl@6GL=ERnb3k0CXeAj;GPB;A`:;5b\F:3XK1RXjRDKnREKl^040D?mf +oU;XZ?f3a0J;iEg3EH_\E_mf1;Q<AE3XL?mIFH_`aXA<A@Y6aXA<A@2hC4ENGL=ERncoMPCXXomI +D>S?oeUM`eF;k8?\25IGRgh6Pgh4AW`7PGh4RP1n2K[ookSoonUY0H]63[\l09Wgn`5638]63YWg +nhUF3X]639Wgn`562X]639WgnhUF38]62[\H09Wgn`5628]62YWgnhUF2^\QmdH40`1e4H?o0GD< +Pgh877h[Pfh87N\8RXGj=IPYAPQ7RlNk302Imo\1APB;aiWgnh_jRXGj=IPkAPQn`h=^14J;AP@5 +0P2k102Imo^;l8]610E60:T307D6Pol2O@5>RdH4VE1B<m:hK@5IFnR9jE2;aU:IFeT3b1?JRoOA +iX^41SJI0lPCfX]629T3b1?JREknRDklRdknRekl^P40^81Aj5CYD8]62U:ID58cd[P@3UUKj4;Y +FeT3b1?JRdH<VE5CD58cd[Pl05UKj2[YFeT3b1?JRdH>V@?84mX33RPj4ahZ>XUNnXU>n8<n;3X0 +M1goMP[oMPR;ad1@ogH4j8LN2l1d2H5^n10>Pekj08=nnP1l47l6Pgkh07H8ReKjRdKhj`Jjoonh +oomOGX_UGL=ERnb3k0AFRgH4ocCoM0;oM0B;A0I8D?md2?md2^Q@oX?438UFoXU6o8=no_me1X=n +o?md5He6o53XcoeI7UJhITDND;TB0>REj8]FoX]6o5j;iEg3EH_\Pn`PEUN;MPZ=A^29A_k7A_`1 +0>T70h]N280o9G@@odKlRPN;GPB81om61>WV0[Q]=e2=A^1@j?XGFEWoAPR;GPR:1iR9A_Zi5P2k +ah8^R`LkA_Yd28?30^;cjH82;_mW;8]L3=7SRhLN=XU6o^U_0X]L3=7SRhL\=^__Re`8dN>;QcXf +jnB;G0SAhh^7DSK[fEKoM_kXb_aIFNU20_md1X=l1PYm0nT<0S?0SEKP0l;Y5@;oM0B3O0@:ONgY +mP7[j8=l10ae1Kl<0>\;Rd@4^``0VOOkRoYGPol:OLcYe@7[ah]l3TMGPol:O@Fh0@3[0S?0D8?o +I7d5^040j`8c`5X3d8e6h0?@D^Vm0H]l24MGPol:OI?YW07[S_md0X=l0PYmQNV>0N^0Rd@4^``0 +VOOkdN2;f8^7JSKY;Ooo=8<l2W`3jF;ojF\1jEcoRd@>^`L0VOOkRg`<:oX;ogd3PlL7Rd@>0lNk +1`2Imo^;n523o`Yl0nTaonTj0NT[oomd3>U10H]43[\709Wgnh]l32_j2omm0h?71h]43P?7B;\7 +09Wgnh_hD8?o2W`3jOWnj@81jO?nRe`<dN?o]ahfSDKPD>Q]5UUI^70gD8e6h53Xn1EIFH]L2=7S +okLj=Xe6h53XiQEIFKQb=e2=A^1@j=TEFEWoM0J=A^1@j?TFFHeFh0?2D>RViKQd=e2=A^1@j;PE +FEV;A0X5K0M@SDKPD>SD5UWYQ?koM0B3O0@:O@Fh0@3[0S?0SEKP0l9@j6kU^7LgD8e6h53XP1EI +FOmd0Xe6h53XX1IISEKP0l9@Pg`22Gh5^040j`8c`5X[d5;X?>FhNSM@SDKPD>Q>5EUIocB=A^1@ +j6lFFHeFh0?2D8<l2Gh5^040j`8c`5X[d>UWoX]42[]T09Wgnh_jDX?o2W`3jOCm^040jO3mjN_m +Rd@:1F`7D8e6h53Xh^C[4H]L4=7SRhLT>^V@oLM6oWdgogKnj18FFH]F1R]Fo3_2L`WoM_kX0AII +j`J;APH[A_b;n53oM_koMPCXBQJ3a0H1O_`1OPCoAPR=A^29A_j;A_`kAPIc2h]N280o07@3jNKl +Reh4aPL0Reh8P3l0M0@c`>\4RdKlB5mNRnEM`bD0@@1204P0B@1=05<0E@1G05P0F@1J0640HP1S +06@0JP1]0700M`1h07T0EH;[O`60;X0lP9J0^838P?n0XX4iPTV2g7ofO`b0681MP8N0Y83iP361 +789ERnb3k0B;AP@k1S8dLPJh1P1@je^;GPCAhoN7=3@00W@5^040jdbh04B;GPC=8G8nm\:0MCFh +0D8cbH_AcB5b;U9@^092<lV;dLdQRDKlREKnFUUb6KP0@\dQLQ8kE_ib2GL5>dKlLP;[]c?0j`A@ +j;kRRnEM`eF;k5IGRgh4__oo>Gd>MEn3O@H0M1b3?@1m2EOXEP1I2l1eBoM50P@0M0OoM@SX6?9I +P7d407`;RTD4V53Xi_IIRo37A@800<M51P00a`D00<I51?n3O@`0M1@c`51@ogD<j7CSD>PZk5W7 +A@`008_6GeiM`eF;k5IGRgh42ome1NS>0>]V>Gd>M0Fhooo[GX<m07`YmdD2201e2X_71@D0>DD: +MDK71@00RlL51@0iA@Ye>8]528U52^\`jbj;A@H31D2;l2TeD8]528U52U2:A@BHD>S\6H?41S_6 +M0ggA@800WD6Pdd24>^O<l1OGUg3EH_\EULcdX]n1>\3R1E7PoX:M2KoCPIn8H]N2?l?O0b;M`[o +A`Z:1;@0j`OoMPSXW@IIRm0moomedX?jogD9>gh4M@@c`>\DaPD0Reh8mdL2401d13?0j`>;APAO +GUg3EH_\Pn`2EUO7A_h008\n<SBnlS;[4_M40P<0M0QFj0;oFOm6oX?648_7C`_0MNN;A_iOGX_U +GL=ERnb3k09FEh]f2<M6oP00Rmi6RPn:`CabM@Rj0@2o0@3[883iMgD5^P83j`R0nF5e3KX22LM6 +oX00_`80j`@c`>]YRPa6P?T[M0n0?2]e7h3iM7@5P?URMAF0nB]e0XX<Pn;lPlX4adKnP06o0`20 +nGAe1X7:043[7H3iHWD6PLX0P>\?XE`d9@302m2;`ZT0P7@3Plm0a`K^<YROReh6RAN;GPB;A_j9 +1h_7Gej;iEg21P1ERnb3k0AFRgH:ogH6SDKnD8e6o53X=?n9A08;`7@PP7`407dWogKlRdKn2dH4 +D?mf2>SM1h?41XQ410[0O@g6A0Coad@2~2<l3[@HY419Q@j7?PF@_0M0F1C0800[P00U3gA080 +0W@5^040j`8c`50c`51Fj3l>Pl@82l1d1eKX?oeIjl;7A0`008_6GX_UGL8805JnlS:0O0@0O1>Q +<SBa1=?P1O8bRmJ3aQ0k`WOWP7`407`4<l3[0X_6G\=ERncXcon;d0_0M@@c`>\=D_mf1?mf1S?0 +D>PToeg3EH_\^0:AD?mf1?mf1Xe6253XTNUM`eF;k5IGjKT0odH6Reh4RdL6>dH6MPF;APK[1X]N +18]71X_hReh4mdL2@01dHH=o1P1dFh]71S]61W=CPcl0MDkoCPHcon\<Reh40gl6RdL6:DH6Reh4 +RdL6>dH6M^UGogH8RTL4V53Xk>23a0J;d05F23_GM4^;ab_20DH6Reh4Pdl28>]4Reh8R1OoAPSo +CPJ;APH;`7@TCg@QReh4o`ml38]g2_m72XX4]03[1omf1>SK0eV;d3googG:Po[oM;b3OPH0M0?Y +?_n;APIOGUg21P1ERnb3k0AFRgH62oId=X_N<lV;APPcd^Pfh8UFoXU6o8?j0GLOLP@;`7<IogH4 +ogKlogH:j?KnReKl:m1B<m9HmoK[0S?0GX_UGL=ERnaFEh]f18<l07d:Re@60aA2Ro[[2h\4VC?2 +:l:;d8_hmd@2@01e;8]<2X<l07dMj`U9RmV0?`Ye0DN;`TX;`7G`ja2;fD60?`Ye0DN;`TX;`7G` +RlMOGUg20P1ERnaFEh]f18]n2UKX^O]I2l1d1KSoon]7Pol1MA23?01n2eKXO?nI:DH66EH8PF@2 +Gok71000Rd@8RD@:Eomf2?mf1XY419Q@j;ONPl@8Po[oM@Xmoome1KSoon\2<l1OGUg3EH_\Pn`4 +EX]f18Y419Q@j2kWFHUFoXU6o8?jogD5?OooM1f3?01m3EKX4onI0DKl4EKnj`]Fj0KoVBU6o1UF +oX]FoX]6o5j;iEg3EH_\RdH4?E`0M0Dm;`1e1KP10>\2<l1M`P80EH_\Pn`8EUNhX@1@j9;]FHU6 +oP_0M@Dc`>UN0H]n1XX5V8_HmXO[<@ad781m0CYe5XX5V8U6nU3X]NII1L3oRDKhPlL2ja:=A_Q@ +j5KJFH]6n0E104R9A_Z:1IQ@j8Go2l1e?;RQ053oM_koM_SXWP:3a0H;`7D9ogKnj5C\FN^FogKn +j=h>FH]FoP?@Ro::A?nHD>Q>o`_0MA;615c[38]foXY6nXP4A\H4>TIGE^S_3EUIRgKnRoj;gdN: +1iR9A_`;`7@8D>PKo`_0M6^0O?l^MA6:A?jHD>P9o`_0M0F3kP;[<X1lobie;81loRie9XY4oIQ@ +j>cn2l1d6X?^0h1locYe0nU_odj;gXX7V53Xd_h;`7CbPgkl07DLRTCoV53X`?h;`7@1CX1locYe +1<H4G4K6103[2HY6o8P4A^Ugoomfo^PM3UU0Rm23OP@0M1lkEPQf0nTNoomfo_mf1>Pn3EUIogKn +j6O[FH]61>\9D_mfo^R0kEUIGej;iEg3EH_\Pn`4EUN;MPJ;OPP;mWD4RlO[<8_N<lV;ac?Bj3gM +REKnRDKlPoX1MaQb10_0La;oMPCoM_coMP[X=`Hcd_Ofj`8c`5mNRnEM`eIG_a@0__8bja>;A08U +00<m00=e1EKX6OUIPlH@RlM?2l1eiUmN`eF;k5J;MPCgA0800W@3j<Soog@6Rd@8RD@:D8Y419Q@ +j3<8Pl@6R@@;`7h8Pf@2gc?0jaj3?01e3X]40REooPdP08U40^\8a`@008=<0Q2hoomNGL8205F; +k5J;MPCo15KX101IGUg3EH_\EX]f10_fM@JhoooYU`23?01n3Ol<Re`:od@:RPOYP`23?01lE?M4 +0Q01MDggA08107A6PD`2P023O0H0M0aFj5?o2l1dcN_0jlWgA0800W@3j1[o^040D;QhAE2:A0BH +D>R71h?41P_0MB>:A0BHD>Q1meTm0@1d1X=<0Q3[RH]40REooPdP08U40^Ujoh0nN4D=M@OgA090 +07B^Pf@2gj1hAK@0GUg3^?8bD>Q>oeW3EH_\Pna8EUN;OPJ;APB9A_h;`7D:]1W=8K@0@8U6oXY6 +oPA0R4JhaTJi>\I6^Ub=M[^dAhYFo\dQL`@c`>\jSDJhD>P@35TkAPQb2<L6U00R0>_W2ome5Omf +2>PdjUV;n0_0M@S71Y@0203[cXe6^51Gj1d;FEV;aemNRnEM`eF;k8?\0UIGRgh47PL;og@J\02: +9KWooocb[_OABG@;Rckh=@_oRGknM@\c`>\ZPdKn0X]noX\m2omdkhX52\1djC[PMNV;fH0i?GGR +RgH4ljJ7bgGIAh_7Gej;iEg3EH_\EULN1h]n18]f1X]>2=7Yo?>UL`6TRdH4GeiM`eF;k5LN1h]n +18]>1XY628[Po?O70@1d1><9ZTWAjO>[L`6ZGeg3EH_\EX]f18Y61U3oMPQFj<SoPl@6RlINGL=E +RnaFEah7RdH4>dH6L`Km^040j`?l<l2;MPB;OPJ;CPP;`7@60o5>0oU?mlL107@4ha6TBB_`:oSA +jO>UL`D3l0?hY?aOGUg3EH_\EX]f1?mf25KoMPKXY_n3a0J;aUiM`eF;k8]>1;@lReH6cB5b0^\4 +D>R0f5g2101ERnb;GP@[bB_B]43=8Eg20P1ERnb3k0AFEh]f1X]n2?O60<1e2:5L=2D0`0_`<l1@ +ogH4j9K\FEV9A_kgaP01M7PS?UhdRlNYP05e1kP1053X:=R3O_koMB>3?V8d0W@:ocIR=>PDf>W] +0?O7P01d13?0j`>h0@29A_k[3?O600Ad=kQ@053[g?O6l01d6Omf13?0D>Q?oh_h2l1m0nVe05OX +JNaIja;oMPCoM_kX=_n;n0_0OFcYW01FogH4j9d0FEV;n0_0O5Xc`51Gj1CWFEV9A_bYP01d7X7> +023gaP20M1hUo`0=801@^040D5OXlNJ3a0K[2_O6009d15OXo_kgA_h107@JmlH00G@DmlK`07@> +^040D53oMPCX[N^3a0H;og`_mlH00g@5^00@j`8c`8_FPN;on0_@D_M6oP40M0@c`>\3^001FP_@ +RmoAhhVG=3B;aemNRnEM`eF;k8?\0[01Rdh6ml4207D:\0;g`@@0M@:`08]F1;7`8Th62\6d?LdQ +LQZ9A_j;APHUokP=082;G_kAhhV7=3B;A_k[153XeMJ;iEg3EH_\XI@0>`K:=gdCPcjD~2O0b; +7Y@0dN>;Uh0gj`>ja3UBogH4^=8iD;PB<e3X0_N3a0QM`eF;k5J;MPKo35J:APBHD>P505UIGUg3 +EH_\EUN;OPJ:APBRNTF3?Omm>_l5Red:odD:R0OgA@8807D3jOD0P3ijA@Yd2X0nNTD=M0?Yi01G +j0?dF@_0M@?Yf02hoooYe`3Yc`3gA@:@07D7mdD20P1e1X==0Q3[hh5=0P01Pgd607A5Pcd0M0UG +j<[cF@_0MLZ;A@Kgf8T5Red:odD:X7Y5R0OgA@8807D3jHH0P3ijA@Yd1h0nNTD=MGQGj9OcF@_0 +M6o[UN][RTD4V=7PRmSgQc@d00Qd4kP2050c`51@RTD4V53XZMJ3a0R0?WY52WDOmdD2@01e6;P1 +052hfSU@RTD4V53XX0j3a0Hm0@1e6;P1052hNTE@RTD4V53XR0j3a0Hm0@1d2_M50P02M@?Y?onP +NTFd05mNGL=ERnbh0S=@ogH4j<knFEUM`eF;k8?\0UIGRgh4RdH6RDKnmdD2201d:N\JEh]N2?m6 +28X7V53XX_iIFCgoogD5<l3YE@6;APKoCPH;`7GLjDD1mdD2@01e0nWO08=m1P1e0nVH08]51S]6 +1W=?Pcd0M0UGj:CbF@_0MLF:A@BHdN2;f?N7=3@027@C^080D3?0D52:A@BHD>RjeH?42?mf1_mf +28Y519Q@j<4=Pl@6>dH6LP?Yh03[QnWK08\50dH6O1^3?@1e2[Soob]51XT5j`aGj4CbF@_0M0?Y +H_ooMPKoMPSoM@[X7o^3a0J;1@=61XT5RdH60DD:jIX0RTD4V=7PRmSgQc@d00Qd4kP2050c`51@ +RTD4V53X>=F3a0SoMPKoMPR:A@BHD>Po3H?41S]61W=Qj@Oojeb3O@H0M3g[;ol5OAB;G@[oA@Z; +MPSoAPR:18P7]03[3eN;GPSoAPR:1e3XG?eIFCgoogD3jLknRdH6odh62l1ean\IogH6ogH8RTD4 +V53Xg@^3a0HkAPIc0nVYoX]6oUmNRnEM`PH0EH_\Pn`2EUOoMPCX;`EIRDH4Pgh407@SRgh47PL; +og@JRRF`?KWooocb[_OABG@;Rckh=@_oRGknMA?oMPCX2n=I^?oojgJ3A_h2RgknRcd;og@TRPD: +`7@N>^1ejH_IP3TmMN:;MPCcYXO;MMV;O_j;APB91N]3Rekn:akh=H?30S\NSP1b9h?325?XS>=I +RoPN1`_oM:>73Xh0DH\fn3GcY8L6n3E@j:7RPl@2Fh\nn3F;APB7@Oj90C?0Gej;iEg3EH_\Pn`4 +EUN;AP@k1S8dLPZh1P1@j>;BjJL0RdH8@3d2078=Reh4dN?gQc@d009d1C?0jH`0ogH8ogH6ogH4 +j8KDPl@6RDKn@3d2078=Reh4dN?gQc@d041e1H]6o^]RRdknRgH67PN;oX_No:`l6W@]?0ed1J[R +m>\Lh_06DkP1052=A_e@ogH4j3_DPl@6F`OlRTKmZS_kM@;[VN\PDkP1053gfA_0D57oMPCX@=>3 +a0R;GPCAhh6?=3@00U\[niMOGX_UGL=ERnaFRgH4<l1@D51Fj1GdPl@82l1e18=T0^mNGL=ERnaF +RgH4Rdh6>cHb=785^0H0jc>;dH7R0<2;`S_1MBB1nP30M1j;g]7SRhld=8_NdN>;`BGo?`_2RHLd +=8_19@30j`Nh0@1@j<SAGUg3EH_\EUN;MPB;OPXiM0ie38=n209o1X7oogmf1[SoonVT08<ngST0 +M@j1oP8cM@S71]hi0@3[4h<ng3T0M@b1o_8bM@K71]`i0@23?01d3kP1050c`51@E^QMlh?42?M4 +0P@0M0OoM0SXjN1IPf@2llM41P00RlH51@29A0R9A0Z3OPP2M3h;ogHja`K\<[jOPgh607DHEnR9 +hEV9APH;`7D3jGOoPd`21>\3jFkoRdH6RD@:RD@8RG`6Pgh80GD4Pd`223?0GeiM`eF;k5IGRgh6 +RgH4Eomf2?ldj97gPl@60Cb;7<H708_7GeiM`PH0EH_\Reh4aPL0^5FED8e6153oMPJ=APQ@j<7J +GL=ERnb;GPC61`2hEIE@SDH4D?mf1_mf2>RUfUg3EH_\EX]f18\Lo`B:5h[22\1e1KSoon\4R\:d +05iM`eF;k5J;MPKo35iM`eF;k8e6253oMPJ=APA@^=>ED;RdUE3XDm:3a0YM`eF;k?mf2?mf1Xe6 +152hdiE@^;BED>PfdX?42Ug3EH_\Pn`dEUN=E\bd6\dQLPn;EPBi5P2dC\dQLP?YU029A_jhh3U@ +ogH4j;D2FET;`7D2jgLc`53oMPA@j;CbPl@6RDKl2l1dHh]No8X7V8U6nXY70iR9A_R3O_P0MCQC +j6;OFH=nnV5l2X=nnWYo1;1Qj`:`@HYFnR[@R5K<adKR~2adKT8@37A^P00<M6iP00_T11jdJ; +E_bi5P2dC\dQW?mfo>PMgeVML`SoM_kXQ<o[LXYFhB_fm\90MB^1cP01oTk<m\8@M@n1cP21m\81 +M@Z1cX00j`B1cT10ogKTogKRj=_<TN\=adK<oon1cX0Q:lV;dH]n1Qh7o8Y6c9R[Tb_0ZiJ[^040 +ZiJ[Zi>[RdKVZh]6j:^AZi:[TZ^BZi:[TZ\c`5mNRnEM`eF;k5IGo8]n11h7RmLb`;Wooo:^SGGo +Rgh6^OoolZkgdB_iQoOgaP40M0:TBM7YljEc0JBBGeiM`eF;k5IGS=R>`?`c`8_HRgh6RoLb`;Wo +oo:^mm6;oX]f1?>VRTCoRUgo:l=OGUg3EH_\EULN1ob;OPJ;mc;0^OoolZkgdH]n1?>TRdH4GeiM +`eF;k8?\0UIGRgH4E^RC05U0RDKnD>S6gUV;n0_0M0_oM_iFD>P3mH?41X_7Gej;iEg3EH_\EX]F +1X]f13\FbSMm3P_BO0Z;f]7SRiN0=n\3^^@i2oId5h0l07@BDUJhlSU@^7a5D>Q2oH?42>\?D[Sj +>E2hO4E@j37mPl@6^7a5GUg2101ERnco=Y@0ogH4j:3oGL=ERncoMP@c`53XT_mM`eF;k5N<f8k0 +Rgh4<l3l^OoolZjAmm18Geg3EH_\Pn`2EUN;OPAGj=OoFHU6o_mf1^S=oeV;l3]f27H3RgH8EX_7 +0dKnD?mf1^RLm8?41X]NoP?NaP40RlMOGX_UGL=ERnaFEhcHS\3lRgh6RoLb`8]N28_;lZh[fH]n +18O;ljB;bo>ZRdH4GeiM`eF;k5IGRgh4jaJ;MPK[2hX5>PAe18_7j`i6P3`0MO17P3d0MNDc`5mN +GL=ERnb3k0AFEh]n1>SG0Z4Z>X\F:3Z1`P2V5LhBRDKnREKlRcF1aTChRlKAn=7hVE1B^XH7^80O +FE_XR<h1A_`AE_j;aRD309U@D[[Q0KR0<eUKj6o>0DKl4EKnmlH307@9PDKlP563E_h1<lV:A@>H +B8_`j`Q>RXCn>IP3b0_fOoB:A@:HB0?8P7d30Wh7m`D307D1@H]N1XY70K@0D8_1^QP0mnYJ0l:; +l8<n;3X0M1R:A`6d051A<l1@R`D5C_Q@j9032l1d0Dj;aYU@DS?B^10>FE_Xk<d1A_`AE_j;GPJ: +1k@0VE1B<m:h?01IFnSBcH]N1XYO0kL0D8_3DYUKF@?84mX1C_`AG_j;E_j;A_aOGX_UGL=ERnaF +Eh]f28]n2^S00J4Z>X\F:3Z1`P2V5LhB:EH46DH6aTD203?0^S`0D5;oMPKoMPCXnlZ8A@<c`;Xl +051BogH6ogH4j=W:REH6RDH4<l2j?01@D_mf1_mf1>SBbXP5<l2j?01@D_mf1_mf1>RabXUF1XU6 +13?0^_R8D5;oMPKoMPCXVl[Ah=7P1K`7R@@c`;[hR51BogH6ogH4j97:REH6RDH4Pgh607`lM@N1 +OPA@8W8cPFh4D2:3GPH0o`@c`;Xh8U1BogH6ogH4j5;:0@@c`;Xh8U1BogH6ogH4j4o:REH6RDH4 +Pch\>P1d>S?0^QP0D5;oMPKoMPCX<\Y@<l2j601@D_mf1_mf1>PBbU0c`52;10E>n53X808;`7@8 +PdH40H=F1P0c`;XH051BogH6ogH4j?S9R4D1<l2j601@D_mf1_mf1>SFbHUF1XU618=61063EPH0 +m`@307D^Pgh607`BO`J3OP@lMPZ3KP@1Peh60>\FPgh607D@Pgh4?7D:aT@30\I40Qg[?<I40`3[ +5HY40iR;f8Z7oSVHVBU611UF1_i40hY40iR;f8Z7oSVHVC]F1WcJM@DkAPAbdoi40hY618Q40UmN +GL=FEkP^>U3XQ_1IRoP;`7AbD>QBo5Tm101bJ8X5V8_HRXO[<IRY301dFHY50IR;f8Z7jc6HZ@`0 +M4V:A@:HRmR:Qn\aV:T<07@iP7d3;G@CP7d3:g@=RTD3V8_HmXO[<@9d88Y50iR;f8Z7jc6HZ@80 +MCn:A@BHRmR:Qn\aV:T207D_a`H\>P40a`HZ>P00a`HX>U16^34jD?lf93[X0o]IFKPe>U3o=RHj +j?KjFEWY^`2h101@<l1@ocHV>^Qdl8?41[P3051GocHT>^Sfnh?41X\N93[6A`<0RlL50`1@j3OM +FE1B<m:h40iIFnS`bXTF:SZS:3[71R`j~2_P<0jfB;gXX1V8_HmXO[<@adEH_70lI@j4okFCd3 +079?Rmn:@06HRmR:Qn\aV:T<07@mRmn:@0:HRmR:Qn\aV:T<07@[^0<0D8_70lI@ocHV>^Qcnh?4 +1X\N9S[6A`<0a`H\>P40j`Q6Rmj0>@1eUEmN`eF;k5J3OPH0MBb;MPR3OPPkLPb;AP@5AP2Y0`1e +0Dk7APH00>\3odH6Reh6dN<i]`XjM_;[8H=n1P=b2h]610E60:T307@3odh8Reh6Bm7SRhL:>P56 +28=n1PAbNg@8Pgh62WMcMFb;GPKAhh=n111n3h=n1PAe2H^?23Z3`@O[18^?2SZ;GPB1`k87m\<3 +M059Reh4@m7kdO\3fKQ]0OMV10?31@@0<m:k1`3glb_:RdH8Pgh617D>>l5g5WDIP7h:0W8Cj``k +`G88M@^0OPX1M`Fh0@3[0S?0GUg2201ERnb1k8P0EUN;OPB;MPHk?S8dLPZh1P1@j=[7jMl0RdH8 +@3d207<5<l3Yd@2;gm7SmhLd=008M0nh0P1@<l1@D5OXYlR3a0R;gm7SmhLd=010M@koMPQFEnRX +08?41^VL08_OdN>1Yc@doof9M_Z;APR9A_k[COm>oX]Nn_m6nXX7R4Km?0Ye1<H43DJ:A_f814J= +QWSoRmH[d87jP01l9b_`EU1Gj5\0Pl@6Rm0kaW@BPo[oM@Fhooo[?H]622]6o^\aSKIhoh=noP1e +ZHf6N?l[l8_62l1f8EJ=QWSoD5OX8023a0J;d3_6M0j3n_mdaH]620?2:lK[0h]625mNRnEM`eF; +k8]N1=7SmhLd=040M0Jh1@1@jand@8]N18]>28]F1\dQLPm@Reh4dN>1Sc@d011Hj`A@j;[6GL=F +Ec?o__8b>chb=7<Fmd@20`1d1EKXi^=IPlH@Ac\n<SAbjUmN`eIG_`@0__8bja3gA08307@5E^Ph +i5U?PlH@2omek5mN``00~3@VmbK65^I213:b\P;B13Kg1iLVUWJ7@P<CTi<B12Kg9\HFiT84U^ +M6`^04ieK6`PL6mYKWAULR1QLg=YIfi]IFid3@Y4JGIYI6DPIG9bKg8=2T5RKVmbKF5\871bKfMb +HFdPM6EbKFU^HGAYKfh=2P00~T9THVAP00~:94UT902C0@40~2V@40~3Z040~3[`41~3]042~3 +^040~3_@41~3a`40~3e@42~3g`40~3l040~3n`40~32@81~34P81~50@0001\2~49P80~3<P8i +0P00?P960Td2D`8005`2~3IP80~2KP80~2M080~2OP80~2R`80~2T`80~2V@80~2Y`80~2Z`80 +~2\P80~2]`80~2a`80~2e080~2g@80~2i080~2jP80~7m080~2o@80~210<0~7I6ERMFL0IFiS +KfAYKVMOM65RK6D0IVmbKF5d06QUK700K6mW06e_I6D0KgIULWMbJGAU079UHfmbI5m\IFiWM6P0 +M6U]IG=dHFe`07AbHFicK65dJFm^GfIYK6D0JFiTIGQOIVU\I@1`HFAOHfQQLV5SM6Eb07EeI6ES +KfAU07QhI6ESKfAU06U^L7EdGfIYK6D0KgEdL7EdGfIYK6D0HVU^HG9i07AUN7@0I6EVHGE\M01c +M79UHFd0IVUhIF@0MV5bJF5RK6D0HGAdLV9UIfU^065dM79UKV@0HVEWJFh0HWUdIF=_MFid06=X +HG9QHgAULW=UM01SKfe]IFid06=bHc<b06AUHfmTIGIULW=YKfh0IFiT06I_LVeQM01]KfAU06m` +IG9QM6U^Ig=iLgAUK@1bIF=_LVA\IFiWM6P0Lf]YL6IbKfd0Lf]YL7A_07AQHVaU07AYKFEcM65] +L01hK7@]IW9_K@1hK7@]M6l0N6ad;G=eHW=dHfQQLP1hK7@02UAbHFicK65dJFm^86U^I6Eh86IY +K6Dj820P820P820P820PKVm^I@0:E79QKW=\HGAYKfhPJFiTIGPPIVU\ICXP820P820P820P820U +L`0:D65bM20U<f@PBBm@86IYK6Dj820P820P820P820P820P820UL`1@HG9d82DcI21cM65bM7<P +KfhPK6U^ICXP820P820P820P82E\I01bIF=_LVAOHWEVIVEb071bIFeQM7EbIB15CdHPIFiSKgE^ +M6EbIF@PMfQYK6DPI6ESKfAYKVL0IG9bKg8PLVEQI6U^Ib1UKV=_I6ET86AQM640JFifHFaYI21S +J65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P9G<W06U^MV5\JF@PIFiS +KfAUI21RNGAU86=_MFid82PUI2T0IG9bKg8PLVEQI6U^Ib1UKV=_I6ET86AQM640D65bM20U<f@P +IFiTLb1_KR1\JFiU>R0P820P820P820P820UK6@0H2Ec9b1XIF5TIG8PKfi\NB1QK6a_MfET86U^ +85IFAB1VJFaUL`0UJ6@0EFiUN71UHgAUI21P9G<P9F@W051QLW@P9C=T86E^I7<PKfhPK6U^ICXP +820P820P820P820P9FaT06U^MV5\JF@PJ6EQI6Eb86I_MFiT02ET86=XHG9QHgAULW<PIGQ`IF=d +IF@P;B0UI21VKgE^I01YKWIQK6UT879UHfmbI21\IFiWM6PPLVESKg9TIF@P:2E\I2T0HfmeK6A^ +9g@PLVEQK6a_Hf5dIB0UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb04A5@UE7>R00I6ES +KfAU>R1bIF5\K6mSHGAUI20UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb00X0JFifHFaY +I21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P9G<W06U^MV5\JF@P +HfQQLV5SM6Eb82ET82P`N2D`<UPY86m^86aYKVDP9FaT86mV86IYK6DPH2Ec9`1YKWIQK6UT86=X +HG9QHgAULR0UI20X<7PU<39H:B1_KR1\JFiU82E\I21_IR1VJFaU860ULbL0JFifHFaYI21SJ65b +HF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P9G<W06eQN6U]MFdPKWE]HVEb +86mV871QLWAc879UHF=XIF@P:2ET:@15CdHPIFiSKgE^M6EbIF@PKfhPLfEQLV=X871QLg<P9F@0 +A4E2EDLj801VJFiTGfiUN7AOL65bM3XPADm686E^HfmeKWAULVET86m^87=UHG9SJ21`HG=c82ET +00X0A4E2EDLj801VJFiTGfiUN7AOL65bM3XP@fm^M6EhM3XPK6U^IB0UK6@PKfHPIVU\IB1P9G<W +00X0A4E2EDLj801VJFiTGfiUN7AOL65bM3XPDVEgJFiTJFiW86IYK6DPH2Ec9`0:06=_MFaTKRMd +86IYKV@PL65bM20UI21YKR1VJFaU860ULbL0ADm686E^HfmeKWAULVET86m^87=UHG9SJ21`HG=c +82ET06EbLVmb879UHFAYKVLPIVU\I@14AD9EAcXP06IYKVAOKVEhM5m`HG9d>R13KgE\I6hWM21V +JFiT871QLW@P9F@PJFhPIVU\IB1P9G<W00X0D65bM20U<f@PLgAQLWAc86m^86aYKVDj820P820P +820P820UK6@0IG9bKg8PLVEQI6U^Ib1UKV=_I6U^Ib1dHF9\I@1TIFIOIVU\IEm^HFeU05IFI6ES +KfAU82Ec;20ULb1bIFaUHG=U82PULbT:030^>CLPHVEdH@1=Dbe4Ce<PE7EbHVlP@`0b=B1>KgHP +<CTi<P19;e0PIVU\ICXP820P820P820P820P820P820P820P820P82Ec04mfIG9gLVUdIB1UN6Uc +M6U^Ib1VJFaULcXP820P820P820P9G<0NFEc06i_04a_Ib1VJFaU>R0P820P820P820P820P820P +820P820P820P9G<0EUITIF=_I6DPMVEbLfU_KR0UJ6@^<21_LR1\HGAULR1YLg9ULGEYLVET87A_ +86AUHfmTIB1VJFaU860ULbL:05IFAB1XIF5TIG8PIVU\IB1cL6ES>R0P820P820P820P820P9G<0 +@E=3BDT0@E=3BDT02UAbHFicK65dJFm^871ULVI_LVeUI3XP820P820P820P820PKVm^I@1dLV5^ +LfaQM6U_KR1VJFaU87AbHFicK65dIG<PIW9_KB1P9G<W87A_860ULbL0EUI586IYK6DPHfQQLV5S +M6Eb87=UM21YLb1P9G<W045C@dU907AbHFicK65dJFm^86IYK6DPM79QKW=\HGAULb1VLVm]860U +LbLPM6lPH2Ec9`1\Kf=QK21SJ65bHF=dIG8PLfEd86Uc860ULbL0@E=3BDT0@E=3BDT0EUI586IY +K6DPHfQQLV5SM6Eb87=UM21YLb1P9G<W06a_Hf5\86=XHG9QHgAULR1cIG@PJG<PH2Ec9`11Dd=9 +B@19KWAULViQK21ULW9_LR1TIGAUHgAUI21YKR0ULbPY06m`IFiOJG1OIVU\I@0]07=dI6U^07If +I@14AD9EAcXP06m`IFiOJG1OIVU\ICXPKg1UKVU^Ib1YKW1eM21VJFaU860ULbL02P1ULW9_LR1_ +L6E^JFiW86U^L7Ed86IYK6DPH2Ec9`14AD9EAcXP06m`IFiOJG1OIVU\ICXPH2Ec9b1YLb1^Kg@P +HB1bIFMeK65b86IYK6D02P1f9C0bI01SKgE\I6hWM21VJFiT871QLW@P9F@PIVU\IB1P9G<W04E^ +M6Eb86IYK6DPLg1UHfUVJF=QM6U_KR1VKg8PL65bM20UI3XP04A5@UE7>R00Kg1UKUmYL5mVJFaU +>R1_L6E^JFiW86U^L7Ed86IYK6DPH2Ec9`0:06=_MFaTKRMd86m`IFhPL65bM21VJFaU860ULbL0 +2U1QLW@P9C=T84T_D21VJFaU>R0P820P820P820P820P820P9G<0K6EWHFaOJ6AbIUmcL6ES07If +GfIYK6EOKV5]I@1fMUmVJFaUGfEhM00]07=dI6meM014AD9EAcXP06m`IFiOKg1OIVU\ICXPKg1U +KVU^Ib1_MGA`MG@PIVU\IB1P9G<W00X0A4E2EDLj801_L6E^Gfm`GfIYK6Dj86m`IFiYKVLPKgEd +L7Ed86IYK6DPH2Ec9`0:04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0Kg1UKUm_L5mV +JFaU06EbLVmb86m`IFiYKVLPKgEdL7Ed86IYK6DPH2Ec9`1?;e0PIVU\ICXP820P820P820P820P +820P820P820P820P82Ec04A5@UE7>R00Kg1UKUm_L5mVJFaU>R1P9G<W86Uc86i_M21Q879UIgE\ +HG8PIVU\I@0:07A]L5m`M7809BYc82EKGPYM07A_Kb1]HFii86=XHG9QHgAULW<P:2ET:B1YKR1U +KV=_I6U^Ib1dHF9\I@1ULW9_LR1bIF5TJFiW86E^HfmTJFiW87AQHVaU07A_Kb1]HFii86=XHG9Q +HgAULW<P:2ET:B1YKR1UKV=_I6U^Ib1dHF9\I@1gLVm^Ib1^MFeRIG8PKfHPHfQQLV5SM6EbLb0X +9F@Y86U^86E^HfmTJFiW87AQHVaU06EbLVmb86m`IFiYKVLPM79QKW=\HGAYKfhPJFiTIGPPIVU\ +IB1P9G<W06EbLVmb879UHFAYKVLPM79QKW=\HGAYKfhPJFiTIGPPIVU\I@0ULb0ULb0UL`1ULW9_ +LR1`HG9cJFiW83<PIFidLVUULb1YKR1dLV5^LfaQM6U_KR1YKVAUN21VJFaU04A5@UE7>R00L79c +GfUTN5mVJFaU>R0U<3A\I3XPAW9_KCXPH2Ec9b`PE6lj860ULbL\85Q<E2eVJFaU>R1P9G<W00X0 +ADm686E^HfmeKWAULVET869UIVmbIB1P9G<W86QUHFAULP1ULW9_LR1bIF5TJFiW86IYK6DPJ6EQ +I6EbL`1FEV=_I6DPJ6EQI6Eb860ULbLPIVmeKV@PMfQUKR1EEBmHF6AUHfmTJFiW06QUHFAULR1P +9G<W879UL6EQM6ET06QUHFAULR1P9G<W879UL6EQM6ET06EbLVmb879UHFAYKVLPIFiSKfAYKVLP +M65RK6D0EUI586QUHFAULR1P9G<W86i_M21iIG@PLgE`L6mbM6ET04U^M6EbKV5\86EbLVmb86AU +M6ESM6ET86U^82Ec:2T0LVAVJEmXIF5TIG9c06QUHFAULR1P9G<W86i_M21cMG1`Kg9dIF@PMfQU +KR1EEBmHF6AUHfmTJFiW02E\I01ULW9_LR1`HG9cJFiW87IQK7EU86mV860ULbLPJ6EQI6Eb06QU +HFAULR1P9G<W86i_M21cMG1`Kg9dIF@PMfQUKR1EEBmHF6AUHfmTJFiW02E\N01ULW9_LR1`HG9c +JFiW87IQK7EU86mV860ULbLPJ6EQI6Eb04AUHfmTJFiW86eUM6Q_I3XP820P820P820P820P820P +820PEEESKfAU2P14IF=_I6U^Ib1]IGAXKf@j820P820P820P820P820P820P85QHHfmTI@X0EWH0 +EP14IF=_I6U^Ib1]IGAXKf@j820P820P820P820P820P820P85IFHfmTI@X0M69\06EbLVmb879U +HFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\IB1P9G<W06AUIV5eK7@PEEESKfAU060Q8R<T9BHW:2TZ +:b`];Rl`<C8c=3Df=cPi>S\l?Cho@452@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJFeaMGUl0I6EV +HGE\M21HF6=_I6D0:bd`<C8c=3Df=cPi@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEYQHV=TIFIW +J6UZJfa]KVm`LG9cM7EfMgQiNP1TIFIQMFad85IFHfmTI@0[;C0a<S<d=CHg>3U1@T=4ADI7B4U: +Bda=CTm@DE9CE5EFEeQIFV5RHfAUIVMXJFY[K6e^Kg1aLW=dMGIgN7Uj00Y5KV=_I6U^Ib1dHF9\ +IB1cKgEbHfDj820P820P820P820P82Ec04E^HfmTJFiW87AQHVaU86=_KWAUKWAc>R0P820P820P +820P9Bhc<W<0820P820P820P820P820P820P820P820P820P820P820P820U;S<bL`1=Dbe4Ce<0 +EUI586IYK6DPHg9UHGAUI21_KR1Q86AYIVIULVE^M21_L6EbHGAYKVLPLgUcM6E]>R1P9G<W07AX +IB1_MGA`MG@PIVU\IB1gJFa\869U86=bIF5dIF@PMG=YKVLPM6QU86AUIV5eK7@PIVmbKF5d04eC +;DA?D`1?;e0PIVU\IB1VKg9]HG@j820P820P820P820P820P820P82Ec06UTN01FEUm9CTA5F5m6 +BDa505IFGdU>A4EHGdI9C4D0EUIOBDi4AEQOATU<A@1fMRehK7@^JFAh07If;GQ\M2iYI7P0MWH] +N6ad;VUTN01fMRehK7@^JFAh06U^MV5\JF@PIVU\IB1UKV=_I6U^Ib1]KfAU87=UM20X9F@Y00Y? +;e0PIVU\IB1]KfAU>R0P820P820P820P820P820P820P82Ec04A5@UE7>R00L65T86=XHG9QHgAU +LR1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0UI01`HF@PHfQQLV5SM6Eb87IQ +K7EU86eeLg@PHVDPJFhPM6QU879QKVMU830]<SDe04l_D21VJFaU871QI6AYKVLPHfQQLV5SM6Eb +>R0P820P820P9F@P:31h9C0bN2T0JFifHFaYI21]HGQYKGE]86IYN6ET879UHfmbI21\IFiWM6PP +LfEd82PUK6@Y06U^MV5\JF@PKF5hJFeeKB1fHG9YHF9\IB1bIF=_LV@PK6E^IgAX87=UM20X9FaT +:@1?;e0PIVU\IB1]HGQYKGE]879UHfmbI21\IFiWM6Pj820P82E\I01?;e0PIVU\IB1dJFeULgAQ +KG0j820P820P820P820P820P82Ec00YDKgAQK21RNGAULb1bIF5T>R0P820P820P820P820P820P +82E\I01DKgAQK219;e0PL65bM7<PLVEQI3XP820P820P820P820P82ET05A_M65\869iM6Ec87Mb +JGAdIFhj820P820P820P820P820P9FaT85]?Bed0E6mdHF`PHWUdIG<PMg9YM7AUKSXP820P820P +820P820P820UK6@0K65cM21bIF=_LV@PMf5c871QI6AUI21gJGAX87IQK7EU82ET82P`N2D`<WPY +06IYK6DPLfUjIB1TKfEc86i_M21]HGASJ21dJ65d879UHfmbI6ET85\UK6AM05A_M65\869iM6Ec +87MbJGAdIFhj820P820P820P820P820P9FaT85]^Kg@PLVESKg9TIFAM04=B@bdc<SXP820P820P +820P820P820P820P820P820P820P9C0hK7PPFdm;G@13DT<]<c8j820P820P820P820P820P820P +820P820P820P82D`>6ah04=B@bdc<R1TKfEc86i_M21]HGASJ21dJ65d879UHfmbI6ET85\U<3Q\ +N5d0@e93;C<b>R0P820P820P820P820P820P820P820P820P820U<3Q\N21KKVmd879UHfmbI6ET +G@0:EUITIF=_I6DP9G<\82Ec879UK6EQLfDP:2Ec:@X:030^>CLPHVEdH@1=Dbe4Ce<PE7EbHVlP +@`0b=B1>KgHP<CTi<P1FEVAUHfmTICXP9G<:2P1ELf5WICXPEUITIF=_I6DP85]aMF5\JFIYIG9c +GB0PJFi`MGAOIVU\IB0PFfmeM71eM5mVJFaUG@X:020PEV5\JF@PLGEQK6UVJFEbLb1QLVDj2PX0 +820U;S5c9G<:02l]020P9BhaLbEc9BhaLfIYK6D]Lg1UH`X0;bd0?CX]020P9BhaLbEc9BhaLfIY +K6D]IVmbKF5d820XIVmbKF5dLb1cMG1`Kg9dIF@j82Ec9G<ULbEc9G<ULbEc:@X0;bd0?CX]0200 +800P020P9BhaLbEc2P0_;@0P82D^<G<ULbD^<G=VJFaU;G=`IF<:02l]03dj;@0P82D^<G<ULe\U +;S5cIVU\IBecL6ESG@X0;bd0?CX]020P9BhaLbEc9BhaLfIYK6D]IFiSKfAYKVL]KFmTIB0P:6e_ +I6Ec87=eL71_LWAUI3XPHVU^HG9i87AUN7@Y2P0_;@0m>Rd0820U;S5c9G<:02l]020P9BhaLbEc +9BhaLfAUHfU]HF`]HfQQLRefHFaeI@X0;bd0?CX]020P9BhaLbEc9BhaLf9iM6Ec2P0_;@0m>Rd0 +820U;S5c9G=K9BhaLgAYKFEM2P0_;@0m>Rd0820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0m>Rd0 +820U;S5c9G<:02l]020P9BhaLbEc2PX0;bd0MFiQHVaU87A_865\K6mSHGAU82E\I21RNGAULb1V +Kg8PHWEVIVEb8617GgA]L5m]LfLW04A5@UE7>R00KF5YKSXPHFa\Kf=QM6ET82E\I21RNGAULb1V +Kg8PHWEVIVEb8617GgA]L5m]LfLW00X0AemYL5mRMFIVIG80Aem_L5mRMFIVIG80;bd0?CX]06QU +K70PLVEaMFEcM6ET06U^L7Ed86IYK6DPKGEcM21RIB1cL6ESJFIYIF@094UT90009BYc82EXI20U +Feh:G@1ULW9_LR1`HG9cJFiW860ULbLPJ6EQI6Eb87IQK7EU045C@dU905IFAB1SJ65bHF=dIG8P +LfEd>R0P820P820P820P820P820PKVmd879UHfmbI6ET05IFAB1VJFaU86=XHG9QHgAULR1cIG@P +Mf5c86i_M21bIF=_LVAUI01\Kf=QK21SJ65bHF=dIG8PLfEd860ULbLPHG=cMFeUI011Dd=9B@1F +ETDPHfQQLV5SM6Eb87=UM3XP820P820P820P820P820P82Ec05IFAB1]JFiYKGE]86AUHfmTIB1f +IG9cJFm^>R0P820P820PKVmd879UHfmbI6ET02EXI015LW9_LR1`HG9cJFiW860ULbLPJ6EQI6Eb +87IQK7EU>R1P9G<W05IFAB1]JFiYKGE]86AUHfmTIB1fIG9cJFm^>R0P820P820P9F@^<01FETDP +IVmbKF5d>R0P820P820P820P820P820P820P820P86i_M21bIF=_LVAUI01FETDPIVmbKF5d>R0P +820P820P820P820P820P820P820P82Ec06U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj860ULbL0 +2UIFAB1]KfAU>R0P820P820P820P820P820P820P820P820PKVmd879UHfmbI6ET00YFETDPKFmT +ICXP820P820P820P820P820P820P820P820P82Ec06U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj +860ULbL0CE<]A4mC05IFAB1_L6EbHGAYKVLPLgUcM6E]>R0P820P820P820P820PKVmd879UHfmb +I6ET05IFAB1VJFaU86m`IG9QM6U^Ib1cNG=dIFdPMf5c86i_M21bIF=_LVAUI01\Kf=QK21_L6Eb +HGAYKVLPLgUcM6E]860ULbLPHG=cMFeUI01=Dbe4Ce<0EUI586m`IG9QM6U^Ib1cNG=dIFdj820P +820P820P820P820UL`1FETDPK6m^IfEcM21bIF=_LV@PK6E^IgAX>R0P820P820P86i_M21bIF=_ +LVAUI01FETDPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820P820P86i_M21bIF=_LVAUI00ULb0U +L`0UK6@0BFifHFaYI21cIF=_KV@PMV5\MFDPKfHPH2Ec9b1XIF5TIG8j860ULbL0EUI586a_KVMU +Lg@PLVESKg9T86aUKVMdJ3XP820P820P820UK6@09FaT04U^MV5\JF@PIVUbLg@PMV5\MFDPKfHP +H2Ec9b1XIF5TIG8j860ULbL0EUI586eQN6U]MFdPLVESKg9T86aUKVMdJ3XP820P820P820UK6@0 +AG9bKg8PL65bLfU^Ib1P9G<W86QUHFAULR1fHFaeICXPH2Ec9`1FETDPM6U]IG=dHFe`>R0P820P +820P820P820P820P820P86i_M21bIF=_LVAUI01FETDPM6U]IG=dHFe`>R0P820P820P820P820P +820P820P82Ec06U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj860ULbL0HVEWJFiOMV5\MFEOHWEV +IVEb02DZLb0UFeh:G@1ULW9_LR1`HG9cJFiW87IQK7EU86mV860ULbLPJ6EQI6Eb02DZLb0U:W<P +9E]N2Ud0IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1EEBmHF6=_I6DPH2Ec9b1XIF5TIG8094UT900O +01`07`0N01l07P0O01l07P0O01h07`1ULW9_LR1QK6a_Hf5dJFiW82E\I21RNGAULb1VKg8PHWEV +IVEb860ULbL0A4E2EDLj801QK6a_Hf5dIEmRMFIVIG8j865\K6mSHGAUI20UK6@PHWUdIG<PIVmb +869eIVIULR1P9G<W00X0Hfm]KFE^M5mcM79OHWEVIVEb02DZLb0UFeh:G@1FETDPIVU\IB1SKfe] +IFid>R0P820P820P820P820P9G<0IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QUHFAULP1U +LW9_LR1SK6mcJFiW86IYK6DPH2Ec9`14AD9EAcXP06MUM6=OIVmbKF5d>R1VKg9]HG@PKVmd87=` +IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21VKg9]HG@PH2Ec9`14AD9EAcXP +06MUM6=OIVmbKF5d>R1SKfe]HFiT86aYKVDPLg1UHfUVJFEc86I_LVeQM21P9G<W00X0A4E2EDLj +801WIGASGfe_I6Dj86e_I6DPKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFif +HFaYI21]KfAU860ULbL0A4E2EDLj801WIGASGfe_I6Dj86=_KFeQKV@PK6U^IB1cL6ESJFIYIG<P +KFmTIB1P9G<W00X0A4E2EDLj801WIGASGg9UHfaUKSXPLVESKg9T86aUKVMdJ21^Kg@PLg1UHfUV +JFET86m^87AXIB1SKfe]HFiT86aYKVD02P0UK6@0JFifHFaYI21bIF=_LV@PK6E^IgAX87=`IF=Y +IVUUI21P9G<W079UHfmbI21\IFiWM6PPKGEcM21RIB1YKR1dJ6DPLV5^IfDP9FaT;BE\I20XKVmd +82E\I2T0LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT +:@14AD9EAcXP06MUM6=OLVESK6E^>R1SKfe]HFiT86aYKVDPLg1UHfUVJFEc86eQN6U]MFdPLVES +Kg9T86aUKVMdJ21P9FaT9`0:04A5@UE7>R00IfEdHemdJFeULgAQKG0j87AYKFEcM65]L21^Kg@P +Lg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1YKWIQK6UT87AYKFEcM65]L21cM79YKVLP +Lg1UHfUVJFET860ULbL0A4E2EDLj801XIF5TIG9OM7U`ICXPEUI586aYKVDPKF5dHfQULb1XIF5T +IG8j860ULbL02P1QKF9YIgE_MG<PJ6EQI6Eb86UWKVmbIF@0A4E2EDLj801XIF5TIG9OM7U`ICXP +JFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:04A5@UE7>R00KF5[IEmdJFeU +>R1THGAU871bKgIYI6ET83dP9C0dI2lU<39T;bD`<V@02P14AD9EAcXP06eQJfEOM6U]ICXPM6U] +IB1`LVmfJFAUI20m82D`<V@j9C0bI3XU<39T00X0A4E2EDLj801]HF]UGgAYKFDj87AYKFEOM21f +HFaeIB1bIGAeLViUI20m82E\I00:04A5@UE7>R00Kg1UKUm\KfMOIVU\ICXPK6mW86IYK6DPKVmd +87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0K6mW04A5@UE7>R00Kg1UKUm\KfMOIVU\ +ICXPKg1UKVU^Ib1\KfLPIVU\IB1P9G<W00X0LgATIG9b06EbLVmb86m`IFiYKVLPK6mW86IYK6DP +H2Ec9`14AD9EAcXP06m`IFiOK6mWGfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0 +I7E]KGT09BYc82Ec06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG80A4E2EDLj801` +HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dPH2Ec9`0:02D`=6@^9C0b +I2hU<39T;BD`<V@j9C0bI3XU<39T06EbLVmb871QLW=YKVLPM6U]IG=dHFe`87=dLVU^Ib1P9G<W +07UUHG8P:5UIFETY86eeLg@PHVDPJFhPM6QU879QKVMU834i=c0]<S0c=b0XKVmd82ET:@X0KFm^ +M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^Kg@P9F@Y2P1THGTP:4A4:B1]MG=d +869U86U^87AXIB1bHFiWIB0a;C<a82Q^Kg@P9F@Y2P1XKgEbLb0XB4PY86eeLg@PHVDPJFhPM6QU +879QKVMU830]<S<P:6i_M20UI2T:06eYKWEdIG<P:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0` +;CDi82Q^Kg@P9F@Y2P1cIF=_KVAc82QCDbTPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<2de>B0XKVmd +82ET:@X0A4E2EDLj801`HG9cGgAYKFDj87AYKFEOM21fHFaeIB1bIGAeLViUI20m82E\I00:06Ud +IFeOLgAb02EXI01ULW9_LR1`HG9cJFiW86UdIFdP9F@P:60ULbLY86U^87AbHFicK65dJFm^86IY +K6D0JFifHFaYI21fHFaeIB0X9F@Y86mV86UdIFdP9F@PJFhPM79QKW=\HGAYKfhPIVU\I@1gLVm^ +Ib1^MFeRIG8PKfHPMV5\MFEc86U^87AbHFicK65dJFm^86IYK6Dj82ET069eIVIULP1ULW9_LR1_ +L6E^JFiW86E^HfmTJFiW87AQHVaU86IYK6DPH2Ec9`1ULW9_LR1bIF5TJFiW86E^HfmTJFiW87AQ +HVaU86IYK6D0M6m_86eQKWTPHfQQLV5SM6EbLb1YKR1UKV=_I6U^Ib1dHF9\IB1VJFaU>R0UI01^ +Kg@PIFi_MFMX86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\ICXP9F@0IG9bKg8PKg1U +KVU^Ib1dLV5^LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP1ULW9_LR1bIF5TJFiW87AbHFic +K65dJFm^86IYK6D0J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\HGAYKfhPIVU\I@19KWAU +LViQK21ULW9_LR1TIGAUHgAUI21YKR0ULbPY079TGgQ\M5mVJFaU02EXI01YKWIQK6UT860ULbLP +J6EQI6Eb87IQK7EU86U^87AbHFicK65dJFm^86IYK6Dj860ULbL0M6m_86eQKWTPHfQQLV5SM6Eb +Lb1YKR1dLV5^LfaQM6U_KR1VJFaU>R0UI01XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\ +HGAYKfhPIVU\I@1XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1XIF5T +IG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1YKWIQK6UT86E^HfmTJFiW87AQ +HVaU82dPHfQQLV5SM6Eb831h9C0bF21TMG1\JF=QM6ET07Q\M01ULW9_LR1bIF5TJFiW87AbHFic +K65dJFm^87AQHVaU86IYK6DPH2Ec9`0:E79QKW=\HGAYKfhPM65RK6DPLfmeLV=U>R0P820P820P +820UL`1DLV5^LfaQM6U_KR1`IG9VKg9]IF@j820P820P820P820P860ULbLPM6lPH2Ec9`1SKfid +IGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL0M6EhM3XPH2Ec9`1SKfidIGQd>R1\JFiU82E\I21_ +IR1VJFaU860ULbL0A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21fHFaeIB1`LVmfJFAUI20m +82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@PM6lP<0X09C0dI2hU<39T +;RD`<V@]9C0bI3XU<39T>RD`<V@084M=E014AD9EAcXP07IfGgAYKFEcM65]L3XPEUI587AYKFEc +M65]L21cM79YKVLPLVEdMG9^87IQK7EU83dPH2Ec9`X02P1SKgE\I6hWM21QK6a_Hf5dIB0UI21R +NGAULb1dKb1SKg1i87=dLVU^Ib1P9G<W02A9I2@02REc85]I;diM>R00ADm686AUM6ESM6ET86m^ +87=dHFiTHG9T86U^L7Ed079R06=_MFaTKRMd86EhHFeYKVDP:6m`IFhY86IYK6DPH2Ec9`14AD9E +AcXP06EhHFeYKVEOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMeK65b86IYK6D02P1SKgE\I6hWM21U +N65]JFiU82QcM65d:B1VJFaU860ULbL0LVEQLfm^86I_LR1ULW9_LSXP9G<0LV80LW@0JFifHFaY +I21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86U^ +L7Ed04IYK6DPH2Ec9b1UN6UcM7<^821?MVEbMg9YM6DP?`1_L6EbHGAYKfhPHf5^HfE\K6ET06IY +K6DPH2Ec9b1UN6UcM7<0Mf80Mg@0JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0IG9b +Kg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86meM71eM000@2<T9EhV;Elm:f5RHfAUIVMXJFY[K6e^ +Kg1aLW=dMGIgN7Uj@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEX`<C8c=3Df=cPi<0108b@UGRH] +Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a +<S<d=CHg>3T`07=eLg1YHfU_MG<PJ6EQI6Eb86IYK6DPLg1UHb1P9G<W86=XHFiWIF@PM6lPH2Ec +9`00G3X0G00^00XUL`1ULW9_LR1bIF5TJFiW87=dLVU^Ib1VLVm]87=dI6U^04A5@UE7>R00Lf=Q +KUmSKFAOK6U^ICXPHfm]KF5^I21\JFiU865bIgE]IFid>R1P9G<W00X0;@14AD9EAcXP07=SHFiO +HfeTGfaYKVDj86eQM6=XIG<PLGEQK6UVJFEb>R0P820P860ULbL02P1QKF9YIgE_MG<PLGEQK6UV +JFEb860ULbL0MFi[KVmgKR1aMF5\JFIYIG8PH2Ec9`1aMF5\JFIYIG8PH2D^<G<ULbLPKGEcM21d +HF]U864PMV5\MFD0;bd0MV5\MFDPKFUcLfU^Ib1QIWAULR1aMF5\JFIYIG8PH2Ec9`1aMF5\JFIY +IG8PH2D^<G<ULbLPI6mULb1^Kg@PM65[IB1Q87IQK7EU02l]04A5@UE7>R00Lf=QKUmSKFAOK6U^ +ICXPLGEQK6UVJFEb87IQK7EU>R0P820P820PH2Ec9`0:07A_Kb1]HFii86IYK6DPKV5]IG<PLg1U +HfUVJFET04A5@UE7>R00LfEdGfIdJFeU>R1cIGAdJFiW86IYK6DPH2Ec9b1dJFeU87A_82D^<SAc +00X0@f5^KVmd87=UM21VJFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj84eC;DA?Db1TKfEc86i_ +M21cMG1`Kg9d86IYK6DPM6U]IG<PHVEVKg9U834i>30^04IYK6DPH2Ec9b1dJFeU87=UM21dKb0a +>CP`;S0a;S0a;C0`>S0`>S0`84M=E01ULW9_LR1cIGAdJFiW86IYK6DPH2Ec9b1dJFeU87A_82D^ +<SAc04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0LfEdGg1YL6EOKFmTI@1ULW9_LR1c +IGAdJFiW86e_I6DPKfHPIVU\IB1P9G<W03YL05AJ05AJ?@17CE@`@U=D~282d]800:Ed5BCTU> +AcXP00Y5DU9?DSXP00Y6@EA1C3XP04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0MG=U +LUm]IG=cHFMU02Ec9G<:02Ec9G<:06meM71eM21bIF=_LV@PM6m_86a_KVLP:2E\I21RNGAULb`P +KF5h83dP9FaT:B0]87AbMFiSHGAUI01ULW9_LR1_L6E^JFiW86IYK6DPH2Ec9`1ULW9_LR1cIGAd +JFiW86IYK6DPH2Ec9b1dJFeU87A_82D^<SAc06EbLVmb86=\Kg=YKVLPIVU\IB1P9G<W~5820P +820P820P8B4Q8B4P820P820P820P820P820P8201@410@410@410@410@4100P820P820P820T10 +@410@40D51@D51@410@410@410@410@410@410@41410@410@1PH61PH60P820P820P820P820P8 +20P820P8@410@200~~~b\FBaI;5T~22@80~9lS8000X20@00~70S<000820P00~74S<004<20`00 +~78S<004821000~7<S<0~~~~~~~55001H09P0V04X0:P~O@?oo~54`8210D620P851D54olF1A42 +ooooooooooooooooo`D5ooooooooooooooooooooo`oo8`;o3ooooolCool20PD?0_oooa?ooooo +ooooob?ooooo8olCo`1DCE00;R@T900000820P820P820@410@420P820P820P820P820P820P81 +0P820P<20P8210820P821@D51@D51@D51@820P820P820P872QD:30T20P\250h20P820PP20Q82 +0Q0240820P821PL:2PX<2@823@8A3Q<20Pl220824P820P820P8042Q^MFa\:@0051@151DD51@D +0P0D0`@D2@D51@D51@D51A@D51@D51@D51@D3aL?21@D50LD5Q@D51@D51@D50dD51@D51@D51@D +40X?3`l82Q@D1Q@B2`hD514D31@D3A@D51@D51@0L79YKW@PLf=QKVHP>R1VK6mQM6U^Ib1`KfU^ +M21VKg9]HGAc86i_M21\JFi[IF@=2P00~E7a`O7QlN7alN7ahO~27`0k05X0N02G0;D0e03c0141 +<05>0FhfLSIf=WXfOSJ2=XHfRSJA=YPfX3JZ=[<f^SK3=\LfbcK?=]<fecKK=]lfhcKW=^\fkcKc +=_\f13L:=a0g53LI=ahg9CL_=cLg@3M9=d`gDgE^04e_KP1DMFD0EfET05AXM@16LVT0Df5d05=e +KVAQN@1=KfiTHGT0E7EULfAQN@1GIFA^IG=THGT0E6QeLW=THGT0AW9YI65i05=QM7EbI65i04YQ +KP16IF80CF5b045`LP1=HGT0BWE^04YeK011MFL0DfE`04mSM01>KgH0A6ES04YQKWEQLWT0AVER +LWEQLWT0CF5bHfP0@G1bJF`0CF5i04YeKVD0BWE\N@11MFMeLg@0DfE`M6E]HVEb04mSM6mRIG80 +CVmfIFeRIG80A6ESIFeRIG80@Dd0D4d09G<P9G<P9C0bI20U<39T>RD`<V@j9C0bI20U=6@0<300 +800P02`P03X`03X`02D00<`ge3O\=`Hh5CPY>3\hBcQP>78hScRS>;8haSP00=<hhSP8>APi9STg +>DPiFST0~CK3Uj>H\i\STU04EbLVmb8300BFifHFaYI21VMFiSM6U_KR1^MFeRIG80CVlPLgES +J21VJFaU86mb86AYLVESM6mbN@1@HGAX86i_M21VKgE^I01DKflPKF5^NB1_L6E^86IYK6Ec051U +LVeYLg=YKfhPI6E^JFET049QI21VJFaU86ieKF9ULP1=IFe_LWTPHG9UKV4PM79QLfQUI01>Kg@P +IFi_MFMX86eUKFmbN@19KWIQK6UT86eUKFmbNB1RK6mSJb1QI6AbIG=c04U^MV5\JF@PIFifJG9_ +KVeUKW@0BFifHFaYI21VKg9]HG@0BFifHFaYI21QHf=ULg<PHfmTI@19KWIQK6UT86AQM640CVlP +LgESJ21TIGIYHfD0@GAdIFe`M6ET87A_879UKFmfIB1SMG9bIFid86AYLVESM6mbN@1>Kg@PLf5] +IB1TIGIYHfD0CVlPKFmbIB1VJFaUL`19KWIQK6UT865bIgE]IFid045bIb1\JG=d87A_Kb1RJFL0 +AGQUHb1VKg9]HG@PIG9bKg80@g9_Lg<]I6EfJF=U86aYKV\0CF5dJ21QLVMeKFE^M01BIG=eK7@P +M6m_86aQLVMU04IYK6DPHFabIF5TNB1UN6UcM7=6JFaU865\LVEQI7TPIGQYLgAc051_Lg=YHVaU +86AUHFA\Kf=[05E^Jfi_MfhPIG9bKg809G<j82Ec2P0=~5G2l^05E^Jfi_MfhPIG9bKg809G<j +82Ec2P0UL`X07a`O7QlN7alN7ahO~27`0k05X0N02G0;D0e03c0141<05>0Fd18THNAU16~20@1D +FP15De@0ADAD~2VGFNMIieWWD00]5^~346Qh~347Ui~37PbL~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Xne8@0j`J~2UP9e0J80 +:`A30@@0~2\01I1`@01004093X~60@00~38000~;[0HQJ000~>0@0005`1~30P0006l1~30`00 +09L1~310000>`1~31@0007P2~31P0008d2~31`0008l2~320260942~260T0Q@0g0`0060X0Q005 +2P0060\0P`0E300060`0PP113`0060d0P@0f500060h0P0245@0060l0O`285P006100OP2Z6000 +6140O@3o6@006180O03L6`0061<0N`2n7P0061@0NP2e800061D0N@178@0061H0N02T8P0061L0 +M`318`0061P0MP1O900061T0M@0=9@0061X0M03T9@0061\0L`0Y9`0061`0LP3<9`0061d0L@0Z +:`0061h0Q`3j;00061l0`P3i;@006200`@2J;P006240`00`;`006280_`34;`0062<0_P27<000 +62@0_@14<@0062D0_03J<@0062H0^`2V<`0062L0^P1I=00062P0^@1;=@0062T04`46=P0062X0 +4P6D=P0062\04@4b=`0062`04064=`0062d03`5N>00062h03P4W>@0062l03@6H>P006300304o +>`0063402`5O?00063802P7H?00063<02@6F?@0063@0206@?`0063D01`7R@00063H01P5[@@00 +63L01@4Q@`0063P0106^A00063T00`5<AP0063X00P7]B@0063\00@5]BP0063`0004OB`0063d0 +o`2JB`0063h0oP3>B`0063l0o@1GC0006400o02\C0006440n`0jC@006480nP1lC@0064<0n@37 +C@0064@0n004CP0064D0m`1bD00064H0mP3DD00064L0L`4SD@0064P0LP6WD@0064T0L@4cDP00 +64X0L06>D`0064\0K`75D`0064`0KP5@E00064d0K@4QE@0064h0K057E@0064l0J`6BE@006500 +JP7>E@006540J@7@EP006580J067E`0065<0I`7dE`0065@0IP5iF00065D0I@7PF00065H0I05N +F@0065L0H`6?G00065P0HP6MG@0065T0H@4cGP0065X0H04dG`0065\0G`6YG`0065`0GP6cH000 +65d0G@7cH00065h0G053H@0065l0~2EF<0~2H00007US~3H@0009IS~3HP000;5S~3H`000<AS +~3I0000=]S~3I@1?0OmT~3IP0000iU~3I`00021U~3J00002iU~3J@0003YU~3JP0004eU~3J`3L +061U~3K00006=U~3K@0006=U~3KP0006MU~3K`0006YU~3L00006YU~3L@3L06mU~3LP00079U +~3L`00079U~3M00007MU~3M@0007YU~3MP0007YU~3M`0`00iV~3N000015V~3N@00015V~3NP0` +02mV~3N`00039V~3O000039V~3O@00051V~3OP0008UV~3O`0e0I]V~3P0000:aV~3P@0002UW +~3PP0004IW~3P`0006mW~3Q0000:YW~3Q@3L0>]W~3QP00009X~3Q`0001iX~3R00004]X~3R@00 +00]]~3RP0008Y^~3R`0009e^~3S00c0K1^~3S@000=5^~3SP0006i_~3S`3W0:1_~3T0000>M_ +~3T@140Oe_~3TP0002U`~3T`0005M`~3U00000Ee~3U@0002Ye~3UP0004ae~3U`0007ee~3V000 +08Ue~3V@000;Qe~3VP1>0Mme~3V`3^0:if~3W01W00Eh~3W@0005Ih~3WP0005Yh~3W`0005ih +~3X000069h~3X@0a0N9i~3XP000>9i~3X`000>9i~3Y00g0OAi~3Y@0002Ej~3YP0009Ej~3Y`00 +0:5j~3Z00f0Kaj~3Z@000>9j~3ZP0001Qm~3Z`110Bim~3[00005mm~3[@120H9m~3[P0002=o +~3[`0007Qo~3\00001n3~3\@3d09J3~3\P1J0@^4~3\`1H0HR4~3]0000>R4~3]@000=B5~3]P00 +06R6~3]`1G0I>6~3^01F0K:6~3^@1D0I^7~3^P0004>8~3^`000:N8~3_00000f9~3_@1C0Hf: +~3_P1@0EN;~3_`1I0FR;~3`00006R;~3`@0001><~3`P0001b<~3``1=0I^<~3a0000?Z<~3a@00 +01V=~3aP0003n=~3a`0005V=~3b0000::=~3b@0d0NJ=~3bP0003:?~3b`0007n?~3c0000;F? +~3c@1E0Lb?~3cP000?6@~3c`0000:A~3d01<0I>B~3d@0005JC~3dP1^01jD~3d`0b0CbD~3e000 +08^D~3e@1B0G^E~3eP0009RE~3e`3a0=nE~3f0000?fE~3f@130AZF~3fP1;0DJG~3f`1:0GnG +~3g0190JjG~3g@000=2G~3gP0005FH~3g`1A0FBH~3h0180G:H~3h@170HbH~3hP160M2H~3h`00 +0?bH~3i00002NI~3i@0003jJ~3iP100@bL~3i`0007^M~3j00005ZN~3j@0005jO~3jP0009RO +~3j`000;jO~3k000~3oPT0k@0007@0oPT0kP0007P0oPT0k`0007`0oPT0l0000800oPT0l@00 +08@0oPT0lP0008H0oPT0l`0008P0oPT0m00008X0oPT0m@0008`0oPT0mP0008h0oPT0m`000900 +oPT0n0000980oPT0n@000980oPT0nP000980oPT0n`0009<0oPT0o00409@0oPT0o@0009H0oPT0 +oP0009X0oPT0o`0a0I`0oPT0004009h0oPT00@400:80oPT00P400:H0oPT00`6;01D1oPT0106: +01\1oPT01@6902D1oPT01P6807l1oPT01`400>PaoPT020550NXaoPT02@400>`boPT02P400>hb +oPT02`400?0boPT0305K0O8boPT03@40038doPT03P4003@doPT03`4005`doPT0404005hdoPT0 +4@40060doPT04P40068doPT04`4006@doPT0504004PeoPT05@400>@eoPT05P400>HeoPT05`40 +0>PeoPT060400>XeoPT06@400>`eoPT06P400?PeoPT06`40080goPT070400<XgoPT07@4000Xj +oPT07P4002@joPT07`4602PjoPT0804002`joPT08@4003XjoPT08P4003`joPT08`4J05XjoPT0 +904J05`joPT09@4J05hjoPT09P4J060joPT09`44068joPT0:04406@joPT0:@4206HjoPT0:P46 +06LjoPT0:`4406\joPT0;04406djoPT0;@4606ljoPT0;P4407<joPT0;`4607DjoPT0<04M07Tj +oPT0<@4M0>TjoPT0<P4M05TkoPT0<`4J0<TkoPT0=04J0<\koPT0=@4J0<dkoPT0=P4J0<lkoPT0 +=`6<0=4koPT0>04M0=DmoPT0>@6>04DnoPT0>P6?08HnoPT0>`4208Q0oPT0?04408U0oPT0?@6@ +08]0oPT0?P400?i4oPT0?`4`~51D01~61D41~61D81~2300000E30@00010000E60A`0300000Y7 +0A\02P0000Y80A\0200000Y90AP01P0000Y:0AP0100000Y;0@80ool0009<0Ad0S_l0009:0AP0 +1P0000a90AP01P0000Y80A\0200000Y70A\02P0000Y60A`01`0000a=0B80`_l0009>0@H0h_l0 +009?0AX0i_l0009@0@H0j?l0009A0@@0k?l0009B0AX0k_l0009C0@@0l?l0009D0AX01P0000AE +0@@0l_l0009F0@@0m?l0009G0@X0m_l0009H0@@0n?l0009I0@H0n_l0009J0@X01`0000AK0@@0 +o_l0009B0AX0200000YD0A\01P0000YK0@@0100000YH0@@01P0000AL0@@0m?l0009M0@@0m_l0 +009N0@@0n?l0009O0@@0n_l0009P0@@0o?l0009Q0@@01`0000AR0@@0o_l0009K0@@0100000YD +0A\01P0000YB0AX0200000YS0A`01P0000YT0@@0100000YU0@@0n?l0009V0@H0n_l0009E0@@0 +o_l0009W0AX01`0000AT0@@0100000YS0A`01P0000a60Ad0S_l0009;0@80ool0009X0AX01P00 +00AS0A`01P0000YY0AP0100000YY0AP01`0000aS0A`01P0000aS0A`01P0000YT0@@0100000YZ +0B<0^?l0009[0B@0n_l0009T0@@01`0000aS0A`01P0000a\0A`02P0000Y]0A\0200000Y^0@@0 +1P0000Y_0AP0100000Y`0AX0n_l0009a0AX0o?l0009b0AX0o_l0009_0AP01`0000a^0@@01P00 +00Y]0A\0200000Y\0A`01P0000aS0A`0200000Yc0BD01P0000Yd0A\0100000Ye0@@0o?l0009f +0@@01P0000Ag0AX01`0000Ah0BL0n_d0009W0AX0o_l0009d0A\0100000Yc0BD01P0000YS0A`0 +200000Y60A`02P0000Y<0A`0200000Y70A\01P0000Y80A\0100000Yi0@80nOl0009j0BP0l?L0 +009k0BT0l_T0009l0BX0m?\0009e0@@0n_l0009m0AX01`0000An0@H0o?l0009o0B\0m_d00098 +0A\0100000Y70A\01P0000Y<0A`01P0000a60A`02P0000Z00BD0200000YS0A`01P0000Z10@@0 +100000YE0@@0o_l0009W0AX01`0000B10@@0100000YS0A`01P0000b00BD0200000Z00BD02P00 +00Z20A`0200000YS0A`01P0000Z10@@0100000Y;0@@0n_l000:30@@0o?l0009E0@@01P0000AW +0AX0o_l000:10@@0100000YS0A`01P0000Z20A`0200000Z00BD01`0000b40Bd0300000Z50Bd0 +2P0000Z10B`0200000Z60AP01P0000Z70AP0100000Z70AP0100000Z60AP01P0000Z10B`01P00 +00b50Bd01`0000b40Bd0300000Z80AX0200000Z90@@01P0000Z:0AP0100000Y;0@@0o_l000:; +0Ad0S_l000::0AP01`0000b90@@01P0000Z80AX01P0000a\0A`0300000Z<0Bl02P0000Z=0A\0 +200000Z20Bh01P0000Z>0AP0100000Z?0@@0o_l000:>0AP0100000Z20Bh01`0000b=0A\02000 +00Z<0Bl02P0000Y\0A`01P0000a<0A`01P0000Y90AP0100000Yg0AX01P0000A90AP01`0000a< +0A`01P0000Y\0A`02P0000Z@0Bl0200000Z20Bh01P0000ZA0AP0100000ZB0@@0o_l000:A0AP0 +100000Z20Bh01`0000b@0Bl0200000Y\0A`01P0000bC0AX0200000Y\0Bh01P0000ZD0AP01000 +00Y;0@@0o?l000:E0@@0o_l000:D0AP01`0000a\0Bh01P0000ZC0AX01P0000a\0A`0200000Z2 +0Bh01P0000ZF0AP0100000ZG0@H0o?l000:F0AP0100000Z20Bh01`0000a\0A`01P0000a\0A`0 +200000Z20Bh01P0000ZH0AP0100000ZI0@H0o?l000:H0AP0100000Z20Bh01`0000a\0A`01P00 +00bJ0@H0l_l000:K0@H0m_l000:L0@H0n_l000:M0@80ool000:N0A\0100000ZN0A\0100000ZO +0Bl01P0000ZP0@@0100000ZQ0@X01P0000BP0@@0100000ZO0Bl01P0000ZV0H`0~41ZL17@00 +~31ZP19P00~31ZT16@00~31ZX11P00~31Z\11000~31Z`13000~31Zd12P00~31Zh12000~31Zl1 +2000~31[010P00~31[411P00~31[811P00~31[<10P00~31[@11000~31[D18000~31[H11P00 +~31[L12P00~31ZD1TP2Z0?h90:@1T@2_0?h90:<16@090Oh90:816@0?0Oh906<1U`0<~32]H1 +U00:~32]L1T`08~32V@11006~32W@1T`04~32WD1103lo`000]P1103no`000]T1W@3jo@000W@1 +T`06~336@11006~32]L1T`08~32]H1U007~336<1U`0<~32]X1WP06~32]\1U004~32]\1U007 +~33=X1WP06~33=`1W`06~32]d1U004~32WD1103no`000]d1U006~33=`1W`07~33881U`08~3 +2]h1X006~32]l1U004~32^01103no`000]l1U006~33=h1X006~32X81U`07~33881U`08~32Y01 +X006~32^41U004~32^81103no`000^41U006~33901X006~32X81U`07~33><1WP06~32^@1U004 +~32^@1U007~33><1WP06~33881U`06~32^D1U004~32T\1103lo`000^H1X@3hn`000^L1XP3j +o@000^P1103no`000^D1U006~33881U`07~33881U`06~32^T1U004~32^X11P3lo`000^T1U006 +~33881U`07~33=L1WP0<~32W<1Y00:~32X411008~32V<1X`06~32W@1T`04~32WD1103lo`00 +0^\1UP3no`000W@1T`04~32V<1X`06~32X411008~32W<1Y007~33=L1WP06~33>`1Y@0>~32V<1 +U`0<~32Wl1UP0:~32XD1T`08~32^d11P04~32^h1103ho`000T\11P3jo`000^l1UP3no`000^d1 +1P04~32XD1T`07~337l1UP06~336<1U`0<~32^`1Y@0>~32ZL1V000~31ZP1U@00~31ZX11P00 +~31Z\11000~31Z`13000~31Zd12P00~31Zh12000~31Zl12000~31[010P00~31[411P00~31[81 +1P00~31[<10P00~31[@11000~31[D1V`00~31[H11P00~31[L12P00~31ZD1``146_h90?<1a006 +~32_@12P04~32VL1a@3no`000_D12P06~31?@12P04~32_<1a007~337<1c008~32W@1a006~3 +2V<1aP04~32WD1103no`000_H1a@07~316<1aP04~32W@1a006~32W<1c006~33?L1cP04~32T\1 +103no`000_L1cP06~338`1d@06~32_P1c`04~32^011007~31?P1c`06~338`1d@06~32Y01d@06 +~32_T1c`04~32^811007~31?T1c`06~33901d@06~32V<1aP06~32_X1c`04~32T\1103jo`00 +0_\11P3lo`000_X1c`06~336<1aP07~33?`1c`04~32YT11P3lo`000_`1c`06~33?d1dP08~3 +2W@1a006~32V<1aP04~32UD11006~31?h1103lo`000_l1103no`000V<1aP04~32W@1a007~3 +3?d1dP08~32P02d`0:~32P423006~32P821004~32P<2303lo`000P@22P06~315X12P01~31082 +1004~32P423006~32P02d`0:~32PD2100:~32PH21008~32PL2a006~32PP2d@04~32PT21007 +~31?l1103no`000PX21006~310P2d@04~32PL2a006~32PH21008~32PD2100:~32P`2e004~3 +2X<1103fo`000Pd21P3ho`000Ph21P3lo`000P`2e007~330l2cP0:~32Vh11008~32VP1a006 +~32Q02c`04~32Q02c`07~336P1a006~32Vh11008~32Pl2cP06~337<1c008~32W@1a006~32V<1 +aP04~32WD1103no`000WP1a@07~316<1aP04~32W@1a006~32W<1c006~33142a004~32Q82e@3Z +o`000Q<21P3lo`000Q@21007~31142a006~331D21008~32QH2eP06~32QL2a004~32T\10P3e +o`000QP2a@3fo`000QT2a@3ho`000QX22P3jo`000Q\21007~311`2a@3lo`000WD1103no`00 +0Qd2a@06~311L2a004~32QH2eP06~32QD21008~32XP1a@08~32XT11006~32X\1cP04~32Qh2 +1P3fo`000Ql20P3ko`000WH1103lo`000R02a@3no`000Wl1a@07~318\1cP06~338T11006~3 +2XP1a@08~32QH2eP08~32TH1cP06~32R42c004~32QL2a@3\o`000QD2103^o`000Ql20P3ao`00 +0UD1103bo`000WD1103do`000R02a@3fo`000Wd1a@3ho`000WH1103jo`000Wh11P3lo`000Wl1 +f@3Zo@000R42c006~334H1cP07~331H2eP08~32R82fP0:~32R<21008~32XP1a006~32XT11004 +~32X<11006~318T11004~32XP1a007~332<21008~32R82fP0:~32R42c008~32R@2eP06~32TH1 +cP04~32T\1103no`000TH1cP07~332@2eP06~33242c008~32RD2a006~32RH2aP04~32RH2aP06 +~332D2a007~332L21006~32RP2a004~32X<11002~312P2a001~332L21006~32RT2a006~32RX2 +a004~32R\2103lo`000R`2103no`000X<11006~312X2a007~332T2a006~32^d11008~32RT2 +a006~32RX2a004~32X<11002~312X2a001~332T2a006~33>d11008~32^d11008~32RT2a006 +~32RX2a004~32R\2103lo`000R`2103no`000X<11006~312X2a007~332T2a006~32^d11008 +~32RL21006~32RP2a004~32Rd2103no`000X<11006~312P2a007~332L21006~32Rh2a006~3 +2RP2a004~32Rd2103no`000X<11006~312P2a007~332h2a006~32Rh2a006~32RP2a004~32UX1 +1006~312P2a007~332h2a006~32Q<21P04~32Rl21P3To`000S021P3Xo`000S421P3\o`000S82 +1P3`o`000S<21P3do`000S@2103ho`000SD2103jo`000SH2103lo`000SL2103no`000SP21007 +~313T21006~311<21P04~32SX2f`2<A?h902P2a004~32S\22P3no`000WL1a@07~312P2a006 +~332P2a@04~32Rd2103no`000S`2a@07~312P2a@06~33:H1e`00~31ZL1a`00~31ZP1c@00~3 +1ZT1d000~31ZX11P00~31Z\11000~31Z`13000~31Zd12P00~31Zh12000~31Zl12000~31[01 +0P00~31[411P00~31[811P00~31[<10P00~31[@11000~31[D1bP00~31[H11P00~31[L12P00 +~31P\2e@00~31jD15@5\7oh903d2505a7oh904X25`48~32T\25P46~32T`25P44~32Td2606\ +o`000Th22P3^o`000Tl26@7`o`000U026P7fo`000T`25P46~334\25P47~334X25`48~32U42 +5P44~32U821006~315425P44~32U<26`44~32UD28@7Lo@000X<1103jo`000UH22P3lo`000UL2 +2P07~317h12P3no`000UP28P7jo@000U<26`46~336<16`44~32[d17P47~316<16`46~336`1 +6`46~32UT21004~32[d17P47~315T21004~32V`16`46~33;`15P44~32[`15P44~32TX25`46 +~32UX25P44~32Td28`6do`000U02907fo`000UX25P46~334X25`47~335<29@44~32T\1103l +o`000U\2103no`000U<29@46~335`25P44~32WL15`46~315h25`7^o`000Ul29`7`o`000V02 +:07fo`000U`25P47~335d29P6\A?h904X25`4<~32V425P4:~32Tl25P48~32U025P46~32Td2 +5P44~32WL15`7lo`000V82103no`000Td25P44~32U025P46~32Tl25P46~336425P4:~32TX2 +5`47~336<25`48~32V@21006~32U425P44~32T\15`46~315425P44~32V@21006~32V<25`47 +~336<16`4:~32Wl15`48~32VD21P04~32VH2103jo`000UX11P3lo`000VD21P04~32Wl15`48 +~32V<16`46~336<16`4:~32Wl15`48~32VD21P04~32WL15`7no`000VD21P04~32Wl15`47~3 +36<16`46~336<16`4:~32Wl15`48~32VD21P04~32Wh11P3lo`000VD21P04~32Wl15`47~336<1 +6`46~336L2:P4@~32VP2:P4>~32VT2:P4<~32VX25P4:~32V\25P48~32V`2:@46~32Vd21004 +~32Vh25`7bo`000Vl25`7do`000W025`7fo`000W42103ho`000W821007~31682103jo`000W<2 +103lo`000W@25`7no`000Vd21004~32V`2:@46~32V\25P48~32VX25P4:~32VT2:P46~336P2 +:P4>~32VL2:P4@~32_L16`44~32WD2;047~314\1103no`000_L16`46~33?L16`44~32T\1103n +o`000U\21007~31?L16`46~336425`4<~32Tl25`4:~32U025`48~32Td25`46~32TX25P44~3 +2WH22P3jo`000UX1103lo`000WL15`7no`000WL25`46~317P2;P6Xo`000TX25P44~32Td25`47 +~335025`48~32Tl25`4:~32V425`4<~32WT21P04~32WX2;`7No`000W\25`7no`000P\2;046 +~317T21P04~32Pl26`48~32W`25P46~32T\11004~32Wd25`7lo`000Wh2103no`000Wl21006 +~314\11004~32W`25P46~32Pl26`47~336`16`4:~32Wl15P48~32VD21P04~32UX11P3lo`00 +0VD21P04~32Wl15P48~32V`16`46~336`16`4:~32Wl15P48~32VD21P04~32S\21P3lo`000VD2 +1P04~32Wl15P48~32V`16`46~338021P06~32[`15`44~32WD2;046~31882<07ho`000T\1103l +o`000X<2103no`000[`15`47~338021P06~32ZL17040~31ZT1:`40~31ZX11P00~31Z\11000 +~31Z`13000~31Zd12P00~31Zh12000~31Zl12000~31[010P00~31[411P00~31[811P00~31[<1 +0P00~31[@11000~31[D17`40~31[H11P00~31[L12P00~31X42<040~31`\2;@40~31e@28@40 +~31h@2M07BH@006:D1M@7::oh904D10@T80QH00@0100400@3E0@49K08A00800@020040lP41 +2EP35@0300400`0104T20@TG11D0100100@00@3C0FZ_Fa[`0GB_FaY70WZ_FaZF0S6_FaZo0942 +e`2X0]T0[P;R0;L2i@350_00b@;b0=P2m03N0_D0l0;g0?@2o`0H0`01;0<10C43I@4g0h01B0>2 +0G03S`6L0i01YP>A0KD3TP6j0i\1`0>L0L03WP7O0j01h`>R0Nh3YP7g0jP12@BY0AD4ZP4H1;<1 +6`Bd0G04]P5a1;P1M`Bi0IX4^P6T1<<1Y`C50K04a`6`1<T1c`C;0M<4c07U1<d1l@C>0O@4e`7g +1=T12@GR0AT5h`551N\1B0G^0Dl5k`5c1O01O@Gb0H05l`6G1OD1\`Gf0KL5n@701OX1i`Gk0O45 +o`7d1@028@H10Rh62@8a1PX2@`H;0Td65@9@1QL2H`HI0VX6709e1Ql2O`HP0ZP68@:b1RT2]@Hc +0[l6=0;51SP2c@Hi0\d6>P;M1S\2h0Hl0^H6=P;\1Sl2lPI10_H6BP8a1d`2>0M>0S`7C`8l1e@2 +EPME0VT7EP9e1f<2N0MU0X47IP:C1fL2Z@M^0[X7L@;F1g82o0Mc0PH8O`8928427PR20Qh8P`8\ +28H2<PR70UP8R@9K28\2I`RJ0Y`8V`:R29`2Z0RM0ZP8WP:h29l2^`RP0\H8ZP;;2:\2b`R\0]\8 +[@;N2:h2i0RX0^X8\@;`2;82m@Rc0P49_`872L<23`W40Pl9a@8O2LH28PW70RP9`@8^2LT2=0WC +0Sh9e@9B2ML2EPWP0Y49hP:H2N@2W0WU0Y`9kP:f2O02_@Wd0\l9mP;R2OL2i`Wk0_P9o0;o2AX3 +1@Xb0aH:=0<H2SH38@Xg0h8:>0?T2ST3mPXj0oh:?@?o2Sl320]00fd;@@=o2d83R0]50hT;A`>? +2dP3m0]90`4<BP<:34`32`a=0`l<K`<E3843:@b30bl<Q0=C38H3EPb70e\<SP=W38l3I`bB0h<< +VP>:3:43U`bT0id<Y@?03:H3c0bW0ll<Z`?A3:d30`fe0cT=^@==3KX3O@fk0h@=_0>>3L<3UPg4 +0kX=b0>m3LT3h0g:0nT=c0?\3MD3kPgF0`0>e`<93]P330kR0`l>i@<W3^H3FPkW0el>j0=X3^T3 +K@kb0gL>n`>63_d3S0kn0h`>0@BS3P84c0h41<h>3@C@3Pl4g@hA1>\>4`C_3Q@40@lE10X?5`@= +3aP46PlJ11`?6`@L3ad4>`lk144?B@AA3dX4G@mA16<?DPA`3e<4O`mD17l?F`BC3ed4VPmN1:0? +H0BR3f84Z@mS1:l?IPBa3fh4]`m_1;L?M`C:3gP4mPmj11X@N`A:4884KQ2317`@Q0Al48\4UQ2B +1:P@V@Bb49X4\Q2L1;l@X0C64:44kQ2Y1?4@ZPCf4:\4216\11XA[@@W4Jh4=16a13HA\P@l4K<4 +@A6d14LA]@A=4KH4FA6g16DA^@Aa4KX4LA6k17hA_@B;4L@4[a751<4AaPC14Ld4ea7>1=dAd0CS +4M84na7E1?\Ae`@H4]T47Q;M12lBi`A14^T4EA;\16HBk@B>4_04\Q;c1<<Bm0C[4_H43a?i114C +n`@R4o`4AQ<61FXC1`F04`P5P1<91IXC2PF\4`\5_Q<B1M0C6@GV4aX5o1<K1@PD70DD51d581@N +1B`D7`Da53d5=QA;1DXDC@E@55D5MaAF1G`DE`F155P5QQAI1I0DH0FJ5685ZQAS1K@DI0Fi56D5 +_AAX1KlDL0G857@5eQAe1@HEO@D>5Gl551F01CDER0Dh5H\5AaF<1GLES@Ek5Hl5P1F]1H@E^0FK +5KT5ZQFk1K@E_PFn5Kl5h1G01N0E`@G_5LT5oQG:1BhFc0Df5\h5?1K?1EdFdPEP5]<5PQH01XPF +4@JO5Q86Y1HC1[@F50K45Q\6e1HM1]dF7`K]5R06lAHQ1_\F8PH05b\60QL^1P\G<0HB5c468QLb +1R8G<`Hg5cP6A1Li1W@G>`J05d<6PQM51XTGAPJG5dL6aaM81]<GD@KE5eT6o1MK1P8HG0HS65h6 +9QQV1TLHJ@IF66X6QQQ[1XXHKPJ?66l6UQQ`1YdHL@JT68l6ZQRT1[`HY@K36:H6dQR]1^LH[`K] +6;06mQRb1P4I]0H66KD64AVi1Q<I^PHd6K\6?aVm1T@I`0I66LX6BAW;1U0Ic0I@6Lh6KaW@1WDI +d@J76M86TQWK1YLIg@J\6Ml6[QWQ1[\Ih`K06N@6bAWX1\\Il`KE6OH6gaWj1^HIn`K]6O`6laWm +1_TI7POo6CH751Xg1aTJ>0LN6ST7:1Xj1c8J@@Ll6T<7A1Y61dXJA`M[6Tl7KQYC1gDJE0Mm6UH7 +UQYH1j@JFPN^6U`7\AYM1l<JGPO<6Ul7caYW1m8JJ0OF6VX7iQY\1nXJKPO]6W07mQYb1`<KNPL6 +6g\71Q]m1bLKO`L]6h07?a^11dXKQPM<6hd7T1^>1i0KT0Nb6i47_a]A1l<KU0O<6iD7dA^F1mHK +]0OL6lL7l1_81o0Kc0L<7<h741cA1aXLf0Lf7=T7B1cJ1e4Lf`MD7>@7Eac[1fDLk@M[7?h7NQco +1jPL00R_7048\Q`32;@L30Rf70l8bA`A2<`L50SO71D83QdF21DM60PH7AT861dJ23HM70Pi7BD8 +CQdX264M:@R@7BX8Uad\29XM;@R`7CH8\adg2;<M>@S;7C\8cadl2>4M?@SZ7Cl8kAe32?0MA0PO +7TD89Qi;22PNC@PZ7Th8DAi@25<ND@QC7U<8LQia2;hNP`SB7XD8fQj62=XNR0Si7XX8oaj<208O +T`PA7iD86AnH21lOV@Q:7i`8CAnM26DOWPQU7j08QAnS29`OY0S77jD8dQnW2=lO[`SR7k88jQne +2?0O]PPK8;T87R2j23HP^`Pf8;d8ER3025`P`@R78<88TR3429lPc@RQ8=08[b3^2;DP1@W980L9 +dR082MHP2@WJ80X9hB0;2O<P30We80h9oR0?2@8Q40T68A493B4E2AHQ5PTJ8AL9924H2C4Q6PU3 +8CP9Ab5;2EhQC@UT8EH9L25I2H4QF`VC8Eh9VB5O2KdQH@W08FT9`R5[2LTQK0WF8Fd9h25g2N8Q +NPWf8G\90b9l2@dROPT?8Wl972:32B4RQ0T^8Xh9<b:?2ELRT0Uh8Y89WR:o2J@Re@Vk8]h9bB;P +2LlRh@WE8^X9f2;]2NPRkPT;8nl97B?`2AdSl@T^8o\9<2?l2C0SoPU68`P:Bb<92T\S4@YL8a`: +L2<^2W8S@0Yd8d\:MR=<2WHSC@Z78eL:RB=J2XlSG0Zk8gX:`B>:2]8SS0[H8iD:hb>H2_<SV`[g +8j8:nB>T2P`TYPXF9:P:8bBb2RHT\`XV9;D:BBBh2ULT^@YK9>4:GbCe2WHTm`Z49?T:RRCj2Y0T +o0ZB9?h:V2Co2YhT0P^P90`;YB@@2k<T4P^e91<;f2@F2m\T5`\79CD;3BE72b@UB@\Z9D\;F2E= +2f4UCP]V9E4;J2EC2fdUEP]_9EL;M2EI2hPUF`^K9E`;XbEP2jHUHP^]9FD;]REX2mhUS`_T9J4; +nbFS2`XVY@\F9ZH;8RJX2b@VZP\`9Z\;?2J^2chV^P]89[`;E2Jo2eLV`@]M9\8;GBK52gXVaP^P +9\P;XbK;2jDVc@^[9\h;ZbKA2lPVdP_^9]d;lBKP2odVhP\S9`P<:BLJ340W70a=9ah<FRLO36HW +8@aX9b<<MBLT384W9`b39bl<SBLb39XW=0c69e8<c2ML3=\WG@c_9eh<oRMV31@XJ0`S:70<:bQi +34LXNPa;:7\<BbQm36lXOPb::80<XBR13;LXP`c4:8D<d2R63>DXR0`9:HX<3BV=31DYSP`m:ID< +HBVG36\YVPan:I\<YRVO3:PYX@c@:J@<eRVY3>DY[0`=:[0<3bZh33LZ^Pa1:[d<E2[237LZa0bO +:\H<ab[:3<TZd`ca:]D<1b_M30l[g``N:n4<9R_o32X[2`df:``==R\=3E0[3PeQ:`l=HB\@3Fh[ +60ek:aT=Nb\Q3I4[8PfA:bT=Zb\k3J\[APgQ:dL=hB]83OL[B@gg:dX=4Ba;3A4\C0d[;4h=:ba? +3DD\D0e5;5L=FbaH3E\\F@ee;5X=MBaK3Hl\G0f?;6<=ZBaT3JT\I@g3;6H=`baW3MT\J0gI;6X= +kba[3OD\K0gh;8X=nRbI3@L]VPd=;I\=42fM3AP]W`dO;J0=7bfQ3Bh]XPdd;JD==bf\3FX][@ej +;K@=RRfe3HX]a0fZ;LH=\Bg?3KT]d@g0;M<=abgD3L`]ePgB;Mh=ebgP3Mh]h`gV;N@=jBgV3N`] +i`g_;NP=lRgZ3OH]N03i;H\04BjH01l^VP0f;Y`0?2jM05h^WP1W;Z00JRjW07<^Z@2<;Z\0T2j\ +09@^bP2J;]T0[RkK0;@^g02n;]d0d2kN0>8^h`01;n@02RoV02`_104`;aD1AblF0D\_605A;aT1 +HblL0FD_7P5f;b41O2lU0I`_9`6n;dD1a2mF0M\_F07P;eX1iRmK0OP_H`7k;f@1nbmV0A0`K04T +<6d1D31^0EH`L@5H<781OC1d0Gl`M@61<9<1Qc2T0Ih`YP6S<:P1ZC2Y0K\`\@6n<;81_S2d0M<` +^@7Q<;X13C6k0A<a_P4E<Kl1>S710C`a`P4n<N01A37`0EPalP5N<O<1J37d0GXam@6<<OT1Zc7j +0K@ao07F<A`2fS4^0_8a;`;l<C421S8c0P`b=08N<SD2<38n0S<b@09=<TP2H3990WPbB`9h<Td2 +VS9?0Z@bE0;4<UH2jS9N0^dbG`85<f421C=S0RLcI@8a<fX2DC=\0WLcM@9i<gH2WS=h0Z0cUP:V +<jD2_C>W0\LcZ@;=<jX2gc>b0^4c]0;^<kH2nc>h0PLd_@8^=;l2DcCM0UTdl09`=?42M3Cb0W@d +n@:4=?\2RS@20idd10>S=0D3[3@90jhd2P?@=0\3fc@>0mhd5`?P=1T3lc@K0oTd70<2=B0313DQ +0bHe8P<a=BD3=3DV0cXe9`<n=BP3ACE60d\eH0=R=F43N3ES0gleI@>==Fd3TCE^0ileL0>\=G83 +\SEc0kPeMP>j=GP3aCEo0m0eP@?I=H83fcF50mdeQP?U=HP3m3F90oLeS@?l=Hh303JW00Hf\`0J +=[@07CJf02Df^@0[=[X0D3Jk05<f_`1E=\40RCK208hfh02D=^d0Z3K^0:`fk`2a=_00\CKg0<0f +n03A=_X0ecKk0?PfoP3j=_l073L10BLg0P4\=b01<SLX0DDg:P5;=b`1ECL^0E\g;`5l=c81OcM@ +0H@gG`6E=f41VcMR0LTgJP7?=f\1ccM]0N@gN07b=hL1m3NF0OHgX`7h=j\1nSN_0A<h\05=>;41 +DSS?0EhhgP5_>>01MCSQ0J<hj@6X>>X1Z3S\0Kdhl07:>?81c3Sf0NDhm`4O>OP18cTF0RLi9P8n +>BP2A3TY0W8i<@9k>C82QCTd0YTi=P:O>Ch2^3U00[hi@@:n>DD2fcU70PDjC`87>U423CYB0Pdj +EP8Z>U\2E3YL0XTjG@:B>W\2V3Z80Z\jRP:a>X\2gcZC0^LjU@;e>YH2oCZI0_ljV`8<>ih26C^Q +0S8kXP8j>l02?c_D0U<keP9L>mh2HS_P0VLkhP9\>n@2PC_W0Ydkj@;J>n\2h3_\0^<kk`;U>o02 +mc_a0P0ln`8H??h27S`00e4l0`=C?0D3FC`S0ell<P=_?3@3Lc`e0g\l=`=o?3T3Sc`m0j4l@0>g +?483dcaP0mPlMP?Y?7P3mcaj0odlN`<7?H832Sf:0`hmS0<D?I@39SfF0b`mV0=7?IX3C3fK0dhm +WP=@?J43DcfT0eDmYP=`?JP3MCfY0gLm[0=i?K83Rcfc0i0me@>F?N03ZSgR0n8mjP<I?^`37ckd +0bHnm@<`?_L3=ckh0d0nnP=c?_h3RCh0190n0@BP?P<4hSh<1?Dn3P@0?a4403lC14`o50B1?aD4 +RSlc190oAPBT?dL4ZCm81:hoB@Bc?dX4_CmA1<LoD`C=?e@4ncmL1?hoGP@4@6L43D1Z11]0J`A; +@6`4Ed1e15U0MPAS@7L4J41o16a0P@Ab@884Td2:19I0S@BU@8h4eD2?1=U0T@CN@:l4hT2l1?I0 +_@Cj@;h4od2o10i1aP@O@LP49D7912e1bP@a@Ld4<d7>15E1d0AP@M44ID7_16]1oPAo@@05RD42 +1I911@FK@@`5bd4=1M113PGE@@l5fT4@1Mm14@GT@A<5jD4E1NU170D>@Qh5648W1Ca2:PE:@Rd5 +DT8_1EM2<PES@SD5Jd8g1Fi2>PEj@Sh5PT911Hi2A@FF@TP5XT9<1J]2C`Fg@U<5`49D1LE2E@G: +@U`5cd9M1Me2G`DB@f056d=n1B53U`Db@iP5=T>I1DI3V`E9@j@5CD>R1Di3YPEO@jP5I4>Y1FM3 +[0EY@kH5KT>d1Fm3^0F3@kl5QT?01I13`@FO@l<5Z4?41JQ3a@G5@lP5bd?91O93d@Gf@m85mT?E +1AE4ePE5A=h5BDCP1EQ4j@E[A>`5MdC]1IQ4k`FLA?05XdCa1JQ43`J^A2@6`T@U1]549PKFA2L6 +fd@X1^E4:@K_A306nD@b1P55=@H7ACH6:4Dn1R]5?`HaADP6=DE91Sm5B`I7ADd6G4E?1VY5D@Id +AE@6MdEE1XU5EPJBAF06UdEQ1Ya5H`JYAFD6[dEW1[E5J@K2AF\6bTE\1]=5L0KEAG46n4Eb1_m5 +L`H3AW`624Io1Q16P0HcAXP6=dJ91Sa6RPI1AX\6ATJY1Ta6``ITA\@6JDK51Vi6aPIhA\L6PTK> +1Xa6d0JDA]<6VTKD1[]6g0JnA]d6cTKN1]A6i`KKA^P6iDKY1^e6j`H6And654O_1Qi7l@HQAo86 +<dOc1Sa7m0HoAoD6@dOm1TI7oPI:Aol6CTL11em70`MUA`@7JdL<1gA73PN5Aa07RdLB1i576@NR +Aa\7XTLM1kM77`O7Ab87edLV1mY7:@OZAbX75TP[1b58;0LUB2l79dPa1d18<`M2B3@7JDPf1f]8 +?PM^B3l7KTQ01h98A0NEB4h7_DQ@1lA8D@OAB5D7ddQF1oI8E`L1BEP71DWU1PM9F`L@BF<75DUV +1a]9I`LmBFP7@DUY1d=9K0M9BFd7K4U^1g19K`MbBG87N4Uc1i]9M0NOBGL7XDUh1je9P@NjBH<7 +`4V61m99Q`OIBHP7gdVV1ne9^POnBK`70T[41aE:aPLIB\P7:T[91cQ:c@LjB\h7H4[A1fU:k`M] +BP88Q4X:299:2`RFBP`8VdX>2:U:4@R_BQ88d4XE2==:5`SdBQT86D\g21m;?`PcBd88=d]325i; +B0Q_BdX8UT]X29Y;L@RYBg<8[D]e2;Q;N0S8BgT8c4^G2<i;XPSRBjD8iT^V20Q<Y`P]C:T8=Db[ +23e<X`PnC:d8CDb^255<c0QGC=L8JTcJ26i<g0QjC=h8SdcH291<h0RUC>48ZDco2:a<30W0C0l9 +a4`@2NI<4@T;CA<94ddE2A]=3@TLCAL9<4dH2CA==PTjCD09CTe22EI=A0UNCDH9Ide92G9=BPUf +CFP9O4eb2I1=M0VHCGH9X4eh2K9=N`VmCG`9`DfJ2LM=X`WHCJD9g4fW2Ni=ZPWlCJ\904k92@A> +h@TEC^<9BTkU2EQ>iPUnC^T9R4kZ2I9>j`VLC_89[dke2K9>m`WFC_\9gTh32^Y>1@[lCPH:24l9 +2PY?4PX?Ca@:4DlF2R1?60Y9Ca\:DDlM2Va?7PZ1Cb4:PdlT2XQ?:`Z9Cb`:Vdl]2Yi?;`ZcCc0: +aTlb2]a?<`[_CcD:1E0l2P]@?@X;D3h:9e102SA@@@YWD48:K51P2W9@J@Z6D6X:Se1\2YQ@K`ZL +D70:`51b2\=@L`[:D7@:cU2B2]A@V`[XD9d:lE2P2_E@X@[mD:D:1e6V2PYAX`X;DJT:7E6V02=A +]P0jDKT0EE6k061A_P1_DL00NU7308UAa02QDM@0Ye7L0;AAg@35DN40cE7S0>]Ai@3`DNH00U;W +00EBjP07D^`06E;^02=Bk`0`DP41<e8E0DQB5P5=DQL1DU8H0EaB6@5VDR01L58R0GeB9063DRD1 +Y58V0JMB;P6ZDS41\e8b0N=B<`7XDS@1k58e0O5B?@7dDSh1m58o0@eC@@4BDd<15U=50B]CB04g +DdT1?5=@0D5CDP5>DeL1EE=H0EYCH05ODf81KE=T0G=CJ05jDfX1R5=j0HiCO`6JDh01`e>@0LEC +W@7FDj01i5>Q0O1CX`7bDjH1me>W0AYDZP4NE:`18UB]0D=D\058E;41C5C10E1Dd05QE=41HECC +0G1De@5fE=H1MUCH0HEDfP6BE=\1Y5CM0JQDh06ZE>X1\5C]0KiDkP7:E?01c5Cc0M5Dm`7_E?T1 +leCj0AAEo@4IEOh17ED>0R5E5P8]EAd2AED]0TME>09NECX2HUDl0VAE?@9iECh2S5E>0Y9EE`:U +EEP2[eEJ0[UEG0:oEEd2`eEP0\EEHP;9EG82cUF30^9EQ0;ZEHH2n5F80_aER@8;EXX23eJ;0Q9F +SP8DEY028EJA0S9FV08fEYX2?EJL0TiFY@9GEZL2GUJY0VmF\P9hE[<2QEJe0Y9F^0:PE[X2aEJk +0\YFb`;@E^<2ieKa0_5Fl`;oE_@23EOe0QMGm`8^EoT2>UL20dAG10=:E`d3F5L?0f5G4@=VEa83 +L5LF0gEG6@>1EbT3QeLf0iQG=`>YEcP3\ELj0l5G?0?5Ecd3eeLn0mYG@@?MEd83jEM40neGAP?` +EeH3m5MS0`MHI@<CF6L37EQY0b=HJ`<]F6h3=EQ`0ceHLP=5F7@3AeQf0faHM`=dF8L3NERC0i1H +U0>PF9H3YeRH0jeHVP>gF9d3_eRO0lUHXP?AF:<3fURc0n1Hb0?gF<X3oES;0a5IcP<CFM037EWB +0bEId`<UFMD3?UWG0dQIfP=@FN83F5Wb0eiI5@AbFAL4MeTI17mI80B>FB84U5TT19UI;PC;FBl4 +beTi1?AI>`CjFCd40EXn10eJ?`@KFT4485Y312IJA0@\FTd4<eY>13eJD0A0FU84B5YJ16AJG0AX +FUh4JeYO1:IJHPBXFV`4geY^1>=JMP@5FgP42e]k11YKO0@oFgl4@E^014iKPPALFhX4Ge^=16MK +SPB9Fi04S5^C19]KU0C0FiL4`U^H1=MKVPCTFi\47ebN125LY`@SG:T4;5bZ13=LZ`A9G:d4Beb_ +15AL\0AKG;44LEbd17=L^0B9G<P4SecK1:=Li0CNG>D4jUcX1?1Lj@@MGN\4;egk151M0`EPG@H5 +IUd71I9M2@FEG@\5UedK1IeM90FaGBD5^UdX1LQM:@GEGB\5eed^1MaM<@D3GS<52Ehd1BYN=PD] +GTH5<eiQ1DMNH`E;GVD5CUiW1EANJ@EJGV\5H5i]1FINK`E\GW45LUic1GMNM@F5GWP5Reii1IMN +P0FLGX85ZEj41JmNQPFcGXP5]ej;1KiNR@G4GXd5dUj?1MENU`GKGYP5j5jJ1NiNW0GbGYh5n5jP +1@QOZ0D>GjX54en\1AMO[PDMGk<5;Uo31CAOdPE4Gm@5CeoF1EEOe`ERGmP5KeoJ1GMOf`EjGmd5 +Q5oO1HYOh0FIGn<5VeoU1JAOm@FYG`X6_El;1\9O3@K4Ga46e5lB1]UO50KKGaP6hUlL1^UO80K` +Gb46mElR1_QO90KjGbD68F0^1RAP<0HbH386>f0d1T5P?0I3H3h6BF181TiPBPIHH4`6Gf1E1V5P +E`IUH606NF1R1WmPJPJBH6`6Vf1^1Z5POPJcH8<6_f271\mPR0KFH8X6f62=1]ePT@KRH9@6if2T +1_=P\0H6HK864V6d1SiQa0I3HMT6EV7Q1V9Qi0J2HND6[V7W1[YQkPK=H@l7dV4K1nIQ7@OcHAl7 +nF4P1aYR8@LMHRT78f8Z1beR:`M2HR`7Ef8]1feR;PMmHSD7Tf8g1iUR>0NMHST7XV8j1jIR>`NZ +HS`7[f8m1k=R@0NeHT87bV941mURA`OOHTP72F=91`aSDPLFHe@786=F1bISF@M:HeX7Cf=40@D0 +~4T@:V04T11`01~3W`:H~9=`?>1U013`03~3?`?61Ul10`00~31@X@0V812`05~33@X80Vd10P00 +~35@`\0fl11P07~380`Q0`00~6@@oe17D10`09~3B0o^17P10P00~3=QA>0GX10P0;~3@AA30G`1 +0P00~3Q1D40Gh1100=~3TQGf08811000~3R1HR0XH11`0?~3UQHD0Xd10`00~3ZQQE0I01200A +~3\aQ<0IP11000~3oaWM0I`1300C~32a[A0JP10`00~3g1^L0Z\11@0E~3ia^A0[011000~3_Qkg +0K@1200G~3bAk\0K`11@00~3]B2B0<411@0I~3`2270<H10`00~3Ab5M0LT11@0K~3EB5?0Lh1 +1@00~3Y28M0M<11P0M~3\R8?0MT10P00~3`B>N0=\10`0O~3bB>F0=h11000~3GbB^0>811@0Q +~3KBBP0>L10`00~33BGG0>X11@0S~36bG90>l10`00~3i2E50O81100U~3lRDg0OH10`00~3:BNS +0?T1100W~3=bNE~9c2MN0od1100Y~3dRMH0`420@00~3:R_@0@820@0[~3;B_=0@<20P00~3nRco +00D20`0]~3oRck01h21@00~3nBfQ02<2200_~322jB02\20P00~3VRjF02d20P0a~3YBj;02l2 +0P00~3<2nD03420`0c~3?Rn603@20`00~3a2o303L2100e~3dRne03\20`00~3Qc2m03h2100g +~3UC2_04820P00~3A36F04@20P0i~3Cc6;04H20P00~3fS7<0DP21P0k~3jC6m0Dh20P00~3YS>c +05020`0m~3]3>U05<21@00~3FCCb05P21`0o~3IcCT05l21@00~3BcFk06@22011~3FCF]07d2 +0P00~31SJ>07l21013~34CJ308<20`00~3U3JN08H21@15~3WcJC08\20@00~3<SMB08`20P17 +~3?3M808h20P00~3Q3OB09020`19~3S3O:09<20P00~3GSS909D20`1;~3ISS109P20P00~39cUa +0IX2101=~3=CUS0Ih20@00~3V3ZW09l20P1?~3XSZM0:420`00~3?c\P0J@21P1A~3BS\E0JX2 +0`00~3Gcai0:d21P1C~3ISab0;<21000~3f3bn0;L21`1E~3h3bf0;h20@00~3USgj0Kl2101G +~3XCg_0L<21000~3T3mB0LL2101I~3Vcm70L\20`00~3hT290<h21@1K~3kD1n0=<20@00~3Jd6f +0M@2101M~3MT6[0MP20`00~38D>=0M\22`1O~3:D>50NH20`00~3[TBN0NT2201Q~3^DBC0O42 +0`00~3C4JI0o@23@1S~3FdJ:0`431000~3kDV000D31@1U~3mDUh00X30`00~3KDZb00d3101W +~3NdZT01430P00~37d]k01<30P1Y~3:T]`01D30P00~3VT\d01L30`1[~3X4\^01X30P00~3cT^9 +01`31@1]~3fD]n02430`00~3EdaE02@3101_~3HDa;02P30`00~3[4b>02\31P1a~3]db30343 +0P00~3>Te203<3101c~3ADdg03L30P00~3O4e;03T3101e~3Qde003d30P00~3addm03l30`1g +~3cdde04830@00~314i^0T<33@1i~334iV0U030@00~3LU1R05430`1k~3OE1G05@30@00~3e51? +05D30`1m~3ge1406d30`00~38e6407031`1o~3<E5f07L30@00~3Ye6<07P30P21~3Ze6807X3 +0@00~3<e9K0G\31`23~3?e9?0@00~6SU<g~5Q@00095C=0220`40~4aE>;08<30P27~3cE>308D3 +0P00~3D5CA08L30`29~3F5C908X30@00~38EDV08\30@2;~395DS08`30P00~3AeE;08h3102= +~3EEDm09830@00~3TUDl09<30`2?~3W5Db09H30@00~3cUD20IL31P2A~3fEGg09d31@00~3d5Jg +0:831`2C~3gUJY0:T30`00~3QeM]0:`3102E~3SeMU0;030`00~3m5N50;<31@2G~3oUMk0;P3 +0`00~3NEQW0;\3102I~3QeQI0;l30`00~3h5Qn0<83102K~3kUQ`0<H31`00~3GUTa0ld33`2M +~3JETV0m`30@00~3Se`>0Md30`2O~3VU`30N030@00~3WEfF0>430`2Q~3Z5f;0>@31@00~3<eh1 +0NT32P2S~3?Ukf0?<30@00~3=5me0?@3102U~3>em^0?P30`00~3ZEon0?\31P2W~3]5oc~9\f0f +~5Z@000;IP<`0110<0~4lf1@00@4102[~3oF1600P40`00~3@f6?00\4102]~3CF6500l40P00 +~3dV630A441P2_~3gF5h0@40~2T@9X:`40;P0100400P000?T]3@P_01@00P0100<0~21SHM6d<0 +?0030040100002=A<Q9o0380100100400@0102830P0202<3V00300<0^`<@0P@0103;1Hl1~8 +10000@000P20ooooO`0000D0008000@0083ooomo~21P0010001P00~2P?ooogl8~20@002000 +~3o`0000T0008000X0~4ool000X000@000`0~4ooooo`d000@0~33`002000~240002P00~23P00 +1P00~2:0000@00~230000@004`00~3o`0000L000P0~32`002000~2:`002P00~25@000P046@0N +~21P000@0E~20P040P0E~20P040P0E~20P047@0N~2L0001P0J~2D@000P0E~20P04800N~24000 +4P0E~20P04200J~280000P0J~2@@000P0J~21@000P0E~20P049P0N~21@00700J~20@800P0J +~20@800P0J~20@800P0J~20@800P0J~20@800P0E~20P04100E~20P046P0E~20P047@0E~20P04 +6`0S~41@@08`00~36P0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50P0S +~56P0S~56P0S~56P0S~5100S~56P0S~50@0S~50@0S~50@0S~50P0S~50@0S~50@0S~50@0S~5 +100S~51P0S~51P0S~5100S~5100S~50@0S~50@0S~56P0S~50@0S~50@0S~50@0S~50@0S~51P0S +~52P0S~50@0S~50@0S~50@0S~51P0S~50@0S~56P0S~50P0S~50@0S~50P0S~57`0S~57`0S~5 +0@0S~50@0S~51P0S~52P0S~56P0S~5100S~56P0S~5J00E~20P040@0S~5J00S~56P0S~50@0S +~4P0@08`00~2P0@08`00~30@0S~4P0@06P00~3800S~50@0S~50@0S~50@0S~50@0S~50@0S~5 +0@0S~50P0S~50@0S~50@0S~50@0S~50@0S~50@0S~50P0S~56P0S~50@0S~50@0S~50@0S~50@0S +~50@0S~5100S~50@0S~50P0S~5100J~250009P0J~2FP009P0J~22P006`0J~21P006`0N~21080 +800J~30P0401X0044000806P000P80100J~3100<01X005X001T06P001@000P0E~20P040P0E +~20P04U@0N~21@00900E~20P040P0E~20P04V00N~2L000:00J~2D@000P0E~20P04V`0N~24000 +=00E~20P04200J~20@800P0E~20P04UP0E~20P04100E~20P04T`0J~20@800P0J~20@800P0E +~20P04V00E~20P04U@0E~20P041P0S~41@@08`00~3UP0S~5UP0S~5UP0S~5UP0S~5100S~50@0S +~51P0S~5100S~5UP0S~50@0S~50@0S~51P0S~52P0S~5UP0S~5100S~50@0S~4P0@08`00~2P0@0 +8`00~3UP0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50P0J~21@000P0E +~20P040P0E~20P040P0E~20P04a`0N~2L000?P0J~2D@000P0E~20P04bP0N~24000BP0E~20P04 +200E~20P04c@0N~21@00E00E~20P04a`0E~20P04d00N~21P00F00E~20P04a00E~20P04c@0E +~20P04300E~20P04e@0N2`8B~2G@0E~20P04e`0N~21080I`0J~30P0401X0004200805@000P04 +100J~280000P0S~41@@08`00~30@0S~50@0S~50@0S~51P0S~50P0S~5b@0S~5b@0S~50@0S~5 +0@0S~50@0S~51P0S~5100J~50P0S~5a@0S~52P0S~5a@0S~5a@0S~5k`0E~20P040@0S~50@0S +~4P0@08`00~2P0@08`00~2P0@08`00~3100J~5bP0S~5a@0S~5a@0S~5a@0S~5a@0S~5a@0S~5 +a@0S~5100S~5100S~5100S~5a@0S~50@0S~50@0S~50@0S~5100S~50P0S~50P0S~51P0S~50@0S +~50@0S~51P0S~5100S~50@0S~5100S~51P0S~51P0S~5100S~5100S~50@0S~50@0S~5a@0J~2 +6000100J~21@000P0E~20P040P0E~20P040P0J~2@@000P0J~21@000P0J~22@000P0E~20P04 +704N~2L000J`0J~2D@000P0E~20P047`4N~24000M`0E~20P04200NE08N~2P@0J~30P0201X0 +044000806P002@000P0E~20P04704J~2D@000P0J~21@000P0J~22@000P0E~20P045P4E~20P04 +:`4N~21P00S@0E~20P04;@4N2`8B~2TP0J~2D@000P0J~280000P0NP@84~2W00S~41@@08`00 +~3100S~5100S~4P0@08`00~3100S~5100S~5100S~55`4S~55`4S~55`4S~55`4S~5100S~55`4S +~50@0S~50@0S~50@0S~5;04S~55`4S~5100S~5100J~50P0S~55`4S~55`4S~52P0S~55`4S~5 +100S~55`4S~5100S~55`4S~50@0S~50@0S~5100S~55`4S~4P0@08`00~32P0S~52P0S~5100S +~4P0@08`00~37P4S~55`4S~5100S~5100J~57`4S~50@0S~50@0S~50@0S~50@0S~51P0S~52P0S +~50@0S~50@0S~50@0S~51P0S~51P0S~51P0S~50@0S~50@0S~55`4S~50P0S~50@0S~50P0S~5 +7P4S~57P4S~50@0S~50@0S~50P0S~50@0S~5100J~21@000P00^04J~2^@42~2^P42~2^`4J0<06 +~4_04N~2_@4O~2_P42~2_`46~2`044~2`@44~2`P46~2``46~2a046~2a@46~2aP4<0<1`~4a`44 +~2b04:~2b@42~2bP48~2b`44~2O`4Q~2c04Q~2c@4:~2cP440<0@~4c`4J~2^P42~2^`4J0<05 +~4d04J~2d@4J~2dP6=0<040P000<l1UP00^P42~2^`6F0<05~4_06I~2_@6J~2_P42~2_`46~2 +`044~2`@44~2`P46~2``46~2a046~2a@46~2aP4<0<1`~4a`44~2b04:~2b@42~2bP48~2b`44 +~2O`6L~2c06L~2c@4:~2cP440<0@~4_078~2_@79~2_P42~2_`46~2`044~2`@44~2`P46~2``46 +~2a046~2a@46~2aP4<0<1`~4a`44~2b04:~2b@42~2bP48~2b`44~2O`7;~2c07;~2c@4:~2cP44 +0<0@~4c`75~2^P42~2^`750<05~4^075~2^@42~2^P42~2^`750<06~4?P84~2?`84~2@084~2 +@@84~2@P84~2@`84~2A084~2A@84~2AP840<0B~4d075~2d@75~2dP7H0<040P000;`17@40_@4N +0@2n0@800;l11P00`044~2`@44~2`P46~2``46~2a046~2a@46~2aP4<0<1`~4a`44~2b04:~2 +b@42~2bP48~2b`44~2O`4P0@3<0B010<d12P00cP440<0@~4Q@84~2QP84~2Q`84~2R084~2R@84 +~2RP84~2R`84~2S086~2S@86~2SP86~2S`860<0N~4^04G0@2i0@800;X10P00^`4G0L06~4?P84 +~2?`84~2@084~2@@84~2@P84~2@`84~2A084~2A@84~2AP840<0B~31I022P06T@8:00FB0PX0 +1I<22P04U08:00NE0PX0`0@0~20@1H0^P24`FA0Yl2Y@:X0Zh2a`;90]h2m08a0cL3?`=50dP3 +`0?S0nh3m`?n0`T46`@Y1684L0Ag1:L4\0CC1?L42@D<1A455PDI1DP5C`F01L05m0Da1U06JPIe +1Wl6]@Jo1\d6k0Kb1_H6:`L\1c47>0Ll1e07D@MF1gP7P@O01l87b0O>1m07ePL921L86@PN2388 +F`Q^29`8b`ST2>X8l0P72@l9;PTd2Ch9A`U92E89EPV;2H`9T@VH2I`9\0Va2KH9_@W?2Ml9hPWe +2OP9o`T52Pd:4`XF2R4:<PYa2X8:U0[E2^@:o`X82aX;F`]]2hT;S`^Q2n8;m0\;30l<5@`P32H< +:@`_35H<P`b:39L<W@cA3=P<0`d:3CT=?0e13DH=B`e=3E@=O@fF3Kd=k0g^3@l>5@hP3R8>9`h^ +3UX>M`j<3Z<>cPk@3]L>g@k_3Pd?70lh3c\?@@m83dh?D@nJ3j8?Z@na3kL?8A0V42T@\Q364?4@ +=Q5a4NXAna4N4RlB?Q914T\BEA9V4[8B`a8?4a4C8Q=Z4c4D=QA154LDBQA@57LDZQBo5=dD1QD> +5A@E>1Dn5DLECQEg5H0EQ1FB5IPEVaFn5OhE1AH^5S`FH1J25XPFUQJL5YlFgAK]5P8G4QM45d\G +M1N05h8GRANN5lLGeAOl5`8H9QQ=65HHGAR668lHY1RZ6;<H^ARl6>dH1QTC6ALI?aU16D@IAQU9 +6GDIUaV\6JhI`1W;6M8IeAWO6NHInAWo6@\J4AXD6TXJKQYe6Y`JWQZT6ZhJ\A[B6^XJkAX36`HK +;A]<6e<KT1^Q6k8K`a_<6mHKg1_W6ndKl1\<710L6Q`f73hLEaa[76hLLaaj7;@L]Qbi7<8LbAc< +7=lL61di7DhMHAfJ7JdM\ag?7NdMl1dX7RXNDai_7W8N_Qk97\lNdQkJ7_lN0QlI7alOCAn;7i@O +UQnL7mlOhQoZ7o0O7R1L89lPXB2S8:HP[b2e8<0PaR398=8PmB3n81HQ>2538DLQEB5K8EhQI26I +8L0Q`R798N8QiB7Z8NlQm27f8@HR3b8Q8S<RWR:T8[8R^2:k8\lRf2;X8R<S:2<[8c0S@2=68d\S +DB=F8eTSG2=O8f@SJB=^8g0SLR=d8gHSO2>18h@SRB>?8k\S`B?98llSdR?H8o<SmB?g8`0T32@J +92<T9R@Z934T?BA994dTEbAK95lTKBAc97HTRRBB99PTX2BU9:PT[2Ba9;<T]BCK90LU3BDK9B4U +92DZ9C4UF2EQ9FPUKBE_9HhUU2FK9JHU]RGN9N@UlRGh9O\U42HF9R@V:RH`9ShVB2I>9U@VEbIM +9V<VIBI[9W4VLbIj9Z<VYBJ[9[4V\bJi9[lV`BK89_4VmbKm9R<W:BLg9cdW@2MD9eXWJ2M_9gDW +PbN=9i@WVRO69l`WdROH9m\W6bPS:2\X<RPl:4LXEBQ_:=0XkbSg:08Y12T9:@dY5BU[:GPYORVX +:MHYiBW`:@dZ3bXg:T4ZCRYD:WLZ`2[7:\TZlB[h:P0[1b\?:aH[7R\V:bX[;B\c:cH[n2cj;?h\ +12d7;Al]=bdn;FX]\Bfi;L0]abgB;ML]gRgV;OH]nBd8;Ph^4Bhl;VX^Nbj<;Xh^T2jD;YX^YBj[ +;Zh^]2h1;bD_;2l`;ch_A2m7;e4_IBml;i`_]bnn;l@_dRoH;m\_iRok;a0`4c0H<1d`8S0T<5P` +Oc21<8L`UC2K<9h`ZC2n<=<`eS3J<=l`hC0E<C`a?S54<DlaEC5H<EhaZc7?<MHafS7Y<NlalS4< +<S<bCC9@<UPbGC9P<WhbQ3:6<X`bTS:D<YXba3;S<^XbkC8;<a4c4c<I<alc8C<W<e4cL3=g<gTc +X3>V<k@c^S>m<ldchC?e<o\c;SA<=5<dFCAW=6ddL3B:=:<d[SCN=>0dnC@4=C@eACE;=ETeGcER +=HDeQcF==HleTCFb=KXeaCGD=MTefcGM=O@enCGl=@0f1SHA=QLf6SH[=UDfG3J9=XhfU3JO=ZDf +Z3KG=_Xf9cL\=c8g?3M2=dDgBcMK=glgQ3N<=i8gUCNK=j8gbCO<=llgi3OV=n\glSOd=oHgn3Oj +=a<h6SQ=>58hGSQV>6`hKcQe>7`hXcRV>:Ph_CRo><<hb3S:><`hiCS\>1li8cTW>CDi>cTn>D@i +BcUb>GPiNcVO>KPi_SW4>LHic3WB>M@ifcT5>PLj3CXC>QDj6cXQ>R<j:SYD>U\jRCZB>YPjXSZX +>Z\j\CZh>]ljiC[W>^djmC[o>Q<k6C\b>cXk?c]:>e0kDc]G>e`kGc]R>f`kWC^T>mXkh3_U>`<l +13`H?1hl9Ca>?54lDcaI?5llISa\?6llLcao?8llXCb[?;4l\Sbg?<dlcScC?=Plh3cV?>Tlkccg +??XloC`>?A@m9Sd\?DLmC3e@?E<mECe`?GDmNCel?GdmRcf@?IHmXCfW?JXm\CgR?NTm6ChO?R<n +9Shg?TdnFSiW?V`nKSic?W\nOSj9?Y0nYSjf?\HneSkK?]dnhSkZ?^dnmCiC?h4oRSn@?i\oXCnT +?ldoe3ok?oho140R@4]0FD1\@790UT2L@:E0[43E@=i0hT3]@?=0mT0U@C=1H45U@F]1MT5l@Gm1 +SD6B@IQ1Vd6R@L]14d8H@Qa2?493@TY2DT9M@V=2Jd9d@WY2PT:8@Xi2UT:L@Z92Zd:a@[M2`4;T +@Q936d<Q@bU3;d<b@d]3CD=>@e=3Gd=T@fM3JD=\@fi3Kd=d@h=3bd?f@`E45DA9A5Q4IdA[A754 +MdBLA:Q4[TBiA;m4`T@7AB]5=DERAFA5JTEdAGM5UdF_AKE5bTGEAOm51DH8AQ16=dI6ATa6FdIQ +AVA6VTJnA]]634L>AaA77TLQAdI7IDMdAh]7TDNXAji7]dO7AlY7d4OGAmY7jTLWB418@TQ[B6i8 +R4R>B9E8_DS4B==80DT7BA196dU3BDU9LTUhBJ59^TW0BM99gdW]BOE9ndWnB@9:3dX@BQE:6DXZ +BSY:HdYTBVU:KDYkBX5:Q4Z_B]=:6D\OBbY;<4\cBcM;Kd^4BiI;VT^PBjI;ZD^]BkQ;_4^nBkm; +b4_<Bli;fD_OBn9;iT_dB`1<1D`GC2A<:T`eC3]<?D`nC4E<CDaAC5M<HDaWC6Y<KTajC8I<Rdb= +C8m<T4bEC9i<YDbYC:a<]dbmC<1<a4cBC=i<hdceC09=24dCCAU=6ddLCB5=:4d`CCA=>Te5CD]= +CTeNCFM=Jde]CFi=LTefCGa=Qdf=CI1=X4fbCKI=^4fiCKe=`Dg7CLm=eDgHCMa=kTgbCOA=mDgl +C@1>14h<CQ9>5DhLCTY>D4iBCUQ>R4jbC[i>bTkFC]i>i4kZC_E>mdklCPY?34l?Ca5?9DlaCce? +BDmACfE?Idm\Ch=?QDn8Cc]@Ie1\D79@OE23D8I@W533D<i@e53OD>E@j53\D?5@mE07D@]A3e4K +DAeA8e4aDCMA>U5LDF1AKe5fDGYARE6QDJMAZe6aDKAAcE7CDN5AjE7`D@MB3U8EDQMB6E8NDR=B +:58\DRiB<58cDSmBAE98DX=BQe:ZD[=B^U;SD_AB5U<MDb]C;U<_DcMCCU=EDeYCGe=cDgYCR5>> +Di5CUe>JDl=CaE?=Dm=CeU?IDmeChU?TDnMClU?gDaYD75@NE29DB5A<E51DF5ANE65DIeA`E7ID +TUBME:ADYUBXE:YD\5BcE;MD_5BnE<5Dc5CAE=MDkeCcE1UE7EDQEBAE:UD]ECaE@EE3EDEEAeEE +EE]EGUEREFAES5FBEIaEXUFUEKmE`EG3ELEEbEG>EMUEgeGREOaE55HQESeFCUIAEU9FEeINEVmF +LUIcEWQFX5K5E\YFd5KNE^AFieKgE_mF=5LjEdAGBUMHEeaGHEMVEgEGN5N1EhMGSeNEEiQGaEOM +EneGl5OdEoiG15P7F1=H8eP]F3=H=EPmF4EHAeQBF5YHIEQWF6aHM5QiF8MHSER@F:eH]eRmF;mH +bESAF=YHh5S^F?AHmeSmF1=I7ETSFBEIB5U@FEQIGUUYFFmILUUoFIAIVEVPFL]IhEWdFOYI0EXV +FS=JB5YTFVQJLUZVFZQJbU[=F]mJheX5F`]K6U]1FeaKGe]WFhaKVe_2Fn]K7e`QG2=L;5a;G5AL +LeakG7iLREb?G9YLX5bSG:YLgUc`G51MIUfEGIMMWEfXGJiM\EfjGKeM`Eg6GLQMbegGGMaM0eh9 +GReN<ehnGTANAei;GTiNE5iJGV1NIUi\GW9NOEj5GX]N[ejgG[iNa5k7G\eNdUkEG]]NkUkhGPQO +3UlCGaeO:el^GcAO>em1GdAOEEmgGhYOUenIGi]OY5nYGkAO^UnmGlAOaeo=GmAOfeoRGnUOl5oe +GoYO960ZH39P>f11H4=PBF1>H5APF61OH65PIF1iH7mPTV2KH:5P\f2fH;aP_f33H<QPcf3AH=QP +gF3RH>MPlf3mH0=Q1V4BHBAQ;64gHCUQ?V53HDeQDf5FHFQQJV5`HG]QOF62HKYQcF7BHMeQhf7V +HOUQ7F8PHR=RVF:eH\YRgf8FHbISBV=?H`00~>GemSK6EQKWE`05mOHfQUHf]^MFa\05mOM6Eb +KFU^HGAU05mOLVEcM6mbIGYULVl0Gf5RKg9d04A7DTmED400Gem=CDm4AD`0Gf=XKfmcIEmhK7AO +M65RK6D0GfAUHfmTI@1OI6ESKfAUGf9iM6Ec05mVJFiTGfiUN7AOL65bM01OJFiYM6UQK6UjI@1O +Kg1UKUmYL5mVJFaU05m_L6E^GfiUN7AOL65bM01OKg1UKUm_L5mVJFaU05m`HG9cIEmUKV=OM69\ +05m`LW=OJFAhGfIYK6D0Gg9TIVUOJ6EQI6EbL`1OLVAVJEmdLV5YK6EbL`1OLfEdGfAUHfmTJFiW +GgAiL6D0Gg=UM5mUKV=OM69\05mcIGAOIVmbKF5d05mcIGAOJFAhGfIYK6D0Gg=UM5m]KfAU05mc +IGAOL65TGf=XHG80Gg=UM5mbIF=_LVAOK6E^05mcIGAOM6U]IG=dHFe`05mdIG9]JFiQM6D0GgEc +HFMUGfEbLVmb05m]HFU^05mSJ6]OLf]YL6IbKfd0GfMUM7IOHfQQLV5SM6EbLfEd05mWIGAfGfAU +HfmTIGIULW=YKfh0GfMUM7IOIVmbKF5d05mWIGAfGfe_I6D0GfMUM7IOKg1ULV5dJFiWLgUcM6E] +05mWIGAfGg9UHfaUKP1OIfEdMUmdJFeULgAQKG00Gg1QLW=UGf9UIfU^GfQUHFAULP1OLVAOKVEh +M5m\JFiU05mQK6a_Hf5dIEmRMFIVIG80GfAYLg1\HGUOHfm]KFE^M01OIUmSK6mcI@1OIfEdHemV +Kg9]HG@0GfMUM6=OKFmTI@1OIfEdHembIF=\IFh0GfMUM6=OM6U]IG=dHFe`05mXIF5TIG9OM7U` +I@1OJFiYM5mSLV<c<UmdHF9\I@1OK6m_JgE`Gf]UN@1OKF5[IEmdJFeU05m_L6E^Gfa_IemVJFaU +05m`HG9cIEmXIF5TIG80Gg1QLW=OM6U]I@1OL65bLemhK7AOM69\05mbI5mUKV=OM69\05mbI5mh +K7AOM69\05mcIGAOI6ESGgARK01OLfEdGgQ\M5mdHV`0Gg=XKgMOIVU\IEmSKfidIGQd05mfLgAb +HfQb05mfLgAbJF=]L01OMW=dLViSKG00GgIcM79^JF=]L01OMW=dLW9SJ780GgIcM79bLgAb05mf +LgAbLgAb05mfMUmdJFeULgAQKG00GgIcM79TMG00GgIcM79dLWMc05mQL71\NEmTIFIQMFadL`1O +Hfm^IVUbKEmiIG=^K`1OIGQQKFU^IEmVJFaU05mUN71\HFU^GfEbLVmb05mVGfm`IFiOJFh0GfIO +Kg1UKUm_MG@0GfIYK6EOIGQYLgAc05mVKg9SIEmVJFaUGfEhM01OJG=OHEmVJFaU05m\IFMQK5mV +JFaULg1UH`1OKF5[IEmVJFaUGg=`IF<0Gg1bKfe`M5mVKg9OLgAbJFiW05mbIF5TGf9iM6Ec05mb +IF5TGfaYKVD0Gg9UHFAOLVESKg9T05mcHf5^Gf=]I5m\JFiU05mcIGAOIWAYKFD0Gg=UM5m`JG1U +Gfe_I6D0Gg=`K6UdGfIYK6EOLg1UH`1OM7YOKfIVLfEd05meLfEbGfeULg=QIfD0GgIfGfEhJG@0 +GgMbJGAUGf9iM6Ec05mgLVUdIEmbIF=_LV@0Gf5dIGQYM01OGfA_LemWIGAVJFaUHGAdLP1OGfA_ +LemcIGAVJFaUHGAdLP1OGfA_LemWIGATLVUfI@1OGfA_LemcIGATLVUfI@1OGdA?DeA9CDEDCeD0 +GfEhJG@0GemUN6Ud05mOHfEhJG@0GemSGfEhJG@0GfMUM6AQM6D0GfMUM7AYKFD0CUm<A4UF@01< +A4UF@016Gda4BEI004iOC5E4BEI004IOC5E4BEI004aEA4UF@01>Gda=CdA004IOC4e?A400C4e? +A400CUm<EDe?A400C5E=CdA004IOC5E=CdA004iOC5Q<DdQ004aHC5=8@016GdaHC5=8@01>GdaH +EE9CB400C5QEDU=8@016GdaHEE9CB400Gem9CdEBDTmB05mOA4mCAE9BCe80GfUcHGAdN@1OGda? +CTMDCd40GemEE4m105m\LfEUJ`1OGde;CT5=A@1OGeA=D4i1C@1>GdaHCEE<@01>Ge=3Ce1I@01O +Gg9UHF@0GemcHf5^KVEb05mOLf=QKWA_K01OLfEdI65dI@1OLfEdM6U]I@1OLfEdIWAYKFD0Gemc +IGAeL6U_05mcM6U]I@1OM6U]I@1OM6E\K01OM6meL71ULP1OMFi\JFi[05mOEU1BBDiDAE80Gemc +M71SL7T0GemOHW9[05mOGg=RLV\0Gf9bJ`1OLf9bJ`1OJFmSM6`0GfIbIFD0GfeQK6a_H`1OLVEQ +K6a_H`1OGe95@Da3EU@0GemcHf5^M6mT05mOLf=QKW9cK7@0GemcHf5^L6m`04iOCeI5DTI<CeM0 +04IOCeI5DTI<CeM004mFAE96C4mG@01OHF=SIG=c05mQM6m\05mQM6mY05mOHfQ]Kf@0Gf=\Kg=U +05mOHfa_LfD0GfM]M6U]I@1OK6mSHFadJFeU05mQLf=dJFeU05mSM6U]I@1OKF]dJFeU05mcM79V +M6U]I@1OIFmV05mVHfa_LfD0GfIVK7EcJ01OIVMUM7<0GfI\MG=XHFa\05mOCe15CTI@05mOAdED +AU00GfI_L6E^05mVL79YKWAV05mVLVEQI01OIW=UIF\0GfIdIFa\05mOIWE\K71QM6P0GfIgLVUd +I@1OGfIWIGAS05mVIfEdH`1OGdiVIfEdH`1OIVMUM6=XHG80GemWIGATHgMT05mWIGAUKWH0GfeU +KF=`N@1OLfEdKFE]05m]IFecIG@0Gfe_MVeUK@1OKFE]KFmfI@1OKg1UKP1OGfm`IFh0Gg1ULW9_ +LP1OGfI`MGAS05mVL7EdH`1OIW1eM6=XHG80Gem6D5EDCP1OL7EdIFif05mOGg9UHF@0Gg9UMfU^ +I01OLfEdKFmTI@1OLfEdMV9eIP1OLg1bJFidIP1OMW=`LVU^M6H0Gg=cHf5^IP1OMW=cHf5^IP1O +LgAQM01OLgAbHf5d05mcM79SKG00Gg=dLV=`N@1OLgAbI7E`05mOLgAbIG9bKg80Gg=dLVEbLVmb +05mcM79\IFh0Gg=dLViSHG@0Gg=dLViSL7T0Gg=dLW1RLV\0GfA_LgA_MFiYN01OMFiYN7A_I6mc +05mdNW=UM01OGdUCA5=D05mOGgMbJGAU05mOMg9YM6D0GemhIV=\Kg=U05mON6IVK7EcJ014@EA1 +DdE7@01OGdU^M31FIF=dKg80Gem9KW@dEVESM6mb05mOBFid=EIUHgA_LP1OGdU^M3IFIF=dKg80 +Gem3<65bIf<0Gem3<65bIgH0Gem3<6E^MVUbKfh0GemUKWI<KVL0GemUKWIcIFL0GemUKWICJGYU +05mOL7=`05mOKg=fIG9cJFm^05mOKg=]HFY_LP1OGgIULW=YKfh0Gem_LfeYKVmb05mULW9^K`1O +Ge=dHG9dE6U]I@1OGemXIF5`HV5cI@1OGemRLV]\MV`0GemXIF5`HV5cI@1OGf9bJfafK01OGfQU +HG1dKg00GdMOKFmTIEmcM780GdMOIVedGg=dLP1OAemfMVEXI780GdMON6adJ6Ab05mOHGAUN6Ud +Hfid05mOHgAiL6D0GemUN6UdHWEV05mOIGQYM6I_L6E^05mOIGQYM6m`IFh0GemcM79UHFec05mO +KVIYK6D0Gem_L6E^IV@0GemVKFmTI@1OGfi_M5E]HG=[05mOJ6EQL6aUKP1OGfA_LfEbLVi_05mO +I6mcAG9bKg9DKe=F05mOLgA[K6E^05mOIVUbLg@0Gem\HG=d05mOLVmfIG80GemQLVMS05mOHG9W +MP1OIFifJG9_KP1OLgUcGfEbLVaYLg@0Gg=iLem^IG9b05mOKFm^M6Q4HGT0GgAjKV5]I@1OM6U] +IGY_KVD0GfAQNFaYIfQd05mODVEQK4=fM5IUHgA_LP1OGe=SHFiDKfAFIF=dKg80GdMOIFm\GfeQ +LV]ULP1OAemfMUm`LVEVJGP0GdMOMWIOHfQQLV5SM6EbGg=UM01OAemfMUm_L6EbHGAYKVMOLgUc +M6E]05m7GgIfGfAUHfmTIEmfIG9cJFm^05m7GfAUHemdNG1U05m7Gfm`Gg1QI6=XHG80GdMOLg1\ +JGAOLfUjI@1OAem_MVEbMg9YM6EOIVaQI`1OAem_L71dGfi_05m7Gfm`L65bM5mRNGAUL`1OAemY +L71dGfi_05m7GfU`L65bM5mRNGAUL`1OAemfMUmVJFaU05m7Gfm`GfIYK6D0GdMOJG1OIVU\I@1O +AemXI79VGg=`IF<0GdMOM6e`GfecI`1OAem_L5mRMFIVIG80GdMOJG1OHWEVIVEb05m7GgQ\M5md +HF9\I@1OAem\KfMOIVU\I@1OAemUKV=_I6EOM65RK6D0GdMOI6ESKfAUGgAQHVaU05m7GfAUHWEW +IfU^I`1OAemcM65dMG<0GdMOHg9S<c9OM65RK6D0GemQM6EhJGAdHV`0GemcIGAQLVMfGel0GemS +MWAVHF\0GemcIGAUKWI`Gel0Gem1B5=8BDID05mO@DQ9CT=B07IfI6ESKfAU;V<0EUI4AD=?A4D0 +N6adGfIYK6D0M6mOHfQQLW=UM01VLVm]Gf=XHG9cIG@0JFAhGg5eHFaYIVUULP1hK7AOLGEQK6UV +JFEb07=dHGAeL`1YI7QOIVU\I@1fHG9OLVESGg=YNVD0LVESKg9TGfaUKVMdJ01bIF=_LVAOHWEV +IVEb079UHemRNGAULem\IFId071QLWAOIFiTJFiW06m`Gf9eIUm`M780KVmOHWUdIG=OIFiSKfAU +I01YL5mRMFIOL7Ab06QTLUm^K`1TIF=_I6EOLgAQM6D0HWUdIG=OIGQ`IF=dIF@0HWUdIG=OI6ES +KfAUI01RMFIVIG9OLfUjI@1YI7P0HWUdIG=OK6EVM01S<`1S<P1S<@1dKG0c07A]L380M6e`<@1d +KG0`06U`GfIYK6D0L65bM5m^IFETIF@0LfEQLV=XGg1QLg<0LgAQLWAOK6U^IEm^K`1RMFIOL7Ab +06AUIUmVJFaUGfiQKFD0JG1OLGEQK6UVJFEb071bKfe`M5mcM780IVU\IEmUN7@0Kg1OIVU\I@1f +MVEOJ6AbGg=`IF<0KgIULWMbJGAUGfI\HFL0Kg1OLGEQK6UVJFEb06aUIf5\GfQTLVIOLg1UH`1f +MUmVJFaUGfEhM01fMUmVJFaUGfiQKFD0J6AbGg=dLWESM01\JFiUGg1dLP1VJFE\I7=OLVEQI01S +J65bLembIF5T07A]L5m`M780I7E]KGT0N6adGfI_MFiT06UTN5mhK7AOIVU\IG=`IF<0JFAhGgA_ +Gf=XHG9cIG@0JFAhGfIbKfeOHfQQLW=UM01SKfe]IFid069iM6EcGg9UHF@0HWEVIVEb07IfIEmX +I79OHG9bHGT0I6ESKfAYKVMOM7U`I@1fMVEOIVU\I@1Y07IfIEmUKfaOKF5bJfEb07IfIEm\JFiU +Gg1bIFIYN01hN5maMF5\JFIYIG80MGEOLGEQK6UVJFEb06E^HfmTIEmdHF9\I@1UKV=OM69\GfaU +KP1UKV=OLGEQK6UVJFEb06E^HemVJFaU06I]M5mcM79OHG9bHGT0MWIUGfmcGg=dLP1VKGAOLGEQ +K6UVJFEb06=]I5mVKg9]HG@0KFmTIEmcM79OHG9bHGT0KFmTIEmaMF5\JFIYIG80HfeTGfe_I6D0 +L65TGf=XHG80L65TGg5eHFaYIVUULP1dKG1OL65TGf=XHG80LVESGg5eHFaYIVUULP1SKFAOLVES +K6E^07AYKFEOLGEQK6UVJFEb06=]I5mdJFeULgAQKG00HfmeKW@0M6mdHFaOLVESKg9TL`1RNGAU +LemdKemgLVUdI@1VJFaUGgMQLem`HFATIF@0LVEQLfm^065bIgH0HG9WH`1RNGAULembIG5T04MO +HfeTGfm`IVU\I@17Gf=]I5mYL6IYK6D0AemSKFAaMF5\079SLfUT05Q\M5mCM79eHg@0AVU\IEm9 +KVI_04QUHFAULUmCM79eHg@0DGEQK6UVJFEbGe=dLWESM019KW@c<P19KW@a=P1EKW=YIfiUI3<b +05E^LfUWKVET<CH0EFicJFM^IF@h049iM6D0@Vm_K6EQKP1SK6mSJemd07AYKFEOM01gHfQQLUmd +071dLVAYIVIOM016BDa506I`Kg=OM01cJGYUGg@0LEmcM79YKVL0MV5\GfiUIFAUI01`LVEcIFid +07IQK7EU06IYK6EOLg1UH`1VJFaUGg1dLP1`JG1UGfI\HFL0K6U^IEm^K`1]KfAU06I_LVeQM01] +HGQOLVESGfaUKP1\KVMOLVESGfaUKP1]KfAOM6U]I@1RNGAUHfmeKW@0Hg9S<c80K6EfIF`0IVaQ +Ig<0IV@0J6m\I01RLfUjI@1SMG9`06UcM6E]L01dKf]UKP1XGg=dLVU^I`1hK7AOIW9_K@1hK7AO +M6l0N6adGgARK01FETA5@dm4ABi307IfIG1QLW=U;V<0EUI5D45BDdD0Lf]YL6IbKfeOJ6Ab06QT +LUmVJFaUGg=`IF<0L7AOKVl0L7AOIVU\IEmcL6ES06=XHG9QHgAULUmcIG@0HfQQLV5SM6EbLfEd +GfQTLP1TIF=_I6EOMVEbLfU_KP1TIF=_I6EfIG9cJFm^GfQTLP1VKg9]HGAOLgAbGf5bLV5i06I_ +LVeQM5mXI780IVmbKF5dGfi_06e_I6EOJ6Ab06e_I6EOKVl0Kg1ULV5dJFiWGg=iLgAUK@1_L6Eb +HGAYKVMcNG=dIFeOJ6Ab079UHfaUKUmXI780I7E]KGTb06AeKFei<@1^KemfHFaeIG<0M6U]IG=d +HFe`GfQTLP1dJFeULgAQKG00HVEWJFiOMV5\MFEOHWEVIVEb069iM6EOHfmeKW@0KF5hGf=XHG9c +071VN5m\IFh0IFm\Gg1dLP1FETE@@E9CABi307IfMGAYK7<^H`1FEUEDBDaC069eIUm^HFeU069e +IUm\IFh0HWUdIG=OLVEaMFUbIF@0Hfm]KFE^M5mcM79OHWEVIVEb07AQLVMUM5mVJFaU075eHFaO +IVmbKF5d075eHFaOKFmTI@1aMF5\Gg9UHfaUKP1bIF=_LVAOK6E^075eHFaOM6U]IG=dHFe`06QT +LUmQLW9QN@1XI79OIVmeKV@0Hfe`GfaUKP1SLV=OM65RK6D0Hg9SGg1_K7U^KfeYHF`0Hg9SGgAQ +HVaUGg=YNVD0LP1Z06=QLfEOLfE^LfUdJGIYM7T0HFa\KgMOHF9RLVEfL`1cM79YKVL0JfEiGfaY +Lg@0K6m_JemcM65dMG<0JfEiGfi_07A]07AOLgAbMF=d07A_M65\Gg=UHg<0M6mdHFaOI65iL`1\ +KfMOIVU\I@1\KfMOLGEQK6UVJFEb07AYKFEOLgAb07A]Gg=dLWESM01dJFeUGgIQK01QLVMc07=e +HW=dGf=XHG80N6adGgARK5mcM79eHg@0N6adGf9eIVIULP1YM6E]Gg=dLP1YM6E]Gg=dHG9d06Ud +IFeOK6E^06UdIFeOKWE]06UdIFeOIFiT06=eLW9OL7Ab079UHFAOLgAQM7Ec079UM5mcM65dMG<0 +IFiTGfmVGfaYKVD0N6adGfQTLUmQLW9QN@1TIF=_I6EOM65RK6D0I6ESGgARK5m\IFh0N6adGgAQ +HVaU06IYK6EOM6EhM01VJFaU06=X07=dLP1cM78b07=dLS40MC80MC40K6E^IgAX07=UHG9SJ5mc +M780M6QYLemiIF5bGg=UHg<0K6EQL5miIF5bGg=UHg<0NFEQLUmcIF=c06AQNG=OM6QYLem]Kfid +J01THGUOLfESL`1cIF=c06eYKW<0J6meLW<0KFAQN@1]KfidJ01iIF5b07AYKFEOLgAbJFiW06i_ +Gf9iM6Ec06E^I5m`M780KFm^M6QOI65iL`1dKEmcIF<0M6eOKFU^07A]GfQ_MG80M6eOKFAQN@1d +KEm]Kfh0M6eONFEQLP1dKEmgI65i07A]GgUTHGT0M6eOJG=TLg@0EUIEE4U<Dbi306ecI6mc;V<0 +CE=4Ce<0IWE\K5mcL6ES06AUIV5eK7AOIGQd06AUIV5eK7AOKV5]I@1`LVEQKF9\I@1`HGAXGg1Q +LWAc06EhM6E^LfU_KP1^HFeU06=_KVIYLVeOLgAb065^LgMULP1UN5mVJFaU07=dHG@0LgAQM5mR +MFIVIG80IFm\Gf=_MFid069S07A]L5mRMFIVIG80KgIULWMbJGAUGfIYK6Ec06I_LV=UI5mUN7@0 +IVU\IEmXHFiTK6D0J6AbIUmcL6ES06m`IUmcL6ES07A]L6IOLg1UH`1dKG1VGfEhM01dKG1VGfiQ +KFD0L6mcM65]HVaU06aUKP1bIGAeLViOHWEVIVEb069eIUmcJGYU06eQN5mRNGAUL`1dIFe`075e +HFaOKg1VJFaU075eHFaOJG1VJFaU075eHFaOHG9bHGT0LEmcIG1OLgAb075OJFidLVmOLgAb075Q +LVMf075QLVMS07A]L5maLgAbGg1dLP1aMV5\MFEOL7Ab075cIG1OL7Ab075OKVl0LGEQK5mVKgE^ +I01QLVMOKVl0HG9W07A]L`1`HGAXGf=_KG1_KVE^M7<0LgAQLWAOL7Ab07A]L5mVMFa\Gg=`IF<0 +M6QUGgAYKFD0LfEdGgAjGg=dLP1dNUmcM780KG=WGg=dLP1cM65dMG=OLgAb07A_Gfa_IfIYK6D0 +M6mOLgATIG9b06IYK6EOM6U]I@1VM6U]I@1VM7<0J65^I6aU05A3GgEdJFeU07=dGfAUMP1cM5mY +KVl0LgAOKFmTI@1cM5m^K6U^J`1cM5meJF@0LgAOIfUT07=dGg9TIGH0LgAOLfUjI@1cM5mQM6U] +I@1cM5m]M6U]I@1cM5mSM6U]I@1VM5mdLfES06IdGfeYKP1VM5mXKgEb06IdGfAQN@1VM5m]Kfid +J01VM5miIF5b04eCA4mC;T<0~2 diff --git a/support/vvcode/binaries/msdos/vvencode.boo b/support/vvcode/binaries/msdos/vvencode.boo new file mode 100644 index 0000000000..164164d92d --- /dev/null +++ b/support/vvcode/binaries/msdos/vvencode.boo @@ -0,0 +1,1308 @@ +VVENCODE.EXE +CE[P06L00@0P~3oonV3800~6?P000040ne1ZLP00~J0@00~~~~~~~~~~~i^^L8;XTFS@:d<<dQ +Rbh208\N;02>fZ>B08`6T0297X`0RBjX0>R10L@nRP2;ah_H^Omoo?:^hf539SP5MOJ0cH3gfHT> +RP2i0@3Chh?328?Sn8TNSP2<fR_ZRchN:h7o009c1kl00XTn7R^1anhkLRP3?SHZLR:a1=?_Ac__ +LQV3?Qh[07@7Pchf:P1e3[l043__M`N;oN\3jM`1Rml3fXTNX0297Z@0XI00:mR>`;A:EldQGm?W +nXkBRnOk<l0^SPJ=0[l`<;W^>b_?o?>ZPch8:QAfAh0nTP03LT1g1h0nT`0NLSNh0ERk0P3=8G8Z +]6N;7PPZcB5b8;A8^`40cB5b5d2SZ018S\2dBLdQLPZh0ERk~2cB5c0nUK0K@0cAZ95YH0R@jH +00[0M0bh@02>`;]`02K61`4ckBj>1Xd2_QP`_c0`j=00ocJ80?lfQP3o=X@0j2DRD>PVDRj>1Xd2 +EUNn<32o<33X[@1OG\=FEbj>1Xd2<l2;l;T_02H2183D04KRmbeL3G@9^AT0^Rl0j=`0Gek3Rnbd +C8Y60\dQ^@h0^TP0jMD07[P0=LdQRAid08`6MP2h13G=8HTNN02<1WX0^0DecB697W`0S0In0;P6 +=LdQRAj008`6PP2h02F<bXkJ^Z01cB4O`ajh02G55W@0cB4O7[P49LDFN03=8AlN^0DUaAIl0<dQ +7ajh1RG55X00cB4O`h7n631d13;Tj`:doh_GRmhkgg@S9X0oog@HPOhH<7@69SYW0N\49SQW0GL6 +9XYW0H_CPl<6jmTkeg@KRmXVP3l09\H7o`Id1bKoG`87jk4VoeL21n^Z`kA0^`80cB73^Ah0^UH0 +;XhNS@;Xj_nh0`1@j0AA~20@1ERnb1k:`0EULi9Y`0LP?XkVF3?W`a0gD<adKj~2adKhoGo[2\M6 +nP00adKh012hR@E@ogKhj;lQFEV9A_j3?W`a0gEm^28aD?mfoS?0^_eoD5;XO4B3a0R9E_:9A_23 +O_80O`]l1X=nl01c0nW:0X]6lX]Fl04FRS4A1X`aP3iA=P5e=[RC1E2hj2Q@j41bFEWo=X`aocJ: +<Omfl_mfl;RK1E2hj2Q@j2EbPl@<^=85D;SX:53X5g9IFLM6jP00jcVh8S5@ogKn<l2j;@1@D^PC +@h?428UFlXU6l8=nlP1o2gD6Pgk`07L3jDd2RdKbReK`0AJ:<A46S360?^P00GDN<oo[5H]NoXX1 +]03Ah8_HRXNN<H]NoXP1Ac]nl7;V<oo[=X]NoZ2><C819?nd0=7PdN2;f8^7ESJ;Ue@fD5:;5Y0a +XHha\@SXeE1K<mQH<l:ST3697XhaAc]nl7;5RdKbReK`RDKfREKdRdKnRDKljJl1Pcil<@=d0nVY +08=njP1d0nVP08=nmP1o47`6Pgkd:g<8ReKfRdKdj`Dcd[P[08UFkXU6k3?0^P01D5;oM_;oM_3X +VTn8AZhc`;X00E1BogKbogK`j9I?R4J_<oo[58_OPl<2SDJ^0mQCReknRP5KR0M7>gk\L^N=QUCo +D8]6kX]Fk8?20QD0051BSDJ^D>Sj5H?428UFj8U6iX]6kX]Fk2UFm1U6mX]6k056o<M6jP40jdf3 +O_H0Oa1l1X=nm2ec28]FmX]6m>\5<m:h;@29E^j9A^b=QUCoD?mfk_mfk?mfo>RV5H?428UFj8U6 +iX]6kX]Fk2UFm1U6mX]6k056o80nm001MF:;A^R;E^J3`SdE~2RDKTREKRXCX`RaHh<0=FhQ=6 +i3\6<S1l?GD6>aH`<78e^3H`D;Rb<53o=S@`j;P?Pl@6XCX`RaHh<04F6S4A1Q`aa`Hj<000a`Hh +<000ocHf<>Q?5UV=QUCoD?lfUS7XTWiIFOlfUS7XP85IadKP~2RDKN^;8`D?lfUS7oM^3oM]kX +fDV3a0R;A^2;E]j3`P4E~20AHh<146>S23O_H0OP?YB?ie2H=nm01f0nTmo^T4oEmNRnEM`eF; +k87\h01F>BJL0783j:mR^28aD;Sm053XC0UIFKSD1E2hD@1@j8lNFEV;l3?0D3?0D5Hc`52h8S5@ +j:M6Pl@:P3kF005e2<L6=3010>\EP3ie<@5e2<L6=3000>\6a`Hd<080^9hcD?lf=31F^<L0D>S= +9h?42;PI1U2h2PI@^006D;SR1E3o=Y@aj:amPl@:^9hcD?lfU36h0@1@j;Y7Pl@6^28aD;PU1U3o +=Y@aj8QmPl@6^9hcD?lfU36h0@1@j9I7Pl@6P3kF005e1KQa1^\3^7D6D;Q;1U3o=Y@aj5QmPl@6 +^9hcD?lfU36h0@1@j6I7Pl@6^9hcD;Qh1U3o=Y@aj3AmPl@6^9hcD?lfU36h0@1@j497Pl@6^9hc +D;RN1U2h0@1@j317Pl@6<l1@j1iGFE9@j:a6FEV0?WDa0GD3jCD1^28aD8e6T53X7GmIFHe6T53X +RcUIPgkXog@;RekXdN>;Q`T1j`>hk`I@^<T6D?lfU37X`7b3a0JhWS=@ocJD<KP1053XcTJ3a0J3 +O^[oM0^;G^[Ahh^73`7[0kPM1e2hm`I@ocJD<NR;O8?41[RN<e3o=Y@a^040D>RIAX?41X=nl_me +1X=nl?md7_mfl_mfl;PU1e3o=Y@aj5UlPl@8^9hcD?lfU37[2;RN<e2hC0M@^040D>QMAX?41X=n +k_me1X=nk?md7_mfk_mfk;Qg1e3o=Y@aj1elPl@8^9hcD?lfU37[2;RN<e2hWPM@^040D>PQAX?4 +1X5nmP20M@J3O_@1M0goM_KoM_CXHcAIFN\3^?07D;S91e3o=Y@aj=EkPl@6^9hcD?lfU36h0@1@ +j>=5Pl@6^28aD;P90E2=AY1@^<d0D>Q81h?42;PR<E2h3`5@SDJ@D;Rk053XM`F3a0Rh8S5@SDJ@ +D;SI053Xf`N3a0Jh8S5@SDJ@D;SO053X[@^3a0JhTS5@^28aD;S[053XfPF3a0Jh3SA@^400D;Re +053XoP>3a0JhCcA@^001D;P>=52h@01@j9d_Pl@8P3kX005d0nV00?lfj@2=QR3oD>QCOEUI^8L1 +D;RJ<E2=QR3oD>Sb;h?41_lfVS6hn0M@j4DaFET;`7A<ocJL<OlfVS6hoPM@ocJD<NSWNX?42;RN +<e3o=Y@a^080D>SeA8?41[Q8252h;0Q@ocJD<NS3NX?41[RN<e3o=Y@a^?ooD>SAA8?41^\B^9hc +D;Q>252h0@1@j;e4Pl@6^28aD;Sm053XQ@1IFKRb<53o=S@`E[P30E3XK`63a0Rh<31@^?40D;Rb +<53XM@V3a0JhE3I@^;S]^R23D5:h005@j2\QPl@8a`J@<Oooa`J><Oooa`J<<@00a`J:<@00a`HL +<@00a`HJ<@00a`Hj<000a`Hh<000a`Hf<040E^RJFUWo=SH`j<0AFEj;iEg3EH_\EUN;OPB;MPHi +9Y`0LP?XNej0O@<1M2NhUPQ@^7H8D?lfU37XhGV3a0JhWS=@ocJD<KP4053Xkd>3a0KXldB0O5<1 +M@O7A578:>\hP3iA=P5e:KRS252hj2Q@j?mZFEUF^:\8D;SX:53XlFZ3a0Jhb`Q@^>PXD>SSJUUI +E^S4=eV9A563O540MBAF^<d8D?lfU37XLWV3a0JhWS=@ocJD<KP4053XP4>3a0KXQ4B0O5<1M0UF +j5TiF@[0MCV0?U4f0GDY^>\8D;SX:53XSVYIFEJhl`Q@^>PXD>R0JX?41[PL2E2hj2Q@j79ZFEW6 +A5<1E^PW@EUOGUg3EH_\EUN;OPB;MPXi9Y`0LP?XOeg7A5400<M4F040adAJ0@37A5koolM4G?oo +adARooo7A63ooh1m0`5d0nUo0;PN2E3oM@CXb7YIF@_0MA[6A5<1^209D5KXiGYIFLM4DMPXadAJ +0@3[Dome15KXd7YIFEJh9`U@ogH6j2XdPl@6P3iA=P5e:KP[2E2hj2Q@j=1YFEUF^3<9D;SX:53X +`VV3a0JhFPU@^>PXD>RdJEUIE_mf2>PM=eUIRDAAjfNhG0U@E^QjNUUIES?0D3?0D?mf1S?0D>Ql +>H?42UJhG@U@<l1@j<4cPl@6P3iA=P5e:KQQ2E2hj2Q@j6MYFEUF^6T9D;SX:53XFFV3a0JhT0U@ +^>PXD>Q;JEUIE_mf2>Rd=UUIRDAAPgaA07DTE[RB2E3o=Y@aj=IgPl@6^9hcD?lfU36h101@j>A1 +Pl@6j>Q2E[Ra2E3o=Y@aj;9gPl@6^9hcD?lfU36h0@1@j<11Pl@6P7aC0G@9E^RL=eT:`7DiP3iA +=P5e:KSH2E2hj2Q@j=5XFEUF^>09D;SX:53X`fR3a0Jh2@Y@^>PXD>ReJ5UIaTAC0EKXJSmIGeiM +`eF;k8?\LUIGRgH4Rgh8>BJL0783j;mKP7`30GENog@4SDJ>D>QMNEUISDJ>D;P;2U0c`53X]3:3 +a0IGogH6SDJ>D>Pa9X?41YR9A_j3O_h0MBN=AXi@^0l:D?lfU37Xl7J3a0JhWS=@ocJD<KP4053X +oT23a0KX0T;[AH0nDCH1MBNh=PY@^>PXD>PIJ5UI^3h:D;SX:53X36QIFKQ_2U2hj2Q@j?mWFEVh +L@Y@SDJ>D>S@N5UI^80:D5OXaWQIFHe6SU2h`@Y@ocJD<NR2MX?41[RN<e3o=Y@a^040D>R@@8?4 +1UNhj0Y@ocJD<NQQMX?41[RN<e3o=Y@a^040D>Q_@8?41X_71B00D;PA2e3o=Y@aj3]fPl@6^9hc +D?lfU36h0@1@j4U0Pl@6Gej;iEg3EH_\Pn`2EUN;OPJ;MPXi9Y`0LP?XSU[oMPSoMPCXnaMIFHU6 +oX=no_md28]6oXU4F^\XP7aC0GD7adAJ0@3[6h=mF_md28]5FXU4F^\=PgaH07D2j`37A5X108=l +F_md3X]4F]7PReh80mR;1n\3^60;D;Pj2e3o=Y@aj:9ePl@6^9hcD?lfU36h0@1@j;0oPl@6Gej; +iEg3EH_\Pn`@EUN;OPPi9Y`0LP?Xn5VhK@]@^042D>SU5EUIR@F;GPB0O`<1M@n;GPCoM`Co=NR3 +MeUIje4c`52=A_1@SDKfD3?0D?mf1^SR?H?42_le<l1@SDK`D8e6mU0c`53XJCJ3a0Z;=N\KRPBH +RmSfQl4W17@:RPBHD>QlCeW[0XX4R0A6P3`0MN3o=KQk2e3o=Y@aj>idPl@6^9hcD?lfU36h0@1@ +j?`nPl@6Gej;iEg3EH_\EUN;MPB;OPHi9Y`0LP?XA5V0O0<1M2Nh`@]@^:4;D?lfU37XZWB3a0Jh +WS=@ocJD<KP4053X^3j3a0KX_3nhd@]@og@4j8afFET;`7D@^=<;D5OX[GIIFLI5D`7[2Omd15OX +WWIIFEmNGL=ERnb3k09FEh]n1X]f2STVW01b0nSCF?mf2?mf1>PJ5eUIRDKnPgknog@8RdKnRDAH +jb20O5<1M@O7A5P00>\CPgeHog@8RdEHRDAHj`G7A5P008]4F0_0M0Lm0@1d0^\2jbKoM5Rhf@]@ +ocJD<NSdLh?41[RN<e3o=Y@a^0@0D>P2?X?41^P6?h]4F=7PReh80mSo=kSm2e3o=Y@aj<EcPl@6 +^9hcD?lfU36h0@1@j=<mPl@6Gej;iEg3EH_\Pn`4EUN;OPJ;MPPi9Y`0LP?X65QFogH4j2XGFEV9 +E_j9A_b3O_koM@J3O_coM1R;A_j;E_b9A5j9E5c7A6;oolM4H?oojeJ0O5<1MAK7A5koolM4G?oo +adARooo7A63oon\jPgeNogD6PgeLog@JRdENReELRDANREALRdERReEPRDARREAPjaC7A5koolM4 +G?ooadARooo7A63ooh=lH_me6h=lH?me5KRN<e2h8`a@^040D>P??H?41^WV08=lFP=eKX=lHP1l +5gD6PgaP0G8?PgaR07`bO`N1O63mOgHYogARogAP^5<<D?lfU37X]G:3a0RhWS=@ocJD<KP4053X +`cb3a0KXacgoM6;oM62hN`a@ocJD<NR<LX?42;RN<e3o=Y@a^040D>RJ?8?41^]bPgaJ0WE\PgaR +07`GM@J3O601LPn3O680O39o1h5lH?moMRWoM6;oM62hXPa@ocJD<NQ1LX?42;RN<e3o=Y@a^0@0 +D>Q??8?41^QC?OmdH_mdH;S:353o=Y@aj1QbPl@8^9hcD?lfU36h0@1@j2HlPl@6PgaNogDKPgaL +ogDE^9hcD;Sa352h0@1@j0PlPl@6jNH0PgaJ0gE^PgaN07`GM@J3O5`1LPn3O5h0O39o1h5lG?eo +MRWoM5koM5bh8@e@ocJD<NR^LH?42;RN<e3o=Y@a^0@0D>Rl>h?41^S0??mdG_mdG;Q93E3o=Y@a +j8EaPl@8^9hcD?lfU36h0@1@j9<kPl@6jg:3O5X2MFb3O5h0O1Me1X=lG05b3h=lGP1l<Wl7PGaL +ogmf:OmdG_mdG;Q`3E3o=Y@aj3YaPl@8^9hcD?lfU36h101@j4PkPl@6j4`logANogAL^9P=D?lf +U37X4G63a0RhWS=@ocJD<KP1053X7c^3a0IOGX_UGL=ERnb3k0IFEh]n18]f1STVW01b0nQTEH1l +0`5d>H0nDCH1MBNh_`e@^>PXD>PLHUUI^<L=D;SX:53X3f9IFKSd3E2hj2Q@j09RFEVhWS=@^?H= +D>W:081mD`5e7lI40`2hWS=@^2@>D;P2053XYcZ3a0JhWS=@^5D>jmO7A_koolM6o?ooSDKlD;R3 +3U3oM0CXag23a0J9A_Z3O_X1M@j3O_h0Ob5e1X=no01g6Omd1;R73U3o=Y@aj3]`Pl@6ocJD<NPE +1EV3O_h0ObEl1X=no0Ac7C?0^P@0D5:hZ@i@ocJD<NP@L8?42?lfU37XjPAIReKnRdKl\@[XOd2; +GPR9E`:91omfo_mfo;S<3U3o=Y@aj>5_Pl@8^9hcD?lfU36h0@1@j>liPl@6Gej;iEg3EH_\Pn`4 +EUN;OPJ;MPPi9Y`0LP?X=5CoMPCX^1AIREKnRDKlPGkn081e1X=no05d3X]6oX]Fo8U4IXUDI>\g +P7aC0GD<adAV0837A6@10>\UPGeV081e1X=mI05d3X]5IX]EI8U4IXUDI>\:adAV0837A6@1085l +IP20M@J3O6@1M0goM6KoM6CX]BMIFN\3^1`?D;Sf3U3o=Y@aj2M_Pl@6^9hcD?lfU36h0@1@j3Di +Pl@6Gej;iEg3EH_\Pn`ZEUN;MPJ;OPPi9Y`0LP?XNU?o1H\5?F<0ORNhH`1@^2T?D?lfU37XgFj3 +a0JhWS=@ocJD<KP4053XjcR3a0KXkcV=A]I@<l1@D;Q>3e3X>PF3a0R=A]I@ocJF<NRXKUUIocJF +<NRFLEW7A_P008U6m[Rb<53o=YHaogKhogKfj>liPl@8RdKhReKfPl815@000AHh<146>S3o=KQL +3e2hC`m@ocJF<NQMKX?42?lfUS7XBW5IadKh~2RDKf^;8`D?lfUS7oM_SoM_KXXcV3a0R;A_R; +E_J3`P4E~20AHh<146>S1Fj<L?FOlf>S3o=SP`R`E8D;QO3e3o=Y@aj0I^Pl@:^9hcD?lfU36h +0@1@j1@hPl@6ocFhQPm@SDKjD>STKH?41UJ=A_Y@j9L]FEUFogH4j9L\FEV9A563O540MBAF^8`? +D?lfU37X^Ff3a0JhWS=@ocJD<KP4053XacN3a0KXbcQOGX_UGL=ERnb3k2@i9Y`0LP?X4E:QT36; +5XhaPo;o=OooXi0aRAJ><He6g50c`51@^:\?D>S]0h?428e6g53o=YHaj5]]FEWo=YHaj4U`FLM6 +oP00RDKl^;8`D?lfUS7oM_koM_cXXSR3a0R;A_j;E_b3`P4E~20AHh<146>S3o=UD1^;8?D;R\ +3e3o=YHaj0i]Pl@8ocJF<NSkKeW7A_h008U6o;Rb<53o=YHaogKnogKlj5@hPl@8RdKnReKlPl81 +5@000AHh<146>S3o=X`aocJ:<Olf?06h_`m@^;D?D?lfUS7X^6b3a0co=YHaj:E_FLM6oP00RDKl +^;8`D?lfUS7oM_koM_cXoSN3a0R;A_j;E_b3`P4E~20AHh<146>S3o=Y0aocJ><OlfB`6hcPm@ +^<8?D?lfUS7XHVb3a0co=YHaj4m_FLM6oP00RDKl^;8`D?lfUS7oM_koM_cXZ3N3a0R;A_j;E_b3 +`P4E~20AHh<146>S2Q>S2;5SP`0AHJ<A46737o=SX`ocHh<?lf=S2hd@m@ocJD<NP1K8?42[RN +<e3o=Y@a^040D>P?=X?41X4nLc78:7@8^28aD>R63EV1?P<af2Qd2;Rb<53XMPeIocJ@<OlfSS6h +n0m@ocJD<NRiJh?42;RN<e3o=Y@a^040D>S7=H?41_lfS37o=XXa^28@D?lfU37XTF^3a0RhWS=@ +ocJD<KP1053XWcF3a0Ko=Q`aocHJ<KQ9453o=Y@aj6U[Pl@8^9hcD?lfU36h0@1@j7LePl@6ocHf +<;Q`453o=Y@aj4E[Pl@6^9hcD?lfU36h0@1@j5<ePl@6PCk_<nPXM0RhWS=@j<X<FH_UGL=ERn`i +9Y`0LP?XUDnhca1@^<0@D;Rf452hUQ1@^>PXD>Q>G8?42_mf1;SK452hj2Q@j3eLPl@6^>X@D;SX +:53X;eaIFKPU4E2hj2Q@j29LFEWo=Zl0^4TAD;Po4E2hj2Q@j0eLPl@8^6HAD?lf]@2hHa5@^4`A +D;SX:53Xle^3a0[o=QD1^;0AD?lf4@6h[Q5@ocHC0KR\4E2hZ15@ocJk0;RU4E2hJQ5@^>PXD>S1 +Fh?45[S<4E3o=^\0^<TAD;Rb4E2hj2Q@j:MKPl@:ocK10;SJ4E2hd15@^>PXD>RAFh?42;Si4E3o +=\L0^?HAD;SM4E2hj2Q@j7MKPl@:^3LBD?lfc@2h=19@^?dAD;SX:53XGE^3a0[o=]<0^4DBD;Pk +4U2hj2Q@j4MKPl@8^5hBD?lff@2hFa9@^4PBD;SX:53X;E^3a0ZhNA9@ocKa0;Qf4U2hHQ9@^>PX +D>PCFh?42[RD4U3o=]l0^94BD;Qm4U2hj2Q@j?UJPl@:^;<BD?lfi@2h\19@^9PBD;SX:53XgeZ3 +a0[71U8f103XZ3AM`eF;k8?\2UIGRgh:>BJL0783j>e=^;LBD5OXTf]IFEOXDFaIRo2;GPJ3hcn: +Q`hdRmj80DK7A_H00>Vm08]N10=NmXX7V=7hdOR9A_j;GP@3G_J:1iRa1=?P9C00ReKf@X]N10?J +D8X7V;44doPU3`1J2m29E_b;A_I0Reh40mR:1iSAh=7P9C`0ReKfPl82Reh40mY@RPNH\@KCn2D3 +05X;d8UFnX]6mPD208]N10?HRPNH9Cl0RDKhReknPn<oRXL>=8_NR056ReklPn<oRXL>=8_NR056 +RekjPn<oRXL>=8_NR056RekhPn<oRXL>=8_NR056PdKf0h]6mS]61W<3jCSoRmk60@2h^Q9@EnPf +JUUI^;`BD5OX;6YIFEOXDV]I<m;[05mNRnEM`eF;k8?\15Hi9Y`0LP?XaDbh\S1@ocHf<;Rn4U3o +=Y@aj2eXPl@8^9hcD?lfU36h0@1@j3\bPl@6ocJ<<OlfRS7o=SH`^>DBD?lfU37X0FR3a0ZhWS=@ +ocJD<KP1053X3c:3a0Hcm^]?RmkAhong6@6h31=@ocJF<NSEIh?41_lfUS7X`VYIadKn~2RDKl +^;8`D?lfUS7oM_koM_cX6c>3a0R;A_j;E_b3`P4E~20AHh<146>S16RmkAhh>o6@40MJJh:A=@ +^10CD?lfUS7XOfN3a0Ko=YHaj6aZFLM6oP00RDKl^;8`D?lfUS7oM_koM_cXaC:3a0R;A_j;E_b3 +`P4E~20AHh<146>S2hGQ=@^4lCD;Pc4e3o=YHaj35WPl@8ocJF<NPNJUW7A_h008U6o;Rb<53o +=YHaogKnogKlj7LbPl@8RdKnReKlPl815@000AHh<146>S2hJQ=@ocJF<NS[IUUIocJF<NSIJEW7 +A_h008U6o;Rb<53o=YHaogKnogKlj38bPl@8RdKnReKlPl815@000AHh<146>S23OP@1M0?Ye0@c +`53o=U01^7DCD;Q\4e3o=YHaj99VPl@:ocJF<NQoJEW7A_h008U6o;Rb<53o=YHaogKnogKlj=Pa +Pl@8RdKnReKlPl815@000AHh<146>S2hQ1=@ocIT0KR14e2hN1=@ocJF<NQ0IX?42_lfUS7X;FUI +adKn~2RDKl^;8`D?lfUS7oM_koM_cXQS63a0R;A_j;E_b3`P4E~20AHh<146>S20?^P00G@3jJH0 +ocJL<Olf@@6hU1=@^8\CD?lfUS7Xi6F3a0[o=YHaj=5XFLM6oP00RDKl^;8`D?lfUS7oM_koM_cX +:S63a0R;A_j;E_b3`P4E~20AHh<146>S2h`a=@ocI60KS04e2hUa=@ocJF<NRBIH?42_lfUS7X +OfQIadKn~2RDKl^;8`D?lfUS7oM_koM_cXf323a0R;A_j;E_b3`P4E~20AHh<146>S3[D[SE4e3o +=T41^=8CD;S94e3o=YHaj3iUPl@:ocJF<NP[J5W7A_h008U6o;Rb<53o=YHaogKnogKlj8@`Pl@8 +RdKnReKlPl815@000AHh<146>S2;7WXadN?o]`T1ocIO0KST4e2hfa=@ocJF<NSVI8?42_lfUS7X +dfMIadKn~2RDKl^;8`D?lfUS7oM_koM_cX;323a0R;A_j;E_b3`P4E~20AHh<146>S2;7W`adN?o +]`l1ocIJ0KS`4e2hia=@ocJF<NR>I8?42_lfUS7XNfMIadKn~2RDKl^;8`D?lfUS7oM_koM_cX +e2n3a0R;A_j;E_b3`P4E~20AHh<146>S23?X0aogD:Pcin<Ome0nW408<nQ37oM@N3?X8aogAP +ocJ4<OlfPS7o=X0aocIn<OlfJ@6h0AA@^?<CD?lfUS7X4FB3a13o=YHaj?iVFLM6oP00RDKl^;8` +D?lfUS7oM_koM_cXEbn3a0R;A_j;E_b3`P4E~20AHh<146>S3[E_lfP37o=WhaocIY0KP>552h +11A@ocJF<NRiHh?43?lfUS7XYVIIadKn~2RDKl^;8`D?lfUS7oM_koM_cXobj3a0R;A_j;E_b3 +`P4E~20AHh<146>S21?XPa081e1h<nQS41M5co=XPaocJ6<NSO6eUID?lfO@6h6QA@^14DD?lf +US7XCV>3a0[o=YHaj3]VFLM6oP00RDKl^;8`D?lfUS7oM_koM_cXU2j3a0R;A_j;E_b3`P4E~2 +0AHh<146>S3o=WP1^2<DD;PM553o=YHaj01SPl@8ocJF<NS]IEW7A_h008U6o;Rb<53o=YHaogKn +ogKlj4H^Pl@8RdKnReKlPl815@000AHh<146>S2h3SA@^2lDD;PV553o=YHaj;9RPl@8ocJF<NRO +IEW7A_h008U6o;Rb<53o=YHaogKnogKlj?P]Pl@8RdKnReKlPl815@000AHh<146>S2h;SA@^3\D +D;Pb553o=YHaj6ARPl@8ocJF<NQAIEW7A_h008U6o;Rb<53o=YHaogKnogKlj:X]Pl@8RdKnReKl +Pl815@000AHh<146>S3o=Y8aocHg0KQ7552h?QA@ocJF<NPBHX?42_lfUS7XofAIadKn~2RDKl +^;8`D?lfUS7oM_koM_cXF2f3a0R;A_j;E_b3`P4E~20AHh<146>S3Y@07o=WP1^50DD;Q:553o +=YHaj<5QPl@8ocJF<NR^I5W7A_h008U6o;Rb<53o=YHaogKnogKlj0L]Pl@8RdKnReKlPl815@00 +0AHh<146>S2h3SA@^5`DD;QC553o=YHaj7=QPl@8ocJF<NQPI5W7A_h008U6o;Rb<53o=YHaogKn +ogKlj;T\Pl@8RdKnReKlPl815@000AHh<146>S2h;SA@^6PDD;QO553o=YHaj2EQPl@8ocJF<NPB +I5W7A_h008U6o;Rb<53o=YHaogKnogKlj6\\Pl@8RdKnReKlPl815@000AHh<146>S3o=Y8aocHf +<?lfKP6hMaA@^6\DD?lfUS7Xcf23a0co=YHaj;aSFLM6oP00RDKl^;8`D?lfUS7oM_koM_cX5Bb3 +a0R;A_j;E_b3`P4E~20AHh<146>S1NRnEM`eF;k5Hi9Y`0LP?X1dG71U8f0@361U4f0;h045KX +`D5IXi@aPcjD<@1e75JhWaA@^7XDD;SX:53XZU63a0S71U8f103XLb^0?U4f0GD`^;TDD;SX:53X +S55IFKS[550c`51F^<4DD;SX:53XMe63a0ZhmAA@^>PXD>QYDEUI^?LDD;P0253XQ01IFJ>H<KP3 +5E2h00Q@j7@0FEVSUS6h0`5@^?d0D;R_052h4QE@^0lED?mf1_mf1>RZ8h?43X0na001M@Rh5QE@ +j:SdFH0n\P01MAO61U4f0H0nbP01M0_61\X00LL6b`00080n0041M0Rh9AE@j7_dFNQHhNPEg^Sb +lNRd:S?0j`1NGL=ERnb3k09FEh]n1STVW01b0nSd@h]f15KX^D1IRDKnPgkn07DZEc?0D5JhGaE@ +ocJD<NQ>Gh?42[RN<e3o=Y@a^0@0D>QL:H?41^QP:^\dP3iA=P5e;KR:5E2hj2Q@j7M@FEUG<l1@ +E[RB5E2hj2Q@j6E@Pl@:^<LED;SX:53XEe1IFH]6o^\0Gej;iEg3EH_\Pn`2EUN;MPPi9Y`0LP?X +IT?6A080ad@3~2^<TED;P10U3XB_mIFH_hEkSL5E3oMPKX8Un3a0J9A_j3O_h1MB=G^>HED?lf +U37XYUj3a0JhWS=@ocJD<KP1053X]2R3a0K[;Old^0PFD?lfU37XPUj3a0JhWS=@ocJD<KP3053X +T2R3a0KoMPKoMPCXnQ=IFEOXh3iIGej;iEg3EH_\Pn`2EX]f13TVW01b0nS9@X=lD@1d=?mdDNQa +C5V9A_j3O_h0M2AF^2\FD?lfU37X8Uj3a0JhWS=@ocJD<KP3053X<2R3a0KX3aaNRnEM`eF;k5IG +RgH4>BJL0783j7U2P7`30G@dP3iA=P5e9kQ35U2hj2Q@j35?FEVhBaI@^>PXD>PTCeUI^84FD;SX +:53X5dmIFKSoonV303?0D;P1053oM0CoMPKXn@B3a0R;n8_OPo\3M`oAhbkoYmTVjao[7N\KjaWo +M0BhPaI@ocJD<NR1GH?41_lfU37XFo9IP3iA=P5e<kRG5U2hj2Q@j;U>FEV;am7PReh60mSo=kRO +5U2hj2Q@j:5>Pl@6^<lFD;SX:53XTdiIFH_7jG[oGeiM`g\VMbIe9WTVEH_\EUN;MP@i9Y`0LP?X +Wd60O0<1M3>0?U4f0GDW^=4FD;SX:53XEdiIFKSI5U2hj2Q@j4Y>FEVh2aM@^>PXD>PmCUUI^?oo +jg\c`52h0@1@og@4ogH6j204Pl@8RoR;a`_0M0Lm0@1d0^\2jaWoM0Bh3AM@ocJD<NR_G8?41_lf +U37XRO5IP3iA=P5e<kPO5e2hj2Q@j>M=FEV;am7PReh60mSo=kPW5e2hj2Q@j<m=Pl@6^5<GD;SX +:53X`DeIFH_7jh=OGUg3EH_\Pn`6EUN;MPB;OPHi9Y`0LP?Xd420O0<1M3N0?U4f0GDW^5DGD;SX +:53XR4eIFKQM5e2hj2Q@j7]=FEVhVQM@^>PXD>Q^CEUI^_oo^?oojAL1adKnooo7A_coohe6o52h +W1M@og@4j5YLPl@6RDKjPgkj0G@Iog@4^:0GD?lfU37Xg5^3a0Ko=Y@aj;K`FH=mFP=eBH=noP1l +5gD6Pgkl0G8?Pgkn07`cO`N1O_cmOgHZogKnogKl<l2joGm@DS?0^P40D5:haAM@ocJD<NR?Fh?4 +4?lfU37XJO1Ijdf3OEX2MDN3O_h0O1Me1X=no05b3h=noP1l<gl7PGklogmf:_mfo_mfo3?0^_mo +D58c`;X1051B^?XGD?lfU37X@5^3a13o=Y@aj1[`FH0nDCH1MBjh;aQ@^>PXD>QhC5UIogKnogKl +^3LHD;SX:53XIDb3a0RhMaQ@^>PXD>QGC5UIReKnRdKljNKnGej;iEg3EH_\Pn`4EX]f13TVW01b +0nQS?h1l0`5d=X0nDCH1MBNhNAQ@^>PXD>PKC5UI^84HD;SX:53X3TaIFKRm652hj2Q@j05<FEVj +082h0@3[Dh=l101d28]L180o07D:SDKlD>RT=5W[<omd1>QV1UV9E_j9A_b1O_h0P7DOPgkl0GDI +og@4^;lHD?lfU37XHUZ3a0Ko=Y@aj3c_FH]FoX]6o>^[GX_UGL=ERnb3k0AFEh]n1STVW01b0nRk +?P_oM0F0?@1e1[SoonWg0<M6o?oo<oKYV02;a[X50?OZReh80mSo=nP3GEV9A_koM_iGRlJj1@3g +jX]N20?HocOX5Q63a0H;`7EVP3iA=P5e=[SW652hj2Q@j2m;FEV;a[X50?OZReh80mSo=kS_652h +j2Q@j1A;Pl@6^1XID;SX:53X1T]IFH=no01m1HUfo>\N^9hcD;PL6E2h0`1@j;DSPl@6Eomf1>PQ +3eUIjEWoAX_6^PD0mnZ;GPP3f8<o07@3jECoPgkl07deP3iA=P5e:KPe6E2hj2Q@j:i:FEUG^3dI +D;SX:53XX4Z3a0JhL1U@^>PXD>RBBUUIj@_oj`J;A_cY1_mOGX_UGL=ERnb3k0AF>BJL0783j9lm +<lW[FlM6oP00RDkl<oK[<h]6oX]Fo8?R0BD000_@M1:;A_j;E_cAj=7J<eH6<dH8j`Z;A_j;E_cA +j=7JRDKnREKlAX?n27;8Rl7Ah=7PReh:0mR;A_j;E_b9A`:95d4kCPAbX5j;iEg3EH_\Pn`2EULi +9Y`0LP?X9Cf3OPH0M0R;GPJ0?`1e1[SnonVC0?mf1^QmFeV9A_jooolcm^]_Pgh807DBRlKAh8]N +10?HocOXGU]IRDKnPgh:07DYogKnogH6RlKAh8]N10?HocOXK0n3a0H;`7D<PoooM@B;o^\3_oko +jbOoM_koMPJ;a]7PReh40mSo=nS^3X?41P_0M@b3oome18_nj`>oo_m6RlKAh8]N10?HPcl0MH>; +anUZoemNRnEM`eF;k8?\2UIGRgh4>BJL0783j6@lP3iA=P5e<KQb6E2hj2Q@j299FEWoM@KoM@So +M@ZhNQU@^>PXD>P<BH?42[RT6E2hj2Q@j?i8FEV0?U4f0GD`^:HID;SX:53XjTQIFOleogD2ogD4 +^:hID;SX:53XeDR3a0Zhf1U@^>PXD>S7B5UIPgd:AWd7<m8c`>UT0LM6oP00adKl~2adKf\PO[ +Ah56o6d1PeKn08]6m[\409Wgn`_BMBj;A_JkI02Imo\;dWD=RdKf^i01VOOk2m9e1KP10>\2<l0m +0@1e28=6o063E_h0odKfRdD:1F`7>dKfOjk7A_H00>]MRekfdN>;QdLEV@56o15FoX=nmP5eA8]5 +2PE\1k\409Wgn`_BMCB;A@X5K0NkI02Imo\;dWD@RdD:1F`7^i01VOOk2m9e1KP10>\2<l0m0@1e +28=6o063E_h0odKfRdD8>dKfOi^;A@I8V@56o15FoX]>oX]No;X10;R0DNSL:52;A@ABVE1B<m:h +40iIFnS::5]I0lPCfX]50YUADe1B<m:h?01IFnRb:5]I0lPCfX\5V@?84mZ9G_Z9C_R0?U4f0GD^ +^=XID;SX:53XP4MIFOmfn_mfn;SR6E2hj2Q@j6e7Pl@8^0TJD;SX:53XGdMIFH]FnX]6n>VIoUmN +RnEM`eF;k5IGRgh4RgH:>BJL0783j6XjadAA~2adAH0@37A5X10<M4G_ooadALooo7A6;oolM4 +H?ooP7d30G@aP3iA=P5e9kP;6U2hj2Q@j?m6FEVh4aY@^>PXD>SbAUUI^4dJD;SX:53XiDIIFNWP +08=m101dEOme15KX\EMIFEJhCaY@ogH6j0\APl@6P3iA=P5e:KQC6U2hj2Q@j;56FEUF^5\JD;SX +:53XXdJ3a0JhP1Y@^>PXD>REAUUIE_mf2>Sn4eUIRDAAja>hPQY@E^QKEeUIadAAj2S6A5<1PgaA +07DTE[R96U3o=Y@aj0]EPl@6^9hcD?lfU36h101@j1TOPl@6j1dPP7aC0G@9E^Sb55T:`7DiP3iA +=P5e:KRU6U2hj2Q@j2M6FEUF^:dJD;SX:53X6DJ3a0JheaY@^>PXD>P;AUUIaTAC0EKX`1aIGeiM +`eF;k8?\0UIGRgH8>BJL0783j1PiaT@20<M40`00^=TJD;P10U3Xo?AIFH_hEkSO6U3oMPKXe5B3 +a0J9A_j3O_h1M@iGj4T?FHU40lI40P7[;Old^>HJD?lfU37XBEB3a0JhWS=@ocJD<KP3053XEaj3 +a0KoMPKoMPCX`@UIFEOXYcAIGej;iEg3EH_\Pn`FEUN;MP@i9Y`0LP?XScS7A_h0P<M6o0402oId +1H0l07D9^P20^040jH01P3iA=P5e:KP96e2hj2Q@j355FEUF^14KD;SX:53X8dF3a0Jh@A]@^>PX +D>PEAEUIadKd\PO7A_810<M6l040adK^~2adK\~2adKZ~2SDKZD8e6k52=A^i@SDK`D8e6lU2= +A_A@^4<KD5KXi5>3a12;n8?o0G`5Pol6ORAF^64KD?lfU37XIE>3a0JhWS=@ocJD<KP3053XLaf3 +a0KYE_n1O_Bb1g`7PGkdm@Mn2?mfm;R56n_:PFkdK0N3O_81O0J3O_8<OPSoM_:h^Q_[\Om>lX=n +l05l1X=nl1mn2?mfl;SY6n^JPgk^07`6Pgk^5gh8ogK^^1HLjhJ3O^`0O0J3O^`kOPWoM^bhAAcY +LOn3O^X0O0J3O^XkOPWoM^ZhMQcYG?o7A_H00<M6n000adKj~2SDKZD>S0nUV9E_j9A_b0?U4f +0GD^^:LLD;SX:53Xkd=IFOmfo_mfo;R_752hj2Q@j=a3Pl@8^=HLD;SX:53XcT=IFH]FoX]6o>Um +oUmNRnEM`eF;k8?\35IG>BJL0783j=`faTKe0KSH752h011@j<GbFEV9A_J;MP@con\1AX0l07@< +RPBHRmSfQl4W0GG^P3`0M@GY107[0hUfn>\1AX0l07@?RPBHRmR:Ql4WV:T107C[RGKlRdKl:dKh +@8U6n_mfn_mfn?mfm^Q2EH?41X]NmP=Nn\H708_7dN2;EPH3d8?215:hhAa@ogKfj2iBPl@6RDKn +Pgkn0G@[ogKfRlM0D;SU753o=Y@aj:aAPl@8^9hcD?lfU36h0`1@j;XKPl@6aTKe08_7dN2;GPH3 +f8=o1?ml48_7dN2;GPH3f85o1?l0OSB;ad1@RlOAh8]N1P?HogL4^1HMD?lfU37XFE63a0RhWS=@ +ocJD<KP3053XIa^3a0K6A_D0RlOAh8]N1P?HPgl4ogD?RlOAh8]N1P?HRdH8RDL4AnWPoX1nm@5e +:h7o005d9ENhB1e@ocJD<NP6DH?41[RN<e3o=Y@a^0<0D>PD6h?41\I6m@3oM_KXJC5IRTKej`1O +GX_UGL=ERnb3k0YFEh]f13TVW01b0nQ<=KQg7E2h0@9@j3WaFEV;n<M4F040adAJ0@37A5koolM4 +G?ooadARooo7A63oolM4EP00adAD~2E^S83UV9A563O540MBAF^7hMD?lfU37XMU23a0JhWS=@ +ocJD<KP3053XQ1Z3a0KXR1^;GPS61`36A_\1ogH8j4ECFHU6o8=4E063E5H0EULc`;X00U1Bj2HC +Pl@8REKhRDKfPgkh07leO0J3O_H0Lbf;G57gA`8P07@3jI40^9hcD;RU7E2h0`1@j2<JPl@6<l1@ +E^R?1EUIj?T=jfS6QOl10;P:051Gj?H5FEV9A_j3O_h0M0J;G_k61`1Gj<MBFH]Fo0?@REKlRdKl +>dH6O`]GogH8j8=AFEW[<?mfo;S77E3o=Y@aj:I?Pl@6^9hcD?lfU36h0`1@j;@IPl@6EeKX8PEI +FLI6n`3[0nT]oh]6o3]61WdWogKl^?HMD?lfU37XJdn3a0JhWS=@ocJD<KP3053XNAV3a0K6A_\0 +E^Sgl5UGj<\_FHY6nn\0Gej;iEg3EH_\PN`F0UIGRgH4Rgh6>BJL0783j:XcadEH0@37AEX10<M5 +G_ooadELooo7AF;oolM5H?ooadEF~2adED~2EnPe3EV9AE63OE40MBAG^2LND?lfU37Xhdj3a0Jh +WS=@ocJD<KP4053XlAR3a0KXmAVhBai@^00@D>PmkeUIRDK\Rek\aPL0aTKa0NT\0_mfk>RODEV9 +A_Z3AE@1PeEF05N=Q^[mD3?0^P02D5;XO163a0R9E_j9A_b3O_h0OcYl1X=no01c<X]MDOM70R00 +M0?Yk`6hWS=@^5HND;P3053XNAR3a0Hc`51Gj>D3FEWXC`c6A_40jL41aTKX2\I6j@2h8`1@SHKZ +oE3X@0AIFHU6n8=nn01d3h]Nn<H72_m6n8]Nn<H70;P:052=Q^[mD>PJ15UIRDKfPgkf07@6Rekf +aPLPSHKZoE3Xie1IReKj0m29E_Z0O081M@n0O0`1M@V0O0L1M@?Y]`1FSHKZoE1Gj7kcPl@6RDKb +Rekb@h?k0gMbdN<^ojMX>>VA08]6l[X50?OZRmR0N081MCf;A_:j1@3gjX_Hoc2hMAi@ocJD<NR8 +CH?41[RN<e3o=Y@a^0<0D>RF5h?41Xf6j_e@EnP00eUIaTKa0>\IRdKb^PD0mnZ;eP?@DXf6j_e@ +EnRUn8?41^\Y^;hND;RN7U3o=Y@aj3Q=Pl@6^9hcD?lfU36h101@j4HGPl@6j4XHj`3YV@2=A^i@ +^<XND?md3NQaCH?41XU6m8=nm05e3H=nkP1l1h5nk_l0ORSoM0goM0ZhcQi@ocJD<NSSC8?42;RN +<e3o=Y@a^0<0D>Sa5X?41^]4PGkj011o3hf6j_e@ogK\j8E>FEW[=?mfn[P27e3o=Y@aj:Q<Pl@6 +^9hcD?lfU36h0`1@j;HFPl@6SHKZoE1Gj202FEW6A_40j`V0O_41M@?YboeGj1k^FH1l0P5d:?ld +^2hOD?lfU37XHDb3a0JhWS=@ocJD<KP3053XKaJ3a0K6A_40jgN0O0`1M2WoM0ZhF1m@ocJD<NPb +C8?41[RN<e3o=Y@a^0<0D>Q05X?41\I6l@3[B81l1`5d:Omd1KR27e3o=Y@aj0=<Pl@6^9hcD?lf +U36h0`1@j14FPl@6aTKa0>\Iog@3j<\6FH]N28T7og@8j;l6FH]N28U70X1nl@5e4_mfk_mf2?mf +k>QEnH?41XQ6lOmfk>Pc;5V:A_6Hj`1OGX_UGL=J=UdfGCIM=UF;k5IGRgh6>BJL0783j10`<oK[ +3X_6dN2;GPX3f<L7oom6>gH8O>dcm^];Rmj:0ISAh8]N2P?HPcooMA2;gXX1V=7PReh:0mR9=n\Y +Rmj:0IQ@^:`OD?lfU37X?T^3a0JhWS=@ocJD<KP3053XC1F3a0KXD1I6>gH4O;1OGUg3EH_\Pn`2 +EUN;OPB;MPHi9Y`0LP?XRRmG^>4OD3?0D>RD1X?41\L4~2ad@2~2EUOoMPSXZO^3a0J9A_j3O_h0 +OBAG^>DOD?lfU37XcTZ3a0JhWS=@ocJD<KP4053Xg1B3a0KXh1EG^0lPD?lfU37XZTZ3a0JhWS=@ +ocJD<KP1053X^1B3a0KoM0;o=;Pf853o=Y@aj8E:Pl@8^9hcD?lfU36h0@1@j9<DPl@6Gej;iEg3 +EH_\EUN;MPB;OPHi9Y`0LP?Xfbh;og@hE_mdE_mdE;QV853o=Y@aj41:Pl@:^9hcD?lfU36hoom@ +j4hDPl@6EkR5853o=Y@aj1m:Pl@6jaEFogAFogAD^90PD?lfU37X24Z3a0ZhWS=@ocJD<KSooe3X +5QB3a0IOGUg3EH_\Rdh4>BJL0783j6D^<m;[4X_I0mZ:1cY61WD6Rl43`^\>@X_I0mZ0?`1eiC?0 +jo1M`eF;k8?\15IGRgh4>BJL0783j2`^<oK[F8_NRP6HRmSfQl4W27@<Rmj:0IQ@j2`TFN\5Rmj: +0IR9A_j;GPJ:09R;f?J7`BL8M0f;GPJ:09Q@j0PTFN\6Reh6RP2HRDKlRdKn>dKlM0R;A_h[A_c[ +54J;gX0i07FQReh6P3P0MITc`>_ZGej;iEg3EH_\EX]>18]f1STVW01b0nRT;C?Bjb:;f@?JRPN; +fSX0M1F;f@?JRPN;fSX0M0Fh0@3[0S?0jaY2>eH8OA2;f@?JP3l0MM2;fX0h07G9<l3[i5iM`eF; +k8?\15IGRgh4>BJL0783j4h]<oK[F8_NRP6HRmSfQl4W27@<Rmj:0IQ@j4hSFN\5Rmj:0IR9A_j; +GPJ:09R;f?J7`BL8M0f;GPJ:09Q@j2XSFN\6Reh6RP2HRDKlRdKn>dKlM0R;A_h[A_c[6DHkMPQm +3h_NP3T0MIb;GPJ0>01eU3?0jnEOGX_UGL=ERnb3k09FEh]n13TVW01b0nS0;5OX;T]IRDKnRdKn +B8_`ja2;gXX1>TH6M@J;a`?6j`U>2oImk3?0joEOGX_UGL=ERnb3k09FEh]n13TVW01b0nQn;5OX +k4YIRDKnRdKnB8_`jaV;gXX1V53oMPKXk_eIF@_0M0J;a`?6j`U>2oImhc?0joEOGX_UGL=ERnaF +Eh]n13TVW01b0nPf;3?fjaV;gXX1V53oMPKX\_eIF@_0M0J;a`?6j`a6Rmj0>@1eh3?0jo9OGUg3 +EH_\Pn`LEULi9Y`0LP?XnB^0?U4f0GD^^:lPD;SX:53X]cQIFOmf1_mf1;Rg852hj2Q@j:@hPl@8 +^>4PD;SX:53XUSQIFH=n1P1o>7`6Pgh407<`ogH6ogH4^><PD?lfU37X84N3a0RhWS=@ocJD<KP2 +053X;Q63a0K7APH00<M61000adKf0@37A_B0DLM6k^41adK\P3>;A^j;E^b1`X1A5@40RDKZREKX +_[87RlJk102Imo\;dWDPRlJkI02Imo\;dWD<RlJkT06Imo\;dWD8RdKZReKXj`J;A^j;E^b9A^J9 +E^B;APJ;EP@kA^Il5GD5>eKTLPj;A^J;E^@YEP@IAPK[0^\3A^^S<on;gm7SRhM75IV9E_:9A_23 +o`5e;8_6^`@0VOOk2m9e88_6^f@0VOOk2m9e38_6^i01VOOk2m9e28=6l063E_80RdkfRekdReKb +RdK`j8\H>eH6Oaie1C]617LGRdkfRekdReKbRdK`j70H:DH46EH6j`;[0dO[RDOoM_KoM_CoMPKo +MPCXb1F9A_koA_koM_KoM_CoMPKoMPCX`QF9EPJ9AP@c`;X@3U1BogH6ogH4j9dERDKl<l2j40i@ +D_mf1_mf1>RI5HUF1XU613?0^S`0D5;oMPKoMPCXM1F9A_Xc`;Xl051BogH6ogH4j70EREH6RDH4 +RdH4RDKhogKhogKjogKlogKnEeJh325@^5@jD>QUAH?44;PZ8E2hE3Y@j297FEV0?U4f0GD\^2lQ +D;SX:53XV3IIFKQD>U2h=b5@^>PXD>R7=X?41[Q_8E2hj2Q@j7TfFEVhE3[[05mNRnEM`eF;k8?\ +0UIGRgH4>BJL0783j8PYE^SfAeU0RDKnogKnj4DVFH_h2ome9eKoM_jhLB5@ocJD<NSNA8?42;RN +<e3o=Y@a^0@0D>S\3X?41^S`3eIGj?A6FEV;an\0Gej;iEg3EH_\Pn`2EUN;MP@i9Y`0LP?X9RT; +mW@5P3`0M@B;a^\XE^R7AeV9A_j;aP=6oTR;n>\4aPD0Cc_nLPb:1IR;f?J7`BL1MNc[e5mNRnEM +`eF;k8?\E5IGRgH4Rgh6>BJL0783j=@X<l1@SDK`D8e6mU2=AZa@ogH8j>@<Pl@:RDK^mdK^0P1e +4`_fM0nh201@EXe6mU3XLTN3a0KgA^h407DC2omd3kP4051GSDK`D>QHAh?41_mf23?0D8e6l52= +A_I@SDJ\D>Pb1H?42UmNRnEM`eF;k5Hi9Y`0LP?XFRSoMPBhYB5@^>PXD>PL=H?41[SX:53XJc9I +o`k8:7`>RakB:?l6dRR:1k@0j`Rhb2Q@j9\iFH_`PokoMANhWS=@^;4QD;P3053XZPf3a0JnCP3[ +4_J4`BL8M0MFj1LNFN\2RlJ;l8?nCW@5PoiIMJZ3oUUe1;01j`:`0>\0GUg3EH_\PN`T0UIGRgH4 +>BJL0783j<HWadAHooo7A5[oolM4G_ooadALooo7A6;oolM4H?ooadAV0837A6@10;S@8E1Fj4Ld +FEV9A563O540MBMF^=<QD?lfU37XnT:3a0JhWS=@ocJD<KP3053X20f3a0KXi`3YgP1Fj>@2F@[0 +MD60?U4f0GDY^?DQD;SX:53X6CAIFEJhoB5@^>PXD>P;=8?41[PV8U2hj2Q@j?dcFEUFj4_TFLI4 +D`77A5400>VD0?mdDKP00U2h0@1@SHKjoE3X`3B3a0R9A_k7A_`003?ojaV0^o[m3GDARmm3SHKj +o@?HP3l:M@?oA_a7RdKnB3_7MmmFj?OSFLM4D@00RdKl^U00mnXkA_ic1lM4F000j`G7A5P10<M4 +FP40SHKLoE1Fj<12FEV9A_Z3O_X0M0MF^2PRj@goRhKdoH^Fl_f9A6J9E6AOGX_UGL=ERn`i9Y`0 +LP?XM2Ko=Y@0j=54FE2hBR9@ocJD<NSK@H?41[RN<e3o=Y@a^?ooD>SY2h?41Ug3EH_\EUN;MP@i +9Y`0LP?X>2J;A5P;`7@7?@40M13[4kQO8U1Fj=<bFEV;n>\\^68Rjo3oM5RhIB9@ocJD<NR4@H?4 +1[RN<e3o=Y@a^0<0D>RB2h?41S?0jbh;ogDVE[R68U3o=Y@aj5]1Pl@6^9hcD?lfU36h0`1@j6T; +Pl@6j4Sojm:;an_@GeiM`eF;k5IGRgH6>BJL0783j:dUPgh40GA9E^Rf05T:`7A0Pgh40WDdE[RX +8U3o=Y@aj0M1Pl@6ocJD<NPKoEVH2l1e5[RN<e2hab9@^?ooD>P82h?41S?0jgG[1UJhfb;[9h]4 +F0_0M0Lm0@1d4>\C^>`RD5KXnC5IFH_hjb>hkb;[l?mdF;Sb8U3o=Y@aj:Y0Pl@6^9hcD?lfU36h +0`3[[P_oMBIF^1<SD?lfU37XRT23a0JhWS=@ocJD<KP3053XV0Z3a0KXMok[Rh_7jhUOGUg3EH_\ +>BJL0783j>4T<l1@ogH4j>XTFET;`7D5^040j`8c`>\0GL=ERnb3k4aFEh]f18]n1STVW01b0nR` +90_fM@;[:3?0D3?0D8e6mU2=A[A@EnRm28?42ULc`51FSDKfD8e6]53XA`63a0YOGX_UGL=ERnb3 +k0AFRgH4>BJL0783j6TTReaARTL4V8U6o_mfo^SV45V9A_b3O_`0M@J`0N\6j`B`0>_hGX_UGL=E +Rnb3k19FEh]n13TVW01b0nP\95OXS?YIRDK^^2h0D?mfk^RVmEUIRo0;mW@H^0@0D5J=A_1@j=I2 +Pl@6aTKd0<H40>\=^3HSD8e6l53XWD5IFKP8053oM^j=A_I@j:m2Pl@6aTKn08e6mX_`jaF:19Q@ +^3LSD>QBmEUI2l1e0lH4GdJ0?01eiXe6lH_`jaF:19Q@^84SD>PamEUI2l1e0lH4GdJ0?01eiXe6 +mU2hM3Y@j3U1FEV=A_1@^7@jD>S4@5UI^7@jD5OXld1IF@_0M2FhM3Y@EkS;8e3o=Y@aj=TnPl@8 +^9hcD?lfU36h0P1@j>L8Pl@6^7@jj`1OGX_UGL=ERnb3k0AFEh]f28]n33TVW01b0nPW8kSl8e1G +j<e0FEV3OP@0M4f;GPB0?`1dAKQ0053oMPAGj911Pl@6ogH4j6e1FHU6oX]NoP=N18Y7oiQ@^?dS +D>Qam5UIRDKlPgkl07D@Pgkn@7d:^00TD5OX4T1IFH=n1P1d3[P8053oMPIGj4E1Pl@62oId9H0l +07@PP3`^M0nh0RA@EnSV?eUI^0<0j`>h101@EUOX7463a0IOGX_UGL=ERnaFEh]n23TVW01b0nQf +8_mf1;P4952hj2Q@j3P_Pl@6^>PXD>R7;5Vhb2Q@ogH6EnSh;8?41X_`2oIe6;RN<e2h22A@^0@0 +D>SE1h?41^RdnnSF2;P:051Gj;GcFEV;l0_fM0?6101OGUg3EH_\Pn`6EX]f2STVW01b0nP78\M6 +oP00adKl~2jdOoM57XNc=IRDKjPgkjogDTReaAmdL2401d2;[ookSnon\oRdKl2dKnM@Rjoonh +ooo[k^\UReh80eklRTKjR0N3A_`1PeKn08]6oX]Fo3]61Wb^M@DkEPAbYh]FoX]6o>^oGX_UGL=E +Rnb3k09FEh]n28]f2STVW01b0nQn8OmdDOmf15OX6Rb3a0J9A_j;GPA;aP40Pgkn07DTReaAmdL2 +401d2;[ookSnon\KReaAmdL2801d2;[ookSoon_\EnR[?eTcd^_SGej;iEg3EH_\Pn`4EUN;OPR; +MPXi9Y`0LP?X5b63O5P1MAIFEomf1_mf1>Qaoh?428UFoXU6o>\mReaAmdL2801d2;[ookSoon\c +ogAAogH4^040D5OXU2j3a0S7A_h008U6o8]LDOM70Q00M0Rjoonho_o[dh]FoX]6o>_;Gej;iEg3 +EH_\Pn`>EUN;MP`i9Y`0LP?XW237A_800<M6o040jOl2RdKldN2;GPH3f8\7RDKnP7`30GD5aPIA +=P60?U4f0GD[^2PTD;SX:53X<beIFOmfo[P`952hj2Q@j2<]Pl@6^5\TD;SX:53X5BeIFH]NoXX7 +V53oMPSX`_5IF@_0M@?Y@P:hGBA@ogKnj:8mFET;`7D3jBl2Pgkb07@7ogKbj0\LFH]6oT1@j6Wf +FHU6l_mf2_mfl^RaleUIRDKfadKd~2Pgkf07@=RekfaPL0RdKf@8U6m?mfl^Q7?UV9A_Zoooo7 +A_P00>V50?mfn_mflX]6n;X60?OZRmSo<>Q?lX?41P_0MFH;oge0RgkhP3iA=P5e=;QO952hj2Q@ +j64\FEV;A_Rj1P3gjX_Hoc2hIbA@^>PXD>Q8;8?41[RC952hj2Q@j3X\FEW[8X]6o=7PReh60mSo +=kRE953o=Y@aj<XjPl@6ocJD<NRTceWoA_R;A_Rj1P3gjX_HPcP0M0?YJOl;ogdRRdKldN2;GPH3 +f?lg^:hTD?lfU37XScZ3a0Ko=Y@aj6W?FH=nmP1eE8_7^PH0mnZ;f81h0P1e9h_7^PH0mnZ;f?l` +^>XTD;S5953o=Y@aj5DjPl@8ocJD<NP_ceW[6h_7^PH0mnZ;f<I00`6;akX60?OZRmS7@0@00>W2 +08]Nm80o07DURdKldN2;GPH3f?lg^>dTD?lfU37X2cZ3a0Ko=Y@aj>G>FNVE08_7^PH0mnZ;f81h +0P5e9h_7^PH0mnZ;f?l`^3TUD;P@9E3o=Y@aj=@iPl@8ocJD<NR^cUW[Gomfm>RZm5U@RlNj1P3g +jX_HF8U018_7^PH0mnZ;f<I00`60?U4f0GDd^3`UD;SX:53Xj2YIFH_7^PH0mnZ;f?m`1;Q49E2h +j2Q@j<lZPl@6^70UD;SX:53X`BYIFN]JjeR;GPj0O`<0MAn;GPk6A`<1RdKldN2;GPH3f?lgj33d +FH]N3XU71>\`Reh@P7l307DOReh@aTL30H]6o=7PReh60mSo=nP8m5V;GQ29A`C[2;Qb9E3XlleI +odKlRdKl>dH4O@?Ym_aOGX_UGL=ERnb3k09FEh]f13TVW01b0nQ[7H0nDCH1MCBhT2E@^>PXD>PY +:UUIRlH5I01@j>hPFE1F^9PUD;SX:53X42Z3a0Rh`bE@^>PXD>P2:UUIRlH5I01@j7<PFH_hPgd: +D7ePogAVogATj0_aFEU@E[S59E3o=Y@aj84hPl@8^9hcD?lfU36h0P1@j8l2Pl@6^9hcD;SU9E2h +oom@j7d2Pl@6E[PM9U3o=Y@aj4hhPl@6^9hcD?lfU36h0P1@j5`2Pl@6ogAVogATE^Qh18?41XU6 +oX=noP1d;h_61F@0D>Po85U@E[Q;9U3o=Y@aj0`hPl@8^9hcD?lfU36h0`1@j1X2Pl@6j?Wej`1O +GX_UGL=ERnb3k09FEh]f13TVW01b0nQM78]LDHY719R;n8]4F0_0M0Lm0@1d4N\D^020D5OXNSII +FHU6o^\\^010jnnhTBI@^74VD?lfU37XWSN3a0JhWS=@ocJD<KP4053X[063a0KX\0:3O_h0OBAF +^9lVD?lfU37XM3N3a0JhWS=@ocJD<KP3053XPP63a0KXHOEOGX_UGL=ERnb3k5QFEh]n1STVW01b +0nS76`_oM0?61@23OPP0M0J;GPS61`23OPX0M0J;GP[61`23OP`0M0J;GPc61`37A_X008=n101d +28]N180o07D6RdKjjJ<0ogH4SDJXD>PW>EUISDJXRo2h_bI@E^SHkUUIRDKnPgkn07@\Pdkj20_o +M1k7A_`00>\9RPB81DI7odKlPgkl@7d5>gKnM^c61@3oA_j;M_jh;P1@E^Rgk5UIRDKnPgkn07@P +Pdkj18=n2P1d4;P4053oM_koMP[XfCV3a0J;G_k61`20?01d68=>nP:3OPP0M0jh201@E_mf2>Rf +>H?41^UGoemNRnEM`eF;k8?\8UHi9Y`0LP?XbQZh`RI@j7`]FHU6oX=noP1e8[S59U2=A]i@j5`h +FEVhbBI@SDKND>SW=eUISDKND>Q9<eWXX3b=APA@j=TMFH_`Pg`@07hARaH0<:7n;`G`lH?Bon\; +j`V;5P0`XOh_jo=NRnEM`eF;k8?\15IGRgh8>BJL0783j54JadKn0@0cmX]N14>3n`Eg;M7S;_nW +:To7A_cA9^]9adKldRK[4lM6o=LVj`c7A_cR9^\5adKljbJn0@3[:[PD9e2hm2I@ocJD<NR0=H?4 +1[RN<e3o=Y@a^0@0D>R>oh?41^RB0>R?08=n1P1d28]N1X0o07DARdH4>`IB=Wh6RdH4Xe8fjej3 +OE40M@G7A_h008=noP1d3@_fM0V1OE7X:7D2<oH;mW@DogH6ogKl^24WD;SX:53XJ2J3a0R3O_h0 +M1?oMPKoM_bh9bM@ogEAj4lVPl@8RdH4>`IB=Wh6RdH4Xe8fGej;iEg3GTiGCUM>IDi\CW=>EH_\ +>BJL0783j4lIRaiB=X?k17LJdN<^ojM\Cc?0D>PZ15W[3kP10>_d^080jnnh0`3[jUg3DTmBCe]? +H4mUCeF;k8?\15J;MPXi9Y`0LP?X21W7A_h00<M6o000ja[oM56;GPP3G_b:1iQ@j=H^FEV3A_`1 +PeKn08]6oX]Fo3]61WcKM@DkEPAbe5j;iEg3EH_\Pn`4EX]f2STVW01b0nRh68]61X]F18U6oXUF +o8=lGP1lDWl6PgaL07I:RdANReAL>dKnOcml1C]Fo7<hogANogALogKnogKl^2dWD?lfU37Xl3>3 +a0bhWS=@ocJD<KP3053Xo_f3a0J;A5j;E5b9A_j9E_coM57oM_bh0@1@ogH8j>lXPl@8GX_UGL=E +Rnb3k0QFEh]n13TVW01b0nPX6;P4051Gj2@\FEV9A_j3O_h0OBYG^6LWD?lfU37XQ3>3a0JhWS=@ +ocJD<KP3053XT_f3a0KXLO6hoooY;06=API@j30KFH_`R`Bk0P2Imo\U7`0U7`20I_SP24KhRd@2 +9Cl09Cl0PFKh7oRa1M?P2DKhRd@49Al09Al0P6Ki1m7PdN3Ah0Q6nH]41RDO02DO081Vn^08A_Z; +A0Q09@l09@l0PFKj7oja1M?P2DKjPg`:D7dLP6Khh85Vn1ohP6Ki1h1Vn^21I_XOoX1Vn`7[5H]4 +2PF`obEo02Eo081Vn`7Ah0Q6nhe6n53oM_kXg0]IFHU6o8=no01d=he61U3Xb1YID5NhObM@ocJD +<NRE<X?42;RN<e3o=Y@a^0<0D>RSo8?41^R2l?mfo^SF5eWY1oooM_kXc1MIRDKlPgkl07dTEkRU +9e3o=Y@aj5LbPl@6^9hcD?lfU36h0`1@j6GlPl@6jM?n<l3YdOiOGX_UGL=ERnb3?[hW87D5^040 +ja>;7[hWdN>;APB9QlHjo`Jn9c?0GL=ERnbd@c;0ReH4cB5b2H]N1XT?<l3[153Xm@9M`eF;k;A3 +\06;EPB;CPK=8G84<l3[153XfP9M`eF;k5J;MPBd6LdQ]010R@ANGL=ERnaFRgH6RUH4o\Zd3\dQ +]02915iM`eF;k8?\35IGX@0`RaKn;hU6n8UFmZ42<8U6m8]>18]F1X_aRoZkh04Sf[45dn^3hQni +0?hScm7YQ\gf`@=e1X3k0WH1@]7SRioN;`?JBhUNo8312XU>nX_1@=7XdNP3f;Q]0OOQ0mRh`:Sg +hm7PdM:FRmY@\@?Cj8QVo\I6o`19d^Ri?026`OKT0l6a??OQFH?Q7m7Q0l4BeP?64m<3A_HCE_R3 +O_@0M2E@D_mfo_mfo3?0D?mfn^Sd>0_0M0Fh40k[0S?0Ro1JF2_6PmX0Gej;iEg21033EH_\EX]f +20_fMAk[3_l>_RN;7[hWdN?oUlHjPcjn9`1ejnP2[_lF`RSXRjkX2jj3OPH0MA<;mWD8oaK4:?lF +aRSoMPCX6jiIGUg21P1ERn`c`51@ogH4j:KoGL=ERnbh0@1@<l1@ogH4j9CoGL<c`52h0@1@<l1@ +j8Go`kP1051@<l1@j7Wo`eF;k5J;MPBd:\dQR@b9E09NGL=ERnaFRgH4]2c=8HT<RE@2GUg3F@iA +<lW[5UT>DKT10>\>F@iA^@80j`II3U6i0`1EEUN;k8_iRdH:ReH<Reh>Rdh@2lUe20_BM6T;fgAU +mlL107DL2m9i2_OJmmR3fP23c``;bGT:mmWgfh?I08?g18_Y^B00Ec?o<oKAh=7BdMKAec_mLP]g +13_cLPD[la_m@>;WFoO30P1d1X_6RmOAjoO3101d1oOJmmR3fP1OGUg:203gloO70P1d0I8cd^_] +F`iCP?T@La2;f=?Pdn;ffH314=?[2m?;P>T@TS?0dn;;F`iCP?T@La2;f]?Xdn[ffH314=?S2l?; +P>T@TS?BdnS;EH_\EX]f10_fO1F3oUQn0kiG08Tf>2Z:Q3XZV8_`j`gggX?n8goYa`Hh:_ooRCJD +0;SooeiM`P80EH_\EX]f15KX_?n;aUiM`P80EH_\^014Reh4cB6B9H00GL=ERnb3k29FE`J;OPXN +1h]N28?k97MHP?\2LU>;APb;CPh;bGdAP7h607@;aPD]AoOImmR3f@2=M]kS3i4[d_OcTOOcR1A6 +h`W[lB_Bmo>854H;`7GeSDkNmmT3c_a>RP@\2W<413[[0`961:[Rkk00ZPN;APYOGX_UGL8<05F; +k3?0D?mf1_mf1;P:052`052`HE3XJ_mM`P@0EH_\Reh4dN>1Y`XZoofd@XY62X]N18]>28]F1\dQ +LP;[1E3Xi?jIGL=ERnaFRgH8ReH62oIe0kh6>omf10_BM@FhU2[[0X_2D5KXWPeIFE3XT?nhV2Y@ +E^Rc;eUIRlINGL8605F;k8?\0UIGRgH6Rgh4ES?0D8<mogD5^080j`>h0@011H\5D>RNoh_`SDKn +D5KXW_]IF@_0M=N;aUmNRnEM`P@0EYJBQL1d0_OSh`FAmnH3`IKgh`?FG\=ERnaFEak5MPC4OPSl +dNWcYA?9lj@OGeiM`PP0EH_\Reh4dN?gQ`XZ0P1d1[P5053[4[@oReh4Rdh8ReH6cB5b0^\4D>P7 +oUg3EH_\Pn`ZEUO7A_`00<M6nP00jaV;OPcfA_lPM0O4?H=630C3RcdN1h=630;31_b;MPZ\2\1d +GS`UM5fHUom6n_mf2?mF15T;`7`VV0_oN3:0_IhZ0GD[T`[KN1R0_ihZ0GDAodKjogH8oeH4F@_0 +OnKYCP?oMPQCoeH6FEWoC_[[\3_7M:coMPQ@oeH6FEWoC_[Y@@?Y?P?7A_KoolI6o`2\V8Uf2YL; +og`IRYfN:S;oPo\EMP?Y2@?AhbkoYcMKUnUgonT?0h1>o`7[e8?_<8MnmP_oO<Zh2P3gi`56m^_0 +P4ko2>^jP4ko1>^dP4ko0^^^P6Kogn^XP4ko8>^RRdKj:m;fA_l1M53[UKh80>\<_PX0j`Nn403[ +0S?fmlLP07D9PomHM0B0C_l4SDKhD8e6nU2;A_HUogm@E_mf2?mf1_mf1>Qh0h?43X=nn01n6?I6 +o`5e3om6o>RgoZ_fA_l4M0:BZnW6oW`3jFP2jE42j000jFH2ogH8D?mF1UUIodkjPFKfogoX~2 +jGD2DS`jM1D;`7h<ogH8D?mF1UUIodkjFXcKja_X~2jED2F`_0OQ1BDomf253oEPIIFOm>nU]J +mTKo0GD@j4SnodKlTZ_fA_lPM0:CZnUCo^WS0He6n52=A_Y@^?mo8dKfD?mf2?mf1_mf1>Q13X?4 +38=nn01n>8Y6oiRY0@1e:NP5o_m6o?I6o`Ad1KP40>\=mTKo27@5^0P0j`8c`51Gj10>Pl@4jO[m +j0\>jOCmj0D>O9cYT`7X~2jI@1mTKo0GD6j<;modKlPFKfogmd:OI6o`5e0J[oA_X6ogH8oeH4 +F@L;`7hB2\1h2I>0_ihZ0I=n1Om>mWoG1_mf253oEPIIF@OoC_[fA_l1M@>`0:[YT?gfA_l1M@?X +K?f;M_H;mWd3_P40M1[oA_X6ogH8oeH4F@L;`7`FmTKo0GD1ZTioi_I6o`5e0om6o>UEoNWU02_0 +o1H7SGkF^A00lj^\P6KokcaNM@F0C_l@[;@0R]2;n;43dnni1`4Rb];U26_F[3`0M2HlGG@U?2ee +hCXDMmf0?5edf:`Z`WCU0]3@aH?G00Q[e_k8MOC[eNVL08Uf2X5Vm_moRgKfmTKo0GD3j<KlCWa@ +odKj1_mf2?mF15T72l1lCiJ;g[43dnji1`4Rbm;UQ6[FUY=d2?I6oa1d2>\?mTKo47@9mTKo0GG4 +Z^_11_mf253oEPIIF@OoC_Y6>gKfO@WfA_l1M@KoA_b`0:[YOoa6>gKfO@cfA_l1M@J`0:[oA_co +MPRhoom@oeH6FEV3O_`1Pekl00N;A_cYQP3oA_[oMPSoEPAI2l1n4`[0N0VCP;nN:P6CM>EIPl43 +on5dn5W[_b_B^@@0odkfO4EBDOm6n_mf2?mF15UIFP_0OSGnbG`aR^R0kC1b:X3m2W8GP>dALR20 +o@Ib2X3]878FP?d6La60a@[Ah]7RdN;AhP;EjkH[`83i17@6FH?10ooQFNUOoemNRnEM`jAJY5ZT +FXiGUENKEfeIgeOOEnUG[ER_Ek]G]EOJEa5IZeW=EnAG?eS1ElMGDh3[<78RP?\9MQ:0nbYg1H3[ +1n\3P>\WP?\9MP\jfG<7A4Ch]`3[0U_i`eF;k8?\1UIGaTKo0<M6o000adKj0@3oA_coMPSoEPAI +2l1lJ9RCm\>0M@Ro`BOf0@5ehi?oCPalFS`[M0Ll;GDFoTKoodh<O4[oA_coMPSoEPAI2l1l=B_f +Roj;CP[SCH?i97L^P?T2LRTl<7E[P?T@MFCoCPal<_m6o?mf2?mF15TlN7AA?5QdCN]cadKjooo[ +1LM6nP00ogH8D?mF1UUIodkl:l2IjJL0jI@0?337APX:07DSodh<O>ooA_coMPSoEPAIadH:200l +N7@4?5Qe;LM62Q00jaN;CPZCj?GnTg:`U^\:U_MV2P?`4oYe;?m>37a<odKlogH8oeH4FH]>2Y?X +cojCLmg[:YKghIN7b_OR0oLC`ILBeWE7odh<O23oA_coMPSoEPAIRdh:TnRSoY=ce_mf253oEPII +FOm>o8_GUX1no`1d1oOJmmR3fP2;OPj;G_`17H]n48]NnXTMjaJhoonjogl2A_n0e023dP37A_X2 +0>_HGej;iEg3EH_\E[@[RgH4R`b;E0;=8EiM`eF;k5Jd;H]f18\<Re@2cB5NGL=ERnaG^05GReh4 +Rgh6R`f;E@;=8G84<l3[153XP_MOGL>j1@0k5PPZLb^;f]7SahL::P00RmZa1=?SaXO<:?n;`]?P +1LPXRm[ChhV7eRQ2>aH8:W;EX<`XV53XS_MI2l1e1X4VbRSooKP00U3g1\XX009d1KP10>\2<l1@ +<l1@^<PXD>QS9H?42:3L:9Q@j5[gF@_0M@J19]XXoofh009@m`KJ:002M0Fh0P3[0S?0D3?0D;SH +:53X;bF3a0S3EH_\Pn`8SDKhD8e6o52;GPCoM`;o=nS5:X?428e6o53XnOiISDKhD>P4oeTc`8_U +GL=ERnb3k0aFRgH4SDKlD>R9mEV=A_Q@j9CeFHe6n52=A_a@j70YFEV9E_J9A_@;mW@;RdKfReKd +RD@2RAB;E_J;A_ANRnEM`eF;k;P1050c`51@ogH4j4kgPl@8GL=ERnb;EPB3n_me1KSoon\JR\:d +08_HmXO19`Ad2H[2]005803[18[2]01M`eF;k8]F18?jogD5^?oojaZ:`[@0RmSfQl4W27@9R\:d +00GPon\4R\:d05g3EH_\]46;EPC=8G84<l3[153XioEM`h[6j080R\;D48KPj080Q^04T2LD@2NZ +`eF;k87\UP1FElM6kP00adK\D037A^X00>]6EkWooc;0lZkgdDUO`cJ81DOnC^ae;e=ADPJ=QV[o +:oR=QV[oD5OoMPSoEPX;`7D5adKZ0@37A^a@005nkXfnJ_l7FUUK``KlSKiZohUno8]no8]f1Z`: +`7@B?2Ed4CJ81DOnC^aok^R\on_YjMD3RGK`[3`UM>N9O_`cbHU>lXU>oXQ>mLM6n?ooadKfooo[ +0J`bi8_@RmR0jb20nf1c4hZO9b^3naMf0nV80m7S;_nWQ6?YOP>0o@1gn8=>oP7[d83m07O]Pdkn +0^_5P?d0Mn:0O_D[M0>8E_G[]H=Vo]o[18=>oR2e1N^WP?d0MdggA_h207DYPdkn2;D1ji?Y<`>; +OP@fR`F3AP@2P?d2La8;`7T6mmR3C_h2RDKh]@?YKon0o@AeehU6m_k5jF;oP?d4LlZe1?m6m^UE +oi8\<9R0o@9g6KD2QdKh2l1ldM7PRm3Ah=7P0l81A_SY<on0o@AeVhM6mP_0M;GAh8_@dN3Ah0?2 +0DKfjAOoPdkn4>UUoh5>oP01PfKnknUIokL8j`Zg2^\:]a2cj@;JaTKe08QFnc?BR5KjRgh4=X\5 +ja2g2\I6nP68E_^;OP@fR`FIAdN9MPKgA_h@07@5=X\EAdN9OPB=O[\;`7D=2m9e2H=nmP1e1nUX +oX=>oPABD5N:aiQ@RTKjD5?X5O@F1h]FmP_BO@?YlP3Yo@28E_^9MPJ=O[Z;GP@focM3@hUN1?M6 +oR00M10fRaM3@hUN11H7j9gm\3ZZ5PMJj9Cm=\H50<I6nP23I_kkSDjj:oV7ch]FmS_AO`:;dNVO +08Uf1XQFnh]n13J;1H=6108F1hen^c;T=XT5^@40jL80RGH6R5KkRgh4mdKn801e3CJ;?H=6108N +1`_oj`\fa3f3AP@4S<0;agD57PNo82_XEOdkC_If0h]>m^V508Uf1XQFnh]n18]>mP_9O@>i1P1G +DHeN^e=B^0408dKnD8]6oZT00G@9^0P0PdH42^\7PdH42;P6053XlP@F1hen^oM6oPP0M1R;E_P; +dWhAj?Ol9X0m;GD1BB_AOP>9E_8VP3d]M0^:A_D:`7@DCbJ81H=nlP1n2X]>mP_9O@?oC_;XaOb; +mh]no8]Nn;P502=6oSd507DCRVKkP?a_M@f3O_80O`G7A_810>\KP?ahM0F0o5Qe4H=>oT1;Bh=^ +lP9m1LM6lP000dkbmdKn0P1e3>\6\23XO_a;>mUom_M6oT00M0^`<>Q]o8Y6nnQWo8]FlP_BORL[ +bR_J9XX4?2ed23`PM0@l:gD79ZcXB?a9BhO:h`N`<>Pmo>;iQl[S4R_I9Z`fR0E7oTk\O`?X<?cR +l0_KOPV;bk0Pj1[lh_WYF_b9MPJ;OPCgA_hP07D;=X\mPdH40Qh7j`Lfa3f3AP@4^500:TK\0dK^ +9XT5mdKn401d1dM79\L5~2jA_lRgK`Rgkl\2GXc_^\2\1en81nk51m0nS9n`N3O^X0M0Fhooo[ +0h]6kUmNRnEM`PP0k5oFGb5PhEm?H5aPVV2QH:IP2V3?H:eP\F2eH2UQeV5iHIUQ66=DHeASE6?l +G`9PEH_\EUN;OPCoMPKX@B=IRo10D?mf1UOXfaN3a0J;a`?6GeiM`eF;k8]618_DPNX00S_2L`NS +W00c`>\9a`JD00P0^?ooGL=ERnb;APB;EPH31Y`0Pm80RlP;dWD@PL400W8:>lac1XL6W03[2LL6 +U0080;Sooeg3EH_\ogH4j:CoFEg3EH_\RdH4VE9@j;OoFEUM`kZ8:n\3^Xd[^@D0]42k0P3=8KTW +0;ZB:kA0cB7Y4IiERnb;EPRdA8Y61X]N18]>2\dQLPb3OPH0M@B;`^\6j`A@j4O`GL=FEh_dRe`6 +Pn\4LPhk7[`[M0GX@P3[0nP305mN`cTN^R]d8h]g0_H40G@6RCJl:n\P>cJj:g@=RmkXE02;A`:S +_2_[3H_N<l2S^R^S_2^S_R]Cj?KnFl?o3c\N^R]d68]g0X\4Z05e3`<7R@B;?`?kRGD2Rmk[0nPb +08\o0o^;1JP1M0730@N;m`?`RE`2Rmn;O`Hkgg@>RCjn:h]g18Ue18Ul1\?71[h[~2`h\f_R\; +mW@@Rg`6RE`6REd4RGl6RGL4`hTN_R^9G`B9G`K3EUN;m8]41P_0M5851@1b=RGnocd807<3^0P0 +Pcjj:`1d7h\N_R\;fg@=Rm<i1g<JRel6>mYemNQV0>\Qj8X0jacX703[5c?0ja>;l8?623TgLnWX +Jooo1h_31@@0Gek3D3?0D53X=_iKFbD107@9<m9BD>PXoU]KF50cfe=@j1gnFe\moomd58_HRAjj +:hTN_2]H@8T7Pl<4Rl?3Fc?0`e0cfe=@j?KmFe\moomd5X_HXK`[RDL2RAjl:eQ0R@N3``B;`l=H +<l33:@N;l`<gRoh3n42918UL0XUe0X?618_6`h_\De1AD>PEoe^;f0_0M1lN1ob;n8]foX\<PlH4 +EX?Y1M7YljF9A_kX9?iKReknPl@6`h_2Pl88>m5g=H_A>ajl:gD?R@Oo1`?3De3XBoeKFn\NRo\3 +n8UM0R_@:AN;m`?bRG`2@XTERl^;gnPgoX_IPl<4`eIGEH_\Reh8RdH:2l1d=`_KM2f3j`B;3dV; +d8?21H?RoX?j27<3^PP0>lYb37L5Pl<4j`SXQoo[0nQ?oh_3j`e@j6Gnj`ICj93m<l1KGEmN`olV +433o9Q8`obHD<?lV5S0008l6a2^?1\H[S`K8:bj<7QEWRCK::hTnc2_lSPJ@0;j003;T9Za0S<F7 +eY>;=XX0ATJi0@20?Y800g8ASPJ<08_n\Glb`?:^hfj0lGm@Rl43`d0Uo_n;o2_hLUb;i`HO5PMA +BO>T<\2ZS]f7lXOIRl>;d4?X6@1g1g90j180MoTl87@8?0ed13`9MNPb`>_T2l1d1d:Z2\1e0D>6 +h3;0nN<E[4T\8W@?128lG7D7P3`RM@:\B@_f`nVWVUT3bRj>7QEWRAk0:d<3fh_dRn`[jg;VRnF9 +;\8[h`j9MP23a@8f[0[0h?Ydl3?0RDH0;XhN5FN;=\X[Rck<:olfb2_o=\H[XL0[Xh@0XL8[XhH0 +obK4:eIGR`j:057X:oeIRoP;`7@R7Qh7SQj<03?fo?>T7h_h1_lfSP3X3OeKRmP7Xlh[2l1e0nTJ +VS?0^OooP3d0M0b9?h?30_:^9SP5MOB91emNXLh[XhP0`e=dHF=[86mfIG9VK6mg8@d:98cKS<R> +f;YoJ;@9cB6>fnW^jUF;k3?0D?mf1>RQ05UIRm23n_md6_M61P80M0Kg`P40M@@c`>\9a`JD00D0 +^?ooGL=ERnaFEeF;MPCl:l2I^@X0]`2o`BN:74Kf0@5en;d0083k:g@6P?\]M@A5RQa6P?\iMbj0 +jc1b:OOQ0l<BeWC[ja:;n[T:0?OQUhOAmn:BU`?34m6:74J0ncUg1H3[<7?QCG`7mm[gf8?J05eO +GUg3EH_\ogH4j8OoFEg3EH_\Rdh8]4>:APJ;EPC=8G83TN\4D>QZjeg3EH_\ReH4>aH8:W89^0H0 +D>QEjn\?Rm[AhlN72RX005;X0`1IGL=ERnbd?X]N1<dQLPcAhlN72RX003?0j`A@j2K[GL=ERnaF +<l2j?01@D_mf1_mf1>P_jZ<^>c?0^S`0D5;oMPKoMPCX3NZ9EPJ9AP@c`;Xl051BogH6ogH4j0KZ +Xc0k<l2j?01@D_mf1_mf1>STjHUF1XU613?0^_R8D5;oMPKoMPCXc^V;f=7PdN2S>3^31SPkAX_3 +^[D5mnZ;l3?0^_R8D5;oMPKoMPCX]^V9EPJ9APBi>2;g1SPk0`1e0h?168_1VC]F1W`7OahkAPAg +6H_1^aP0VOOk0o3o1SPkRl6I:DH46EH6jlZ3OPP0M4Z3?P8`07A3<l2j601@D_mf1_mf1>QMjE0c +`;XH051BogH6ogH4j3gYD3?0D:4h>`Fjoe3XF24;`7@@PdH40H=F1P371Shk0@3[1\L6?S\003?0 +^QP0D5;oMPKoMPCX5>VS<S\c`;XH051BogH6ogH4j?;XREH6RDH4Xc`k1@@00o2;a[\703?Bmo>9 +5SXkPdH40H=F1P3g1SPk0`1e<X=n1P1l4Wl6Pgh4?7H:Pfh40H=N1P3[6X=n1P1e58=n13ae3\L6 +=S\10<L6=3\M0>\ha`Hf>`00jaB;7SHkRXO@:iRI:DH46EH6o`Hf>h\N=S^:Qm0[V9TkEPIlgGD5 +>dH4L]J;APBS=3^h;S]NGL=ERnaFRgH6Rd@:1F`7D?ldog@2og@4og@6Re`8dN?o]a0\Re`<dN?o +]o@[^2D]D?mf1>Q;68?44UiM`eF;k3?0D8]N1?mg0_lgj=OmPl@6GL=ERnb3k0CX]aj;GPB;A`:; +5b\FoRlK1P0`RDKnREKl^040D?mfoU;XZ?f3a0J;iEg3EH_\E_mf1;PD>e3XL?mIFH_`aX@D>`Y6 +aX@D>`2h53]NGL=ERncoMPCXXomID>S?oeUM`eF;k8?\25IGRgh6Pgh4AW`7PGh4RP1n2K[ookSo +onUY0H]63[\l09Wgn`5638]63YWgnhUF3X]639Wgn`562X]639WgnhUF38]62[\H09Wgn`5628]6 +2YWgnhUF2^\QmdH40`1e4H?o0GD<Pgh877h[Pfh87N\8RXG@:iPYAPQ7RlNk302Imo\1APB;aiWg +nh_jRXG@:iPkAPQn`h=^14J;AP@50P2k102Imo^;l8]610E60:T307D6Pol2O@5>RdH4VE1B<m:h +K@5IFnQMjE2;aU:IFeT3b1?JRoOAiX^4g2^I0lPCfX]629T3b1?JREknRDklRdknRekl^P40^81A +j2SYD8]62U:ID58cd[P@3UUKj1KYFeT3b1?JRdH<VE5CD58cd[Pl05UKj?kXFeT3b1?JRdH>V@?8 +4mX33_h_4ah0<8UNnXU>n8<n0S00M1goMP[oMPR;ad1@ogH4j6TN2l1d2H5^n10>Pekj08=nnP1l +47l6Pgkh07H8ReKjRdKhj`JjoonhoomOGX_UGL=ERnb3k0AFRgH4ocCoM0;oM0B;A0I8D?md2?md +2^Q@oX?438UFoXU6o8=no_me1X=no?md5He6o53XcoeI7UJh;S\ND;TB0>QYj8]FoX]6o5j;iEg3 +EH_\Pn`PEUN;MPZ=A^29A_k7A_`10>T70h]N280o9G@@odKlRPN;GPB81om61>WV0[Q3;E2=A^1@ +j=`GFEWoAPR;GPR:1iR9A_Zi5P2kMW4^R`LkA_Yd28?30^;cjH82;_mW;8]L3=7SRhOd:hU6o^U_ +0X]L3=7SRhL2;>__Re`8dN>;Qa0\jnB;G0SAhh^7:2c[fEKoM_kXb_aIFNU20_md1X=l1PYm0nT< +0S?0SEKP0l;Y5@;oM0B3O0@:ONgYmP7[j8=l10ae1Kl<0>\;Rd@4^``0VOOkRoYGPol:OLcYe@7[ +ah]l3TMGPol:O@Fh0@3[0S?0D8?oI7d5^040j`8c`5X3d8e6h0?@D^Vm0H]l24MGPol:OI?YW07[ +S_md0X=l0PYmQNV>0N^0Rd@4^``0VOOkdN2;f8^7@2cY;Ooo=8<l2W`3jF;ojF\1jEcoRd@>^`L0 +VOOkRg`<:oX;ogd3PlL7Rd@>0lNk1`2Imo^;n523o`Yl0nTaonTj0NT[oomd3>U10H]43[\709Wg +nh]l32_j2omm0h?71h]43P?7B;\709Wgnh_hD8?o2W`3jOWnj@81jO?nRe`<dN?o]o@[SDKPD>Q? +5UUI^4H]D8e6h53XfQEIFH]L2=7SokL@;8e6h53Xb1EIFKQ8;E2=A^1@j;\EFEWoM0J=A^1@j=\F +FHeFh0?2D>QjiKQ:;E2=A^1@j9XEFEV;A0X5K0M@SDKPD>Rf5UWYQ?koM0B3O0@:O@Fh0@3[0S?0 +SEKP0l9@j4;U^4d]D8e6h53XHQEIFOmd0Xe6h53XPQIISEKP0l9@Pg`22Gh5^040j`8c`5X[d5;X +4>FhD2e@SDKPD>P`5EUIocB=A^1@j54FFHeFh0?2D8<l2Gh5^040j`8c`5X[d>UWoX]42[]T09Wg +nh_jDX?o2W`3jOCm^040jO3mjN_mRd@:1F`7D8e6h53X]^C[4H]L4=7SRhOj;nV@oLM6oU<]ogKn +j?@EFH]F1R]Fo3_2L`WoM_kXhaEIj`J;APH[A_b;n53oM_koMPCX;1J3a0H1O_`1OPCoAPR=A^29 +A_j;A_`kAPIc2h]N280o07@3jNKlReh4aPL0Reh8P3l0M0@c`>\4RdKlB5mNRnEM`bD0@@1204P0 +B@1=05<0E@1G05P0F@1J0640HP1S06@0JP1]0700M`1h07T0176JK[1^gFk[KTE_IfmgKji_DG3X +L?Q`RfjUK[]^afh<KcI_DfnXKn1_bg1ERnb3k0B;AP@k1PPZLPJh1P1@je^;GPCAhoN72RX00W@5 +^040jdbh04B;GPC=8G8nm\:0MCFh0D8cbH_AcB5b;U9@^092<lV;dLdQRDKlREKnFUUb6KP0@\dQ +LQ8kE_ib2GL5>dKlLP;[]c?0j`A@j9;RRnEM`eF;k5IGRgh4__oo>Gd>MEn3O@H0M1b3?@1m2EOX +EP1I2l1eBoM50P@0M0OoM@SX6?9IP7d407`;RTD4V53Xi_IIRo37A@800<M51P00a`D00<I51?n3 +O@`0M1@c`51@ogD<j4SSD>PZk5W7A@`008_6GeiM`eF;k5IGRgh42ome1NS>0>]V>Gd>M0Fhooo[ +GX<m07`YmdD2201e2X_71@D0>DD:MDK71@00RlL51@0iA@Ye>8]528U52^\`jbj;A@H31D2;l2Te +D8]528U52U2:A@BHD>S>6H?41S_6M0ggA@800WD6Pdd24>^O<l1OGUg3EH_\EULcdX]n1>\3R1E7 +PoX:M2KoCPIn8H]N2?l?O0b;M`[oA`Z:1;@0j`OoMPSXW@IIRm0moomedX?jogD9>gh4M@@c`>\D +aPD0Reh8mdL2401d13?0j`>;APAOGUg3EH_\Pn`2EUO7A_h008\n22Znb2S[4_M40P<0M0QFj0;o +FOm6oX?648_7C`_0MNN;A_iOGX_UGL=ERnb3k09FEh]f2<M6oP00Rmi6RPn:`CabM@Rj0@2o0@3[ +883iMgD5^P83j`R0nF5e3KX22LM6oX00_`80j`@c`>]YRPa6P?T[M0n0?2]e7h3iM7@5P?URMAF0 +nB]e0XX<Pn;lPlX4adKnP06o0`20nGAe1X7:043[7H3iHWD6PLX0P>\?XC8Z9@302m2;`ZT0P7@3 +Plm0a`K4:2V>Reh6RAN;GPB;A_j91h_7Gej;iEg21P1ERnb3k0AFRgH:ogH6SDKnD8e6o53X=?n9 +A08;`7@PP7`407dWogKlRdKn2dH4D?mf2>SM1h?41XQ410[0O@g6A0Coad@2~2<l3[@HY419Q@ +j4OPF@_0M0F1C0800[P00U3gA0800W@5^040j`8c`50c`51Fj24>Pl@82l1d1eKX?oeIjl;7A0`0 +08_6GX_UGL8805Jnb2R0O0@0O1>Q22Za1=?P1LPXRmJ3aQ0k`WOWP7`407`4<l3[0X_6G\=ERncX +con;d0_0M@@c`>\=D_mf1?mf1S?0D>PToeg3EH_\^;5oD?mf1?mf1Xe6253XTNUM`eF;k5IGjKT0 +odH6Reh4RdL6>dH6MPF;APK[1X]N18]71X_hReh4mdL2@01dHH=o1P1dFh]71S]61W=CPcl0MDko +CPHcon\<Reh40gl6RdL6:DH6Reh4RdL6>dH6M^UGogH8RTL4V53X`>23a0J;d05F23_GM4^;ab_2 +0DH6Reh4Pdl28>]4Reh8R1OoAPSoCPJ;APH;`7@TCg@QReh4o`ml38]g2_m72XX4]03[1omf1>SK +0eV;d3googG:Po[oM;b3OPH0M0?Y?_n;APIOGUg21P1ERnb3k0AFRgH62oId=X_N<lV;APPcd^P: +h8UFoXU6o8?j0GLOLP@;`7<IogH4ogKlogH:j?KnReKl:m1B<m9HmoK[0S?0GX_UGL=ERnaFEh]f +18<l07d:Re@60aA2Ro[[2h\4VC?2:l:;d8_hmd@2@01e;8]<2X<l07dMj`U9RmV0?`Ye0DN;`TX; +`7G`ja2;fD60?`Ye0DN;`TX;`7G`RlMOGUg20P1ERnaFEh]f18]n2UKX^O]I2l1d1KSoon]7Pol1 +MA23?01n2eKXO?nI:DH66EH8PF@2Gok71000Rd@8RD@:Eomf2?mf1XY419Q@j8_NPl@8Po[oM@Xm +oome1KSoon\2<l1OGUg3EH_\Pn`4EX]f18Y419Q@j0;WFHUFoXU6o8?jogD5?OooM1f3?01m3EKX +4onI0DKl4EKnj`]Fj0KoVBU6o1UFoX]FoX]6o5j;iEg3EH_\RdH4?E`0M0Dm;`1e1KP10>\2<l1M +`P80EH_\Pn`8EUNhX@1@j9;]FHU6oP_0M@Dc`>UN0H]n1XX5V8_HmXO19`ad781m0CYe5XX5V8U6 +nU3X]NII1L3oRDKhPlL2ja:=A_Q@j2[JFH]6n0E104R9A_Z:1IQ@j8Go2l1e?;RQ053oM_koM_SX +WP:3a0H;`7D9ogKnj5C\FN^FogKnj<0>FH]FoP?@Ro::A?nHD>Q>o`_0MA;615c[38]foXY6nXP4 +A\H4>TIGE^SA3EUIRgKnRoj;gdN:1iR9A_`;`7@8D>PKo`_0M6^0O?l^MA6:A?jHD>P9o`_0M0F3 +kP;[<X1lobie;81loRie9XY4oIQ@j>cn2l1d6X?^0h1locYe0nU_odj;gXX7V53Xd_h;`7CbPgkl +07DLRTCoV53X`?h;`7@1CX1locYe1<H4G4K6103[2HY6o8P4A^Ugoomfo^So3EU0Rm23OP@0M1lk +EPQf0nTNoomfo_mf1>PP3EUIogKnj6O[FH]61>\9D_mfo^R0kEUIGej;iEg3EH_\Pn`4EUN;MPJ; +OPP;mWD4RlO[<8_N<lV;ac?Bj17MREKnRDKlPoX1MaQb10_0La;oMPCoM_coMP[X=`Hcd_Ofj`8c +`5mNRnEM`eIG_a@0_\PXja>;A08U00<m00=e1EKX6OUIPlH@RlM?2l1eiUmN`eF;k5J;MPCgA080 +0W@3j<Soog@6Rd@8RD@:D8Y419Q@j3<8Pl@6R@@;`7h8Pf@2gc?0jaj3?01e3X]40REooPdP08U4 +0^\8a`@008=<0Q2hoomNGL8205F;k5J;MPCo15KX101IGUg3EH_\EX]f10_fM@JhoooYU`23?01n +3Ol<Re`:od@:RPOYP`23?01lE?M40Q01MDggA08107A6PD`2P023O0H0M0aFj5?o2l1dcN_0jlWg +A0800W@3j1[o^040D;Q0>e2:A0BHD>R71h?41P_0MB>:A0BHD>Q1meTm0@1d1X=<0Q3[RH]40REo +oPdP08U40^Ujoh0n@3\=M@OgA09007B^Pf@2gj10>k@0GUg3^<PXD>Q>oeW3EH_\Pna8EUN;OPJ; +APB9A_h;`7D:]1W=8K@0@8U6oXY6oPA0R4JhaTJi>\I6^Ub=M[^dAhYFo\dQL`@c`>\jSDJhD>Sb +2eTkAPQb2<L6U00R0>_W2ome5Omf2>PdjUV;n0_0M@S71Y@0203[cXe6^51Gj?l:FEV;aemNRnEM +`eF;k8?\0UIGRgh47PL;og@J\02:9KWooocb[_OABG@;Rck>:`_oRGknM@\c`>\ZPdKn0X]noX\m +2omdkhX52\1djC[PMNV;fH0i?GGRRgH4ljJ7bgGIAh_7Gej;iEg3EH_\EULN1h]n18]f1X]>2=7Y +o?>UL`6TRdH4GeiM`eF;k5LN1h]n18]>1XY628[Po?O70@1d1><9ZTWAjO>[L`6ZGeg3EH_\EX]f +18Y61U3oMPQFj<SoPl@6RlINGL=ERnaFEah7RdH4>dH6L`Km^040j`?l<l2;MPB;OPJ;CPP;`7@6 +0o5>0oU?mlL107@4ha6TBB_`:oSAjO>UL`D3l0?hY?aOGUg3EH_\EX]f1?mf25KoMPKXY_n3a0J; +aUiM`eF;k8]>1;@lReH6cB5b0^\4D>QDf5g2101ERnb;GP@[bB_B]43=8Eg20P1ERnb3k0AFEh]f +1X]n2?O60<1e2:4b:RD0`0_`<l1@ogH4j9K\FEV9A_kgaP01M7PS?S@ZRlNYP05e1kP1053Xo=N3 +O_koMB>3?SPZ0W@:ocHh:^SXenW]0?O7P01d13?0j`>h0@29A_k[3?O600Ad=kQ@053[g?O6l01d +6Omf13?0D>Q?oh_h2l1m0nVe05OXJNaIja;oMPCoM_kX=_n;n0_0OFcYW01FogH4j9d0FEV;n0_0 +O5Xc`51Gj1CWFEV9A_bYP01d7X7>023gaP20M1hUo`0=801@^040D5OXlNJ3a0K[2_O6009d15OX +o_kgA_h107@JmlH00G@DmlK`07@>^040D53oMPCX[N^3a0H;og`_mlH00g@5^00@j`8c`8_FPN;o +n0_@D_M6oP40M0@c`>\3^001FP_@RmoAhhVG2RZ;aemNRnEM`eF;k8?\0[01Rdh6ml4207D:\0;g +`@@0M@:`08]F1;7`8Th62\6d?LdQLQZ9A_j;APHUokP=082;G_kAhhV72RZ;A_k[153XZMJ;iEg3 +EH_\XI@0>`JP;GdCPcjD~2O0b;7Y@0dN>;UeH]j`>jVRmBogH4^:P_D;SX:53X0_N3a0QM`eF; +k5J;MPKo35J:APBHD>P505UIGUg3EH_\EUN;OPJ:APBR@S^3?Omm>_l5Red:odD:R0OgA@8807D3 +jOD0P3i2>`Yd2X0n@S\=M0?Yi01Gj0?dF@_0M@?Yf02hoooYe`3Yc`3gA@:@07D7mdD20P1e1X== +0Q3[hh5=0P01Pgd607A5Pcd0M0UGj<[cF@_0MLZ;A@Kgf8T5Red:odD:X48kR0OgA@8807D3jHH0 +P3i2>`Yd1h0n@S\=MGQGj9OcF@_0M6o[UN][RTD4V=7PRmSgQ`XZ00Qd4kP2050c`51@RTD4V53X +OMJ3a0R0?T8k2WDOmdD2@01e6;P1052h\2m@RTD4V53XPPj3a0Hm0@1e6;P1052h@S]@RTD4V53X +JPj3a0Hm0@1d2_M50P02M@?Y?onP@S^d05mNGL=ERnbhf2Q@ogH4j<knFEUM`eF;k8?\0UIGRgh4 +RdH6RDKnmdD2201d:N\JEh]N2?m628X7V53XX_iIFCgoogD5<l3YE@6;APKoCPH;`7GLjDD1mdD2 +@01e0nWO08=m1P1e0nVH08]51S]61W=?Pcd0M0UGj:CbF@_0MLF:A@BHdN2;f?N72RX027@C^080 +D3?0D52:A@BHD>R>eH?42?mf1_mf28Y519Q@j:<=Pl@6>dH6LP?Yh03[QnWK08\50dH6O1^3?@1e +2[Soob]51XT5j`aGj4CbF@_0M0?YH_ooMPKoMPSoM@[X7o^3a0J;1@=61XT5RdH60DD:jIX0RTD4 +V=7PRmSgQ`XZ00Qd4kP2050c`51@RTD4V53X3=F3a0SoMPKoMPR:A@BHD>PQ3H?41S]61W=Qj@Oo +jeb3O@H0M3g[;ol5OAB;G@[oA@Z;MPSoAPR:18P7]03[3eN;GPSoAPR:1e3XG?eIFCgoogD3jLkn +RdH6odh62l1ean\IogH6ogH8RTD4V53X_`^3a0HkAPIc0nVYoX]6oUmNRnEM`PH0EH_\Pn`2EUOo +MPCX4@EIRDH4Pgh407@SRgh47PL;og@JRRF`?KWooocb[_OABG@;Rck>:`_oRGknMA?oMPCX2n=I +^?oojgJ3A_h2RgknRcd;og@TRPD:`7@N>^1ejH_IP3TmMN:;MPCcYXO;MMV;O_j;APB91N]3Rekn +:ak>:h?30S\NSP1b9h?325?XS>=IRoPN1`_oM:>73Xh0DH\fcR_cY8L6cR]@j:7RPl@2Fh\ncR^; +APB7@Oj90C?0Gej;iEg3EH_\Pn`4EUN;AP@k1PPZLPZh1P1@j;KBjJL0RdH8@3d2078=Reh4dN?g +Q`XZ009d1C?0jH`0ogH8ogH6ogH4j5[DPl@6RDKn@3d2078=Reh4dN?gQ`XZ041e1H]6o^]RRdkn +RgH67PN;oX_No:`l6W@]?0ed1J[Rm>\Lh_06DkP1052=A_e@ogH4j0oDPl@6F`OlRTKmZS_kM@;[ +VN\PDkP1053gfA_0D57oMPCX5=>3a0R;GPCAhh6?2RX00U\[niMOGX_UGL=ERnaFRgH4Rdh6>cH8 +:W85^0H0jc>;dH7R0<2;`S_1MBB1nP30M1j;g]7SRhl::X_NdN>;`BGo?`_2RHL::X_19@30j`Nh +0@1@j;[AGUg3EH_\EUN;MPB;OPXiM0ie38=n209o1X7oogmf1[SoonVT08<n]2l0M@j1o]PXM@S7 +1[@_0@3[4h<n\Rl0M@b1o\PXM@K71[8_0@23?01d3kP1050c`51@E^Qklh?42?M40P@0M0OoM0SX +1n5IPf@2llM41P00RlH51@29A0R9A0Z3OPP2M3h;ogHja`K2:4n>Pgh607DHEnRWhEV9APH;`7D3 +jGOoPd`21>\3jFkoRdH6RD@:RD@8RG`6Pgh80GD4Pd`223?0GeiM`eF;k5IGRgh6RgH4Eomf2?ld +j:ogPl@60Cb;7<H708_7GeiM`PH0EH_\Reh4aPL0^>J3D8e6153oMPJ=APQ@j=oJGL=ERnb;GPC6 +1`2hiX=@SDH4D?mf1_mf2>S3fUg3EH_\EX]f18\Lo`B:5h[22\1e1KSoon\4R\:d05iM`eF;k5J; +MPKo35iM`eF;k8e6253oMPJ=APA@^6B4D;Q5Q53XAM:3a0YM`eF;k?mf2?mf1Xe6152hI8A@^4F4 +D>PXdX?42Ug3EH_\Pn`dEUN=E\bd6\dQLPn;EPBi5P2dC\dQLP?YU029A_jh]Rm@ogH4j;D2FET; +`7D2jgLc`53oMPA@j=;bPl@6RDKl2l1dHh]No8X7V8U6nXY70iR9A_R3O_P0MCQCj83OFH=nnV5l +2X=nnWYo1;1Qj`:`@HYFnR[@R5K<adKR~2adKT8@37A^P00<M6iP00_T11jdJ;E_bi5P2dC\dQ +W?mfo>PkgeVML`SoM_kXM\o[LXYFhB_fm\90MB^1cP01oTk<m\8@M@n1cP21m\81M@Z1cX00j`B1 +cT10ogKTogKRj<g<TN\=adK<oon1cX0Q:lV;dH]n1Qh7o8Y6c9R[Tb_0ZiJ[^040ZiJ[Zi>[RdKV +Zh]6j:^AZi:[TZ^BZi:[TZ\c`5mNRnEM`eF;k5IGo8]n11h7RmLb`;Wooo:^SGGoRgh6^OoolZkg +dB_iQoOgaP40M0:TBM7YljEc0JBBGeiM`eF;k5IGS=R>`?`c`8_HRgh6RoLb`;Wooo:^mm6;oX]f +1?>VRTCoRUgo:l=OGUg3EH_\EULN1ob;OPJ;mc;0^OoolZkgdH]n1?>TRdH4GeiM`eF;k8?\0UIG +RgH4E^RC05U0RDKnD>STgUV;n0_0M0_oM_iFD>PQmH?41X_7Gej;iEg3EH_\EX]F1X]f13\FX2em +3P_BO0Z;f]7SRiMF;N\3^[X_2oId5h0l07@BDUJhb2m@^4@kD>Q2oH?42>\?D[S@;e2hA3]@j37m +Pl@6^4@kGUg2101ERnco=Y@0ogH4j:3oGL=ERncoMP@c`53XT_mM`eF;k5N<f8k0Rgh4<l3l^Ooo +lZjAmm18Geg3EH_\Pn`2EUN;OPAGj=OoFHU6o_mf1^S=oeV;l3]f27H3RgH8EX_70dKnD?mf1^Rj +m8?41X]NoP?NaP40RlMOGX_UGL=ERnaFEhcHS\3lRgh6RoLb`8]N28_;lZh[fH]n18O;ljB;bo>Z +RdH4GeiM`eF;k5IGRgh4jaJ;MPK[2hX5>PAe18_7j`i6P3`0MO17P3d0MNDc`5mNGL=ERnb3k0AF +Eh]n1>SG0Z40<8\FoRn1`P2V5LhBRDKnREKlRcF1aTChRlKAn=7hVE1B^XH7^80OFE_XN\h1A_`A +E_j;aRD309U@D[[Q0KR0<eUKj67>0DKl4EKnmlH307@9PDKlP563E_h1<lV:A@>HB8_`j`Q>RXCD +;iP3b0_fOoB:A@:HB0?8P7d30Wh7m`D307D1@H]N1XY70K@0D8_1^QP0mnYJ0l:;l8<n0S00M1R: +A`6d051A<l1@R`D5C_Q@j9032l1d0Dj;aYU@DS?B^10>FE_Xg\d1A_`AE_j;GPJ:1k@0VE1B<m:h +?01IFnS4cH]N1XYO0kL0D8_3DYUKF@?84mX1C_`AG_j;E_j;A_aOGX_UGL=ERnaFEh]f28]n2^S0 +0J40<8\FoRn1`P2V5LhB:EH46DH6aTD203?0^S`0D5;oMPKoMPCXkLZ8A@<c`;Xl051BogH6ogH4 +j<_:REH6RDH4<l2j?01@D_mf1_mf1>S4bXP5<l2j?01@D_mf1_mf1>RSbXUF1XU613?0^_R8D5;o +MPKoMPCXSL[Ah=7P1K`7R@@c`;[hR51BogH6ogH4j8?:REH6RDH4Pgh607`lM@N1OPA@8W8cPFh4 +D2:3GPH0o`@c`;Xh8U1BogH6ogH4j4C:0@@c`;Xh8U1BogH6ogH4j47:REH6RDH4Pch2<01d>S?0 +^QP0D5;oMPKoMPCX9<Y@<l2j601@D_mf1_mf1>P4bU0c`52;10E>n53X808;`7@8PdH40H=F1P0c +`;XH051BogH6ogH4j>[9R4D1<l2j601@D_mf1_mf1>S8bHUF1XU618=61063EPH0m`@307D^Pgh6 +07`BO`J3OP@lMPZ3KP@1Peh60>\FPgh607D@Pgh4?7D:aT@30\I40Qg[?<I40`3[5HY40iR;f8Z7 +e2nHVBU611UF1_i40hY40iR;f8Z7e2nHVC]F1WcJM@DkAPAbdoi40hY618Q40UmNGL=FEkP4<53X +Y?1IRoP;`7AbD>QBo5Tm101bJ8X5V8_HRXO19iRY301dFHY50IR;f8Z7`BNHZ@`0M4V:A@:HRmR: +Ql4WV:T<07@iP7d3;G@CP7d3:g@=RTD3V8_HmXO19`9d88Y50iR;f8Z7`BNHZ@80MCn:A@BHRmR: +Ql4WV:T207D_a`H2<040a`H0<000a`Kn;e16^0L`D?lfnRoX0o]IFKP;<53o=_`_j?KjFEWY^`2h +101@<l1@ocKl;nRBl8?41[P3051GocKj;nSfnh?41X\NnRo6A`<0RlL50`1@j5GMFE1B<m:h40iI +FnSRbXTF032SoRo71P8`~2_P<0jfB;gXX1V8_HmXO19`adEH_70lI@j4okFCd3079?Rmn:@06H +RmR:Ql4WV:T<07@mRmn:@0:HRmR:Ql4WV:T<07@[^0<0D8_70lI@ocKl;nQcnh?41X\No2o6A`<0 +a`H2<040j`Q6Rmj0>@1eUEmN`eF;k5J3OPH0MBb;MPR3OPPkLPb;AP@5AP2Y0`1e0Dk7APH00>\3 +odH6Reh6dN<i]n0_M_;[8H=n1P=b2h]610E60:T307@3odh8Reh6Bm7SRhOP;`5628=n1PAbNg@8 +Pgh62WMcMFb;GPKAhh=n111n3h=n1PAe2H^?gRn3`@O[18^?h2n;GPB1`k87m\<3M059Reh4@m7k +dO\3fKQ]0OMV10?31@@0<m:k1`3glb_:RdH8Pgh617D>>l5g5WDIP7h:0W8Cj``k`G88M@^0OPX1 +M`Fh0@3[0S?0GUg2201ERnb1k8P0EUN;OPB;MPHk?PPZLPZh1P1@j<c7jMl0RdH8@3d207<5<l3Y +d@2;gm7SmhL::P08M0nh0P1@<l1@D5OXVLR3a0R;gm7SmhL::P10M@koMPQFEnRX08?41^VL08_O +dN>1Y`XZoof9M_Z;APR9A_k[COm>oX]Nn_m6nXX7R4Km?0Ye1<H43DJ:A_f814J=QWSoRmH[d87j +P01l9b_`EU1Gj5\0Pl@6Rm0kaW@BPo[oM@Fhooo[?H]622]6o^\aSKIhoh=noP1eZHf6N?l[l8_6 +2l1f8EJ=QWSoD5OX8023a0J;d3_6M0j3n_mdaH]620?2:lK[0h]625mNRnEM`eF;k8]N1=7SmhL: +:P40M0Jh1@1@jand@8]N18]>28]F1\dQLPm@Reh4dN>1S`XZ011Hj`A@j:c6GL=FEc?o_\PX>ch8 +:W<Fmd@20`1d1EKX1>AIPlH@Ac\n22YbjUmN`eIG_`@0_\PXja3gA08307@5E^QFi5U?PlH@2ome +k5mN``00~2@VmbK65^I213:b\P;B13Kg1iLVUWJ7@P<CTi<B12Kg9\HFiT84U^M6`^04ieK6`P +L6mYKWAULR1QLg=YIfi]IFid3@Y4JGIYI6DPIG9bKg8=2T5RKVmbKF5\871bKfMbHFdPM6EbKFU^ +HGAYKfh=2P00~TkS_^>`00~:94UT902K0@40~2X@40~3\040~3]`41~3_042~3`040~3a@41~3 +c`40~3g@42~3i`40~3n040~32080~50@0001<2~47P80~3:P8a0P00=P8n0TD2B`8005@2V`;R +0RT3L0>g0oh3A@B<1000d`@0~2g@@0~2i@@0~2j`@0~2m@@0~20PD0~22PD0~240D0~27PD0~2 +8PD0~2:@D0~2;PD0~2?PD0~2B`D0~2E0D0~2F`D0~2H@D0~7J`D0~2M0D0~2N`D0~7I6ERMFL0 +IFiSKfAYKVMOM65RK6D0IVmbKF5d06QUK700K6mW06e_I6D0KgIULWMbJGAU079UHfmbI5m\IFiW +M6P0M6U]IG=dHFe`07AbHFicK65dJFm^GfIYK6D0J6EQI6EbGfIYK6EcL6ES07=`K6UdGg=YNVD0 +JFi`MGAOIVU\I@1_MGA`MGAOIVU\I@1RJFiQLWT0M6EhM01TIFIQMFad07=dLVEQK@1VJGQUI01f +HG9YHF9\I@0Z:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ +:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ02XZ821DJ6Uc86Uc864PEUIUKV=_I6ET86IYK6D^8219KG1\ +IFeUKWAQM6U_KW<PKfHPEUI4AD=?A4DPHFiT820P820P:RX0:RXP85IFADi3CdA5865bIB1VLVEU +K7TPHGIQJFaQHVaU86I_LR1]HFii86AYIVIULVE^M21SKfe`MGAULW<PHFiT820Z:P0Z:R0PKg1U +LV5dJFiW87=iLgAUKG<^821DJ6DPKF5cM6Eb871_LWAQHVaU84<PLfmeLV=U86Uc865fHFU\HF9\ +IB0P82XZ02XZ821VLVm]87AXIB11LgA_KR1EKVUfIG9cJGAi85AUF21QLV=XJGIU82dPM6QU86Q_ +KFDPKfHPEUI3CdA5;R0P820P:RX0:RXP820P820P820P820P820P820P820P820P820P820P820P +820P820P820P820P820P820P820P820P820P820P820Z:P0Z:R0PBFHPNFme87MQKW@PM6lPIVU^ +I21_MG@PKFmbIB1QHVmeM21FET=?A4D\87=UKV@PHB1]IG=cHFMU87A_820P82XZ02XZ821<JG=d +Ge=ULWIULT1DIEP^@F<^EF\PMfUdJ21dJ6DPLgERJVESM21dIGQd82M8ADa@85IF@dm4ABLP820P +820P:RX0:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ +:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:P1QM7AbHVEWJFh0HGAdLVE^I01RIFMYKP1RNGAUHfmeKW@0HfQQ +LV5SM6EbLfEd06=_KFeUKW@0Hg9S<c80I6ESKfAUMVEbLfU_KP1UKV@0IVmbKF5d06e_I6D0Kg1U +LV5dJFiWLgUcM6E]079UHfmbI6aUKVMdJ01cJfU`IW9_K@1cJfU`M6l0M65RK6D0M6U]IG=dHFe` +07Q\M2eVLVm]07Q\M2edK`1hK7@]LgERLgASJ65b06U`Gf9eIVIULP14AD9EAcXP06E^HfmTICXP +LVESKg9T86aUKVMdJ20m82DeK6@\87A_M65\869iM6Ec879UHF@P?B0U<C1\I00:06AUIUmVJFaU +GfiQKFD0EUIUKV=_I6DP9G<\82Ec879UK6EQLfDP:2Ec:@X0<2hi=b1RIGAQ04eC;DA?Db1DMG9R +Kb13038e84i_MR0a>CTb04T_D21VJFaU>R0P820P820P820P820P820P820P820P820P9G<0CgIU +LWMbJGAU86EhJG=dJFiW86IYK6Ec>R0P820P820P820UL`1iIG<0KVl0C6mW86IYK6Dj820P820P +820P820P820P820P820P820P820UL`15KV=_I6U^Ib1]IGAXKf@j820P820P820P820P820P820P +85IFHfmTI@X0BBm@86IYK6DPKFmTICXP820P820P820P820P820P820P820UL`1eKV]^KgM^04T_ +D21VJFaU86I_LVeQM3XP820P820P820P820P820P820P9G<0MFi[KVmgKP19;e0PIVU\IB1\KfiW +IG=d879UHfmbI21\IFiWM6Pj820P82E\I019;e0PIVU\IB1\KfiWIG=d879UHfmbI21\IFiWM6Pj +820P87E^Jfi_Mfh0BBm@86IYK6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820UK6@0BBm@86IY +K6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P821eKV]^KgM^04T_D21VJFaU87AYKFEcM65]L3XP +820P820P820P820P820P9G<:07E^Jfi_Mfh0@E=3BDT0M79QKW=\HGAYKfhPIVU\IB1dLV5^LfaQ +M6Ec86IbKfdPH2Ec9b1dKb1P9G<W06a_Hf5\86=XHG9QHgAULR1cIG@PJG<PH2Ec9`11Dd=9B@1D +LV5^LfaQM6U_KR1`IG9VKg9]IF@j820P820P820P820P86i_KVD0BFidIG9^HF`PIG9bKg8PI6Ed +IF=dIF@PJFhP9G<X:@1_L6E^GfU`GfIYK6D0A4E2EDLj801UKV=_I6Dj86m`IFiYKVLPJFi`MG@P +IVU\IB1P9G<W00X0IG9bKg8PKg1UKVU^Ib1YKW1eM21VJFaU860ULbL0A4E2EDLj801_L6E^GfU` +GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0;@1cM6A_MG@0MWIU04A5@UE7>R00 +Kg1UKUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU860ULbL02P00MWIU04A5@UE7>R00Kg1U +KUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU860ULbL02P1ULW9_LR1_L6E^JFiW86meM71e +M21VJFaU860ULbL02UIFAB1?;e0PIVU\ICXP820P820P820P820P820P820P820P9G<0A4E2EDLj +801_L6E^Gfm`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0M69\06EbLVmb879U +HFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\IB1P9G<W04A5@UE7>R00IFiSKfAYKVLPM65RK6DPKVmd +87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0I6EVHGE\M21FET=?A4D0:bd`<C8c=3Df +=cPi@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEYQHV=TIFIWJ6UZJfa]KVm`LG9cM7EfMgQiNP0: +AFiSKfAYKVLPM65RK6DPLfmeLV=U>R0P820P820P820P820UL`15KV=_I6U^Ib1dHF9\IB1SKfid +IFidLcXP820P820P820P82D^<c9c020P820P820P820P820P820P820P820P820P820P820P820P +9Bhc<W<0EUI586E^HfmTJFiW86I_LVeQM3XP820P820P820P820P820UL`1^Kg@PLVESKg9TIF@0 +J6AbGfIYK6EOLg1UH`1FETDPJ6EQI6Eb86IYK6DPLg1UHcXP820P820P820P820P82Ec04U^M6Eb +KV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0LfEdGfU`GfIYK6EcL6ES02d0LgATJFh0JFifHFaY +I21VJFaU86E^HfmTJFiW86e_I6DPLfEd82PUI2T0EUI586E^HfmTJFiW86e_I6Dj820P820P820P +820P820P820UL`1FETDPK6m^IfEcM21bIF=_LV@PK6E^IgAX>R0P820P820P86i_M21bIF=_LVAU +I01YKWIQK6UT86a_KVMULg@PLVESKg9T86aUKVMdJ21cIG@P:2E\I2T0EUI586a_KVMULg@PLVES +Kg9T86aUKVMdJ3XP820P820P820UK6@0JFifHFaYI21\KfiWIG=d879UHfmbI21\IFiWM6PPLfEd +82PUK6@Y05IFAB1\KfiWIG=d879UHfmbI21\IFiWM6Pj820P820P820P9FaT05IFAB1]HGQYKGE] +879UHfmbI21\IFiWM6Pj820P820P820PKVmd879UHfmbI6ET06U^MV5\JF@PKF5hJFeeKB1bIF=_ +LV@PK6E^IgAX87=UM20X9FaT:@1FETDPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820P820P82E\ +I01YKWIQK6UT86eQN6U]MFdPLVESKg9T86aUKVMdJ21cIG@P:2E\I2T0EUI586eQN6U]MFdPLVES +Kg9T86aUKVMdJ3XP820P820P820UK6@0A4E2EDLj801cL6aYM21cJGYU86i_M21cL6ESJFIYIF@P +KfhPM6QU86=_KFeQKV@PK6U^I@0:05IFAB1?;e0PIVU\IB1]HGQYKGE]87=YNVDj820P820P820P +KVlPKF5hJFeeK@1^Kg@PIFiSKfAYKVLPM6lPHB1VJFaU82dPIVU\IB1cL6aYM7AYKVLPI6UcHF9\ +IF@0EUI584l_D21VJFaU86eQN6U]MFdPLfUjICXP820P820P821^Kb1]HGQYKGE]02E\I01YKWIQ +K6UT87=`K6Ud87=YNVDPLg1UHfUVJFET860ULbL0Lg1\JG@PLfUjIB1]MG=d869U865d86aUHG=d +82E\I21[@P1FETDPCbm@86IYK6DPKF5hJFeeKB1cJGYU>R0P820P820P82E\I21[@P1FETDPIVU\ +IB1dJFeULgAQKG0j820P820P820P820P820P82Ec06i_M21bIF=_LVAUI01]HGQYKGE]86ieKF9U +LR1_IR1`HG9dLb1bIF5SJ6ET82PUI2T002EcLf]YL7A_82ET2P1FMP1@HG9d82DcI21RNGAULb1g +LVUdM6E^>R0P820P820P820P82E\I01f9C0bI01ULW9_LR1_L6E^JFiW86meM71eM21VJFaU860U +LbL002Ec9G<:05If02Ec9G<P9FaT2P1FMP0ULbEc82D`>6ah2P1FMP1@HG9d82DcI21RNGAULb1g +LVUdM6E^>R0P820P820P820P82E\I00:@e93;C<b>R0P820P820P820P820P820P820P820P820P +820U<3Q\N01DKgAQK21RNGAULb1bIF5T>R0P820P820P820P820P820P82E\I01DKgAQK21RNGAU +Lb1gLVUdM6E^>R0P820P820P820P820P82E\I01DKgAQK21?;e0PL65bM7<PMg9YM7AUKSXP820P +820P820P82ET00YFEVE^HfmTIB0ULb`P9G<PLVE\IF5cIB0X9G<Y2PX0<2hi=b1RIGAQ04eC;DA? +Db1DMG9RKb13038e84i_MR0a>CTb05IFIFiSKfAU>R0UL`X:05EcHFMU>R1FEVE^HfmTIB0PFg5e +HFaYIVUULW=M821YKW1eM5mVJFaU821KKgEdL7EdGfIYK6EM2PX0821FHFaYI21aMF5\JFIYIG9c +865bICX:2P0P82D^<G<UL`X0;bd0820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0m>Rd0820U;S5c +9G<U;S5cIVU\IBeVKg9]HG@P82QVKg9]HGAc87=eL71_LWAUI3XULbEc9G<ULbEc9G<Y2P0_;@0m +>Rd0800P0200820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0m>Rd0820U;S5c9G<:02l]020P9Bha +LbEcFbD^<G=VJFaU;G=`IF=M2P0_;@0m>Rd0820U;S5c9G<U;S5cIVU\IBe]KfAU820XKFmTIG<P +LgE`L6mbM6ET>R1RJFiQLWTPM6EhM2T:02l]03dj;@0P82D^<G<UL`X0;bd0820U;S5c9G<U;S5c +HWUdIG<:02l]03dj;@0P82D^<G<ULbD^<G=[HWUdIG<:02l]03dj;@0P82D^<G<ULe\U;S5cM6U] +IEd:02l]03dj;@0P82D^<G<ULbD^<G=VJFaU;G=`IF<:2P0_;@0m>Rd0EWH0EP0:00Y@HG9d82Dc +I21?;e0PIVU\ICXP820P820P820P820P820P82Ec051QLW@P9C=T87=dHG9dIF@PHG@PBBm@869i +M6Dj820P820P9FaT02Ec2P1GLVUdM6E^869i85IFIFiSKfAU82Ec;0X0<2hi=b1RIGAQ020P820P +820P820P9G<PLVE\IF5cIB0X9G<Y2P1=Dbe4Ce<PE7EbHVlP@`0b=B1>KgHP<CTi<P0:02Ec9G<P +9F@:05If02Ec9G<P9G<:05If04eC;DA?D`0ULbEc82Ec2P1FMP0ULbEc84mbJFMYKV5\86IYK6DP +HfQQLV5SM6Eb87=UM21gHG<P9G<:05If045C@dU902Ec9G<P9G<:05If045C@dU902Ec9G<P9G<: +05If02Ec9G<P9G<:05If02Ec9G<P9FaT82E\I0X0EWH09G<ULb0UK6@:05If02Ec9G<P9G<:05If +02Ec9G<:05If02Ec9Bhc<W<:05If02Ec9Bhc<W<:05If02Ec9G<P9G<:05If02Ec9G<:05If02Ec +9Bhc<W<:05If02Ec9Bhc<W<:05If02Ec9G<P9F@P9G<:05If02Ec82E\I21RNGAULb1VKg8PM6QU +86eULg=QIfDPHWEVIVEb2P16@EA1C3XPMFiQHVaU87A_865\K6mSHGAU04A5@UE7>R00KF5YKSXP +HFa\Kf=QM6ET82E\I21RNGAULb1VKg8PHWEVIVEb860ULbL0AemdKG1OKG=W00X0AemYL5mRMFIV +IG80Aem_L5mRMFIVIG80;bd0?CX]06QUK70PLVEaMFEcM6ET06U^L7Ed86IYK6DPKGEcM21RIB1c +L6ESJFIYIF@094UT900O01`07`0N01l07P0O01l07P0O01h07`1ULW9_LR1QK6a_Hf5dJFiW82E\ +I21RNGAULb1VKg8PHWEVIVEb860ULbL0A4E2EDLj801QK6a_Hf5dIEmRMFIVIG8j865\K6mSHGAU +I20UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W00X0Hfm]KFE^M5mcM79OHWEVIVEb02DZLb0UFeh: +G@1FETDPIVU\IB1SKfe]IFid>R0P820P820P820P820P9G<0IG9bKg8PL65bLfU^Ib1fHFaeIB1_ +IR1P9G<W86QUHFAULP1ULW9_LR1SK6mcJFiW86IYK6DPH2Ec9`14AD9EAcXP06MUM6=OIVmbKF5d +>R1VKg9]HG@PKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21VKg9] +HG@PH2Ec9`14AD9EAcXP06MUM6=OIVmbKF5d>R1SKfe]HFiT86aYKVDPLg1UHfUVJFEc86I_LVeQ +M21P9G<W00X0A4E2EDLj801WIGASGfe_I6Dj86e_I6DPKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm] +KF5^I21\JFiU00X0JFifHFaYI21]KfAU860ULbL0A4E2EDLj801WIGASGfe_I6Dj86=_KFeQKV@P +K6U^IB1cL6ESJFIYIG<PKFmTIB1P9G<W00X0A4E2EDLj801WIGASGg9UHfaUKSXPLVESKg9T86aU +KVMdJ21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0UK6@0JFifHFaYI21bIF=_ +LV@PK6E^IgAX87=`IF=YIVUUI21P9G<W079UHfmbI21\IFiWM6PPKGEcM21RIB1YKR1dJ6DPLV5^ +IfDP9FaT;BE\I20XKVmd82E\I2T0LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0U +K6@]9FaT82Q^Kg@P9FaT:@14AD9EAcXP06MUM6=OLVESK6E^>R1SKfe]HFiT86aYKVDPLg1UHfUV +JFEc86eQN6U]MFdPLVESKg9T86aUKVMdJ21P9FaT9`0:04A5@UE7>R00IfEdHemdJFeULgAQKG0j +87AYKFEcM65]L21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1YKWIQK6UT87AY +KFEcM65]L21cM79YKVLPLg1UHfUVJFET860ULbL0A4E2EDLj801XIF5TIG9OM7U`ICXPEUI586aY +KVDPKF5dHfQULb1XIF5TIG8j860ULbL02P1QKF9YIgE_MG<PJ6EQI6Eb86UWKVmbIF@0A4E2EDLj +801XIF5TIG9OM7U`ICXPJFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:04A5 +@UE7>R00KF5[IEmdJFeU>R1THGAU871bKgIYI6ET83dP9C0dI2lU<39T;bD`<V@02P14AD9EAcXP +06eQJfEOM6U]ICXPM6U]IB1`LVmfJFAUI20m82D`<V@j9C0bI3XU<39T00X0A4E2EDLj801]HF]U +GgAYKFDj87AYKFEOM21fHFaeIB1bIGAeLViUI20m82E\I00:04A5@UE7>R00Kg1UKUm\KfMOIVU\ +ICXPK6mW86IYK6DPKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0K6mW04A5@UE7 +>R00Kg1UKUm\KfMOIVU\ICXPKg1UKVU^Ib1\KfLPIVU\IB1P9G<W00X0LgATIG9b06EbLVmb86m` +IFiYKVLPK6mW86IYK6DPH2Ec9`14AD9EAcXP06m`IFiOK6mWGfIYK6Dj860ULbLPJG<PKVmd864P +LVEWMFaQLR1VJFaU00X0I7E]KGT09BYc82Ec06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1X +IF5TIG80A4E2EDLj801`HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dP +H2Ec9`0:02D`=6@^9C0bI2hU<39T;BD`<V@j9C0bI3XU<39T06EbLVmb871QLW=YKVLPM6U]IG=d +HFe`87=dLVU^Ib1P9G<W07UUHG8P:5UIFETY86eeLg@PHVDPJFhPM6QU879QKVMU834i=c0]<S0c +=b0XKVmd82ET:@X0KFm^M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^Kg@P9F@Y +2P1THGTP:4A4:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C<a82Q^Kg@P9F@Y2P1XKgEbLb0XB4PY +86eeLg@PHVDPJFhPM6QU879QKVMU830]<S<P:6i_M20UI2T:06eYKWEdIG<P:4e=:B1]MG=d869U +86U^87AXIB1bHFiWIB0`;CDi82Q^Kg@P9F@Y2P1cIF=_KVAc82QCDbTPKGEcM21RIB1YKR1dJ6DP +LV5^IfDP<2de>B0XKVmd82ET:@X0A4E2EDLj801`HG9cGgAYKFDj87AYKFEOM21fHFaeIB1bIGAe +LViUI20m82E\I00:06UdIFeOLgAb02EXI01ULW9_LR1`HG9cJFiW86UdIFdP9F@P:60ULbLY86U^ +87AbHFicK65dJFm^86IYK6D0JFifHFaYI21fHFaeIB0X9F@Y86mV86UdIFdP9F@PJFhPM79QKW=\ +HGAYKfhPIVU\I@1gLVm^Ib1^MFeRIG8PKfHPMV5\MFEc86U^87AbHFicK65dJFm^86IYK6Dj82ET +069eIVIULP1ULW9_LR1_L6E^JFiW86E^HfmTJFiW87AQHVaU86IYK6DPH2Ec9`1ULW9_LR1bIF5T +JFiW86E^HfmTJFiW87AQHVaU86IYK6D0M6m_86eQKWTPHfQQLV5SM6EbLb1YKR1UKV=_I6U^Ib1d +HF9\IB1VJFaU>R0UI01^Kg@PIFi_MFMX86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\ +ICXP9F@0IG9bKg8PKg1UKVU^Ib1dLV5^LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP1ULW9_ +LR1bIF5TJFiW87AbHFicK65dJFm^86IYK6D0J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\ +HGAYKfhPIVU\I@19KWAULViQK21ULW9_LR1TIGAUHgAUI21YKR0ULbPY079TGgQ\M5mVJFaU02EX +I01YKWIQK6UT860ULbLPJ6EQI6Eb87IQK7EU86U^87AbHFicK65dJFm^86IYK6Dj860ULbL0M6m_ +86eQKWTPHfQQLV5SM6EbLb1YKR1dLV5^LfaQM6U_KR1VJFaU>R0UI01XIF5TIG8PH2Ec9b1^Kg@P +IVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\ +HGAYKfhPIVU\I@1XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1YKWIQ +K6UT86E^HfmTJFiW87AQHVaU82dPHfQQLV5SM6Eb831h9C0bF21TMG1\JF=QM6ET07Q\M01ULW9_ +LR1bIF5TJFiW87AbHFicK65dJFm^87AQHVaU86IYK6DPH2Ec9`0:E79QKW=\HGAYKfhPM65RK6DP +LfmeLV=U>R0P820P820P820UL`1DLV5^LfaQM6U_KR1`IG9VKg9]IF@j820P820P820P820P860U +LbLPM6lPH2Ec9`1SKfidIGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL0M6EhM3XPH2Ec9`1SKfid +IGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL0A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21f +HFaeIB1`LVmfJFAUI20m82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@P +M6lP<0X09C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@084M=E014AD9EAcXP07IfGgAYKFEc +M65]L3XPEUI587AYKFEcM65]L21cM79YKVLPLVEdMG9^87IQK7EU83dPH2Ec9`X02P1SKgE\I6hW +M21QK6a_Hf5dIB0UI21RNGAULb1dKb1SKg1i87=dLVU^Ib1P9G<W02A9I2@02REc85]I;diM>R00 +ADm686AUM6ESM6ET86m^87=dHFiTHG9T86U^L7Ed079R06=_MFaTKRMd86EhHFeYKVDP:6m`IFhY +86IYK6DPH2Ec9`14AD9EAcXP06EhHFeYKVEOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMeK65b86IY +K6D02P1SKgE\I6hWM21UN65]JFiU82QcM65d:B1VJFaU860ULbL0LVEQLfm^86I_LR1ULW9_LSXP +9G<0LV80LW@0JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0IG9bKg8PKg1UKVU^Ib1V +JFaU860ULbLPIVmb86U^L7Ed04IYK6DPH2Ec9b1UN6UcM7<^821?MVEbMg9YM6DP?`1_L6EbHGAY +KfhPHf5^HfE\K6ET06IYK6DPH2Ec9b1UN6UcM7<0Mf80Mg@0JFifHFaYI21VJFaU86e_I6DPLg1U +HfUVJFET82PUI2T0IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86meM71eM000@2<T9EhV;Elm +:f5RHfAUIVMXJFY[K6e^Kg1aLW=dMGIgN7Uj@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEX`<C8c +=3Df=cPi<0108b@UGRH]Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda= +CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`07=eLg1YHfU_MG<PJ6EQI6Eb86IYK6DPLg1UHb1P9G<W +86=XHFiWIF@PM6lPH2Ec9`00G3X0G00^00XUL`1ULW9_LR1bIF5TJFiW87=dLVU^Ib1VLVm]87=d +I6U^04A5@UE7>R00Lf=QKUmSKFAOK6U^ICXPHfm]KF5^I21\JFiU865bIgE]IFid>R1P9G<W00X0 +;@14AD9EAcXP07=SHFiOHfeTGfaYKVDj86eQM6=XIG<PLGEQK6UVJFEb>R0P820P860ULbL02P1Q +KF9YIgE_MG<PLGEQK6UVJFEb860ULbL0MFi[KVmgKR1aMF5\JFIYIG8PH2Ec9`1aMF5\JFIYIG8P +H2D^<G<ULbLPKGEcM21dHF]U864PMV5\MFD0;bd0MV5\MFDPKFUcLfU^Ib1QIWAULR1aMF5\JFIY +IG8PH2Ec9`1aMF5\JFIYIG8PH2D^<G<ULbLPI6mULb1^Kg@PM65[IB1Q87IQK7EU02l]04A5@UE7 +>R00Lf=QKUmSKFAOK6U^ICXPLGEQK6UVJFEb87IQK7EU>R0P820P820PH2Ec9`0:07A_Kb1]HFii +86IYK6DPKV5]IG<PLg1UHfUVJFET04A5@UE7>R00LfEdGfIdJFeU>R1cIGAdJFiW86IYK6DPH2Ec +9b1dJFeU87A_82D^<SAc00X0@f5^KVmd87=UM21VJFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj +84eC;DA?Db1TKfEc86i_M21cMG1`Kg9d86IYK6DPM6U]IG<PHVEVKg9U834i>30^04IYK6DPH2Ec +9b1dJFeU87=UM21dKb0a>CP`;S0a;S0a;C0`>S0`>S0`84M=E01ULW9_LR1cIGAdJFiW86IYK6DP +H2Ec9b1dJFeU87A_82D^<SAc04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0LfEdGg1Y +L6EOKFmTI@1ULW9_LR1cIGAdJFiW86e_I6DPKfHPIVU\IB1P9G<W03YL05AJ05AJ?@17CE@`@U=D +~282d]800:Ed5BCTU>AcXP00Y5DU9?DSXP00Y6@EA1C3XP04U^M6EbKV5\86EbLVmb86AUM6ES +M6ET86U^82Ec:2T0MG=ULUm]IG=cHFMU02Ec9G<:02Ec9G<:06meM71eM21bIF=_LV@PM6m_86a_ +KVLP:2E\I21RNGAULb`PKF5h83dP9FaT:B0]87AbMFiSHGAUI01ULW9_LR1_L6E^JFiW86IYK6DP +H2Ec9`1ULW9_LR1cIGAdJFiW86IYK6DPH2Ec9b1dJFeU87A_82D^<SAc06EbLVmb86=\Kg=YKVLP +IVU\IB1P9G<W~5820P820P820P8B4Q8B4P820P820P820P820P820P8201@410@410@410@410 +@4100P820P820P820T10@410@40D51@D51@410@410@410@410@410@410@41410@410@1PH61PH +60P820P820P820P820P820P820P8@410@200~~~b=5<dDcAC~22@80~9b2P000X20@00~7f2P0 +00820P00~7j2P004<20`00~7n2P004821000~722T0~~~~~~~55001H09P0V04X0:P~O@?oo~5 +4`8210D620P851D54olF1A42ooooooooooooooooo`D5ooooooooooooooooooooo`oo8`;o3ooo +oolCool20PD?0_oooa?oooooooooob?ooooo8olCo`1DCE00;R@T900000820P820P820@410@42 +0P820P820P820P820P820P810P820P<20P8210820P821@D51@D51@D51@820P820P820P872QD: +30T20P\250h20P820PP20Q820Q0240820P821PL:2PX<2@823@8A3Q<20Pl220824P820P820P80 +42Q^MFa\:@0051@151DD51@D0P0D0`@D2@D51@D51@D51A@D51@D51@D51@D3aL?21@D50LD5Q@D +51@D51@D50dD51@D51@D51@D40X?3`l82Q@D1Q@B2`hD514D31@D3A@D51@D51@0L79YKW@PLf=Q +KVHP>R1VK6mQM6U^Ib1`KfU^M21VKg9]HGAc86i_M21\JFi[IF@=2P00~E7a`O7QlN7alN7ahO +~27`0k05X0N02G0;D0e03c0141<05>0D@\B2a<;50\E2aH;5`\H2aW;6h\MRb0;8T\T2bI;9d\ +XBbU;:T\[Bba;;D\^Bbm;<4\aBc9;=4\fRcP;>H\jRc_;?@\nb`5;@d]5RdO;B8]DgE^04e_KP1D +MFD0EfET05AXM@16LVT0Df5d05=eKVAQN@1=KfiTHGT0E7EULfAQN@1GIFA^IG=THGT0E6QeLW=T +HGT0AW9YI65i05=QM7EbI65i04YQKP16IF80CF5b045`LP1=HGT0BWE^04YeK011MFL0DfE`04mS +M01>KgH0A6ES04YQKWEQLWT0AVERLWEQLWT0CF5bHfP0@G1bJF`0CF5i04YeKVD0BWE\N@11MFMe +Lg@0DfE`M6E]HVEb04mSM6mRIG80CVmfIFeRIG80A6ESIFeRIG80@Dd0D4d09G<P9G<P9C0bI20U +<39T>RD`<V@j9C0bI20U=6@0<300800P02`P03X`03X`02D00:8]ZRg2;M`]jbgo;A4^8Bhf;TP^ +IBii;XP^W2h00:T^^2kN;^h^o2h=;ah_<2l0~C@Rm@;f4_R2lU04EbLVmb8300BFifHFaYI21V +MFiSM6U_KR1^MFeRIG80CVlPLgESJ21VJFaU86mb86AYLVESM6mbN@1@HGAX86i_M21VKgE^I01D +KflPKF5^NB1_L6E^86IYK6Ec051ULVeYLg=YKfhPI6E^JFET049QI21VJFaU86ieKF9ULP1=IFe_ +LWTPHG9UKV4PM79QLfQUI01>Kg@PIFi_MFMX86eUKFmbN@19KWIQK6UT86eUKFmbNB1RK6mSJb1Q +I6AbIG=c04U^MV5\JF@PIFifJG9_KVeUKW@0BFifHFaYI21VKg9]HG@0BFifHFaYI21QHf=ULg<P +HfmTI@19KWIQK6UT86AQM640CVlPLgESJ21TIGIYHfD0@GAdIFe`M6ET87A_879UKFmfIB1SMG9b +IFid86AYLVESM6mbN@1>Kg@PLf5]IB1TIGIYHfD0CVlPKFmbIB1VJFaUL`19KWIQK6UT865bIgE] +IFid045bIb1\JG=d87A_Kb1RJFL0AGQUHb1VKg9]HG@PIG9bKg80@g9_Lg<]I6EfJF=U86aYKV\0 +CF5dJ21QLVMeKFE^M01BIG=eK7@PM6m_86aQLVMU04IYK6DPHFabIF5TNB1UN6UcM7=6JFaU865\ +LVEQI7TPIGQYLgAc051_Lg=YHVaU86AUHFA\Kf=[05E^Jfi_MfhPIG9bKg809G<j82Ec2P0=~5 +G2l^05E^Jfi_MfhPIG9bKg809G<j82Ec2P0UL`X07a`O7QlN7alN7ahO~27`0k05X0N02G0;D0 +e03c0141<05>0Fd1jS_V>e16~20@1DFP15De@0ADAD~2B6A=I4eTCF@00UAM~341MW~342QX~3 +7Yf:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~Bne8@0llF~2CP8[0HP0Q`<]0@<0~2[`1e1@<00`030>3<~60@00~38000~;K`E1 +E@00~>0@0005`1~30P0006l1~30`0009L1~310000>`1~31@0007P2~31P0008d2~31`0008l2 +~3201Z0942~260T0J@3A1@0060X0J0022P0060\0I`3n2P0060`0IP2k300060d0I@3\3@0060h0 +I0253P0060l0H`0i3`006100HP2W3`006140H@1R40006180H00F4`0061<0G`16500061@0GP00 +5@0061D0G@1a5P0061H0G03`600061L0J`2@6P0061P0F`2l6`0061T0K01m8`0061X0b@299000 +61\0b00G9@0061`0a`2e9@0061d0aP079P0061h0a@3Q9P0061l0a02Z9`006200``0K:@006240 +`P32:@006280`@3R:P0062<0`01K:`0062@0_`0I;00062D0_P0C;P0062H0_@1U;`0062L0_03^ +;`0062P0^`2T<@0062T0^P0a<`0062X0^@3?=00062\0^01`>00062`0]`3`>00062d0]P2R>@00 +62h0]@0M>P0062l0]01A>P006300\`3J>P006340\P0_>`006380\@2m>`0063<0\03o>`0063@0 +[`1:?00063D0[P27?00063H0[@3e?P0063L0[01G?`0063P0:@6V?`0063T0:04Z@00063X09`6f +@00063\09P4A@P0063`09@58@P0063d0907C@P0063h08`6T@`0063l08P7:@`0064008@4EA000 +6440805AA00064807`5CA@0064<07P4:AP0064@07@5gAP0064D0707lAP0064H06`5SA`0064L0 +6P7QA`0064P06@4BB`0064T0604PC00064X05`6fC00064\05P6gC@0064`05@4\CP0064d0504f +C`0064h04`5fC`0064l04P76C`006500~2f540~2D@000?aA~3DP0001UB~3D`0003AB~3E000 +04MB~3E@0005iB~3EP050H9C~3E`00095C~3F0000:=C~3F@000;5C~3FP000;eC~3F`000=1C +~3G02B0>=C~3G@000>IC~3GP000>IC~3G`000>YC~3H0000>eC~3H@000>eC~3HP2B0?9C~3H`00 +0?EC~3I0000?EC~3I@000?YC~3IP000?eC~3I`000?eC~3J00_095D~3J@0009AD~3JP0009AD +~3J`0_0;9D~3K0000;ED~3K@000;ED~3KP000==D~3K`0000aE~3L03[01iE~3L@0002mE~3LP00 +0:aE~3L`000<UE~3M0000?9E~3M@0002eF~3MP2B06iF~3M`0008EF~3N0000:5F~3N@000<iF +~3NP0008iK~3N`0000eM~3O000021M~3O@3Y03=M~3OP0005AM~3O`000?5M~3P02M02=N~3P@00 +06YN~3PP1>081N~3P`3j0:aN~3Q0000=QN~3Q@0000IO~3QP000;AS~3Q`000=US~3R0000?]S +~3R@0002aT~3RP0003QT~3R`0006MT~3S0040HiT~3S@2T05eU~3SP000;AV~3S`0000EW~3T000 +00UW~3T@0000eW~3TP00015W~3T`3W095X~3U000095X~3U@00095X~3UP3]0:=X~3U`000=AX +~3V00004AY~3V@00051Y~3VP3\06]Y~3V`00095Y~3W0000<M[~3W@3g0=e[~3WP0000i\~3W`3h +035\~3X0000=9]~3X@0002M^~3XP000<ia~3X`2Z04Eb~3Y00@0KYb~3Y@0>0CMc~3YP0009Mc +~3Y`0008=d~3Z00001Me~3Z@0=0D9e~3ZP0<0F5e~3Z`0:0DYf~3[0000?9f~3[@0005Ig~3[P00 +0;ag~3[`090Cai~3\0060@Ij~3\@0?0AMj~3\P0001Mj~3\`000<9j~3]0000<]j~3]@030DYk +~3]P000:Uk~3]`000<Qk~3^0000>ik~3^@0000Ql~3^P00055l~3^`3Z09El~3_0000>5m~3_@00 +02in~3_P0006An~3_`0;0G]n~3`0000:1o~3`@000;5o~3`P020D:1~3``0000F2~3a03X0<f2 +~3a@0001b3~3aP080@b4~3a`0002V4~3b02W0724~3b@0008j4~3bP3i0:^4~3b`010MN5~3c000 +0A26~3c@3o03n6~3cP000666~3c`000>J6~3d0070OF6~3d@3n00>7~3dP3m01f7~3d`3l0667 +~3e00008f7~3e@000;R7~3eP000<n8~3e`3f09f:~3f00000b<~3f@000>^<~3fP000>n=~3f`00 +02V>~3g00004n>~3g@00~3i`P0gP0007@0i`P0g`0007P0i`P0h00007`0i`P0h@000800i`P0 +hP0008@0i`P0h`0008H0i`P0i00008P0i`P0i@0008X0i`P0iP0008`0i`P0i`0008h0i`P0j000 +0900i`P0j@000980i`P0jP000980i`P0j`000980i`P0k00009<0i`P0k@0409@0i`P0kP0009H0 +i`P0k`0009X0i`P0l03W09`0i`P0l@0009h0i`P0lP000:80i`P0l`000:H0i`P0m01a00T1i`P0 +m@1`00l1i`P0mP1_02d1i`P0m`1]08L1i`P0n0000;hWi`P0n@3k0<0Wi`P0nP000<8Xi`P0n`00 +0<@Xi`P0o0000<HXi`P0o@0A0LPXi`P0oP0000PZi`P0o`0000XZi`P00040038Zi`P00@4003@Z +i`P00P4003HZi`P00`4003PZi`P0104003XZi`P01@4001h[i`P01P400;X[i`P01`400;`[i`P0 +20400;h[i`P02@400<0[i`P02P400<8[i`P02`400<h[i`P0304005H]i`P03@400:0]i`P03P40 +0>0_i`P03`400?X_i`P040460?h_i`P04@40008`i`P04P40010`i`P04`40018`i`P05046030` +i`P05@4403@`i`P05P4403H`i`P05`4603P`i`P0604403``i`P06@4603h`i`P06P4K048`i`P0 +6`4K0;8`i`P0704K028ai`P07@4J098ai`P07P4J09@ai`P07`4J09Hai`P0804J09Pai`P08@5b +09Xai`P08P4K09hci`P08`5d00hdi`P0905e04ldi`P09@42054fi`P09P44058fi`P09`5f05@f +i`P0:0400<Hji`P0:@4_~51BX1~61B\1~61B`1~2300000D]0@00010000D`0@H0g_l0008a0@H0 +h_l0008b0@H0i_l0008c0AP0E?l0008d0AT0[_l0008e0@X01`0000@f0@@0j_l0008g0@H0k?l0 +008h0@H0l?l0008i0@H0m?l0008j0@H0n?l0008k0AX0o?l0008l0AX0o_l0008m0A\08?l0008n +0AX01P0000@o0A\0T?l000900B801P0000Y10B00100000Y10B001`0000a00B801P0000a20B80 +2P0000Y30@@0200000Xn0B<01P0000Y40B00100000Y40B001`0000`n0B<01P0000Y30@@02000 +00Y20B801P0000a50AX0200000Y60@@01P0000Y70B00100000Y80@@0o_l000990A\0S_l00097 +0B001P0000a60@@01P0000Y50AX01`0000a00B802P0000Y:0BD0200000Y;0B@01P0000Y<0B00 +100000Y=0@@0o_l0009<0B00100000Y;0B@01`0000a:0BD0200000Y00B801P0000a>0BH02000 +00Y00B@01P0000Y?0B00100000Y@0AX01P0000AA0BL0l?l0009B0BP0m_l0009?0B00100000Y0 +0B@01P0000Y>0BH01`0000a00B801P0000Y10B00100000Y10B001P0000a00B801`0000a00B80 +2P0000YC0BD0200000Y;0B@01P0000YD0B00100000YE0@@0o_l0009D0B00100000Y;0B@01`00 +00aC0BD0200000Y00B801P0000a00B80200000Y;0B@01P0000YF0B00100000YG0@H0o?l0009F +0B00100000Y;0B@01`0000a00B801P0000aH0BX0200000YI0BT01P0000Y20B@0100000Y80@@0 +n_l0009J0@H0o?l000920B@01`0000aI0BT01P0000aH0BX0200000Y00B80200000Y;0B@01P00 +00YK0B00100000YL0@H0o?l0009K0B00100000Y;0B@01`0000a00B801P0000aM0B\0200000Y2 +0B801P0000Y30@@0100000X`0@H0m_l0008`0@H0m_l0008d0B`0e_l0009N0Bd0n_l000930@@0 +100000Y20B801P0000aM0B\01`0000``0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0 +008d0Bh0g?l0009O0B<0100000YO0B<0100000YP0AX02P0000YQ0@H01P0000Xl0B<0100000YR +0@@01P0000@e0@X0m_l0009S0@@0n?l0009T0@@0n_l0009U0@@0o?l0009V0@@0o_l0008l0B<0 +100000YQ0@H01P0000YP0AX01`0000aW0@@0100000X`0@H0o?l0008`0@H0o?l0008`0@H0o?l0 +008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008` +0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0 +o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0 +009X0@@01P0000AW0@@0100000YY0BD01P0000YZ0@@0100000Y[0@X01P0000AZ0@@0100000YY +0BD01P0000Ya0G80~41W816`00~31W<1KP00~31W@18@00~31WD11P00~31WH11000~31WL13000 +~31WP12P00~31WT12000~31WX12000~31W\10P00~31W`11P00~31Wd11P00~31Wh10P00~31Wl1 +1000~31X017P00~31X411P00~31X812P00~31W01N@2Z0>L806l1N02_0>L806h18@3m0>L806d1 +8@030NL806`1M`0I0NL80:81NP06~32Z<12P04~32S\1N`3no`000Z@12P06~31:<12P04~32Z81 +NP07~33:D1PP08~32ZH1NP06~32T01O004~32ZL1103no`000ZP1N`07~31401O004~32ZH1NP06 +~32ZD1PP06~33:T1Q004~32TP1103no`000ZT1Q006~334X1Q`06~32ZX1Q@04~32Z\11007~3 +1:X1Q@06~334X1Q`06~32U<1Q`06~32Z`1Q@04~32Zd11007~31:`1Q@06~335<1Q`06~32T01 +O006~32Zh1Q@04~32TP1103jo`000Zl11P3lo`000Zh1Q@06~33401O007~33;01Q@04~32U`1 +1P3lo`000[01Q@06~33;41R008~32ZH1NP06~32T01O004~32[811006~31;<1103lo`000[@1 +103no`000T01O004~32ZH1NP07~33;41R008~32[D1R@0:~32[H13006~32[L11004~32[P1303l +o`000[T12P06~313D12P01~31;L11004~32[H13006~32[D1R@0:~32[X1100:~32[\11008~3 +2[`1NP06~32[d1Q`04~32[h11007~31;@1103no`000[l11006~31;d1Q`04~32[`1NP06~32[\1 +1008~32[X1100:~32\41RP04~32\81103fo`000\<11P3ho`000\@11P3lo`000\41RP07~33<D1 +Q00:~32T<11008~32Sh1NP06~32\H1Q@04~32\H1Q@07~333h1NP06~32T<11008~32\D1Q006 +~33:D1PP08~32ZH1NP06~32T01O004~32ZL1103no`000\L1N`07~31401O004~32ZH1NP06~3 +2ZD1PP06~33<P1NP04~32\T1R`3Zo`000\X11P3lo`000\\11007~31<P1NP06~33<`11008~3 +2\d1S006~32\h1NP04~32TP10P3eo`000\l1N`3fo`000]01N`3ho`000]412P3jo`000]811007 +~31=<1N`3lo`000ZL1103no`000]@1N`06~31<h1NP04~32\d1S006~32\`11008~32TD1N`08 +~32TH11006~32TT1Q004~32]D11P3fo`000]H10P3ko`000]L1103lo`000]P1N`3no`000Y<1 +N`07~314T1Q006~334H11006~32TD1N`08~32\d1S008~32Sd1Q006~32]T1PP04~32\h1N`3\ +o`000\`1103^o`000]H10P3ao`000[81103bo`000ZL1103do`000]P1N`3fo`000]X1N`3ho`00 +0]L1103jo`000SP11P3lo`000Y<1S`3Zo@000]T1PP06~333d1Q007~33<d1S008~32]\1T00: +~32]`11008~32TD1NP06~32TH11004~32\811006~314H11004~32TD1NP07~33=`11008~32]\1 +T00:~32]T1PP08~32]d1S006~32Sd1Q004~32TP1103no`000Sd1Q007~33=d1S006~33=T1PP08 +~32]h1NP06~32]l1O004~32]l1O006~33=h1NP07~33>011006~32^41NP04~32\811002~31>41 +NP01~33>011006~32^81NP06~32^<1NP04~32^@1103lo`000^D1103no`000\811006~31><1 +NP07~33>81NP06~32^H11008~32^81NP06~32^<1NP04~32\811002~31><1NP01~33>81NP06 +~33>H11008~32^H11008~32^81NP06~32^<1NP04~32^@1103lo`000^D1103no`000\811006 +~31><1NP07~33>81NP06~32^H11008~32^011006~32^41NP04~32^L1103no`000\811006~3 +1>41NP07~33>011006~32^P1NP06~32^41NP04~32^L1103no`000\811006~31>41NP07~33>P1 +NP06~32^P1NP06~32^41NP04~32SD11006~31>41NP07~33>P1NP06~32\X11P04~32^T11P3T +o`000^X11P3Xo`000^\11P3\o`000^`11P3`o`000^d11P3do`000^h1103ho`000^l1103jo`00 +0_01103lo`000_41103no`000_811007~31?<11006~31<X11P04~32_@1T@1D>^L80>41NP04 +~32_D12P3no`000U01N`07~31>41NP06~33>41N`04~32^L1103no`000_H1N`07~31>41N`06 +~33741S@00~31W81O@00~31W<1P`00~31W@1QP00~31WD11P00~31WH11000~31WL13000~31WP1 +2P00~31WT12000~31WX12000~31W\10P00~31W`11P00~31Wd11P00~31Wh10P00~31Wl11000 +~31X01P000~31X411P00~31X812P00~31\01R`00~31g01b`125NL80?L1bP175NL800@2c@08 +~32PD2c006~32PH2c004~32PL2cP2\o`000PP22P3^o`000PT2c`3`o`000PX2d03fo`000PH2 +c006~330D2c007~330@2c@08~32P\2c004~32P`21006~310\2c004~32T\1d@04~32Ph2e`3L +o@000\81103jo`000Pl22P3lo`000Q022P07~313P12P3no`000S@1f03jo@000T\1d@06~33401 +d@04~32X@1e007~31401d@06~33481d@06~32Q421004~32X@1e007~311421004~32T81d@06 +~338<1c004~32X<1c004~32P@2c@06~32Q82c004~32PL2f@2do`000PX2fP3fo`000Q82c006 +~330@2c@07~334\1f`04~32TP1103lo`000Q<2103no`000T\1f`06~331@2c004~32U01c@06 +~311H2c@3^o`000QL2g@3`o`000QP2gP3fo`000Q@2c007~331D2g01d>^L800@2c@0<~32QT2 +c00:~32PT2c008~32PX2c006~32PL2c004~32U01c@3lo`000QX2103no`000PL2c004~32PX2 +c006~32PT2c006~331T2c00:~32P@2c@07~331\2c@08~32Q`21006~32P\2c004~32TP1c@06 +~310\2c004~32Q`21006~32Q\2c@07~33401d@0:~32Y<1c@08~32Qd21P04~32Qh2103jo`00 +0SD11P3lo`000Qd21P04~32Y<1c@08~32T01d@06~33401d@0:~32Y<1c@08~32Qd21P04~32U01 +c@3no`000Qd21P04~32Y<1c@07~33401d@06~33401d@0:~32Y<1c@08~32Qd21P04~32SP11P3l +o`000Qd21P04~32Y<1c@07~33401d@06~331l2h00@~32R02h00>~32R42h00<~32R82c00:~3 +2R<2c008~32R@2g`06~32RD21004~32RH2c@3bo`000RL2c@3do`000RP2c@3fo`000RT2103h +o`000RX21007~311X2103jo`000R\2103lo`000R`2c@3no`000RD21004~32R@2g`06~32R<2 +c008~32R82c00:~32R42h006~33202h00>~32Ql2h00@~32ZT1d@04~32Rd2hP07~314P1103n +o`000ZT1d@06~33:T1d@04~32TP1103no`000Q<21007~31:T1d@06~331T2c@0<~32PT2c@0: +~32PX2c@08~32PL2c@06~32P@2c004~32Rh22P3jo`000SD1103lo`000U01c@3no`000Rl2c@06 +~31302i02Xo`000P@2c004~32PL2c@07~330X2c@08~32PT2c@0:~32QT2c@0<~32S421P04~3 +2S82i@3No`000S<2c@3no`000\01hP06~313421P04~32\D1d@08~32S@2c006~32TP11004~3 +2SD2c@3lo`000SH2103no`000SL21006~314P11004~32S@2c006~32\D1d@07~33481d@0:~3 +2Y<1c008~32Qd21P04~32SD11P3lo`000Qd21P04~32Y<1c008~32T81d@06~33481d@0:~32Y<1 +c008~32Qd21P04~32_D11P3lo`000Qd21P04~32Y<1c008~32T81d@06~333P21P06~32X<1c@04 +~32Rd2hP06~313X2iP3ho`000TP1103lo`000S\2103no`000X<1c@07~333P21P06~32W81dP00 +~31W@1h@00~31WD11P00~31WH11000~31WL13000~31WP12P00~31WT12000~31WX12000~31W\1 +0P00~31W`11P00~31Wd11P00~31Wh10P00~31Wl11000~31X01e@00~31X411P00~31X812P00 +~31ST2iP00~31l01h`00~31`d2e`00~31c`2:P5ED0006701:`6P8NL802l10@W20AL00@010040 +0@2Q0@49]08E00800@0200400`812G<35@0300400`0109l1KZmK6P42NZmK6Th2<JmK6ZD0T@:n +0:<2`02Z0\40]0;40;H2aP300]D0c`;G0=H2f03F0]T0l0;K0?h2g@010ml03`?P04`3h@1A0nX0 +D`?[05<3k01]0nh0N`?`07h3n@2<0o\0T`?m09L3oP2G0`L1\@<90KD34`7`0a@1o0<S0@D49045 +12H160@W0CT4:05<12X1G`@\0F<4;P5l12l1O0@`0Il4<@6[1381\@@c0KH4>`6h13`1f@@m0MT4 +?P7c13l1o`A90@D5B`4<1D`130E>0Ah5D04i1E41>@EB0D\5D`5J1E@1IPEM0Fh56`6d1F01b`Eo +0M45SP7R1Hl1k`F@0Oh5T@7n1IP14PJJ0AT6V`4O1Yd18@JO0BP6X04^1Z<1<0J]0CH6[P4f1[H1 +B@Jg0GD6^@6I1[X1b@Jk0Nd6`P7o1\X13@O<0AL7c@4T1m41;0OD0F47eP6F1mT1XPOM0L07h07B +1n<1gPOW0O`7k04>2?D1C0Sf0F88m`5h2?P1RPSo0I`81P:^20L2`0P80\083`;F2142h0PB0^h8 +50812AL24PTH0SX96P9N2Ad2H0TU0W89;09o2Bd2TPTd0Z@9=@:j2CH2aPTg0]89>0;N2CT2jPTj +0_09@@;e2D82o@UP0P8:KP8F2W0270Yh0T<:NP992W\2CPYn0U0:O`:02XL2R0Z90Xh:RP:_2Y82 +\PZE0\4:UP;a2YL2m@ZI0_X:]`;n2\X24P_;0QL;c08L2ld28@_>0R\;e@8e2mh2?P_P0Th;h@9B +2n82G0_S0V4;i09V2nT2J0_b0W4;mP9o2oL2[`_i0[\;2P>m2`\3a`\<0mX;3@?X2`h360`H0b@< +6P<Z31\3B``M0dh<90=_32L3OP`X0jh<:@>b32\3]`a90k\<G0?B35h3f0aW0n@<JP?e36`31`e_ +0`d=L0<a3G83=0ek0cH=O0=T3Gd3L@f50g\=QP>O3HL3`0f80nH=]@?\3L\30`k=0a4>c`<G3]03 +7@kB0al>e0<U3]D3:PkG0b`>f@<b3]X3>0kM0cX>h`=23^h3A`k_0gl>3@B53RH4V@hW1:P>:@Ba +3RX4_Ph]1<0>;PC03Rl4e`hb1>d>=0Ca3Sl44@m013<?GP@i3fL4C@mY15<?KPAj3g04RPma19@? +LPBH3gD4VPmn1:<?[@BW3l<4_Po51<`?a`CB3lP4f0o:1=X?c0CP3ld4i@o?1>L?d@C]3m84l`oE +1?D?g`Cj3n<4213U10X@iP@]4>l4<13`15`@7@ER4345NA0c1HP@=@FD43H5X10g1JX@>@F\43\5 +\Q0l1K`@?@G643l5b1111M@@@PGP44<5k1161Nh@A`Gh45850Q5D1@hAE@DP4EH58a5H1BTAF@DY +4E`5AQ5M1F`AH0E_4F45UA5R1ILAI0FM4FD5WA5X1KXAJ@GP4F`5ha5i1@TBN`DE4W`59a9m1BXB +O`D`4X05<1:31DdBQ0Ec4XL5MQ:81I`BR@FN4X\5Y1:<1J@BS`G14Y05ia:C1NXBU@D@4k<55Q?1 +1BdC``Dc4l@5HA?=1F`Cc`Eb4m05MQ?A1HPCfPFA4m\5Va?M1JlCg`G34n85g1?T1NXCiPD75>d5 +6QC^1D0D6@I652d6GA@_1VXD<@Ig5386Pa@d1XDD=PJ;53L6UA@i1YLD>`JT53`6\1@o1[8DB@Jl +54X6nQAX1P0EN`HG5Gd681En1T@EQPI75HL6FAF91YhERPKZ5Hd6kaFD1Q\FU@H[5YH6=AJH1T4F +VPI75Y\6J1JM1V\F^`Ia5\86P1K:1Y@Fb`JV5]86jaKJ1STGhPJ?5n<6iAOU1_@Gk0HP6>h6:1Sf +1S0Hn0Hh6007@1P11fPH0PN@60<7^1P51m`H1`OT60X7k1PX1o0H=0Ol63D7o1Pf1aHI=`LW6CP7 +9aTi1c@I@@M16DT7EaU:1eLID@Ma6F47LAU[1j<IK0NS6Fd7_AU^1kdIK`OC6G07daUa1ndILPO] +6GT71aYj1`LJN`LM6W`77AYm1cLJOPLg6XD7DAZ61e4JQ`M[6XP7JaZ:1hDJR`N;6X`7SQZZ1i0J +`0NT6\47[Q[21kDJb@O46\\7c1[<1m`Jc@OL6\h71Q_?1`HKd0Le6m87BA_C1ePKe0MW6mD7MQ_G +1i@Kf0NI6mT7Xa_J1jdKf`Nf6oT7_1\22<`K10Sd6`\881`=22@L3`Qn7108b1`A21HM60QK7B48 +I1dY2;DM=0P77SL84Ahj26<N>`Re7Sl8]ai820TOD0QQ7eX8^AmL2<XOH0SH7f48=R1V23PPL@R> +87D8WB1o2?TPP0Q78H48UB692><QRPPe8YD8>2:F28HRU`SD8Yl88R>Q27PS_`Qm8lP8RR?9290S +d@RE8m88V2?D2:0SePRW8mL8Yb?I2;XSfPS08md8`b?T2?XSi@P:9>`86RC]21XT0`Tj90D9@B@> +2DTT40U@9149EB@C2E`T50UQ91d9Ib@O2FhT8PUf92<9NB@T2G`T:`Uo92`9PR@]2HHTY`299;<0 +WBBd0:0T]P2X9;T0[RBj0=<T^`3F9;l0f2C100`U`P0A9N005bG]02\UkP0_9Nl0=2G`03@Um`13 +9OP0E2Gj05XUn`1k9Oh0OBGo09lU0@6Z9@81[bDP0KDU:0789BX1cRD\0MPU;P7N9Bl1obDb0@8V +D0479Ul162IQ0AhVHP5<9VX1DRI[0E8VK@5W9WP1MBJ70GLVUP5i9Z<1NbJ[0GdV[`6F9[01d2Ja +0MDVc`7Q9]h1lRKP0OPVh@4V9nT1:bOZ0B\Wk0509o01CBOb0DlWmP5X9oL1XROh0JHW5P:Z9bH2 +`BLX0\LW:@;e9c42oRLb0PPX=08L:3H28RPn0S\X@091:442@BQ50UhXA`:8:4l2RRQA0Y0XDP:@ +:5H2[BQK0]LXG08<:Ed25BUk0Q\YR08^:HX2=2V;0V8YT`9Z:ID2N2VF0X0YV@:2:I\2SbVN0Y`Y +X@:e:J82_BW00\8Ye0;F:MH2gbWN0^DYh0;Z:N82kbWT0P@Zi`8P:^T2GB[[0V<Zk09V:^l2J2[` +0WXZl@:3:_\2Vb[n0Z4Z00?D:P<3eRX50m`Z8`?R:S83lRXd0oHZ=@?n:SL30R\i0a8[?@<T:d03 +>R]20eH[H0=K:gH3K2]h0gX[NP>0:g\3RR^20hd[RP>A:h`3Ub^D0jT[UP>_:iP3bR^J0ll[V`?A +:ih3db^Q0mH[Y0?H:jH3lb^X0oP[Z@?j:j`3o2^b0`h\\`<C;=D36BcP0bd\hP=U;>X3W2c\0j8\ +m0>Y;?D3\bcg0kX\n0?3;?X3mRcn0``]00@C;@448bd316D]30Ah;@h4PbdA18<]4`C?;A@412hE +10d^<`@C;TH49bi712`^B0@a;TT4=Ri:140^D@A:;U<4D2iD17h^G0B1;Uh4QbiW190^JPBN;V\4 +cRi\1=X^M@CL;WH4iRig1>\^O`C_;X44mBj211H_RP@I;hd4:2n>15P_S`AL;i44HBn_16D__0Ai +;kd4OBnn188__`BA;lH4XRo81:P_b@B`;lX4]2o=1;H_cPCH;m04hboA1>P_k`C^;oh40S001@`` +0PDE<0D57S0<1Dh`3@EC<0h5F30?1Ed`40ER<145Ic0C1F``5@E\<1`5TC0N1I\`9`Fo<2X5cC0] +1MD`;`GJ<385iS0e1Nh`=`Ga<3X5oC0n1@Da@@DA<DD56C581BDaC0D^<Dl5>S5C1D<aE0E8<ED5 +CC5L1E8aG@EP<El5UC5P1IhaOPFT<IL5]C6H1KTaV@G9<I\5c36T1M0aXPGA<JH5hS6X1NLaZ@GZ +<J`5k36f1O4a]0Gb<KP51S:o1@Tb`0DC<\458S;31B\ba0D[<\D5B3;81Dhbb@Ee<]45NC;B1GTb +e@FH<]H5b3;N1L`bh0GK<^T5kS;\1OXbk@DK<nl57c?`1BHcl@D[<`l6<C<T1TDc9@ID<bH6FC<W +1Uhc:0IX<bT6LS<`1W`c<PJ4<cD6RS<f1Z\c?PJ^<cl6]3=81[PcB@K2<d\6bS==1]lcC`K]<e46 +mc=D1_XcE@H<=5H65CAP1QXdH@HO=6<6;3AU1S8dI`Hh=6T6ACA[1TddK0IF=706F3Aa1W\dLPJ2 +=7<6QSAl1X\dO`JC=806]SB81[XdR@Jo=8X6a3B;1\TdZ@K?=<<6icC41^`da@Ka=<H6ncC71PDe +cPH?=M065cGC1Qdee0Hn=M`6@CGM1U4egPIG=NL6GSGX1VPej@I`=N\6RCG]1YLek`JQ=O46Y3Gb +1[Hel`Jo=O@6`SGe1\Heo@K9=Oh6cCGo1]4e0@OR=@<7j3D41nhe30Og=@h723H@1`hf4PLD=QT7 +9CHK1bDf7@Lj=Ql7BSHR1eXf9PMM=RT7KCHZ1iTf:`NT=R`7Z3H_1jXf<@O3=S<7aCHd1n`f=PO^ +=Sh7lCHo1o4f@0L5=d@763M>1d0gD0M7=e47E3ME1eHgEPMi=eL7Q3MH1hPgi@J:=e\7TcMS1iPg +IPNN=fL7`3MX1l@gJ@O6=f`7c3M]1nlgKPOc=fl7mCMb1o\gL`LN>7@78SQg1b@hN0L`>847?CR3 +1d<hQPME>8L7G3R81f8hYPM`>;X7PCRl1hDha0NH><H7W3S81jdhb@Nk><d7_CS>1n<hd@O\>>l7 +l3P220Li2PPE>@\86CT<21hi3PP\>A48<STB25<i5@QF>AL8McTI29`i=`RR>Cl8]SU22;Xi@`SQ +>DP8lSU:21TjJ0PM>W48;3Yc230jM@Pk>WP8BcYi24ljU`QA>Z88ICZU26TjYPR;>ZL8\3ZY2;Pj +Z`S0>Z<8`CZ]2=0j[PSD>\`8fS[G2>djfPSa>]`8oC[N218kf0PC>n08:3_Q22`ko`P_>``9@c\? +2DLk40UY>a49SS\C2IHk5@VN>`d9Wc\G2K<k60Vg>cH9_C]02M4k@PWI>d@9hC]62NXkB@We>dX9 +nC]X2OlkLPTC?7@96caf2B<lN0Te?7\9@3al2D@lVPU:?:<9FcbU2EllY`Ua?:X9Ocb[2H<lb@V7 +?>49V3cS2Ldli@WK?>H90CgY2@\mjPTE?N\97cgb2C8mm@Te?OL9FCgk2F4m0`Y]?@D:Ocd62X\m +2@Z=?A8:TSdD2Y@m5PZS?AP:c3dK2]@m7@[_?Ah:13hQ2PHn90X;?R\:33h\2Qhn;@XQ?Rl:=Sh` +2TTn<PYO?S<:LShe2XPn?0Z>?Sd:SShn2ZXn@0Zg?T4:jSi22^lnH0[e?VT:2CmZ2Q8oK0XK?fl: +7cm`2T<oLPY6?g<:CCmd2U4oTPYG?i\:JcnM2W@oX0Yh?j4:P3nU2XXoYPZ=?j<:SSnY2Z0oYP2V +?kH0_Cni0=Po^`3S?kh0lSo00?do``0<@<@0943D02Y0g00g@=d0B43Q0510h`1^@>D0Ld3V08E0 +i`28@>X0RT3\09a0kP2V@>l0\d010KI05@7;@1H1d40G0ME0607O@1T1jD0P0O=08P40@B@11T4U +0BM19P4Z@Bh1;D4a0CI1<P5V@C<1Jd4d0Fm1=@5d@Cd1Md4n0GM1?`6@@D41UD530IU1A@6^@DP1 +^T590Km1D074@E81dD5G0MQ1F07M@F01hT5R0O11I07f@FP1oD5Z0@]2NP4A@Wl17D:00DI2T058 +@Yd1FD:P0FM2X@5c@Z<1MD:V0GY2Y`6M@ZX1XD:\0JE2[@76@[01bd:a0Lm2`@7C@]01i4;A0NA2 +d`7c@]D1nD;F0OU2f048@mX15D?K0BM3g@4[@n01;D?Z0C=3k@51@nh1CD?`0Dm3l`5D@oL1LT?i +0GI3nP6G@od1W4?n0J133P:T@aH2\4<M0\Q3;@;:@cP2hD<j0^E3?0;W@cd2o4<n0Pm4CP8EA5L2 +:4AH0S94FP8lA5`2@TAM0TI4H098A682C4Ab0U54P`9UA8@2KDB60W]4R09oA8T2STB:0Y94R`:E +A8h2UdB@0ZA4T@:eA9P2^DBJ0\14W0;AA:D2fTBW0^54Z@;bA;82ndBc0PQ5]@8EAKP28dFj0TQ5 +^`9=AL\2DdGS0VY5l@9dAO<2PTGd0Y15m@:JAOL2\DGi0[e50P?7A@@3cDD=0m]53`?TAA43jDDB +0o=55P?hAAT314HY0`Y6=P<KASL3;4Hh0cA6>P=4AS`3B4Hm0eY6?P=MAT43H4I20fa6A0=`ATH3 +LdIF0gM6H`>:AVD3UTIW0j16J@>VAV\3\4I^0kQ6L0?0AW83b4Id0lY6MP?_AWL3mdJ70oa6T`<C +Ai@38dNF0bY7V0<`AiX3>TNM0d97W`=<Aj83E4NS0ee7\`=SAlP3NTO:0h17b`>DAlh3UTO@0j17 +dP>XAm<3Z4OE0l57e`?;AmX3ddOR0m]7lP?QAaD4mDLG1?Y76@@2B2044DPR11M890@LB2h4CTP_ +14i8>@AgB3\4ODPm18A8?PB@B3l4WTQ11:=8@`BYB4@4[dQ=1;I8CPC0B504`dQB1<]8FPCWB5`4 +jdQN1>i8G`@YBF84:dU\1699KPAVBGH4R4Uh18i9N`BMBG`4`TUo1<A9P0CABH84gdV:1>99S@CZ +BHh434Z@10m:T`@NBY@4@dZG14E:V0AJBYX4IdZK1:9:WPBTBZL4YTZY1:m:ZPBfBZ\4c4Z]1<i: +[`CGB[04gTZa1?A:]0CfB[P434_8119;f`@VBn@4HD_U16e;j0AcBnT4X4_[1;9;n`CCB`<5hd\6 +1NU;1`DEC0T564`;1AY<6`DPC2@5=4`U1Ce<:0E;C2T5F4`[1EY<;PEOC345QT`c1Ha<=0F]C3H5 +\4a61KI<H@G:C6<5cTaU1M5<I`GGC6T5gDa[1N=<K@GYC6l5kdaa1OE<L`GjC7D524eh1@i=N@DJ +CH057df21Ba=Q0DbCHH5=Tf81CY=R`E1CHT5Adf=1EE=S`EHCIL5GTfH1F]=VPEaCI`5MDfN1G]= +X0F;CJP5TDfZ1II=[0FJCJh5X4fc1K5=``FgCM85adgD1M9=ePGHCML5iDgH1O9=fPGjCM\5oDgM +1@M>g`D=C^0574kS1Ai>i@DWC_D5;4h:1T1>2`I5CPd6AdhA1UM>4PILCQ@6GThH1VE>70I\CR06 +LdhQ1WQ>8PIkCR@6ODhU1ZA>;PJWCS06]Dhb1[i>=0K4CS`6aThn1\a>B0KACTX6fdi<1^9>E@KT +CUL6j4iP1_a>HPH2CfX65Dm\1Qi?KPHTCgh6=Tn31T9?Q`IBChP6FDn:1U]?S@IPCi46IDnD1VY? +Y0IfCk06RDnb1YE?]0K1Cl@6aToI1]U?h@KUCn@61E3U1S5@i`HmD>h6D50?1eE@6`MYD1d7MU0O +1ga@80NMD247X50Y1jI@:PN`D2\7aE0\1mY@;@O`D2h7054e1aIA=`LLDCP7854i1bEA>PLYDC\7 +;E4l1c9A?@LfDD07>5521deAA0MLDDL7HU581haAB@N?DE87VE5D1j=AEPNYDET7cE5J1m9A~8 +T@900bl13001~3VP8g0bh10@02~3O0Dh~9d@Da13\10`04~3f@DY13h10P00~30P[l04010P06 +~33@[a04811000~3oPZm0DH11008~32@^b0DX10`00~3^``a0Dd11@0:~3b@`S0E811000~3k0fI +05H11@0<~3nPf;05\10`00~3Q@jd05h11P0>~3T0jY06@10P00~3>@m^06H10P0@~3A0mS06P1 +1000~3Y`nk06`11@0B~3]@n]07410`00~3HQ2d0W@1100D~3L12V0WP10`00~35Q<`0G\11@0F +~391<R0H010`00~3AQBj08<1100H~3E1B\08L10`00~45G41S04501X0~23QES0HX10@0K~3IQDh +08\10@0K~3\QDh~9LAIo0YD10@0N~3MaIi0Y410@0O~3\aHh09810@0O~30ALh09<10@0O~3EaLh +09@10@0O~3[ALh09H10@00~3l1RP0IL10@0T~3laRM0IP10`00~3T1X\0I\12@0V~3VaXQ0J@1 +0@00~3_1_11k\10P0X~3`a^j1jD10@0Y~3>Q`h0:H10@0Y~3T1`h0:L10@0Y~3gQ`h0:P10@0Y +~38adh0:T10@0Y~3OAdh0:X10@0Y~3cadh0:\10@0Y~3:ahh0:`10@0Y~3OAhh0:d10@0Y~3dAhh +0:h10@0Y~3:Alh0:l10@0Y~3PAlh0;010@0Y~3oQlh0;410@0Y~3ER0h0;810@0Y~3`B0h0;<1 +0@0Y~33b4h0;@10@0Y~3GB4h0;D10@0Y~3Zb4h0;H10@0Y~3oB4h0;L10@0Y~3CR8h0;P10@0Y +~3W28h0;T10@0Y~3jR8h0;X10@0Y~3@2<h0;d10P00~3OB<<0Kl10`10~3PB<80MT10P00~3RBB> +0=\11012~3U2B30=l10`00~35bFN0>811@14~38RFC0>L10@00~3]BEB0>P10P16~3_bE80>X1 +0P00~31bKB0>`10`18~33bK:0>l10P00~3hBK90?410`1:~3jBK10?@10P00~3ZRMa0OH1101< +~3^2MS0OX10@00~36bVW0?\10P1>~39BVM0?d10`00~3`RTP0@021P1@~3cBTE0@H20`00~3hRYi +00T21P1B~3jBYb00l21000~3Fb^n01<21`1D~3Hb^f01X20@00~36Bcj0A\2101F~392c_0Al2 +1000~34biB0B<2101H~37Ri70BL20`00~3IBn902X21@1J~3L2mn02l20@00~3kRnf0C02101L +~3nBn[0C@20`00~3Y36=0CL22`1N~3[3650D820`00~3<C>N0DD2201P~3?3>C0Dd20`00~3ccBI +0e023@1R~3gSB:0ed21000~3L3R006421@1T~3N3Qh06H20`00~3l3Rb06T2101V~3oSRT06d2 +0P00~3XSUk06l20P1X~3[CU`07420P00~37CXd07<20`1Z~38cX^07H20P00~3DCZ907P21@1\ +~3G3Yn07d20`00~3fSYE0802101^~3i3Y;08@20`00~3;c^>08L21P1`~3>S^308d20P00~3_C]2 +08l2101b~3b3\g09<20P00~3oc];09D2101d~32Sa009T20P00~3BS`m09\20`1f~3DS`e09h2 +0@00~3Qca^0Yl23@1h~3ScaV0Z`20@00~3mCiR0:d20`1j~4?eL0\081~5Ecm?0;420`1l~3HSm4 +0<T20`00~3YSn40<`21`1n~3]3mf0=<20@00~3:T2<0=@20P20~3;T280=H20@00~3]T1K0ML2 +1`22~3`T1?0@00~64D8g~5Q00001A2=03N0P40~4B4:;0=l20P26~3D4:30>420P00~3dd;A0><2 +0`28~3fd;90>H20@00~3Y4<V0>L20@2:~3Yd<S0>P20P00~3bT=;0>X2102<~3f4<m0>h20@00 +~35D@l0>l20`2>~37d@b0?820@00~3DD@20O<21P2@~3G4Cg0?T21@00~3DdFg0?h21`2B~3HDFY +00D30`00~32TI]00P3102D~34TIU00`30`00~3MdJ500l31@2F~3PDIk01@30`00~3o4IW01L3 +102H~32TMI01\30`00~3HdMn01h3102J~3LDM`02831`00~3hDLa0bT33`2L~3k4LV0cP30@00 +~34T\>0CT30`2N~37D\30C`30@00~384bF03d30`2P~3:db;04031@00~3]T`10DD32P2R~3`Dcf +04l30@00~3]dee0503102T~3_Te^05@30`00~3;4kn05L31P2V~3=dkc~9=Tlf~5Z00003U?<`1M +0`<0~4MTm@0603102Z~3P4m606@30`00~3aTn?06L3102\~3d4n506\30P00~3EE230Fd31P2^ +~3H51h0@40~2T@;h8@40@@0100400P0008TT7A]203`00P0100<0~2YSlb4Wh0<P0300400@01 +0040eP420080e`4@0P<00`3W0hl1~810000@000P20ooooO`0000D0008000@0083ooomo~21P00 +10001P00~2P?ooogl8~20@002000~3o`0000T0008000X0~4ool000X000@000`0~4ooooo`d0 +00@0~33`002000~240002P00~23P001P00~2:0000@00~230000@004`00~3o`0000L000P0~3 +2`002000~2:`002P00~26P00FP000P0J~2;`000P0E~20P040P0N~2L0000@0J~2D@000P0E~2 +0P047P0N~240003@0E~20P04200E~20P048@0N~21P005`0E~20P046`0E~20P040P0E~20P04 +6`0E~20P048`0E~20P046P0J~21@000P0J~22@000P0E~20P048@0E~20P041P0E~20P04100J +~280000P0J~21@000P0J~280000P0S~41@@08`00~36P0S~5100S~50@0S~50@0S~50P0S~50@0S +~50@0S~51P0S~51P0S~5100S~5100S~50@0S~56P0S~50@0S~50@0S~50@0S~51P0S~52P0S~5 +0@0S~50@0S~51P0S~51P0S~50@0S~50P0S~50@0S~57@0S~57@0S~50@0S~50@0S~51P0S~5100J +~50P0S~52P0S~56P0S~5100S~56P0S~5E@0E~20P040@0S~50@0S~4P0@08`00~2P0@08`00~2 +P0@06P00~37P0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S +~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~51P0S~5100J~25000KP0N~21@00700J~2FP00 +KP0J~22P008`0J~21P008`0N~21080800J~30P0401X0044000806P000P80100J~3100<01X0 +01@002<06P00CP008@0J~21@000P0E~20P040P0E~20P040P0E~20P04O@0N~2L000900J~2D@00 +0P0E~20P04P00N~24000<00E~20P04200E~20P04P`0N~21@00>P0E~20P04O@0E~20P04QP0N +~21P00?P0E~20P04NP0E~20P04P`0E~20P04300E~20P04R`0N`04B~2@`0E~20P04S@0N~21080 +C@0J~30P0401X0004200805@000P04100J~280000P0S~41@@08`00~30@0S~50@0S~50@0S~5 +1P0S~50P0S~5O`0S~5O`0S~50@0S~50@0S~50@0S~51P0S~5100J~50P0S~5N`0S~52P0S~5N`0S +~5N`0S~5Y@0E~20P040@0S~50@0S~4P0@08`00~2P0@08`00~2P0@08`00~3100J~5P00S~5N`0S +~5N`0S~5N`0S~5N`0S~5N`0S~5N`0S~5100S~5100S~5100S~5N`0S~50@0S~50@0S~50@0S~5 +100S~50P0S~50P0S~51P0S~50@0S~50@0S~51P0S~5100S~50@0S~5100S~51P0S~51P0S~5100S +~5100S~50@0S~50@0S~5N`0J~26000100J~21@000P0E~20P040P0E~20P040P0J~2@@000P0J +~21@000P0J~22@000P0E~20P04dP0N~2L000D@0J~2D@000P0E~20P04e@0N~24000G@0E~20P04 +200N3@8N~2I`0J~30P0201X0044000806P002@000P0E~20P04dP0J~2D@000P0J~21@000P0J +~22@000P0E~20P04c00E~20P04h@0N~21P00L`0E~20P04h`0N`04B~2N00J~2D@000P0J~28000 +0P0N>@84~2PP0S~41@@08`00~3100S~5100S~4P0@08`00~3100S~5100S~5100S~5c@0S~5c@0S +~5c@0S~5c@0S~5100S~5c@0S~50@0S~50@0S~50@0S~5hP0S~5c@0S~5100S~5100J~50P0S~5 +c@0S~5c@0S~52P0S~5c@0S~5100S~5c@0S~5100S~5c@0S~50@0S~50@0S~5100S~5c@0S~4P0@0 +8`00~32P0S~52P0S~5100S~4P0@08`00~3e00S~5c@0S~5100S~5100J~5e@0S~50@0S~50@0S +~50@0S~50@0S~51P0S~52P0S~50@0S~50@0S~50@0S~51P0S~51P0S~51P0S~50@0S~50@0S~5 +c@0S~50P0S~50@0S~50P0S~5e00S~5e00S~50@0S~50@0S~50P0S~50@0S~5100J~21@000P00 +P`4L~2Q04M~2Q@42~2QP46~2Q`44~2R044~2R@46~2RP46~2R`46~2S046~2S@4<0<1`~4SP44 +~2S`4:~2T042~2T@48~2TP44~2T`4O~2U04O~2U@4:~2UP440<0@~4U`4J~2V042~2V@42~2VP4J +0<06~4V`4J~2V@42~2VP4J0<05~4W04J~2W@4J~2WP5c0<040P0008<1OP00Q05o~2Q@42~2QP46 +~2Q`44~2R044~2R@46~2RP46~2R`46~2S046~2S@4<0<1`~4SP44~2S`4:~2T042~2T@48~2TP44 +~2T`61~2U061~2U@4:~2UP440<0@~4V`5k~2V@42~2VP5k0<05~4U`5k~2V042~2V@42~2VP5k +0<06~4n044~2n@44~2nP44~2n`44~2o044~2o@44~2oP44~2o`44~30P@0`180~3W05k~2W@5k +~2WP6>0<040P0008<1d`00Q07D~2Q@42~2QP46~2Q`44~2R044~2R@46~2RP46~2R`46~2S046 +~2S@4<0<1`~4SP44~2S`4:~2T042~2T@48~2TP44~2T`7F~2U07F~2U@4:~2UP440<0@~4?@84 +~2?P84~2?`84~2@084~2@@84~2@P84~2@`84~2A086~2A@86~2AP86~2A`860<0N~4U`7=~2V042 +~2V@42~2VP7=0<06~4n044~2n@44~2nP44~2n`44~2o044~2o@44~2oP44~2o`44~30P@0`180 +~21DP22P06B@8:00E:0PX01D\22P04C08:00M=0PX0`0@0~20@2[0MH3T@:J0Z02X`:Z0[H2`0;? +0]H2mP;h0_h20@<F0d`3D`=c0gD3N`=n0h`3T`>G0j\3[0>a0kD3jP?[0o031@@?11P47P@P12H4 +;P@c16<4MPAg17`4^0Bn1<04aPC>1=<41@D<1C45<`Di1Fh5O0Fd1Kd5_`G81L\5d@GI1Ml5hPDI +1R46:0H`1SH6X0JU1ZP65`Lb1cd7@0MW1g87M@NL1j87`0O81m87f0ON1o`710P>21D86`PX22\8 +C0SP2189GPUP2G89o@T22Pd:4`XF2Q`:@`Y92U0:E`Z02XP:SPZb2[P:`@[82_4:nP[n2PT;3`\B +2ch;CP]X2hH;[`^k2kd;k`\H32@<:Pa>37D<OPb53:h<]`bk3<T<c`cB3=P<3@dd3CH=?@eT3G\= +iPg\3OX=00h33QL>7`hU3R`><Phj3T0>@Pi73Td>F`iN3Wl>Q@j@3YH>V@ja3\0>l@km3PL?2@l; +3``?4@lc3cT?A0m:3dd?D`mj3hX?VPnS3jL?]@nk3kh?dPoJ3n0?i`o]3oD?nPom3`4@1Q0840X@ +<11L468@L11f47T@SQ2D4:`@\Q384<h@e13^408A214>4B<A:A4_4C4A=a4m4ClAAQ5_4ILAWA6S +4JDAZa6a4K<A^Q7S4@TB3a8E4RXB<18f4SPB?Q944THBCA9f4YhBY1:Z4Z`B\Q:h4[XB`A;Z4Q0C +5Q<T4bXC;A<c4cXCHA=X4f`CLQ>A4kDC^a>m4l<Cg1?R4n@CjQ<753HD@1A655@DFQAM574DMaB5 +58\DUaBN5:@D\QBl5<<DbACF5=TDnQ@05@hE51DG5B0EAaEV5IhE\QGZ5DLFJaIa5WLFOAJ05[<F +jaH15cTGEaN?5jdGiALX630H>1Q06>@Hk1S`6?<HnASl68hJT1ZK6Z4JY1[<6XDKRA^D6kHK_1_3 +6lTKc1\T73XLLQac77hLT1c87=hL5QdS7E\MI1em7KDMcad77Q4N:aiS7WdN]Ajg7]4N2AlY7f4O +PAni7l0ObQoA7mPOoQlf83PPER2>89HPWB318?TP3b578EdQUB6[8N<QoB4e8SPRCR:68Y`Re2;Z +8R8S@2=h8gdSPB>78hXSYb?38lXSnR=194TTD2AL96LTKRAf98HTRBBD99XTWBB^9=PTgb@<9A4U +5bDR9BPU:bEJ9GdUZRF_9KDU_bG59LPUcRGN9@8V1bH?9QDV62HN9RDVC2I?9U8VIbIY9VhVMBIg +9WTVNbIm9YHVWBK@9]DVhBKY9^lVlRKh9_lV9RLY9b\W@2M29dHWBbM=9dlWJ2M_9j8WYRNZ9kPW +_RO19lLWcROe9o\WoRLR:3\X@BQ7:4TXCbQE:5LXGRR8:8XXT2RF:9PXWRRT::HX[BSG:=hX32TE +:A\Y9BT[:BhY=2Tk:F8YJ2UZ:G0YN2V2:IHYW2Ve:KdY`RW=:M<YeRWJ:MlYhRWU:NlY82XW:UdZ +HbYX:XHZQbZK:Z4ZZ2[A:]@ZeR[L:^8ZjB[_:_8ZmRX2:a8[92\^:c@[=B\j:e0[DB]F:e\[Hb]Y +:f`[LR]j:gd[P2^A:iL[ZB^_:lX[cb_C:mH[f2_c:oP[o2_o:`0\3R`C;1T\92`Z;2d\=2aU;6`\ +W2bR;:H\ZBbj;=0\gBcZ;>l\lBcf;?h\0Bd<;A<]:Bdi;DT]FBeN;F0]IBe];G0]N2gF;@@^3BhC +;Qh^92hW;U0^Ebin;X4^QbjU;\h^g2k_;_D^6BlO;bP_;bmH;f4_IBm`;gH_NBnX;kH_hboX;nh_ +nBoo;`8`430E<1\`7S0U<4h`US2K<9l`_c36<<d`eC3P<>H`kS3g<?d`1C4;<A4a6C4O<BDa;S4d +<CXa@c5W<IDaWS6T<J`a\S6e<Lhad37A<MHahS7W<NXak37_<O4alS7g<@HbCS9i<XPbV3;<<]\b +jS;^<_@bnS8O<b\c<C<l<d8cAC>:<jhc^3?U<nLckC?g<oXc6S@b=3PdCCAH=88dR3B;=9<d^SC9 +=<ldgSCT=>Ld7CE1=EheScFA=ILeXCFT=LTej3Gg=@hf53H[=S4f>SI:=TdfDcIJ=UdfKCJZ=\<f +aCK^=_4f2cLA=aPg@3M7=eHgQ3N:=i<gWSO6=l`gmCOk=b@h?CQ3>5DhHSQ`>7PhOSR1>8DhTSRC +>9PhW3R]>;dhiSSW>>`hl3Sn>0@i1cTb>EHiW3VR>Jdi\cVf>KXilST7>QTj7CXS>RTj;3X`>S\j +?cY1>T8jBcY?>U4jG3YR>VDjJCYg>X<jR3ZJ>ZLj[CZh>[hj`3[1>\Pjd3[D>]Xji3[Z>^djlC[m +>PTk3S\@>a8k4c\H>b4k:3\\>blk>S]0>d<kAc]E>f4kIS]h>hDkRc^F>i`kWS^O>j@kZc^c>kLk +_C_8>lhkdC_Q>nXkkS_`>o4kmC_i>olk2S`@?1<l8c`e?3Tl>c`l?40lA3a:?58lF3aK?5llLCae +?7LlN3ao?8<lQcb??9DlV3bO?<dldccE?=\l2cde?D4mCCeI?F4mIce]?GPmNSeo?HdmScfB?I@m +Z3fd?L0mc3gD?NPmjSg_?@Hn23h;?[hnjSk_?_Dn03l6?`To7cm6?e4oEcmR?fPoJcm_?g@oN3n: +?hhoTSnN?j0oYSnd?kXo_CoO?n<olSoi?odo340T@2Y0;T0d@3M0D41F@6A0K41c@8Y0TD2H@9Y0 +W42Q@:I0Zd2_@;50\d2f@<90b43;@0I12T4]@CI1?D5V@GM1VD6P@Ji1\D6b@KY1dD7H@Me1hT7f +@Oe12d8A@QA26T8M@TI2B49@@UI2FD9L@V12ID9W@VY2MD9j@Ye2Wd:Q@ZE2bd;?@]=2fd;Q@^A2 +jT;c@_U25D<P@bM3:D<[@be3<d<f@cY3?d=1@dA3Cd=D@eY3LT=f@ia3X4>T@jM3[D>`@km3a4?6 +@lQ3bT?H@mi3hD?U@nM33d@EA1m49D@XA494A4A6A4Q4C4AAA5a4HTAUA7m4UdBTA<14dDCDA=E4 +fTCQA?94mDCfA?]48dE8ADe5DdEQAFM5JTEjAH95]dFmALM5cDGKAMm5i4GYAOQ5ndD4APY64THH +AQ]6B4IPAW16LdIgAX56QdJ:AYI6YTJ`A[I6^4K0A\Q6bTKEA]e6j4KZA^m6mdKlAPY744LCAc17 +>TM0Ad97C4MDAee7HdMaAgM7NTN0AiI7X4NVAjQ7bdOCAm]7hDO\Ao97mDL2B1M874PSB4i8I4Qg +B7e8Q4RYB;I8bdSWB>]8mDPYBB]9CDU@BF99ITV8BHi9WDW4BMm9hTWZB@m:7TY5BVi:XTZTBZI: +[d[>B]M:mT[nBP5;34\BBae;8d\VBbe;HD]cBm=;jD\HC1Y<84`[C35<=4`mC41<A4a9C4]<CTaJ +C5m<QTb<C;1<]Tc1C<M<bTc>C=5<edcMC>=<jDc_C?E<04d8C@i=<TdjCD5=Ade:CE1=EDeHCEi= +LDekCH]=TDfFCJ1=[TfaCKM=_Tg4CLM=f4gjC@e>6ThLCQi>9dh\CSM>?Di0CTM>BTi@CUM>GTiU +CVa>LdihCWe>Ydj]C[E>_Tk4C\I>c4kAC]M>fdkRC^A>j4klCP9?5DlNCbA?=TliCcm?@Tm6Cd]? +DTmDCe]?H4mUCfY?MTn0ChI?RDnECjM?[dnjCka?`Do6Cm1?eToICn]?kDocCoi?0505D3e@D51E +D61@IU1YD7a@X52SD:I@754hDDeAHU6IDJUAcE7BD@00~:GemSK6EQKWE`05mOHfQUHf]^MFa\ +05mOM6EbKFU^HGAU05mOLVEcM6mbIGYULVl0Gf5RKg9d04A7DTmED400Gem=CDm4AD`0GfE^HfmT +I@1OJFiYM6UQK6UjI@1OKg1UKUmYL5mVJFaU05m_L6E^Gfm`GfIYK6D0Gg=UM5mUKV=OM69\05mc +IGAOIVmbKF5d05mcIGAOJ6AbGfIYK6EOLg1UH`1OLfEdGfU`GfIYK6EcL6ES05mcIGAOKFmTI@1O +LfEdGg9UHfmbI5m\IFh0Gg=UM5mcL6aYM5mcJGYU05mcIGAOM6U]IG=dHFe`05mcM65bM5m^IGQd +Gfm`GfIYK6D0GgAULVeYKV5dI@1OMG=QIfEOIG9bKg80GfE^Hem\JFiU05mgLUmXIF5TIG9c05m] +HFU^05mQK6a_Hf5dIEmRMFIVIG80GfAYLg1\HGUOHfm]KFE^M01OIUmSK6mcI@1OIfEdHemVKg9] +HG@0GfMUM6=OKFmTI@1OIfEdHembIF=\IFh0GfMUM6=OM6U]IG=dHFe`05mXIF5TIG9OM7U`I@1O +JFiYM5mSLV<c<UmdHF9\I@1OK6m_JgE`Gf]UN@1OKF5[IEmdJFeU05m_L6E^Gfa_IemVJFaU05m` +HG9cIEmXIF5TIG80Gg1QLW=OM6U]I@1OL65bLemhK7AOM69\05mbI5mUKV=OM69\05mbI5mhK7AO +M69\05mcIGAOI6ESGgARK01OLfEdGgQ\M5mdHV`0Gg=XKgMOIVU\IEmSKfidIGQd05mfLgAbHfQb +05mfLgAbJF=]L01OMW=dLViSKG00GgIcM79^JF=]L01OMW=dLW9SJ780GgIcM79bLgAb05mfLgAb +LgAb05mfMUmdJFeULgAQKG00GgIcM79TMG00GgIcM79dLWMc05mQL71\NEmTIFIQMFadL`1OHfm^ +IVUbKEmiIG=^K`1OIGQQKFU^IEmVJFaU05mUN71\HFU^GfEbLVmb05mVGfm`IFiOJFh0GfIOKg1U +KUm_MG@0GfIYK6EOIGQYLgAc05mVKg9SIEmVJFaUGfEhM01OJG=OHEmVJFaU05m\IFMQK5mVJFaU +Lg1UH`1OKF5[IEmVJFaUGg=`IF<0Gg1bKfe`M5mVKg9OLgAbJFiW05mbIF5TGf9iM6Ec05mbIF5T +GfaYKVD0Gg9UHFAOLVESKg9T05mcHf5^Gf=]I5m\JFiU05mcIGAOIWAYKFD0Gg=UM5m`JG1UGfe_ +I6D0Gg=`K6UdGfIYK6EOLg1UH`1OM7YOKfIVLfEd05meLfEbGfeULg=QIfD0GgIfGfEhJG@0GgMb +JGAUGf9iM6Ec05mgLVUdIEmbIF=_LV@0Gf5dIGQYM01OGfA_LemWIGAVJFaUHGAdLP1OGfA_Lemc +IGAVJFaUHGAdLP1OGfA_LemWIGATLVUfI@1OGfA_LemcIGATLVUfI@1OGdA?DeA9CDEDCeD0GfEh +JG@0GemUN6Ud05mOHfEhJG@0GemSGfEhJG@0GfMUM6AQM6D0GfMUM7AYKFD0CUm<A4UF@01<A4UF +@016Gda4BEI004iOC5E4BEI004IOC5E4BEI004aEA4UF@01>Gda=CdA004IOC4e?A400C4e?A400 +CUm<EDe?A400C5E=CdA004IOC5E=CdA004iOC5Q<DdQ004aHC5=8@016GdaHC5=8@01>GdaHEE9C +B400C5QEDU=8@016GdaHEE9CB400Gem9CdEBDTmB05mOA4mCAE9BCe80GfUcHGAdN@1OGda?CTMD +Cd40GemEE4m105m\LfEUJ`1OGde;CT5=A@1OGeA=D4i1C@1>GdaHCEE<@01>Ge=3Ce1I@01OGg9U +HF@0GemcHf5^KVEb05mOLf=QKWA_K01OLfEdI65dI@1OLfEdM6U]I@1OLfEdIWAYKFD0GemcIGAe +L6U_05mcM6U]I@1OM6U]I@1OM6E\K01OM6m\KgMULP1OM6meL71ULP1OMFi\JFi[05mOEU1BBDiD +AE80GemcM71SL7T0GemOHW9[05mOGg=RLV\0Gf9bJ`1OLf9bJ`1OJFmSM6`0GfIbIFD0GfeQK6a_ +H`1OLVEQK6a_H`1OGe95@Da3EU@0GemcHf5^M6mT05mOLf=QKW9cK7@0GemcHf5^L6m`04iOCeI5 +DTI<CeM004IOCeI5DTI<CeM004mFAE96C4mG@01OHF=SIG=c05mQM6m\05mQM6mY05mOHfQ]Kf@0 +Gf=\Kg=U05mOHfa_LfD0GfM]M6U]I@1OK6mSHFadJFeU05mQLf=dJFeU05mSM6U]I@1OKF]dJFeU +05mcM79VM6U]I@1OIFmV05mVHfa_LfD0GfIVK7EcJ01OIVMUM7<0GfI\MG=XHFa\05mOCe15CTI@ +05mOAdEDAU00GfI_L6E^05mVL79YKWAV05mVLVEQI01OIW=UIF\0GfIdIFa\05mOIWE\K71QM6P0 +GfIgLVUdI@1OGfIWIGAS05mVIfEdH`1OGdiVIfEdH`1OIVMUM6=XHG80GemWIGATHgMT05mWIGAU +KWH0GfeUKF=`N@1OLfEdKFE]05m]IFecIG@0Gfe_MVeUK@1OKFE]KFmfI@1OKg1UKP1OGfm`IFh0 +Gg1ULW9_LP1OGfI`MGAS05mVL7EdH`1OIW1eM6=XHG80Gem6D5EDCP1OL7EdIFif05mOGg9UHF@0 +Gg=UM6e_I6D0Gg=UM7IRMFH0Gg=`LVU^M6H0GgIcL79YKWAV05mcLf=QKVH0GgIcLf=QKVH0Gg=d +HG@0Gg=dLV=QM01OLgAbHfe`05mcM79SL7T0Gg=dLVAeL01OGg=dLVEbLVmb05mcM79ULW9_LP1O +LgAbK6E^05mcM79^Hf5d05mcM79^Hg1i05mcM79`HW9[05mTKg=dKgE^JGP0GgE^JGQdKfA_L`1O +M7YcIG@0Gem9DdACE01OGemgLVUdI@1OGgMbJGAU05mON6ISK6mcI@1OGgQVIVaeLfP0A45D@E=5 +Ad00Gem9KW@`EVESM6mb05mOBFid=5IUHgA_LP1OGdU^M3EFIF=dKg80Gem9KW@fEVESM6mb05mO +@c1QLVMS05mO@c1QLVMf05mO@c1UKWIYLVm^05mOIFifC6iW05mOIFifLfEW05mOIFifDfUjI@1O +Gg1cL01OGfmcMVEbLfU_KP1OGfmcKF5ZKg80GemfIG9cJFm^05mOKg=]JFi_LP1OIG9bKVl0GemC +M65bM5AYKFD0GemOJ6EQL69QLfD0GemOHW9[K7I\05mOJ6EQL69QLfD0GemRLV]\MV`0GemXIF5` +M6m`05m7Gfe_I6EOLgAb05m7GfI]M5mcM780GdMOMWIUJ6Ab05m7GgQ\M6QTLP1OGf5dIGQYM6=^ +M01OGf=dNG1U05mOIGQYM69eIP1OGfEhJGAVKg1UKP1OGfEhJGA_L6E^05mOLgAbIF5]L`1OGfiV +JFaU05mOKg1UKVIT05mOIVe_I6D0Gem^KgAEKF5cJ`1OGfQUHG1\IFh0GemTKg=ULW9^K`1OGfA_ +LdEbLVmbE6mCEP1OGg=dJfaUKP1OGfIYLW=d05mOK65cM01OGg9_MVEb05mOHG9WH`1OGf5bIgH0 +GfE^MVUbKfh0Gg=iLemULW9\JG=d05mcNG=OKVEbLP1OGfe_KWAXA65i05mdNViQKFD0GgAYKFEj +KfiU05mTHGU\JFMXM01OGe9UHFa3MWAFIF=dKg80GemCHf5^E6mTEVESM6mb05m7Gg=`K6UdGg=Y +NVD0GdMOKgIULWMbJGAUGfI\HFL0GdMOKg1`M5m^K`1OAem_L71QLWAOHWUdIG<0GdMOJG1`M5m^ +K`1OAemYL71QLWAOHWUdIG<0GdMOMWIOIVU\I@1OAem_L5mVJFaU05m7GfU`GfIYK6D0GdMOJ6Ab +IUmcL6ES05m7GgA]L5m]LfL0GdMOKg1OHWEVIVEb05m7GfU`Gf9eIVIULP1OAemhK7AOM65RK6D0 +GdMOK6mWGfIYK6D0GdMOIFiSKfAUGgAQHVaU05m7GfAUHfmTIEmdHF9\I@1OAemTIF9eIfMYKVL0 +GdMOLgAQM7Ec05m7Gf=bHc<bGgAQHVaU05mOHGAUN6UdM69\05mOLfEdHG9WMUmO05mOHgIdIV5[ +05mOLfEdIFifL5mO05mO@DQCB4U6E01OGd58BDi3DP1fMVE^HfmTIBiS05IFADi3CdA506ecIem\ +IFiWM6P0MWIUGg9_KfeOKVEUI6ET07IfIEm\JFiUGf9iM6Ec07IfGf9eIVIULP1dKG1OHWEVIVEb +06UTN01UKV=_I6EOLgAQM6D0HWUdIG=OM6mOIFiSKfAU069iM6EcGg9UHF@0HWUdIG=OK6EVM01R +MFIVIG9OLfUjI@1RMFIOL7Ab06U`Gf9eIVIULP1hK7AOIVU\I@1TIFIOIVU\IEm^HFeU06EhGfIY +K6EOJFiVK`1YL5mVJFaU06U`Gg5eHFaYIVUULP1_L5mVJFaU06mfIG9gLVUdIEmVK65W06m`Gg5e +HFaYIVUULP1UKV=_I6EOM65RK6D0IFiSGgARK5m\IFh0IFiSGg5eHFaYIVUULP1cM65dMG<0IFiS +GfIYK6D0IVedGg=dLUmQLW9QN@1UN5mVJFaU06I]M5maMF5\JFIYIG80HfeTGfI_LVeQM01XI79O +IVU\IEmcL6ES06QTLUmaMF5\JFIYIG80M6e`Gg1dLP1VJFaUGfEhM01VJFaUGfiQKFD0KFmTIEmc +M79OHG9bHGT0KFmTIEmaMF5\JFIYIG80HfeTGfe_I6D0LVESGg5eHFaYIVUULP1SKFAOLVESK6E^ +07=`K6UdGg=YNVD0Lg1\JGAOLGEQK6UVJFEb07A]L5mcL6aYM5mcJGYU07AYKFEOLGEQK6UVJFEb +06=]I5mdJFeULgAQKG00Kg1OL65bM5m^K`1^IGQdGfIYK6EOIGQd079UHG=_KP1_L5mRMFIVIG80 +KWE]Gf9iM6Ec06mVIW=UM01S=01S<`1S<P1S<@1`HG9dGfi_065TMUm\JFiU065bIgH0HG9WH`1R +NGAULembIG5T04MOMWIOHFAfIG9d04MOHfeTGfm`IVU\I@17Gf=]I5mYL6IYK6D0AemSKFAaMF5\ +079SLfUT05Q\M5mCM79eHg@0AVU\IEm9KVI_04QUHFAULUmCM79eHg@0DGEQK6UVJFEbGe=dLWES +M019KW@c<P19KW@a=P1EKW=YIfiUI3<b05E^LfUWKVET<CH0EFicJFM^IF@h049iM6D0@Vm_K6EQ +KP1SK6mSJemd07AYKFEOM01gHfQQLUmd071dLVAYIVIOM016BDa506I`Kg=OM01cJGYUGg@0IVU\ +IEmcL6ES06IYK6EOL7Ab071YL6EOIVaQI`1\JFiUGfi_06e_I6D0IVmbKF5d06eQN5mbIF=OK6E^ +06a^IembIF=OK6E^06e_I5mdJFeU069iM6ESKgE^M01SLV<c<P1\IGIUK01VK65WL`1VI01XKfaT +069cJGYU069eIVIULP1SMG9`06UcM6E]L01dKf]UKP1aGg=dLVU^I`1fHFaOKVEUI6ET071bIG=U +KW@0MV5\MFD0J5mcM79YKVL0N6adGfIbKfd0N6adGgA_07Q\M5mdHV`0EUI5CT=?A4D^@`1fMWEd +JFac;V<0EUIEE4U<D`1RMFIOKV5]I@1RMFIOK6E^069iM6EcGg9ULGEYLVET06QTLUmcM79eHg@0 +K6U^IEm`M780IVUUK6AcGg9UHF@0Hfm]KFE^M5mcM79OHWEVIVEb07AQLVMUM5mVJFaU075eHFaO +IVmbKF5d06I_LVeQM5m^K`1aMF5\Gfe_I6D0KFmTIEm^K`1aMF5\Gg9UHfaUKP1bIF=_LVAOK6E^ +075eHFaOM6U]IG=dHFe`06QTLUmQLW9QN@1XI79OKVl0J6AbGfI_MFiT06=]L5m\IFh0Hg9SGgAQ +HVaU06=bHem`KfaiKVm]JF5\06=bHemdHF9\IEmcJGYU0780JP1SHG=UGg=UKW=YM6UfJGAi065\ +K6mgGf5RHW9UMW<0LgAbJFiW06]UNEm\JG=d06a_Kf]OLgAQM7Ec06]UNEm^K`1dK@1dGg=dLWES +M01Y07A_M65\Gg=UHg<0M6mdHFaOI65iL`1\KfMOIVU\I@1\KfMOLGEQK6UVJFEb06AeKFei07AY +KFEOLgAb07A]Gg=dLWESM01dJFeUGgIQK01QLVMc07=eHW=dGf=XHG80N6adGgARK5mcM79eHg@0 +N6adGf9eIVIULP1YM6E]Gg=dLP1YM6E]Gg=dHG9d06UdIFeOK6E^06UdIFeOKWE]06UdIFeOIFiT +06=eLW9OL7Ab079UHFAOLgAQM7Ec079UM5mcM65dMG<0HfQQLW=OLVEQI01UKVAOKfIOK6U^I@1h +K7AOJ6AbGf5bLV5i06=_KFeUKW@0I6ESKfAUGgAQHVaU06AUHemdHVaOK6E^07Q\M5mdHF9\I@1V +JFaUGgAUN7@0IVU\I@1SJ01cM780LgAb<P1cM78a07Db07Da06eQN5mSJ65bL`1\IFiWM6P0LfEQ +LV=XGg=dLP1dJ6UcGgUUHG9OLfESL`1\IF5`GgUUHG9OLfESL`1iIF5bGg=UHg<0I65iLemdJ6Uc +Gfe_KWAX06AQNEmcIF=c07=UHg<0KFU^L`1XKgEbL`1]I65i06e_KWAX07UUHG80M6U]IEmcM79Y +KVL0KVmOHWUdIG<0IFiTGg1dLP1]KfidJ5mTHGUc07A]Gg=UH`1dKEm]JFh0M6eOJ6meLP1dKEm] +I65i07A]Gfe_KP1dKEmiIF5b07A]GgMTHGT0M6eONFAQN@1dKEmYLfAcM01FEUEDBDaC;T<0KG=T +Kg<^H`1=DdA?D`1VMFa\Gg=`IF<0I6EVHGE\M5mUN7@0I6EVHGE\M5m^HFeU071bIF5]HVaU071Q +M6QOL65bM7<0IGQdIFicJFm^06iQKFD0Hfm^IVUbKEmcM780HFicMfEb07=dHG@0LgAQM5mRMFIV +IG80IFm\Gf=_MFid069S06mfIG9gLVUdIEmVJFaUL`1VKg9SIFAOIGQd06IYK6EOJ65^I6aU06QT +LVIOLg1UH`1_L6IOLg1UH`1dKG1VGg=`IF<0M6e`IUmUN7@0M6e`IUm^HFeU071_LgAQKF9\I@1\ +IFh0LVEdMG9^Gf9eIVIULP1RMFIOLfUjI@1]HGQOHWUdIG<0M6E]L01aMF5\Gfm`IVU\I@1aMF5\ +GfU`IVU\I@1aMF5\Gf5bLV5i075OLfE`Gg=dLP1aGfU^M79_Gg=dLP1aHG9WMP1aHG9WH`1dKG1O +LG=dLUm`M780LGIQK7EUGg1dLP1aLfE`Gg1dLP1aGfi_075eHFaOIVmeKV@0HG9WGfi_065bI`1d +KG<0L65dJ5mSKfe`KfiUKWAc07=dHG9dGg1dLP1dKG1OIWE\K5mcL6ES07AXIEmdJFeU07=UM5md +NUmcM780M7YOLgAb06ecIemcM780LgAQM7EcGg=dLP1dKem\KfMVJFaU07A_Gg=dI6EbLP1VJFaU +GgAYKFD0IWAYKFD0IWAc06QQKVA\I@1D@emeM6U]I@1cM5mTIGH0LgAOJFi_07=dGfe_I6D0LgAO +KVaYKV\0LgAOMFUT07=dGfMYI01cM5mbI6Ef07=dGg=YNVD0LgAOHGAYKFD0LgAOKGAYKFD0LgAO +HgAYKFD0IWAOM7=UH`1VM5m]JFh0IWAOJ6meLP1VM5mTHGT0IWAOKFm^M6P0IWAONFEQLP1=DdA? +Dbi3~3 diff --git a/support/vvcode/binaries/os2/vvdecode.boo b/support/vvcode/binaries/os2/vvdecode.boo new file mode 100644 index 0000000000..5a7355637b --- /dev/null +++ b/support/vvcode/binaries/os2/vvdecode.boo @@ -0,0 +1,1775 @@ +VVDECODE.EXE +CE[@00<0~210000?oo~2_P00~5@000~QP00000hO^Ph0]0W=8KP1C<dQE6QYLb1`LVmWLV5]86=Q +KVi_M21RIB1bMFhPJFhPHB14Ce<PLfEcLfU_KRh=3@XT~2C5P0~50P01~30P0@0P006P000040 +~2i8d00080~2D7P0~24000100007@2~63@40~5a0000080~2m0000=04~:a0400=01~:d@4003d2 +~2=0@000<0~2A@@0~5d0@0~A0P00~=1@00~68000~D=4P1~30@0580000@0001D0~6D7P0~30`03 +80005P0000D0~6R`@0~24000R`D0~24000R`H0~24000R`L0~24000R`P0~24000R`T0~24000 +R`X0~24000R`\0~24000R``0~24000R`d0~24000R`h0~24000R`l0~24000Ra00~24000Ra40 +~24000Ra80~24000Ra<0~24000Ra@0~24000RaD0~24000RaH0~24000RaL0~24000RaP00408 +~6R@l10?T0~2nPh10>T1~2hPl10>P2~2Z`d10<<3~2P0`000QfMVAUHfmTI@00~V=P0004@0~2 +J@0007d0~2X`000:<0~2X`000<H0~2:`4004<1~2H0400801~2m`400?L1~2m`400?L1~2m`40 +0?L1~2284V2`86204^3@5L0@R1N`d1h2P10P4X0MP==PhX0@H1:`762`D<>0ag3:X<j@`80GX9 +0CP1205e1P400@P1C`d1<0480A<70@01284d2@7V206M1`6Y0@P1U@L1ZP4X0@81:`7C0?01204U +1@410@R1?`D1KPP1L@D1<04X0@81005P2DD::0450AX1J@_d2f8<=0fN3BP10`4`0B87>PMB1`P1 +j`D1B`480GH90Dh1206O3@5?0@P1S`T1>0480J850GX1:0430@01f0O42>T?205P204@0BP10P4A +0K469@LX0@816@4V2>4>:04;0AX1S@VR2KL93@XR2SL:GPYc2XP:o0X@2`P1FP81I048PDT>0NX8 +0N\40B\1206S0P5j0@P1h0H1OP4X0@81005\0<D0204]004I0@P1K`<1:`48PIL10Ml80NH60B\1 +:0450C01N`2M1El6YP`Z3PP1O@`10@480FT<0A41:8420Mo\2oT>:8420N3H3DH>:0440@41l@0k +0JH2^`88PB\80`H80GX00A41204_004C0@P1a`015`48PG`20MX8PA410NHXP@81j983Q`@XP@81 +jCT4Q@D80F450B`1204_1@4]0@P16@@1<@480JH40CP1:0420G`1R`>012P10P5m0D@4T0D8A4mC +@d5<C5<3CTaC0deCA`00~90@0S0;P20`300P<0~4b0830=020`3H0P<0h083~5k0832@01~20@03 +0?P20`X00@000P0100<9004000400`080`<9004000400`0D0`<9004000400`0T0`<900400040 +0`0\0`<9004000400`0d0`<9004000400`140`<9004000400`180`<9004000400`1@0`<90040 +00400`1H0`<9004000400`1X0`<9004000400`1h0`<9004000400`240`<9004000400`2<0`<9 +004000400`2D0`<E004000400`2P0`<9004000400`2\0`<9004000400`2d0`<E004000405`0T +BF@T~4o0430040~610832@01~20@0301@20`T00@000@0K01`20`01~790830080~6:0832@01 +~20@0?03020`01~7?0832@01~20@0?04`20`02~7F0832@01~20@0306`20`T00@000@0307P2 +0`T00@000@0A08P20`01~7U083004;004000402`01~7X0832@01~20@030:`20`T00@000@3T +0FAUHWEW~3IFiSKfAYKVMOM65RK6D006I_LVeQM000J6E\L000~2K6mW06e_I6D0~3KgIULWMb +JGAU~3LVESKg9TGfaUKVMdJ00007AYKFEcM65]L00007AbHFicK65dJFm^GfIYK6D0~3JFiTIGQO +IVU\I@00L65TGf=XHG9QHgAULP0007EeI6ESKfAU~4N7QTIF=_I6D0~3JFi`MGAOIVU\I@00KgEd +L7EdGfIYK6D0HVU^HG9i~2M6EhM000~2I6EVHGE\M01cM79UHFd006IYN6ET~3MV5bJF5RK6D0 +~3HGAdLV9UIfU^~3HGAdLVE^I01RIFMYKP00069iM6ESKgE^M00006=XHG9QHgAULW=UM000~2 +Hfm]KFE^M01SLV<c<P0006AUHfmTIGIULW=YKfh0~2IFiT06I_LVeQM000KFmTI@00~2Kg1ULV5d +JFiWLgUcM6E]079UHfmbI6aUKVMdJ000~2Lf]YL6IbKfd0~3Lf]YL7A_~2M65RK6D0~2M6U]IG=d +HFe`~3N6ad;FIbKfd0~3N6ad;GA_~2N6ad;G=eHW=dHfQQLP0007Q\M00:E79QKW=\HGAYKfhP +JFiTIGPPIVU\ICX<00408040801^KfiU~42UAbHFicK65dJFm^86U^I6Eh86IYK6Dj30010201 +01L09G<000Y@HG9d82DcI219;e0PIVU\ICXA00408040700UL`00D65bM20U<f@PLgAQLWAc86m^ +86aYKVDj2`0102010>L09FaT~2LVESKg9TGf9eIVIULP00071bIFeQM7EbIB15CdHPIFiSKgE^ +M6EbIF@PMfQYK6DPI6ESKfAYKVL0~3IG9bKg8PLVEQI6U^Ib1UKV=_I6ET86AQM64006U^MV5\ +JF@PHfQQLV5SM6Eb82ET82P`N2D`<UPY86m^86aYKVDP9FaT86mV86IYK6DPH2Ec9`00JFifHFaY +I21UKV=_I6ET869iM6DPHfmeKW@P:2ET:@1ULW9_LR1bIF5TJFiW86E^HfmTIF@PI65dH@00D65b +M20U<f@PIFiTLb1_KR1\JFiU>Pd00@0P0@1K02E\I000H2Ec9b1XIF5TIG8PKfi\NB1QK6a_MfET +86U^85IFAB1VJFaUL`0002EXI01EKVEhL6ESM6ET860ULb0UI2L0051QLW@P9C=T86E^I7<PKfhP +K6U^ICX=00408040I@<UK6@006U^MV5\JF@PJ6EQI6Eb86I_MFiT~49F@PHfQQLV5SM6EbLb1U +N71UHgAUI20]82ET86I_MFiT~3JFifHFaYI21bIF=_LV@PK6E^IgAX879UHfmbI6ET82PUK6@Y +~4HfmeK6A^9g@PLVEQK6a_Hf5dIB0UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb04A5 +@UE7>R00I6ESKfAU>R1bIF5\K6mSHGAUI20UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb +00X0~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P +9G<W~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P +9G<W~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P +9G<W~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P +9G<W~2KF5hJFeeKB1^MFeRIG8PKfHPL65bM7<PLVEQHfQUI20X9F@Y~4ADm686E^HfmeKWAULVET +86m^87=UHG9SJ21`HG=c82ET~3A4E2EDLj801VJFiTGfiUN7AOL65bM3XPADm686E^HfmeKWAU +LVET86m^87=UHG9SJ21`HG=c82ET00X0A4E2EDLj801VJFiTGfiUN7AOL65bM3XP@fm^M6EhM3XP +K6U^IB0UK6@PKfHPIVU\IB1P9G<W00X0~3A4E2EDLj801VJFiTGfiUN7AOL65bM3XPDVEgJFiT +JFiW86IYK6DPH2Ec9`0:~3HfmeK6A^9g@PIVU^I21`HG9d82ET86U^86IYK6DPH2Ec9`00ADm6 +86E^HfmeKWAULVET86m^87=UHG9SJ21`HG=c82ET~3IG9bKg8PLVEQI6U^Ib1VJFaU~2A4E2EDLj +801VJFiTGfiUN7AOL65bM3XP@fmeK6A^9g@PIVU^I21`HG9d82ET86U^86IYK6DPH2Ec9`0:~4 +D65bM20U<f@PLgAQLWAc86m^86aYKVDj2`01020108h09FaT~2IG9bKg8PLVEQI6U^Ib1UKV=_ +I6U^Ib1dHF9\I@00~2I6EVGfIYK6EOKV5]I@0005IFI6ESKfAU82Ec;20ULb1bIFaUHG=U82PU +LbT:~3<2hi=b1RIGAQ~3Ce<_<R0b;WPPBD9=84<PDfEd;c80~3<SDPCVmf834i>C80BBm@86IY +K6Dj6P01020101h09G<0~2CgIULWMbJGAU86EhJG=dJFiW86IYK6Ec>PX00@0P0@0F02Ec~3NFEc +06i_~2C6mW86IYK6Dj6P01020105X09G<0~2EUITIF=_I6DPMVEbLfU_KR0UJ6@^<21_LR1\HGAU +LR1YLg9ULGEYLVET87A_86AUHfmTIB1VJFaU860ULbL:05IFAB1XIF5TIG8PIVU\IB1cL6ES>Ph0 +0@0P0@0\02Ec~3@E=3BDT0~2@E=3BDT0~22UAbHFicK65dJFm^871ULVI_LVeUI3X=00408040 +L`9^KfiU~4M79QKW=\HGAYKfhPIVU\IB1dLV5^LfaQM6Ec86IbKfdPH2Ec9b1dKb1P9G<W~3EUI5 +86IYK6DPHfQQLV5SM6Eb87=UM21YLb1P9G<W~2@E=3BDT0~2M79QKW=\HGAYKfhPIVU\IB1dLV5^ +LfaQM6Ec86IbKfdPH2Ec9b1dKb1P9G<W~3K6mSHF`PHfQQLV5SM6Eb87=UM21YLb1P9G<W045C +@dU9~3@E=3BDT0~2EUI586IYK6DPHfQQLV5SM6Eb87=UM21YLb1P9G<W~2K6mSHF`PHfQQLV5S +M6Eb87=UM21YLb1P9G<W045C@dU9~3BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1_ +L6E^GfU`GfIYK6D0;@00LgATJFh0~2MWIU04A5@UE7>R00Kg1UKUmYL5mVJFaU>R1_L6E^JFiW +86U^L7Ed86IYK6DPH2Ec9`0:06EbLVmb86m`IFiYKVLPJFi`MG@PIVU\IB1P9G<W~3A4E2EDLj +801_L6E^GfU`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X007HU<39T~3Hfme +K6A^9g@PIVU^I21`HG9d82ET86IYK6DPH2Ec9`15KWAULR1VJFaU87=`IF=YIVUSHGAYKfhPIVmb +871QLW@P9F@j8000A4E2EDLj801_L6E^GfU`GfIYK6Dj86m`IFiYKVLPJFi`MG@PIVU\IB1P9G<W +00X0HfmeK6A^9g@PKg1UKR1`HG9d86IYK6DPH2Ec9`00~22U1QLW@P9C=T84T_D21VJFaU>Q40 +0@0P0@3m02Ec~2K6EWHFaOJ6AbIUmcL6ES07IfGfIYK6EOKV5]I@00~2MWIOIVU\IEmUN7@0;@00 +07=dI6meM000A4E2EDLj801_L6E^Gfm`GfIYK6Dj86m`IFiYKVLPKgEdL7Ed86IYK6DPH2Ec9`0: +~4A4E2EDLj801_L6E^Gfm`GfIYK6Dj86m`IFiYKVLPKgEdL7Ed86IYK6DPH2Ec9`0:~4BFidIG9^ +HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1_L6E^Gfm`GfIYK6D0~3IG9bKg8PKg1UKVU^Ib1_ +MGA`MG@PIVU\IB1P9G<W~2Cbm@86IYK6Dj6P01020109419G<0~2A4E2EDLj801_L6E^Gfm`GfIY +K6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X007A]L5m`M7809BYc82EKGPYM~3M6m_ +86eQKWTPHfQQLV5SM6EbLb0X9F@Y86U^86E^HfmTJFiW87AQHVaU~2IG9bKg8PLVEQI6U^Ib1U +KV=_I6U^Ib1dHF9\I@00~2M6m_86eQKWTPHfQQLV5SM6EbLb0X9F@Y86U^86E^HfmTJFiW87AQ +HVaU~2Mg9_KVLPKWE]HVEb86mV86=XHG9QHgAULW<P:2ET:B1YKR1UKV=_I6U^Ib1dHF9\I@00 +06EbLVmb86m`IFiYKVLPM79QKW=\HGAYKfhPJFiTIGPPIVU\IB1P9G<W~3IG9bKg8PLVEQI6U^ +Ib1dLV5^LfaQM6U_KR1YKVAUN21VJFaU~49G<P9G<P9G<0~3IG9bKg8PL65bLfU^Ib0c86E^M79Y +IG<PJFhPM79QKW=\HGAYKfhPJFiTIGPPIVU\I@0004A5@UD0~60@0@0TLj801`LW=OJFAhGfIY +K6Dj82D`=6aT>R16LVm]>R1P9G<W;21DKcXPH2Ec9b`PF4aD;FIYK6Dj860ULbL02P15CdHPIFiS +KgE^M6EbIF@PHVEVKg9U860ULbLPJ6EQI6Eb~2IG9bKg8PLVEQI6U^Ib1VJFaU86QUHFAULW<0 +05IFHfmTIB1XIF5TIG8PH2Ec9b1VKgE^I21gJ6E^85EE;eQHI6ESKfAYKVL0J6EQI6Eb860ULbLP +LVE`IF5dIF@0~3J6EQI6Eb860ULbLPLVE`IF5dIF@0~3IG9bKg8PLVEQI6U^Ib1UKV=_I6U^Ib1d +HF9\I@00~2EUI586QUHFAULR1P9G<W86i_M21iIG@PLgE`L6mbM6ET~3BFidIG9^HF`PIG9bKg8P +I6EdIF=dIF@PJFhP9G<X:@1bI6IYGfQUHFAULW<0~3J6EQI6Eb860ULbLPKVmd87=eL71_LWAU +I21gJ6E^85EE;eQHI6ESKfAYKVL0~39FaT06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1X +IF5TIG8006QUHFAULR1P9G<W86i_M21cMG1`Kg9dIF@PMfQUKR1EEBmHF6AUHfmTJFiW~49Fah +06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG8004AUHfmTJFiW86eUM6Q_I3XC0040 +80406@1EEF=_I6D:~2A6ESKfAYKVLPKFEdJ6mT>Q<00@0P0@0M05QHHfmTI@X0EWH0EP14IF=_ +I6U^Ib1]IGAXKf@j4`01020104P1EUISKfAU2P00M69\06EbLVmb879UHFAYKVLPIFiSKfAYKVLP +M65RK6DPIVU\IB1P9G<W~2I6EVHGE\M21EEF=_I6D0060Q8R<T9BHW:2TZ:b`];Rl`<C8c=3Df +=cPi>S\l?Cho@452@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJFeaMGUl0~3I6EVHGE\M21HF6=_ +I6D002\]<34b<c@e=SLh>D52@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJHF9SI6EVIfQYJV]\KFi_ +L75bLgAeMWMhNGX0~3I6EVHGE\M21FEV=_I6D002\]<34b<c@e=SLh>D52@dA5ATM8BDY;C4e> +Ce1ADU=DEEIGF5UJHF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGX0~32TE^HfmTJFiW87AQHVaU +87=_MG9SICX=00408040700UL`00AFiSKfAYKVLPM65RK6DPHfm^M6E^M7<j2`01020100T09Bhc +<W<0~38`01020107D19Bhc<W<0~3Ce<_<P00~2EUI586IYK6DPHg9UHGAUI21_KR1Q86AYIVIU +LVE^M21_L6EbHGAYKVLPLgUcM6E]>R1P9G<W~2M6QU86meM71eM21VJFaU87MYK6`PHVDPHg9U +HGAUI21eLfU^Ib1dJ6DPI6EVHGE\M21VKg9]HG@0~3Ce<_<P00~2IVmbKF5d860ULbLPJG<PKVmd +87=eL71_LWAUI21RNB1dJ6Uc86U]L6aUKFE^M65dJFm^06meM71eM21VJFaU87MYK6`PHVDPHg9U +HGAUI21eLfU^Ib1dJ6DPI6EVHGE\M21VKg9]HG@0~3IVmbKF5d860ULbLPJG<PKVmd87=eL71_ +LWAUI21RNB1dJ6Uc86U]L6aUKFE^M65dJFm^06meM71eM21VJFaU87MYK6`PHVDPHg9UHGAUI21e +LfU^Ib1dJ6DPI6EVHGE\M21VKg9]HG@0~3Cbm@86IYK6DPIVmbKF5d>Q<00@0P0@2002Ec~3JFAh +05IFGdU>A4EHGdI9C4D0~2EUIOBDi4AEQOATU<A@0007If;GQ\M2iYI7P007If;GQ\M2iYI7P0 +07If;GQ\M2iYI7P006U^MV5\JF@PIVU\IB1UKV=_I6U^Ib1]KfAU87=UM20X9F@Y00Y?;e0PIVU\ +IB1]KfAU>QD00@0P0@2?02Ec~2A4E2EDLj801`HF@PHfQQLV5SM6Eb86i_M21cL6ESJFIYIF@P +KfhPM6QU86=_KFeQKV@PK6U^I@0:02ET~4L65T86=XHG9QHgAULR1fHFaeIB1]MG=d869U86U^ +87AXIB1bHFiWIB0`;C8e=@00Cbm@86IYK6DPL65TI6U^Ib1SJ65bHF=dIG8j200102010:`09F@P +:31h9C0bN2T006U^MV5\JF@PKF5hJFeeKB1VJGQUI21bIF=_LV@PK6E^IgAX87=UM20X9FaT:@00 +06U^MV5\JF@PKF5hJFeeKB1fHG9YHF9\IB1bIF=_LV@PK6E^IgAX87=UM20X9FaT:@00~2Cbm@ +86IYK6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820UK6@004l_D21VJFaU87AYKFEcM65]L3X@ +004080405`0UL`0000YDKgAQK21RNGAULb1bIF5T>Q800@0P0@0I02E\I01DKgAQK219;e0PL65b +M7<PLVEQI3X>004080406@0UI00005A_M65\869iM6Ec87MbJGAdIFhj3`01020101d09FaT85]? +Bed0E6mdHF`PHWUdIG<PMg9YM7AUKSX?00408040N@0UK6@006aQLg@PLVESKg9T87MQLb1`HFAT +IF@PMfUdJ21fHFaeIB0UI20X<7PU<39h:@0006IYK6DPLfUjIB1TKfEc86i_M21]HGASJ21dJ65d +879UHfmbI6ET85\UK6AM~4E6mdHF`PHWUdIG<PMg9YM7AUKSX?00408040700UK6@PFfi_M21b +IF=_LVAUI5d0~2@e93;C<b>Q`00@0P0@0D02D`>6ah85]?Bed0~2@e93;C<b>Q`00@0P0@0l02D` +>6ah~4@e93;C<b86A_IG<PKVmd86eQM6=X87AXHG@PLVESKg9TIF@PFbD`>6ahG@13DT<]<c8j +7001020105T39C0hK7PPFfi_M21bIF=_LVAUI5d02UIFI6ESKfAU82Ec;20ULb1bIFaUHG=U82PU +LbT:2P0`;STg869UM640~2Ce<_<R0b;WPPBD9=84<PDfEd;c80~3<SDPCVmf834i>C80EUITIF=_ +I6Dj82Ec2PX005EcHFMU>R1FEVAUHfmTIB0PFg5eHFaYIVUULW=M821YKW1eM5mVJFaU821KKgEd +L7EdGfIYK6EM2PX0020PEV5\JF@PLGEQK6UVJFEbLb1QLVDj2PX0~2820U;S5c9G<:02l]~4820U +;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj;@0P82D^<G<ULbD^<G=VJFaU;FI_LVeQM20P:6I_ +LVeQM7<PLgE`L6mbM6ET>R0ULbEc9G<ULbEc9G<ULbT:02l]~4?CX]~38000~3820U;S5c9G<: +02l]~4820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj;@0P82D^<G<ULe\U;S5cIVU\IBec +L6ESG@X0;bd0?CX]020P9BhaLbEc9BhaLfIYK6D]IFiSKfAYKVL]KFmTIB0P:6e_I6Ec87=eL71_ +LWAUI3XPHVU^HG9i87AUN7@Y2P0_;@00?CX]020P9BhaLbEc2P0_;@00~2820U;S5c9G<U;S5c +I6ESJFeQK2eSJ65b;GIQK7EU2P0_;@00?CX]020P9BhaLbEc9BhaLf9iM6Ec2P0_;@0003dj;@0P +82D^<G<ULe\U;S5cM6U]IEd:02l]~2?CX]020P9BhaLbEc9BhaLfIYK6D]Lg1UH`X0;bd0~2?CX] +020P9BhaLbEc2P0_;@00~2820U;S5c9G<:2P0_;@0007E^HF9\IB1dKb1QK6a_Hf5dIB0UK6@P +HWUdIG<PIVmb869eIVIULR1PAemdKG1OKG=W9`14AD9EAcXP06eQJFhj865\K6mSHGAUI20UK6@P +HWUdIG<PIVmb869eIVIULR1PAemdKG1OKG=W9`0:~2AemYL5mRMFIVIG80Aem_L5mRMFIVIG80 +;bd003dj;@1XIFa`879ULGEULgAUI000JFi`MG@PIVU\IB1]MG=d869U87=`IF=YIVUUI000~2 +94UT90P00@000@1:02DZLb0UJ6@P9E]N2Ud0~2IG9bKg8PL65bLfU^Ib1P9G<W86QUHFAULR1f +HFaeI@11Dd=9B@0005IFAB1SJ65bHF=dIG8PLfEd>Q400@0P0@1c06i_M21bIF=_LVAUI01FETDP +IVU\IB1SJ65bHF=dIG8PLfEd87MQLb1^Kg@PLVESKg9TIF@0K6mSHF`PHfQQLV5SM6Eb87=UM21P +9G<W865cLgE]IF@0~3@E=3BDT0~2EUI586=XHG9QHgAULR1cIG@j4@01020102009G<0~2EUI5 +86eYKVU]MFdPI6ESKfAU87IULW=YKfhj2001020105@0KVmd879UHfmbI6ET02EXI015LW9_LR1` +HG9cJFiW860ULbLPJ6EQI6Eb87IQK7EU>R1P9G<W~3EUI586eYKVU]MFdPI6ESKfAU87IULW=Y +Kfhj2001020101009F@^<01FETDPIVmbKF5d>QP00@0P0@0H06i_M21bIF=_LVAUI01FETDPIVmb +KF5d>QP00@0P0@0_02Ec~3JFifHFaYI21P9G<W86QUHFAULR1fHFaeICXPH2Ec9`0:EUI586e_ +I6Dj6P01020101X0KVmd879UHfmbI6ET~42UIFAB1]KfAU>QX00@0P0@1102Ec~2JFifHFaYI21P +9G<W86QUHFAULR1fHFaeICXPH2Ec9`1?Dblb~4EUI586m`IG9QM6U^Ib1cNG=dIFdj3P010201 +07X0KVmd879UHfmbI6ET05IFAB1VJFaU86m`IG9QM6U^Ib1cNG=dIFdPMf5c86i_M21bIF=_LVAU +I000K6mSHF`PKg1ULV5dJFiW87=iLgAUKB1P9G<W865cLgE]IF@0Ce<_<P00~2EUI586m`IG9Q +M6U^Ib1cNG=dIFdj3P01020100d09G<0~2EUI586a_KVM^JFiW87@10180IG=d879UHfmbI21\ +IFiWM6Pj2@01020102L0KVmd879UHfmbI6ET05IFAB1]HGQYKGE]879UHfmbI21\IFiWM6Pj2@01 +020105l0KVmd879UHfmbI6ET02Ec82Ec~39FaT04U^MV5\JF@PLfESKfiT87IQK7EU86mV860U +LbLPJ6EQI6Eb>R1P9G<W~3EUI586a_KVMULg@PLVESKg9T86aUKVMdJ3X900408040C`0UK6@0 +02E\I019KWIQK6UT86IYLW=d87IQK7EU86mV860ULbLPJ6EQI6Eb>R1P9G<W~4EUI586eQN6U] +MFdPLVESKg9T86aUKVMdJ3X900408040>`0UK6@004EbLVmb871QLW=YKVLPH2Ec9b1XIF5TIG8P +MV5\MFDj860ULbL0~2EUI587AYKFEcM65]L3XE004080406`1^Kg@PLVESKg9TIF@0EUI587AY +KFEcM65]L3XE00408040OP4UL`0006U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj860ULbL0HVEW +JFiOMV5\MFEOHWEVIVEb~29BYc82EKGPYM~3IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QU +HFAULP009BYc82DZLb0UFeh:G@0006EbLVmb871QLW=YKVLPMV5\MFDPKfHPEED_F5QSKfAU860U +LbLPJ6EQI6Eb~494UT9000~27`0001`0~27`0001h0~27`0001h0~27`0001l0~27P0001l0~2 +7P0001l0~2IG9bKg8PHFa\Kf=QM6U^Ib0UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W~2A4E2EDLj +801QK6a_Hf5dIEmRMFIVIG8j865\K6mSHGAUI20UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W00X0 +06=_KFeUKWAOLgAbGf9eIVIULP009BYc82EKGPYM~3EUI586IYK6DPHfm]KFE^M3X>00408040 +j`XUL`0006EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG8006EbLVmb86=\Kg=YKVLP +IVU\IB1P9G<W04A5@UE7>R00IfEdHemVKg9]HG@j86I_LVeQM21^Kg@PLg1UHfUVJFET86m^87AX +IB1SKfe]HFiT86aYKVD02P1VKg9]HG@PH2Ec9b1YLb1^Kg@PLgE`L6mbM6ET869i87AXJG<PJFe` +K6E]IFidHGAYKfh0IVmbKF5d860ULbLPJG<PKVmd87=eL71_LWAUI21RNB1dJ6Uc86U]L6aUKFE^ +M65dJFm^06U^MV5\JF@PIVmbKF5d860ULbL0A4E2EDLj801WIGASGfI_LVeQM3XPHfm]KF5^I21\ +JFiU87=`IF=YIVUULb1VKg9]HG@PH2Ec9`0:~3A4E2EDLj801WIGASGfe_I6Dj86e_I6DPKVmd +87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21]KfAU860ULbL0~2A4E2 +EDLj801WIGASGfe_I6Dj86=_KFeQKV@PK6U^IB1cL6ESJFIYIG<PKFmTIB1P9G<W00X0~2A4E2 +EDLj801WIGASGg9UHfaUKSXPLVESKg9T86aUKVMdJ21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe] +HFiT86aYKVD02P009FaT06U^MV5\JF@PLVESKg9T86aUKVMdJ21cL6ESJFIYIF@PH2Ec9`00~2 +LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2 +LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2 +A4E2EDLj801WIGASGg9UHfaUKSXPHfm]KF5^I21\JFiU87=`IF=YIVUULb1]HGQYKGE]879UHfmb +I21\IFiWM6PPH2E\I2L02P0004A5@UE7>R00IfEdHemdJFeULgAQKG0j87AYKFEcM65]L21^Kg@P +Lg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0006U^MV5\JF@PM6U]IG=dHFe`87=dLVU^ +Ib1cL6ESJFIYIF@PH2Ec9`14AD9EAcXP06QUHFAULUmdNG1U>R1FETDPK6U^IB1]HGASJ6Ec86QU +HFAULSXPH2Ec9`0:~4HFeRJFMeKgEc86QUHFAULR1YIfi_LVET~4A4E2EDLj801XIF5TIG9OM7U` +ICXPJFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:~4A4E2EDLj801]HF]U +GgAYKFDj86AQM6DPL79_MVUTIF@P?B0U<3AT;bD`<V@_9C0bI00:04A5@UE7>R00KF5[IEmdJFeU +>R1dJFeU871bKgIYI6ET83dP9C0bI3XU<39T>RD`<V@02P14AD9EAcXP06eQJfEOM6U]ICXPM6U] +IEmd87IQK7EU879UM7EbKVET83dP9FaT00X0~3A4E2EDLj801_L6E^Gfa_IemVJFaU>R1\KfLP +IVU\IB1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1\KfL0A4E2EDLj801_L6E^ +Gfa_IemVJFaU>R1_L6E^JFiW86a_Ib1VJFaU860ULbL02P00LgATIG9b~2IG9bKg8PKg1UKVU^ +Ib1\KfLPIVU\IB1P9G<W04A5@UE7>R00Kg1UKUm\KfMOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMe +K65b86IYK6D02P1TMFe]N@0002DZLb0UL`00IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QU +HFAULP00A4E2EDLj801`HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dP +H2Ec9`0:~39C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~2IG9bKg8PL65bLfU^Ib1dJFeU +LgAQKG0PLgAbJFiW860ULbL0NFEQLR0XFEUIFBTPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<CTg<2db +<3<g82Q^Kg@P9F@Y2P00~2KFm^M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^ +Kg@P9F@Y2P00I65i82Q4A2TPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<Bdc<B0XKVmd82ET:@X0~3 +J6meLW<P:4Q8:B1]MG=d869U86U^87AXIB1bHFiWIB0`;C8c82Q^Kg@P9F@Y2P00KFU^MGAULb0X +CDdY86eeLg@PHVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4LfESKfiTLb0XDe<Y86ee +Lg@PHVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4A4E2EDLj801`HG9cGgAYKFDj87AY +KFEOM21fHFaeIB1bIGAeLViUI20m82E\I00:~4JGAUKEmcM780~39FQT06EbLVmb871QLW=YKVLP +JGAUKB0UI20XH2Ec9bTPJFhPM79QKW=\HGAYKfhPIVU\I@00~2JFifHFaYI21fHFaeIB0X9F@Y +86mV86UdIFdP9F@PJFhPM79QKW=\HGAYKfhPIVU\I@0007MbKfiW86ieKF9ULR1_IR1fHFaeIG<P +JFhPM79QKW=\HGAYKfhPIVU\ICXP9F@0069eIVIULP00IG9bKg8PKg1UKVU^Ib1UKV=_I6U^Ib1d +HF9\IB1VJFaU860ULbL006EbLVmb879UHFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\I@0007A_Kb1] +HFii86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\ICXP9F@006i_M21UKVmeIfPPHfQQ +LV5SM6EbLb1YKR1UKV=_I6U^Ib1dHF9\IB1VJFaU>R0UI000~2IG9bKg8PKg1UKVU^Ib1dLV5^ +LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP00IG9bKg8PLVEQI6U^Ib1dLV5^LfaQM6U_KR1V +JFaU~2J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\HGAYKfhPIVU\I@00~2BFidIG9^HF`P +IG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1bI5mhK7AOIVU\I@0UJ6@0JFifHFaYI21P9G<W86QUHFAU +LR1fHFaeIB1YKR1dLV5^LfaQM6U_KR1VJFaU>R1P9G<W07A_Kb1]HFii86=XHG9QHgAULW<PJFhP +M79QKW=\HGAYKfhPIVU\ICXP9F@0J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^ +86IYK6D0~2J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0~2J6EQI6Eb +860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0~2JFifHFaYI21UKV=_I6U^Ib1d +HF9\IB0]86=XHG9QHgAULR0`N2D`<UPPI7E`K6USHGAUI000~2N6ad06EbLVmb879UHFAYKVLP +M79QKW=\HGAYKfhPM65RK6DPIVU\IB1P9G<W~32UAbHFicK65dJFm^87AQHVaU87=_MG9SICX: +004080406P0UL`00E79QKW=\HGAYKfhPL6EbIVmbKFET>Pd00@0P0@3=0F0ULbLPM6lPH2Ec9`1S +KfidIGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL007AUN7@j860ULbL006=_KWAUN7@j86aYKVDP +9FaT86mV86IYK6DPH2Ec9`00A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21fHFaeIB1`LVmf +JFAUI20m82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@PM6lP<0X0~3 +9C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~284M=E000~2A4E2EDLj801fMUmdJFeULgAQ +KG0j85IFAB1dJFeULgAQKG0PLgAbJFiW879UM7EbKR1fHFaeIB0m860ULbL:00X0~2HfmeK6A^ +9g@PHFa\Kf=QM6DP9F@PHWUdIG<PM6lPHfm`NB1cM79YKVLPH2Ec9`0094UT9000~22REc85]I +;diM>R00ADm686AUM6ESM6ET86m^87=dHFiTHG9T86U^L7Ed079R~3HfmeK6A^9g@PIGQQKFU^ +IB0XKg1UKRTPIVU\IB1P9G<W~3A4E2EDLj801UN65]JFiUGfIYK6Dj860ULbLPJ@00~<0@2K0g<P +KVmd864PLVEWMFaQLR1VJFaU00X006=_MFaTKRMd86EhHFeYKVDP:7=dHG@Y86IYK6DPH2Ec9`00 +079UHG=_KR1VKg8PIG9bKg8j82Ec079R0780~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET +82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86U^L7Ed~3AVU\IB1P9G<W86EhJG=d +LbhP84mfIG9gLVUdIB0o~2Kg1ULV5dJFm^86=QKV=UK6aUI01VJFaU860ULbLPIGQYLgAc07MR +07L0~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU +860ULbLPIVmb86meM71eM000@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4 +ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\ +KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4LgEc +L6USJFmeLb1XIF5TIG8PIVU\IB1cL6ES860ULbLPHfQQKVMUI21dKb1P9G<W~2G3X0G00^~42REc +06EbLVmb879UHFAYKVLPLgAbJFiW86IbKfdPLgATJFh0BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@P +JFhP9G<X:@1bIF5TGg9UHfmbI014AD9EAcXP07=SHFiOHfeTGfaYKVDj86=_KFeQKV@PK6U^IB1Q +LVMeKFE^M3XPH2Ec9`0:02d004A5@UE7>R00Lf=QKUmSKFAOK6U^ICXPKF5dHfQULb1aMF5\JFIY +IG8j820P820PH2Ec9`0:~3HFeRJFMeKgEc875eHFaYIVUULR1P9G<W~4MFi[KVmgKR1aMF5\JFIY +IG8PH2Ec9`00LGEQK6UVJFEb860U;S5c9G<W86eeLg@PM65[IB1Q87IQK7EU02l]07IQK7EU86eY +Lg=YKVLPHFIdIG8PLGEQK6UVJFEb860ULbL0075eHFaYIVUULR1P9BhaLbEc9b1TKfEc86i_M21d +HF]U864PMV5\MFD0;bd0A4E2EDLj801cHf5^Gf=]I5m\JFiU>R1aMF5\JFIYIG8PMV5\MFDj2001 +02010544H2Ec9`0:~3M6m_86eQKWTPIVU\IB1^HFeULb1cL6ESJFIYIF@0~2A4E2EDLj801cIGAO +IWAYKFDj87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<02P00~2@f5^KVmd87=UM21V +JFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj84mC;c8PI6mULb1^Kg@PLgE`L6mbM21VJFaU87AY +KFEc869UIVmbIB0a>CP`;P0004IYK6DPH2Ec9b1dJFeU87=UM21dKb0a>CP`;S0a;S0a;C0`>S0` +>S0`84M=E00006EbLVmb87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<0~2BFidIG9^ +HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1cIGAOL6U`IEm]KfAU~3IG9bKg8PLfEdM6U^Ib1] +KfAU86mV86IYK6DPH2Ec9`0jG01DFP0005AJ?@17CE@`@U=D~582d]8000~22UM1DTi9CTLj8000 +2TEBDTmB>R00~32TI1E45<>R00~3BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1eLfEb +GfeULg=QIfD0~39G<UL`X0~29G<UL`X0~2BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X +:@1gLVUdIEmbIF=_LV@0~3DgE^84e_KR1DMFDPEfET85AXMB16LVTPDf5d84YQKR16IF8PCF5b +845`LR1=HGTPBWE^84YeK211MFLPDfE`84mSM21>KgHPA6ES8>0h0`10>@<0X3T3~2>P<0~2800P +0200800P0200800P0200:00X02P0:00X0200800P0200800P0200800P0200800P0200800P0200 +800P00`0400@0100400@0100400@0100400@0100400@01000`0300<00`0300<00`0300<00`0@ +0100400@0100400@0841P@610H41P@610H01P0600H01P0600H01P0600H01P0600H01P0600H01 +P0600H01P04@0100400@010040110D41@@510D41@@500D01@0500D01@0500D01@0500D01@050 +0D01@0500D01@0500D01400@0100400P~30@000516~20@00~40@40~20P000<0n0`34?P<0b3h3 +0<`n0`3@?P<0e3h30=Pn0`3L?P<0i3h30>`n0`3d?P<003l300`o0`0D?`<083l302@o0`0X?`<0 +;3l3030o0`0d?`<0>3l303`o0`10?`<0A3l304Po0`1<?`<0D3l305Po0`1T?`<0K3l3030o0`1d +?`<0O3l308@o0`2<?`<0V3l30:0o0`2\?`<0^3l30<@o0`3@?`<0hSl30>Do0`0\0@00AE=D00@0 +~22P000040~2ooooo`P00@000@0C010>~281`0010>~2ADAD02`g0`d00@000@0X0>Po0`3Z?`<0 +jSl30>Xo0`3Z?`<0jSl30>Xo0`3Z?`<0jSl30>Xo0`080040o`403@0`=`<0g3L3~589@00@00 +0@01010V004000404P010?oo0@00~50@00020>5P01~20@0100<@004000400@0@4P01~20@07 +0040~2h3P33@01~20@0B0040ool2~70@00020>5P01~20@0100<@004000400@0@4P01~20@07 +0080~2@3T33@01~20@0B0040ool2~70P00020>5P01~20@0F00<0~2ADA3<dM<Cd80~20@00~2 +D4IV004000400@13e`01~20@0302`g0`d00@000@0X0>Po0`3Z?`<0jSl30>Xo0`3Z?`<0jSl3 +0>Xo0`3Z?`<0jSl30>Xo0`080040o`408`0`=`<0g3L300`h0`3\?`<0~4E3P30;1?0`00~3X3T3 +?@01~20@1T0R83~2E5X004ECE015A5@0~47`0003\0~2FP0007P0~2U`000;D0~2e0000?<0~2 +4@400301~2CP4006d1~67`0003`0~2F`0007T0~2V0000;H0~2e@000?@0~24P400341~2C`40 +06h1~2Gd=\Kg=UDgAbIF5]~40@0000d:00d:~39F@005PW9CAH9`00~47`0003\0~2FP0007P0 +~2U`000;D0~2e0000?<0~24@400301~2CP4006d1~67`0003`0~2F`0007T0~2V0000;H0~2e@00 +0?@0~24P400341~2C`4006h1~2P?8100D00<010P01T`00`043T`4200700@0002L00<00~20Ih0 +0<010P01U000`043PP6E~2`043P`6G~2`043P@6H~2`043Q06I~2`043R`6J~2`043Q@4L~2`041 +006K~2`043T@4U~2`000004M~2`041004X~2`0000046~2`000004T~2`000006M~2`0410041 +0060~30Oooool0~3V`00`1`00<05~2`9d00<010060W000`9<00<2N~2`9@00<2E~2`9H00<2G +~2`9P00<2I~2`9X00<06~2`2@00<0U~2`1d00<0W~2`2P00<00~3IP0006L0~2J00008<0~2JP00 +06h0~2K`0008@0~2Q@0008H0~2Q`0008P0~2R@0008X0~2R`0008`0~2S@0008h0~2S`000900 +~2T@00~5200103l10:@1~4Gdm`IFiCM79UHFd0Gdm`IFi2NGAU~3Gdm`IFi2NGAU~3K40305=5 +E5E@@E97;T5CC@00~2;P0006=_K@1UN6D0HfeT05aCB45BADe5CEa4A4Dd@410@2i0@40005=e +KP1=Kfh0E7EU05MUI01DJ7D0AW9Y05=QM01CMFiTHGT004e_KVAQN@00E7EULfAQN@1GIFA^IG=T +HGT0~2E6QeLW=THGT0~3AW9YI65i~2Df5dMG9THGT0~3BV5^04IUHP1=HG80@G1b04eQN@1:MFh0 +BWE\045eI`1CIG00Cf=d04i_MP14IF<0BV5^MF5bN@16IF9bMF5bN@00~2CF5bHfP0~2@G1bJF`0 +~2BWE^I@00~2BWE\N@00~2@GEWMG=d~2DfE`M6E]HVEb~3Cf=dKf9ULP1>KgIUKF9ULP00~2A6ES +IFeRIG80~39Fd_9F@_9GT0~39DTj9Ddj9E<0~39GT_9Fd_9F@P9DTj9Ddj9E<0HFd0L6d0;P00 +04<0~6A4E6@EE<E5m<Cd=1HFAYKVM<A@00E4E=D4e5C@0P2@00<34b<c@e=SLh>D52@dA5AP00 +~2<34b<c@e=SLh>F5RHfAUIP00~2HVa[LfUjI@1\LVESK000079UHfI]~3M7U`I@00~2KFE]Kg9i +~2J6a<05d0~2;@0[04A4AC@^CE=7~4BFidIG9^HF`PK6URLV5bNB1ULW9_LR1YKR1VMFiSM6U_ +KSXPGdMUM4EbLTecI`00:34Y00d:~2CFEcLf5WIB1^Kg@PIVmeKV@PJFhPKFEcLf5WIB1VJFaU +;P00:38Y02Pc:@1=IG=cHFMU86IYK6DPKVmd86I_MFiT;P1>@Dh0BDi6BDi9E5T0~3BDi604i1 +CP19CTI9CTUDF@00~2BDi6~:P000~:l7l0~5403oooooooo_O`00~4l7l0~5n7ooooooooogO`00 +~4l7l0~5n?ooooooooogo`00~4l?l00<1ooonoO`00P7l00<3ooonoo`00P?l0~70@3ooooooooo +ooio~7P?mo~7`?mooooooooookooO`00~5P?mo~7`?oooooooooookooo`00~5P?oo~6<34b<c@e +=SLh>F5RHfAUIVMXJFY[K6e^Kg1aLW=dMGIgN7Uj~:941o0`00~6941o0`00~7P?lo~7X090~7 +b0E0~7nPQ0~6@9`<@000~4D<<?@000~49?@B@000~3P9JH5T00~48;bn6D00~4:6_^7400~4n@:E +8400~3@;M3^R=0~44:GDj2I0~4:^N4TBY0~3P?@Pi[D]@0000:0aZEoS<400~21;o96hhd@000 +0<D^_::a=d00041f>V\;gSY0~2j8T48lN:?T0006:\aN]h[D50081j5kLVemQ4@02@[6hbN8J7 +B400]5L:?aIXZD]00:7]c<hK`]=>@:24541QDEV4DT38YAV@^JE_YEE0>PlPm2N?bliH@8@9U?Qh +>Cn1G43U2kTfe`N?XEm0gdiW1<g9l\UR@9HRPDE0O6olID2N]G0[Z:g5WFU01N=<=Q8I=lE\@<LK +h<=FghCfKd1L4F`jUP\CVW=0\aD7bG_>Ul1f@23KB;\J`[g`ND3dR0feD9UfUWe0<N]@hZ@o5;b0 +@?dUiAZ>CaW[Pd2n=lo@^=7_TXM0[PD31BO6ZkN:@1W7@lJ`]iKUSD1`G>YkcS9nSi50S??T6X:o +GK>D@6l`WZ5R;cGPUd15gP:UWCdQS9]0eiE33PF=:JnN@4ake556l??JXD0@cBCc:gKHR:E0E03^ +kkJC3Z^X@6R0jJ^T>=;EZd11l77[IV>SQJm0DVa>YT0l3:Nb@6H7h\m@Blo@]D2PA>f14Xn1P[U0 +b9EX8]Ob8J>l@3Zk0^^<Kn[;_d08J\<UL0_Uo\90AB:J5bHWCio6@=JZP9g_l2;7bD2<eN24:jg[ +n<a0MhD<<c]<Ti_@@000~5P?loeJK?odTON<;C@>2<jH39AkZCZ45[EBLiSOM`h7a2S]kiWO_[ +OZYA@gKSc?8Y;hB19T@GZ_R^4>?5a?Y4e??gjn5:NYG?ALNA3ZJ^X1WSXdKmUFM[RO^3[7Q77Ie: +iI7g38==B<`1SamZXa[78DV<YP3=Z9`oUoI93WmcS@]Jb^G:B^[KeN<\:hn^Wd_Bcbh=:VNJQ7A< +5`aePHIeM\U8CCBHNYTfC@ZI7DkQ_c\L63b3j?5>=^BlRWV=X;36Cl]^QN\>S2b6Ve22l6a6eVkI +bfmA1@k_U]A\fYY4DPZkMjRBGdC[65?TYi<i>cFh\^eC_k3dc8Md`hO2E8kkmn@:YD?>UUDiD`9_ +o@^`W6]FS;Q:TXCM3NhoEfICZLYf=MJd55Q=08I;1bmORNUH<oN4WAL^]M2mFNEM?LEM>h^NTUXY +4GdW@loOl6IKm]H4aVZQn[HkG4V5n=4[b_n:45e_P?A1<R0^dnAM@;JMc]@;K:2iG^24`8U`C[[c +SEmC_50@T8`U^F9PY_2Q8<1DYH`gHHi_N_oCTJkE2f;m0O7ZM8iBX^1RJ^F^UoadWOJdHlagfI^J +2UNkRFBg@^;C^me?SUiU3GkS:[ZI=]PbIYnU0D24e3jT1fN;FX_H9Ef9nM]WKGfT6gX_Skf`J>eA +;na3M?n?QFWUJTH?idk6fUUZAOjIEWg_<:H^J`nOcVYj8Gkl0V`NMZJhFPo>_mM\[^JlEj\W]96\ +KOSc9knRb5gMP6hMaf>i3o4XZ5E_dJj6mMSLNolYL=P37lVU_Q?2oW1^ClImL`M^Tm=aTA4Ij7\N +oMnWLX9>ZIDPjbJZO7?F>dW>>5E1PE5dViLPRP9BH<@UMB]OO\]<8bfEnWF<mmJXB6RTh\if2S3n +GL__:ZbSMk@LhG_SD\V2N7Qfkd[KE]jcaTaiD]NZ@QN;lIHQNUmfm6TW_U?UmG[`FME^HQ4e[\Yk +JJebQUOeEHBOO1CW__c7N0k9Lge5CO09hdjkV4QnKFdD^Glh2nPLOnLe2[E_HTF`lGl0~7g2X2 +058[0P00~2P1b60@22QP40~3P9260@21R040~3P9280@3_R040~3P?b80@0lR@40~3P4R90@2c +S@40~3P>B=0@1bSP40~4M8h10=^>0@00~2P>R>0@1aS`40~3P82?0@02T040~3P12@0@3_T@40 +~3P?bA0@1LU`40~3P6RG0@3\U`40~3P?RG0@2NV@40~3P:bI0@3nW040~3P0bM0@2UW@40~3P;BM +0@2ZWP40~3P;RN0@1TW`40~3P72O0@1TXP40~3P72R0@2CXP40~3P:2R0@1TY040~3P72T0@17 +YP40~3P5BV0@27Y`40~3P:BW0@3JY`40~3P>RW0@0=Z040~3P1bX0@1:Z040~3P5RX0@1`Z040 +~3P7bX0@2AZ040~3P:2X0@3JZ040~3P>RX0@0GZ@40~3P2BY0@2NZ@40~3P:bY0@3h[P40~3P0B_ +0@1e]040~3P8Bd0@2D]040~3P9Rd0@2`]@40~3P<Rg0@3Y]`40~3P?Rg0@2iaP40~3P<S60@2g +a`40~3P<C70@14b040~3P5380@3ib@40~3P0S:0@3Tc@40~3P?3=0@0We@40~3P3CE0@05eP40 +~3P1CF0@1YlP40~3P83b0@27lP40~3P9Cb0@0Hm@40~3P2Ce0@1>0`80~3P5`30P3d2080~3P009 +0P0I2`80~3P2P;0P0O3@80~3P20=0P3h3@80~3P0@>0P0o3P80~3P40>0P1B3P80~3P>0A0P19 +4`80~3P5PC0P3N4`80~3P>`C0P1_6@80~3P7`I0P2O7P80~3P:`N0P2C7`80~3P:0O0P3b7`80 +~3P00P0P0Q8080~3P2@P0P0[8080~3P3PP0P0o8080~3P4`P0P088@80~3P1@Q0P0I8P80~3P2PR +0P398`80~3P=PS0P2D9P80~3P:0V0P0E9`80~3P2@W0P2L:080~3P:PX0P3^:080~3P?`X0P27 +:@80~3P9@Y0P3>:P80~3P5@[0P0c;080~3P40\0P3?;@80~3P>@]0P1>;P80~3P5`^0P2F;P80 +~3P9P^0P0i;`80~3P4P_0P1R<080~3P70`0P1I<@80~3P6Pa0P2Z<@80~3P;Pa0P12<P80~3P50b +0P31<`80~3P=0c0P2V=080~3P;@d0P3?=080~3P=`d0P3[=080~3P?Pd0P3o=080~3P0`e0P3\ +=@80~3P?0e0P2c=P80~3P;@f0P0D=`80~3P20g0P1V>@80~3P7@i0P3@>@80~3P=`i0P31>`80 +~3P=0k0P3P?080~3P>`l0P2h?@80~3P<@m0P3l?@80~3P0Pn0P3A?P80~3P>0n0P1<@080~3P5Q0 +0P3^@P80~3P?a20P1`AP80~3P7a60P1FA`80~3P6A70P3fA`80~3P000~6EH_\PNb8~3RDD8RED< +RDd@RdD8PWP50GDYRdD8Re08RdDHj?>W~2RddH^\@30`2h~4j<U]~2\07YOP0008_0SEF8RdD< +j=T^~2R4F7PWf70G@L^NA?0`2jb0<306Jh0@3XjH800;00jDh0~2Rl2=AHQ@^_@30`2Qd4l308?\ +2>PVR000^NA?0`2;5M1?0`1V^040j;J2~2ogDHSDf8ReDDRdD@Pn`<j6XO~2Pl@LR4F7RTF7j`>= +@023a0c9`he005F;k8?\H6P<D`<03kl5X503052j70@30:7@C`<0Pn`8j<>7~2^NA?0`2;5M1? +0`1V^040j5>2~2ocEXD`<03kl5X503052jA0@30:7@C`<0Pn`8j8n7~2^NA?0`2;5M1?0`1V^040 +j1n2~2adGd01000;Y\10<0RdGdj==5~2Pl@PRDG@I\M5jP00RdG@RDGLo6S0C`<0J0aC0`2;3@a? +0`2;5CAH0`2h00P008?\3>RAA000Pl@DRDGTPggT00n5E@000:5PD`<0mT080@n46P000;WTC`<0 +^W`40`1V^0@0j:>1~2jAD0~2Rl2ii4l30;ZX10<0I[P40>R9P@00^P00~2^0aC0`3XLV<00>Ri +L000j323~2RdgT<l2:0FJ3?4F0C0<0ogE>J0aC0`3o=FQC0`2;CN@c`8X1D8]=i3?0RP5@^\@4 +0`2Qd4l308?\2>R=QP00^NA?0`2;5M1?0`1V^0@0j1f1~2j=R2~2Pl@HjA<0~2RdgT<l2:0FJ; +14F0C0<0IXU5hX]5i429ANAVPggR07e03km5hU2jo0@30:7@C`<0Pn`8j3B6~2^NA?0`2;5M1? +0`1V^0@0j<B0~2ReGT^0aC0`3X[f800>QbPP00Pl@<IX=mhP0?QB`2~2J<1?0`1X35<308\=34l3 +08\E=5P30;P02000Pn`<j3e3~2Pl@DRDGTPggT00n5;0000;WTC`<0^Q`50`1V^0@0j5j0~2^P00 +~2^0aC0`3XAf800>R>K`00j0F2~2^B000`2;ENBh35<30>S[BP00IXU5j0noANSYVP4008_0ocEX +D`<03kl5X503052j>0D30:7@C`<0Pn`8j625~2^NA?0`2;5M1?0`1V^040j?1o~2Pl@@jBP6~2 +IX<mQ5<3009d@Oleb0030;YP1@<0XM1?0`23k0SX8XD00;WTC`<0RaG@C`<0I[P40>RbO`00ReGT +^0aC0`3XWF400>QPP@00Pl@<3km=j6_93871800308]Ei;P<D`<0j?mA~2SDGJD;Z81@<03km5 +j6_038^0:00308?\2>P]Q@00Pl@<IZ6PD0<0IT1VXj1@0`1VXJ1@0`1V>DGJM4H?_dGJD?leb003 +0;Z<1@<0XM1?0`23k0SXQh@00;WTC`<0RaG@C`<0I[P40>PGO`00ReGT^0aC0`3X0V400>S5P000 +Pl@@ocEXD`<03km5fTQ@^Z050`2Qd4l308?\2>Q0Q000^NA?0`2;5M1?0`1V^040j=1n~2^PaC +0`1VXJ1@0`3X]0L008?44>WX1000^NA?0`2jb0D306Jh103XYGh008]Ei;P<D`<0j91P~2j5>0 +~2jAH0~2Rl23n0P?Q5onoon3n0h?Q9;nooo[`0noAN:3`0:i0`0009WgnL7P0XU5k8<mP4l3~2 +M12QP4l30>QhX`000dG\RDG\RdGTj6ZS~2>dG\Ldf;ANB3k0CXFZ<008?4153oMNbjh0D30:7@ +C`<0Pn`8j7F3~2^NA?0`2;5M1?0`1V^0<0j0En~2ReGT^0aC0`3Xl5l008?44>TX1000IX<miTh3 +00<?Q?h0~2RdG@RDGLIX]5hVJ9AOiVPggn07hiRdgLReGTIX]5o^P61000IXU5lX]5i8?018U5 +i0noCO:;AM`3`HU5g6J;AOiV:dGbIXU5o^_3SD00adGh~4o0noAN8kAOQf=h]5d8]En8X=;5P3 +038<483Qoh7Qo`000:4\F0<0`NP8<`B=V5<30:<\F0<0RdGh@8U5n>_2Rl22?J410`01MCO7AOP0 +~33km5hS]5n7HWRdg@ReGh<l2:115VRaA5\50308]5d8]=n8PD28]5n429AOS[dX_0^KQG0`2; +EM0?_dGRj2mo~23km5hP<5:5P30:<XF0<0jAL3~2SD00IX=mjP0?QMd1~2SDf\ReGTI[P20>PB +0`00IXU5lS?0RTF\9Ol0~2`N08RDG<<l2:AJdUo`0000=5c8U5c8=mc00?S1@0~2PGg<ool000n? +1`000>U0~3Rl3oMLbj10H30:7@C`<0Pn`8j<n1~2^NA?0`2;5M1?0`1V^0@0j5ml~2ReGT^0aC +0`3XBUh00>P=OP00Pl@<RdGd>DG<3hj>~3ReG<RdG@j4nM~2RDG@Pgg@00n5<@000?mec;X\1P<0 +XM1?0`23k0SXKH400;WTC`<0RaG@C`<0I[P40>SmN`00j;Qm~2Pl@<RdG<RDGdPSg8C`<00GDf +^V060`2Q33H30>S3OP00ogG<^VP60`2Q33H308?\2>R^OP00^Y`60`2Q33H30>ROOP00Pl@<IX]5 +hVJ9AOj;AM29AMb;CMb;ENAVRdGnj=\1~2IXU5lX]5i8?018U5i8]5g8Y80X]5g8P8RdGL@8U5 +g6J;AOiV:dGbIXU5oVJ3OOh0OSV;CMb;ENAVRdGnj9X1~2IXU5lX]5i8?018U5i0noCO:;AM`3 +`HU5g6J;AOiV:dGbIXU5o^_3SD00I\M5jP40RdG<RDGDIX]5hVJ3j09VRDGR3km=hX]5e2_1RDGD +jEL0~2SD00IX]5hVJ9AOiVPggn07hiRdgLReGTIX]5o^PV0@00IXU5lX]5i8?018U5i0noCO:; +AM`3`HU5g6J;AOiV:dGbIXU5o^_3SD003km=hX]5e2_1RDGDPggD00n?cP000<M5n000~2SD00 +RdG<>dGhMSR;AM2;EOR:3BaH0`0b3120hOn1hOl0~2XBaH0`31j0Pc18fHD`<0XbaH0`2;AOQ0 +RDGhjl>=@022?J410`01MCO7AOP0~3RdG<>dGhMRR;CM2;EOPc`8X44FJ;54F`D0<0RdG@Rdgh +R1@8RdGh@8U5n>_CSD00IX<m6UP300=e5[VhE`<0ReG@RdG<j7Yl~2jA40~2o;VhE`<0ReG@RdG< +j1Ql~2I\M5jP00RdG<0`DXF0<0XbQH0`3YdoOoohe008]5d>QhT`00Pl@<bL>=@01ERnb3k1aV +RDD8RED<RDd@I\M5l000IX=m204?S1d1~2Rdd<<l2:0FJ3?4F0C0<0o`n5D@0006P<D`<0ocEX +D`<0Rdd<<l2:0E2;C@`c`8X1D;ZP1P<0XM1?0`23k0SX\7h00;WTC`<0RaG@C`<0I[P40>Q0N@00 +j?]j~2Pl@HjAH0~2SD00Rdd<<l2:0FJ;14F0C0<0IXU5oX]=33?0RT41IX<lAH1<0`3oME9X35<3 +0?leJ5<308]=33?0RT41D8]=33?0RT41D;[H1P<0XM1?0`23k0SX=gh00;WTC`<0RaG@C`<0I[P4 +0>S7N000j89j~2Pl@HjAH0~2Rl2;C@`c`8Y10FJ;14F0C0<0IXU5o6J;COiV`N42IX]5o6K1n0AV +2l5VRDGfRdD@IX]=mXP8IX]5l6I0IXU5l6J3O@P23hbV~3Rdd<<l2:@@9VPca5P4`30?l?QE00 +~2J0aC0`3o=FQC0`2;C@`c`8Y10U2;C@`c`8Y10U2j40L30:7@C`<0Pn`8j8Em~2^NA?0`2;5M1? +0`1V^0@0j1Eh~2j=1i~2Pl@HjA@0~2Rdd<<l2:@@9VR`A5P4`306J9AOYVRdglI\7Q16J;AOYV +`OP2IP_1IXU5m8]546J;COB8B05VRdG`IT1VRDG`IX=m20<?S:80~2Rdd<<l2:@@=VPca5P4`3 +0?l?QE<0~2J0aC0`3o=FQC0`2;C@`c`8Y10e2;C@`c`8Y10e2jB0L30:7@C`<0Pn`8j=Al~2^NA? +0`2;5M1?0`1V^0@0j6Ag~2j1mi~2Pl@HjAL0~2SD00Rdd<<l2:@@=VR`A5P4`306J9AOQVRdGj +I\7P1VH;AOQVRDGbRdD@IX]=lXQ80VJ;AO1V@6J9AO1VRdG`j`:;`8?43<W3SD00EH_\Pn`LIXU5 +28UE36J3O@QS3hh`~3JV>jP0L30:7@C`<0Pn`8j3al~2^NA?0`2;5M1?0`1V^0@0j<af~2j8Mh +~2Pl@<I\M5lP40RdD<Rd1LRDGdJ<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>Q@>@00Pl@D +RDGlRl23OO`03hE<0P00RdD<Rd1DmT080@n44P8008]5389hF04?QDT0~23km5lU2jZ0L30:7@ +C`<0Pn`8j:Yk~2^NA?0`2;5M1?0`1V^0@0j3Yf~2^P00~2^0aC0`3X8eP00>SVM`00Pl@<jH`0 +~2Rl22?LQ?0`013hDh~3^\`70`2Q33H30>S\N0003km5lU2je0L30:4<=P<0Pn`8j=Eh~2^PH8 +0`2Q33H30>S6N000Pl@<PSg8C`<00GDl^PP80`2Q33H30>R[N000ogD<RdD<og1L^Q080`2Q33H3 +08?\2>R@N000^Sl80`2Q33H30>R1N000Pl@@3km5l^T50@00o88mb4l3005e=[Y420<0X@`f0`3X +G7P00?me3;Y<20<0X@`f0`23k0SXAgP00;Y`20<0X@`f0`3X>7P008?438]538]0E>PnV000RdD< +ad1L~4I\M5lP80J<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>S9=`00Pl@DRDGljH42~2Rl3o +M@`?_dD8D;Yd20<0XM1?0`23k0SX@WX00;WTC`<0RaG@C`<0I[P40>SBM000j8ef~2Pl@@3km5 +lU2jV0P30:7@C`<0Pn`8j0mj~2^NA?0`2;5M1?0`1V^0@0j9md~2^P00~2RdD<j8YF~2j4ef~2 +Pl@<jAd0~2o8?h0@n4lokooh?h0`n4L_oooh?h0WBSjj6=@03Y;@0008e00;WTC`<0^[`80`1V +^0@0j4ed~2^P00~2RdD<j3QF~2j7mS~2j?Ie~2IX=mlP8?QG\0~2RdD<Rdgd>DQL3ha\~3PSg8 +C`<00@n5>`000;[@20<0X@`f0`3Xk7H00?me30noA@Q@^]P80`2Q33H308?\2>SBMP00^P\90`2Q +33H30>S3MP00Pl@@RdD<j1Pi~2ReD<IX]52>R\2@00I\M5lP<0RdD<ad1L~4^B000`2;EOb;A@cX +F3h006J9AOYVPggj3@n5J@000?me36Rl00<0R`dlF0<0IX]E28]5o8?\3>Q@;000Pl@D?04?QCT0 +~2RdD<og1L3km5252j40T30:7@C`<0Pn`8j:Qh~2^NA?0`2;5M1?0`1V^040j3Qc~2Pl@@jK@0 +~2jH<0~2SD00PSe10@<00@nD`8?P0H?0oa_0@0_03hAU~3IX=mnPl?QEX0~2Rdd<^R000`21`[@0 +~2RdGlj30=~2RDGlPggl00n59@000;WTC`<0^SP90`1V^0@0j<ab~2^P00~2RdD<j;MD~2j7Yd +~2RaGL00<0^1Q?0`3XLYL00>\WJ<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>Q3=@00Pl@D +RDGljO3koon3a0c9`he005F;k87\T0000<L5J5<3~5I\L5X5030040^PaC0`2hi0430>QM1P00 +^UP90`2hD@000>P2=P00RDGlJP1Z08]=o;X0~3^0aC0`23k0cXkVl008?4588mO@43004?Q@h0 +~2I\L5[5L30040jB40~2PSeTD`<00GD?I\L5[5L3~3j@X0~2o6K71JaG0`0206STC`<0IX\=[5L3 +08]Eo;P`0@<0Pl0`Pn`<j5Q2~2J:`90`1XU0T306R82@<0^VP90`2Qd4l308?\2>SkMP00^NA? +0`2;5M1?0`1V^040j8]a~2J0aC0`2j^0T30:7@C`<0Pn`8j=1f~2^NA?0`2;5M1?0`1V^040j61a +~2Pl@`PSem0@<00GD<ahEloooo20X30>\:ahEloooo30X30?neO?oook[P2@<0XM1?0`23k0SX +PWH00;WTC`<0RaG@C`<0I[P10>PBL@00J>A?0`2j40X30:7@C`<0Pn`8j5Mf~2^NA?0`2;5M1? +0`1V^040j>M`~2^000~2Pn`4j:ZF~2Pl@4j1i`~2J81?0`1X=5P30;V4D`<0^S010`21`Y`0~2 +^3010`05T00008?\3>Sb5P00^B000`2j35<306JQQ5<30>SQ3`00Pl@\IX<mQ5<3008?QL00~2 +^Y1C0`2h800308?0E>SZ:P00IX<mT5<3~23hhk~3J0aC0`0?_`F@D`<0D;Xh2P<0XM1?0`23k0SX +WGD00;WTC`<0RaG@C`<0I[P40>P]L000j>Qa~2Pl@@aPF4CP<00;V4CP<0^P000`2h800308?0 +N>Q[;000^HA>0`2j30030;PP00<0Pl1\j3`[~2^XA>0`2h800300F@~3j1P^~2^XA>0`2h8003 +00G0~3j6@`~2jD<0~2SD00I\L5T5<3~3aPF4CP<006K71NI>0`0106K71NA>0`000<L5l4h30040 +08371NQ>0`3oooooa`G\CP<0oooookX4D`<0^2000`05Q0000>SL;000^ZQG0`2h800308?0<>P: +:@00ocDlF0<0^WP:0`2Qd4l308?\2>RNM000^NA?0`2;5M1?0`1V^040j2i_~2^AQ?0`1V^T00 +^3010`23`0cX=1H006R0C0<0I[T00KXHC`<0I[Q008?\3>PbC`00Pl@La`FXD0<0~4a`F\D0<0 +~4PSfQ0@<00G@J^Z0:0`2QZ5L30>S?D@002l1e1nUU~3Rl2=AH1@J:P:0`2;3JQG0`2j<04308?2 +N;P`0@<0Pl1\Pn`<j4W[oon3a1B8AO^2OO\13hDI~3^OP00`2jZ50308e5P>R?C`00jAD0~2Rl2i +i4l30;Z`2P<0I[P10>QQKP00PcfXD0<000n4004008<m[503~23hCc~3RaFXD0<0XJQG0`3X=e40 +00_03hAQ~3ocF\D0<0ocFXD0<0^]`:0`2Qd4l308?\2>Q]L`00^NA?0`2;5M1?0`1V^080j?e] +~2ocFXE`<0^P`;0`2Qd4l308?\2>Q1L`00^NA?0`2;5M1?0`1V^?ooj=5]~2Pl@LRaF\D0<0^2`; +0`3X_U0000_0M63o=Ja@0`3o=JQ@0`2j=0\30:7@C`<0Pn`8j?Qb~2^NA?0`2;5M1?0`1V^080 +j8Q]~2J80;0`2jI0\30:7@C`<0Pn`8j<eb~2^NA?0`2;5M1?0`1V^?ooj5e]~2Pl@LjG80~2o;Z8 +2`<0XJQG0`3XAE0000_03hAJ~3ocFXE`<0^Y0;0`2Qd4l308?\2>R1LP00^NA?0`2;5M1?0`1V +^080j15]~2J<`;0`2j\0\30:7@C`<0Pn`8j5Ib~2^NA?0`2;5M1?0`1V^?ooj>I\~2Pl@HJ;QG +0`2i~20`2jQ4h30;P`0@<0Pl0lPn`<j6PI~2J;QG0`1X300308\=15<30;Z4CP<0^3010`23`1R3 +k0cX^aD00;VhE`<0^XA>0`2h<04308?0E>Q@6`00^KQG0`2jQ4h30;P`0@<0Pl1Pj<4L~2^KAG +0`2j^5L30;P`0@<01H@0~2j?@I~2J;QG0`2;3CaH0`1VRaF\E`<0^?010`23k0cXQ@<00;VHD`<0 +^R23^>eV^001j7Hh~2a`D\F0<0ooooolL5:5P3~5a`ElD`<0~4a`G0C`<0~4RdGlj:j5~2Pl@d +Pl@<bL>;`5F;k8?\38U528UE38]5289h1@4?Q3<0~2J?@;0`2je0\30:7@C`<0Pn`8j1Qa~2^NA? +0`2;5M1?0`1V^0@0j:Q[~2j6=]~2Pl@<RdD<ad1D~4RdD<I\M0H040RdD<I\M0HP40RdD<ad1T +oooooh]53<M0J?oooonj0@`308]528]02>SdS`002l1e;;T6~3^P@<0`2;A@cXIXX008]538\= +13H308U8E8]53<I0F07YM@0008_0RdD8Re08RdD<j>Z?~2Rdd<^P`<0`2h~4j<1E~2PSg8C`<0 +0@n5=P000;X@30<0X@`f0`3Xh6d00?me3;XH30<0X@`f0`23k0SXbfd00;Xn30<0X@`f0`3X_6d0 +08?438]53>QAFP00RlR;A@b9B5B;A@b3N5@0MC7oM@bj@0`30:7@C`<0Pn`8j?]_~2^NA?0`2; +5M1?0`1V^0@0j8]Z~2j4I\~2Pl@<RdD<PWQH0G@>RdD<j0YM~22\1d0^]BPSg8C`<00@n5=P00 +0;YP30<0X@`f0`3X?6d00?me3;YX30<0X@`f0`23k0SX9fd00;ZA30<0X@`f0`3X66d008?438]5 +3<I0F06;A@cX6VL008?43<W3o5F;k8?\F6J9A@R9E@`?_dD8D;ZD30<0SDGhPn`8j4i_~2ReD< +SDGhj3=L~2RdD<j?mK~2Pl@<9Ol0~2Pl3o6l102l0?Q5D0~2ogD<3km5252jW0`30:7@C`<0Pn`8 +j0]_~2^NA?0`2;5M1?0`1V^0<0j9]Y~23km5252j_0`308e5]8?\2>SRKP00Rdd<I[Y@08e5]>Sc +GP00Pl@LPSg8C`<00GDf^^@<0`2Q33H30>Q8K000ogD<^^`<0`2Q33H308?\2>PcK000^Q8=0`2Q +33H30>PTK000Pl@<RdD<j;UH~2RlR;A@b9B5B;A@b3N5@0MC7oM@bj50d30:7@C`<0Pn`8j6=^ +~2^NA?0`2;5M1?0`1V^0@0j?=X~2j:iZ~2Pl@<ogD<3km5252j=0d30:7@C`<0Pn`8j2e^~2^NA? +0`2;5M1?0`1V^040j;eX~2Pl@@Pl@<bL?lEH_\Pn`HRDD8IXUE38U=48]55<M0E000~2^U`=0`2h +D@000>QC;000RDGd^V`=0`2hD@000>Q1;000RDGl^W`=0`2hD@000>P_;000RDGhRdD8PWP50@n5 +m`000;Z83@<0RdD8Rd08j=^<~22l0?QB\0~2RdDDaT1H0KT7~3^X`=0`2;AACX@XL008]558\= +23H308U8E>V`~3o8]528]@28]55>S>S000PSdl00<00@n5@@0008]548?\1>SBFP00Pl@4Rm2; +AOCXZH`006X0ogGhRdgl^P00~2RdGdPn`<j9UU~2RddDReGhRdGlj6]B~2Pl@DPSg8C`<00GDf +^Y@=0`2Q33H30>R<JP00ogDD^Y`=0`2Q33H308?\2>QgJP00^\<=0`2Q33H30>QXJP00Pl@<ReDD +IX]53>SUE`00RlR;AAB9B5CY]`00088m?003004?QGL0~2RdD@Pn`4j2aJ~2Pl@4Rm2;AACX0h`0 +088mb4l3004?QCH0~2^\P=0`2Q33H30>P;JP00ogDD^]0=0`2Q33H308?\2>SfJ@00^_L=0`2Q +33H30>SWJ@00Pl@<ReDDIX]53>QTE`00RlR;AAB9B5CY=P0008e006PL3P<0^_`=0`2Qd4l308?\ +2>PQK000^NA?0`2;5M1?0`1V^0@0j;5V~2j6aX~2Pl@<RdDDPgQD07DaogDD^R`>0`2Qd4l308?\ +2>SWJ`00^NA?0`2;5M1?0`1V^0@0j7MV~2j39X~2Pl@<ogDD^T`>0`2Qd4l308?\2>RfJ`00^NA? +0`2;5M1?0`1V^040j4IV~2Pl@<RdDDPWQH0G@>RdDDj<YH~22\1d0^]BPSg8C`<00@n5=P000;Yd +3P<0X@`f0`3Xo6P00?me5;Yl3P<0X@`f0`23k0SXifP00;ZU3P<0X@`f0`3Xf6P008?438]55<I0 +F06;AACXfV8008]5o>R:O`00RdGhj89o~2RdGdj7Yo~2Pl@<bL?lEH_\PN`P0P00RDD8RED<RDd@ +RdD<aT040;ZX3P<0^440~2j5`Y~2RHGdoOooSHGhoOooD;Z`3P<0RdD8Pn`8j3m[~2Pl@<RHG\ +oOooPkg\oOoo0@n5T@0008f5n?goonQjC`00SHGhoOooj7>:~2RHG`oOooPkg`oOoo@0n?6000 +08fEn?gooh^5m?goonS_R@00jDX0~2Rl3o]O3moonj_0h30:7@C`<0Pn`8j6AZ~2^NA?0`2;5M1? +0`1V^0<0j?AT~2^P00~2RdD@j=m6~2Pl@<^000~2jIX1~2Rl3Y300008e008^5m?goolH008e0 +08^5m?goonSQR@00RHG`oOooJ<1?0`3oMA2;3@a?0`2;5CAH0`2h00P008?\3>Q>9`00Pl@DRDGl +Pggl00n5<P000;WTC`<0^^P>0`1V^0<0j6mT~2^P00~2RdD@j5Y6~2j:5C~2^000~2jA<1~2SD00 +^B000`2;EOb;AA3Xn2h006J3n?md1^V5~3o8]5o>QDR@00RlR;QO3mool3`HV5l?gooh>ml?go +od1o4h]Eo8^5m?goonQER000jDP0~2okG`oOoo^PP?0`2Qd4l308?\2>Q4J@00^NA?0`2;5M1? +0`1V^0<0j=AS~2^P00~2RdD@j;m5~2Pl@<^000~2jGX0~2Rl3Ykokoohe008^5m?goonS=R000 +PoQ0M4So]O3moonj=0l30:7@C`<0Pn`8j>AX~2^NA?0`2;5M1?0`1V^0<0j7AS~2^P00~2RdD@ +j5m5~2Pl@<^000~2jAX0~2Rl2;A@c6@0@1RdD<RhgdoOooRDP8RdGlj`23a0c9`he005F;k<J4 +9=cgool0PN``2000RDD8RED<RDd@RdD@I\M0H040RdD@I\M0HP40RdD@ad1Toooooh]54<M0J?oo +oon;AA37@5`0~3RdD@j79B~2RlR;AA29B5B;AA23N5@03hDa~3ogD@^VP?0`2Qd4l308?\2>PH +J000^NA?0`2;5M1?0`1V^0@0j:QR~2j6=T~2Pl@<aXGSmooo0?b2_N?gool13hC30@00RdD@RHGL +moooRdQL@H^5g?OoohU8G8]=48fEo?gookP00P00j09I~2RHGhoOooPkghoOoo00n=@`0008]5 +48]0E?I0204?Q0L0~2jG81~2Rl2ii4l30;ZD3`<0I[P30>PUHP00^P00~2RdD@j114~2j5MA~2 +jDH1~2Rl36AO`0^R<0~2SHGloOooj:14~2RHGdoOooPkgdoOoo07@9RhGdoOooaP00SHGloOoo +j?U;~2SHGloOooj?:6~22l1e1^Wa~3o8f5i?Oooe2=QNSioom@SHG\noooD;Zl3`<0SHGloOoo +Pn`8j61W~2Pl@DRHG`oOooPkg`oOoo0g@V^NA?0`2jb0l306Jh0`3XLf4008fEo?gooh]54>QM +@`00jI00~2PSg8C`<00GE>^_`?0`2Q33H30>PdI000SHGTmoooD8f5j?Wooe2=QNckoom@RdD@ +og1L^P@@0`2Q33H308?\2>P7I000^Sh@0`2Q33H30>ShH`00Pl@HReD8SHG\noooj?]3~22l1e +9h]E38f5j?WoonSY@`002l1e5HfEi?Oooh]55>ROQ@00aXGSmooo0NTco_ooSD00RdD@j0`V~2 +RXGSmoooj`23a0c9`he005F;k8?\56J9A@R9E@b9CA1X`4l30?me38\=34l308\E=5P30;P02000 +Pn`<j3\S~2Pl@DRDGlo8=mo00?QHP0~2RdD<Rd1DmT080@n4CP000?le>0030;Y040<0XM1?0`23 +k0SXXVD00;WTC`<0RaG@C`<0I[P40>PbH000^P00~2RdD<j1e2~2j6A?~2j=]Q~2Pl@<jBd0~2 +SD00^NA?0`2jI10306Jh103XoEl00;X0~3RdD<j>Q1~2j2m?~2j:IQ~2Rdd@ReGlRdD<j90Z~2 +IXU5nVJ3O@P23hC9~33km5n^UL~33km5nV_03?n`80030;Z040<0XM1?0`23k0SXoF@00;WTC`<0 +RaG@C`<0I[P40>R=G`00ReGlRdD<j7Y1~2j3eQ~2Pl@<jGD0~2o>U_~3SD00jFL0~2SD002l1d +X8?h0GBKPoP3M9J3n0AdTH?h1GB<PoP6M8N3n0MdPX?h2@n4NOoooh?h2Pn4L?oooh?h2`n4Iooo +oh?h30n4G_oooh?h3@n4EOoooh?h3Pn4C?oooh?h40n4@oooon^=o0noAO[Yo`4008e00>VO0P00 +SD00RdD@3km=nV_9389l20@1MDJ;AA0?_dgjJlT<oc@8^Z`@0`2Qd4l308?\2>PHI000^NA?0`2; +5M1?0`1V^0@0j:QN~2ReGlRdD<j9E0~2j5QP~2Pl@<J3aH0`2;AA0?_dgjJlT<0l5@IX\=Q5<3 +08]E38]5o8?\3>SR7`00Pl@DjD82~2Rl2;CA0?_dGjJl0<0lR;EOb;A@cXbB800>Wh0@00RdD@ +3km=nV_9389l20@1MDJ;AA0?_dgjJlT<oc@8^\@@0`2Qd4l308?\2>QdH`00^NA?0`2;5M1?0`1V +^0@0j0AN~2ReGlRdD<j?4o~2j;AO~2Pl@<Rdd@3km5nV_030?8ReGlRdD<j5H`~2jHD1~2o8]= +38]E40noAOY[`0`3d8]5o>P1n?ooRDGlPggl07DU^NA?0`2jg10306Jh103XXEd00;X0~3RdD< +j8`o~2j4mO~2jF41~2Rl2;AA0?_dgjJlT<oc@8^_`@0`2Qd4l308?\2>S5HP00^NA?0`2;5M1? +0`1V^080j5EM~2ReGlRdD<j48o~2Pl@<jO80~2Rl3Yj`0008e006Q04@<0^R0A0`2Qd4l308?\ +2>QmHP00^NA?0`2;5M1?0`1V^0@0j0eM~2j<QN~2Pl@<jK00~2jJ\0~2SD00PoSo3hCkoOooPoP2 +3hCjoOooPoP53hAio_ooPoP43hB<o_ooPoP73hB3o_ooPoP93hAjo_ooPoP:3hAao_ooPoP;3hAX +o_ooPoP<3hAOo_ooPoP@3hAFo_ooPoP?3hC1o_oo2l0?Q0Gooon3n04?Q?cnoon3n0d?Q3_ooon3 +n0h?Q3;ooon3n0P?Q2Wooon3n0<?Q23ooon3n0H?Q1OooooY6_oooh_0J<1?0`3oM@b;3@a?0`2; +5CAH0`2h00P008?\3>S[7P00Pl@DRDGljJckoon3a0c9`he005F;k8?\76J9A@R9E@b9CA37AO@0 +~3o8=mm08?SCh2~2J<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>RE7P00Pl@DRDGlPggl00n5 +1@000>T80P00RddDReGlRdD<j6hV~23ko0RDGhPggh0`n5jP0006J3O@P23h@j~3RdDDRdghJlT< +oc@8^U0A0`2Qd4l308?\2>SIH000^NA?0`2;5M1?0`1V^0@0j6UK~2j2AM~2Pl@<RddDRdGhJl0< +0lR;EOb;A@cXabd008]548?0L52jP14308]558]=n6_938]420R3k0SXlV0008?438U5l8=ml05e +3X]548=hL01l1NU>~3RdDDRdghJlT<oc@8^X@A0`2Qd4l308?\2>Q>H000^NA?0`2;5M1?0`1V +^0<0j=iJ~2ReGlRdD<j<\l~2Pl@<RdDDRdghJlT<aT@8103Ym@000?b3OOP63hGR~3IX=m208? +Q3X0~2RdDDRdghJlT<oc@8^ZPA0`2Qd4l308?\2>SUG`00^NA?0`2;5M1?0`1V^0@0j7EJ~2j31L +~2Pl@<RddDRdGhJl0<0lR;EOb;A@cXdb`008]548?0M52jf14308]558]=n6_938]420R3k0SX +oUl008?438U5l8=ml04?Q4h0~2RdDDRdghJlT<oc@8^]`A0`2Qd4l308?\2>QTG`00^NA?0`2; +5M1?0`1V^0<0j?AI~2ReGlRdD<j>4k~2Pl@<RdDDRdghJlT<aT@8103Y2`0008e00>T?~3SD00 +RdGd@8U5m>VhoOooPl@<bL>=@01ERnb3k0b9A@R9E@b9CA2;A@R2N0D13hDd~3RdD@I\L00@2; +AAC7~5RdDHa`00~3^NA?0`2j018306Jh0@3XJeT00>Uk~3Rl2;A@b2N0D1MC>;AA1Va`0308]5 +5<L0~4RdDHa`00~3^NA?0`2j;18306Jh0@3X;UT00>Tn~3o8]546K70080^5LB0`3X`T8008_8 +RdDDR@RhFQ830>Ra@P00RlR;AAR92;WTC`<0^U`B0`1V^040j>]H~2Pl@<bL>;`5F;k87\R000 +08U526J9E@b9CA2;A@R2N0D13hF4~3RdD8Re08SDF8j7im~2SDf8^XPB0`2h~4j5A3~2Rdd@IX]E +38e5R>Pm<@009Ol0~2RDF4Pgf400nD`2Go~32l0?Q380~2SDF8D;Z<4P<0XM1?0`23k0SX_ed0 +0;WTC`<0RaG@C`<0I[P40>Q?F000j0YJ~2Pl@<jMH0~2Rl22?MP00`01MB>j35<308e5R>SbO000 +RaGL00<0RdD@j>Al~2jJ\0~2SD003kl5Q5<30>V4~3^@l0~2^[@B0`2=AHSX4WL00;U1~3^\@B +0`2;AA3X07L00>Uc~3SD00^@l0~2^PPC0`2=AHSXiWH00;U1~3^QPC0`2;AA3Xe7H00>]:Rl2i +3`000;YL4`<0SDF8j;if~2^D40~2^V`C0`2;AA3X[7H00>\RRl3Y6`0008e008?h0@n4Looooh?h +0gBJPoP2M;g[^he008e5R52j\1<30:7@C`<0Pn`8j;9L~2^NA?0`2;5M1?0`1V^040j49G~2ogD@ +^]PC0`2Qd4l308?\2>R9G000^NA?0`2;5M1?0`1V^040j1UG~2RdD@Pl0PD;X450<0XM1?0`23 +k0SXG5`00;WTC`<0RaG@C`<0I[P10>S\EP00Pl@TPl@<bL=ERnb3k2B9A@R9E@b9CA2;EAB;A@SX +NQ`006J9AOiVPggno`n44`0008]566J;COiVRDQRjNP0~2SD00^S0D0`2;AA3XVcT000_03hAc +~3ogD@^SPD0`2Qd4l308?\2>SJF`00^NA?0`2;5M1?0`1V^080j6YF~2^NA?0`2jL1@306JhoooX +EeH008?438]566J3N6003hD>~3adGh0@000>T9~3Rl37AOP1~3RdghRdDHIXU8H^UO~3Rl2j[1@3 +08]54>PC>@002l1e7h]536J3N6;oM1F;A@aVRdQRRdDHIXU8H^T_~3Rl2;AAQVPgQP00n53P00 +0<M5m040~2j@T0~2Rl37AO@1~3RdgdRdDHIXU8HX]560no@6;Y8`4008e008]558]=60noBF;o +=8Rj]1@30:7@C`<0Pn`8j?5J~2^NA?0`2;5M1?0`1V^080j85E~2^NA?0`2jj1@306JhoooXKUD0 +08?438]566J3N600M@W7AO01~3j`O7AO01~3Rdg`RdDHIXU8H^W>~3Rl3Ya`0008e008]558]= +60noBF;o=8Rj81D30:7@C`<0Pn`8j7EJ~2^NA?0`2;5M1?0`1V^080j0EE~2^NA?0`2jE1D306Jh +oooXlU@008?438]566J3N600M@W7AN`1~3j`O7AN`1~3Rdg\RdDHIXU8H^UB~3Rl2;AAQVPgQP +07D:adGX0@000>\8o<M5j040~2RdgXRdDHIXU8H^\Yo>TS~3SD00PoP23hCGo_ooPoP13hA2oooo +PoP33hA1oooojk>=@02;AAQVPgQRog@fRdDDRddH3km9H_ldR;Z<5@<0XM1?0`23k0SXYeT00;WT +C`<0RaG@C`<0I[P10>PgE000Pl@<Pl@<bL>=@01ERnb3k129A@R9E@b;A@R2N0D13hDW~3RdD8 +Re08RdD<j<eh~2Rdd<^[@E0`2h~4j:<n~2\07YR0000<M5o000~2^;PE0`23n01d>kS85@<0j35^ +~2RDGlPggl00n4900008]5o>STN0002l0?QQ@0~2ReGlRdD<j75h~2\07Y?P0008_0Pggl07Db +^=PE0`23n01d:;ST5@<0j:I5~22\1d6[T;~3^_0E0`2;A@cXS7800;01j@D0~2o;00j`23a0c9 +`he005F;k8?\48U528UE38U=48]E48]52>Qn6P00IXU5oVJ3OOko3h@C~3RdDDIX]=oVJ9B63Y +;00008e008]536J3N63oM1J;A@aVRdQPRdDDIXU8H>T<~3SD00RdDDI\M0H000RdDD3km0H>]2 +Rl3[BX_0RdDD3km0H52jo1D30:7@C`<0Pn`8j2YH~2^NA?0`2;5M1?0`1V^0@0j;YB~2j7ED~2 +Pl@<j@d0~2o0_0M;b3n05d]n^io8]548]=50noBF3o=8Rj81H30:7@C`<0Pn`8j=eG~2^NA?0`2; +5M1?0`1V^040j6eB~2Pl@<Pl@<bL?lEH_\Pn`DRDD8RED<RDd@RdD8PWP50@n4G000088mb4l3 +004?QBd0~2^TPF0`2Q33H30>PHE@00^U0F0`2Q33H30>P9E@00^X0F0`2Q33H30>SjE000RdD< +IX=hH01e3<M5o000~2j@L0~2adGl80000>UK~3adGlooooohe5o52jPQH308]528]028?\2>RF +E`00Pl@<RDGhPggh0@n57P0008=mo00?S1@0~2PGglo`0000n?1`000>TA~3Rl2hR1H30>R21P00 +j55C~2RdglPN7o~3RdD@R0R;A@aVPgQR0WDiRdd@<l2:0E2;CA0c`8X1D;Zh5P<0XM1?0`23k0SX +\eH00;WTC`<0RaG@C`<0I[P10>Q3D@00Pl@@Pl@<bL>=@01ERnb3k129A@R9E@b9CA2;EA2;A@SX +JQT008U5o8=mo?l?Q140~2RdD@RdglRDQTjBT0~2SD00RdD<PgQTog@CRdD<RdQTRdD@RDQTj@`0 +~2Rl2;AA37@6CoooooRdD@PgQTogD5jAL1~2RdD@IX=hHP<?QEh0~2RdD@PgQTo`n<5@0008]5 +48=hI?l?S`P0~2jCL0~2SD00RdD@og1T^^PF0`2Qd4l308?\2>SPE@00^NA?0`2;5M1?0`1V^0@0 +j71@~2j2]B~2Pl@<jFL0~2SD00RdD@IX=hHP8?QEH0~2RdD@PgQTo`n<5@0008]548=hI?l?S`P0 +~2jCL0~2SD00RdD@og1T^QPG0`2Qd4l308?\2>QdE@00^NA?0`2;5M1?0`1V^0@0j0A@~2j;mA +~2Pl@<RdD@IX=hHP9d3X]546J3N683M0C[<H_0RdD@og1T^T`G0`2Qd4l308?\2>PXE@00^NA? +0`2;5M1?0`1V^040j;Q?~2Pl@<Pl@<bL=ERnb3k129A@R9E@b9CA2;A@SXOAT008U5o85mo040 +080?Q140~2RdD@RdglRDQ\jBd0~2SD00RdD<PGQ\0@00P7@DRdD<RdQ\RdD@RDQ\j@d0~2SD00 +RdD@ad1\0@00P8]5485hK040081d>h]548]0K8?\1>P@=P00Pl@4D;Yd5`<0XM1?0`23k0SXNU@0 +0;WTC`<0RaG@C`<0I[P10>P:C`00Pl@<Pl@<bL>;`5F;k8?\7:4\F0<0mm2S;5P30:70C`<00`El +D`<0XgaC0`1X80030;V4CP<0^PaC0`1VXHAC0`23k0cXYO;ooh?4488mj@43004?QA\0~2X@@f +0`0i1F1C0`0?Q0X0~2^0aC0`3XhQ<0088mm@43005d4H8m?003005d2>Ve~3SD00X@Pf0`0i1@aH +0`0?Q:40~2aTGo06J3?AYH0`023hF5~3XBQH0`2ImcdLF0<02m8?Q740~2XAaH0`031BQH0`18 +RDGdRdGdVOLm75P308U5m:4LF0<03jm5m8U5n8]5n2\5:5P308U5n<M5l000~2Rl2;AOPiAO1m +:;VhE`<0^[AG0`2h0@000>PPD000XBQH0`10XbQH0`2;AO10RDG`jm36AOl1^;QG0`3X5Q<00?le +O5<30;ZL5`<0XM1?0`23k0SX3U<00;WTC`<0RaG@C`<0I[P10>RNC@003kl5X503052ja1L30:7@ +C`<0Pn`8j>1B~2^NA?0`2;5M1?0`1V^040j71=~2Pl@HPSe800<00@n5m0000:4XF0<0>@GdCP<0 +3hDg~3ocDXF0<0^^`G0`2Qd4l308?\2>RCDP00^NA?0`2;5M1?0`1V^040j2==~2Pl@<jJX0~2 +SD00ocDXF0<0^QPH0`2Qd4l308?\2>QLDP00^NA?0`2;5M1?0`1V^040j>a<~2Pl@<PWgo0@n5 +?`0003?0X;AG0`1@<l2P]5L3052j@1P30:7@C`<0Pn`8j1UB~2^NA?0`2;5M1?0`1V^080j:U< +~2Pl@@jC00~2o?lem4h30;Y`60<0XM1?0`23k0SXi5400;WTC`<0RaG@C`<0I[P20>QdC000Pl@< +jBl0~2ocDXF0<0^Z0H0`2Qd4l308?\2>R`D@00^NA?0`2;5M1?0`1V^040j41<~2Pl@<PSe\00<0 +0@n5Z0000:4\F0<0>@GhCP<03hDg~3ocD\F0<0^]PH0`2Qd4l308?\2>QSD@00^NA?0`2;5M1? +0`1V^040j?=;~2Pl@<jEh0~2SD00ocD\F0<0^PPI0`2Qd4l308?\2>P\D@00^NA?0`2;5M1?0`1V +^040j;a;~2ocGhCP<0^S@I0`2Qd4l308?\2>P0D@00^NA?0`2;5M1?0`1V^080j91;~2Pl@HjBl0 +~2ocD\F0<0^V0I0`2Qd4l308?\2>S<D000^NA?0`2;5M1?0`1V^040j5a;~2Pl@<PSd@F0<00G@F +PCdTF0<00@00P7@:^;QG0`3X_TH0088mI@43005e5j4<=P<0>@DhD0<0M0Zhi4l30>QV4000Pl@< +bL?lEH_\Pn`8RDD8J=`I0`1Xa1T306Rh6@<0^YPI0`2Q33H308?\2>SFC@00ogD8^^PI0`2Q33H3 +08?\2>S1C@00^_PI0`2Q33H30>RbC@00^S@J0`2Q33H30>RSC@00ocD`0@<0J5XJ0`2jD1X30:4< +=P<0Pn`8j8I=~2J7`J0`3o=C`10`1XMaX30;YP6P<0X@`f0`23k0SXI4d006S=6P<0J<`J0`3o +=A000`1XbQX306S96P<0J<PJ0`3o=@`00`1Xa1X30?leB04306Rn6P<0^X0J0`2Q33H308?\2>PM +C@00ocED0@<0J=XJ0`2jd1X30:4<=P<0Pn`8j01=~2J?`J0`3o=JP10`1XmaX30;[P6P<0X@`f +0`23k0SXgT`006PL6`<0ocEP0@<0J1TK0`2j01\30:4<=P<0Pn`8j;a<~2J6@K0`3o=F`10`1X +H1\30;XP6`<0X@`f0`23k0SXVT`00?leN04306Qb6`<0^VPK0`2Q33H308?\2>QmC000J9`K0`3o +=K@10`1XV1\30;Yh6`<0X@`f0`23k0SXFd`006Rh6`<0ocF40@<0J;<K0`2jX1\30:4<=P<0Pn`8 +j3U<~2J=@K0`3o=I010`1Xd1\30;Zl6`<0X@`f0`23k0SX5d`00874304006Sd6`<0ocFL0@<0 +J>lK0`2jf1\30:4<=P<0Pn`8j>m;~2ocG00@<0J08L0`2jn1\30:4<=P<0Pn`8j=9;~2ocG<0@<0 +J1<L0`2j21`30:4<=P<0Pn`8j;E;~2I\L50E<300@0j7]:~2Pl@dPl@8bL>=@01ERnb3k0b9A@R9 +E@aVa`D1D`<00@37AO`04000RdGlj9QU~2Xm1?0`23?M1?0`003hDV~3ogGl^QPL0`2Q33H308?\ +2>QAB`00I\L50E<300@0j1M:~2Pl@<PSg8C`<00GDg^T`L0`2Q33H30>PXB`00RdGlD;YD70<0 +X@`f0`23k0SX4T\00;Z570<0X@`f0`3X0d\008?43;Z870<0^008~2j<d;~2X`a?0`2jU1`30;P0 +2000j;T;~2Xha?0`1Xl04306ST0@<0J3010`1XY1`30;VP70<0ReD<RdD8Pn`<j3To~2Pl@LPSeI +0@<00GD:^:PL0`3XVocooh8m=@43005e<h8mI@43004?U<23h063`?lK`40;`0n44@000<H5I@43 +00771FP10`00~3aPG8C`<00H8mj@43004?U<23h063`?lK`40;`7@:^;PL0`3X?_coonSIe?oo +j;c4oooX@oSoonSnB000^000~2j`^=@02h~4j`7lPl@8bL<0~2EH_\PN`H0P00RDD8IXUE38U= +4;T1~3^^0L0`2=QOcmoooX66H008f5o?gooe2=QO[moom@^^@L0`2;A@R3k0SXYT`008?448V5 +m?gooh>mm?goo`9m?X]55?l`^_@L0`2Qd4l308?\2>PAC000^NA?0`2;5M1?0`1V^0@0j:56~2 +ReD8RdDHj8hX~2j558~2Pl@<SHGloOooj:L`~2IX]536HiQO[moome6XfEo?gooh]54>SlJP00 +2l1e2;01j@D0~2o;00j`23a0c9`he005F;k8?\38U528UE38]5289h104?Q6\0~2^1@M0`3XfBl0 +08_8RdD<R@Rii4l30;XL7@<0I[P10>PCAP00^NA?0`2jC1d306Jh0P3X04H006RH7@<0^W@M0`2Q +d4l308?\2>Q5B`00^NA?0`2;5M1?0`1V^?ooj=E5~2Pl@<jD40~2o8]528]02>Q];`00RlR;A@b9 +28]53?l`^Z0M0`2Qd4l308?\2>SoBP00^NA?0`2;5M1?0`1V^040j8m5~2Pl@<Pl@<bL>=@01E +Rnb3k129A@R9E@b;A@aVa`0008]5289h104?Q1\0~2^NA?0`2jb1d306Jh0@3XD4D00>V?~3SD00 +ogD<^_PM0`2;A@R;@0R3k0SXnTX008?438U5o8=mo05d>X]52?m`28]52?l`^_`M0`2Qd4l308?\ +2>QUBP00^NA?0`2;5M1?0`1V^0<0j?E4~2Pl@@jC40~2o8]530no052j91h30:7@C`<0Pn`8j2m: +~2^NA?0`2;5M1?0`1V^040j;m4~2Pl@<Pl@<bL>=@01ERnb3k129A@R9E@b9CA2;AA1Vad1Roon; +A@R2N0@13h@K~3^NA?0`2jC1h306Jh0@3XO4@00>WC~3SD00JP1V^@00RdD8Re08RdD<Pn`<j3dA +~2Pl@@IXU5oPnoAOkYQ@000?b;A@`?_dgnocB8^W`N0`2Qd4l308?\2>R<B@00^NA?0`2;5M1? +0`1V^040j1a4~2Pl@<RdD@IX]=oVJ9B6;YH@000?b;A@SoL0R;A@So<;ZT7P<0XM1?0`23k0SX +AdT00;WTC`<0RaG@C`<0I[P30>SG@`00Pl@@jbZ;`>TS~3SD00PoP23hAcooooPoP13hAZoooo +PoP33hAQoooojj>=@03[0X_0Pl@<bL>=@01ERnb3k129A@R9E@b9CA2;AA1Vad1Poon;A@R2N0@1 +3h@K~3^NA?0`2ja1h306Jh0@3XI4<00>W7~3SD00JP1V^@00RdD8Re08RdD<Pn`<j2D@~2Pl@@ +IXU5oPnoAOkYQ@000?b;A@`?_dgnocB8^_PN0`2Qd4l308?\2>QdB000^NA?0`2;5M1?0`1V^040 +j0A3~2Pl@<RdD@IX]=oVJ9B63YE@000?b;A@SoL0R;A@So<;XP7`<0XM1?0`23k0SX;dP00;WT +C`<0RaG@C`<0I[P30>Ro@P00Pl@@jaj;`>TG~3SD002l0?Q7Cooon3n04?Q6_oooo[[Oc[0X_0 +Pl@<bL>=@01ERnb3k0b9A@R9E@b;A@R2N0@13hA[~3^40O0`3X6B`008_8RdD<R@Rii4l30;Y8 +7`<0I[P10>QC@P00^NA?0`2jN1l306Jh0P3X@48006S87`<0^Z@O0`2Qd4l308?\2>R5A`00^NA? +0`2;5M1?0`1V^?ooj1E2~2Pl@<jD40~2o8]528]02>R]:`00RlR;A@b928]53?l`^]0O0`2Qd4l3 +08?\2>PoA`00^NA?0`2;5M1?0`1V^040j<m1~2Pl@<Pl@<bL>=@01ERnb1k1`4~2RDD8RED<RdD< +ad1Toooooh]53<M0J?oooon;A@R2N0@13h@\~3^NA?0`2jn1l306Jh0@3XPD400;WTC`<0^RPP +0`1V^040j6i1~2jOd1~2o8f5m?_ooe2=QOSmoom@^UPP0`2;A@R;@0R3k0SX3dL008?448U5o8]5 +o>Vi0@00o8]538?0J52jH20308f5m?_ooh?\2>SVAP00Pl@<RHG`noooPkg`nooo0GDHRdD<PgQX +07`?RdD<PGQXool007l3jdGlRdD<ad1Xoooooh]52?m`28]52?l`^V@P0`2Qd4l308?\2>PYAP00 +^NA?0`2;5M1?0`1V^0<0j;U0~2Pl@@jC00~2o8]53?m`J;Z@80<0XM1?0`23k0SXm4D00;WTC`<0 +RaG@C`<0I[P10>R4@000Pl@<jA01~2RdD<Pl1TD;Zh80<0SHGhoOooPn`8j2Y6~2Pl@<RHG`nooo +Pkg`nooo0GDHRdD<PgQT07`?RdD<PGQTool007l3jdGlRdD<ad1Toooooh]52?m`28]52?l`^[`P +0`2Qd4l308?\2>Q]A@00^NA?0`2;5M1?0`1V^0<0j?do~2Pl@@jC00~2o8]53?m`I;[X80<0XM1? +0`23k0SX>4D00;WTC`<0RaG@C`<0I[P10>S8?`00Pl@<jE@0~2RdD8og08RdD8oc2j42430:7@ +C`<0Pn`8j?m4~2^NA?0`2;5M1?0`1V^0<0j8lo~2Pl@@jaj;`>TG~3SD00PoP23h@oo_ooPoP1 +3hCbo_oojjb3a0c9`he005F;k8?\48U528UE38]53<M0K040082;A@R2N0@13h@I~3^NA?0`2j +>24306Jh0@3X;Sl00>VE~3o8]528]02>QE4P00RDGlPGgl0@00P7A9RdD<RdglRDQ\RdD<Rd1\ +Pn`4j=HU~2Pl@4D;YX8@<0XM1?0`23k0SX@4@00;WTC`<0RaG@C`<0I[P10>S@?P00Pl@<jC@0 +~2RdD8og08RdD8oc2jT2430:7@C`<0Pn`8j0M4~2^NA?0`2;5M1?0`1V^0<0j9Ln~2Pl@@Pl@< +bL>=@01ERnb3k1B9A@R9E@aVRDd@RdDHa`00~3^[0Q0`2h0@800>P\0P00RDGlIX=m408?QGh0 +~2ogGl^\@Q0`2;A@R3k0SX2d@008?438U5n8=mn04?QAL0~2RdGlj=LW~2RlR;AAR92>U1~3SD00 +RdDDoc2jd2430:7@C`<0Pn`8j653~2^NA?0`2;5M1?0`1V^0@0j?4m~2ReD8RdD<j=hO~2j:4o +~2Pl@<jGL0~2o?meo;[d8@<0RdD8Pn`8j8e3~2Pl@<RDGhPggh0@n55@0008]5o>QI9`00RlR; +AAR92>To~3o8]55?l`^P@R0`2Qd4l308?\2>SU@P00^NA?0`2;5M1?0`1V^0@0j7Dm~2ReD8RdD< +j68O~2j2Do~2Pl@<RdDHR`3XO2L008]55<I0106;AOcX0EL008?43<W3EH_\Pn`DDh?\38U528UE +38U=4?b;CAB;EA2;A@SX`S<008U5n8]548]=2<I42?l0Pggh00n=2P000;P0~3jL00~2RdDHRDG\ +RaR;AA3X668008_;0lR;ANb92;X:~3RdD@j88R~2RDGlPggl07@=RdGlaP00j@h0~2Rl2;AA2; +G@Q;0l>9AOb;AAB9AO2;F5a3RdG`REQLPgd<07@:RdD<PSP0M0;[4>U;~3SD00jC\0~2SD00RdD< +j:QQ~2RDGdIX]=m0nobH]E38]54>So80002l0?QA<0~2RdD@Regd0l>9AA3Y2`0008e00>TKoooo +SD00RdD@j`>=@023a0aKbL<005F;k8?\58U528UE38]528U5o8]5o>PZF@00RDGhPggh07DmogD< +RdGlD;Y\8P<0XM1?0`23k0SXF4400;WTC`<0RaG@C`<0I[P40>SX>`00j:<m~2Pl@@jDX0~2SD00 +PSg8C`<00@n5>P000;ZH8P<0X@`f0`3XZ3h00?me38]5o52jX2830:4<=P<0Pn`8j8ln~2^]DR +0`2Q33H30>R0?P00Pl@@RdGhj`23a0c9`he005F;k8?\58U528UE38U=48]54<I0102;AA37@0P0 +~3^]PR0`2h0@800>PMooooRDGlogGl^^`R0`2;A@b3k0SX1d4008?438U5n8=mn04?QC<0~2ogGl +^_PR0`2Qd4l308?\2>Qf@000^NA?0`2;5M1?0`1V^040j0Hk~2Pl@<jC\0~2Rl2;AA3o<;XL8`<0 +XM1?0`23k0SX@D000;WTC`<0RaG@C`<0I[P30>SA>P00ReD<RdD8j;hL~2Pl@<RdGlj7=D~2Pl@< +bL>;`5F;k8?\48U528]528=hE00?Q4T0~2RdD8Rd1Dj2M6~2RDGlPggl00n4<@000?me2;Y08`<0 +XM1?0`23k0SXcCl00;WTC`<0RaG@C`<0I[P30>QM>P00j9`Y~2Pl@<Pl@<bL=ERnb3k0b9A@R9 +E@b;A@R2N0D13hA3~3PSg8C`<00@n5;@000;YH8`<0X@`f0`3X1cd00;YP8`<0X@`f0`3Xn3`0 +0;ZF8`<0X@`f0`3XjC`006JhoooY:04006X0I[T108]528]@28]538?\3>Rm1P00Pl@@IXU5oPno +AOkYV@000?b;A@`?_dgnocB8^YPS0`2Qd4l308?\2>P<?`00XM1?0`3XT^kooh?43>V6~3Rl3Y +O`0008e008]530noCOko=8Rjc2<30:7@C`<0Pn`8j=@n~2XM1?0`3XF^kooh?43>U>~3Rl3[BX_0 +RdD8og08^P0T0`2Qd4l308?\2>RT?P00XM1?0`3X:^kooh?43>TN~3Rl23n08?Q5oooon3n05d +RX?h0gB=2l1d^N^kSD00PSg8C`<00GDm^Q@T0`2Q33H30>S\>`00RdD<3km=o_ldR;XL90<0X@`f +0`23k0SXd3\00;Y<90<0X@`f0`3X`C\008?436J;AOk[08?42<W3SD00EH_\Pn`<RDD8RED<RdD8 +PWP50@n4@`00088mb4l3004?QBd0~2^U0T0`2Q33H30>Qk>`00^UPT0`2Q33H30>Q\>`00^XXT +0`2Q33H30>QM>`00I[SoonV\~3JP1V^@40RdD8Re08RdD<Pn`<j345~2Pl@@IXU5oPnoAOk[<>\j +Rl2;A@SoL0RjS2@30:7@C`<0Pn`8j8@m~2XM1?0`3X2^gooh?43>T>~3Rl0;`7C<PoP1M<O[bOb2 +?LQ?0`01MCfjX2@30:4<=P<0j=`j~2RdD<3km=o_ldR;ZX90<0X@`f0`23k0SX`3X00;[D90<0 +X@`f0`3X\CX008?436J;AOk[08?42<W3SD00EH_\Pn`@RDD8RED<RdD8PWP50@n4A`00088mb4l3 +004?QBd0~2^]PT0`2Q33H30>Q[>P00^^0T0`2Q33H30>QL>P00^QdU0`2Q33H30>Q=>P00^?oo +oooY<`4008e00<M5o?oooon=AOa@^R0U0`2;A@R;@0R3k0SXoS`008?438U5n8=mn05d9H]52?m` +2;XT9@<0XM1?0`23k0SXKS`00:7@C`<0j?C[oon3a0b;A@aVPgQR0gE7Pgglo`n<4@0008=mo?l? +S`L0~2jBP0~2Rl3oMOaZof[o^T`U0`2Qd4l308?\2>PS?000XM1?0`3XZN_ooh?45>U;~3o8]5 +36J3N682MD23OOco3h`@~3Pgglo`n?1P000>TW~3o?meo6[oJ_njQ2D30:7@C`<0Pn`8j=<k~2 +XM1?0`3XFN_ooh?4588mb4l3005e=[Zl9@<0X@`f0`3X?ST00?meo;[49@<0X@`f0`23k0SX:CT0 +0;X49P<0X@`f0`3X6ST008?438]5o>\2Rl23a0S9`he005F;k8?\38U528]5289h1@4?Q4H0~2 +PSg8C`<00@n5;@000;X89P<0X@`f0`3XeSP00;X@9P<0X@`f0`3XacP00;Y<9P<0X@`f0`3X^3P0 +0;P1~2P>Ub~3Rl2;A@R3N0P0M0n;A@R;@0R2>01d1>\BRl2=AOcXL5\00>U3~3SD00RdD8Rd08 +j<D8~2RDGlPGgl0@00P0n59@0008]52?m`2;Y@9P<0XM1?0`23k0SX`CX00:7@C`<0j4OZoon3 +a0b;AOc[0he008?42<W3SD00EH_\Pn`8Dh?\38U528UE38U=48=m300?Q1<0~2RdD<PSP03h@7 +~3j@h0~2Rl1V^?oojEL1~2SD00I\M5n_ooI\M5n000RdD@3km=n6_938<l200?Q=00~2RdD@3km= +n6_938\42>P2FP00RDGlRdglReD<RdD@3kmMn6_K38\46>QC6@002l0?QH\0~2PSg8C`<00@n5 +@0000;Yh9P<0X@`f0`3XQcL008]540noCOQ[b@co=0RjP2H30:4<=P<0Pn`8j6Pg~2^Z\V0`2Q +33H30>QI=`00Pl@<IX=mnP1m3fJ;AOQVRDGjjBX0~2Rl2ii4l30;Z`9P<0I[P30>Q1=000ReD< +RdD8j2hF~2I[SoonUe~3o6J;AOQV@6J9AOSY7OooooaVPggj07eAPSg8C`<00@n5=P000;[<9P<0 +X@`f0`3XiCH00?me3;[D9P<0X@`f0`23k0SXd3H00;X79`<0X@`f0`3X`CH008?436Jhooo[5>T? +~3SD00IX]5n^T3~3SD00Pl@<FlW3Rl1ERnb3k0QVRDD8RED<RDd@I\M5oP00Rl1VRdD8IS]5oPn6 +IP0003?0IX]5oXU5n6K7AO`008e006J;AOaVPoP8LbkfAOP13h@@~3RdGhdNPcA@b9AOSY2000 +08]5n=7XRDGhIX]5o6I0IXU5o>_8RdD@<lUVRdgnReGhRAB8IX]5oVI0IXU5o^^=o<W3Rl1ERnb3 +k0aCPn`<RDD8RED<IXU=48=m300?Q180~2RdD<PSP03h@6~3j@d0~2o6Jho_oYj`0008e008]5 +3>P4F000RDGhI\M5m_ooI\M5oP00o8]520noCOj3?8P03hBg~3IX=m400?QA80~2RdD83km=oX\4 +R>S9E`00RDGhIX=m501e@h]=n8]E38]520noGOj;19SX5QL000_03hDP~3IX=mm_l?Q@l0~2IX]5 +oVJ9AOKY200008_0I\M5m_kojCl0~2o8]=n8]E38]520noGOj;19SXAaH000_03hDQ~3IX=mm_l? +QA00~2IX]5oVJ9AOKY2@0008e006K7AOKnofJ;AOiV@6J9AOkY>oooohe006J;AOK[0X_0Pl@< +FlW3Rl1ERnb3k1b9A@R2?LQ?0`013hE5~3^P`W0`2Q33H30>Rk=000RdD8og0<RdD8og0@RdD8 +og0D^Q@W0`2Q33H308?\2>RG=000^ShW0`2Q33H30>R8=000Pl@DPSg8C`<00GE4^T0W0`2Q33H3 +0>Q]=000RdD8oc2;A@SoL0B;A@SoL0RjB2L30:4<=P<0Pn`8j4Xd~2^W8W0`2Q33H30>Pk=000 +Pl@DRdD8PgPDAWd;^000~2jLT1~2o<M5o000~2adGd\PL008_0RdD8Rd0D1F`7~2>dGd3hid~3 +RdGl1Fd1~2RDGlRdGdVC?2:l:3h0<c`R_22l0?QDH0~2RdGd^F@0~2VOOi2m8?QAl0~2RdGd^I01 +~2VOOi2m8?Q0`0~2adG`~4j@L0~2adG`0@0008=ml05e1h]5o429AOb;AOA0RDGdjGSoooo7AO@0 +~3o8]528]=m3U840n>W@0008]=m8]5o0<4SC`R0`29AOb3OO@13hEg~3RdD8Rd0D1F`7~2VC?2 +:l:3h0<c`R_22l0?QEP0~2RdD8Rd0D1F`7~2^F@0~2VOOi2m8?QBT0~2RdD8Rd0D1F`7~2^I01 +~2VOOi2m8?Q0h0~2adG\~4j@T0~2Rl37AN`1~3Pgg\0GD7RdGl@8U5o8]5m429AOCYE?oooh]5 +28]034P3AOb9AOb;A@R;@0QY`10>~2RdglJLV0D@400lR;A@R;@0A[`3`3`H]=20<1RDGhPSg8 +C`<00GDf^W@W0`2Q33H30>R9<P00ogGh^W`W0`2Q33H308?\2>Qd<P00^Z<W0`2Q33H30>QU<P00 +Pl@<RdGhj`7lPl@8bL>=@01ERnb3k0b9A@R9E@aVRDd@RdDDad1D~4RdDDI\M0H040RdDDI\M0 +HP40RdDDad1Toooooh]55<M0J?oooon;A@R2N0D13h@o~3PSg8C`<00@n5;@000;ZX9`<0X@`f +0`3Xjc400;Z`9`<0X@`f0`3Xg3400;[Z9`<0X@`f0`3XcC400>UB0@00RdD8PgP800n4N`0008]5 +28]@28]55>R9D`00RddD^^`W0`2;A@cXHAT0088mb4l3004?QCH0~2^_0W0`2Q33H30>R1<@00 +ogDD^_PW0`2Q33H308?\2>Q\<@00^QdX0`2Q33H30>QM<@00Pl@<ReDDIX]54>SJ7P00RlR;AAB9 +B5CY9P000?bi1`000;XP:0<0RdDDj5i=~2RdDDR`d<=P<0RDQDRdDDaT1H0H]558=hE01e<Ome +5;XX:0<0XM1?0`23k0SXKC<00;WTC`<0RaG@C`<0I[P40>Sm;@00j;P_~2Pl@<RdDDPWQH0G@@ +RdDDj7`P~22\1d1>]DRl22?LQ?0`013hDf~3^T@X0`2Q33H30>R\<000ogDD^T`X0`2Q33H308?\ +2>RG<000^WHX0`2Q33H30>R8<000Pl@<RdDDaT1H0H]55>R::P00Pl@<bL?lEH_\Pn`DRDD8RED< +RDd@RdD@aT0408]54<M02000~2^WPX0`2h0@800>PMlOooRDGlogGl^X0X0`2;A@b3k0SX1c<0 +08?438U5n8=mn04?QAl0~2RdGlj=<F~2RlR;AA29B0R;AA36@0@1jC`0~2SD00RdD@oc2jR2P3 +0:7@C`<0Pn`8j5Db~2^NA?0`2;5M1?0`1V^0<0j>D\~2ReD<RdD8j=8>~2Pl@<RdGlj8M6~2Pl@< +bL>;`5F;k8?\>8U52<M5n0400823O@P03h@B~3RdD8PSP03h@6~3j@d0~2o;P1~2P>T>0`00Rl22 +?LQ?0`01MCJj[2P30:4<=P<0j6@_~2ogD8^[@X0`2Q33H308?\2>Q?;`00^^@X0`2Q33H30>Q0 +;`00Pl@<adGX\PL00<M5i040~2adGP0@000<M5g000~2adGH~4adGD~4SDGDD8e5f52=AMa@SDGP +D8e5i52=ANQ@^^PX0`2;A@R3k0SXac4008?488U5o8=mo05l2h=mo0Io1N\kSD00ogD8^PPY0`2Q +d4l308?\2>P_<@00^NA?0`2;5M1?0`1V^0<0j;l[~2Pl@<^040083Y;P8008_0PGgX\PL007`; +PGgXm@L007l2jcSoMNRj;2T30:7@C`<0Pn`8j><`~2^NA?0`2;5M1?0`1V^0<0j7<[~2Pl@<^040 +083YhP4008_0RdGX;F`7~2RDGXPggT0G`;PggT37l5jc^=@03oMNBjI2T30:7@C`<0Pn`8j8l` +~2^NA?0`2;5M1?0`1V^0<0j1l[~2Pl@<^040083YSP4008_0RdGTB8U5i8=mh05l2h=mh1mo1N\k +SD00ogGP^Y@Y0`2Qd4l308?\2>Po<000^NA?0`2;5M1?0`1V^0<0j<lZ~2Pl@<^040083Y?P40 +08_0PggL07`:PggL5gl4jcZ;`?meg;[4:@<0XM1?0`23k0SXmbl00;WTC`<0RaG@C`<0I[P30>R7 +:P00Pl@<^040083YmP0008_0PggH07`:PggH>gl4jcZ;`?mef;[d:@<0XM1?0`23k0SX[bl00;WT +C`<0RaG@C`<0I[P30>Po:P00Pl@<^040083Y[P0008_0PggD07`:PggD>gl4jcZ;`?mee;XX:P<0 +XM1?0`23k0SXIbl00;WTC`<0RaG@C`<0I[P30>Sg:@00Pl@<^040083YIP0008_0adG\~4adG` +~4adGd~4SDGDj=Ogoon9AOR2?LQ?0`01MCJjG2X30:4<=P<0j9`\~2ogGh^V@Z0`2Q33H308?\ +2>R7;000^X\Z0`2Q33H30>Qh;000Pl@<RdGhj`23a0c9`he005F;k8?\;8U528UE36J9CA36AN<1 +^Y0Z0`2h01000>PQkOooRDGTRdD8RDGladG`~4o8]5o88h07@LR`eTC`<0RdGl<m::43?0IX\4 +DOK027@4j`J;`>\>Rl2;AOa0RDGljln=@02;AOb2>01e4>UK0@00SD00j@T0~2SD00RdGlRDGX +Rl2;AOb2>01d98\=I4l308]5o3?BRQ0c`6J;1563h0R3`?lK`40;`7@4j`J;`>\>Rl2;AOa0RDGl +jlN=@02;AOb9AOB;AO@[ANQ0RDG\Rdg\ReGXRdGTj2i>~2RdGTRdg\aP@808]538]=l8e4B0Q@ +^Y`Z0`2;ANB3k0SX?Bh008?438U5n8=mn05d=Omei8]5l41@^Z0Z0`2Qd4l308?\2>R[;@00^NA? +0`2;5M1?0`1V^0<0j3\X~2Pl@@aTGS08]538]=l6J3O4P8og`BRdD<Rdg`IX5lB0So07l3jcol +RdG`@52;A@b;CO0?_dA8252je2X30:7@C`<0Pn`8j4d]~2^NA?0`2;5M1?0`1V^0<0j=dW~2Pl@@ +aTGS08]538]=l6J3O4P8ogD?RdD<Rdg`IX]E46J9E4P8RdG`@8U5l>UUo_ooo89mh`5e>H5ml001 +~2M33oMO2j22\30:7@C`<0Pn`8j>@\~2^NA?0`2;5M1?0`1V^0<0j7@W~2Pl@<aTGS08]5i>PM +@@00RTGSj`23a0c9`he005F;k8?\98U526J9E@b9CA2j>2\30;P10P00j07[oon9AOb;A@QVad1P +0@2;A@QVad1R0@2;A@S7@6CoooooRdD8ad1Xoooooh]52<M0G000~2RdD8j8XF~2RlR;A@R9B5B; +A@R3N5@03hDa~3ogD8^T0[0`2Qd4l308?\2>P`;000^NA?0`2;5M1?0`1V^0<0j<0V~2j7\X~2 +Pl@<RdD@aP00aTGc0H_0RdD@j<a;~2RDGdRdD8RDGXRdQL@H]5j8U8G8]=28]Eo;P00P00j24M +~2RDG\Pgg\00n=B00008]528]0E?I0204?Q0P0~2jLl0~2SD00^NA?0`2jJ2\306Jh0`3XBBH0 +0;X0~3RdD8j3@8~2j7\E~2aTGc0>VN~3Rl2;AOc6P?l1~3^PX0~2RdGlj;d8~2RDGhPggh07@6 +RdGhaP00RdGlj2I;~2RlR;AO@3`HU5m0noA@`kAOAl4h]Eo8]54>P`BP00jD<0~2SD00ogGd^X`[ +0`2Qd4l308?\2>PO:`00^NA?0`2;5M1?0`1V^0<0j:lU~2ReGlRdD8j9`7~2Pl@<aTGc0>T8~3 +jNOnoon=@00?_dD<>dGdOS3oMOBj_2\30:7@C`<0Pn`8j<hZ~2^NA?0`2;5M1?0`1V^0<0j5hU +~2Pl@<aTGc08]52>RKj_ooRdGlj?ln~2RTGcj`:;`8?43<W3SD00EH_\PN`d0P00RDD8RED<RDd@ +RdD<I\M0H040RdD<I\M0HP40RdD<ad1Toooooh]53<M0J?oooon;A@c7@5`0~3RdD<j7XD~2RlR; +A@b9B5B;A@b3N5@03hDa~3ogD<^_0[0`2Qd4l308?\2>PP:P00^NA?0`2;5M1?0`1V^0@0j;0T +~2j6\V~2Pl@<^Q@\0`2h01000>QQj?ooRHGLoOooRhGLoOooaP00aXGUoOoo0He008:miOgoo`4? +QF\3~2RhGLoOooj919~2RHGdoOooRdD<RHGHoOooRdQL@H^5f?goohU8G8]=38fEo?gookP00P00 +j=TJ~2RHGhoOooPkghoOoo00n=BP0008]538]0E?I0204?Q0H0~2j@T3~2o;WTC`<0^R0\0`1V +^0<0j?dS~2^P00~2RdD<j>P5~2j2lC~2aXGUoOoo0>W?0P00SD00aTGj2\I5n`2j8`0008f5o?go +onQ\1P00RHG`oOooPkg`oOoo07@ORhG`oOooaP0:RhG`oOoo@8V5l?gooh^5l?goolH00;X:~3 +SHGloOooj2h6~2RHG\oOooPkg\oOoo07@9RhG\oOooaP0PSHGloOooj8]8~2RlR;QOCmool3`HV5 +m?gooh]5289h105e6X]5289h705e4H]5289h405e2>T[0@00SD00Rdd8SIGloOooRdD<j=O]oomV +RHGVoOoo3kn5i_goonWD~3jOL0~2SD00RdD83kn=i_goof_9389l20@1MEB;A@P?_hgVoOooJlT< +oc@8^T0\0`2Qd4l308?\2>PZ:000^NA?0`2;5M1?0`1V^0<0j;XR~2SIGloOooRdD<j:@4~2Pl@< +aXGUoOoo0>TN~3o8]=20noQNKmoom[`0`3b8fEo?gooh]53>Skm?oojFX0~2Rl1XS2`30;Y\;0<0 +XM1?0`23k0SX_BL00;WTC`<0RaG@C`<0I[P40>Q=8P00j0PT~2Pl@<jc>=@03Y:`0008e008?h +o`n48oooo`_03h@SooooPoP23h@JooooPoP13h@Aooooji^=@03Yn`0008e008f5h_gooe2jV2`3 +08]528]088?\2>Rf9`00Pl@<RHGXoOooPkgXoOoo0GDHIX>mh_goo`1l3VJ1_N;moooo07l3jdGl +RdD8og0PRdD8og0H^Y`\0`2Qd4l308?\2>P29`00^NA?0`2;5M1?0`1V^0<0j98Q~2Pl@@aXGU +oOoo0>Uk~3SD00PKgdoOoo010007lHSIGloOooRhGLoOooj;=5~2jDh0~2Rl3o]OCmoonjd2`3 +0:7@C`<0Pn`8j:0V~2^NA?0`2;5M1?0`1V^0<0j30Q~2SIGloOooRdD<j1X3~2Pl@<aXGUoOoo +0>T;~3SD00jH_loon=@02;A@cXC>Kooh]5289h105d>h]52?l`^_`\0`2Qd4l308?\2>Pl9P00 +^NA?0`2;5M1?0`1V^0<0j<`P~2Pl@<aXGUoOoo0>V^~3o8]5289h705d>h]52?m`6;XX;@<0XM1? +0`23k0SXmbD00;WTC`<0RaG@C`<0I[P30>R78000Pl@<aXGUoOoo0>UY~3RdD8PWP@0G@kRdD8 +og0<^U@]0`2Qd4l308?\2>Rc9@00^NA?0`2;5M1?0`1V^0<0j4<P~2Pl@<aXGUoOoo0>TU~3RdD8 +Rd08j=D9~2RlR;AA2928]528]05>S32@00RlR;AA29B0B2_NGmool1MA]VRhgRoOooReD@RhGL +oOooj7Gfoon8QNGmoon;QMcmoooXV3T006Hc`8Z5iOgoon\1o8?43<W3SD00EH_\Pn`4Dh?\36J9 +A@R9E@aVRDd@I\M5oP00o6J;AA1V>DGnOAZ;AA@?_dgnI\L4B?ooIX]5oVI0IXU5o^_Mo6K7AOh0 +08_0IX]526HiAOh?SH80~2RdDDReD<3kmMoS?9RP`JIX<lB?l?QA`0~2RdDDReD<3kmMoS?9RP`J +IX]EoVJ954SY>`0008]M30noCOhc`8X42e2jP2d30:7@C`<0Pn`8j7dT~2^NA?0`2;5M1?0`1V +^0<0j0dO~2j<PP~2Pl@<IX]5oVI0IXU5o^UbooooRl23a0aKbL>;`5F;k8?\48U528UE38U=48]= +2;Zh;@<0^000~2j7\9~2RdD<a`00~3RdD<ad04~4Rdd<ReD8RdD@j7;ioomVRDGnIX=moP0?SC40 +~2ogD8^[`]0`2Qd4l308?\2>SR8`00^NA?0`2;5M1?0`1V^0@0j78N~2j2dP~2Pl@<ogD8^^P] +0`2Qd4l308?\2>Ra8`00^NA?0`2;5M1?0`1V^040j44N~2RdD<og04RdD<oc2j42h30:7@C`<0 +Pn`8j80S~2^NA?0`2;5M1?0`1V^040j10N~2Pl@LPl@<bL=ERnb3k0b9A@R9E@b3O@`03hAR~3 +ogD8RdD8og1L^T0^0`2Qd4l308?\2>Pc8`00^NA?0`2;5M1?0`1V^?ooj<<M~2ogD<^V0^0`2Q +d4l308?\2>P:8`00^NA?0`2;5M1?0`1V^?ooj9XM~2Pl@LjC@0~2Rl3oM@R;A@SoL5bjK2h30:7@ +C`<0Pn`8j=4R~2^NA?0`2;5M1?0`1V^?ooj64M~2Pl@@Pl@<bL?lEH_\Pn`4RDD8RED<adGl~4 +o8]528]=o88l201d;8]528]=o8YE33PD20n53P0008]528]=o0?1jAD0~2o8]5o429AOc[bhe0 +0;P0~3j`7lbL>;`5F;k8?\55>9A@R9E@c7AO`0~3RdD8RdglPS`807DDRdD<RdglPS`807D8jL\0 +~2SD00R`eTC`<0RdD8Regl<m::51Pc`6J;157f`40?Q2@0~2XFA?0`2;E@R;GO`cbHX<6VJ;Q4P2 +0P003ko0RDG`j@l0~2o8]M28]=o3?0RP@;RDG`RdG`RDGhRaeTC`<0RdD<ReGl<lV:310c`6J; +14_f`41d8:5TC`<0Rdd<ReGl<m^:715VRhAH0P8000no`8U5k>\>Red<Rdgl<l2:10^9ANb;ANb9 +AOB;AO@iAOQd38]5n2]5m>TE~3o8]5o429AOcY6?oookP0~3j`7lFlW3o5F;k8?\15>9A@R9E@b9 +CA37AO`0~3o8]543U5o7dHRdD8RdglPS`807D@RdD<RdglPS`807D4jdJ;`8]E38]Mo8]528]= +o8XD6SPD20n4800008]E38]Mo8]528]=o8XD6SPD20nE`8?P0NTG~3SD00RdGl@8U5o>^KSD00 +^000~2j`7lFlW3o5F;k8?\55>9A@R9E@b9CA37AO`0~3o8]543U5o7dHRdD8RdglPS`807DDRdD< +RdglPS`807D8jL\0~2SD00R`eTC`<0RdD8Regl<m::51Pc`6J;157f`40?Q2@0~2XFA?0`2;E@R; +GO`cbHX<6VJ;Q4P20P003ko0RDG`j@l0~2o8]M28]=o3?0RP@;RDG`RdG`RDGhRaeTC`<0RdD< +ReGl<lV:310c`6J;14_f`41d8:5TC`<0Rdd<ReGl<m^:715VRhAH0P8000no`8U5k>\>Red<Rdgl +<l2:10^9ANb;ANb9AOB;AO@iAOQd38]5n2]5m>TE~3o8]5o429AOcY4?oookP0~3j`7lFlW3o5F; +k8?\38U528UE38]52>Q\?`00RDGhRdGhB8U5o8_0Pggl07`^RdD8RdglRUD<>1@83hD@~3RdD8 +Rdgl0l7Y5`0008e008]5o4R9AOc[che00;P0~3j`7lPl@4bL>=@01ERnb3k129A@R9E@b;A@SX +23l008U5n8]5n4R9AOb;`8=mo01l=X]528]=o3?BRQ@8RdD<j6?lool;`0n43`0008]528]=o0?1 +jAH0~2Rl2;AOa8RDGljlN=@02h~4j`7lPl@8bL>=@01ERnb3k0b9A@R9E@c7AO`0~3o8]528]= +o88l201d=8]528]=o3?BRQ@8RdD<j?gkool;`0n43@0008]528]=o0?1jA@0~2RdGl@8U5o>_3 +SD00^000~2j`7lPl@8bL>=@01ERnb3k31CEh?\38U5288mb4l3004?QCH0~2^X`^0`2Q33H30>SV +6`00ogD8^Y@^0`2Q33H308?\2>SA6`00^[h^0`2Q33H30>S26`00Pl@<Pgd807dcogD8^\0^0`2Q +d4l308?\2>PD7P00^NA?0`2;5M1?0`1V^080j:@H~2Pl@<adD8~4adGTP5410<M5g80ch@6;AM`5 +P54108U5f<M5o;87~2Rl2;AObI<l8[`X?P0c?2:l8;`0n59P0008]5o;UT~3VOOi2m8?QAH0~2 +RdGl^I01~2VOOi2m8?Q0<0~2j`glRdGHRDGDj@L0~2o8]5g8U5e8]5e3U527`>RdD8:dGDRDD8 +j@P0~2j@l0~2SD00RdGl@8U5o>^7SD00adGh~4o8]5n8\4QC`R0`29AN23OOP13hDm~3RdGlVC?2 +:l:3h0<c`R_22l0?QBH0~2RdGl^F@0~2VOOi2m8?QAL0~2RdGl^I01~2VOOi2m8?Q0@0~2j`V; +`8]5h429AN2;AN0?[dGT>dD8OaF;CN0?[dgTRdD8:l69A@SY2@000?cY3`0008e008]5n429AOSY +K?oooh]5n429AOR;A@RImggTRDGdRdGd@8U5m8]529WgONB9E@R;A@Ri40h009WgnHU5l8]52;T@ +3P00VOOiRED8RdD8^C`0~2VOOiRDG\RdD8^C`0~2VOOiRED8RdD8RDGXogGXogG\ogG`ogGdogGh +ogGl^^`^0`2hT4l308?\2>Ph7000adG@T4l30;\5~3_``_0`2hT4l308?\3>SV>`00RmN;bh_H +Pl@4RdG@0l>3k?SXa3D008?4888mb4l3005e>;XD;`<0X@`f0`3XNAT006R@C`<0^Q`_0`2Q33H3 +08?\2>QR6@00^U@_0`2Q33H30>QC6@00Pl@<^91?0`3[0Ob3a0aOFlW3o5F;k8?\58U528]52>Q[ +>`00@8U5n8]5n>Q3<`00RDGlPggl00n5=0000?me2?men;YH;`<0XM1?0`23k0SXKQ\00;WTC`<0 +RaG@C`<0I[P40>Sn5@00j;TG~2Pl@@ReD8RdGlj;<j~2RdGlj`:;`8?43<W3SD00EH_\Pn`<RDD8 +Pgd800n44@0008]5288h00n41@000>T8~3RdD8jEP0~2RdD8j=0j~2RDGhRdD8Rdgh0l58RDGl +o8]523U5o78LR`eTC`<0RdGl<m::43?0IX\4DOK027@4j`J;`>\BRl2;AOc6~2RdGlB8U5o>_9 +o8]52>\3SD00Pl@4bL<0~2EH_\PnaTRDD8RED<RDd@JP2=ANa@SDgdSEFXRdD@Pn`<j?XB~2Pl@D +IXU5jS?0IX]5j_K00WDFPgd807@@^@P0~2ReD8SDGdj9Hj~2<l1VRdGZm\04MAJ3O@`0M12i1000 +08]E38e5k>Qe>P00ogD@JP2=CNb=EOB=AJR3k0cXo`P008?458?43<W3SD00EH_\Pna0RDD8ogD8 +^Y0_0`2Q33H308?\2>R>5`00X@`f0`3Xa20008?43?bQ13H308=h6P4?QJ40~2X@@f0`23N100 +3h@b~3X@@f0`29ALb9AM2;B119RdG@RDP@R`d4=P<0RdG<Re0@<l2:A14HRDG`jEX0~2SD00X@@f +0`23N0@0M3VQ13H308U5e8]814V;AMB9B0BQ13H308U5f8\8RDgL@H]5f8T8RdgL<l2:0HU5n8]5 +n8U5m>\?Rl2Q13H30>Rb8000RDGdRdGdRDG`RdG`RDG\j`klX@@f0`3XUR0008U5k8]5k8U5o8=m +o?me7kWTC`<0^Y`_0`1V^0<0j;PC~2adGlCP000>U0~3R`eTC`<0ReGl<l1VR`AAm\103h@L~3 +XFA?0`2;COaVRhA80P8000no`8U5j>T7~3o8]5o8U5j8]5j8U5o8=mo4h?Q1H0~2PgglF@n43000 +0<M5i000~2j@L0~2adGT0@0008=mi00?U<0Uo`0000_03hFMo_ooPgglFGD;adGP0@000>\9Rl37 +AN00~3RTGPj`23a0c9`he005F;k87\?08008U528]526K7@63ooh]526K7@6;ooh]52<M0I?oo +oon;A@S7@6SoooooRdD8ad1\0@00P;Zk;`<0RdD8j=LV~2RlR;A@R9B5B;A@R3N5@03hDf~3ogD8 +^\0_0`2Qd4l308?\2>Se5`00^NA?0`2;5M1?0`1V^0<0j8DB~2j<@1~2Pl@<jK@1~2RdD8j0P5 +~22\0?QF@0~2PSg8C`<00@n5=P000;[T;`<0X@`f0`3X>1D00?me2;[\;`<0X@`f0`23k0SX8aD0 +0;XE<0<0X@`f0`3X51D008?438]52>QYeoooRdD8aT1H0H]52<M0E000~2jD<1~2SD00RdD8og1D +^@02~2^P40~2SHD0o_ooPn`<j3hX~2Pl@@RHGloOooahGdoOoo~4ahGhoOoo~4o8^5o?goodPk +QOSmoomfAH^5n?gooh:l1@3nool=3hDQ~3RhGhoOooP[`50Okoo`X?Q@d0~2RhGdoOoo@8V5m?go +oh^5n?good29QOSmooo[[Ob;A@SX^=Kooh]52<M0E000~2RhGdoOooJl1@>hGloOooLaV;A@QV +ad1P~2RdD8I\M0HP40jA@0~2Rl2;A@QVad1P0@2;A@QVad1R0@2=UM3moon;A@SXY<`008V5l?go +oh>ml?goo`1d>Ome2;XH<0<0XM1?0`23k0SXD1H00;WTC`<0RaG@C`<0I[P30>SP4000j1l0~2 +Pl@<j@l0~2SD00RdD8RhgXoOooRDQ\Pl@<bL>=@01ERnb3k0bQG50308?\1>R]=@00Pl@4D;Xl +<0<0XM1?0`23k0SXkaD00;WTC`<0RaG@C`<0I[SoonQo4000Pl@<Pl@<bL>=@01ERnb3k129A@R; +A@P?_d1PjGL0~2SD00^U4`0`2;A@SXHb@008U5o>U[~3SD00^U@`0`2;A@SXBb@008U5o>UC~3 +SD00RdD83km0H52jF3030:7@C`<0Pn`8j6hE~2^NA?0`2;5M1?0`1V^0<0j?h?~2Pl@<^000~2 +jF40~2o>T?~3SD002l1dR8?h0GBKjk7lPggl07DnogD8^W``0`2Qd4l308?\2>PM5@00^NA?0`2; +5M1?0`1V^0<0j:d?~2j>cnoon3a0bh~4j@\0~2SD00RdGlj`>=@023a0c9`he005F;k8?\46J9 +A@R9E@aVPgd80@n4\00008]53>R80@002\0?Q:00~2IX=m208?QEd0~2ogD<^Z0`0`2Qd4l308?\ +2>RL5000XM1?0`3XM_[ooh?432Go~3Pl3o6l102l0?Q200~2^NA?0`2j`30306JhoooX3@l00;P0 +~3jA\1~2SD00jC\0~2SD00ogD<^]@`0`2Qd4l308?\2>Po5000^NA?0`2;5M1?0`1V^0<0j<l> +~2Pl@<^000~2jMX0~2Rl2;A@`?_d1PjG@0~2^^D`0`2;A@cX^b8008U5o>U[~3SD00^^P`0`2; +A@cXXb8008U5o>UC~3SD00RdD<3km0H52jk3030:7@C`<0Pn`8j<HC~2^NA?0`2;5M1?0`1V^0<0 +j5H>~2Pl@<^000~2jF40~2o>T?~3SD002l1dR8?h0GBKjk7lPggl07DnogD<^Q0a0`2Qd4l308?\ +2>Qe4`00^NA?0`2;5M1?0`1V^0<0j0D>~2j4Cmoon3a0bh~4j@\0~2SD00RdGlj`>=@023a0c9 +`he005F;k8?\28U52;X0~3RdD8j4K6~2Pl3o6l10j@<0~2SD00Pl@8bL>=@01ERnb3k529A@R9 +E@b3O@P03hD6~3jBl0~2o6X0JP2=COB=EK2;A@b3k0cXD`\00?me36X0Rdd8SEGdSDF`Pn`<j:41 +~2Pl@XbL=ERnb3k0b9A@R;A@R;@5CXk<H008U5o8]5o>Ria`00RDGhPggh00n540000;01jA40 +~2o>T;~3SD00\03Y0@000?b3a0C9`he005F;k8?\:8U528]52>Rgm_ooRDGX^Rh0~2RdGXj:?_ +oon9ANB3ON@03h@R~3^@@0~2ReGTSDG\j78b~2aTG`08]5i<H00>TE~3SD00^@40~2^S<a0`2= +ANcXeR\00;T8~3ReGXSDGdj3hb~2aTGl08e5m8U5i8]5i88h07@XRdGT<m::4;Pd<@<0j2o_ool; +`0n51P0008]5i<H0Gh]5i429ANC[d8e5kHU5i8_0RdGTPSP0M2R;AN@cdXX@^80a0`3Xmnkoo`_0 +3hD6~3RdGTaP1ORdGT@8U5i>_@SEGd^;1B0`3Xlc0008eEk;R`DP<0j6h`~2^[1B0`2;A@SXYC00 +00_0M35X\5830?me2;[<<@<0XM1?0`23k0SXCa400;WTC`<0RaG@C`<0I[P20>SO2`00Pl@@^;1B +0`3[0Ob3a0c9`he005F;k8?\45=GPn`<RDD8RED<RDd@^@40~2^_da0`2;AASX`RX008=m200? +Q880~2RdD8PSP03hAf~3^D00~2ReD8RdDHj<``~2RdD8j:0`~2RDGlRdD8Rdgl<m::E0So^?ha +0`3X1nkoohU5n8=mn00?QCP0~2Pggl@0n3;P0008]568U5l;\2~3_`4b0`23k0cXF30008_GRl^; +f8?418]5l0?3Pnchj3HZ~2Pgd<07@@^@P0~2ReD<RdDHj50`~2Pgd@00n4KP0008]5488h00n4 +HP0008]5488h;Pn4AP0008]568U5m;\2~3_`<b0`23k0cXlRl008_GRl^;f8?418]5m0?3Pnch +j=0Y~2^@<0~2ReD@RdDHj?0_~2jA<0~2SD00^@@0~2ReD@RdDHj=P_~2Pl@<Ge_9`oaERnb3k129 +A@QVRED<RDd@ogD8^PPb0`2Q33H308?\2>Q;3@00X@`f0`3XPAH008\=13H300noE@b;AA3XjaP0 +08?438U5o8=mo00?QAd0~2^NA?0`2j338306Jh103X80X00>QOnOooj=H;~2^PX0~2RdD@j;7\ +oon9AOb3OO`0M0J;AOc6~2Pl@<bL?lEH_\Pn`<RDD8RED<RDd@adGl~4Rl2;A@PiAO`?SF00~2 +RdD@Rd1Dj84F~2RDGhPggho`n5<00008]548]0E?I0208?Q0`0~2^?kooooY=P0008_0Pggl07D: +^?oooooY90000>\JRl2;A@b;COb;EOR850R;AOa0RDGljiN=@02;AOc[0he008?41<W3SD00EH_\ +Pn`@RDD8RED<RDd@RdD@RdQDReD8RdD<j>PG~2RDGlRdD<Rdd8BLH42023OO`03hDd~3RdD@Rd1D +mT080Pn430000;SnoooojBH0~2Rl2;AA2;@5Cf@0P1M0bhooooonT>~3Rl2;A@cX52h00>\2Rl23 +a0c9`he005F;k8?\38U528UE38U=46Q<<P<0^R`b0`2Qd4l308?\2>PF3P00^NA?0`2;5M1?0`1V +^0@0j:H8~2j64:~2Pl@<^?kooooY~4Pl@<bL>=@01ERnb3k21CEX?\38U528UE38U=4<M5h000 +~2adGh0@0008_0RdD8>DGh3hgH0`00RdD<RdghR`B8RDGlRdDHPWP50@n51`000<H5b4l30062 +?LQ?0`01MCJjF3830:4<=P<0j10;~2ogGl^V0b0`2Q33H308?\2>Sk2P00^X\b0`2Q33H30>S\ +2P00Pl@<RdGl<m::48]54>RFj_oo2l0?Q>h2~2^Xdb0`2;AOcXKB`000_03hCI0P00PggP00n4 +200008]5h>Qg8@00RdGl@>QRlOooRDGPReDDRdGPj23^oon9ANS7AN@0~3PggX07@=RdGXaP00 +RdGX@8U5i8]5h>R[;000RDGdadG`ooooolM5k000~2Rl2;AAR;CNa[b@b3?0P03hBe~3RdgdReGP +RdDHReg\Jm\<R`@Hj=[[ool;`0n5RP0008=ml00?SEP0~2RdG\RDG`PSg8C`<00@n5?`000;Z@ +<P<0X@`f0`3XoPT008]568]=k6_93?ld2;ZH<P<0X@`f0`23k0SXh0T00;[4<P<0X@`f0`3Xd@T0 +08?43>TY~3o8]538]Mn?ldV;[8<P<0XM1?0`23k0SX7@`00:7@C`<0j:>koon3a0b;ANa0RDG\ +jCSooon3OO00OBR;A@b;GOSo=9Rji3830:7@C`<0Pn`8j><;~2XM1?0`3XJK_ooh?438=mj00? +QG00~2RdDHReg`Jm\<PW`H100?QCP0~2RdDHReg`Jm\<oc@HJ24c0`2jo3830:7@C`<0Pn`8j9D; +~2XM1?0`3X6k_ooh?44>TR~3SD00RdDHReg`Jm\<aT@H1@6;AAR;GO1[f`c7A1P8~4j@01~2RdGT +PSP03hD`~3RdD<ReghocBH^R@c0`2Qd4l308?\2>Pe2`00XM1?0`3X^k[ooh?43>W7~3SD00RdDH +Reg`Jm\<PW`H105e>8]568]Ml6_K3?ld66Qa<`<0^TPc0`2Qd4l308?\2>S]2P00XM1?0`3XLk[o +oh?44>Uo~3SD00RgDHReg`Jm\<RdGTj1O_oon;b8_6RD`H28]568]Ml6_K3<I460D1PSg8C`<0 +0@n5@0000;Yd<`<0X@`f0`3X9@P008]568]Ml6_K3?md60RjO3<30:4<=P<0Pn`8j0H8~2^ZPc +0`2Q33H30>Sg1`00Pl@<jG40~2SD00jFT0~2SD00RdDLPWP500n58`0008]57<I01@6;A@b;GOR; +19SXP^kooh_HRdDLREP8jCL0~2o8]5889h1@1e8h]58<I01@6;A@b;GOR;19SXE^kooh_HRdDP +REP8j@\0~2o;R\<`<0j7jioon;AOQ0RDGhjAkloon;`8?435iKbL?lEH_\Pn`LRDD8PSg8C`<0 +0@n5D`000;[<<`<0X@`f0`3X@`L008]528?0K8?\1>R]7`00Pl@4Pn`4j7X7~2Pl@4D?me2;[D +<`<0X@`f0`23k0SX4@L00;[o<`<0X@`f0`3X0PL008?448]528?0K>Q\7`00RDGhRdGhPgPDD0n= +NP0008]528]0K8?\1>S6j_ooPl@4D?me2;X4=0<0XM1?0`23k0SX;@T00;WTC`<0RaG@C`<0I[P2 +0>Rm0`00^NA?0`2j93@306JhoooXZP<00?me2;YL=0<0XM1?0`23k0SXl@P00;WTC`<0RaG@C`<0 +I[P20>R10`00Pl@LRdD8Rd1\RDG`RdD8Rd1\RDGdSEG`RdD8j6G0~2RDGlPggl07A>RdD8Pl1\ +Pn`4j:hN~2Pl@4Pn`4j7\6~2Pl@4D?me2;Z<=0<0XM1?0`23k0SXPPP00;WTC`<0RaG@C`<0I[P3 +0>PB0`00j57boon3a13[08?43<W3SD00EH_\Pn`DRDD8RdD8Rd1Dj8Bl~2RDGlRdD83km0H>UU +~3o;X0P000RdGlj8>m~2RDGhjE\0~2SD00^P10~2RdGlj6^m~2RDGhjdJ;`6SD=0<0^[@d0`2Q +d4l308?\2>Se1`00^NA?0`2;5M1?0`1V^0@0j8D2~2j404~2Pl@<j@`0~22l1dV8?h0GB[jkgl +Pggh07daogD8^^@d0`2Qd4l308?\2>R]1`00^NA?0`2;5M1?0`1V^0<0j3d2~2j7caoon3a0b3 +a0c9`eF;k8?\N8U528UE38U=48=m300?Q0H0~2RdD<aP00Pgd@07@6RdD@aP00PgdD07@6RdDD +aP00PgdH07@6RdDHaP00I\M5WP00Pgd807@=RdD8PSP0M0G[3he006J;AIkY3`4008e008]E28e5 +[>R59P00SDF\RDFX^P@e0`2;AJSX]^OoohU5Y8=mY00?Q6`0~2IX]5WX;826J9AIj3O@`03hA: +~3adFP~4o8=mX41m2X]5Y3U5Z7L2j`C[:X_0RdD<RDFD@8U538]5Z8U5V429AJR;AIR:28]5U8P8 +RdFP@8U5X>_5o8]53<H008]5Y429AJB;AJB9AJRj;P0008]5Z>S<hoooRDFTPgfT07@[IX]5WX;8 +16J9AIj3OA@03h@@~3^@@0~2ReFTRdDDj8XV~2RdFTaP00RdFXPSP0M2EVRdFNP\P2IXU5WX=m +400?Q100~2^@P0~2ReFXRdD@j5LV~2IX]5W^\1o8?43<W3SD00EH_\Pn``DeN3k0b9A@Rh1cD3 +0>Sl6P00RDGhPggh00n5B0000;T4~3^P`e0`2=AMSXVAl008e5f8U5d;\8~3_a0e0`23k0cXSBD0 +08_GRl^;f8?418]5d0?3Pnchj6\O~2SDGHj9<O~2j88W~2XA`g0`29AMB=A@SXUQ\008U5o8]5 +o8=h801n5X]5e2d@3P00jA40~2o>T;~3SD00RdGDj@00~2Pl@<Ge_9`oaERnb3k1QVRDD8RED< +RDd@adGh0@000<M5o000~23km52>VM~3o<M5m1Pe0`3Yb0000<M5m1`e0`37AO`1~3jKD0~2o<M5 +m2@e0`37AO`1~3jJ40~2o<M5m30e0`37AO`1~3jHd0~2o<M5m3`e0`37AO`1~3jGT0~2o6QX=@<0 +^TPe0`2Qd4l308?\2>S11000^NA?0`2;5M1?0`1V^0@0j57ooooX30400>P70@00Pl@<jC\0~2 +SD00PoP13hAKoooo2l0?Q5?ooon3n?l?Q5Kooon3n08?Q67ooon3n0<?Q6cooon3n0@?Q7Ooooo[ +ROb3O@`0M0Z;A@b2>01d0^\PIZ41D`<0ISU520n>2P0006J;A@QVX`5C0`3YS`000?b;AA23N5@0 +M@O7AOP0~3Pggh07@OPggl07@IRdD@R`d<=P<0>DQD3hD7~3adGl~4Pggl07@KogD<ogGd^WPe +0`2Q33H308?\2>Q]0@00Pl@@Pggh07@LogD<ogGd^X0e0`2;AA2;@5B3k0SXB`4008?446JQ0E<3 +06HiA@Qn2VJ;A@QVX`5C0`23a0c9`oaERnb3k0@?_`D1D`<0jCh0~2Rl2h~4j489~2jDT0~2o;P1 +~3j389~2jcbh0P000>PV2@00jc2h0`000>PJ2@00jbCY7`0008e008?h0GBo2l1d^h?h0WC6PoP3 +M<f3n0Ade>_BRl23a0C9`he005F;k8?\15>3k0R9A@R9E@b9CA37AO`0~3Rl2;A@PiAOam88]5 +48]@E8]=38]Mo3?0RP@Ij3HB~2RdGl@8U5o>_Io8?425_9`h_0EH_\Pn`<RDD8RED<RDd@J:Pe +0`2jR3D30:7@C`<0Pn`8j;H2~2^NA?0`2;5M1?0`1V^0@0j4KmoooX0Ooooh?438?43<W305F; +k8UE36X0SDd@DH]=38_@^040~2Pn`<j;ha~2Pl@DbL?lEFQH0080I?le~4RnaTRBd0~3REDDJP6= +CAQARddDRm2h0@0008?\3>R7<@00Pl@DRnETS`D0~3Pl@4GL<0~=EH_\DeN3k1R9A@P;`7D9<l23 +a1QOFlW3R`g<C`<0RDg\2lUe7kPJ~3j:4I~2Xla?0`29AN`;`7D9<l23a1QOFlW3^@@0~2Red8 +Re<HSABE^3D308]mk8_7j80K~2Z@00E02=A`Bi100008]C48dDUM@e0`3XI1\00:T005@0Rl^= +G`R9GNbj2P0008]138?\28e=l57XVc0008?438]=l0_9M@f3`B282h?72HUmk>\?Reg`Pl<`RdG\ +R1Q0RDG\RdgdPl4`Reg\R0^=B`760B2j2P0008]m28]728?\28e=l57XCC0008e;0X]El8?2<8PA +SD\3ReGdPl8`R16=B`C60CZj2P0008]718?\28e=l57X7C0008e;1H]El8?2<8PASD\6ReGdPl8` +R16=B`O60CZj2P0008\7Pn`8SDg`DNS^;`00SD\8ReG`Pl8`R16=B`V;EOB3`S284He;2\H18;[X +0`00RdLD1F`7~2Pn`8SDg`DNRi;`00SG\;Rdg`Pl4`R0njI00008]5m8?\28e=l57XVRl008ek +38]=l8?1<8P?^PX0~2RdGdPn`8SDg`DNQk;`00PlA8SG\=Rdg`Pl4`R0n=N`j;COB3`C283he; +3lH12X?348UMk<H30:7<C`<0Pl@HGe_9``00~=EH_\RED<JP2=CA1ARdd<Rm0c`8?\3>Q=;`00 +Pl@DbL=EJ5P00P1TocD0~3RnaTRBd0~3REDDJP6=CAQARddDRm0c`8?\3>PJ;`00Pl@DRnETS`D0 +~3Pl@4GL<0~<EH_\RED<JP2=CA1ARdd<Rm0c`8?\3>QaC@00Pl@DbL=ERnb9E@aZ0He=456;C@b; +d3?0Pn`<j55=~2Pl@DbL<0~;EH_\DeIGPn``^Ql0~2^2@j0`3X92\000_0M0Xc`8?4<5mNFlW3 +J;`k0`2=CNAA\0;X~4XA0f0`3XV8<008?428?hogDI<lTcd[QT~3j3:1~2PlSoPl@`GeiKbL>h +1PH00>R]5P00RDGX2l1e6C?9<m:hI0000>P8P@00PlSoPl@`GeiKbL>;ONR=A`:S43P30:=D>`<0 +XfA?0`2n53H30;U0~3ljEVYH_GPNX20@00SKX20@00<l2i@0000?>[RoZ=U`82~2REGXI\L2oon1 +a`@2~2RmMV<lUVPoUQLPiVPoUjM`R=@N1VR@;[0fJ92X_1@H?20VJ1nOl0M]aVa`;ooh?20VHc +bOaVPoU1LPiVPoUJM`R=@B1VR@;[0fJ92X_1@H?20VJ1nOl0M]bh00800>SJ5@00Xa@h0`0;`7DI +<lTcd[QT~3j3>0~2PlSoPl@`GeiKbL>;?A@h0`0cdXYGoOK287@9<l2iP0000?>[R`dD>0<0R@eH +>`<0^?@o0`3XgA8008U5j0_0M2^;n8_g^@D0~2<l3b[U4[oX_?RcfL>`<0Rl71j@;cYH_8Pn43 +ljAI<l3cZ\M5k000~2adG`~4ocFX>`<0SDg\DFX@\0?X~4Pl@<2l1d2\L5Z3\3~5^0A00`3XKa80 +08U5j0_0M3V:28;iKg@5P_U?MBf;ANR:@04lKW@4?4ie7kX<@0<0RegXPl<2Rl?XS880088l0`1e +1h8=93X3006hh3P30>SE0@00^40i0`3Xb`400;RP>@<0j<41~2a`D8>@<0@3T30<L5J3T30:0i +0`1Z4fP04000J>0h0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>SaOP00PlSoPl@`GeiKbL>;3N0h +0`293B`i0`1Z4fP08000J1`i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>RbOP00PlSoPl@`GeiK +bL=Z4fP04000J40i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>QoOP00PlSoPl@`GeiKbL>;3D0i +0`293H`i0`1Z4fP08000J7`i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>Q0OP00PlSoPl@`GeiK +bL=Z4fP04000J:0i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>P=OP00PlSoPl@`GeiKbL>;3J0i +0`293N`i0`1Z4fP08000J=`i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>S>O@00PlSoPl@`GeiK +bL?71HQC0`3P=`<0a`F<D`<023P306XDSDg@DFX?JP^`1>P0~3Pl@@Rdg@R0ePC`<0RdgDR0f8 +C`<0RdgLR@dH>P<0RdgPR@dD>P<0<l23a31OGU_9`oaERnb3k0QCRmR=COQASDglDOmc8;03j000 +~2Pl@<2l2;`gDXRdglPN7o~3IP_9M1Z0B4B0RdglPN7o~3IX?i0GD7ad100P0005_9``00~;EH_\ +Pgd807D5j?Xh~2J<2=0@1Z0k02j000~2Pl@8bL>7fi1ERnaXL08206Co=@00~2j53koon3n?md +KXe5n6BS~4^83b0@23k0CXOFL008?419_I;O0k0`2;AAB3k0CX07d006S0S@40^07o~2D;02j000 +~2Pl@<R`elC0<0DH\Ek3\305:Qj3\3053XCZcooheUn8?\1>PC~3SFGhI8l5~4^0P0~2GL>@05EX +F00206Co=@00~2RnaTRBd0~3EUN3k0B;3A0f0`2;\J@1~2Rdh82lUd8dV9CPR3OPP0O1V;n8]> +28eAohUF28]DSPcodX_7Pgh807gWj7Io~2Pl@4GeiTS`D0~3Pl@4GL<0~<EFQH0080I?le~4RnaT +RBd0~3Pn`@2l1e7<L5G50300`0~2PlSoPl@@I8l5~4Pl@4GL>;3A0f0`2;RK01~2RDgl2lUd3S_8 +M0N;BB@;bGGeRDglRdGl2l1d3c?Bj4PU~2RDGhj`Z=@037AOSoooooRdGhPl@@I8l5~4Pl@4GL<0 +~>EFQH0080I?le~4RnaTRBd0~3EX?\4<M5l000~22l1e6h\=43H308^9\04008U=n<M5m000~2 +j`b=@029AOR;B2B9COB;MOPkMOAd7Xe008_6j7Dh~2PoP1M@O7AO3oooooRgHT>gGdMNF;AO23 +a11NI8l5~4Pl@4GL<0~=EFQH0080I?le~4RnaTRBd0~3Dh?\78U5n0_0MAg71Ea@0`0<~3PlSo +Pl@LFfB?1@00~2Pl@4GL?7AO@0~3RdGhmT080W@Fa`ELD0<020000<M5m?ooooo[>he008]5n89h +6P9e4lL5G50301`0~2adGdooooon\LRdGhRd0hPn09MA771Ea@0`0N~3adGdoooooh=mm?me3X]5 +n89820;Y7P4008_0RdghRe4@2m9d4TZ9DA0c`8Y44AR9AOCYl`0008]=n8=i@0<?Q7<0~2PgT4 +00n5C@0008]133d08000L`?[1_bh020008_8RdGhRe0lj4im~2RDG`2l1e3lM5m?oooooY]`00 +08e008]=l8]Mn8]CC8_3j8@T~2RD<4Rd]<R@^;AOR;28eI0HTH<m^:6HUMm?m81>Uf~3SD00RdGh +PWPe0G@6PWPd07D]^@40~2SEG_RdGhj>El~22l1d3C?KRUg_REgdjdJ=@037AOCooooojcZ=@02i +0@0008]Mn8]C?8_3j;Il~22l2;`g@H^@40~2SEG_j?lS~2<lV:CNn9COC[2?c7AOCoooooPggd +og@7RdGhaT0J0H]5m8?475]TS`D0~3Pl@4GL<0~<EFQH0080I?le~4RnaTRBd0~3DeIGPn`hRDD@ +REDDRDg`2lUe7\L5G50300`0~2<l23a3QOGU]TS`D0~3Pl@4GL>;CA29CNb;CAB3n@9m>8?i0GdK +Rdg`PTT80S?0Pl@hGeiKI8l5~4Pl@4GL>;ANc6~2Pl@hGeiKI8l5~4Pl@4GL?7AM`0~3RdG`mT08 +0W@Ca`ELD0<020000<M5g?ooooo[>8]5l89h6P9e4lL5G50301`0~2adGLooooon\LRdG`Rd0h +Pn09MA771Ea@0`0N~3adGLoooooh=mg?me5X]5l89820;7AN`0~3jDX4~2SD00RgG`Pgh@00n4 +C`0008]E58?j0@n>@`0008]Mk8]644R9AQ2:A0HHR0=3?0Ye7<H30<I66P6;AA23a3QOGU]TS`D0 +~3Pl@4GL=:Pgh@07@5PoX1OlJ9EAB9GNb3OA@1M@j;ANc6~2jJ@3~2SD00Reg`Pg]00`n4L`40 +08=k101e?h]333d08000L`?[1_bh020008_8Reg`Re<lRl?X_7X008U5i0_0MQN;b8]CC8_3j0DR +~2RDGPRD<4Rd]<R@^;AO23N0@03hI20`00o8]554R;f8]=l3]I17L6RDGXj`[lRdG`Rd04RDGX +Reg`Rc>;o[P:~3RdgX2nCb[Xeoog@2<on9OM0;og@nRmN9OLP[eT:9EMR;GNb;nh_:Rl69CLc1 +j@;cYH_8RdG`Pn43ljB;CLR;OL`YN0A1R@P3fXUMk>W70P00Rl2;AO2;68]5k8_cRoR9ALR;ENR; +`X_8`NT2ljF;b8]5l8?Q0o>TRdg8RggX0mn968]H12_JREP4ReDD:mN9EA@3chU=k8?j0@n>N080 +00_KMD6;@0`m020007<5j`R=@02h020008_8Reg`Re<lRl?XX7T008U5i0_0MQN;b8]CC8_3j>TP +~2RDGPRD<4Rd]<R@^;AO23N0@03hOUo_oojB42~2RdG`PWPe0G@DPWPd00n5G@000?I0A80?Q5<0 +~2^@40~2ReG\RdG`j4=i~22l0?Q>`1~2SD00RedDBhUM58]=k8eA0HUEk88i2Pn4d04008?k0@n4 +a`400;T1~3RdG`j0Ui~22l1ecNVa0@00RdG`PWPd0@n5J`000?I0A80?Q640~2^@40~2Re0lj=ah +~22l0?Q8D1~2^@40~2Reg\Rm>;MO2;a^PL8000RlJ;CAA9RDdDSE<1REG\PS\:3hAI0@00PoT1 +3hA@0@00^@40~2Re0lj99h~22l1e^^Tj0@00o8]554R9AMP?Q2`1~2?OP?~2O@C[1h_0^?P?~2 +RlR;AO2;D3cXGWP008U5i0_03hH40@00SD00RegTRl^;ONb;eh]el8_6j9PO~2RlR9CN2h2P00 +00_TlZj=Oomd0S?oRGg@2ol?Q900~2ReHlRoZh2P0008_;2nCb[Xeoog@2<ol;o`n4I`0008e5 +e51Z0B_jAb_kEomf8;04j000~2Pl@@RDGL2l1d5LL5G50303`0~2Xd1H0`22CPP2jaR;AO2;F0R2 +hoj9F0R2hof9F0QVad0foon3OM`0M1@c`8?4>5mNFfB?1@00~2Pl@4GL>;AM10RDG\jcklRdg\ +RegP0l^9CNb;AMP[`hU5f7@X?OP?~2O@C[1h_0^?P?~2RlR;AO2;D3cXFWL008U5i0_03hOoo_oo +RdD@>DG\MRN;AO36@1X1mT080W@:adG\~4jaSlRdG\aP00RdD@RDG\j`V;`<M5k000~2RdG\Pl@h +GeiKI8l5~4Pl@4GL<0~;EFQH0080I?le~4RnaTRBd0~3Dh?\8<M5n000~22l1d1H8h07D>a`EL +D0<010000>\kRl0;dWD<a`ELD0<00`000>\YRlZ;f8eEi8_1j38f~22l2;`gDEJP0cbHeEi8?\ +3>R9J`00Pl@@RDGhRdGhPl@PFfB?1@00~2Pl@4GL<0~;EFQH0080I?le~4RnaTRBd0~3Dh?\68UE +n0_BMAg71Ea@0`0<~3PlSoPl@HFfB?1@00~2Pl@4GL?7AO@1~3RdghmT480W@Fa`ELD0<02000 +0<M5m?oooooYC00008]=n8]9>8?Q3WDEa`ELD0<0:0000<M5m?ooooo[;X_0RdghPWTJ0GDSRdT8 +Pn41MA?71Ea@0`0Y~3adGdooooon\8RdghRe5<RA63OOCoM@j;COR2B@P2jM40~2Rl28AO>;GOR3 +Nd033hB@~3Rd\<>D\43i?22]9d:X]CC8_3j2Da~2>d<<M0c7AOCooooojIL0~2RdGhReQ<RAS7 +@0@0~3Reghod<4R`^=D@694hYElhPAPg]00Pn5G@00089ml`X?QE<0~2Rd\4Re=<Rl?XdS0003]3 +17@=adGdooooonU4~3o8]5n8]HC8THad04~4jb>=@02i0@0008eElh]5n>QdN000RDGd2l1e2LM5 +m?ooooo[3h]5n<I06P8c`8Y5lhU5m8]5m8?465]TS`D0~3Pl@4GL<0~=EFQH0080I?le~4RnaT +RBd0~3DeIGPn`DRedLREg`2m]e7\L5G50300`0~2<l23a1AOGU]TS`D0~3Pl@4GL<;dW@42lUe +53?0Pl@DGeiKI8l5~4Pl@4GL?7AN`0~3Reg`mT<80W@@a`ELD0<020000>Uo~3o8]Ml8]k>8?W +2GDEa`ELD0<07P00089;20;YH00008_0Reg`PW\J0WDCa`ELD0<07000089;20;[AHe008]Ml8=k +@0=d7h_jRo6C3jo?Rm?XF04008_><m;gmh_GThUMk>\LRl2;fPn_bh_@RdG`j2d0~2Rl\cd_Oa +Rm69ANb3ON`0MPN;AO36@1X1RdG\Pl@DGeiKI8l5~4Pl@4GL=ERnaCEUN3k229A@R9E@b9CA37 +AO00~3adG\~4PgP@07@[<oJ;F11;REP@RU`H68PJAT8klGD:RlJ3a21OGU_9`h=h401egHUE38Ue +l8]el3Ue40n6Y00008]mj8]E38]Mk8]528e0089h=@0?QE80~2Rdd@:lj1n@0P~2L`F;nN\6o;l0 +8000REGPREgTRmR;ch]C?8MMi>SbLP00ReGPRlR;AN@;bGA@RmZCRDGTRl?X=AX008]Ei8_8Rl>; +fN\[Rl2;fY>;CA0[cXU5h8_3j;Yb~2ReGPRlR;`h_I2lUe2X_6Pl@PGeiKbL<3d`?c>gD@3h9^ +ooooRGG`RdG`Pl@PGeiKbL=ERnaCEUN3k229A@R9E@b9CA37AO00~3PgP@07@^<oJ=@02;F11; +REP@RU`H68PJAT8klGD:RlJ3a21OGU_9`h=h401egHUE38Uel8]ml3Um40n6`P0008]Mk8]ej8]5 +28_0PgP400n5F00008]@387j020007<7Rm[[28e00;\08000RGgTRoR;bh]G?8Mmi>SaL@00Rm2; +AN@;dPn4M00008UMi8_JTh_8Re=<Rl>7GNCX:aT008_8RdGTRDP4RdQ<R@R;D0B;CA0[cc_:MPJ; +l^\7Rl2;MA0[mhUMh8_>Ra29ANB;G@b;`hMMh>RT1@00Z@00E02;CN2;ANB;40?FRA03cXU=32U` +10?n>gd@3h9<ooooRGg`RdG`Pl@PGeiKbL<0~=EFQH0080I?le~4Rnb3k0QTRBd0~32l0?Q6X0 +~2SDS`RDglIX5i3]FU3hEH~3I\M13P00PWT<478IDK01j000~2Pl@4RnETS`D0~3Pl@4GL>;COb2 +B@dP<l2:@@b9AOS7@@@0~3P64:06J1H@P008]5n8\DQF1@0`294HT<QF1@0`2;iFB?1@00~2Pl@4 +GL<0~>EFQH0080I?le~4Rnb3k1ATRBd0~3DeIG2l1e4c?0GeiKRnETS`D0~3Pl@4GL>;d8_j<l23 +bOob[X_2mm59RDglRad@=P<0REgdadGh~4Pg\\00n6E@0003?BRl2;n8U5k8]=o8_g<l3b[XU5 +l2_nRln;@cB=?9D0~3R`@hRoR7AO0c`?>VM0DK`8?Hoh]mk8]=l9L;ogD9RgglPS`i?G@8@X_: +>d\\L[:9EOR;GOB;COPkBbac8h]K=8]=n<7Q0X\42h]Mo0?3@5mNFh_UI8l5~4Pl@4GL<c`5mN +Fh_UI8l5~4Pl@4GL<0~=EH_\Dh?\38\=43H308^9U04008\I2m]m1oOKja6=@02;7A0f0`2;Vi@1 +~2Ra^1nj05~2OPj;3A0f0`2;BA3[7He008\M43H308^KU04008\;SAb=~4`N46:l^9COB;7A1? +0`29GOP;fgDVRmRh90000>P^0@00RDGh2l2;`gD8<l23a0aKbL>;GOR97A1?0`1Z0FX1RdgdReGh +Pn`<j<hB~2Pl@PFlW3~<EH_\Pn`<DeIGRDD8RED<RDd@<m^:F@f;nh?W7hUmo8eJoc_H3hbS~3 +RgGhSD00Rm6=B`Fn0@0003?0PoTO3io0B2?`dnJ;bP?aRT4;R4H;Po\7O229COB=BoVh0@0003?B +PoTO3io2BR?2ReGddn2;bPQ12hQN38\4WF1@0`291XTdWF1@0`2:D@f0h^2:APdT7`[2R4H=adH4 +~4P6H:06J1IPP004N:APdTh2Go~30lN8APeVadH>~2Bc]M20n=I_ooohUmo8]548YH3H3Sh87S +o`0000=Mo8QH3H]M28QH35mNFlW3SD00EFQH0080I?le~4RnaTRBd0~3DeN3k2@;`7@5PoS_MQ<c +`8?495mKI8l5~4Pl@4GL>;f8ek48_7j=EA~2PnP4RmOgfR?G>mL?U<:1h_l0~2:l:9AO2;`cg` +o`l03hIH~3JQ=GSDgdDK03j000~2Pl@<2l2;`g@C<l23a2AOFfB?1@00~2Pl@4GL>;GOAVad<> +eJF;GO2;OOB8G`b;GOB90h]5m8?048?495mKI8l5~4Pl@4GL>;GO2=79ePD0<0R`\;bG@?RDgd +R`V92nWi~3SD00Rdg`@HU=k8?i47dOPcb=H503~2MAF;`463nA1m2X<lSF1@0`00M?29CNb;ENb3 +nQ1d;H_hS@bEH50308\IREgdR`>90LL3~4RdgdRdG`j=[moon9AOB;anVF~3adGX~4Rdg`Pl45 +^`40~2<m:3nAl?Wl9:8m[ChhUMh87k~20@1c4\M5i0000@37ANP1~3j`R;`8]Mh8UMi8_hJQ?o +MNB=GOAC\0?X~4Pl@<2l2;ag@C<l23a2AOFfB?1@00~2Pl@4GL>3ONP0M22;n8]Mm<L3~4Rdgd +^P\0~2RdG`j3omoon9AOB;ah]Mm6K7@`kEYH]Ml8]mm8QO38]Mm8T3RdGdPl0@Pl@TGe]TS`D0 +~3Pl@4GL<0~;EH_\EUN7dH_aRoR;b\7Y0_>URlZ3h@?cY8_::oV;aemNbL<0~<EFQH0080I?le +~4RnaTRBd0~3DeIGPn`PRDD@2l1e5H?8oh?485mNFfB?1@00~2Pl@4GL>;CA29CNR:0C`mM18: +`7@>@HX1?3ed10[0MOF9CNR;CNP[CA2;7A0f0`29GO37AN`0~3Pg\\00n6E@0003?BRl6;OA29 +AN2;mc?0lZj9AM`[oX_?Rd<dSCbE~4R`@hRoR7AM`c`?>VM0DK`8?Hoh]mg8]=h9L;ogD;RP@8 +?3ed30[0M0Q2Rl8k@bab\8UEk8]Ml8]Ek3]C;0n3C`0008]c=8]Ek<7R0X\l5S?0PlWolZkgdDV; +Lc0[lHUeh8]e48_n<l23bOob[X]5h?OAB@?1RD<`Re\dRC@C<l23a21OGU]TS`D0~3Pl@4GL>; +GO2;Dbbi3`0002?:MD:3`Q71hP:;@cCXRP0008U5i0_0MAo71Ea@0`0=~3PlSoPl@PGeiKI8l5 +~4Pl@4GL>;GO2;ANB9@cBSO4`308]Ml8]c;8eF0HUC;<7V0X]C=8]m48Tl<X]c;<7V0X]C=<L4 +<P00~2<l23bOob[_OABD41Bc0c`8?485mNFfB?1@00~2Pl@4GL<0~;EFQH0080I?le~4RnaTRBd0 +~3DeIGPn`LRDD@REDD2l1e6H_2j<?koon3a1aOGU]TS`D0~3Pl@4GL>3OA@0MAb;AA3XCoSooc?0 +Pl@LGeiKI8l5~4Pl@4GL>;CA23jA29CO1VPGT>eJEd53?0Pl@LGeiKI8l5~4Pl@4GL>;CO22N@`@ +3h9Y~3RdDDj5Gkoon9AN`;`7DD<l23a1aOGU]TS`D0~3Pl@4GL>;CO2;0C]557<4j`F;`8]558]e +l8?648]Mk8_kRlS1j@;cYH_8Pn43ljB;AA3X]?Oooh_3Pl@LGeiKI8l5~4Pl@4GL>3OAC_MQ@c +`8?475mNFfB?1@00~2Pl@4GL>;MAB=OQ2;anSUC000UX?^18_?mmTScc_?3iC1PN7o~3:o69MNR; +EO0cbHY:38U=i3_a3hiH~3j9_joon9AN`;`7DD<l23a1aOGU]TS`D0~3Pl@4GL>;AA2;ENb;l8_j +Reg`Ra^;bl7Y0_>URl^3h@?cY8_bj0Sgoon;aX?475mNFfB?1@00~2Pl@4GL>;ENB;ANPk`Wd8 +Rdg`j4Kioon;AO2;GAB968?048?475mNFfB?1@00~2Pl@4GL<0~<EFQH0080I?le~4RnaTRBd0 +~3Dh?\48U5n0_0MA[71Ea@0`0<~3Pl@@FfB?1@00~2Pl@4GL>;AOSf@4B0M1[71Ea@0`0C~3Pl@@ +FfB?1@00~2Pl@4GL?7AO01~3RdGhPWPe0GDFRdPPRdT@RDQ@ad1D~4jF00~2o8]Mn89k=@0?QE80 +~2Pg]00g@GRl?XGR4000_0M0c7@`@0~3Rd]<R@^=COAAJP1Z08]=n?ma8;04j000~2Pl@@RlP; +`7@Ga`ELD0<0?00008T=@5P30<M5l000~2Pgg`07@cRdGhad0@~4RdP8P^7nRDP8P^7mRDP8aT0J +0fK7@3Kooh?445]TS`D0~3Pl@4GL>;AOR2B0P2Pl@@FfB?1@00~2Pl@4GL<0~<j@00~2Qm^@j@00 +~5EH_\DeIGRlZ;d8_iRoLc`8?9oo:^Ro[gdH_IPlWolZi?Rl_1j@;cYH_;Pn43ljB;`UmNFlW3 +~>EH_\EUN;bX_@RoTc`8?9oo:^mm4[nH_bljId1A_0PmSoGek9``00~=EH_\EUN;bX_@RoV;mc?0 +PlWolZkgdH_1Ro[1j@;cYH_8Pn43lj@[n8_7Gek9``00~<EH_\Pn`8RDD8<m:=A@SXbB`008?4 +2<W3~<EH_\Eh_h<l23bOob[_OABH_1GlW3~?EH_\DeIGRoZ;d8_g<\3b[X_2:oj;eh_hRmn3bOlb +`?:^Rl=?Rl[1j@;cYH_:Pn43ljC61`1OGU_9``00~<EH_\EUN;nX_@RoLc`?:^DB_nRln;nX_1 +`NT2ljF;b8?Q0o>TFC?0ljZ;`UmNbL<0~<EH_\Dh?\=8_HSDg<DK01j000~2Pl@4<lV:CLj9CMPc +bHY=cHU=g3?9RTg<RDgP<lV:CM29CN@cbHY=dDV9CNPcbFJ;CM:1jF`7~2RDg\adGh100000_K +M1:=AMSX3TT008_;R@63a3AKbL>=AMSXo4P008?4=5_9``00~<EH_\Pn`<DeIGRED<RDd@RDGl +2lUd@H8h;7DeSG01RGGlRaeTC`<0<m::5S?0IX\4DoK027@QRl16<lV:3S?0IX\4BoK027G`RGGl +j`Z=@00c`5mNFlW3adGd~4RdGlPSP]M@k7AO@1~3@8U5o>\=o8]5o88h:gD4@8U5o<M5n000~2 +RceTC`<0RgGl<lV:3S?0IX\4CoK00W@[<m^=@02;`c?KRQj3jc03`8d4P0?HAS?9RPhc`6J;14of +`09eh8UMn8Ueo8]M38]=o8T;Pggd07@8RdGhmmS[1?b;AOQOGU_9`eF;k5=FEh?\>;Sd>`<0j0gc +oon9ANb9AO0;`7@5PSP0MEVQ43H308^0U04008?018\=n3\308T8XA0f0`2;P9@1~2a`0\0@00 +XA0f0`2;P9@1~2Pl0\R`gl>`<0R@S71A`g0`1@AP00a`DH=`<00@0008?4>5mNFlW3ReG\RoXc +`8?9oo:^Qm7gdTZ3nP<?P\L3~2RaD@=P<0RkZD0@00PlL4Ro5VYJB;5A0f0`2;TY@1~2aT87088i +07@LSE41REG\PSX0M16=D@:9ENb2>P1d1X?10hU=k8]5k88h07DlXA0f0`2;P9@1~2a`00~3XA0f +0`2;P9@1~2aT0\0<L573L3~5a`DH=`<0~4Pl@hGeiKbL<cbHeEl8]5k>S]oOooRDG8R`d@=P<0 +RhVD0@00RdG8JM0l~3RA6;CO29CNb2>@1e=8\=43H308^9U0400<I1;031h0B=1<2=342=3<R9 +3A`g0`371APg0`00~3Pl@hGeiKbL>Q43H308^hU04008?7;8]Ek8_bIZFTXA0f0`2;P9@1~2aT0_ +08]Mb<7S18dLfhd4Fhd4`j<L=`<0a`DH=`<00@00088j07@C<lV;`491PSX0M0F3n@=lm8UEk8]5 +k88h00n4L@800;T1~3SEG`j23moon9ALR;GLR3n`4?S5D2~2Po\<3hm<0P00RdG`RDG\^@40~2 +SEG`j?Gloon9ALb;AO0kAN`?Q2X2~2Reg<Po_l3h`N0P00Po\43hlE0P00RDG\^@40~2SEG`j<7l +oon9AM2;GN`iGO0?Q?H1~2Pgg<07DEReg@Po\13hcT0@00Po\O3hoK0@00Pgg<07@DRdG@2l0? +S<X1~2PoP63ho10@00RdG`RDG\^@40~2SEG`j6[loon9AMB;AO0kAN`?Q9l1~2RDG\^@40~2SEG` +j4_loon9AMR;GMR3n`4?S801~2Po\<3hmg0@00RdG`RDG\^@40~2SEG`j23loon9AMb;AO0kAN`? +Q5D1~2RegLPo_l3ha90@00Po\43hm00@00RDG\^@40~2SEG`j>ckoon9AN2;GN`iGO0?Q241~2 +PggL07DERegPPo\13h`?0@00Po\O3hl60@00PggL07@DRdGP2l0?S?D0~2PoP63ho\~3RdG`RDG\ +^@40~2SEG`j9Gkoon9ANB;AO0kAN`?Q<X0~2RDG\^@40~2SEG`j7Kkoon9ANR;GO0kGN`?Q:\0 +~2PS\03hFR~3Rad@=P<0Ri^D0@00Rdg8RD\8Rdg<Rad@=P<0Ri^D0@00RD\@Rdg@Rad@=P<0Ri^D +0@00RD\HRdgDRad@=P<0Ri^D0@00RD\PRdgHRad@=P<0Ri^D0@00RD\<RdgLRad@=P<0Ri^D0@00 +RD\DRdgPRad@=P<0Ri^D0@00RD\LRdgTRad@=P<0Ri^D0@00RD\TRdgXRad@=P<0Ri^D0@00RD\X +Pl@hGeiKbL<0~;EH_\DeLk`WhK>lQo2c_:O0Lcfn\8SD00^`40~2Ro_[5he003_8OP`kbWd8^`40 +~2j`?l<m^;n`_oMCHkb7DGRad@=P<0Rk^D0@00RelX0elP>edDOQ\kbWDPRad@=P<0Rk^D0@00 +RelT:elX>edDOPVh0P0005mKbL<kb7DVRad@=P<0Rh>D0@00RePPRgdD>mmo40=H:3_OOPVh0@00 +05mKbL<kbWDaXA0f0`2;^9@1~2RdLTRedD>l=n72]7:3_3OaF3OAP0M0Vh0`000>\4Rl0c`5mK +bL<c`5mKbL=ERnb3k0QCEUL;bG@CRad@=P<0Ri^D0@00Re\8ja6;`8\M43H308^KU04008]K38UM +o0_9M1:;?A0f0`2;_i@1~2Rgl@ja3lRad@=P<0Ri^D0@00Rg\DRGgh2lUd4X\M43H308^KU040 +08]K6>\@o8\M43H308^KU04008]K78_hRdglR`b:RdDD0l63`0Fn1`0009WgoX_70l\[bX]Mn?OK +Bhdlg@00~2:o\[cdV925mNFlW3Rl1ERnb3k0QCEUL;bG@CRad@=P<0Ri^D0@00Re\8ja6;`8\M +43H308^KU04008]K38UMo0_9M1:;?A0f0`2;_i@1~2Rgl@ja3lRad@=P<0Ri^D0@00Rg\DRGgh +2lUd4X\M43H308^KU04008]K6>\@o8\M43H308^KU04008]K78_8RgglRgbjo4N;AA@3ah?01Kh7 +~3VOOnmmZ3`PNn1`0008_2VOOnRl6;MOQ>S@ce~4:lh3b`?:0lm9R@QOGU_9`he005F;k5>9E@b9 +CA2;5A0f0`2;TY@1~2PgX@07D@ReX8Re8H0eBIo4Z94>]7o8\M43H308^KU04008=k401n7X_H +ogDD^@40~2ReD@Pn`<j>Gnoon;`h?44>\HRl3oMABi0@0008]E48?\3>PAo_ooPl@@XA0f0`2; +V9@1~2Pg\D07DFRdD@Rd\<Re\L0eb8o4^;A@b965_9`j4@=P<0Rh2D0@00PgPD07h?ReD@RdD< +<lUKbNUoo_ooReD@RdD<<lUKbNVhoOooEH_\Pn`TDeIGRED<2l1d1H<hogD7<l1OGU_9`h\@:m69 +EOP;dWd7<l1OGU_9`h]=n8_1^h1A0@2Imo^;f8fk:eh008Umk8d4_@00~2_[D5~2VOOnRo29MNQ8 +VHOjUX?W0`?g`Oh2JOQ]0@000oj9OM`[edZ9EOC1h`N=7=^=5=^=59>=55<[bXU=o9Tc`R_2Pn03 +<l8[`WD:^3@l0`3[28e00;P0?0<0RDG`PgdD00n4kP0008\M43H308^KU040089k;01e48]M3<M3 +8?oooooYe`000?coMMb;CO2=EN2=ANB3k0cXC?kooh]M60_K3iC1PN7o~3DOmeo8]=m8]Eh8]5 +i8?\3>S9noooPl@TRdd<RD4P2m]e2H?h0@n5R@0008]M38=k800?SW`0~2Rad@=P<0Ri^D0@00 +RdGl0d<X^h1A0@2Imo\;`7i0odG\PGgdK@4007D8odGX<l3[2?b;AOA0RDGdRDGdRad@=P<0Ri^D +0@00RdGl0d<X^h1A0@2Imo^9EOc[8He00:4@=P<0Rh2D0@00Rd0X0DGlj`_lRdD<ad0P~4RdGX +Pl04ReD<RD8DRegdREXLad8@~4RgG`PlH4RGG`>Aio3Om248?613TNO_J9MO2;CO23j@B9CO2; +M@b;GQ`[6D>9GPb;ANb3`0Fk1`0009WgnhUF68]mo8_7^a0>~2VOOkRlZ;f8UN28d4W@00~2`N<6 +:mR;akll~3VOOo:l>9APBk?00008_1VOOkRlJ945mNFlW3~?EH_\3j\@^000~23i;0bL>@~3EH_\ +Dh?\38U528UE3<M5n000~2PgQ00g@ORdQ4Pn41MAN2N1X2MA7XRa<008?h0GD7adGhoooooh=m +n00?QK00~2Rdd8<l2:@CD;`7@ePoP1M0SYR`0008e008]528]8A8?Q0GD=Rd0PodP8jH40~2Rl2; +A@R;@23XcGP00>U_~3Red8og<P\07X~4Pl@4RDGh2l1e6_I3A05d;omc<;01j000~2Pl@4RDGh +2l1d6h]5289820;71Ea@0`0l~3RdGhXd1H0`3[8h]=2?ma?;01j000~2Pl@4ja6;`;[k~3^6Pl +0`3X7G<008=mn01e3h]E38]52>R`JP00j`V;`<M5n?oooon;AOR3a0aKbL<0~;EH_\DeIGPn`X +RDD8RED<RDd@mT080W@Aad04~4<l23a2QOGU_9`h]528]`?8Uel8]m38Umk89h=01e6h]548_@ +Rl[1j@;cYH_:Pn43ljB3a2QOGU_9`h]548?h0GHSRdg`PW`1o`d?QGd0~2B8U548]526K7@3H= +0>U[~3SD00Reg`RP^;MNb83X8k3@n5B00008\=G50308U=j;T1~3Rm>;O@R;anScE`00PoP1MAZ: +2h;i2W@;IX7Qo`1VRDlfjaN;ANc600[[3h]5j:=LD0<0RdD8PV08o[P1~3Pl@XGeiKbL>;GO29 +GNBh3@0008]e28_k:ghlReD@RlX[ch]mi0_TlZj=Oomd0S?oRlZ;aP_o3hBh~3RmN;MNb=@022 +NP4:MCZ9AMR;aXU=g9>;l8_kREgPRmX[f8_3RlS1j@;cYH_8RdGHPn43ljB;CMb;MN03llH62TJ= +FP;[=X_0Roj9CMb7nhU5h8_::lm1RoN;nh_1RDgH`NT2ljF;b8]5h8?Q0o>TRdgLRggHRo>=FP43 +mhUeh8_iRm29GMbh3@0008_c:g8lQggL:lj;MN0;i?:^SGooM08coh]=g8_2RmL;o`n5E_ooohUe +k8UMl8]El8]Mk8_bRo^;A@P[D3b;AA0[`X_@Rl[1j@;cYH_:Pn43lj@[G@`3`h?4:5mNFlW3~2 +EH_\Pn`8RlZImoV9AOR9EOb;A@R;COR928]=o8U81<W3~?EH_\DeIGPNb8~3RDD8RDd@2lUd20_0 +MA8;dWD>PlSoPLB8~3GeiKbL<;dWDNPgd80GDHa`ELD0<0300008?8oh74R00005mNFlW3RdD8 +RDF@2l1e3<M5c9C10@29EIC[?H_J^?01~2j?SWoon;dhU5W0_0MAO71Ea@0`0=~3adGPooooonWo +2000o8UEU<M5X000~2adG<U<810<M5h000~2PgdH00nD`8Q5YX]m]8]=48_GRmV;nc?0PlWolZkg +dB_i^2D0~2lZj=Oomd0S?oRl^7ehUE`0_B3h@V2000JR1Z02_CDU>=EI1B\0GoELb;bh?458?h +nWD;megPj@<8~2SD00RmV;CL2;AN03`B_3RDGP@LM5f000~2^`40~2<oJ;`8_A@C?0RP:3j223 +n10?QhT0~2obB5@;T108_0W;T10<2i0@30^@40Z;T10<2i0@30^@40`;T10<2i0@30^@40`;T1 +0<2i0@2@^@40`;T108Bi0@30^@40`;T10;Bi0@2;aX;80H_`jcJ=@02;aX;80X_`jbZ=@02;aX;8 +18_`jaj=@02;aX;828_`ja:=@02;aX;848_`j`J=@00cfdT;f`n5FOoooh_FREGHPSTZMB>;AAB= +F0B9GAB;08U5e0_0O@f2bP6;lXUef?OHRDGD@N\do<M5e000~2RaeTC`<0<oKl<m::4FJ;15>3 +h09d4h_6Ro:3kS03`8d4P0?`@N_RRl29MMB2>Bid3<M5g?oooooYD`0008_a@H8i:WDHRlj;AAB= +F0B9GAB;08U5g8?10^\fSD00adGL~4RaeTC`<0<oKl<m::4FJ;15>3h09d4h_6Ro:3kS03`8d4 +P0?`@N_RRl29MMb:0CaXM0PlK7@4?4ae2hX1R4FW@N\7SD00aTFW83?0RP63n2D?Q><0~2PnQ5 +PoPc3hLO1P00obB5c;X108bl0@2<_040S;`10>C00@3T`040i<010>C00@3T`040i<010>C00@3T +`040i<010>C00@3T`040i<010>C00@3T`040i<010>C00@0d_@40i<010>C00@3T`040i<010>C0 +0@3T`040i<010>C00@3T`040i<010;bk0@0d_@40S;`108bl0@2<_040i<0103Bm0@3T`040i<01 +0>C00@3T`040a;l103Bm0@0d_@40i<010>C00@3l_`40i<0103Bm0@3T`040i<0103Bm0@2;fFXP +JP1Z0E>=AI1@\0GoELb;bh?458U5j>Ta1@00o89mYf`?QGH0~2RmV;AAB=D0B9EAAVRa2=AJ[X +m7L008_;RDGXPoSoM@k7ANP0~3jOX4~2Rl2;AM@[ANR9AM0;`7l;adG@~4j`^;`?I5f05d0oMM +d8_IJR3oMM2;ANQ@SDFZD8e5T52`1OmEc8_;Pl@DRDGXjK84~2Rl2;AAB=F0B9GAB;08Q5ZX]5 +e4R9AM0;`7d;adG@~4j`^;`?I5f05d0oMMd8_IJR3oMM1Z0He5ZU2=AI1@\0GoELb;bh?458U5 +j>UP1000PSU6MA>2OJH0M0g7ANP0~3BNU81000RP68AJ^;ALb9AIR:AJN8AJZ2OJY<MBF;GAB= +@a29AAB;0hV5M?oooh]318V5N?oooh]328V5O?ooon\DRedDSD<8RDDDR`>9ANb;@`B9AO22OJM< +M@Z=QGCoooo[1H_0SDG\RmWoMAR=EJYBogGLogGDRdgHSEF@Pn`<j91g~2Rl^3a1b9ANSY^`<0 +08e0089mYfQe5X8iL7@ARdDDSEP4REdD3kl0RDGTj`j;AAB=F0B9GAB;08U5i8=mg01m3<M5g040 +~2jan=@023OM`0MA:3ON@0M@c7ANP0~3jF@3~2PVGHkh8iL7D;aTFZK<I5ZeS[3?b:AJN8AJZ: +0HQ5ZhemShUm[89mZfme2LM5^0P0~2ja^:AJ\lN7@4?5Qe2LM5^100~2j`O7AKP:~3adG8~4RTF[ +?6Ad23aY3hE0~3RdGT2l1m5<I5Z2g7ALP1~3mmR9ANC[9h_0mTGH0W@>aTFX:lM5b040~2ja;l +mTGH17@;aTFX8<M5b040~2PWf[F7D9^1100`3[1h_0^2A00`29AK22OJYXM@eVRegTPN?oo`00 +REgTRgGT2oId9X]E\8]M^8U=4?a?RlJ;lS?Bmo>7lXX<<XP?Ro0;`7GZRGGTRdd@SEf?:mn9GKb; +AM`[`hU5i0_0OPC[18_0<l29ALCfAMP83h@i~3Pgfl07HcPWf[KgDARmR3n`5c9\M5a040~2jagl +RTF[?7Qd13aHMA76AJP`RTF[R4FYadG80P0008]5e2]5_2]5b2]5a8U5i0_0ORGfAMP1M0Ogf8U5 +i>\OmTGH47@IRdGT0DG4adGT~4j`Z=@037AN@0~3RdGT2l1n0^\2<l2;fFXPD?meb8eEZ5:=EI1B +\0F;MLcoeX_;RmJ3a1B9ANR3n?Yd6VX`RdG4D?me_5N=AI1@\0GodX_;Pl@DRDGXPggXnW@XRdGT +2l1m1N\5SD00<l2;fFXPD6X0JP2=EI1B\0GoELb;bh?458U5j8=mj?X?Q4H1~2RdGTVC?2:l:; +GL@3GK`3GLP3f8UMj>T[0@00SD00PWfWJ7DFRdDDSEP4REdDR`2;GN1VRAS[4he008]558eH18UM +58\0RegPRAS7ANP0~3jO00~2RdDDSEP4REdDR`29AL0;`7DZadGXn_oooh=mX00?Q<d0~2RmV= +AI1@\07X408008_;Pl@4jKH0~2Rl22OJM\MBj;fH]5c8U5V?meg?mee?mef8e5T53oML2`1NRW +1000Rl^3a1B9ANSYPP0008_0RoN;fH]m`3?0PlWolZj7fH_nmm=;REgXPggL07d6REgLja?lRdGX +>dGLO@C[1H_0RdGLRDGXRdGD:dGXRDG@2l1m2LM5d000~2j`WfAMP1M0?gGM2;fFXPogG@RdGX +D?me`8e5T52`1OmEc8_;Pl@DRDGXj`Z;`<M5j000~2BH=mj?Ye1_MMh>\=o46;ANP1AN3Y[?Oo +ohUm]8U=48]Mh0_K3haS~3ReD@RoXc`8?9oo:^mm59RDgXJR1Z055BSEF@D[05oeG<Pl@DPoSj +M@[gfhUMh>\cSD00RdGX0DGPPgd807D8RdFDaP00jab3OJ00M1J=CI1A\07Xc`0008?418?hnWD3 +megPPgd807@8RdFLj8KKoon;AN21a8P0~2GeiKbL=ERnaCEUN;MA@;mWh^<l2:AAR:h8_8`N4@ +2l6;E@R;NPB;gX_;`NT2lj^;bh?Q0o>ZRlj;@P@3`HU218]E40_BMR6;A@R;N0B;M@b;fX_;`NT2 +ljF;bh?Q0o>TReP40mZ9F0B;MA@;mWdammj9MA@c`8Y568[PRmS1ha0;`h]M28]k18_FRl[1j@;c +Zh_:Pn43ljZ;D`@3eXUC18]550=545mNFlW3Rl1ERnb3k0b;A@R3>05e7H]848]@18]03>QDG000 +PoSoMBJhn_oooh?43<W3Rdd8Re4@Rd4<j8=b~22l1d2[SjooooPl@<bL>;C@S7@A00~3<l23a0c9 +`eF;k8?\55=FElM5o000~2RgD8Reh@mm^1`o01~2REghRgdD2ol?SZh0~2RGglRUDHRl0kn`n< +H00008Uml0nf`XUEm8[PRlS1hA0;`H]n38]>48Uek0?iRm>;lX_>`NT2lj^;cX]ek8?Q0o>ZRgg` +0EH@E[01j2cooon;EOB3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9OAB9GOPc`8Y5 +68[PRlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]e52Uen8]E40_B3hJh +~3RdGlPoSj3hB\~30l:9AOb;O@b;MOR;G@SlRlHk`Pn7GP0008Uek8_?REG`Rg\<Re<@0oZ;lHU= +m8_@Rl[1j@;cYH_:ReG\Pn43ljB;OOB;lP5345>`0NQVo_ooReG`Pl@4PoSjM@_7AOcjooooja:; +`8_6:m03o[k`0@00ji^=@029EA29O@b9MOR;A@R;N0b;F103nh]e38]M48_CRl[1j@;cYH_:Pn43 +lj@1F12;AOP[`hU5n8]m50_o3hfm~3RdGlPoSj3hBa~3mmn9OA@3ahU5o8YE68]Mn8]e2?`kn`n< +H00008Uml0nf`XUEk8[PRlS1hA0;`H]n38]>48Uem0?iRm>;lX_>`NT2lj^;cX]em8?Q0o>ZRgg` +0EH@E[01j9Smoon;ENb3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9OA@c`8Y568[P +RlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]5o5mNFlW3SD00EH_\DeIG +Pn`PPgdH00n==`0008]=28U=j6J3>@1d3Ob3`@9VPcT0MON9CNR;ANP[A@RIPn810l;An8U568]= +48?Q27D5dN29AAR3OAP0MB2;C@b;D@QZ8?me56X0ogD8DK05om:3a1B9AO3Y>P400?I540P?Q9H0 +~2RdDHdN3Xf=[oohU5k0_0MAW7AO3jooooa`ELD0<03@000>Vi~3SD00Reg\REgPRgD8RGGXRgdH +2ol?Q3d0~2IX<n07@gRdg`IX\FRl?XoVd008_8PoSoM@Nin_ooon\@0mU?PlH22omd1VJ3?P1e +f8U=l8Um68UMh8Uej8=ml?X?Q5P0~2RdGP:dG\RDG`jDX0~2RdDHj4CJoon9AN`;`7DEadG`n_oo +olL5G50300d0~2jbR;`8]M68_3j1kJoon;bhU5k8]E2>P1K000RDG`PoSoM@O7AO3jooooReg` +Po_j3h@l~3RdDD:l>9AN@;`7d:adGT~4j`[lmTD@0G@3megTRdd<Rg48JR3oMNB;EO1BogG\DK05 +omJ3a1B9AO2;ANcXG]Kooh]5l8?485mNFlW3~?EH_\Pn`8^Qh0~2XA0f0`23`2CXY>goo`_03hG: +~3R`d@=P<0mT4T0Pn5^P000>S7~3X@Pf0`3XNLSooj4<=P<0j6o8oon;3@`f0`2;BC`;bG@;DK01 +j000~2Pl@4R`d4=P<0RdTl2lUd2e6`0NP0~3Pl@4R`d8=P<0RdTl2lUd2e6`0NP0~3Pl@4<m:Q +13H30>SWF000<m:Q23H30>SKF000<m:Q33H30>S?F000R`d@=P<0Rd4dj87EoonQI4l308?X0^Qd +eOooR`d@=P<0Rh5H0@00j6?Eoon3a0S9j@YM~2Pl@8bL<0~<EFQH0080I?le~4RnaTRBd0~3Pn`D +adGl~4XA0f0`2;P;01~2RDGh2l1d?8_0RdGhRdPTRDgdRdQ4Pn4PMAlcd^R8k?oo2l1e2?m5o>\? +SD00adGlooooon\=SD00RdGdRDGh2l1eaX]5o8?456B?1@00~2Pl@4GL<0~;EH_\DeIGPn`DRDD8 +mT080W@Ga`ELD0<020000;P1~3Pl@DGeiKbL>;C@R2NAX0M@k6@AX4<l23a1AOGU_9`h]=28=i +@0=e5LM14000~2aT4J13?0Pl@DGeiKbL>;A@R;B0B9CO1VPgPfog@:@HU=l6K7@3Kooh]e289n +6P4?QLl0~2adH@~4ReG`2m8?Q:L0~2RdI49H00~23hFI~3PWhd0@n5C00008\n^0X0~2Rdh42nCb +[Xeoog@2<on;aP_oM36;mh_>Ro12@H_i^0X0~2RmT[7X]>12_;2nCb[Xeoog@2<on;aX_g2ome +ehUEl8U528e=k55Z0H]=l?OIDH]=2?ma8;04j000~2Pl@@2l1d7<L5G50303`0~2Xd1H0`2h0@00 +08?455mNFlW3RdD8PV15kh]528]HC8THad04~4jDH0~2Rl2;G@R2NaX2MC^;OO2;ch]CC8_3j4`0 +~2>lMd6LM31000~2Rd]<R@^h0@0008?455mNFlW3RdD8ad04~4ReQ<RAR;G@S6@aX4<l23a1AO +GU_9``00~=EH_\Pn`XDeIGRDD8RmR9E@b9CA37AM`0~3adGl~4adG\~4mT<h17@hSD=8D6X2JP3o +Lb2`1>P0~3Pl@@RDGX2l1d7<L5G50303`0~2Xd1H0`2;`h98208c`5mNFlW3Red8PW\d0@n53P<0 +08]538U5n8]548U5l<M5m00P~2Re\lREgT2l0?QW\2~2SD00ReghRo^h2P0008]=l0_TlZj=Oomd +0S?o2ol?Q2P2~2:o^9ON0kOOAc1X_7j`F;`8]5m8_@ReghRdGTRo>9GMR;n8_JRl_1j@;cYH_; +RegHPn43ljB;nh_b0oj9OOP3aXU5i8]Mm2_NREgdReG`:mJ9EO0YMN2;CN`3cXU=k8?k0Pn2\@00 +06J;=G`l0`1VRC17RGgh@HU=k8?00XU5i4Z9EO23j`:9GOCoAM`;f`n5^P4008eMo5=X020008]M +2?mc??mc8;04j000~2Pl@@RDGXPGgl020007D42l1d>h]M289;20;71Ea@0`0l~3RdGX2l1d1>\7 +Rl2h7@000:=0F0<0RegLmm^1``0P~2RdG\:l=OGU_9`lM5g000~2RdD8Rd0lRDGTadGd02000>Tg +0@00o8e=o56;GOCgfh73020005>;C@SoLCcoLB2`1>P0~3Pl@@RDGX>eglM@@;`7@oRed8PT\8 +0\L5G50303`0~2RdGX2l1d1N\8SD00^1d0~2Xd1H0`2;GOCgfh73020008]5g0=5k2_3GeiKbL>; +GN0;f`n6I@0008e=o55CogGhRdd8og4P\0CX~4Pl@@RDGX>EglM@@;`7@]Red8PT\80\L5G503 +03`0~2RdGX2l1d0n\6o;PM~3Xd1H0`2;ANaOGU_9`h]5o2U5h2U5l8]Mn0?HREgh0DG\RdD8Rd0l +IX\MOc`306J96?m5n8?00XU5i?m5k?m=l<M5m?hO~2adGL0@000>\YSD00RgGhRggTRdG`RmR; +bl7Y0_>URl^3h@?cY055k2U5m<M5l000~2Pgg`00n7R?goohe=o56;GOCgfh73020005>;C@So +LCcoLB2`1>P0~3Pl@@RDGX>eglM@P;`0n4T@0008]M289;20;71Ea@0`0l~3RdGX2l1d1N\8SD00 +^1d0~2Xd1H0`2;GOCgfh73020008]5g0=5k2_3GeiKbL>=COaARed@Dome38]=2?ma8;04j000 +~2Pl@@RDGX>EglM@@;`7@URed8PT\80\L5G50303`0~2RdGX2l1d0n\6o;PM~3Xd1H0`2;AOb9 +ANb;ANaOGU_9``00~:EH_\Dh?\78U528UE3<M5l000~2adG\0@000<H20LI20@?7@PP0~3ad8< +01000<M21000~2ad8@3P0008\=I4l303?KRQPcdVJ;55Wf`PQd5?a0<m::43?KIX\LDOK327G` +RDD8Red8<l2:0h?XHH?h5Pn7RP000?lTQGC>0@2=@03XcP40m<h10?C>0@3dcP40m<h10?C>0@3d +cP40m<h10?C>0@3dcP40m<h10?C>0@3dcP40m<h10?C>0@3dcP40m<h10=3>0@3dcP40m<h10?C> +0@3dcP40g<h108]53898107[8he008]5389810;[5he008]5389810C[2he00>TI1P00SD00Red8 +@hUM23?0RP>3n2]d38?hHW@WjD80~2Rl2;G@b2B`@8RdD8SDP1RDd8PSURMB_60`23`0:9A@S[ +88]M3<H308]528e80HU=288i:gD<PT\428?00XU52>\0RdD8PSP03hBP1@00R`eTC`<0RdD8<m:: +43?KIX\LDOK327@H@3?BRQ0cffJ;757f``Qel8U52>\ESD00Pgg\07@<RdD8PSP\3hE\1@00XFA? +0`2;C@PcfhXIIX^4F0@4~23ko02l0?Q3<5~2PoP\M6:3j6:3n18?Qah5~2obB5h<l108e004c@ +0@3de040m=@10?CD0@3de040m=@10?CD0@3de040m=@10?CD0@2<d@40m=@10?CD0@3de040m=@1 +0?CD0@3<dP40m=@100SD0@23OO003hGL1000odD8adG`0@000<M5k000~2jJ`4~2^@L0~2^SQ0 +0`2;G@R;`nPhGP002l2;``n5Z0@008?01hU528\=I4l303?KRQPcdVJ;55Wf`PQd5Xe0040cdXX@ +<m]VRaaAm\<8MO29A@R;G@R=@`69A@R2>cd?QFD4~2R`eTC`<0<m::43?KIX\LDOK327@ERl10 +<m::43?KIX\LDOK327G`RDD8^@X0~2SEGdRed8Rl?XQel008U5n3]Mm0n47@@008]=3?I1405d +73gdO`00MS?71Ea@0`0a~3^040~2Pl@LFlW3PGghn7l007HEa`ELD0<0<@000;P1~3Pl@LFlW3 +Red<Rd\@Pn42MAf;COPiB`Qf5LL5G50303<0~2^040~2Pl@LFlW3Regh2m]d2X]538UH389P4?^; +AOB9A@S7AO00~3adG\0@000>U^0`00Rl2i1@000;Y0@0<0Red8Rl?Xn5`000_0Rl<?QFP3~2Pl05 +RDD8R`eTC`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5288k +?@n59@<008\=I4l303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52;T:~3SEGd +Red8Rl?XAeh008U5n3]Mm0n4g@8008]=3?I1405d73gdO`00MS?71Ea@0`0a~3^040~2Pl@LFlW3 +PGghn7l007HEa`ELD0<0<@000;P1~3Pl@LFlW3Red<Rd\@Pn44MAf;COPiB`ac5LL5G50303<0 +~2^040~2Pl@LFlW3Regh2m]d2X]538UH289P4?f;AOB9A@S7AO00~3adG\0@000>T^0P00Rl2i +1@000;Y8@0<0Red8Rl?X^5\000_0Rl<?QBP2~2Pl05RDD8R`eTC`<0<m^:63?BIX\DFOK227@F +SD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5288k?@n5i@4008\=I4l303?BRQ0cffJ;757f +``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52:5TC`<0Rdd8<m^:6FJ;Q5P410003ko0PoQVM0f3n7Id +5>U3~3SD00RdD<PV0@o^\oSD00Red<Rd\@Pn44MAj1N`cdO`00MQG71Ea@0`0a~3^040~2Pl@L +FlW3RdD<PTP@0N\:Rl3YC@4008e008]528e@0HUE28\MI4l303?9RPYVPka;10@0069e1X?00XU5 +28]5389P4?O7AO00~3adG\0@000>Wb~3Rl2i10000;Y@@0<0Red8Rl?XO5X000_0Rl<?QN`0~2 +Pl04RDD8R`eTC`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5 +288k?@n5Z@0008\=I4l303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52:5TC`<0 +Rdd8<m^:6FJ;Q5P410003ko0PoQ]M0G[;he00;T6~3^UQ00`2;G@R;`nS@F@002l0?QD80~2Rdd< +aT410H?31XUM2>\5o>\`Rl37AO00~3adG\0@000>\4jab;`8]5288h00n5H?[ooh=ml01e23?0 +Pl@LFlW3a`ELD0<00`000;P1~3Pl@LFlW3~=EH_\Dh?\98U528UE38e=g8U=m0_0MCF;3IAC0`29 +COP;bGDN^>`0~2j?k:oonSU5<308U5n0_0M@Pc`8?495_9`j5LD0<0RDG`jc>;3C1H0`29COP; +bGDN^>`0~2j<W:oonS<5P308U5n0_0M@Pc`8?495_9`h]528\0RDG`Pgg`?7DSocE0F0<0^X@l +0`2;AOB3k0SXhK;ooh?43<M5k040~2j`SladG\~4ogG\SDgdDH]=38]Mn8_CRdG`Pn`<j0<c~2 +Rl>3a3QKbL<0~>EH_\bNVoGP00SD00EH_\Rd08bNWlB`00EH_\Dh]8288i07D8Pl_oja2=@02; +B0R=F@69F0PcfhXIRl=KbL>;`5F;k8?hog@6bNV2GP00bL=ERnb3n?md2H]B2<WY@e\00<W3o5F; +k8?hog@3odX8bL>=@01ERnaCPna0RDd@adGd~4adGh~42lUe23?0PlA0FlW3PoP1M0N3n09d8^\` +2m9e2H?8oh?4@5_9`lM5i23F0@37ANQTeP40REG\jbk7AN@DeP40adGXE=H10>\N2m9e2H?8oh?4 +@5_9`lM5i2cF0@37ANQheP40REG\RdDDRDGLRdDHRDGPRl2;CA0c`8X12l1d2H?h9G@<jbj;`>VK +~3SD00ReD@@Xe5b>Pd4@00RDD@RdgdSEG8SDGTj2\H~2RDG`jaf;`8eEi8]M48X3j0<1~2RDG` +@hUM4<M5b040~2RdG`Pl06PoP5Mc[o98F4e`40SD00[=L10;CG0@2de`40ZML10;CG0@2Le`40 +Pggh07l7adGhooooon\Mo?m=4>UPooooRdG`0DGdPgg807D3odGhjDcooon;AOR3a41KbL>=@01E +RnaCEUN3k129A@R9E@b9CA37AO00~3PgT407D:<l23a11OGU_9`h]M38\cRl?oeX_CRDG\RmR; +MO2;A@SlPo_oM2>;CA0iL@An6`_0M0>8642;fX_hAX\CRl?odX_CRmR;an_Io8UMk8Uel8]E38]b +18]5k?oFRdG`2l1n1>\5Rl23b?n3a11OGU_9`oaERnaCEh?\48Q528_8RED<adG`~4XFA?0`0? +]]TcbFJ;35Sf`@Qd>h_0RmZ;4h_3om:;dhU5m8\MI4l306J;34>3h@Qd2?m5l>_OSD00ReD<RdX4 +RdGdom6;AO23a11OFlW3RdD<Ra3odXU5m3?9RTd8>l5e3;P1~3Pl@@Ge_9`h]E38]:18]mm8_7 +om63oome1X?8on\6o;SmooooPl@@Ge_9`eF;k8?\3=]m33?9RTP8PoU<M363nFad2>UC~3SD00 +RdPDSE44RE0DR`V9CO`;bGD4<l39`h]=o=]]3=dIjD\0~2o8]858eA18U@58\9RDgh2lUe13?0 +bL>;COR;E@b94H]E48UA18]E58UA2>\NRdPDSE44RE0DR`V9CO@;bGD4<l39`h]5m=]]3=TH^040 +~2bL>=@01ERnb3k1ACEc?KRUP8Po]<3hBN~3Po]\M0GY>04008]H58ek18Uh58\KREgl2m]e1S?0 +Ge_9`h_IPo\1M0f3n`=d?>VB0@00SD002m9d78]Mo8\mC44308TkRce@@@<0RG\4jG81~2SD00 +Reglg@E<@@<0fN3M6nUM0@00Rl0;dW@LReglRcd\@@<0RC^;?C110`29N`CY?P4008e008]Mo=d5 +;4430=WPgA_Y:@4008_0RePDSG\4RGPDRa^9GOP;fgD6<l1OFlW3RmV3n`5d3H?k0gA4jOh0~2 +SD002m9d98]Mn8\m\T4308TkRcff@@<0RG\4Rcfj@@<0RG\8jMD0~2Rl2;GOSK;K910`3Ih=\k +jL40~2Rl0;dW@TReghRcg6@@<0RC^;?LY10`29N`B;?Li10`29N`SYV@0008_0Reghfbg6@@<0 +fN3K>nV5~3Rl2;F1B=N`B9N1B;6hUMm0_KM@Hc`5mKbL>3n@5d2h?i0g@fjE`0~2o0_BM12;AOB; +7Ga10`296>]:SD00RdGdRael@@<0PO<0~2P8UMl=U5l=THjbj=@00;dW@@RdGdRaf4@@<0RAS[ +6Xe008]5m8\MQ443087c~3P8UMk=U5k=TH^040~2Ge_9`eF;k<J49?o_ool0DeIGPNb\4`00RDD8 +RED<Rm[7ANP0~3adGP~4adG@~4adGL~4adGH0@0008];18U=i0_9MB^3>`1e6M\]L4l308_3j2Wm +oon;d`_0M@K70P40~2<l21a:`C~2GeiKbL>;A@SlRmR;4ooBThUMl8\EI4l306J;35Z3h@Qd1om5 +j>_RRl37AMAF4`00adG8~4adG<~4adG4~4adG0~4SHEPk?ooRDG\RdG`PoP]M0F3n2]e>h]Mi4^9 +GNAe4;SmooooPLB\4`00GeiKbL>;AO2;GNb80d>9GNb3n2ee1lM5f000~2RdD8Ra3odXU5l8]5 +38=h600?Q5h2~2RdG`PoQ>M0V3n6h?QIL0~2Red8Ra>;`ooBRm>9AO23n65d6X?h@G@ERdX4om6h +oOoooh74[1<005mNFlW3Red8Ra>;`ooBRm>9AO23n4id6X?hKW@ERdX4om6hoOoooh74[1<005mN +FlW3Red<Pc\0MAVi0@0008]Ef8_3j87lool;`7D6a`<1~3RdG\0dGXSIePk?oo:l>3`0>1a:`C +~2GeiKbL>;AO23n6Ud2H?hB@n5Y@4008]M28\CRl?odX_CRDG`PoQ^M1Z3n4id5H]:1?oA^?go +oon1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hIW@JPoQ6M1F;BPCodKSmooooPLB\4`00GeiK +bL>;G@R;4h_3om:;dhU5l8?hJGA7PoQ9M4:;BPCodH]M38<k07DI^@<0~2ReGHRl?X_?_oo`_0 +M@K70`40~2RdG\0dGXSIePk?oo:l>3`0>1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hKW@JPoQ> +M1F;BPCodKSmooooPLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hJG@JPoQ9M1F;BPCodKSmoooo +PLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hM7@JPoQDM1F;BPCodKSmooooPLB\4`00GeiKbL>; +G@R;4h_3om:;dhU5l8?hNG@JPoQIM1F;BPCodKSmooooPLB\4`00GeiKbL>;G@b3>`1e6KT3~3 +ReGHRl?Xbo[oo`_0M@K70`40~2RdG\0dGXSIePk?oo:l>3`0R1a:`C~2GeiKbL>;ANc60310RDG\ +Rdg0Rgg@Reg`RgFlSD00RdGTB8U5i0_03hb=0@00Pgg<00n4N`0008_3PoP[M0R3n2ed0n\]o8=m +a01e1X=mg01n3;T1~3jB<1~2Rl37AL@1~3_P40~2jA01~2SD00RHeLk?ooXA0f0`2;P9P1~2Re04 +Rl\c`6J;14Z;SEc\ooof`09d3Om5g;h1~3j`R=@02i0@000>W?~3Rl2;`h?h<7@iPoQ5M0b3n6Ed +1nUB~3Rl0;ogl6PggP07@BadG<0@000;h1~3jIX0~2o;T1~3jHl0~2Rl0;ogl<Pgg807D6<l3[ +1h_0^040~2Ro0;`0n4KP0004OYJ00008e008V=G>cooj4@=P<0Rh2H0@00Re04Rl\c`6J;14Z; +SEc\ooof`09d2DNn0@000>\fo:4@=P<0Ri1P0@00<l2:0S_3MAf3OLP0M0Ni0@000>\EadG80@00 +0;h1~3j`N;`;T1~32lUe=`_fM1^;AMB=D?n9EM@;`7h>RdG\R1Q0RDG\j`J=@03oAN2;fH]528\@ +om:;bh_HjFOnoon=@029OM29GO2;E@R;LPB;AO3oeX=md01e1X=mh01d38=mc01d?h=mg01e>H=m +l?me8H]Mk8f=H>coob_IB`_KOPVhoOooon\5Rl23b?n;f>\6o;_mooooRl>1a:`C~2GeiKbL>; +ANc6~2RgD<Pch03hES~3PWh8C7DZ<m:=QF3\oon3k0SXESP008_6Pl@8j<Cgoon3`?lK`40Uo`00 +0>\YSD00<m:=QF3\oon3k0SXk38008?428]53>RImoooPl3o6l109Ol0~22l1d2H]M3<L30@00 +08]5k8fMH>coob_3B8]Mj0=Mh0?3PLB\4`00GeiKbL>;`5F;k5=FEh?\88U528UE38_JRDd@adG` +~4aTGS08]578<h40n5B@0008?i<0n5@0000<M5l040~2R4gSRdDDRa3odX_CRDD@SD[oRDd<2lUn +88?hN7@5PoQHMAJ;CA28CN>;AAB;4?oBRDD@odd<odG`RddLPcT03hEY~3Rdd@PoT`3hED~3odG` +R4gSRdDDRa3odXU548]=34V9C@`;bGh]PoQhM0F3n5Qe8h]=7<L1400008]=48Q=hh]558\@om:9 +AA3oAO3oC@c[5h_0RdDLa`08~3j`[lRdDLa`0:~3Reg`RdDH0AR;AAb3>0Qe1kX;~3jaN;GAb3 +>a1e2;P8~3j`Kl^0X0~2Rm2;A@R9ANa2RmZ;MNB;CA2;`8]E34Z9E@`;dPn<`@0008U5g8\E43H3 +08^BV04008]j18_1<m9VRaA7RdGLm\82M0^=LM3YF00008e008U5g8\E43H308^BV04008]j18_1 +<m9VRaA7RdGLm\90M0J=LJW[;_b9AMb;5A0f0`2;TYP1~2RgX4Rl4cdVJ;54N;AMcf`X1d1Xea +bN\6o;kooomoReDL>C9n>0_fM@V;d2]Ek0_BOPn;dd\;dWh8R0Q0j`R=@02;EASo0X_hR4gSRdDD +Ra3odX_8RlOY<_oooh_0RDD8RDd@ReDDRg84RdD@omJ;A@P[ANb9ANP;`7l6PWgS<7D8RdGXjbR= +@023OO00OPZkoOooon\FSD00Pgd@ogD6PlSoj`Kl^?gooon;f8_3Pl@PGeiKbL>=@01ERnaCEh?\ +48U528UE38U=4<M5m000~2PgT407DB2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSoehU5l8?hog@e +Rdd@ReGd>E44ORZ;N@b;BA0;i?:^SGooM08co`_oM1F;E@P;dW@6R092RED8odGdjkn=@02;E@b; +NPB;AO3oeh=mm01n2X]520_0M0?6~2Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?gooon;f8_3Pl@@ +Ge_9`eF;k5>3k2R9A@R9E@c7AO@0~3RdT4RDg`2lUe23?0Pl@XFlW3RdD<Ra3odXU5n8?hogD9 +PlSoPl@XFlW3adG\~4Pgg`00n>i0000?b;COR8CN:i0P0008eEhXe5h>QjA000RDGXPoSoM0Z3 +n09d:^Ul~3ReD<RdX4RdGhom63ON`0M@^hoOoooh?4:5_9`h]5m8?4:5_9`h]M38\CRl?odX_C +RDGTPoSoMB2;BPB;AOSodH=mk01e2H?8oh?4:5_9`h]5m8?4:5_9`h]Mn8QMhX]Mi8QMhkT2~3 +SEGRSDGPj?A3~2RDGXj`>=@037AN`1~3RdGX0DGdRdD82l1d3FJ;GN1VRAR3`0:9A@R;GO1;REg` +RdD<Ra3odXU5n8?hog@82m\?Sagooon;E@b;BPB;AOSodH]5m8?4:5_9`oaERnaCEh?\;8U528UE +3<M5l000~2adG\~4RdT4RDgX2lUe4P_0M0EVa`0003?0Pl@\Ge_9`h]E3?b;fX\CRl?odX_CRDGd +RaeTC`<0IX\<@h?Q27@8odG\jmn=@023OOCoM@Z3b?n3a2aOFlW3adGT~4PggX00n>6@4008e0 +08]Mm8QMf[T2~3SEGJSDGHj?i2~2RDGPPoSoM0Z3n09d>nVL~3ReD<RdX4RdGdom63ON@0M@bh +oOoooh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9`h]M38\CRl?odX_CRDGLPoSoMC6; +BPB;AOCodH=mi01e2X?8oh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9`h]Mm8QMfX]M +g8QMfkT2~3SEGJSDGHj5I2~2RDGPj`7ladGT0@0008]5h055l8]520_0M0eVRegHIXTHPl02RDD8 +RegXBhUMj8]538\@om:9AOB;5FA?0`2;n3?9IX\<N_K127D=PoSoM0P;f`n?j_kooh]E38]j18]5 +m?oGRdD82l1d1FK7~3RdG\0dG`Pl@\Ge_9`h_0EH_\DeN3k129A@R9E@b9CA37AO@0~3PgT407DB +2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSoehU5l8?hog@eRdd@ReGd>E44ORZ;N@b;BA0;i?:^SGoo +M08co`_oMAF;E@P;dW@6R092RED8odGdjkn=@02;E@b;NPB;AO3oeh=mm01n2X]520_0M0?6~2 +Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?gooon;f8_3Pl@@Ge_9`eF;k5=GPn`@RDD8RED<R`eP@0<0 +RDgdPSXZM@c70040~2@XUE3>\9RdD8a`00~3R`d@=P<0RhVH0@00Rd44ReD<<m^:6S?9IX\<F?K1 +0Pn4JP0008]52<M01000~2R`d@=P<0RhVH0@00RgT4<m^:6S?9IX\<GoK10W@hRl0cbHX:PnT` +ReP40m^=79\3fHUH14:;7A0f0`2;ViP1~2Rg\4<lV:2S?KIX\LCoK30WG=RED<adG`0@000>\8 +o<M5l000~2SGgdRed<RQ<?]\:i0`000?:^SGooM08coh_22omd3X]E28Q224>9G@c[2H_0RdD8 +aT0888]538X8Rgd8R4l9SEP1REd<P_UK3hEW~3RQ^2neie2HQO2H?00XU538]=28]538U1388h +07D5<m_[;?b;G@R;F`b2>eee4KYT@0<0RdD<@>RKA000@>\=^VA00`2;A@cXRd@008_HRdD8REP@ +Rl^;A@`3`HU5388hGGD4@8U538=ml01e78]5289h2F=e2LM01040~2j`Z;A@S7@0CooomoRdD< +Pl@@Ge_9`eF;k5>3k0c7AOP0~3Rl2;f8\Com:CREgdRaETC`<0IX\<FX?Q27@7odGhjn:;`8=m +m2Ee2X]5n423a0aKbL>3OOCoM@J3b?o[1_bhoOoooh?435_9`oaERnb3k0aC<lV:B0R3nFQd2h?i +K7@VjD40~2o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePDSD\4RDPDRa^9GOP; +fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@^040~2FlW3EH_\ +DeN3k1B9A@R9E@c7AO@0~3adG\~4PgT407D@2l1d0lH003?0Pl@DGe_9`h]E38e008_jRmV;5h_7 +om:;eh_;RoR9OO2;7FA?0`1VR`AkPn08M0KoANc[fOb;GO23nomd?8\EI4l308_k<l1VR`Ajm\08 +MBV;AO@i@@An8H]520_0M0J86429A@R;fOm5m8]538\@om:;bhU5l>^mo8=mm01n2X]520_0M0?6 +~2ReD<RgX4RdG`omN;AO@;`7h60dG\j`ClPlSoPl@DGe_9`h_0EH_\Pn`<Dc?9RTP8PoUXM0^3 +nFad9^U1~3o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePDSD\4RDPDRa^9GOP; +fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@^040~2FlW3EH_\ +Dh?\=8U528UE38U=4<M5j000~2adG\~4PgT407DnPcT0MC62N@U`MAF;@AB=D0B9DAB;0<L0~4 +jaR;`3?BRed@Rl?X<?ooo`_0M@K70`40~2<l23a3AKbL>=AMB9AOR;E@clRmZ;4h_3om:;dhU5 +m8\MI4l306J;34>3h@Qd2?m5j>_OSD00RdD@Rd04RDG`RdGdPoP[M0F3n2ee:X]Ml4^9GO1e2kSm +ooooPl@dFlW3RdgdReghR0^;A@b;4?oBRDGd@hUMn8]5n<H0<429AOR=G@QCSEg\Dome38]=m8]E +l8?\3>Qam?ooPl@HRDGTPoSmM2N3n?md1N\[SD00ReghSDgD:mU;2m]n1kSmooooj`>3b?n3a3AK +bL>hoOoooh?4=5_9`h]=n8]Ei0?:RDghaP40ReD@PcX03hEK~3PWX9L7D\RdXDSD44RD8DRaT; +fg@ARdd8<m:=AMCX_48008T3jcF;AA370040~2jb[lRdd8<m:=AMB3k0cXW48008?438_@Red@ +Rl?XiOgoo`_0M@K70`40~2RdGhSEgD:l=8RegX0eg\0l>3a3AKbL>3a3AKbL>;`5F;k5>3k329 +A@R9E@b9CA2;fLM5j000~2adG\~4Rd<4RDG`2l1e8X<k07DE<m:;`nP\o?ooRl\;`7D6a`41~3 +<l23a31KbL>=AMB9AOR;E@b=@02;fX\CRl?odX_CRDGdRaeTC`<0IX\<@h?Q27@8odGXjmn=@02; +AOB3n2ed1H?h:gDZReg`BhUMl7D;^?gooon3a31KbL>;COB;GOR82h]538\@om:9AOA3REghRdGh +aP0`@8U5n8eM25>=GNaCogD<RdgdReG`Pn`<j<[boon3a1R9ANB3n?ed98?hog@2jbR;GOR=CM@[ +fD\;fgh7^?goooo[0h?8oh?4<5_9`kSmooooPl@`FlW3RdghReGT0lZ9COS60@2;GA23>`1e9X]= +23?BSDGDPn`<j0I0~2Pl@<Rm2;`nPRnooo2l1e1\L30@0008]5n8eMe2_3B8]Mj0=Mk0?3Pl@` +FlW3Pl@`FlW3SD00EH_\Pn`8RDD8RED<RDd@<l2:@PV3n2D?Q;02~2PnQ5PoPc3hNi0P00obB5 +Z>l10=W`0@3Il040fO0105[b0@1JlP40F_8105[b0@1JlP40F_8105[b0@1JlP40F_8105[b0@1J +lP40F_8105[b0@1JlP40F_8105[b0@35l040F_8105[b0@1Ml@40F_8105[b0@29l@40F_8105[b +0@1JlP40F_810;Ga0@1hl040fO010=W`0@3Il040F_8108c`0@1JlP40F_8105[b0@1JlP409O81 +09g`0@0AlP40F_8105[b0@01l@40F_810;7`0@1JlP40F_810<G`0@2;C@b;E@Rh2P0008?42<WY +P?gooh]=38]E23?0Pl@8bNU_oOooRdd<ReD8^0P0~2Pl@8bNVGnoooRdd<ReD8^0X0~2Pl@8bNV3 +noooRdd<ReD8^100~2Pl@8bNU_noooRdd<PWT9AWD@PgTH07D:^?[ooon3a0S9`h]E38]528?4 +2<WYQn[ooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB;0H]=38]E28?42<WYboCooh]= +38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNVCnOooRdd<PcT0M0Lc`>\ASD00 +ReD<RdXDSD44RD8DR`6;C@b;E@R3a0S9jGOboon;C@b3>@1d1c?0ja6=@02;E@b;BQB=@@B9@QB; +0H]=38]E28?42<WY1oKooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB;0H]=38]E28?4 +2<WYco;ooh]=38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNW3iOooRdd<ReD8 +^100~2Pl@8bNTSn_ooRdD<PcP0M@R;EA3X>oSooh]=3<L10@0003?0Pl@8bL>;C@c70@40~2RdD8 +Pl@8bNVnmooo^?[ooon3a0S9`h?42<W3~?RlP?_L73~2EH_\<l39``00~;EH_\Pn`HDeIGRg0@ +2oH?SE00~2RlSggXUa48_6^``0~2VOOkRmJARDgdSAb=~4SAaK:m=e3bU85<M04000~2jD00~2 +RegdSD\1:DPD`N<2SAaK:eP@Pl<<REP@jbJ;`8]H48?k2ghLTkT<~3VOOiThUMm05H58]Mm<7S +0XdLFbUH48]H5873K0L0087k\PL007`8PO_e1`00OPR3b?mOGU_9`h\M43H308^KU04008\K2m]m +1OOKj`olRad@=P<0Ri^D0@00Ra^1nj05~2OPj;3A0f0`2;BA3[7He008\M43H308^KU04008\; +SAb=~4`N46:l^;f8U=k8]359VC<mX[fX?S0c?J:mYe1k[4?0<0j`FjT3`308UEl<M5n000~2RdPD +PL5[1`00POVb1`00O3@cfh_0Ro>;f8_1VI<cfR_JPn<3<mX[fPnD`h7So`000873K@4000?NBH7i +\PL007gCREghRo2;GO2;CQ2;OP`3?8]?0gghRGghRdH8Rdh4RaK1i`N=??n=7?n=79n=75l3fXdD +S@00~2`N46:lX3bl7P18d4`8dL@8dLf0?IRdg\0mV9GOb;GR29GNQZ06X1RmJ=AOb3k0cX_kgo +oh_6Pl@DRdPPPl41PoT43hMk~3obB=R?@100Ce0@04m@401?D109cd0@2dm040Rad@=P<0Ri^D +0@00Re\X:EgljE40~2o8=mj01e2\M08000~2jd7lPggX17DNRad@=P<0Ri^D0@00Re\X:Eglad0P +0P000>\OSD00XA0f0`2;P9@1~2Rd0X:DGlj`WlPlSoGeiKbL>3OO`0O@J3b?o[1?b;AOaOGU_9 +``00~:EH_\X`1?0`295@A?0`39`eF;k;W8A`<0POUhC0<0Lb2ib4L308e003T1M`Ti@@Af18_1 +bL>3`@b1nGQ<0`1bj8\=04l300_9M1j;5@A?0`0kbW<D>@5g2CU117H4Rl79`h?133_:L^`c`<W3 +EH_\Dh?\28_HSDghDFX1\0;X~4Pl@82l2;`gD:a`GlCP<00@000>P6~3Pl@8FlW3EH_\POR0lP40 +M0FSn3`308<m24l3~2MAEZ06X0J0Q?0`1Z0;04j000~2Pl@@bL=EJ5P00P1TocD0~3RnaTRBd0 +~3DeN3k1B9AA29EAB9CASf@0@2M1<c`8?455mKI8l5~4Pl@4GL>;CA3f@@@@M1n;3A0f0`3f@B@2 +M1<c`8?455mKI8l5~4Pl@4GL>;AA2;03fF~2`0n4f@0003fL~2`0n4B04003d30070M0GY[@40 +06X0ogDHogDDogD@\0CXGPP008?448?hogDDPlSoPl@DGe]TS`D0~3Pl@4GL>;AA2;@1B3n05d +;h?h17@2jdbi0@0003?B^0X0~2j0\g~22l0?Q5D0~2<lV;EAR;AA3XHP800>]6^@40~2<m:h1P00 +0>SS=P002l1d<C?9ReDHRdD@j3h2~2jb:i0@0003?B^0@0~2j;lf~22l1d3C?9ReDHRdD@j1X2 +~2PlSoPl@DGe]TS`D0~3Pl@4GL=Z0?me6?me5?me4;04j9`7~2Pl@@PoSoMAB3b?n3a1AOFfB? +1@00~2Pl@4GL>i0@000;Z6~3^0<0~2j5Pf~22l1d3C?9ReDHRdD@j;<1~2RddHPl44<m9VRe44 +P>80IXUA18?8oh?455mKI8l5~4Pl@4GL=Z0?me6?me5?me4;04j287~2Pl@@PoSoMAB3b?n3a1AO +FfB?1@00~2Pl@4GL>i0@000;ZB~3^0<0~2j=he~22l1d3C?9ReDHRdD@j3T1~2RddHPZ6U~3mh?8 +oh?455mKI8l5~4Pl@4GL?7AOCl?0<0Pcgl?0<0o`n4l@0008]568?028U5l8_0Rdd@ReGdR`4i +0Pn5a000089j101d;6X0ogDHogDDDK04j7h6~2Pl@@PoSoMAB3b?n3a1AOFfB?1@00~2Pl@4GL>; +COB:@@D:`0n4K00008]m484oV@00`7DiRedHmP<8M36;CO3f@@42M2Ri0@000;Z:~39Ol0~2j10e +~2Rm<;`8_7M3@cbNQ]~3jb^=@02i0@0008]Mm3?BRU<6<l2:@`GXiC@000_0M0dcbH]E68]54>Q0 +~3RdGdPWP707@Q<lV;EAR;AA3X:P000>\BRdGdPl08RDGdPcSo3hDJoooo<l23a1AOFfB?1@00 +~2Pl@4GL>=@01ERnaCEUN3k5b9A@R9E@b9CA37AM@1~3adG`~4J31e~2ocD8C`<0\0;X~4R`d@ +=P<0PTTT0Xe=a56=CM1A\0;X~4Pl@@adGP~4Pcgl?@<007@X<oJ=1;FT?@<0Rdd8R`Ti27D8Rd1H +RDG`j`]6Pcbeo3d3~2MMf9MN37AM`2~3RdGPPcb5o3d3~23hEL~3RdD8PCP30070MD?7AM@0~3 +adGL~4Rd0DPoP1M1F3n0Ad1>\JRl37AO1[~3jbV=@037AO1\~3jaf=@037AO1]~3ja6=@037AO1` +~3adGL0`0008]M2?lcJPR;AM2;@0co<6X4Rd<<D6X8ogGLogG`\0SXGP<008?48?I3105d3VX0 +JW6`0^Q:0`00Pl@8PggD00n43`<008]M3?H30G@URdD@2l1d0^\6Red8Rd<<Rm2;G@b;PiP0~2 +j0H8~2RDGHj`SladGH~4RdGH2l1d6_m`16X8JP5XP@000;04j>l2~2Pl@@jaf;`8]540_0M1A@ +JPQZ0FR1~3\0CXd08008?448]M3?H30W@9^0P0~2j`N;`;ShooooRDG\Red<mP<1M0Rk20000>\6 +o;_hooooREg<RdD<mP01M0Rh10000>\6o;SlooooRDG8Red<mP<4M0c7ANP4~3j`Z=@037ANSl +ooooSDFXj;D_~2JP1ZM;02j5H2~2Red<ok>D~3Rgg\EoncT00005Oo\h`0~2EoncR00005MZ16Ye +\0[X:@800?ncZ00008]5c53o\h@0~2EoncP00005Oo\iP0~2D6X4JWJ`2^So0@00ogF\JPSoLgb; +ONQGogFXJPSo\j00~2RgG8EVX4JWN`2^SI0@00ogFdJPSoLgAGogF`JPSoLgQGJPAZN;0:j;`1 +~2ogFlJPSo\j`0~2E_me^6X8og=`EfX4JWV`2^RL0@00PLC@~3mP<83h@j0@00JP1ZO;02j881 +~2SG\DocMZ1?mc46X8SG<<ocIZ1?mc16X4JPAZOK0:j5l1~2og<LJPCoLaQZ28\7`NP@D6X4SG\8 +ocMZ16X4JWj`2^Pk0@00R`HUool008U5i6X0JWn`0^PV0@00Rm>3a62;MNB1o_oo~23hB^~3RlK1 +h10;aXU5i<M5h000~2R`o1j@^3h@OAhKl3~3<l23nAl?Wl188oSCih]=`3?K<oJ;`8]5i2?7>lL? +Q5P0~2<l1VRd@J:?K4P7@7^FQ00`3[1KUZ@0<0Rl:=51R9AJ3oLR1Z2?mb96X8IX]2:2GoO`00 +D6X4DHU=Y6X0RlI@JP5Z1FR0~3\0cXP00008]EX8]=Y8?4<<7W0TJ3``Z3oPQlShUeh>\CRl1Z +06R2~3\0;XEP0008?428]52?I0111d3VX0JW:`0^Po~3Pl@8JP1ZLk02j340~2Pl@8ocD8C`<0 +\07X~4Pl@4Rdd8mT440GD:^6<0~2j8L@~2PlALGeiKbL>=@01ERnaCEUN1k:00~2Pgd<00n>o000 +0<M5l000~2ReG\RggXSEd@<oJ=@`B;4h]k18?320_BOA6=PU`n0`29A;G4jKh0~2Rl0;dWD<RGbe +a>V_~3SD00RKEPooooRoN9WFcooon;f[T@~3Rgg`SI@mL?oooh_6RKETooooj;@Z~2RmN;n3?0 +PlWolZkgdDV9SFSooonh<30`<8fl5G3ooon;lh_>`NT2lj^;cX^eH?oooh?Q0o>ZRkeToooo^A00 +~2SD@Em8fD67cooon7WFcooon;QFSoool[d8_7Pn`<j50Z~2Pl@<j;@b~2RiE\ooooRdg`SH`= +L?ooohU<]LA6PdG`2C]e30n<5_oooh]=38eEa8]52>S\2`00PLBP~3GeiKbL?lEFQH0080I?le +~4RnaTRBd0~3DeIGPn`DadG`~4R`d@=P<0mT4T0W@D<l23a1AOGU]TS`D0~3Pl@4GL>;CA2;@@cX +m_GoohU5k0_0M0aVRdP:PN40P000MA@c`8?455mNFfB?1@00~2Pl@4GL>;ON`cbFJ;C`[faD0? +Q<X0~2RgD@R`j1nA`00<0?U<>1hol0~2POVG~2`0nD`2Go~32mR1nI@00<0?U<:1h_l0~22m>1 +nID00<0?U<>1hol0~22mZ1nIH00<0?U<:1h_l0~22m>;g`_@POVH~2`0nD`2Go~32l:1nIT00<0? +U<:1h_l0~22m21nIX00<0?U<61hOl0~22lYd>h]m68]74>PSmOooRmJ;cc_3M@hc`6J;@`SX0200 +08U5l8]5l8?hogDBPl@DGeiKI8l5~4Pl@4GL<c`8?455mNFfB?1@00~2Pl@4GL>=@01ERnb3k1C7 +AOP0~3RdD8RdP4^P80~28m4?QNT0~2RaD@=P<0mT8T0W@<P\T1RDP4jM80~2o8]538?028U5o8]5 +28\0?@40080?Q;P0~2;Il00<23n04?QZX0~2;F;o~2PoP23hN;~3obB5c00206410P3H0080f002 +08<m54l3~2MAB;AOb3`0B;28T=K4l30<L032\208]5284h0`01`7DdRd0DPoP1M0R3n0Ad3n\I +o88=54l300C[;He0088=54l300;[8He0088=54l300S[5He008]5284h0P01`7D7PPdDC`<04<M5 +n?ooooo[4_b;AOb;B0B;EA2;A@SXioOooh]5n8?45<W3SD00EH_\Pn``XFa?0`29AOb;`<M5f000 +~2adGL~4adGP~4adGT~4adGX~4adG\~4adG`~4adGd~4adGh~4^P@0~2^1A?0`3X:RT000_0M0k7 +AMP20070jG<0~2Rl37ANP4~3^P80~2^1A?0`3X0RT000_0M1;7AMP30070adG\0@000>]7Rl2j +0@000;PDC`<0j=dX~22l1d4LM5f0<00L37AN`4~3jb;l^P<0~2^1A?0`3X^BP000_0M0k7AMP3 +0070adG\0`0008=mf01d5He=f56`0NP0~3Pl@4jAKooon;`8]5o8?4<<W3EH_\Pn`@RdD8RdP4 +Pn44MA2;CA2;E@cXJ??ooh?44<W3PcglCP<007@@SDglDFX0\0;X~4Pl@8<l23a139`he005F; +k5=FPn`8RDD8RmR9E@`;f`n4N@0008_2j67bool;`0n4JP0003?9IX]82X_3m\F03hAI~3R`R9 +CO@;b@n4@P0008]01>Pcl_oo2l1d=S?9IX]82_K5P7@[RgGdo8_6RDD8RaR;l`_KM1N;@0CX2o;o +o`_0M0\cffJ;F0[fah1eg8Uem8]528?425iKbL<c`8?425iKbL<0~=EH_\Pn`\RED<RDd@PSP0 +MBO7AN00~3adGT01000<M5j000~2aTG\0LM5l1P0~2RDGdjbN;`;T1~3SEGPj;<W~2PoP1MA>; +AA@;`7@5j5ZIoolc`8?4;<W3RddDRDglRdd<SEGPSDGlj5LS~2PoP1M@Lc`8?4;<W3Pgd@07@7 +RdGlPTQ40H]=o89i=@=e>H]1<>RY6`00RDGh2l1d7X]=o<I1=@6;COc7@D03~3Rdglad4<~4jb7l +RdGlaT0e0>\GSD00RdglPWTe0GD;Rd4`j6LK~2RDGhRdgl<l2:@CF3n08?Qml0~2obB5E0@20;T4 +0P1P1080Z0@208eEn8]5o>SE9`00PoP1MA4cdX]5o>SB6`00<l23a2c9`h]5o8]=n8U888]5n8]8 +48]5o8U8D8]5o<M0E000~2jIH0~2SD00<m:;AOcXVQ\003?0Pl@\bL>:ENb;AOcXP00008?h0GDA +<m:;AOcXNA\003?0Pl@\bL=Z4fP08000RdglPl4lDK03j000~2Pl@<2l1d4C?BRdGlj4`K~2<l23 +a2c9`h]5o8=h@0=d:nR;8@002l1d8S?BRdGlj2TK~2<l23a2c9`n\?^SH1~2^60n0`3XKB<008]5 +o8?4;<W3o5F;k5>3k329A@S7AOR08000PN;o~3PoX3Mc3o99EX1@80o7P50P201@80T0D208P5 +0P22COP@jb6;`89=n23[6H_0PTgh@>\ARl2j_@400;Q\?P<0j0TS~2RdD8Rd0hPoP<3hNJ~3obB5 +^0D208e004P60P3\1@8020H204P60P0X1P80B0H204P60P181P80B0H20?P50P0H1P80B0H203P6 +0P37AO@1~3jEl0~2PTgh0\M5m040~2jDl0~2PTgh0LM5m180~2jd:=@022COP2adGd4P000>\b +SD00PTgh0\M5m140~2jb:=@022COP2adGd4@000>\BSD00^_41~2^7Pn0`3XDB8008]52?I0A0Ad +189=nD2i104008]E28]B<3?0j9hJ~2RDGX2l1e2kP1~3Pl@`FlW3Red8Rd<`j7VFoon;ANR9@c1Z +0?men?mem6X0JP2=CNaASD\PDE2`2>P0~3RmR3a229GO0;f`n4`P0008?k10n5H@000<M5i400 +~2SDgLDHe=i56`0^P0~3Pl@8PggT07DKa`ELD0<0?00008TM@5P30;P1~3Pl@`FlW3JP3oMOSo +MOAZ06X0SDg\DH]=28eA85;oLC2`2>P0~3Pl@PRDG`Pgg`87DEa`ELD0<02@000;P1~3Pl@`FlW3 +Pgg`KWDEa`ELD0<02P000;P1~3Pl@`FlW3Reg`2m]d6lL5G50303`0~2RAe0F0<0^040~2Pl@` +FlW3Pgg\0GD7RdD8PV14oX]M28_3j<J5oon2Nc@13hGW~3Rd=49H00~23hGI~3Rd<hm\04M@Wf +`0P?Q<P0~2Rdd8SE58DVX2J_ooLB2`1>P0~3Pl@@RDG`2l1d;Cf3~3M@Pc`8?4<5_9`lL5G503 +03`0~2Reg`RAe0F0<0^040~2Pl@`FlW3SDgPDFX1SDgKDH]=2?ma8;04j000~2Pl@@RDG`2l1d +6\L5G50303`0~2Xd1H0`2h0@0008?4<5_9`h9mfaYe>h]=2?maB?ma8;02j000~2Pl@8RDG`2l1d +6\L5G50303`0~2Xd1H0`2h0@0008?4<5_9`h]52898AB2;G@R;BdB1hH00~23hE;~3mT<h17@9 +^080~2j`B;`3?0Red8SD]8DH_8DFX0og<P\0CX~4Pl@@RDG`2l1d6\L5G50303`0~2Xd1H0`2h +0@0008?4<5_9`c?0Pl@`FlW3~<EH_\Pn`8EUN9A@R9E@`;bG@jPST0M3F2>@1d7[h1~3SD00RP68 +0T52PST0M0R;aTJ3n5ilkHUE38]53<H0>Xe80LH188?00XU538e=n57o=H@n0`3oM@QXS00008]= +38]E68]558?\3>RA5P00Pl@LRDGl?C`1~2MDQX>5P306X^J7Q00`1Z0[04j000~2J3QH0`1Z0fRX +@0<0JP:`1>P0~3J3QH0`1Z0VR\@0<0JP:`1>P0~3Pl@`jOX0~2o85mo3d1~2MBJn\40308]E38_j +^@P0~2ljEVYJB;nS?0PlWolZkgdDV;`EmNbL>1OO`n0@00MDQX>5P306X^J7Q00`1Z0[04j000 +~2J3QH0`1Z0fSD@0<0JP:`1>P0~3J3QH0`1Z0VR\@0<0JP:`1>P0~3Pl@`jGX0~2o85mo3l1~2 +MDMX>5P306X^J7Q00`1Z0[04j000~2J3QH0`1Z0fSH@0<0JP:`1>P0~3J3QH0`1Z0VR\@0<0JP:` +1>P0~3Pl@`jbb=@023OO`2MB>ng40308]E38_j^@H0~2ljF;nS?0PlWolZkgdDV;`EmNbL>;C@b; +EOS61140RdGhGek9`h_0EH_\PNc`~3DE8cbHfE4?oooh?\3>PEo_ooSDglDE2=SA3ooomAJP:` +1>P0~3SDglDFX2J:a00`1Z0[04j000~2Pl@dbL<0~>EH_\DeIGRoRh~4mPOoM@j3k`;mlZklAhOK +Qm^7feNioooooo:^mm59Rm5ARoNo0@000;\0~3Qm^7fhOK[3`03hB7~3?21d7c`9M1\lG7@[?29d +DoO30@0007D7Ah?;0HOKT4;[eI3g``80~2M0A2jlV@Pn?njl>7fi3g``40~2M@A7Pl\1^Ooooon7 +o_>^CoOAQoj\?29d1@?AC^^LdNUc44;[UI3g``40~2M@A7Pl\1ml<2~3M@R3b`;YN?oooh?SoNU` +ooooRCgX>`<00mM7`NL20mN;`X?\1>Q@U?ooPl@4PoP0MB2i~4^P00~2\6B3k0cXY?kooh?436X8 +JP7X20800:?\>`<0^`00~2FD6;d5h3nXTjPl84ljB7fhOKQm^7fj`l00n4Y`0003`PM2<l2G@O +?5ad=c`RM6og``40~2M@^9>X?218?;0HOKT:[[dI3g``80~2M0BZjlF@ml<1~3M;b3hoj`0:[[ +]?O30@0007D8RCZ3`PB3b`6iooooohOnlji?mm67oZ`l8[1LM0OcZTk[RXOKdNWcZW<J\2:ZjG[o +oon7foO30@0007D8RCZ3`PB3b`7g``80~2M@R3b`;YF?oooh?SoNU@ooooml<1~3M0B`0:Z@a`80 +~3GeiKbL>@EH_\DeIGPn`8RDD8RhRl0@00Rg4@adG`~4PSh0M2\cd_b;gX_`Ro\c`8?9oo:^Ro^; +a_OABHdd3dJ;cR_?0DP`@X8n07GKREG`RdG`Pl0?P^3`@8U5l<7P0^SOT_ooRed8RD<d2l1e2h?8 +oh?425mNFlW3RdD8RiRl0@00Rg<@PSh0M2_lRm2;BRb=F@69FRc1h@:;FSB9=0^;oS?0PlWolZj; +`_OAB@?aAX8n07GFRed8Re<\`N82Rd\da`@A~4Re\dRAelC0<0<l23a0QOGU_9``00~:EH_\DeIG +Ro29M@R;nX_O\02ioooooo:^mm6;dHOKQm^\?01d2h_klZh;bH_:MO6@RlI8:dD8GeiKbL>@EH_\ +D6X1\0;X~4Pl@8bL<0~=EH_\Pn`PDeIGRDD8RED<RDd@adGl~4adGh~4PWPe00n5K08006J;F3IV +Po_oM0n86TV9CA3oAOQVad0foon;A@Sf@4D@M1b3OA00MPj2B0P1a`ELD0<07@0008]5n5mNFlW3 +SDglDOme48]=38]En0?:DH]M2?mc8;04j000~2Pl@@RlP;`7@KPT\80\L5G50303`0~2R@e0F0<0 +<l1OGU_9`h]Mn0=Mo8UMo7DHRed8PT\80LL5G50301d0~2<l1OGU_9`h]M289k=04?QIl2~2Re=4 +m\:0REGT3hA=~3ReD<RoZh6P0008]=o0_TlZj=Oomd0S?oRdGTRGgd2omd8h;<48U3A3_jM@j2 +B`P1a`ELD0<07@0008]5m2]535mNFlW3RdGlGeiKbL>;A@b;GOb2O1So6Pn5<P8008]528]8A87Q +020000n5808003]M40n3F@0008?k0GDBPTP80LL5G50301d0~2jc^;`8e=n55Z0F[oRed8og<P +\0CX~4Pl@@RlP;`7@KPT\80\L5G50303`0~2R@e0F0<0<l1OGU_9`h]5o4QOGU_9`he=n55Z0He= +je6;G@SoLb2`1>P0~3Pl@@RlP;`7@KPT\80\L5G50303`0~2R@e0F0<0<l1OGU_9`h=mn01d?He= +n55Z0F[oRed8og<P\0CX~4Pl@@RlP;`0n4F`40089;20;71Ea@0`0l~3R@e0F0<0<l1OGU_9`h=m +o05e5X]5289820771Ea@0`0M~3jcb=@02=COQAJP5Zoh]M2?mc8;04j000~2Pl@@RlP;`7@KPT\8 +0\L5G50303`0~2R@e0F0<0<l1OGU_9`h]5o4QOGU_9`h]=o3U=40n6eP0008]E38]el8]Mk8]5 +28_0RdPPRgQ@>GTDMA6;N5@iNAQo2KT1~3j`B;`3?92lUd6X98AA22B0P1a`ELD0<07@0008]5 +o5mNFlW3PGQDn0l000nD`@[9M0n;B52;2HU8D<M0E000~2RdPPRgQ@>GTDM@R;LAP[L5C[2h]` +E?ONPLKh3`00Rgd@>oic1X_Oj`B;`8_NRGGTRg1@RdQDRDGP0o63aPR;nX_3RlS1j@;cYH_8RdGP +Pn43ljB;MN@3d`5Mo8]8E0?;RDQDRdgl>Dd@3hLhooooRdGlGeiKbL=ERnaCEUN3k1B9A@R9E@b9 +CA37AO00~3PWPe07D=j0Bhoon9AO3Y<P4008]52?I0>0Ad4X]888]958U8D8]888]968U8E8=m +400?Q]d0~2SD00RdD8PGQDn0l000nD`@[93hA4~3RdQ@R`T;bG@6RDQ@jbclRed8Rd<Pj?D0~2 +PoP1M@n2B`P2RdG`Pl@DGeiKbL>;A@R;F22;FaB9F52;A@S7@5@0~3Red8Re]Dmm^1`oP?~2REg\ +RdD@>mQf0n\4o8]5k8]M28]kD8]CE0?jPlL8ReD<Ro:;b<7Y0_>URlR3h@?cY8_:RdG\ReD@>m1f +60?8RDd<:m29EA01AO2;De@3d8UCE>\Eo8]=405=l8]528]HE0?IREQDj`_lPgd@00n79_oooh]= +28]I88]AD3UC57D@RdUD>D\HO`Rh0@000>\3o3?02l1d38]=28]I88]9E8U;68]5l8?455mNFlW3 +~?EH_\Pn`4Dh_HJQ=X010008e=o56`0nP0~3Pl@<2l2;`g@Ba`ELD0<03@000;P1~3FlW3Regl +a`<0~3PgP@07DKReglREP@Reglad<4~4ad0P~4ja>;`8]H58]=o8T;RdPDReglRD\4ReglREPD +ad0H~4od0P<l1KbL<0~=EH_\Pn`4JP2=COlcdX?\3>R3~3Pl@@bL>;`5F;k8?\16X1SDgo<m:3 +k0cXI`0008?44<W3Rl1ERnb3k0aZ08e=mh?\3>Q=~3Pl@@gEghPWgg07@:a`ELD0<00P000=e5 +n<W3Rl1ERnb3k0aZ0He=mh?\3>PM~3Pl@@gEghPWgg07@:a`ELD0<00P000=e5n<W3Rl1ERnaC +EX?\@8U528UE38U=4<M5l000~2adGX~4adGT0@0008e=a8U=m<M5k040~2SDgIRDgL2m9d0XT2 +Rdd@aP40RcETC`<0RdD8Rl0cdXX@IX\<EX?Q27@3@>_`RDD8ReD8<lV:2X?i:g@@PoT]M0C[38_0 +adG\~4odD8R`d@=P<0Rh6H0@00Rg04RdD8RP0?]]QVRaANPn823hFc0@00RhUP0@00>04?Q:D1 +~2PgdD00n4SP4002Go~3PnQ9PoPU3hMm0@00obB5G1D208_0A1H20=0F0P3@5P80d1H20=0F0P3d +5@80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F +0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P145P80d1H2 +0=0F0P3@5P80d1H20?@E0P2i0`000;[d@0<0Red8Rl?XT1P000_03hG0~3Rdd<2lUd1H?30hTI +Pgg\07@=g@E<@@<0PlA0GU_9`md5C4430=WPPlA0GU_9`nV=~3o;T8~3^_Q00`2;G@R;`nQ06000 +2l1e;X]=30_9M0F3``R96H=mk01d3Md5;44308?4@5iKbL?M1Ba10`3Ih8?4@5iKbL>i0`000;X4 +@@<0Red8Rl?XnQL000_0MBj;C@`;bG@5Pl<3RAV3ON`0M0gM1Ba10`23a41NFlW3g@D\@@<0fN23 +a41NFlW3g@FHE`<0PlA0GU_9`h\M43H308^cH04008]528X8>0ie98^KV04008]c13?KRUP1IX\4 +GX?P0WD=g@FHE`<0PlA0GU_9`h]5288h<7D>Rl10PSP`M?Z9A@R=@02Q43H308^0V04008]818]5 +28XH3kKCIX\4DH?P0W@MRdGdSDgH>lQf2hPH@8U5m>\6SD00odG`odD8jlB;7A0f0`2;Vf01~2 +RdD8RPPh2`n5G`000429A@R=GL@iGOAe6h8h<7DFRgG`SD00@4j2>31dnHUel8U528e00:4@=P<0 +Rh2H0@00RdP4RdD8RQP?]]=VR`AAPn02M1V;AOB=CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0l +IG@8?4D?QJD0~2Red8@hUM23?0RP>3n2]d3X?h;G@2j`[7ANCoooooodD8XA0f0`2;P9P1~2Rd04 +Red8<lV:2c?KIX\LB?K30WA2RDGPSD00RdgPRdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc +4h7So`0008?S3`?0S@B00l>9ANSoA@S[aX_0RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT +0@0008]530_0M0F;G@R968e5a3U5m7DPPgg\07@=g@FHE`<0PlA0GU_9`md5X5L308?4@5iKbL>1 +ONQVIVH63h9D~3PggT0GDXRdD@aP01Pgg\07@=g@D\@@<0PlA0GU_9`md5;4430=WPPlA0GU_9 +`h]54<H00X=mk01d3Md5V5L308?4@5iKbL?M1J1G0`23a41NFlW3RdGT3jm5j8]El0?@REG`RdGd +aP00Pgg\07@BRdd@SDG4j9lL~2PlA0GU_9`h]=48]El8e5a>R:7000fN23a41NFlW3~=EH_\Pn`@ +SDgo<m;X=00008?44<W3SD00EH_\Pn`PSDgoj1h0~2fgg\PWgo07@:a`ELD0<00P000=]]k8?4 +8<W3SD00EH_\DeJ3k529A@R9E@b9CA37AO00~3adGX~4adGT0@0008e=]8U=m<M5k040~2SDgI +RDgL2m9d0XT2Rdd@aP40RcETC`<0RdD8Rl0cdXX@IX\<EX?Q27@3@>_`RDD8ReD8<lV:2X?i:g@@ +PoT]M0C[38_0adG\~4odD8R`d@=P<0Rh6H0@00Rg04RdD8RP0?]]QVRaANPn823hFW0@00RhUP +0@00>04?Q9T1~29Ol0~2PnQ9PoPU3hMk0@00obB5S1X207@K0P00708001`2~2708001`202@K +0P00708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2 +708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2708001`207@K0P00708001`2 +~2708001`202@K0P2i0`000;X8@@<0Red8Rl?XH1<000_03hG0~3Rdd<2lUd1H?30hTIPgg\07@= +fbfb@@<0PlA@GU_9`m\]\T430=WPPlA@GU_9`nV=~3o;T8~3^Pa10`2;G@R;`nP@4`002l1e;X]= +30_9M0F3``R96H=mk01d3M\]aT4308?4D5iKbL?K;LI10`3Ih8?4D5iKbL>i0`000;XH@@<0Red8 +Rl?XbQ8000_0MBj;C@`;bG@5Pl<3RAV3ON`0M0gK;LI10`23a51NFlW3fbg6@@<0fN23a51NFlW3 +fbgDC`<0PlA@GU_9`h\M43H308^cH04008]528X8>0ie98^KV04008]c13?KRUP1IX\4GX?P0WD= +fbgDC`<0PlA@GU_9`h]5288h<7D>Rl10PSP`M?Z9A@R=@02Q43H308^0V04008]818]528XH3kKC +IX\4DH?P0W@MRdGdSDgH>lQf2hPH@8U5m>\6SD00odG`odD8jlB;7A0f0`2;Vf01~2RdD8RPPh +2`n5G`000429A@R=GK@iGOAe6h8h<7DFRgG`SD00@4j2>31dnHUel8U528e00:4@=P<0Rh2H0@00 +RdP4RdD8RQP?]]=VR`AAPn02M1V;AOB=CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0lIG@8?4D? +QJD0~2Red8@hUM23?0RP>3n2]d3X?h;G@2j`[7ANCoooooodD8XA0f0`2;P9P1~2Rd04Red8<lV: +2c?KIX\LB?K30WA2RDGPSD00RdgPRdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc4h7So`00 +08?S3`?0S@B00l>9ANSoA@S[aX_0RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT0@0008]5 +30_0M0F;G@R968e5]3U5m7DPPgg\07@=fbgDC`<0PlA@GU_9`m\]744308?4D5iKbL>1ONQVIVH6 +3h9D~3PggT0GDXRdD@aP01Pgg\07@=fbfX@@<0PlA@GU_9`m\]Z4430=WPPlA@GU_9`h]54<H0 +0X=mk01d3M\]e4l308?4D5iKbL?K;Aa10`23a51NFlW3RdGT3jm5j8]El0?@REG`RdGdaP00Pgg\ +07@BRdd@SDFdj8\F~2PlA@GU_9`h]=48]El8e5]>Qf5P00fN23a51NFlW3~=EH_\DeN3k1S7AO00 +~3REGdmT880W@Ha`ELD0<020000<M5l?oooooYCP0008_0ReGdRe8hPn8>MAG71Ea@0`0X~3adG` +ooooon\^Rl2;EOB2NQX1MB>;DPR3hP5e4lL5G50302T0~2adG`ooooon\8ReGdReY<RAZ3OO3o +MA6;GOB2B`P2PlSoPl@HGe_9`h]mm8=o@0=d58_IUh_Gj<hG~2Rl^9ANb;an\Bo8_IRm2;AOCX +N?;ooh_;RDG\Pgg\07@7RdGdaT0J0SU=k7d:PlSoPl@HGe_9`h]5k8?465mKbL<0~<EH_\DeIG +PSP0M42;3A0f0`2;TKP1~22m9d<?b;f8_k<l23bOob[_OA:oV;LPccYW@56l23f?n;bi4;bGD7 +Rl9OGU_9`h\B2m9edC?0GeiKbL<0~=EE=FEh_\ogD\ogDXogDTogDPDE9@j?`W~2RnEOGU]M`i00 +05F;k3?0bL<0~<EH_\<l39``00~;EH_\Dh?\18U528UE38=h@0=d>X]8A8?Q0WDbRdQ<2lUd:h_1 +9Ol?~2M@eA\07X~4Pl@4j`^;A@R;@4cXOGcooh]52<M0C000~2Red8Rd=4Pn0P3hEJ~3Pgd<00n5 +D00008]3;>QBO?ooRd<`j4Yloon;@b@;`7@6Rd\XRDPXRed8Rd<X2l1d2h]K98UH9>\DSD00RdD8 +RePTXA0f0`29V;01~2RdD8Pl@4FlWY2Wcooh?415_9``00~:EH_\EUN3k0b9A@R9E@b9CO@;dWD7 +adD<V3h308]m33?0PlWolZkgdDV1n@@1~2LQ?71Ea@0`02~3<l23a0aOG\W3Pgd807D[^0@1~2 +j?Qnoon9A@P;`7DCa`ELD0<03@0003?0Pl@<Gek9`lM5m0@1~2ogGdogD8JPGoM@b`1>P0~3Pl@@ +RDG`2l1d;X?hKgD>a`ELD0<00P000>\DRl371Ea@0`0l~3RdG`Xd1H0`0c`8?435mNbL>;M@R2 +?P1d3ob2?Rme0lH6G4J2?P1elX]E28_j<l23bOob[_OABH8l2Uae48_j<l23bOob[_OABLH42P2; +A@R3a0aOG\W3~?EH_\Dh?\78U5n<M5m000~2mT080W@Ea`ELD0<020000<M5m?ooooo[>X_0RdGh +PWPJ0WDCa`ELD0<070000<M5m?ooooo[78]5n8]0>8?P2GDAa`ELD0<07P000<M5m?oooon3OOCo +MA2;COR2B@P2PlSoPl@LFlW3RdghRe4@2m9d54Z9DA0c`8Y44AR9AOCYm@0008_0RdghPgU00`n4 +L`0008=i100?QDd0~2Rd4<?@0P~2L`?[1_bh020008_8RdGhRe0lj6[[oon9AO0;`7D?adGdoooo +onVZ~3SD00Rdg`ReghRe=<Rl?XX9;oohU318];C8T;RdGhR`R=F@6963?KRQV9GOCoB0CYMP00 +08e008]5n89h=@5d1X9h=01e;KT1~3SEG_RdGhj07[ool;`7@=<m^:GNn9GOC[AXe00<M5m?oo +ooo[>Xe00;T1~3ReghRe<lRl?Xd^[oo`_0Rl=d6;T1~3SEG_j1^BoolcbHY=khU=m>\8o<M5m?oo +oon3OOCoM0N;AOS6@1X1RdGdPl@LFlW3~?EH_\Pn`8DeJ;l0nfbX?11K\1~3<l23nAl?Wl188mR; +a]?SREghP_X7L`cgdh_88l^9COc[<Ob=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5 +fW@4RmS[1B]5n8_HREglRdGlGU_9`oaERnb3k0QCEX_`3kK:Pl45^`40~2<l23nAl?Wl188mR; +a]?SREglP_X7L`b;b3?;RDghjcN=@02=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5 +fW@8RmP3GOc[1_`[AOb;f8UMn8]5n5iKbL?lEFQH0080I?le~4RnaTRBd0~3DeIGPn`P<\V;`0nf +`H\dQF1@0`0;mPn4QP4008_ASD[i^040~2<m^2nAl?Wl=;8l?Ch8_:mm28AN<coh]Mj8e008Y6 +3H?P7hU5k0n45@4008_IR]>;a^PJooooRl^;f8Y@3H?R7c]Ek0n5k`0006J1N0kEY@n4h`0000_o +MA\?]]6=59EPD0<0REGTR`J90X]Ei8\BREG`j`N;1XT7RDG`<l2:@`gf`40?Q:<0~2Pgg\0GDU +R]69CMb;aX?\2>Q2o_ooPl@8D;01j000~2RdgLPl@4jG`0~2RmV:dh_6j27noon;bh_HRU0=Pn8O +PoX1OAF3b?n3a21OGU]TS`D0~3Pl@4GL>:@`gnb8Q33BGo~3P^2oR4<=P_T7LPJ:AN<P@`^2B`dP +3kK1RaB5I50308TCRAb5I5030<M31000~2P6<:06J1H`P00>\5o89>3D2;MO3[?8e008_nRcK[ +<h_0RGG`2ome4@nf`H\FRAB5H5030>\7SD00R`J91hU=g8\fogG`\07X~4RdgLPl@42oH?QJ?n +oon9GNR;`D62nA0?PUcnoolc`8?485mNFfB?1@00~2Pl@4GL<0~;EH_\Dh?\18]H387kl0l007LV +TnRXNOooRlR;`hU8C0_9MDG71Ea@0`0=~3^040~2Pl@4FlW3RmQZ4omc38e;C56`0nP0~3Pl@< +2l2;`g@Ea`ELD0<03@000;P1~3Pl@4FlW3ReQ<RAPc`8?415_9``00~=EH_\DeIGPn`<PcP0MCR; +lX_iRmRjH0000;P1~3j6d?~2RmJ;ci>9GO0;fgDPa`ELD0<03@000;P1~3Pl@<GeiKbL>;68UM +l8=SA23f@Q01M0N;GO22Bd@4mT4@0G@7Reg`PT]44?I1409d3OI240Qd1h]Ml89;A@;f@A04M0gf +@Q0@M0N;GO22BdD4mT4@27@7Reg`PT]528_`RcZ;GO29Nbb;NQB9Nc2:0HQ3=8Y10HQ3=H_6I\M3 +=_ooPWT10G@6mT8@17@IReg`aT<e0LM3@0<0~2ad<<~4ja>;`8]Ml<M3@040~2ad<<010008]M +l8=k@0=d8h]i48?W17D:RgT<RG\<ja>;`8]J48?S47D9RgX4Reg`RG\<ReT4ReG`REXhaT8J0<I2 +G0?7@UP0~3PcP0MC2948\M43H308^K\04008UJ9<M2:000~2ReXT2m]d0hUC::4@=P<0Reg`RIR` +0@00<l23a0aOGU_9``00~:EH_\Pn`PRlZARDgh^@X0~2SEG\j3\0~2RDGl^@80~2SEGh^6<0~2 +j?[QoonQ43H3089890:hH`000>QGiOooPl@PbL<0~=EH_\Pn`\DeIGSEgeREglREGh2l1e4<H2 +<8e20LH008_2GeiKbL>;GOa;REglaP<02l1m2h?i2WD6mmS60Re22l1d8X]eo8_0RmY>RoTcd_Og +QmZCRX3d@@<0R0J;``_KMNJ9MOb;OOb;mc?0PlWolZkgdH_1Ro[1j@;cYH_8Pn43ljB;AOQOGU_9 +``00~;EH_\Pn`@EXU528U=40_BM@Dc`5k9`h=m401e1X?8oek9`hUEo88j07DARdD82l1d1FK7 +~3<l1NbL>Q43H308^0D040088h0GDJRdD82l1d2h]Eo6HcbHX:IXT8^040~2G\W3XA0f0`2;P:P1 +~2RDGh2l1e3LM5m?oooooYF0000?c7AO@0~3RgGhRPJ8AO4:`0n4@00008Y60HQ5l0[0M3J=@02; +AOb:03Y5lG8>>TG`M`W7AO@1~3jaR;aXe`0XX>R4ga2\Ud2XY00hQ5l0[0MM29MOR3OOCoM@J3 +b?mNbL>3OO@0MAZ;M@P;mW@;RdglIS?0RP5VR@Jh0@0005k9`h=m409c1X?8oek9`h]520_0M1R; +COb:4HQEld69COb:2HQ=lVJ;CO9VR@Rh0P0005k9``00~<Rd@T18]D90R;C2@<Pn`<j0C;oon3 +a0c3<lT?\a0CbH_1`hOKEH_\DE9@oeDDbL>@D>QJe_ooQ`@T`hOKEH_\S<WX9@0008cIj1h0~2 +S<7X5`0008cQj100~2S>WX2@0008cAj080~2bL<[dPl3dHT@Pl04`i00EH_\DeIGPn`8RDD8RED< +RcETC`<0SD00<m^:66J;55j3hPQd0d3[l8U528]528X02\1d13`\M@fh0@0008?425mNFlW3RmV; +A@SXd@d008_;RDD82l1e5lL5G50300d0~2^040~2Pl@8GeiKbL<;bG@LRdD<ad0401000<M02000 +~2aT0<0LM041P0~2Red<a`<0~3RgD8RG<DRohc`8?9oo:^mm590o5>RGG`RaeTC`<0Rl0cbHX> +IX\4Bh?P27@3C^_`RGG`RdG`@8U5l<H003?0Pl@8GeiKbL<0~<EH_\DeJ3k0b9A@R9E@b;2XU= +m0_93hBM~3PgT807@PmT0h0Pn4P0000<L5G50300T0~2^040~2Pl@<GU_9`h]52?I0>08?Q5d0 +~2RdGdRd0@Rc0;mW@hReg`SD00RaiF\07X~4Pl@42l1d6lL5G50303`0~2Xd1H0`2h0@0008?4 +35iKbL>;l`_KMLj;AOB;F1370`00~2ReP@REPDad0H~4RdGdod08jM00~2Rl2;G@Sf@cP1M1K7 +1Ea@0`0:~3^040~2Pl@<GU_9`kPT~3j3mcoon9AO@;`7DFa`ELD0<03@000;P1~3Pl@<GU_9`h]= +38]em8TaadH@~4RlKX1>Koo`_0RlId4NR]Kooo^040~2Pl@<GU_9`h]M28]3<>Sn2`00RegdRD<< +2l1e4h_3j8E_oonh0@0008?435iKbL>;GOC7@`P1~3ad<4~4XA0f0`2;P;P1~2R@<;`7@3REP4 +XA0f0`2;GOB9V;P1~2<l23a0aNFlW3~=^040~2``00EH_\EUN3k0B;20_9M0J;D0B9D@B;B0@; +bG@9Ra294N\ASD00Ra2;3A0f0`29TKP1~2Rg0@2oId6Xe008_>RoR;<E6`0NP0~3RlN3a0@;mWGY +Ro2;APcXbfkooh_6Pl@4Gek9jKi^ool0~=EH_\DeIGRo2;gX_j\02ioooooo:^mm6;dB_jQm^7 +fi2\?01d2o:^:oX;bH_:M?6@RlI8:l=OGU_9`i00EH_\Pn`4DeIG2lUe1c?0GeiKbL>9COb;?FA? +0`0cbHX:RQP?]_=VRha?10@006HiS7L41000RdglMC\:fg@gB@_9M3:9COa0@X\mI4l303?9RPZ: +60nflfJ;S4l41000ISV<M`@4~2RdglM@T:fg@5B@_9MLj;?FA?0`0cfhXHIX^4G`@4~23ko0<m^: +6VJ;W5l410003koK:l=OGU_9``00~=EH_\DeIGPn`XRo:9CA29AO2;7FA?0`0cdXX@<lUVR`aC +RmKf`@Qd6h_`Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUM +l>\=o8]Ml88k:gD4@hUMl8_JRo2=CMR;EA2;AO3X5PX008_CRlH;dW@@PggT07@8RegHRA[[0ob9 +0X=mj01d5<L5G5030040~2<l23a2QOGU_9`h=mk01d<h=mh01e2H5mg000081f5lL5G5030080 +~2^0000823a2QOGU_9`h]5g?OHPl@XGeiKbL>3ON00M@V1OMcooomoMQO71Ea@0`02~3^?ooogn3 +a2QOGU_9`h]5g8?4:5mNFlW3~>EH_\DeIGPn`XRo:9CA29AO2;7FA?0`0cdXX@<lUVR`aCRmKf +`@Qd6h_`Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUMl>\= +o8]Ml88k:gD4@hUMl8_JRo2=CMR;EA2;AO3XkPP008_CRlH;dW@@PggT07@8RegHRA[[0ob90X=m +j01d5<L5G5030040~2<l23a2QOGU_9`h=mh01d5LL5G5030080~2PlSoPl@XGeiKbL>3ON`0M0f; +AMcgf8?4:5mNFlW3RdGLPl@XGeiKbL<0~>EH_\Pn`4RDGlR`eTC`<0<m::46J;S5420P00R0P: +bG@LSD00@8\=I4l303?BRQ1VRhaA0P8008P82\Ueih]5o<W3~>EH_\Pn`4DlM5o?ooooof@PP2 +M1371Ea@0`08~3jF40~2o89j6P9e5\L5G5030240~2PTX80^U7~3SD00RdXhPn49MA371Ea@0`0N +~3PTX80^\\PgX@0W8>a`ELD0<07`000>\JRl2;BQ2=F@69FQ28A0XHaT8J0H9R2?j9AOb;AOaK +bL<0~=EH_\Pn`@EXUE38U=40_BM0@;`7D5<l1NbL>;CA29COb;5A0f0`2;TU01~2PSX13hE;~3 +2lT?Q2\1~2SD00Rdd<IX\9IXU=lX9ml`1d1X?8oek9`h9mlP1e2<H00>T40@00RTgbR0R;COa9 +RDglPdD<0T0;bGG7jNX0~2Rl23OO`03hCN~3Rl2;C@aVR`UVRDgbPWgc07DHRTgbR0Q02\T?Q;h0 +~2odgljJP0~2Rl2;3A0f0`2;RJP1~2RDgh2lUe3LM5m?oooooYF0000?c7AO@0~3RgGhRPj8CO4: +b@n4@00008Y>0HQ=l0[9M3J=@02:CO<jCO5b43Y=l7L;adGd0@000>\JRl2;cXea0XXFR5Ga2]9d +2XY90hQ=l0[9MM29MOR3OO@1MB>;COb3n@9b;hYElhP@SG01RUGbR1J3j@:9COb3`0;[2He008?8 +oek9`h=530:3OO`03hDTooooRdD@:dGlG\W3~?EH_\Pn`<D`_0M@Dc`5_9`fJ9EOJ2OOL0M@f: +COJ82;P1~3FlW3R`d@=P<0RhU@0@00PST1M@J3b?mKbL>;3A0f0`2;RJP1~2RDgl2lUe3lM5n?oo +oooYFP0008e00<M5n000~2RdglRQ68EOD:dPn4@00008YA0HQEm0[BM3J=@02:EOLjEOEb43YE +m7L;adGh0@000>\JRl2;dHe:0XXIR5ge2]]d2XYB0hQEm0[BMM29COb3OOP1MA>:GON8642:GOJ8 +6;P2~3FlW3PlSoFlW3~>EH_\Pn`<<lTcd[QR~3j0SFoolc`8?43<W3~=EH_\<l39`oaERn`c`<W3 +~=EH_\<l39``00~;b0h005JKfGglVmT]948309_Kh]W^PoX0O0j1nX0C~23hfU~3j`b1nX3\ool? +SY80~2Ro2h~4[3`0M13L3Aa20`0T3hU5m=Y5m>_[PoX0M5ao;oOJRl:3h3l3`8d4P=^X=4830=ki +Rl8U`1l007@m`NP60l2=183KZ;A40`3NnN\[Rl:3h3l3`8d4P=^X=4830=k9Rl8U`1l007@@`NP6 +0l2=183KZ;A40`3NbM\]Z4430=SIVmoPWW@DVmoPZ11d4<H10^\;gMSK;JQ10`360@6Kfn:KfFgl +G\W3T0000<P<~2EY_IOObKfBd`@P<0Vm_RfNj3nP1l2X7j008007ekj`b1nP3nool?SXH0~2Ro2h +~4[3`0M13L3BQ20`0T3hU5m=Y5m>_[Rl:3n01d>7l2mmR;l8?P?`?0S@B0fjPd@P<0RlHU`040 +07@@`NP60l2=183KZ;A40`3NbH?j07d4g_W[0]k9gEgdgDGdg1Dl@@<0VmoPWWH=gMSM1DA10`36 +0@7[3m`E=44309_Oh9ic0lH10Y_KhY_IKOaNbL>@EFQH0080I?le~4RnaTRBd0~3DeN3k0R;fPn_ +f8_3j8EYoon;b8U=m0_9M1`cdXYAoOK287@B<l2;nH_;`NT2lj^;bh?Q0o>ZRdGdPl@8Ge]TS`D0 +~3Pl@4GL<0~;EH_\DeIGPn`\RDD8RmR9E@b9CA37ANP0~3REG`Rd\<>D\43i?02\1d:8]CC8_3 +j;>Boon;bc]137@8Pl@\GeiKbL>;A@R;F4b96<M01000~2ReD8PgY00Pn56`4008]J32]J18UM +i8]Ml8_k^0X0~2RgD@Rlh;i?:^SGooM08coh_>2omd<h_go8_6:l<[b8eN0G@OSE7oRo^h2P00 +08_:2nCb[Xeoog@2<on;bX_g2omeeXUMl8U=48]El8]e32_FREG\2m8?QZ`0~2>eGT3hMD~3Red8 +Rc^;`X_8`NT2ljF;b8?Q0o>TRlZ;0`?1R@<3B`B9B`B;Ddb;`nSSTOoo>d<4M0R3a2aOGU_9`h]5 +28]HC8THad04~4RdG\RDGXjDl0~2Red8Rd\42lUf9X]CC8_3j:RAoolk@`Ad28?4;5mNFlW3RdD8 +ReQ<RAS7@0@0~3Reg\Rl^;E@b;A@SXO97oohU5j3_3M0R3a2aOGU_9`h]=40_93hJe~3RgGXRegP +RdD8o8]@32]@18UEi3_AMPN;fN\6SD00RegTRGGDRDgHRl^9CNb;>8]El8_bRDgL`NT2ljF;bh]M +e8?Q0o>TRdgHRggLRo>;60?ORAP3ehUEl8]H10?OREP4:ll3mh]@33_J3i?32]^;gg@h2lUf=8U= +g8_:RoR;EdcXgI3ooh]=g9N;D0`knW@>RlL3aR_2Pl@\GeiKbL>;D4b94<M01000~22lT?QeSo +oon9MNR;ANR3a2aOGU_9``00~<EH_\EUN3k0R;d8_j<l23bOob[X_jmm59@H_1j<aVoon;d8_7 +REGd2m9d7H_g<l23bOob[_OARl6;n\7Y0_>URlR3h@?cY>\:a`ELD0<03@0008]5m8?425mNbL<0 +~;EH_\Pn`DDeIGRDD8RED<RDd@ad4@~4ad4<~4ad48~4ad44~42m9l2X?j0G@5PoXTOPn;AA37 +@101~3GeiKbL>3O@`03hE_~3RdD8PSP`3hEG~3@8U528X0?7Qd13aHMC6Q43H308^0V04008]@ +18]5240cfhXH<lUVR`aJm\41M129A@S7A@`@~3jF@0~2o8]54<M03040~2adD<20000>U=~3Rl37 +A@`:~3jCl0~2Pgd<47DiRdD8PSP`MC6:@04lN7@4?5Qe9Z4@=P<0Rh2H0@00RdP4RdD8Pl02<m:: +43?KIX\LDOK30G@3RDD8adGl~4Red<PlSo<m;glhU5n8UEm3?KRdD8RgG`Rl29GNb;3A0f0`2; +RIP1~2RgT4RPP?]]TcdVJ;55n;GNcf`P9d3h7Qo`0008_aPnh`jcN;`8\=43H308^9V04008]i +13?9RPR=34lcdVJ;4OK60G@@IX^a10@000nomX?^En\6o;kooomoRdd<>lif>8]=4<M13040~2 +Rdgh>mUg2C_IMA<kMOAf3X]=4<M12040~2<m_[2X_;Red<3joI0mi0jESooon9GOb9A@R;CA2; +EOb9D@B;E@R94EmNFlW3~?EH_\Pn`XDhU520_BMC>;fVXHSDgHDFX1D;04j000~2Rm>3a129AO`; +`7@@a`ELD0<05`0008?8oe_9`c?0FlW3PoX6M@[7AOQ28000jc7lPoX4M@_7AOQ08000jb:;`8?j +0WD;adGh@B000>\BRl371Ea@0`0T~3PlSoFlW3JP3oMOQZ0FX0JP2=CO1ASDgdDOme2;08j000 +~2Pl@PRDGl2l1e4_mem;01j000~2Pl@4<l1KbL>;AOb3n09d3h?h0g@:PoQkM0F3n6ie3<L5G503 +01L0~2jbj;AOb3n0Ed1H?h87D?a`ELD0<060000>\ESD00a`ELD0<0?00008]5o:=0F0<0PlSo +FlW3~<EFQH0080I?le~4RnaTRBd0~3Pn`HRDGl2l1e7<L5G50300`0~2PlSoPl@HI8l5~4Pl@4 +GL>;AOb2N3D0M1O71Ea@0`0W~3adGhooooonUO~3o8]5o8]888U=n?I0>0Ad2LM5m0@0~2j`O7 +AO@0~3RdGlPWPd0GD<adG`0P000>\:SD00adG`~4RdglmT5587@8^100~2j`?l<l2;EO@;EO0; +d8]5n>P62000RdGhPl@HI8l5~4Pl@4GL<0~;EH_\Pn`8SDghDHe=o56;b56`0nP0~3Pl@<2l1e +5H]=o87Qo`0008?i0GD7^040~2bL<c`<W3~<EH_\Dh?\68U5287j080007@KPOX0@000M1?71Ea@ +0`0T~3PlSoPl@HFlW3RmZ=AOA@SDGhD8]5252`0nP0~3Rm>3a0`;`7@Ca`ELD0<0:`0008?8oh?4 +65_9`h_JRdD8j6`7~2Rm=VRDG^mTGho`nE`H7Qo`0008U=l87j080007D6<l3[1h_0^080~2IX]M +kVJj701V8m<?_m8;AO0;d8]52>Sh1P003koKm\<2M0Rk04000>\6o;\0P000Rl>3a1QKbL<0~> +EH_\Dh?\;8U528UE36XHSDgHDFX1D;04j000~2Pl@@2l1d4lL5G50301L0~2PlSoPl@\FlW3Red< +I\M30P00I\M32000I\M32P00SEGHRl?XAPL006K7@`@003?0IX]5k?K047@=I\M31<11jI80~2 +Rl1VRdG\Pn083hF3~3RdD<IX]H16J1b`21IXUH16J;CNb3h@5e1h3;P6J9F0B;C@R9COR2>@1d +2D62>@1enXU=n8]5n8eHo8UMn3]M27I1PS\^MA6jW3h308?X0nR_1`002l1d9;ZP?P<0Regh@h_3 +j9\7~22l2;`g@>^Z@n0`3XR`L000_0M@N;A@b2B0A0RaeTC`<0RdD8<lV:26J;W4\41000IX_; +P_UQLR>2nGYg7X9h0CYe687So`0008?[HH]536J9F0aVRAS[8he008e=l56=COAA\0;X~4Pl@8 +ReGdBX]=36J9D@aVRA4c`8?4;5_9``00~:EH_\Pn`dRED<JP1X4B0006X1JP1Z08e=n56=COaA +D;08j000~2Pl@PIXU5mVH;`7@_IX?h17D<a`ELD0<06@000>\EIX=mmVh?UL0Uo`0008?05j=L +D0<0PlSoPl@dbL=Z68e=g55Z0Omeo;04j000~2Pl@@IXU5mVH;`7@Ya`ELD0<0?00002Goo`00 +Xd1H0`3oMOb`0NP0~3Pl@4PlSoPl@dbL>3O@`03hGF~3SDg@DK01j000~2Pl@4IXU5mVH;`7@Y +a`ELD0<0?00002Goo`00Xd1H0`3oMOb`0NP0~3Pl@4PlSoPl@dbL<c`8Y5e8Y=i8;Qh2@O2\R8 +CN@c`8Y5eFJ;CNAVPN4Oo\7P1FHUo`5V2lQVRDgT<l1VRdGF;K`7~2RTgUP>41dN0:b8Q=iC?0 +RTGBVH?R0@?2dOR:CNJ2hN0T7`[8R4gV<l2:AM5VRdgVIX7Q7oS1h0EV9Ol7IP_8IXU=iS?0RTG@ +RTgWP>47`N032\R8CNOYT00008_0RdD<Pl04j<eLoon;b8]138YEi8;Rh2@O2]28ENB;@A10IX]E +i6J1hQon`N05IRGo0FH;d6J9ENB;@AB3j52:ENF0hP7Ah0[@R5GUR`6ITX?P0@?@dOZ:ANHTh8;R +7`[2R4GVRe44IX]5iVHU7oS1hPEVPN;o1fH;`VJ9ANJ;@@R:CNN0h@O1h0<:b8Q=ifXHSDgLDFX1 +ogGl\0CX~4Pl@@IXU5mVH;`7@Ya`ELD0<0?00002Goo`00Xd1H0`3oMOb`0NP0~3Pl@4PlSoPl@d +bL?oMOb`0NP0~3Pl@4IXU5mVH;`7@La`ELD0<0?00002Goo`00Xd1H0`23b?n3a3C9`c?0Pl@d +bL<0~=EH_\Dh?\13goo`00O`@;`7d8<l23a0AKbL>3?K1G0`00MAF;f>Pj0@002l2;`gD8<l23 +a0AKbL>;7K1G0`0i@cao5H_Hj280~22l2;`g@8<l23a0AKbL>;7K1G0`2=18>3`423a0AKbL>; +`5EXF00206Co=@00~2Rnb3k1QTRBd0~3Dh_HSDg\DK01j000~2<\3X~4Rl>3a0@;`7DMR`f`E`<0 +RDgladGh01000<M5m?03~2jD\0~2o8\=\5L308]I?3_HObn=39V3`D29COa0:l?1h098VH7Ro`l0 +00?2`OP<@<7P38U5n<M5m004~2ja6=@037AO`0~3adG`~4Rdgl2lUd:FP@1000ogGhDK03j000 +~2Pl@<RDG`2l1e3h\=\5L308]A?0=Em8UA?3;0j000~2SDgXDK01j000~2Pl@4RdG`Fh_UI8l5 +~4Pl@4GL>=@01EJ5P00P1TocD0~3RnaTRBd0~3Pn`lSDgXDK01j000~2<\3X~4Pl@4Pcf`E`<0 +00n5i`0008e=k56=CNAA\0;X~4^B@0~2SEG@RdG\R`3X@>Cooh?428e=d8U=m89md01d2_a1PST0 +MOZ9COC7AObX?P<0PSfX?P<007@C^JPn0`2;`462>@1enXU=o8e008]5o8e8ohU=o88i;WD6PnP2 +RDGlRdgdBHU=m8X1ReGlR0:=EM0kbWOGJP=XZ3h308e=n56`0nP0~3Pl@<RDG`2l1e2h]=n8T= +\5L30>\jPgg`0WDdJP=X010406RX?P<0SDghDK04j000~2Pl@@RDG`2l1e4h]=n8T=\5L303?0 +j>Wmoon9AO0b`>P0~3SDgPDK01j000~2Pl@4XK1G0`23a3aTS`D0~3Pl@4GL?lEH_\Dh?\28_J +j4;moon;dhU5n0_0M@YVPlSoPl@8FlW3RdGhIXT@IX_2Pl@8FlW3EH_\Pn`8j1Gmoon9AO`;`7D8 +IS?0Pl@8bL>;COaVR`63a0S9`he005F;k5>3k0R;f^SZo?ooRm>9AOP;`7D:IX?8oh?425_9`h]5 +n6H;46J946J;`X?425_9`oaERnaCPn`8Rm[X]_cooh_CRDGh2l1e23?0Pl@8FlW3RdGh3kl03koB +QM0?UL0Uo`0008?425_9``00~:EH_\DeN3k0b;fX_h<lV=D`R=@`[X?`0008U768_8SE<4SD<6 +j2l0~2RDLDRdlHRm>=@`;X7`0008_CRlR;ahU878]:38U846K7@0H108?435mKbL>=@01ERnb3 +k2QVPcX0MA5VPcP0M@\;bG@7Rl63a2S9`hX8Pn4OdN69CMaVR`R1hOl7~2`NT5RDgPRTP1PN7o +~3`NT3RDgTRPZ3hAn9CNQVR`Z1hOl1~2`NT5BHU=k8Y:0H7Qo`000=7YPl5@RDg`adGlooooohe5 +g>Q3ZoooPl@XbL<0~=EH_\Pn`4DeIGRlZ;7FA?0`0cdXXARDglRPP?]_UVRkAC10@008]Eo6Hi +]7\41000MCD:bG@aRl10SEX1R`eTC`<0<m::4hUMo8XH3kKkIX^dD@@4~2ReGlISVdN@@4~2M@@: +fgGARceTC`<0<m^:66J;Q5l410003ko0<m^:6VJ;W5l410003koK:l=OGU_9``00~<odeCAe=5 +Ac<b0060~2<4P108d514P2051ERnb;A@B7A@R9A@AMj@00~2o`00ool0~= diff --git a/support/vvcode/binaries/os2/vvencode.boo b/support/vvcode/binaries/os2/vvencode.boo new file mode 100644 index 0000000000..6386ca395a --- /dev/null +++ b/support/vvcode/binaries/os2/vvencode.boo @@ -0,0 +1,1589 @@ +VVENCODE.EXE +CEZ`00<0~210000?oo~2_P00~5@000~QP00000hO^Ph0]0W=8KP1C<dQE6QYLb1`LVmWLV5]86=Q +KVi_M21RIB1bMFhPJFhPHB14Ce<PLfEcLfU_KRh=3@XT~2C5P0~50P01~30P0@0P0060000040 +~2B7000080~2d6`0~24000100006P2~6o@00~5a0000080~2m0000;04~:]0400<01~:`@4002D2 +~260@000<0~2:@@0~5\0@0~A0P00~=1@00~68000~DF2T1~30@0580000@0001<0~6d6`0~30`03 +8000500000D0~6e0<0~24000e0@0~24000e0D0~24000e0H0~24000e0L0~24000e0P0~24000 +e0T0~24000e0X0~24000e0\0~24000e0`0~24000e0d0~24000e0h0~24000e0l0~24000e100 +~24000e140~24000e180~24000e1<0~24000e1@0~24000e1D00609~6Y`h10>\0~2a0l10>P1 +~2f0d10<H2~2d0l10<<3~2404000QfMVE^HfmTI@00~N;00004@0~2HP0007H0~2W00009`0~2 +W0000;l0~27`4003`1~2F@4007H1~2l`400?<1~2l`400?<1~2l`400?<1~2286:3@86206B3`5L +0@R1g`l1h2P11P4[0BX>J@jL3]\>3Pm=3`P1gP\1>0480MT80@01:0420BP1?02J00P1\`l1<048 +PG@80NH80Md60JT1207E1P6Z0BP10P4[0CL3E0@80FD40@41285o105^206a104`0BP10P400J08 +Q@TX0@D16P6Y2S@;XP]d3=h<:0430C01HPIj1Y86204[1@5;0@P1]PP1CP480Ml<0Dl1207?204h +0@P1hP@1NP4X0@81004H1`@8206P1`4@0BP10P4A0O45I@H80FH70AT1:04;0AX1c@SR2?L8C@UR +2GL9WPVc2LP9?0Y@2PP1VP41I048PFd?0NX80B\40B\1207S0@5j0@P180H1OP4X0@<1004=0I01 +j@4X0@816@450541206C104[0@R1^`81g`P12PP1:`4X0@D1<06O0L46P`O:3Dh?206Q3@410@P1 +S@d14@48PA0=0MlXP@81h?`>JPlX0@@10@4E0Ul2bP?O0`R1C`T31PP1WP414@480E<10A<1207[ +0@4G0@R1X0<1fPR17@01g`R1=@81iRR10P7X]PB[1BR10P7YG@FY1PP1Q@H1;0480E<60Bd1204m +1@4a0@P1bPD1>04X0@81O06_1:@5:0420Gd1J0Fd1PQ4Ce=3@Da<D`=>C5<3CE=7~70@0S0;02 +0`2h0P<0~4`0830<P20`3@0P<0f083~5K0D32@01~20@0307P50`T00@000@0308050`T00@00 +0@0308P50`T00@000@0309@50`T00@000@030:@50`T00@000@030:`50`T00@000@030;@50`T0 +0@000@030<@50`T00@000@030<P50`T00@000@030=050`T00@000@030=P50`T00@000@030>P5 +0`T00@000@030?P50`T00@000@0300@60`T00@000@0300`60`T00@000@0301@60aD00@000@03 +02060`T00@000@0302`60`T00@000@0303@60aD00@000@0G02A9I2@0~330830040~650832@01 +~20@0302@20`T00@000@0K02`20`01~7=0830080~6>0832@01~20@0?04020`01~7C0832@01 +~20@0?05`20`02~7J0832@01~20@0307`20`T00@000@0308`20`d00@000@0;0040~6V0832@01 +~20@030:@20`T00@000@000N@20`0\0`<0M0<30;`30`0410<0C0@309@40`3L10<090D3~5I6ER +MFL0~2IFiSKfAYKVMOM65RK6D006I_LVeQM000J6E\L000~2K6mW06e_I6D0~3KgIULWMbJGAU +~3LVESKg9TGfaUKVMdJ00007AYKFEcM65]L00007AbHFicK65dJFm^GfIYK6D0~3J6EQI6EbGfIY +K6EcL6ES07=`K6UdGg=YNVD006U^L7EdGfIYK6D006meM71eM5mVJFaU069YKV5bN@00M6EhM000 +~2I6EVHGE\M01cM79UHFd006IYN6ET~3MV5bJF5RK6D0~3AP0102X102@1~2:RXP85AXJG<PJG<P +HB1FEVE^HfmTIF@PIVU\IBhP84U]L6aUKFE^M65dJFm^Lb1_IR1FETA5@dm4AB1QKV@P820P820Z +:P00:RXP85IFADi3CdA5865bIB1VLVEUK7TPHGIQJFaQHVaU86I_LR1]HFii86AYIVIULVE^M21S +Kfe`MGAULW<PHFiT820Z:P00:RXP86m`IG9QM6U^Ib1cNG=dIFec;R0PE6QU86eQLgAULR1`Kg9d +HF9\IB1387=_MG9SIB1YLb1QMV5YK65RK6DP820Z:P00:RXP86IbKfdPM6QU845cM6m^85E^JGIU +LW=YM7TPE6EH865bHfQYMVDP;B1dJ6DPJ6m]IB1_IR1FET=?A4D^820P820Z:P00:RY200408040 +U00Z:P00:RXP84UV87U_MB1gHFid87A_86IYKV@PKgEd86e_LVDPHF9_MG@PEUI3CdA5;21cIFiT +864PKFEcLf5WIB1dKb0P820Z:P00:RXP84aYLgAODfEbMVEb@5AUF2i1HbiEJb1gJGAX87AXIB1c +MF9ZIF=d87AUN7@P9dQ5C50PEUI3CdA59b0P820P820Z:P00AP0102X109<1~2HGAdLV9UIfU^ +~3HGAdLVE^I01RIFMYKP00069iM6ESKgE^M00006=XHG9QHgAULW=UM000~2Hfm]KFE^M01SLV<c +<P0006AUHfmTIGIULW=YKfh0~2IFiT06I_LVeQM000KFmTI@00~2Kg1ULV5dJFiWLgUcM6E]079U +HfmbI6aUKVMdJ000~2Lf]YL6IbKfd0~3Lf]YL7A_~2M65RK6D0~2M6U]IG=dHFe`~3N6ad;FIb +Kfd0~3N6ad;GA_~2N6ad;G=eHW=dHfQQLP0006U`Gf9eIVIULP0004A5@UE7>R00IFiSKfAU>R1b +IF=_LV@PK6E^IgAX83dP9CE\I2`PM6mdHF`PHWUdIG<PLVEQI20m82Da<6aT00X0~3I6EVGfIY +K6EOKV5]I@0005IFIFiSKfAU82Ec;20ULb1bIFaUHG=U82PULbT:~3<2hi=b1RIGAQ~3Ce<_<R0b +;WPPBD9=84<PDfEd;c80~3<SDPCVmf834i>C80BBm@86IYK6Dj6P01020101h09G<0~2CgIULWMb +JGAU86EhJG=dJFiW86IYK6Ec>PX00@0P0@0F02Ec~3NFEc06i_~2C6mW86IYK6Dj6P01020101D0 +9G<0~2AFiSKfAYKVLPKFEdJ6mT>Q<00@0P0@0G05IFHfmTI@X004T_D21VJFaU86e_I6Dj5@01 +020101d09G<0~2MFi[KVmgKP19;e0PIVU\IB1VKg9]HG@j4`0102010<P09G<0~2MFi[KVmgKP19 +;e0PIVU\IB1\KfiWIG=d879UHfmbI21\IFiWM6Pj820P82E\I000BBm@86IYK6DPK6m^IfEcM21b +IF=_LV@PK6E^IgAX>R0P821eKV]^KgM^~2BBm@86IYK6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX +>R0P820UK6@004T_D21VJFaU86eQN6U]MFdPLVESKg9T86aUKVMdJ3XP820PMFi[KVmgKP00BBm@ +86IYK6DPM6U]IG=dHFe`>Q000@0P0@1o02Ec2P00MFi[KVmgKP11Dd=9B@0007AbHFicK65dJFm^ +86IYK6DPM79QKW=\HGAULb1VLVm]860ULbLPM6lPH2Ec9`0006a_Hf5\86=XHG9QHgAULR1cIG@P +JG<PH2Ec9`11Dd=9B@0005AbHFicK65dJFm^871ULVI_LVeUI3X=00408040G`5^KfiU04U^M6Eb +KV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0Kg1UKUmYL5mVJFaU~4A4E2EDLj801UKV=_I6Dj +86m`IFiYKVLPJFi`MG@PIVU\IB1P9G<W00X0~2IG9bKg8PKg1UKVU^Ib1YKW1eM21VJFaU860U +LbL0~2A4E2EDLj801_L6E^GfU`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0 +;@00~2LgATKgEd~2MWIU04A5@UE7>R00Kg1UKUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU +860ULbL02P00~2MWIU04A5@UE7>R00Kg1UKUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU +860ULbL02P00~2IG9bKg8PKg1UKVU^Ib1_MGA`MG@PIVU\IB1P9G<W~22UIFAB1?;e0PIVU\ICXF +004080402`4UL`00A4E2EDLj801_L6E^Gfm`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1V +JFaU00X007ARK01ULW9_LR1bIF5TJFiW86E^HfmTJFiW87AQHVaU86IYK6DPH2Ec9`00A4E2EDLj +801UKV=_I6U^Ib1dHF9\IB1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P00I6EV +HGE\M21FET=?A4D002\]<34b<c@e=SLh>D52@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJHF9SI6EV +IfQYJV]\KFi_L75bLgAeMWMhNGX0~32TE^HfmTJFiW87AQHVaU87=_MG9SICX=00408040700U +L`00AFiSKfAYKVLPM65RK6DPHfm^M6E^M7<j2`01020100T09Bhc<W<0~38`01020101d09Bhc +<W<0~3EUI586E^HfmTJFiW86I_LVeQM3X?00408040>P0UL`0006i_M21bIF=_LVAUI000~2J6Ab +GfIYK6EOLg1UH`0005IFAB1XIF5TIG8PIVU\IB1cL6ES>Ph00@0P0@1g02Ec~3BFidIG9^HF`P +IG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1cIGAOJG1OIVU\IG=`IF<0;@0007=dI6U^~3JFifHFaY +I21VJFaU86E^HfmTJFiW86e_I6DPLfEd82PUI2T0EUI586E^HfmTJFiW86e_I6Dj4@01020101l0 +9G<0~2EUI586a_KVMULg@PLVESKg9T86aUKVMdJ3X900408040C`1^Kg@PLVESKg9TIF@0JFif +HFaYI21\KfiWIG=d879UHfmbI21\IFiWM6PPLfEd82PUK6@Y05IFAB1\KfiWIG=d879UHfmbI21\ +IFiWM6Pj2@01020104L09FaT~2JFifHFaYI21\KfiWIG=d879UHfmbI21\IFiWM6PPLfEd82PU +K6@Y05IFAB1\KfiWIG=d879UHfmbI21\IFiWM6Pj2@01020101l09FaT~2EUI586eQN6U]MFdP +LVESKg9T86aUKVMdJ3X900408040C`1^Kg@PLVESKg9TIF@0JFifHFaYI21]HGQYKGE]879UHfmb +I21\IFiWM6PPLfEd82PUK6@Y05IFAB1]HGQYKGE]879UHfmbI21\IFiWM6Pj2@01020104L09FaT +~2JFifHFaYI21]HGQYKGE]879UHfmbI21\IFiWM6PPLfEd82PUK6@Y05IFAB1]HGQYKGE]879U +HfmbI21\IFiWM6Pj2@01020105L09FaT~2A4E2EDLj801cL6aYM21cJGYU86i_M21cL6ESJFIY +IF@PKfhPM6QU86=_KFeQKV@PK6U^I@0:~2EUI584l_D21VJFaU86eQN6U]MFdPLfUjICX90040 +8040F`1^Kb1]HGQYKGE]~3KVmd86E^HfmTJFiW87A_864PIVU\IB0]86IYK6DPLg1\JGAdJFiW +86AYLf5RK6ET~4EUI584l_D21VJFaU86eQN6U]MFdPLfUjICX900408040J@1^Kb1]HGQYKGE] +~39FaT06U^MV5\JF@PLg1\JG@PLfUjIB1cL6ESJFIYIF@PH2Ec9`0007=`K6Ud87=YNVDPKGEc +M21RIB1QM21\IF5cM20UK6@PJd8005IFAB1?;e0PIVU\IB1]HGP0~80@0:06U]MFdPLfUjICX9 +00408040700UK6@PJd80~2EUI586IYK6DPM6U]IG=dHFe`>Q000@0P0@1T02Ec~3KVmd879UHfmb +I6ET~4KF5hJFeeKB1^MFeRIG8PKfHPL65bM7<PLVEQHfQUI20X9F@Y~49G=cJfU`M6lP9F@:05If +051QLW@P9C=T869iM6Ec87MbJGAdIFhj3001020107009FaT~2MRD`<V@0~2IG9bKg8PKg1UKVU^ +Ib1_MGA`MG@PIVU\IB1P9G<W~29G<UL`X0EWH0~39G<ULb0UK6@:05If~49G<ULb0U<3Q\N0X0 +EWH0051QLW@P9C=T869iM6Ec87MbJGAdIFhj3001020100d09FaT~22T=B@bdc<SXL00408040 +6@0U<3Q\N00005A_M65\869iM6Ec879UHF@j4P01020101T09FaT~2E6mdHF`PHWUdIG<PMg9Y +M7AUKSX?004080407@0UK6@005A_M65\84l_D21`HG9dLb1gLVUdM6E^>P\00@0P0@1X0RET~3 +2UIFIFiSKfAU82Ec;20ULb1bIFaUHG=U82PULbT:2P0`;STg869UM640~2Ce<_<R0b;WPPBD9= +84<PDfEd;c80~3<SDPCVmf834i>C80EUIUKV=_I6Dj82Ec2PX005EcHFMU>R1FEVE^HfmTIB0P +Fg5eHFaYIVUULW=M821YKW1eM5mVJFaU821KKgEdL7EdGfIYK6EM2PX0020PEV5\JF@PLGEQK6UV +JFEbLb1QLVDj2PX0~2820U;S5c9G<:02l]~4820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj +;@0P82D^<G<ULbD^<G=VJFaU;FI_LVeQM20P:6I_LVeQM7<PLgE`L6mbM6ET>REc9G<ULbEc9G<U +LbT:02l]~3?CX]~38000~3820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj;@0P82D^<G<U +L`X0;bd0~3820U;S5c9G=K9BhaLfIYK6D]Lg1UHed:02l]03dj;@0P82D^<G<ULbD^<G=VJFaU +;Fe_I6DP82Q]KfAULb1cMG1`Kg9dIF@j869YKV5bNB1dIGQd:@X0;bd0~2?CX]020P9BhaLbEc +2P0_;@00~2820U;S5c9G<U;S5cHWUdIG<:02l]~3?CX]020P9BhaLbEc9BhaLf]RNGAUL`X0;bd0 +03dj;@0P82D^<G<ULe\U;S5cM6U]IEd:02l]~2?CX]020P9BhaLbEc9BhaLfIYK6D]Lg1UH`X: +02l]~2?CX]05If05H02P002U1QLW@P9C=T84l_D21VJFaU>Q400@0P0@1H02Ec~2D65bM20U<f@P +LgAQLWAUI21QM219;e0PHWUdICXP820P820UK6@002Ec2P1GLVUdM6E^869i85IFIFiSKfAU82Ec +;0X0~3<2hi=b1RIGAQ~32`01020100839G<PLVE\IF5cIB0X9G<Y2P1?Dblb838^N219@TdP@b1C +IG@_<P00~2<SDPCVmf834i>C802P0002Ec9G<P9F@:05If02Ec9G<P9G<:05If04mC;c80~39G<U +Lb0UL`X0EWH09G<ULb1?LVUWJFiQK21VJFaU86=XHG9QHgAULR1cIG@PMf5c82Ec2P1FMP11Dd=9 +B@0002Ec9G<P9G<:05If045C@dU9~39G<ULb0UL`X0EWH09G<ULb0UL`X0EWH09G<ULb0UK6@P +9FaT2P1FMP00~29G<ULb0UK6@:05If~49G<ULb0UL`X0EWH09G<UL`X0EWH0~39G<U;S<bL`X0 +EWH09G<U;S<bL`X0EWH09G<ULb0UL`X0EWH09G<UL`X0EWH0~39G<U;S<bL`X0EWH09G<U;S<b +L`X0EWH09G<ULb0UI20UL`X0EWH002Ec82E\I21RNGAULb1VKg8PM6QU86eULg=QIfDPHWEVIVEb +2P00~2AT5D@D`j87E^HF9\IB1dKb1QK6a_Hf5dI@0004A5@UE7>R00KF5YKSXPHFa\Kf=QM6ET +82E\I21RNGAULb1VKg8PHWEVIVEb860ULbL0~2AemdKG1OKG=W00X0AemYL5mRMFIVIG80Aem_ +L5mRMFIVIG80;bd003dj;@1XIFa`879ULGEULgAUI000JFi`MG@PIVU\IB1]MG=d869U87=`IF=Y +IVUUI000~294UT9000~27`0001`0~27`0001h0~27`0001h0~27`0001l0~27P0001l0~27P00 +01l0~2IG9bKg8PHFa\Kf=QM6U^Ib0UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W~2A4E2EDLj801Q +K6a_Hf5dIEmRMFIVIG8j865\K6mSHGAUI20UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W00X006=_ +KFeUKWAOLgAbGf9eIVIULP009BYc82EKGPYM~3EUI586IYK6DPHfm]KFE^M3X>00408040A@PU +L`0006EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG8006EbLVmb86=\Kg=YKVLPIVU\ +IB1P9G<W04A5@UE7>R00IfEdHemVKg9]HG@j86I_LVeQM21^Kg@PLg1UHfUVJFET86m^87AXIB1S +Kfe]HFiT86aYKVD02P1VKg9]HG@PH2Ec9b1YLb1^Kg@PLgE`L6mbM6ET869i87AXJG<PJFe`K6E] +IFidHGAYKfh0IVmbKF5d860ULbLPJG<PKVmd87=eL71_LWAUI21RNB1dJ6Uc86U]L6aUKFE^M65d +JFm^06U^MV5\JF@PIVmbKF5d860ULbL0A4E2EDLj801WIGASGfI_LVeQM3XPHfm]KF5^I21\JFiU +87=`IF=YIVUULb1VKg9]HG@PH2Ec9`0:~3A4E2EDLj801WIGASGfe_I6Dj86e_I6DPKVmd87=` +IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21]KfAU860ULbL0~2A4E2EDLj +801WIGASGfe_I6Dj86=_KFeQKV@PK6U^IB1cL6ESJFIYIG<PKFmTIB1P9G<W00X0~2A4E2EDLj +801WIGASGg9UHfaUKSXPLVESKg9T86aUKVMdJ21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT +86aYKVD02P009FaT06U^MV5\JF@PLVESKg9T86aUKVMdJ21cL6ESJFIYIF@PH2Ec9`00~2LVES +Kg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2LVES +Kg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2A4E2 +EDLj801WIGASGg9UHfaUKSXPHfm]KF5^I21\JFiU87=`IF=YIVUULb1]HGQYKGE]879UHfmbI21\ +IFiWM6PPH2E\I2L02P0004A5@UE7>R00IfEdHemdJFeULgAQKG0j87AYKFEcM65]L21^Kg@PLg1U +HfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0006U^MV5\JF@PM6U]IG=dHFe`87=dLVU^Ib1c +L6ESJFIYIF@PH2Ec9`14AD9EAcXP06QUHFAULUmdNG1U>R1FETDPK6U^IB1]HGASJ6Ec86QUHFAU +LSXPH2Ec9`0:~4HFeRJFMeKgEc86QUHFAULR1YIfi_LVET~4A4E2EDLj801XIF5TIG9OM7U`ICXP +JFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:~4A4E2EDLj801]HF]UGgAY +KFDj86AQM6DPL79_MVUTIF@P?B0U<3AT;bD`<V@_9C0bI00:04A5@UE7>R00KF5[IEmdJFeU>R1d +JFeU871bKgIYI6ET83dP9C0bI3XU<39T>RD`<V@02P14AD9EAcXP06eQJfEOM6U]ICXPM6U]IEmd +87IQK7EU879UM7EbKVET83dP9FaT00X0~3A4E2EDLj801_L6E^Gfa_IemVJFaU>R1\KfLPIVU\ +IB1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1\KfL0A4E2EDLj801_L6E^Gfa_ +IemVJFaU>R1_L6E^JFiW86a_Ib1VJFaU860ULbL02P00LgATIG9b~2IG9bKg8PKg1UKVU^Ib1\ +KfLPIVU\IB1P9G<W04A5@UE7>R00Kg1UKUm\KfMOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMeK65b +86IYK6D02P1TMFe]N@0002DZLb0UL`00IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QUHFAU +LP00A4E2EDLj801`HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dPH2Ec +9`0:~39C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~2IG9bKg8PL65bLfU^Ib1dJFeULgAQ +KG0PLgAbJFiW860ULbL0NFEQLR0XFEUIFBTPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<CTg<2db<3<g +82Q^Kg@P9F@Y2P00~2KFm^M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^Kg@P +9F@Y2P00I65i82Q4A2TPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<Bdc<B0XKVmd82ET:@X0~3J6me +LW<P:4Q8:B1]MG=d869U86U^87AXIB1bHFiWIB0`;C8c82Q^Kg@P9F@Y2P00KFU^MGAULb0XCDdY +86eeLg@PHVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4LfESKfiTLb0XDe<Y86eeLg@P +HVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4A4E2EDLj801`HG9cGgAYKFDj87AYKFEO +M21fHFaeIB1bIGAeLViUI20m82E\I00:~4JGAUKEmcM780~39FQT06EbLVmb871QLW=YKVLPJGAU +KB0UI20XH2Ec9bTPJFhPM79QKW=\HGAYKfhPIVU\I@00~2JFifHFaYI21fHFaeIB0X9F@Y86mV +86UdIFdP9F@PJFhPM79QKW=\HGAYKfhPIVU\I@0007MbKfiW86ieKF9ULR1_IR1fHFaeIG<PJFhP +M79QKW=\HGAYKfhPIVU\ICXP9F@0069eIVIULP00IG9bKg8PKg1UKVU^Ib1UKV=_I6U^Ib1dHF9\ +I@00~:0@2V0R1VJFaU860ULbL006EbLVmb879UHFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\I@00 +07A_Kb1]HFii86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\ICXP9F@006i_M21UKVme +IfPPHfQQLV5SM6EbLb1YKR1UKV=_I6U^Ib1dHF9\IB1VJFaU>R0UI000~2IG9bKg8PKg1UKVU^ +Ib1dLV5^LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP00IG9bKg8PLVEQI6U^Ib1dLV5^LfaQ +M6U_KR1VJFaU~2J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\HGAYKfhPIVU\I@00~2BFid +IG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1bI5mhK7AOIVU\I@0UJ6@0JFifHFaYI21P9G<W +86QUHFAULR1fHFaeIB1YKR1dLV5^LfaQM6U_KR1VJFaU>R1P9G<W07A_Kb1]HFii86=XHG9QHgAU +LW<PJFhPM79QKW=\HGAYKfhPIVU\ICXP9F@0J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFic +K65dJFm^86IYK6D0~2J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0 +~2J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0~2JFifHFaYI21UKV=_ +I6U^Ib1dHF9\IB0]86=XHG9QHgAULR0`N2D`<UPPI7E`K6USHGAUI000~2N6ad06EbLVmb879U +HFAYKVLPM79QKW=\HGAYKfhPM65RK6DPIVU\IB1P9G<W~32UAbHFicK65dJFm^87AQHVaU87=_ +MG9SICX:004080406P0UL`00E79QKW=\HGAYKfhPL6EbIVmbKFET>Pd00@0P0@1X1F0ULbLPM6lP +H2Ec9`1SKfidIGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL007AUN7@j860ULbL006=_KWAUN7@j +86aYKVDP9FaT86mV86IYK6DPH2Ec9`00A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21fHFae +IB1`LVmfJFAUI20m82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@PM6lP +<0X0~39C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~284M=E000~2A4E2EDLj801fMUmd +JFeULgAQKG0j85IFAB1dJFeULgAQKG0PLgAbJFiW879UM7EbKR1fHFaeIB0m860ULbL:00X0~2 +HfmeK6A^9g@PHFa\Kf=QM6DP9F@PHWUdIG<PM6lPHfm`NB1cM79YKVLPH2Ec9`0094UT9000~2 +2REc85]I;diM>R00ADm686AUM6ESM6ET86m^87=dHFiTHG9T86U^L7Ed079R~3HfmeK6A^9g@P +IGQQKFU^IB0XKg1UKRTPIVU\IB1P9G<W~3A4E2EDLj801UN65]JFiUGfIYK6Dj860ULbLPJG<P +KVmd864PLVEWMFaQLR1VJFaU00X006=_MFaTKRMd86EhHFeYKVDP:7=dHG@Y86IYK6DPH2Ec9`00 +079UHG=_KR1VKg8PIG9bKg8j82Ec079R0780~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET +82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86U^L7Ed~3AVU\IB1P9G<W86EhJG=d +LbhP84mfIG9gLVUdIB0o~2Kg1ULV5dJFm^86=QKV=UK6aUI01VJFaU860ULbLPIGQYLgAc07MR +07L0~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU +860ULbLPIVmb86meM71eM000@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4 +ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\ +KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4LgEc +L6USJFmeLb1XIF5TIG8PIVU\IB1cL6ES860ULbLPHfQQKVMUI21dKb1P9G<W~2G3X0G00^~42REc +06EbLVmb879UHFAYKVLPLgAbJFiW86IbKfdPLgATJFh0BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@P +JFhP9G<X:@1bIF5TGg9UHfmbI014AD9EAcXP07=SHFiOHfeTGfaYKVDj86=_KFeQKV@PK6U^IB1Q +LVMeKFE^M3XPH2Ec9`0:02d004A5@UE7>R00Lf=QKUmSKFAOK6U^ICXPKF5dHfQULb1aMF5\JFIY +IG8j820P820PH2Ec9`0:~3HFeRJFMeKgEc875eHFaYIVUULR1P9G<W~4MFi[KVmgKR1aMF5\JFIY +IG8PH2Ec9`00LGEQK6UVJFEb860U;S5c9G<W86eeLg@PM65[IB1Q87IQK7EU02l]07IQK7EU86eY +Lg=YKVLPHFIdIG8PLGEQK6UVJFEb860ULbL0075eHFaYIVUULR1P9BhaLbEc9b1TKfEc86i_M21d +HF]U864PMV5\MFD0;bd0A4E2EDLj801cHf5^Gf=]I5m\JFiU>R1aMF5\JFIYIG8PMV5\MFDj2001 +02010544H2Ec9`0:~3M6m_86eQKWTPIVU\IB1^HFeULb1cL6ESJFIYIF@0~2A4E2EDLj801cIGAO +IWAYKFDj87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<02P00~2@f5^KVmd87=UM21V +JFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj84mC;c8PI6mULb1^Kg@PLgE`L6mbM21VJFaU87AY +KFEc869UIVmbIB0a>CP`;P0004IYK6DPH2Ec9b1dJFeU87=UM21dKb0a>CP`;S0a;S0a;C0`>S0` +>S0`84M=E00006EbLVmb87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<0~2BFidIG9^ +HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1cIGAOL6U`IEm]KfAU~3IG9bKg8PLfEdM6U^Ib1] +KfAU86mV86IYK6DPH2Ec9`0jG01DFP0005AJ?@17CE@`@U=D~582d]8000~22UM1DTi9CTLj8000 +2TEBDTmB>R00~32TI1E45<>R00~3BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1eLfEb +GfeULg=QIfD0~39G<UL`X0~29G<UL`X0~2BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X +:@1gLVUdIEmbIF=_LV@0~3DgE^84e_KR1DMFDPEfET85AXMB16LVTPDf5d84YQKR16IF8PCF5b +845`LR1=HGTPBWE^84YeK211MFLPDfE`84mSM21>KgHPA6ES88@]0`3T;@<0A2h30:@^0`000200 +800P0200800P0200800P02P0:00X02P0:00P0200800P0200800P0200800P0200800P0200800P +0200800<0100400@0100400@0100400@0100400@0100400@00<00`0300<00`0300<00`0300<0 +400@0100400@010040210H41P@610H41P@600H01P0600H01P0600H01P0600H01P0600H01P060 +0H01P0600H01400@0100400@0100@@510D41@@510D41@0500D01@0500D01@0500D01@0500D01 +@0500D01@0500D01@0500A00400@010080000040~2D4H00040~50@40~20P0006@c0`1X<`<0 +K3<3070c0`1d<`<0N3<307`c0`20<`<0R3<3090c0`2H<`<0Y3<30;0c0`2h<`<0a3<30<Pc0`3< +<`<0d3<30=@c0`3H<`<0g3<30>0c0`3T<`<0j3<30>`c0`3`<`<0m3<30?`c0`08=0<043@30=@c +0`0H=0<083@302Pd0`0`=0<0?3@304@d0`1@=0<0G3@306Pd0`1d=0<0QS@308Td0`0\0@00AE=D +00@0~22P000040~2ooooo`P00@000@0C010>~281`0010>~2ADAD0=0[0`d00@000@0X08`d0`2> +=0<0SS@308hd0`2>=0<0SS@308hd0`2>=0<0SS@308hd0`080040o`403@3D:`<0P2`3~589@0 +0@000@01010V004000404P010?oo0@00~50@00020>5P01~20@0100<@004000400@0@4P01~2 +0@070040~2Q2d33@01~20@0B0040ool2~70@00020>5P01~20@0100<@004000400@0@4P01~2 +0@070080~2i2d33@01~20@0B0040ool2~70P00020>5P01~20@0F00<0~2ADA3<dM<Cd80~20@00 +~2D4IV004000400@13e`01~20@030=0[0`T00@00MG=d869U86T102`0~4S3@308hd0`2>=0<0 +SS@308hd0`2>=0<0SS@308hd0`2>=0<0SS@300P00@3o0@0S0=@[0`20;0<0\2`3090d0`00~3 +n2`304A40`00~3A2h3?@01~20@1T0R83~2E5X004ECE015A5@0~47`0003\0~2FP0007P0~2U`00 +0;D0~2e0000?<0~24@400301~2CP4006d1~67`0003`0~2F`0007T0~2V0000;H0~2e@000?@0 +~24P400341~2C`4006h1~2Gd=\Kg=UDgAbIF5]~40@0000d:00d:~39F@005PW9CAH9`00~47`00 +03\0~2FP0007P0~2U`000;D0~2e0000?<0~24@400301~2CP4006d1~67`0003`0~2F`0007T0 +~2V0000;H0~2e@000?@0~24P400341~2C`4006h1~2`=4100D00<010P01T`00`043T`420070 +0@0002L00<00~20Ih00<010P01U000`043PP6E~2`043P`6G~2`043P@6H~2`043Q06I~2`043 +R`6J~2`043Q@4L~2`041006K~2`043T@4U~2`000004M~2`041004X~2`0000046~2`000004T +~2`000006M~2`04100410060~30Oooool0~3V`00`1`00<05~2`9d00<010060W000`9<00<2N +~2`9@00<2E~2`9H00<2G~2`9P00<2I~2`9X00<06~2`2@00<0U~2`1d00<0W~2`2P00<00~3IP00 +06L0~2J00008<0~2JP0006h0~2K`0008@0~2Q@0008H0~2Q`0008P0~2R@0008X0~2R`0008`0 +~2S@0008h0~2S`000900~2T@00~5200103l10;l2~4Gdm`IFiCM79UHFd0Gdm`IFi2NGAU~3Gdm` +IFi2NGAU~343D305=5E5E@@E97;T5CC@00~2;P0006=_K@1UN6D0HfeT05aCB45BADe5CEa4A4Dd +@410@2i0@40005=eKP1=Kfh0E7EU05MUI01DJ7D0AW9Y05=QM01CMFiTHGT004e_KVAQN@00E7EU +LfAQN@1GIFA^IG=THGT0~2E6QeLW=THGT0~3AW9YI65i~2Df5dMG9THGT0~3BV5^04IUHP1=HG80 +@G1b04eQN@1:MFh0BWE\045eI`1CIG00Cf=d04i_MP14IF<0BV5^MF5bN@16IF9bMF5bN@00~2 +CF5bHfP0~2@G1bJF`0~2BWE^I@00~2BWE\N@00~2@GEWMG=d~2DfE`M6E]HVEb~3Cf=dKf9ULP1> +KgIUKF9ULP00~2A6ESIFeRIG80~39Fd_9F@_9GT0~39DTj9Ddj9E<0~39GT_9Fd_9F@P9DTj9Ddj +9E<0HFd0L6d0;P0004<0~6A4E6@EE<E5m<Cd=1C4D005A5CE1=ADd080T0030a<S<d=CHg>3U1 +@T=4ADH0~3<34b<c@e=SLh>F5RHfAUIP00~2HVa[LfUjI@1\LVESK000079UHfI]~3M7U`I@00 +~2KFE]Kg9i~2J6a<05d0~2;@0[04A4AC@^CE=7~4BFidIG9^HF`PK6URLV5bNB1ULW9_LR1YKR1V +MFiSM6U_KSXPGdMUM4EbLTecI`00:34Y00d:~2CFEcLf5WIB1^Kg@PIVmeKV@PJFhPKFEcLf5W +IB1VJFaU;P00:38Y02Pc:@1=IG=cHFMU86IYK6DPKVmd86I_MFiT;P1>@Dh0BDi6BDi9E5T0~3 +BDi604i1CP19CTI9CTUDF@00~2BDi62P01~20@01080<00400040HP3`O`00~4403oooooooo_ +O`00~4l7l0~5n7ooooooooogO`00~4l7l0~5n?ooooooooogo`00~4l?l00<1ooonoO`00P7l0 +0<3ooonoo`00P?l8004000400P0100P00@3o0@0b0?io~7P?mo~7`?mooooooooookooO`00~5 +P?mo~7`0T00@3o0@0g0;ooo`00~5P?oo~6<34b<c@e=SLh>F5RHfAUIVMXJFY[K6e^Kg1aLW=d +MGIgN7Uj2P01~20@0402A0O`<800400040100T@7l32@01~20@251H3o?`00~5X090~7b0E0~7 +nPQ0~6@9`<@000~4D<<?@000~49?@B@000~3P9JH5T00~48;bn6D00~4:6_^7400~4n@:E8400 +~3@;M3^R=0~44:GDj2I0~4:^N4TBY0~3P?@Pi[D]@0000:0aZEoS<400~21;o96hhd@0000<D^ +_::a=d00041f>V\;gSY0~2j8T48lN:?T0006:\aN]h[D50081j5kLVemQ4@02@[6hbN8J7B400 +]5L:?aIXZD]00:7]c<hK`]=>@:24541QDEV4DT38YAV@^JE_YEE0>PlPm2N?bliH@8@9U?Qh>Cn1 +G43U2kTfe`N?XEm0gdiW1<g9l\UR@9HRPDE0O6olID2N]G0[Z:g5WFU01N=<=Q8I=lE\@<LKh<=F +ghCfKd1L4F`jUP\CVW=0\aD7bG_>Ul1f@23KB;\J`[g`ND3dR0feD9UfUWe0<N]@hZ@o5;b0@?dU +iAZ>CaW[Pd2n=lo@^=7_TXM0[PD31BO6ZkN:@1W7@lJ`]iKUSD1`G>YkcS9nSi50S??T6X:oGK>D +@6l`WZ5R;cGPUd15gP:UWCdQS9]0eiE33PF=:JnN@4ake556l??JXD0@cBCc:gKHR:E0E03^kkJC +3Z^X@6R0jJ^T>=;EZd11l77[IV>SQJm0DVa>YT0l3:Nb@6H7h\m@Blo@]D2PA>f14Xn1P[U0b9EX +8]Ob8J>l@3Zk0^^<Kn[;_d08J\<UL0_Uo\90AB:J5bHWCio6@=JZP9g_l2;7bD2<eN24:jg[n<a0 +MhD<<c]<Ti_@@000~5P?loeJK?odTON<;C@>2<jH39AkZCZ45[EBLiSOM`h7a2S]kiWO_[OZYA +@gKSc?8Y;hB19T@GZ_R^4>?5a?Y4e??gjn5:NYG?ALNA3ZJ^X1WSXdKmUFM[RO^3[7Q77Ie:iI7g +38==B<`1SamZXa[78DV<YP3=Z9`oUoI93WmcS@]Jb^G:B^[KeN<\:hn^Wd_Bcbh=:VNJQ7A<5`ae +PHIeM\U8CCBHNYTfC@ZI7DkQ_c\L63b3j?5>=^BlRWV=X;36Cl]^QN\>S2b6Ve22l6a6eVkIbfmA +1@k_U]A\fYY4DPZkMjRBGdC[65?TYi<i>cFh\^eC_k3dc8Md`hO2E8kkmn@:YD?>UUDiD`9_o@^` +W6]FS;Q:TXCM3NhoEfICZLYf=MJd55Q=08I;1bmORNUH<oN4WAL^]M2mFNEM?LEM>h^NTUXY4GdW +@loOl6IKm]H4aVZQn[HkG4V5n=4[b_n:45e_P?A1<R0^dnAM@;JMc]@;K:2iG^24`8U`C[[cSEmC +_50@T8`U^F9PY_2Q8<1DYH`gHHi_N_oCTJkE2f;m0O7ZM8iBX^1RJ^F^UoadWOJdHlagfI^J2UNk +RFBg@^;C^me?SUiU3GkS:[ZI=]PbIYnU0D24e3jT1fN;FX_H9Ef9nM]WKGfT6gX_Skf`J>eA;na3 +M?n?QFWUJTH?idk6fUUZAOjIEWg_<:H^J`nOcVYj8Gkl0V`NMZJhFPo>_mM\[^JlEj\W]96\KOSc +9knRb5gMP6hMaf>i3o4XZ5E_dJj6mMSLNolYL=P37lVU_Q?2oW1^ClImL`M^Tm=aTA4Ij7\NoMnW +LX9>ZIDPjbJZO7?F>dW>>5E1PE5dViLPRP9BH<@UMB]OO\]<8bfEnWF<mmJXB6RTh\if2S3nGL__ +:ZbSMk@LhG_SD\V2N7Qfkd[KE]jcaTaiD]NZ@QN;lIHQNUmfm6TW_U?UmG[`FME^HQ4e[\YkJJeb +QUOeEHBOO1CW__c7N0k9Lge5CO09hdjkV4QnKFdD^Glh2nPLOnLe2[E_HTF`lGl900400040T`<< +0P1f3080~3P81X0@3VJ040~3P?AX0@3UJP40~3P?AZ0@1CJ`40~3P61[0@2PJ`40~3P:a[0@0G +L040~3P4Q`0@3FL040~4f70103ma0@00~2P4aa0@3EL@40~3P>Aa0@1VLP40~3P7Ab0@1CM040 +~3P61d0@30N@40~3P<ai0@1@NP40~3P5aj0@02O040~3P11l0@1RO`40~3P71o0@09P040~3P1R0 +0@0>P@40~3P1b10@38P@40~3P=B10@38Q040~3P=B40@3gQ040~3P0B50@38QP40~3P>B60@0J +Q`40~3P2R70@1=Q`40~3P5b70@2:Q`40~3P9R70@2`Q`40~3P;b70@3AQ`40~3P>270@0JR040 +~3P2R80@1GR040~3P6B80@3NR040~3P>b80@0hSP40~3P4B>0@2eT`40~3P<BC0@3DT`40~3P=RC +0@3`U040~3P0RG0@0YU`40~3P3RG0@3iY@40~3P0RV0@3gYP40~3P0BW0@24Y`40~3P92W0@0i +Z@40~3P4RY0@0T[@40~3P32]0@1W]040~3P7Bd0@15]@40~3P5Be0@2Yd@40~3P<3A0@37d@40 +~3P=CA0@1He040~3P6CD0@2>hP40~3P9cR0@0dj040~3P43X0@1IjP40~3P6SZ0@0ok040~3P4c\ +0@13kP40~3P4C^0@0Lk`40~3P2S_0@1Sk`40~3P6C_0@1fk`40~3P0Cc0@1]m040~3P7cd0@02 +m@40~3P13e0@2CnP40~3P:3j0@33o`40~3P=3o0@2g0080~3P<@00P0F0@80~3P2@10P150@80 +~3P4P10P1?0@80~3P5`10P1S0@80~3P7010P0\0P80~3P3P20P0m0`80~3P4`30P3]1080~3P?`4 +0P2h1`80~3P<@70P0i2080~3P4P80P302@80~3P<`90P0B2P80~3P20:0P2[2P80~3P;P:0P3b +2`80~3P7P<0P1G3@80~3P6@=0P3c3P80~3P0P?0P1b3`80~3P80?0P2j3`80~3P;`?0P1M4080 +~3P6`@0P264@80~3P9@A0P1m4P80~3P8`B0P3>4P80~3P=`B0P1V4`80~3P7@C0P3U5080~3P?@D +0P3:5@80~3P=PE0P3c5@80~3P00F0P0?5P80~3P1`F0P0S5P80~3P30F0P0@5`80~3P1@G0P3G +5`80~3P=PG0P0h6080~3P4@H0P2:6P80~3P9PJ0P3d6P80~3P00K0P3U7080~3P?@L0P047P80 +~3P10N0P3L7P80~3P>PN0P0P7`80~3P2`O0P3e7`80~3P0@P0P1`8@80~3P7`Q0P0B9080~3P20T +0P2D9`80~3P:0W0P1j:080~3P8PX0P0J:@80~3P5F;k87\c00006J3?Oi70`03M@W7AOCooooo +j`O7AO@04000^T@60`2;AOCXD2T008U5o?aVPcgnA`<00`n5PP000;VLA`<0ReGl^?oooooXQ5`0 +08U5k8=mk01m1nTN0`00Rl2;AN`31@a80`2S34P3088mG4@3005e?;Y@1P<0XK0Z0`3X6VP00?le +34P30?mek;YH1P<0XK0Z0`23k0SXofL00;Z?1P<0XK0Z0`3Xl6L008?446K7ANH00>Td~3Rl2i +W4L308]Eo;P]~3j>iJ~2RDG\Pgg\00n?1@000>VH0P00RdG\0`D<B0<0X`a80`22?J410`01MCW7 +AN00~3Rl2;AN`kAN1f:8]=o8]Eh3?0RP@AIX\DADA50`2;AOb;CN2850R;AN10RDGPjm>=@037 +AN00~3o8]5k3]5h7HhRdGlReGPRPd@B0<0<P`@P>7oPN7o~3XA180`31j0Pc18dTB0<0Xa180`2; +AN10RDGPjl>=@02;ANb9AO2;AOb9AOR3OO003hkR0@00IX<moTL300<?QL@0~2IX=miP0?QKT0 +~2Pgg`:`n=3`0008]5l8V5B?ooonT;~3o<N5B?ooob\0~2RhE8ooooRDGXRdG\VH7Ro`0000?2 +`OP8R4F`RdG\VC?2:l8Uo`0003?2:l:8AK77AN00~3RdGX>dGPMQb;AN2;COb;EN2:3168C0Fb +RdGP@8U5h>_OSD00SHeDooooReGXPl82SDF`j=@K~2RHE@ooooRdG`:dGXRDG`RdgXRdGh0l69 +AOQVadGV0@3YF@0008e008=ml2d?S@h0~2RdG`RHE4ooooj@X0~2ahE4oooo;@0008^5A?ooohU5 +j8f=E?oooh]Ej8]5n>Q`6`00RHE@ooooRdG`:dGXRDG`RdgXRdGh0l69AOR2?KT10`01MF:;QE3o +oom0Pl0lRHE<ooooRhE<oooo0`DhA@<0>`DHA0<03h`j~3^AA80`2j?4`306JQ=4`30>RL5000 +XCQ50`031Ja<0`2S[4`30<L5>4D3~5IZ4DB0<0j<LL~2SIEDooooXB140`3XffL00:4PA0<0j7V4 +~2RHE0oooo^Ca<0`2;5B140`2;QD3ooooXSF@008^5@?oood031CQ50`2S>4D30>TFo_ooRl3Y +]ocoohe008?43<W3SD00EH_\PN`@0@00^Ya70`2hc0430>ST3000^Y@60`2hD@000>SA9@00RDF4 +JP1Z08]=Q;X0~3^9a70`23k0cX_El008?4588mO@43004?QA40~2I\L5=4`30040jB@0~2SD00 +PSgdA`<00GD?I\L5=4`3~3j@X0~2o6K71CA<0`0206QhA0<0IX\==4`308]EQ;P`0@<0Pl0`Pn`< +j2@b~2J>P60`1Xd0H306S41P<0^Z@60`2QI4@308?\2>S7IP00^GQ40`2;5FA40`1V^040j5MQ +~2J9a70`2jm0H30:5TA0<0Pn`8j9aV~2^GQ40`2;5FA40`1V^040j2aQ~2Pl@`PSem0@<00GD< +ahD8ooooA0L30>\:ahD8ooooB0L30?ne2?oookXL1`<0XFA40`23k0SXCVH00;UhA0<0RaETA0<0 +I[P10>SNH000J7Q40`2jC0L30:5TA0<0Pn`8j2=V~2^GQ40`2;5FA40`1V^040j;=P~2^GQ40`2j +M0L306Jh0@3XX6000;P0~3Pn`4j3n3~2Pl@4j=MO~2Pl@HPSgdA`<00@n4[0400;ZLA`<0SDF8 +j1:2~2SDF8j5Y=~2IX=mj?l?Q1L0~23km5j8\4Q@000`29Q@CooooY2`000?c7Q@Coooo81`<0 +okD4oooo^Z070`2QI4@308?\2>QnI@00^GQ40`2;5FA40`1V^040j0iP~2Pl@<IX=mj_md50no +ANZ;18D<00<0RHD0ooooj`_lahD0oooon0L30?ne0?oook[@1`<0XFA40`23k0SX:VD00;UhA0<0 +RaETA0<0I[P10>RjG`00Pl@<Pgg`og@aogG`^P080`2QI4@308?\2>ShI000^GQ40`2;5FA40`1V +^040j8QO~2Pl@<jA<0~2^GQ40`2j:0P306Jh0@3XKEl008=mk?md<omek;YD20<0XFA40`23k0SX +[V@00;UhA0<0RaETA0<0I[P10>PnG`00Pl@<jAD0~2Rl2iN4@30;Yl20<0I[P10>PQG`00PGgd +0@00P7@@RdGdj>a5~2RHGlo_ooj`[7QOcnooo@20<0okGlo_oo^ZP80`2QI4@308?\2>Q2I000 +^GQ40`2;5FA40`1V^040j=9N~2Pl@<J9a70`2i~20`2=EHRh<04308?0?8?\3>PB2P00J9a70`2i +300308eER;P`0@<0Pl0HPn`<j547~2^Ia70`2=EHRh<04308?0E>S`2P00^Ia70`2=EHRh<043 +08?0H>R33`00^Ka<0`2jW4L30;P`0@<0Pl1hj008~2^K130`1V^T00^3010`23`0cXKPD006PH +@@<0I[T00KZ`@`<0I[Q008?\3>QH?P00Pl@`PSfQ0@<00@n5Y00008\EY04308f53?ooonRWO`00 +^OP00`2j?4D308f53?ooonP2?`00RaDlA@<0^=P80`3XgT0000_03hAP~3ocE0A@<0ocDlA@<0 +^^080`2QI4@308?\2>PDH`00^GQ40`2;5FA40`1V^080j:AM~2J2`90`2j40T30:5TA0<0Pn`8 +j>UR~2^GQ40`2;5FA40`1V^?ooj7UM~2Pl@LjA@0~2o;UhA0<0^S@90`1V^040j5eM~2^Ya70`2h +c0430>RF~3J3a<0`1VR`ddC0<0ReF4^=P10`23k0cXgP400;THA0<0^S010`21`X@0~2^3a<0`3X +b0`00;TTB0<0^R23^>eV^001j5DY~2a`D@B0<0ooooolL534P3~5a`F\C0<0~4a`DhA@<0~4I\L5 +54P30040RdF4j8Af~2IZ4DB0<0j?TF~2Pl@@Pl@<bL?lEH_\Pn`<RDD8RED<RdD8PWP50@n4<`00 +06Ql2@<0^U`90`2QI4@308?\2>STH@00^GQ40`2;5FA40`1V^0@0j7AL~2j2mN~2Pl@<RdD<PWQH +0GDCRdD<R`fX:P<0RDQDjED0~2Rl22?Ea40`013hDf~3^X`90`2Q\2X30>PPG`00ogD<^Y@90`2Q +\2X308?\2>P;G`00^[@90`2Q\2X30>SlGP00Pl@<RdD<j95;~2RlR;A@b9B5B;A@b3N5@0MC7o +M@bj^0T30:5TA0<0Pn`8j3]Q~2^GQ40`2;5FA40`1V^0@0j<]K~2j8IM~2Pl@<RdD<PWQH0G@> +RdD<j4Y>~22\1d0^]BPSeLA0<00@n5=P000;[H2@<0XK0Z0`3XO5h00?me3;[P2@<0XK0Z0`23 +k0SXIeh00;X92P<0XK0Z0`3XF5h008?438]53<I0F06;A@cXFUP008?43<W3o5F;k8?\38U528UE +36J9CA2;AAC7@5@0~3RdDDI\M0H040RdDDI\M0HP40RdDDad1Toooooh]55<M0J?oooon;A@R2 +N0D13hG7~3^P\:0`2;A@R;@0SXIg`000_03hDc~3RdDDaT1H0KT7~3^Q0:0`2;AACXlWT008]5 +58\=[2X308U8E8]556K7@6810>Ue~3RdD8Re08RdDDj59l~2RddD^QP:0`2;A@cXCTD0088mG4@3 +004?QCH0~2^Q`:0`2Q\2X30>Q^G@00ogDD^R@:0`2Q\2X308?\2>QIG@00^T\:0`2Q\2X30>Q: +G@00Pl@<ReDDIX]54>S7BP00RlR;AAB9B5CYVP0008_0^@40~2^Td:0`2;AACXBWT00?me56X0 +^@00~2ReD<^000~2Pn`<j4Q>~2RddD^U0:0`2h~4j;94~2Pl@DPSeLA0<00@n5=P000;YD2P<0 +XK0Z0`3Xce`00?me5;YL2P<0XK0Z0`23k0SX^U`00;Z32P<0XK0Z0`3XZe`008?438]E56J;AA3X +:4X008_8RdDDRDQDRdDDPgQD07DaogDD^XP:0`2QI4@308?\2>SVGP00^GQ40`2;5FA40`1V^0@0 +j7II~2j35K~2Pl@<ogDD^ZP:0`2QI4@308?\2>ReGP00^GQ40`2;5FA40`1V^040j4EI~2Pl@< +RdDDPWQH0G@ARdDDj<U;~22\1d1N]ESD00PSeLA0<00@n5=P000;[@2P<0XK0Z0`3Xn5\00?me +5;[H2P<0XK0Z0`23k0SXhe\00;X12`<0XK0Z0`3Xe5\008?438]55<I0F06;AACXeUD008?43<W3 +o5F;k87\R00008U526J9E@b9CA2;A@R2N0D13hF4~3RdD8Re08SDF8j4Ij~2SDf8^P@;0`2h~4 +j413~2Rdd@IX]E38e5R>PY<@009Ol0~2RDF4Pgf400nD`2Go~32l0?Q380~2SDF8D;X82`<0XFA4 +0`23k0SXZed00;UhA0<0RaETA0<0I[P40>PkF000j?II~2Pl@<jF00~2Rl22?Ea40`013hD]~3 +^S0;0`2Q\2X30>SlFP00^SP;0`2Q\2X30>S]FP00^VT;0`2Q\2X30>SNFP00^@l0~2^V`;0`2= +AHSXo7H00;U1~3^W`;0`2;AA3XjWH008e5R52j`0\30:5TA0<0Pn`8j1AM~2^GQ40`2;5FA40`1V +^040j:AG~2ogD@^^P;0`2QI4@308?\2>S[G000^GQ40`2;5FA40`1V^040j7]G~2RdD@Pl0PD;XD +30<0XFA40`23k0SX_U`00;UhA0<0RaETA0<0I[P10>Q>E`00Pl@TPl@<bL>;`5F;k8?\58U528UE +38U=48]E48]52>SJ7000IXU5oVJ3OOko3h@C~3RdDDIX]=oVJ9B6;YH00008e008]5589hF05e +3h]556K7@6810>U6~3o8]536J3N6;oM1J;A@aVRdQRRdDDIXU8H^TX~3SD00RdDDIX=hH00?Q@h0 +~2RdDDI\M0HP40j@T0~2RdDDI\M0HP40RdDDIX=hH_md5H]548]=50noBF:;18R9AOS[2Xe00<M5 +n6P<0`3oMORj@0`30:5TA0<0Pn`8j<aK~2^GQ40`2;5FA40`1V^040j5aF~2Pl@<Pl@<bL=ERnb3 +k2R9A@R9E@b9CA2jN0`30;P10P00j?hI~2RlR;AA2928]5289h1@4?QAH0~2RdD8Re08RdD@R`3X +]WL00>VU~3o6X0SDG\D8e=m;X0~3RdD<Pn`<j<=C~2RdD@oc1Z08e=k8eEm;P0~3Pn`<j0e:~2 +Pl@XRdD@R`29ANR;`8]5j88h00n4F00008\=o4<308]5j3?BRQ0c`6J;157f`80?Q200~2XOa3 +0`2;ENPcbHX:IX^4B0@4~23ko0RDGTj@\0~2o8]=j3?0RP69ANB;CNB;ANR828]5j429ANS[WOb; +AA3o<;Z830<0XFA40`23k0SX[EX00;UhA0<0RaETA0<0I[P10>PmE@00Pl@<Pl@<bL?lEH_\Pn`< +RDD8RED<RdD8PWP50@n4<`0006S@30<0^[0<0`2QI4@308?\2>QPFP00^GQ40`2;5FA40`1V^0@0 +j?1D~2j:]F~2Pl@<^^0<0`2;A@R;@0SXB7H000_0MB2i1P000;[T30<0RdD<j=ic~2RdD<aT1H +0NT@~3Rl2;A@R;D0R;A@cXBWH008?43<W3o5F;k8?\48U528UE38U=48]E48]52>S26`00IXU5 +oVJ3OOko3h@C~3RdDDIX]=oVJ9B63YA00008e008]5589hF05e3h]556K7@6000>TZ~3o8]536J3 +N63oM1J;A@aVRdQPRdDDIXU8H>T<~3SD00RdDDI\M0H000RdDD3km0H>]2Rl3[BX_0RdDD3km0 +H52jk0`30:5TA0<0Pn`8j5II~2^GQ40`2;5FA40`1V^0@0j>IC~2j:5E~2Pl@<j@d0~2o0_0M;b3 +n05d]n^io8]548]=50noBF3o=8Rj40d30:5TA0<0Pn`8j0UI~2^GQ40`2;5FA40`1V^040j9UC +~2Pl@<Pl@<bL?lEH_\Pn`@RDD8RED<RDd@ReD@RdD8j<8K~2RDGlPgglo`n46@0008]548]=o8U8 +I8]54<M0J?oooooYH@000?b;AA22N5P1MA^;AA37@6CoooooRdD@ad1XooooonTn~3Rl2;A@b3 +N6CoM1n;A@b;B6B;AA29B6B;A@b;B6R;AA29B6SY5P0008_0RdD@ad1Toooooh]54<M0J?oooon; +AA23N6SoMA^iN4@30;Xh3@<0I[P10>SDDP00jBh1~2SD00RdD@IX=hHP<?QHX0~2RdD@PgQXo`n< +5@0008]548=hJ?l?S`P0~2jCL0~2SD00RdD@og1X^VP=0`2QI4@308?\2>SPE`00^GQ40`2;5FA4 +0`1V^0@0j71B~2j2]D~2Pl@<RdD@og1X^Y0=0`2QI4@308?\2>R\E`00^GQ40`2;5FA40`1V^040 +j3aB~2Pl@<jI<0~2RdD@IX=hHP8?QHD0~2RdD@PgQXo`n<5@0008]548=hJ?l?S`P0~2jCL0~2 +SD00RdD@og1X^[P=0`2QI4@308?\2>Q8E`00^GQ40`2;5FA40`1V^0@0j=QA~2j9=C~2Pl@<RdD@ +og1X^^0=0`2QI4@308?\2>PDE`00^GQ40`2;5FA40`1V^040j:AA~2Pl@<RdD@PgQTogDH^GQ4 +0`2j20h306Jh0@3XQE400>T[0@00RdD@IX=hHP<?QHX0~2RdD@PgQTo`n<5@0008]548=hI?l? +S`P0~2jCL0~2SD00RdD@og1T^SP>0`2QI4@308?\2>RDEP00^GQ40`2;5FA40`1V^0@0j2AA~2 +j=mB~2Pl@<RdD@og1T^V0>0`2QI4@308?\2>QPEP00^GQ40`2;5FA40`1V^040j?1@~2Pl@<jI<0 +~2RdD@IX=hHP8?QHD0~2RdD@PgQTo`n<5@0008]548=hI?l?S`P0~2jCL0~2SD00RdD@og1T^XP> +0`2QI4@308?\2>SlE@00^GQ40`2;5FA40`1V^0@0j8a@~2j4MB~2Pl@<RdD@og1T^[0>0`2QI4@3 +08?\2>S8E@00^GQ40`2;5FA40`1V^040j5Q@~2Pl@<Pl@<bL=ERnb3k1B9A@R9E@b9CA2;A@b2 +N0D13hAD~3PSeLA0<00@n5;@000;[H3P<0XK0Z0`3X15<00;[P3P<0XK0Z0`3XmE800;X=3`<0 +XK0Z0`3XiU800;UhA0<0^Q0?0`1V^040j>M?~2jOD0~2Rl2;A@R2N5P1MC>;A@c6@0D0^GQ40`2j +@0l306Jh0P3X_Dl00;UhA0<0^W@?0`1V^040j:Y?~2jKP0~2o<M5o?oooon=AOa@^Z@?0`2;A@b; +@0R3k0SXCUD008?438U5n8=mn05e2X=mo01n1>\WRl2;A@coL0RjZ0l30:5TA0<0Pn`8j;AD~2 +XFA40`3XQPD008?438=mo0Am8FX4^\`?0`2QI4@308?\2>R=E000XFA40`3XG`D008?438]=o<7Q +2X]548T8ogGl^_0?0`2QI4@308?\2>QPE000^GQ40`2;5FA40`1V^040j?1>~2Pl@<Pl@<bL=E +Rnb3k1B9A@R9E@b9CA2;A@SX]AP008U5o85mo040080?Q140~2RdD@RdglRDQ\jDD0~2SD00RdD@ +PWQH0GD?RdD@ad1\0@00P>TZ~3RdD<PGQ\0@00P7@DRdD<RdQ\RdD@RDQ\j@d0~2SD00RdD@ad1\ +0@00P8]5485hK040081d4X]548]0K>Pc=@00RDGhj`V;`<M5n4@@0`3oMORj71030:5TA0<0Pn`8 +j91C~2^GQ40`2;5FA40`1V^040j21>~2Pl@<Pl@<bL=ERnb3k4AVRDD8RED<RDd@RdD@RDG8RDG< +IX\8IT6;ALaVR@R;ALQVPcQS3hh`~3JV>jE1030:5TA0<0Pn`8j2mC~2^GQ40`2;5FA40`1V^0@0 +j;m=~2j7Y?~2Pl@<SDgH^P00~2^7T@0`3X0@H008eEf:4PA0<0j?AB~2XB140`3XTVl008U5e;Tl +C0<0RaDPA0<0RdGDj:a?~2RdGD@0<5>4D30:<hA@<0RdD@3kl0D6R940<0^W`@0`2Q84@308?\ +2>RWDP00XB140`3XAFl008U5d;TlC0<0RaDPA0<0RdG@j5m?~2RdG@@0<5>4D30:<hA@<0RdD< +j60B~2ocDhA@<0RdD@3kl0B52jS1030:5TA0<0Pn`8j51B~2^GQ40`2;5FA40`1V^040j>1<~2 +RdD@3kl0D;Zd40<0SDGhPn`8j2EB~2ReD<SDGhj0Xo~2ReD<IX]52>PZ?@00RlR3a2b;A@b9B5B; +A@b3N5@03hDa~3ogD<^[`@0`2QI4@308?\2>SQD@00^GQ40`2;5FA40`1V^0@0j75<~2j2a>~2 +Pl@<Pl@<bL=ERnb3k3bQ44P30?O@Xa180`2=CN2j~4^=\@0`3XW0@008eEh:4PA0<0j8mA~2XB14 +0`3X;Fh008U5g;TlC0<0RaDPA0<0RdGLj4M>~2RdGL@0<5>4D30:<hA@<0ocF000<0J>8@0`2j +g1030:4PA0<0Pn`8j4=A~2XB140`3XhFd008U5f;TlC0<0RaDPA0<0RdGHj?]=~2RdGH@0<5>4D3 +0:<hA@<0ocD<B0<0ocE400<0J?8@0`2jj1030:4PA0<0Pn`8j?5@~2XB140`3XSfd008U5e;Tl +C0<0RaDPA0<0RdGDj:U=~2RdGD@0<5>4D30:<hA@<0ocD@B0<0ocEX00<0J0@A0`2jn1030:4P +A0<0Pn`8j9m@~2XB140`3X?Fd008U5d;TlC0<0RaDPA0<0RdG@j5M=~2RdG@@0<5>4D30:<hA@<0 +XCQ50`031Ja<0`2S[4`30?le>4D300no1AA80`1@^PPA0`2QI4@308?\2>Q0D000^GQ40`2;5FA4 +0`1V^040j=1:~2PlA8XJPZ0`0i1O170`0?Q0X0~2^9a70`3XoPl00:6\:P<0>@F@C0<0M0Zh?4`3 +0>SW3`00ocD@B0<0^S0A0`2QI4@308?\2>SOC`00^GQ40`2;5FA40`1V^040j6m:~2ocD<B0<0 +^U`A0`2QI4@308?\2>RcC`00^GQ40`2;5FA40`1V^040j4=:~2ocF\C0<0^X@A0`2QI4@308?\ +2>R7C`00^GQ40`2;5FA40`1V^040j1M:~23kl554P3052j[1430:5TA0<0Pn`8j5U?~2^GQ40`2; +5FA40`1V^040j>U9~2Pl@`XK0Z0`0i1La40`1d2[QhA0<0j1\?~2Pl@<bL>;`5F;k8?\28U526PH +4P<0J00B0`1Xm1430;[D4@<0XK0Z0`23k0SXRT`00?me2;XT4P<0XK0Z0`23k0SXMD`00;Xd4P<0 +XK0Z0`3XIT`00;Y`4P<0XK0Z0`3XEd`00?le<04306RF4P<0^X`B0`2Q\2X308?\2>PjC000J;PB +0`3o=C`10`1X\a830;ZL4P<0XK0Z0`23k0SX64`006P54`<0J0@C0`3o=A000`1X0Q<306P14`<0 +J00C0`1Xo1830?leB04306Sg4P<0^[`B0`2Q\2X308?\2>SGB`00J2@C0`3o=JP10`1X7a<30;X8 +4`<0XK0Z0`23k0SX]D\00?leE04306Pb4`<0^RPC0`2Q\2X308?\2>RHB`00J5@C0`3o=F010`1X +DA<30;Xh4`<0XK0Z0`23k0SXMT\006RD4`<0ocE\0@<0J8lC0`2jF1<30:6`:P<0Pn`8j5A;~2 +ocEh0@<0J:8C0`2jV1<30:6`:P<0Pn`8j3M;~2J<0C0`3o=H@10`1X^a<30;ZX4`<0XK0Z0`23 +k0SX5D\006SL4`<0ocFd0@<0J=PC0`2ja1<30:6`:P<0Pn`8j?=:~2J?PC0`3o=I010`1Xm1<3 +0;[P4`<0XK0Z0`23k0SXdDX00874204006PH50<0ocFL0@<0J1@D0`2jo1<30:6`:P<0Pn`8j:U: +~2I\L5UDL300@0j6m9~2Pl@DPl@8bL>=@01ERnb3k3ACEh?\38U528UE38U=4;T3~3^Q`D0`2; +AA3XVVH008]54>QjJ@00RDGXRdGXRDG<@8U5j8]538?P?hZ@\4<308]548]=c8PD2<M5k000~2 +o8]533]5k0n6004008]=28]Ek3?0RP@A`OP2RDGlRdD8ReG\<lV:C101`NT4Pn4?ReD8Reg\<l2: +11[1h0B3h30;`HU5n8]528]Ek3?9RT`@0\7Y1X?Q0h]E28]Mk3?0RT@J0L7P0X?P?0_1RDGdRdd8 +ReG\<l2:A142Pn0oRDG`RdGXRDG@@8U5j8]5o8?P?hZ@\4<308]548]=d8PD28]5j8U5e429ANR; +AOR3h3n:T;130`2;AA2;CMB850R;ANR9AMQ0RDGXRdGdPn0oRY2`@`<0RdD@RdgHR1@8RdGXRDGL +@8U5j8]5l8?P?hZ@\4<308]548]=g8PD28]5k8?00hU5k>Wfo_ooRl2;AA2;GNS611P0RdD@RDGP +^`80~2_alD0`23k0cX8VP008_GRl^;f8?418]5h0?3Pnchj2AU~2RdD@RDGT^`80~2_b4D0`23 +k0cXm6L008_GRl^;f8?418]5i0?3Pnchj?IT~2RdD@j=IW~2j`23a0aOFlW3o5F;k8?\J6J9A@QX +?4`300no1AA80`1@^R@D0`2QI4@308?\2>SkBP00^GQ40`2;5FA40`1V^040j8]5~2ocD<B0<0 +3kl554P3052jC1@30:5TA0<0Pn`8j<M:~2^GQ40`2;5FA40`1V^040j5M5~2Pl@PI\M5oP00Rl0? +_dGnPcb5i043~23hAN~33km5o_ldQN@10`2jM1@30:4PA0<0Pn`8j7U:~2XB140`3X5fL008U5 +n;TlC0<0RaDPA0<0RdGhj357~2Pl@<RdGh@0<5>4D30:<hA@<0IX]5oVI0IXU5o^^CSD00J9@D +0`2jN1@30:4PA0<0Pn`8j25:~2XB140`3X_fH008U5m;TlC0<0RaDPA0<0RdGdj=U6~2RdGd@0<5 +>4D30:<hA@<0J=@D0`1X_1@30;ZP50<0XB140`23k0SXeTT00:4PA0<0j7AV~2RDG`^Ca<0`2; +5B140`2;AO3XSTH008]5l4031CQ50`2S>4D30;[P50<0XB140`3XV4T00:4PA0<0j3IV~2RDG\ +^Ca<0`2;5B140`2;ANcXD4H008?478]5k4031CQ50`2S>4D306J3O@P13hGW1000JP3o=G@00`1X +kA@30;[T50<0XB140`23k0SX?4T00:4PA0<0j=YU~2RDGX^Ca<0`2;5B140`2;ANSXm4D008]5 +j4031CQ50`2S>4D306Sl50<0ocFT00<0J?TD0`2jl1@30:4PA0<0Pn`8j>]8~2XB140`3XRFD0 +08U5i;TlC0<0RaDPA0<0RdGTj:=5~2Pl@XRdGT@0<5>4D30:<hA@<0PSfQ0@<00@n5[0000?le +@4D30?leD00306P=5@<0^P@E0`2Q84@308?\2>R9B000XB140`3X9fD008U5h;TlC0<0RaDPA0<0 +RdGPj455~2RdGP@0<5>4D30:<hA@<0J3`E0`3o=E`00`1X>AD30;X@5@<0XB140`23k0SX>4P0 +0:4PA0<0j=IT~2RDGL^Ca<0`2;5B140`2;AMcXl4@008?4:8]5g4031CQ50`2S>4D30>UE~3o6Q@ +5@<0ocE@00<0J4dE0`2jA1D30:4PA0<0Pn`8j=i7~2XB140`3XO6@008U5f;TlC0<0RaDPA0<0 +RdGHj9I4~2Pl@DRdGH@0<5>4D30:<hA@<03kl5o4L30?ldQ@000`3o=IP00`1XHAD30;YH5@<0 +XB140`23k0SXPDL00:4PA0<0j1mT~2RDGD^Ca<0`2;5B140`2;AMCX>D@008]5e4031CQ50`2S +>4D300no1Oi70`3o=8D<00<0ocF<00<0J6dE0`2jI1D30:4PA0<0Pn`8j2M7~2XB140`3XaF<0 +08U5d;TlC0<0RaDPA0<0RdG@j=m3~2Pl@XRdG@@0<5>4D30:<hA@<0Pcd0B0<0o`n4a@0008<m +14P30?l?Q6<0~2ocD4B0<0ocD0B0<0ocF`00<0J7hE0`2jL1D30:4PA0<0Pn`8j;96~2XB140`3X +D6<008U5c;TlC0<0RaDPA0<0RdG<j6Y3~2Pl@HRdG<@0<5>4D30:<hA@<0jEP0~2SD00ocD0B0<0 +ocF`00<0J8hE0`2jQ1D30:4PA0<0Pn`8j5E6~2XB140`3Xlf8008U5b;TlC0<0RaDPA0<0RdG8 +j0e3~2Pl@DRdG8@0<5>4D30:<hA@<0PCd8B0<00@00P0n4H0000:48B0<0Pn`4j8HW~2Pl@4D?le +h00306RM5@<0^Y@E0`2Q84@308?\2>SUA@00XB140`3XPf8008U5a;TlC0<0RaDPA0<0RdG4j9e2 +~2Pl@DRdG4@0<5>4D30:<hA@<0ocGD00<0J:HE0`2jX1D30:4PA0<0Pn`8j9I5~2XB140`3X=680 +08U5`;TlC0<0RaDPA0<0RdG0j4i2~2RdG0@0<5>4D30:<hA@<0J;130`1X]AD30;Z\5@<0XB14 +0`23k0SXBdD00:4PA0<0j>UQ~2RDFl^Ca<0`2;5B140`2;AKcX0d8008]5_4031CQ50`2S>4D3 +06S@@`<0J<4E0`2j^1D30:4PA0<0Pn`8j015~2XB140`3XWV4008U5^;TlC0<0RaDPA0<0RdFh +j;Q1~2RdFh@0<5>4D30:<hA@<0ocFlC0<0ocDh00<0J<dE0`2ja1D30:4PA0<0Pn`8j:i4~2XB14 +0`3XC64008U5];TlC0<0RaDPA0<0RdFdj6I1~2PlA4RdFd@0<5>4D30:<hA@<0jD81~2SD00ocGD +00<0J=HE0`2jd1D30:4PA0<0Pn`8j5M4~2XB140`3XmF0008U5\;TlC0<0RaDPA0<0RdF`j0m1 +~2RdF`@0<5>4D30:<hA@<0J;130`1XiAD30;[L5@<0XB140`23k0SX34@00:4PA0<0j:YP~2RDF\ +^Ca<0`2;5B140`2;AJcXa40008]5[4031CQ50`2S>4D306S@@`<0J?4E0`2jj1D30:4PA0<0Pn`8 +j<53~2XB140`3XGf0008U5Z;TlC0<0RaDPA0<0RdFXj7U0~2RdFX@0<5>4D30:<hA@<0ocFlC0<0 +3kl554P3053o=K`00`1X01H30;[d5@<0XB140`23k0SXId<00:4PA0<0j0EP~2RDFT^Ca<0`2; +5B140`2;AJCX7d0008?4B8]5Y4031CQ50`2S>4D308?43<W3EH_\Pn`<RDD8RED<I\L5UDL30040 +aPELA0<00<M5o00@~2RdGlj;EJ~2XfA40`23?FA40`003hD[~3ogGlJ2`F0`2j11H30:6`:P<0 +Pn`8j6U0~2I\L5UDL300@0j2lo~2Pl@@PSeLA0<00GDl^TPF0`2Q\2X30>Q0@000J7`F0`2;AOa@ +^U0F0`2Q\2X308?\2>PU@000^XHF0`2Q\2X30>PF@000Pl@@^XPF0`2h00P00>SP~3XjA30`2j +U1H30;P02000j<`0~2Xb140`1Xf04306S<0@<0J3010`1XY1H30;VP5P<0ReD<RdD8Pn`<j4`d +~2Pl@LPSeI0@<00GD:^:PF0`3Xn_;ooh8m=@43005e<lH5G4@30062?FD10`013iC0Pn01Pl3o +6l102l0?Q140~2aPEU0@<00LL5J043~5PSgA0@<00@nD`8?P0H?0oa_0@0_0M0Zh^1H30>RMl_oo +j33JoooXXmKoonSbkoooj14n~2^000~2j`Z;`;P0~3j`7lPl@8bL<0~2EH_\Pn`DRDD8RED<RdD8 +RDGlRdGlj2YI~2RDGhPggh07DmogD<RdGlD;X@5`<0XFA40`23k0SXF4400;UhA0<0RaETA0<0 +I[P40>SX>`00j:<m~2Pl@@jDX0~2SD00PSeLA0<00@n5>P000;Xl5`<0XK0Z0`3XZ3h00?me38]5 +o52jA1L30:6`:P<0Pn`8j8ln~2^WTG0`2Q\2X30>R0?P00Pl@@RdGhj`23a0c9`he005F;k8?\ +58U528UE38U=48]54<I0102;AA37@0P0~3^W`G0`2h0@800>PMooooRDGlogGl^Y0G0`2;A@b3 +k0SX1d4008?438U5n8=mn04?QC<0~2ogGl^Y`G0`2QI4@308?\2>Qf@000^GQ40`2;5FA40`1V +^040j0Hk~2Pl@<jC\0~2Rl2;AA3o<;[05`<0XFA40`23k0SX@D000;UhA0<0RaETA0<0I[P30>SA +>P00ReD<RdD8j;hL~2Pl@<RdGlj7=D~2Pl@<bL>;`5F;k8?\48U528]528=hE00?Q4T0~2RdD8 +Rd1Dj2M6~2RDGlPggl00n4<@000?me2;[T5`<0XFA40`23k0SXcCl00;UhA0<0RaETA0<0I[P3 +0>QM>P00j9`Y~2Pl@<Pl@<bL=ERnb3k0b9A@R9E@b;A@R2N0D13hA3~3PSeLA0<00@n5;@000;[l +5`<0XK0Z0`3X1cd00;X460<0XK0Z0`3Xn3`00;Xj60<0XK0Z0`3XjC`006JhoooY:04006X0I[T1 +08]528]@28]538?\3>Rm1P00Pl@@IXU5oPnoAOkYV@000?b;A@`?_dgnocB8^S`H0`2QI4@308?\ +2>P<?`00XFA40`3Xg^oooh?43>V6~3Rl3YO`0008e008]530noCOko=8RjL1P30:5TA0<0Pn`8 +j=@n~2XFA40`3XY^oooh?43>U>~3Rl3[BX_0RdD8og08^Z@H0`2QI4@308?\2>RT?P00XFA40`3X +M^oooh?43>TN~3Rl23n08?Q5oooon3n05dRX?h0gB=2l1d^N^kSD00PSeLA0<00GDm^[PH0`2Q +\2X30>S\>`00RdD<3km=o_ldR;[060<0XK0Z0`23k0SXd3\00;[`60<0XK0Z0`3X`C\008?436J; +AOk[08?42<W3SD00EH_\Pn`<RDD8RED<RdD8PWP50@n4@`00088mG4@3004?QBd0~2^_@H0`2Q +\2X30>Qk>`00^_`H0`2Q\2X30>Q\>`00^RhI0`2Q\2X30>QM>`00I[SoonV\~3JP1V^@40RdD8 +Re08RdD<Pn`<j345~2Pl@@IXU5oPnoAOk[<>\jRl2;A@SoL0Rj<1T30:5TA0<0Pn`8j8@m~2XFA4 +0`3XE^kooh?43>T>~3Rl0;`7C<PoP1M<O[bOb2?Ea40`01MCfjA1T30:6`:P<0j=`j~2RdD<3km= +o_ldR;Y<6@<0XK0Z0`23k0SX`3X00;Yh6@<0XK0Z0`3X\CX008?436J;AOk[08?42<W3SD00EH_\ +Pn`@RDD8RED<RdD8PWP50@n4A`00088mG4@3004?QBd0~2^W`I0`2Q\2X30>Q[>P00^X@I0`2Q +\2X30>QL>P00^\4I0`2Q\2X30>Q=>P00^?oooooY<`4008e00<M5o?oooon=AOa@^\@I0`2;A@R; +@0R3k0SXoS`008?438U5n8=mn05d9H]52?m`2;[86@<0XFA40`23k0SXKS`00:5TA0<0j43]oon3 +a0b;A@aVPgQR0gE7Pgglo`n<4@0008=mo?l?S`L0~2jBP0~2Rl3oMOaZof[o^_0I0`2QI4@308?\ +2>PS?000XFA40`3XmNcooh?45>U;~3o8]536J3N682MD23OOco3h`@~3Pgglo`n?1P000>TW~3 +o?meo6[oJ_nj:1X30:5TA0<0Pn`8j=<k~2XFA40`3XYNcooh?4588mG4@3005e=[YP6P<0XK0Z +0`3X?ST00?meo;YX6P<0XK0Z0`23k0SX:CT00;ZX6P<0XK0Z0`3X6ST008?438]5o>\2Rl23a0S9 +`he005F;k8?\38U528]5289h1@4?Q4H0~2PSeLA0<00@n5;@000;Z\6P<0XK0Z0`3XeSP00;Zd +6P<0XK0Z0`3XacP00;[`6P<0XK0Z0`3X^3P00;P1~2P>Ub~3Rl2;A@R3N0P0M0n;A@R;@0R2>01d +1>\BRl2=AOcXC5P00>U3~3SD00RdD8Rd08j<D8~2RDGlPGgl0@00P0n59@0008]52?m`2;[d6P<0 +XFA40`23k0SX`CX00:5TA0<0j9?[oon3a0b;AOc[0he008?42<W3SD00EH_\Pn`8Dh?\38U528UE +38U=48=m300?Q1<0~2RdD<PSP03h@7~3j@h0~2Rl1V^?oojEL1~2SD00I\M5n_ooI\M5n000RdD@ +3km=n6_938<l200?Q=00~2RdD@3km=n6_938\42>SNEP00RDGlRdglReD<RdD@3kmMn6_K38\4 +6>QC6@002l0?QH\0~2PSeLA0<00@n5@0000;XL6`<0XK0Z0`3XQcL008]540noCOQ[b@co=0Rj +91\30:6`:P<0Pn`8j6Pg~2^TlK0`2Q\2X30>QI=`00Pl@<IX=mnP1m3fJ;AOQVRDGjjBX0~2Rl2i +N4@30;YD6`<0I[P30>Q1=000ReD<RdD8j2hF~2I[SoonUe~3o6J;AOQV@6J9AOSY7OooooaVPggj +07eAPSeLA0<00@n5=P000;Y`6`<0XK0Z0`3XiCH00?me3;Yh6`<0XK0Z0`23k0SXd3H00;Z[6`<0 +XK0Z0`3X`CH008?436Jhooo[5>T?~3SD00IX]5n^T3~3SD00Pl@<FlW3Rl1ERnb3k0QVRDD8RED< +RDd@I\M5oP00Rl1VRdD8IS]5oPn6IP0003?0IX]5oXU5n6K7AO`008e006J;AOaVPoP8LbkfAOP1 +3h@@~3RdGhdNPcA@b9AOSY200008]5n=7XRDGhIX]5o6I0IXU5o>_8RdD@<lUVRdgnReGhRAB8 +IX]5oVI0IXU5o^^=o<W3Rl1ERnb3k0aCPn`<RDD8RED<IXU=48=m300?Q180~2RdD<PSP03h@6 +~3j@d0~2o6Jho_oYj`0008e008]53>SPE000RDGhI\M5m_ooI\M5oP00o8]520noCOj3?8P03hBg +~3IX=m400?QA80~2RdD83km=oX\4R>RUE000RDGhIX=m501e@h]=n8]E38]520noGOj;19SX5QL0 +00_03hDP~3IX=mm_l?Q@l0~2IX]5oVJ9AOKY200008_0I\M5m_kojCl0~2o8]=n8]E38]520no +GOj;19SXAaH000_03hDQ~3IX=mm_l?QA00~2IX]5oVJ9AOKY2@0008e006K7AOKnofJ;AOiV@6J9 +AOkY>oooohe006J;AOK[0X_0Pl@<FlW3Rl1ERnb3k1b9A@R2?Ea40`013hE5~3^[0K0`2Q\2X3 +0>Rk=000RdD8og0<RdD8og0@RdD8og0D^[PK0`2Q\2X308?\2>RG=000^^8K0`2Q\2X30>R8=000 +Pl@DPSeLA0<00GE4^^@K0`2Q\2X30>Q]=000RdD8oc2;A@SoL0B;A@SoL0Rjk1\30:6`:P<0Pn`8 +j4Xd~2^QHL0`2Q\2X30>Pk=000Pl@DRdD8PgPDAWd;^000~2jLT1~2o<M5o000~2adGd\PL008_0 +RdD8Rd0D1F`7~2>dGd3hid~3RdGl1Fd1~2RDGlRdGdVC?2:l:3h0<c`R_22l0?QDH0~2RdGd^F@0 +~2VOOi2m8?QAl0~2RdGd^I01~2VOOi2m8?Q0`0~2adG`~4j@L0~2adG`0@0008=ml05e1h]5o429 +AOb;AOA0RDGdjGSoooo7AO@0~3o8]528]=m3U840n>W@0008]=m8]5o0<4SN0F0`29AOb3OO@1 +3hEg~3RdD8Rd0D1F`7~2VC?2:l:3h0<c`R_22l0?QEP0~2RdD8Rd0D1F`7~2^F@0~2VOOi2m8? +QBT0~2RdD8Rd0D1F`7~2^I01~2VOOi2m8?Q0h0~2adG\~4j@T0~2Rl37AN`1~3Pgg\0GD7RdGl +@8U5o8]5m429AOCYE?oooh]528]034P3AOb9AOb;A@R;@0QY`10>~2RdglJLV0D@400lR;A@R; +@0A[`3`3`H]=20<1RDGhPSeLA0<00GDf^QPL0`2Q\2X30>R9<P00ogGh^R0L0`2Q\2X308?\2>Qd +<P00^TLL0`2Q\2X30>QU<P00Pl@<RdGhj`7lPl@8bL>=@01ERnb3k0b9A@R9E@aVRDd@RdDDad1D +~4RdDDI\M0H040RdDDI\M0HP40RdDDad1Toooooh]55<M0J?oooon;A@R2N0D13h@o~3PSeLA0<0 +0@n5;@000;Y<70<0XK0Z0`3Xjc400;YD70<0XK0Z0`3Xg3400;Z>70<0XK0Z0`3XcC400>UB0@00 +RdD8PgP800n4N`0008]528]@28]55>QUD000RddD^Y0L0`2;A@cXHAT0088mG4@3004?QCH0~2 +^Y@L0`2Q\2X30>R1<@00ogDD^Y`L0`2Q\2X308?\2>Q\<@00^\4L0`2Q\2X30>QM<@00Pl@<ReDD +IX]54>SJ7P00RlR;AAB9B5CY9P000?bi1`000;[470<0RdDDj5i=~2RdDDR`f`:P<0RDQDRdDD +aT1H0H]558=hE01e<Ome5;[<70<0XFA40`23k0SXKC<00;UhA0<0RaETA0<0I[P40>Sm;@00j;P_ +~2Pl@<RdDDPWQH0G@@RdDDj7`P~22\1d1>]DRl22?Ea40`013hDf~3^^PL0`2Q\2X30>R\<000 +ogDD^_0L0`2Q\2X308?\2>RG<000^QXM0`2Q\2X30>R8<000Pl@<RdDDaT1H0H]55>R::P00Pl@< +bL?lEH_\Pn`DRDD8RED<RDd@RdD@aT0408]54<M02000~2^Q`M0`2h0@800>PMlOooRDGlogGl +^R@M0`2;A@b3k0SX1c<008?438U5n8=mn04?QAl0~2RdGlj=<F~2RlR;AA29B0R;AA36@0@1jC`0 +~2SD00RdD@oc2j;1d30:5TA0<0Pn`8j5Db~2^GQ40`2;5FA40`1V^0<0j>D\~2ReD<RdD8j=8> +~2Pl@<RdGlj8M6~2Pl@<bL>;`5F;k8?\>8U52<M5n0400823O@P03h@B~3RdD8PSP03h@6~3j@d0 +~2o;P1~2P>T>0`00Rl22?Ea40`01MCJjD1d30:6`:P<0j6@_~2ogD8^UPM0`2Q\2X308?\2>Q? +;`00^XPM0`2Q\2X30>Q0;`00Pl@<adGX\PL00<M5i040~2adGP0@000<M5g000~2adGH~4adGD +~4SDGDD8e5f52=AMa@SDGPD8e5i52=ANQ@^X`M0`2;A@R3k0SXac4008?488U5o8=mo05l2h=m +o0Io1N\kSD00ogD8^Z`M0`2QI4@308?\2>P_<@00^GQ40`2;5FA40`1V^0<0j;l[~2Pl@<^040 +083Y;P8008_0PGgX\PL007`;PGgXm@L007l2jcSoMNRjd1d30:5TA0<0Pn`8j><`~2^GQ40`2; +5FA40`1V^0<0j7<[~2Pl@<^040083YhP4008_0RdGX;F`7~2RDGXPggT0G`;PggT37l5jc^=@03o +MNBj21h30:5TA0<0Pn`8j8l`~2^GQ40`2;5FA40`1V^0<0j1l[~2Pl@<^040083YSP4008_0RdGT +B8U5i8=mh05l2h=mh1mo1N\kSD00ogGP^SPN0`2QI4@308?\2>Po<000^GQ40`2;5FA40`1V^0<0 +j<lZ~2Pl@<^040083Y?P4008_0PggL07`:PggL5gl4jcZ;`?meg;YX7P<0XFA40`23k0SXmbl0 +0;UhA0<0RaETA0<0I[P30>R7:P00Pl@<^040083YmP0008_0PggH07`:PggH>gl4jcZ;`?mef;ZH +7P<0XFA40`23k0SX[bl00;UhA0<0RaETA0<0I[P30>Po:P00Pl@<^040083Y[P0008_0PggD07`: +PggD>gl4jcZ;`?mee;[<7P<0XFA40`23k0SXIbl00;UhA0<0RaETA0<0I[P30>Sg:@00Pl@<^040 +083YIP0008_0adG\~4adG`~4adGd~4SDGDj=Ogoon9AOR2?Ea40`01MCJj01l30:6`:P<0j9`\ +~2ogGh^PPO0`2Q\2X308?\2>R7;000^RlO0`2Q\2X30>Qh;000Pl@<RdGhj`23a0c9`he005F; +k8?\;8U528UE36J9CA36AN<1^S@O0`2h01000>PQkOooRDGTRdD8RDGladG`~4o8]5o88h07@L +R`gl@`<0RdGl<m::43?0IX\4DOK027@4j`J;`>\>Rl2;AOa0RDGljln=@02;AOb2>01e4>UK0@00 +SD00j@T0~2SD00RdGlRDGXRl2;AOb2>01d98\=o4<308]5o3?BRQ0c`6J;1563h0R3`?lK`40; +`7@4j`J;`>\>Rl2;AOa0RDGljlN=@02;AOb9AOB;AO@[ANQ0RDG\Rdg\ReGXRdGTj0Y;~2RdGT +Rdg\aP@808]538]=l8e4B0Q@^T0O0`2;ANB3k0SX?Bh008?438U5n8=mn05d=Omei8]5l41@^T@O +0`2QI4@308?\2>R[;@00^GQ40`2;5FA40`1V^0<0j3\X~2Pl@@aTGS08]538]=l6J3O4P8og`B +RdD<Rdg`IX5lB0So07l3jcolRdG`@52;A@b;CO0?_dA8252jN1l30:5TA0<0Pn`8j4d]~2^GQ4 +0`2;5FA40`1V^0<0j=dW~2Pl@@aTGS08]538]=l6J3O4P8ogD?RdD<Rdg`IX]E46J9E4P8RdG` +@8U5l>UUo_ooo89mh`5e>H5ml001~2M33oMO2j[1l30:5TA0<0Pn`8j>@\~2^GQ40`2;5FA40`1V +^0<0j7@W~2Pl@<aTGS08]5i>PM@@00RTGSj`23a0c9`he005F;k8?\98U526J9E@b9CA2jg1l3 +0;P10P00j07[oon9AOb;A@QVad1P0@2;A@QVad1R0@2;A@S7@6CoooooRdD8ad1Xoooooh]52<M0 +G000~2RdD8j8XF~2RlR;A@R9B5B;A@R3N5@03hDa~3ogD8^^@O0`2QI4@308?\2>P`;000^GQ4 +0`2;5FA40`1V^0<0j<0V~2j7\X~2Pl@<RdD@aP00aTGc0H_0RdD@j:Q8~2RDGdRdD8RDGXRdQL +@H]5j8U8G8]=28]Eo;P00P00j24M~2RDG\Pgg\00n=B00008]528]0E?I0204?Q0P0~2jLl0~2 +SD00^GQ40`2j320306Jh0`3XBBH00;X0~3RdD8j3@8~2j7\E~2aTGc0>VN~3Rl2;AOc6P?l1~3 +^PX0~2RdGlj;d8~2RDGhPggh07@6RdGhaP00RdGlj098~2RlR;AO@3`HU5m0noA@`kAOAl4h]E +o8]54>P<A`00jD<0~2SD00ogGd^S0P0`2QI4@308?\2>PO:`00^GQ40`2;5FA40`1V^0<0j:lU +~2ReGlRdD8j9`7~2Pl@<aTGc0>T8~3jNOnoon=@00?_dD<>dGdOS3oMOBjH2030:5TA0<0Pn`8 +j<hZ~2^GQ40`2;5FA40`1V^0<0j5hU~2Pl@<aTGc08]52>RKj_ooRdGlj?ln~2RTGcj`:;`8?4 +3<W3SD00EH_\PN`d0P00RDD8RED<RDd@RdD<I\M0H040RdD<I\M0HP40RdD<ad1Toooooh]53<M0 +J?oooon;A@c7@5`0~3RdD<j7XD~2RlR;A@b9B5B;A@b3N5@03hDa~3ogD<^Y@P0`2QI4@308?\ +2>PP:P00^GQ40`2;5FA40`1V^0@0j;0T~2j6\V~2Pl@<^[PP0`2h01000>QQj?ooRHGLoOooRhGL +oOooaP00aXGUoOoo0He008:miOgoo`4?QF\3~2RhGLoOooj6a6~2RHGdoOooRdD<RHGHoOooRdQL +@H^5f?goohU8G8]=38fEo?gookP00P00j=TJ~2RHGhoOooPkghoOoo00n=BP0008]538]0E?I0 +204?Q0H0~2j@T3~2o;UhA0<0^\@P0`1V^0<0j?dS~2^P00~2RdD<j>P5~2j2lC~2aXGUoOoo0>W? +0P00SD00aTGj2\I5n`2j8`0008f5o?goonQ\1P00RHG`oOooPkg`oOoo07@ORhG`oOooaP0:RhG` +oOoo@8V5l?gooh^5l?goolH00;X:~3SHGloOooj2h6~2RHG\oOooPkg\oOoo07@9RhG\oOooaP0P +SHGloOooj6M5~2RlR;QOCmool3`HV5m?gooh]5289h105e6X]5289h705e4H]5289h405e2>T[ +0@00SD00Rdd8SIGloOooRdD<j=O]oomVRHGVoOoo3kn5i_goonWD~3jOL0~2SD00RdD83kn=i_go +of_9389l20@1MEB;A@P?_hgVoOooJlT<oc@8^^@P0`2QI4@308?\2>PZ:000^GQ40`2;5FA40`1V +^0<0j;XR~2SIGloOooRdD<j:@4~2Pl@<aXGUoOoo0>TN~3o8]=20noQNKmoom[`0`3b8fEo?go +oh]53>Skm?oojFX0~2Rl1X<2430;X@8@<0XFA40`23k0SX_BL00;UhA0<0RaETA0<0I[P40>Q= +8P00j0PT~2Pl@<jc>=@03Y:`0008e008?ho`n48oooo`_03h@SooooPoP23h@JooooPoP13h@A +ooooji^=@03Yn`0008e008f5h_gooe2j?24308]528]088?\2>Rf9`00Pl@<RHGXoOooPkgXoOoo +0GDHIX>mh_goo`1l3VJ1_N;moooo07l3jdGlRdD8og0PRdD8og0H^T0Q0`2QI4@308?\2>P29`00 +^GQ40`2;5FA40`1V^0<0j98Q~2Pl@@aXGUoOoo0>Uk~3SD00PKgdoOoo010007lHSIGloOooRhGL +oOooj8m2~2jDh0~2Rl3o]OCmoonjM2430:5TA0<0Pn`8j:0V~2^GQ40`2;5FA40`1V^0<0j30Q +~2SIGloOooRdD<j1X3~2Pl@<aXGUoOoo0>T;~3SD00jH_loon=@02;A@cXC>Kooh]5289h105d +>h]52?l`^Z0Q0`2QI4@308?\2>Pl9P00^GQ40`2;5FA40`1V^0<0j<`P~2Pl@<aXGUoOoo0>V^ +~3o8]5289h705d>h]52?m`6;[<8@<0XFA40`23k0SXmbD00;UhA0<0RaETA0<0I[P30>R78000 +Pl@<aXGUoOoo0>UY~3RdD8PWP@0G@kRdD8og0<^_PQ0`2QI4@308?\2>Rc9@00^GQ40`2;5FA4 +0`1V^0<0j4<P~2Pl@<aXGUoOoo0>TU~3RdD8Rd08j=D9~2RlR;AA2928]528]05>S32@00RlR; +AA29B0B2_NGmool1MA]VRhgRoOooReD@RhGLoOooj7Gfoon8QNGmoon;QMcmoooXV3T006Hc`8Z5 +iOgoon\1o8?43<W3SD00EH_\Pn`4Dh?\36J9A@R9E@aVRDd@I\M5oP00o6J;AA1V>DGnOAZ;AA@? +_dgnI\L4B?ooIX]5oVI0IXU5o^_Mo6K7AOh008_0IX]526HiAOh?SH80~2RdDDReD<3kmMoS?9 +RP`JIX<lB?l?QA`0~2RdDDReD<3kmMoS?9RP`JIX]EoVJ954SY>`0008]M30noCOhc`8X42e2j +92830:5TA0<0Pn`8j7dT~2^GQ40`2;5FA40`1V^0<0j0dO~2j<PP~2Pl@<IX]5oVI0IXU5o^Ub +ooooRl23a0aKbL>;`5F;k8?\48U528UE38U=48]=2;YL8P<0^000~2j7\9~2RdD<a`00~3RdD< +ad04~4Rdd<ReD8RdD@j7;ioomVRDGnIX=moP0?SC40~2ogD8^V0R0`2QI4@308?\2>SR8`00^GQ4 +0`2;5FA40`1V^0@0j78N~2j2dP~2Pl@<ogD8^X`R0`2QI4@308?\2>Ra8`00^GQ40`2;5FA40`1V +^040j44N~2RdD<og04RdD<oc2j]2830:5TA0<0Pn`8j80S~2^GQ40`2;5FA40`1V^040j10N~2 +Pl@LPl@<bL=ERnb3k0b9A@R9E@b3O@`03hAR~3ogD8RdD8og1L^^@R0`2QI4@308?\2>Pc8`00 +^GQ40`2;5FA40`1V^?ooj<<M~2ogD<^P@S0`2QI4@308?\2>P:8`00^GQ40`2;5FA40`1V^?oo +j9XM~2Pl@LjC@0~2Rl3oM@R;A@SoL5bj42<30:5TA0<0Pn`8j=4R~2^GQ40`2;5FA40`1V^?oo +j64M~2Pl@@Pl@<bL?lEH_\Pn`4RDD8RED<adGl~4o8]528]=o88l201d;8]528]=o8YE33PD20n5 +3P0008]528]=o0?1jAD0~2o8]5o429AOc[bhe00;P0~3j`7lbL>;`5F;k8?\55>9A@R9E@c7AO`0 +~3RdD8RdglPS`807DDRdD<RdglPS`807D8jL\0~2SD00R`gl@`<0RdD8Regl<m::51Pc`6J;157f +`40?Q2@0~2XOa30`2;E@R;GO`cbHX<6VJ;Q4P20P003ko0RDG`j@l0~2o8]M28]=o3?0RP@;RDG` +RdG`RDGhRagl@`<0RdD<ReGl<lV:310c`6J;14_f`41d8:7l@`<0Rdd<ReGl<m^:715VRhAH0P80 +00no`8U5k>\>Red<Rdgl<l2:10^9ANb;ANb9AOB;AO@iAOQd38]5n2]5m>TE~3o8]5o429AOcY +6?oookP0~3j`7lFlW3o5F;k8?\15>9A@R9E@b9CA37AO`0~3o8]543U5o7dHRdD8RdglPS`807D@ +RdD<RdglPS`807D4jdJ;`8]E38]Mo8]528]=o8XD6SPD20n4800008]E38]Mo8]528]=o8XD6SPD +20nE`8?P0NTG~3SD00RdGl@8U5o>^KSD00^000~2j`7lFlW3o5F;k8?\55>9A@R9E@b9CA37AO`0 +~3o8]543U5o7dHRdD8RdglPS`807DDRdD<RdglPS`807D8jL\0~2SD00R`gl@`<0RdD8Regl<m:: +51Pc`6J;157f`40?Q2@0~2XOa30`2;E@R;GO`cbHX<6VJ;Q4P20P003ko0RDG`j@l0~2o8]M28]= +o3?0RP@;RDG`RdG`RDGhRagl@`<0RdD<ReGl<lV:310c`6J;14_f`41d8:7l@`<0Rdd<ReGl<m^: +715VRhAH0P8000no`8U5k>\>Red<Rdgl<l2:10^9ANb;ANb9AOB;AO@iAOQd38]5n2]5m>TE~3 +o8]5o429AOcY4?oookP0~3j`7lFlW3o5F;k8?\38U528UE38]52>Q8?000RDGhRdGhB8U5o8_0 +Pggl07`^RdD8RdglRUD<>1@83hD@~3RdD8Rdgl0l7Y5`0008e008]5o4R9AOc[che00;P0~3j`7l +Pl@4bL>=@01ERnb3k129A@R9E@b;A@SXi3\008U5n8]5n4R9AOb;`8=mo01l=X]528]=o3?BRQ@8 +RdD<j6?lool;`0n43`0008]528]=o0?1jAH0~2Rl2;AOa8RDGljlN=@02h~4j`7lPl@8bL>=@01E +Rnb3k0b9A@R9E@c7AO`0~3o8]528]=o88l201d=8]528]=o3?BRQ@8RdD<j?gkool;`0n43@00 +08]528]=o0?1jA@0~2RdGl@8U5o>_3SD00^000~2j`7lPl@8bL>=@01ERnb3k31CEh?\38U5288m +G4@3004?QCH0~2^S0S0`2Q\2X30>SV6`00ogD8^SPS0`2Q\2X308?\2>SA6`00^V8S0`2Q\2X3 +0>S26`00Pl@<Pgd807dcogD8^V@S0`2QI4@308?\2>PD7P00^GQ40`2;5FA40`1V^080j:@H~2 +Pl@<adD8~4adGTP5410<M5g80ch@6;AM`5P54108U5f<M5o;87~2Rl2;AObI<l8[`X?P0c?2:l8; +`0n59P0008]5o;UT~3VOOi2m8?QAH0~2RdGl^I01~2VOOi2m8?Q0<0~2j`glRdGHRDGDj@L0~2 +o8]5g8U5e8]5e3U527`>RdD8:dGDRDD8j@P0~2j@l0~2SD00RdGl@8U5o>^7SD00adGh~4o8]5 +n8\4QN0F0`29AN23OOP13hDm~3RdGlVC?2:l:3h0<c`R_22l0?QBH0~2RdGl^F@0~2VOOi2m8? +QAL0~2RdGl^I01~2VOOi2m8?Q0@0~2j`V;`8]5h429AN2;AN0?[dGT>dD8OaF;CN0?[dgTRdD8 +:l69A@SY2@000?cY3`0008e008]5n429AOSYK?oooh]5n429AOR;A@RImggTRDGdRdGd@8U5m8]5 +29WgONB9E@R;A@Ri40h009WgnHU5l8]52;T@3P00VOOiRED8RdD8^C`0~2VOOiRDG\RdD8^C`0 +~2VOOiRED8RdD8RDGXogGXogG\ogG`ogGdogGhogGl^Y0S0`2h94@308?\2>Ph7000adG@94@3 +0;\5~3_k0S0`2h94@308?\3>S2>000RmN;bh_HPl@4RdG@0l>3k?SXa3D008?4888mG4@3005e +>;Zh8`<0XK0Z0`3XNAT006PTA0<0^\0S0`2Q\2X308?\2>QR6@00^_PS0`2Q\2X30>QC6@00Pl@< +^2A40`3[0Ob3a0aOFlW3o5F;k8?\58U528]52>Q7>000@8U5n8]5n>Q3<`00RDGlPggl00n5=000 +0?me2?men;[l8`<0XFA40`23k0SXKQ\00;UhA0<0RaETA0<0I[P40>Sn5@00j;TG~2Pl@@ReD8 +RdGlj8lg~2RdGlj`:;`8?43<W3SD00EH_\Pn`<RDD8Pgd800n44@0008]5288h00n41@000>T8 +~3RdD8jEP0~2RdD8j:`g~2RDGhRdD8Rdgh0l58RDGlo8]523U5o78LR`gl@`<0RdGl<m::43?0 +IX\4DOK027@4j`J;`>\BRl2;AOc6~2RdGlB8U5o>_9o8]52>\3SD00Pl@4bL<0~2EH_\PnaTRDD8 +RED<RDd@JP2=ANa@SDgdSEFXRdD@Pn`<j?XB~2Pl@DIXU5jS?0IX]5j_K00WDFPgd807@@^@P0 +~2ReD8SDGdj78g~2<l1VRdGZm\04MAJ3O@`0M12i100008]E38e5k>QA=`00ogD@JP2=CNb=EOB= +AJR3k0cXo`P008?458?43<W3SD00EH_\Pna0RDD8ogD8^S@T0`2Q\2X308?\2>R>5`00XK0Z0`3X +a20008?43?bQZ2X308=h6P4?QJ40~2XJPZ0`23N1003h@b~3XJPZ0`29ALb9AM2;B119RdG@RDP@ +R`fX:P<0RdG<Re0@<l2:A14HRDG`jEX0~2SD00XJPZ0`23N0@0M3VQZ2X308U5e8]814V;AMB9 +B0BQZ2X308U5f8\8RDgL@H]5f8T8RdgL<l2:0HU5n8]5n8U5m>\?Rl2QZ2X30>Rb8000RDGdRdGd +RDG`RdG`RDG\j`klXJPZ0`3XUR0008U5k8]5k8U5o8=mo?me7kUhA0<0^T0T0`1V^0<0j;PC~2 +adGlCP000>U0~3R`gl@`<0ReGl<l1VR`AAm\103h@L~3XOa30`2;COaVRhA80P8000no`8U5j>T7 +~3o8]5o8U5j8]5j8U5o8=mo4h?Q1H0~2PgglF@n430000<M5i000~2j@L0~2adGT0@0008=mi00? +U<0Uo`0000_03hFMo_ooPgglFGD;adGP0@000>\9Rl37AN00~3RTGPj`23a0c9`he005F;k87\ +?08008U528]526K7@63ooh]526K7@6;ooh]52<M0I?oooon;A@S7@6SoooooRdD8ad1\0@00P;YO +90<0RdD8j=LV~2RlR;A@R9B5B;A@R3N5@03hDf~3ogD8^V@T0`2QI4@308?\2>Se5`00^GQ40`2; +5FA40`1V^0<0j8DB~2j<@1~2Pl@<jK@1~2RdD8j0P5~22\0?QF@0~2PSeLA0<00@n5=P000;Z8 +90<0XK0Z0`3X>1D00?me2;Z@90<0XK0Z0`23k0SX8aD00;Zi90<0XK0Z0`3X51D008?438]52>QY +eoooRdD8aT1H0H]52<M0E000~2jD<1~2SD00RdD8og1D^@02~2^P40~2SHD0o_ooPn`<j3hX~2 +Pl@@RHGloOooahGdoOoo~4ahGhoOoo~4o8^5o?goodPkQOSmoomfAH^5n?gooh:l1@3nool=3hDQ +~3RhGhoOooP[`50Okoo`X?Q@d0~2RhGdoOoo@8V5m?gooh^5n?good29QOSmooo[[Ob;A@SX^=Ko +oh]52<M0E000~2RhGdoOooJl1@>hGloOooLaV;A@QVad1P~2RdD8I\M0HP40jA@0~2Rl2;A@QV +ad1P0@2;A@QVad1R0@2=UM3moon;A@SXI<\008V5l?gooh>ml?goo`1d>Ome2;Zl90<0XFA40`23 +k0SXD1H00;UhA0<0RaETA0<0I[P30>SP4000j1l0~2Pl@<j@l0~2SD00RdD8RhgXoOooRDQ\Pl@< +bL>=@01ERnb3k0bQl4@308?\1>R9<P00Pl@4D;[P90<0XFA40`23k0SXkaD00;UhA0<0RaETA0<0 +I[SoonQo4000Pl@<Pl@<bL>=@01ERnb3k129A@R;A@P?_d1PjGL0~2SD00^_DT0`2;A@SXHb@0 +08U5o>U[~3SD00^_PT0`2;A@SXBb@008U5o>UC~3SD00RdD83km0H52jo2@30:5TA0<0Pn`8j6hE +~2^GQ40`2;5FA40`1V^0<0j?h?~2Pl@<^000~2jF40~2o>T?~3SD002l1dR8?h0GBKjk7lPggl +07DnogD8^R0U0`2QI4@308?\2>PM5@00^GQ40`2;5FA40`1V^0<0j:d?~2j>cnoon3a0bh~4j@\0 +~2SD00RdGlj`>=@023a0c9`he005F;k8?\46J9A@R9E@aVPgd80@n4\00008]53>R80@002\0? +Q:00~2IX=m208?QEd0~2ogD<^T@U0`2QI4@308?\2>RL5000XFA40`3XM_[ooh?432Go~3Pl3o +6l102l0?Q200~2^GQ40`2jI2D306JhoooX3@l00;P0~3jA\1~2SD00jC\0~2SD00ogD<^WPU0`2Q +I4@308?\2>Po5000^GQ40`2;5FA40`1V^0<0j<l>~2Pl@<^000~2jMX0~2Rl2;A@`?_d1PjG@0 +~2^XTU0`2;A@cX^b8008U5o>U[~3SD00^X`U0`2;A@cXXb8008U5o>UC~3SD00RdD<3km0H52j +T2D30:5TA0<0Pn`8j<HC~2^GQ40`2;5FA40`1V^0<0j5H>~2Pl@<^000~2jF40~2o>T?~3SD00 +2l1dR8?h0GBKjk7lPggl07DnogD<^[@U0`2QI4@308?\2>Qe4`00^GQ40`2;5FA40`1V^0<0j0D> +~2j4Cmoon3a0bh~4j@\0~2SD00RdGlj`>=@023a0c9`he005F;k8?\28U52;X0~3RdD8j0K5~2 +Pl3o6l10j@<0~2SD00Pl@8bL>=@01ERnb3k529A@R9E@b3O@P03hD6~3jBl0~2o6X0JP2=COB= +EK2;A@b3k0cXD`\00?me36X0Rdd8SEGdSDF`Pn`<j:41~2Pl@XbL=ERnb3k0b9A@R;A@R;@5CX +[<D008U5o8]5o>QiaP00RDGhPggh00n540000;01jA40~2o>T;~3SD00\03Y0@000?b3a0C9`he0 +05F;k8?\:8U528]52>Rgm_ooRDGX^Rh0~2RdGXj:?_oon9ANB3ON@03h@R~3^@@0~2ReGTSDG\ +j4h_~2aTG`08]5i<H00>TE~3SD00^@40~2^]LU0`2=ANcXeR\00;T8~3ReGXSDGdj1X_~2aTGl +08e5m8U5i8]5i88h07@XRdGT<m::4;SH9@<0j2o_ool;`0n51P0008]5i<H0Gh]5i429ANC[d8e5 +kHU5i8_0RdGTPSP0M2R;AN@cdXX@^2@V0`3Xmnkoo`_03hD6~3RdGTaP1ORdGT@8U5i>_@SEGd +^4A70`3Xcbd008eEk;Q4A`<0j4X]~2^TA70`2;A@SXPBd000_0M35XA4L30?me2;Y`9P<0XFA4 +0`23k0SXCa400;UhA0<0RaETA0<0I[P20>SO2`00Pl@@^4A70`3[0Ob3a0c9`he005F;k8?\45=G +Pn`<RDD8RED<RDd@^@40~2^Z4V0`2;AASX`RX008=m200?Q880~2RdD8PSP03hAf~3^D00~2ReD8 +RdDHj:P]~2RdD8j7`]~2RDGlRdD8Rdgl<m::E0So^:8V0`3X1nkoohU5n8=mn00?QCP0~2Pggl +@0n3;P0008]568U5l;\2~3_jDV0`23k0cX=2d008_GRl^;f8?418]5l0?3Pnchj3HZ~2Pgd<07@@ +^@P0~2ReD<RdDHj2`]~2Pgd@00n4KP0008]5488h00n4HP0008]5488h;Pn4AP0008]568U5m;\2 +~3_jLV0`23k0cXcR`008_GRl^;f8?418]5m0?3Pnchj=0Y~2^@<0~2ReD@RdDHj<`\~2jA<0~2 +SD00^@@0~2ReD@RdDHj;@\~2Pl@<Ge_9`oaERnb3k129A@QVRED<RDd@ogD8^Z`V0`2Q\2X308?\ +2>Q;3@00XK0Z0`3XPAH008\=Z2X300noE@b;AA3XjaP008?438U5o8=mo00?QAd0~2^GQ40`2j +\2H306Jh103X80X00>QOnOooj=H;~2^PX0~2RdD@j;7\oon9AOb3OO`0M0J;AOc6~2Pl@<bL?l +EH_\Pn`<RDD8RED<RDd@adGl~4Rl2;A@PiAO`?SF00~2RdD@Rd1Dj84F~2RDGhPggho`n5<000 +08]548]0E?I0208?Q0`0~2^?kooooY=P0008_0Pggl07D:^?oooooY90000>\JRl2;A@b;COb; +EOR850R;AOa0RDGljiN=@02;AOc[0he008?41<W3SD00EH_\Pn`@RDD8RED<RDd@RdD@RdQDReD8 +RdD<j>PG~2RDGlRdD<Rdd8BLH42023OO`03hDd~3RdD@Rd1DmT080Pn430000;SnoooojBH0~2 +Rl2;AA2;@5Cf@0P1M0bhooooonT>~3Rl2;A@cXl2X00>\2Rl23a0c9`he005F;k8?\38U528UE +38U=46S`9P<0^]0V0`2QI4@308?\2>PF3P00^GQ40`2;5FA40`1V^0@0j:H8~2j64:~2Pl@<^?ko +oooY~4Pl@<bL>=@01ERnb3k21CEX?\38U528UE38U=4<M5h000~2adGh0@0008_0RdD8>DGh3hgH +0`00RdD<RdghR`B8RDGlRdDHPWP50@n51`000<H5G4@30062?Ea40`01MCJjo2H30:6`:P<0j10; +~2ogGl^P@W0`2Q\2X308?\2>Sk2P00^RlW0`2Q\2X30>S\2P00Pl@<RdGl<m::48]54>RFj_oo +2l0?Q>h2~2^S4W0`2;AOcXBBT000_03hCI0P00PggP00n4200008]5h>Qg8@00RdGl@>QRlOoo +RDGPReDDRdGPj23^oon9ANS7AN@0~3PggX07@=RdGXaP00RdGX@8U5i8]5h>R7:@00RDGdadG` +ooooolM5k000~2Rl2;AAR;CNa[b@b3?0P03hBe~3RdgdReGPRdDHReg\Jm\<R`@Hj=[[ool;`0n5 +RP0008=ml00?SEP0~2RdG\RDG`PSeLA0<00@n5?`000;Xd9`<0XK0Z0`3XoPT008]568]=k6_9 +3?ld2;Xl9`<0XK0Z0`23k0SXh0T00;YX9`<0XK0Z0`3Xd@T008?43>TY~3o8]538]Mn?ldV;Y\ +9`<0XFA40`23k0SX7@`00:5TA0<0j>nloon3a0b;ANa0RDG\jCSooon3OO00OBR;A@b;GOSo=9Rj +R2L30:5TA0<0Pn`8j><;~2XFA40`3X]Kcooh?438=mj00?QG00~2RdDHReg`Jm\<PW`H100?QCP0 +~2RdDHReg`Jm\<oc@HJ<DW0`2jX2L30:5TA0<0Pn`8j9D;~2XFA40`3XIkcooh?44>TR~3SD00 +RdDHReg`Jm\<aT@H1@6;AAR;GO1[f`c7A1P8~4j@01~2RdGTPSP03hD`~3RdD<ReghocBH^\PW +0`2QI4@308?\2>Pe2`00XFA40`3X1kcooh?43>W7~3SD00RdDHReg`Jm\<PW`H105e>8]568]M +l6_K3?ld66PE:0<0^^`W0`2QI4@308?\2>S]2P00XFA40`3X_k_ooh?44>Uo~3SD00RgDHReg` +Jm\<RdGTj1O_oon;b8_6RD`H28]568]Ml6_K3<I460D1PSeLA0<00@n5@0000;XH:0<0XK0Z0`3X +9@P008]568]Ml6_K3?md60Rj82P30:6`:P<0Pn`8j0H8~2^T`X0`2Q\2X30>Sg1`00Pl@<jG40 +~2SD00jFT0~2SD00RdDLPWP500n58`0008]57<I01@6;A@b;GOR;19SXP^kooh_HRdDLREP8jCL0 +~2o8]5889h1@1e8h]58<I01@6;A@b;GOR;19SXE^kooh_HRdDPREP8j@\0~2o;Q@:0<0j<Zjoon; +AOQ0RDGhjAkloon;`8?435iKbL?lEH_\Pn`LRDD8PSeLA0<00@n5D`000;Y`:0<0XK0Z0`3X@`L0 +08]528?0K8?\1>R]7`00Pl@4Pn`4j7X7~2Pl@4D?me2;Yh:0<0XK0Z0`23k0SX4@L00;ZS:0<0 +XK0Z0`3X0PL008?448]528?0K>Q\7`00RDGhRdGhPgPDD0n=NP0008]528]0K8?\1>S6j_ooPl@4 +D?me2;ZX:0<0XFA40`23k0SX;@T00;UhA0<0RaETA0<0I[P20>Rm0`00^GQ40`2jb2P306JhoooX +ZP<00?me2;X0:@<0XFA40`23k0SXl@P00;UhA0<0RaETA0<0I[P20>R10`00Pl@LRdD8Rd1\RDG` +RdD8Rd1\RDGdSEG`RdD8j2Fo~2RDGlPggl07A>RdD8Pl1\Pn`4j:hN~2Pl@4Pn`4j7\6~2Pl@4 +D?me2;X`:@<0XFA40`23k0SXPPP00;UhA0<0RaETA0<0I[P30>PB0`00j57boon3a13[08?43<W3 +SD00EH_\Pn`DRDD8RdD8Rd1Dj4Bk~2RDGlRdD83km0H>UU~3o;X0P000RdGlj4>l~2RDGhjE\0 +~2SD00^P10~2RdGlj2^l~2RDGhjdJ;`6Qh:@<0^UPY0`2QI4@308?\2>Se1`00^GQ40`2;5FA4 +0`1V^0@0j8D2~2j404~2Pl@<j@`0~22l1dV8?h0GB[jkglPggh07daogD8^XPY0`2QI4@308?\ +2>R]1`00^GQ40`2;5FA40`1V^0<0j3d2~2j7caoon3a0b3a0c9`eF;k8?\N8U528UE38U=48=m +300?Q0H0~2RdD<aP00Pgd@07@6RdD@aP00PgdD07@6RdDDaP00PgdH07@6RdDHaP00I\M5WP00 +Pgd807@=RdD8PSP0M0G[3he006J;AIkY3`4008e008]E28e5[>QQ8`00SDF\RDFX^ZPY0`2;AJSX +]^OoohU5Y8=mY00?Q6`0~2IX]5WX;826J9AIj3O@`03hA:~3adFP~4o8=mX41m2X]5Y3U5Z7L2 +j`C[:X_0RdD<RDFD@8U538]5Z8U5V429AJR;AIR:28]5U8P8RdFP@8U5X>_5o8]53<H008]5Y429 +AJB;AJB9AJRj;P0008]5Z>S<hoooRDFTPgfT07@[IX]5WX;816J9AIj3OA@03h@@~3^@@0~2ReFT +RdDDj6HS~2RdFTaP00RdFXPSP0M2EVRdFNP\P2IXU5WX=m400?Q100~2^@P0~2ReFXRdD@j3<S +~2IX]5W^\1o8?43<W3SD00EH_\Pn``DeN3k0b9A@RhZbT30>Sl6P00RDGhPggh00n5B0000;T4 +~3^[0Y0`2=AMSXVAl008e5f8U5d;\8~3_k@Y0`23k0cXJB8008_GRl^;f8?418]5d0?3Pnchj6\O +~2SDGHj9<O~2j5hT~2XL0[0`29AMB=A@SXUQ\008U5o8]5o8=h801n5X]5e2d@3P00jA40~2o>T; +~3SD00RdGDj@00~2Pl@<Ge_9`oaERnb3k1QVRDD8RED<RDd@adGh0@000<M5o000~23km52>VM +~3o<M5m;`Y0`3Yb0000<M5m<0Y0`37AO`1~3jKD0~2o<M5m<PY0`37AO`1~3jJ40~2o<M5m=@Y +0`37AO`1~3jHd0~2o<M5m>0Y0`37AO`1~3jGT0~2o6P<:P<0^^`Y0`2QI4@308?\2>S11000^GQ4 +0`2;5FA40`1V^0@0j57ooooX30400>P70@00Pl@<jC\0~2SD00PoP13hAKoooo2l0?Q5?ooon3 +n?l?Q5Kooon3n08?Q67ooon3n0<?Q6cooon3n0@?Q7Ooooo[ROb3O@`0M0Z;A@b2>01d0^\PIZ6E +A`<0ISU520n>2P0006J;A@QVXiE70`3YS`000?b;AA23N5@0M@O7AOP0~3Pggh07@OPggl07@I +RdD@R`f`:P<0>DQD3hD7~3adGl~4Pggl07@KogD<ogGd^Q`Z0`2Q\2X308?\2>Q]0@00Pl@@Pggh +07@LogD<ogGd^R@Z0`2;AA2;@5B3k0SXB`4008?446JQUDL306HiA@Qn2VJ;A@QVXiE70`23a0c9 +`oaERnb3k0@?_`FEA`<0jCh0~2Rl2h~4j489~2jDT0~2o;P1~3j389~2jcbh0P000>PV2@00jc2h +0`000>PJ2@00jbCY7`0008e008?h0GBo2l1d^h?h0WC6PoP3M<f3n0Ade>_BRl23a0C9`he005F; +k8?\15>3k0R9A@R9E@b9CA37AO`0~3Rl2;A@PiAOam88]548]@E8]=38]Mo3?0RP@Ij3HB~2RdGl +@8U5o>_Io8?425_9`h_0EH_\Pn`<RDD8RED<RDd@J4`Z0`2j;2X30:5TA0<0Pn`8j;H2~2^GQ4 +0`2;5FA40`1V^0@0j4KmoooX0Ooooh?438?43<W305F;k8UE36X0SDd@DH]=38_@^040~2Pn`< +j9X^~2Pl@DbL?lEFRHg`40I?le~4RnaTRBd0~3REDDJP6=CAQARddDRm2h0@0008?\3>QS;P00 +Pl@DRnETS`D0~3Pl@4GL<0~=EH_\DeN3k1R9A@P;`7D9<l23a1QOFlW3R`ePA0<0RDg\2lUe7kPJ +~3j:4I~2Xf140`29AN`;`7D9<l23a1QOFlW3^@@0~2Red8Re<HSABEG2X308]mk8_7j80K~2Z@00 +E02=A`Bi100008]C48dDUGPZ0`3XI1\00:T005@0Rl^=G`R9GNbj2P0008]138?\28e=l57XMbd0 +08?438]=l0_9M@f3`B282h?72HUmk>\?Reg`Pl<`RdG\R1Q0RDG\RdgdPl4`Reg\R0^=B`760B2j +2P0008]m28]728?\28e=l57X:Bd008e;0X]El8?2<8PASD\3ReGdPl8`R16=B`C60CZj2P0008]7 +18?\28e=l57XnB`008e;1H]El8?2<8PASD\6ReGdPl8`R16=B`O60CZj2P0008\7Pn`8SDg`DNS: +;000SD\8ReG`Pl8`R16=B`V;EOB3`S284He;2\H18;[X0`00RdLD1F`7~2Pn`8SDg`DNRE;000 +SG\;Rdg`Pl4`R0njI00008]5m8?\28e=l57XMR`008ek38]=l8?1<8P?^PX0~2RdGdPn`8SDg` +DNQG;000PlA8SG\=Rdg`Pl4`R0n=N`j;COB3`C283he;3lH12X?348UMk<H30:5PA0<0Pl@HGe_9 +``00~=EH_\RED<JP2=CA1ARdd<Rm0c`8?\3>PY;000Pl@DbL=EJ9SO0@1TocD0~3RnaTRBd0~3 +REDDJP6=CAQARddDRm0c`8?\3>Sf:`00Pl@DRnETS`D0~3Pl@4GL<0~<EH_\RED<JP2=CA1ARdd< +Rm0c`8?\3>Q=BP00Pl@DbL=ERnb9E@aZ0He=456;C@b;d3?0Pn`<j2e:~2Pl@DbL<0~;EH_\DeIG +Pn``^Ql0~2^<P^0`3X02P000_0M0Xc`8?4<5mNFlW3J60`0`2=CNAA\0;X~4XK@Z0`3XF88008?4 +28?hogDI<lTcd[QT~3j0in~2PlSoPl@`GeiKbL>h1PH00>R]5P00RDGX2l1e6C?9<m:hI0000>ST +O@00PlSoPl@`GeiKbL>;ONR=A`:S]2`30:?h;`<0Xoa30`2n^2X30;U0~3ljEVYH_GPNX20@00 +SKX20@00<l2i@0000?>[RoZ=U`82~2REGXI\L2oon1a`@2~2RmMV<lUVPoUQLPiVPoUjM`R=@N1V +R@;[0fJ92X_1@H?20VJ1nOl0M]aVa`;ooh?20VHcbOaVPoU1LPiVPoUJM`R=@B1VR@;[0fJ92X_1 +@H?20VJ1nOl0M]bh00800>SJ5@00XkP\0`0;`7DI<lTcd[QT~3j0mm~2PlSoPl@`GeiKbL>;?KP\ +0`0cdXYGoOK287@9<l2iP0000?>[R`fh;0<0R@gl;`<0^9Pd0`3XgA8008U5j0_0M2^;n8_g^@D0 +~2<l3b[U4[oX_?Rce0<0<0Rl71j@;cYH_8Pn43ljAI<l3cZ\M5k000~2adG`~4ocE<<0<0SDg\ +DFX@\0?X~4Pl@<2l1d2\L5C303~5^:Pd0`3XKa8008U5j0_0M3V:28;iKg@5P_U?MBf;ANR:@04l +KW@4?4ie7kZ`=0<0RegXPl<2Rl?XC840088l0`1e1h8=b2h3006hQ2d30>SE0@00^>@]0`3Xb`40 +0;Q4;P<0j<41~2a`F\;@<0i2d30<L532h304@^0`1Z4fP04000J8@]0`2`0nP0~3Pl@<2l1d6C?9 +<m:hI0000>S=N`00PlSoPl@`GeiKbL>;3H@]0`293M0]0`1Z4fP08000J<0]0`2`0nP0~3Pl@< +2l1d6C?9<m:hI0000>R>N`00PlSoPl@`GeiKbL=Z4fP04000J>@]0`2`0nP0~3Pl@<2l1d6C?9 +<m:hI0000>QKN`00PlSoPl@`GeiKbL>;3N@]0`293C0^0`1Z4fP08000J20^0`2`0nP0~3Pl@< +2l1d6C?9<m:hI0000>PLN`00PlSoPl@`GeiKbL=Z4fP04000J4@^0`2`0nP0~3Pl@<2l1d6C?9 +<m:hI0000>SYNP00PlSoPl@`GeiKbL>;3D@^0`293I0^0`1Z4fP08000J80^0`2`0nP0~3Pl@< +2l1d6C?9<m:hI0000>RZNP00PlSoPl@`GeiKbL?71AQ80`24;0<0a`DLB0<0[2`306XDSDg@DFX? +JP^`1>P0~3Pl@@Rdg@R0gh@`<0RdgDR0dLA0<0RdgLR@fl;P<0RdgPR@fh;P<0<l23a31OGU_9 +`oaERnb3k0QCRmR=COQASDglDOmc8;03j000~2Pl@<2l2;`gDXRdglPN7o~3IP_9M1Z0B4B0Rdgl +PN7o~3IX?i0GD7ad100P0005_9``00~;EH_\Pgd807D5j=He~2J2A`0@1Z0k02j000~2Pl@8bL>7 +fi1ERnaX\>4106Co=@00~2j53koon3n?mdKXe5n6BS~4^<3A0@23k0CXFF@008?419_I;I@`0`2; +AAB3k0CX`7\006PTL040^07o~2D;02j000~2Pl@<R`dD@@<0DH\ET30305:QS303053X:[OooheU +n8?\1>PC~3SFGhI8l5~4^0P0~2GL>@05EXV=l106Co=@00~2RnaTRBd0~3EUN3k0B;3K@Z0`2; +\J@1~2Rdh82lUd8dV9CPR3OPP0O1V;n8]>28eAohUF28]DSPcodX_7Pgh807gWj3In~2Pl@4GeiT +S`D0~3Pl@4GL<0~<EFRHg`40I?le~4RnaTRBd0~3Pn`@2l1e7<L5l4@300`0~2PlSoPl@@I8l5 +~4Pl@4GL>;3K@Z0`2;RK01~2RDgl2lUd3S_8M0N;BB@;bGGeRDglRdGl2l1d3c?Bj2@R~2RDGh +j`Z=@037AOSoooooRdGhPl@@I8l5~4Pl@4GL<0~>EFRHg`40I?le~4RnaTRBd0~3EX?\4<M5l000 +~22l1e6h\=]2X308^9\04008U=n<M5m000~2j`b=@029AOR;B2B9COB;MOPkMOAd7Xe008_6j54e +~2PoP1M@O7AO3oooooRgHT>gGdMNF;AO23a11NI8l5~4Pl@4GL<0~=EFRHg`40I?le~4RnaTRBd0 +~3Dh?\78U5n0_0MAg71O140`0<~3PlSoPl@LFfB?1@00~2Pl@4GL?7AO@0~3RdGhmT080W@Fa`G` +A0<020000<M5m?ooooo[>he008]5n89h6P9e4lL5l4@301`0~2adGdooooon\LRdGhRd0hPn09 +MA771O140`0N~3adGdoooooh=mm?me3X]5n89820;Y7P4008_0RdghRe4@2m9d4TZ9DA0c`8Y4 +4AR9AOCYl`0008]=n8=i@0<?Q7<0~2PgT400n5C@0008]133d08000L`?[1_bh020008_8RdGh +Re0lj0il~2RDG`2l1e3lM5m?oooooY]`0008e008]=l8]Mn8]CC8_3j60Q~2RD<4Rd]<R@^;AOR; +28eI0HTH<m^:6HUMm?m81>Uf~3SD00RdGhPWPe0G@6PWPd07D]^@40~2SEG_RdGhj:Ek~22l1d +3C?KRUg_REgdjdJ=@037AOCooooojcZ=@02i0@0008]Mn8]C?8_3j7Ik~22l2;`g@H^@40~2SEG_ +j=\P~2<lV:CNn9COC[2?c7AOCoooooPggdog@7RdGhaT0J0H]5m8?475]TS`D0~3Pl@4GL<0~< +EFRHg`40I?le~4RnaTRBd0~3DeIGPn`hRDD@REDDRDg`2lUe7\L5l4@300`0~2<l23a3QOGU]T +S`D0~3Pl@4GL>;CA29CNb;CAB3n@9m>8?i0GdKRdg`PTT80S?0Pl@hGeiKI8l5~4Pl@4GL>;ANc6 +~2Pl@hGeiKI8l5~4Pl@4GL?7AM`0~3RdG`mT080W@Ca`G`A0<020000<M5g?ooooo[>8]5l89h +6P9e4lL5l4@301`0~2adGLooooon\LRdG`Rd0hPn09MA771O140`0N~3adGLoooooh=mg?me5X]5 +l89820;7AN`0~3jDX4~2SD00RgG`Pgh@00n4C`0008]E58?j0@n>@`0008]Mk8]644R9AQ2:A0HH +R0=3?0Ye7<H30<I66P6;AA23a3QOGU]TS`D0~3Pl@4GL=:Pgh@07@5PoX1OlJ9EAB9GNb3OA@1 +M@j;ANc6~2jJ@3~2SD00Reg`Pg]00`n4L`4008=k101e?h]333d08000L`?[1_bh020008_8Reg` +Re<lRl?XO7T008U5i0_0MQN;b8]CC8_3j>4N~2RDGPRD<4Rd]<R@^;AO23N0@03hI20`00o8]5 +54R;f8]=l3]I17L6RDGXj`[lRdG`Rd04RDGXReg`Rc>;o[P:~3RdgX2nCb[Xeoog@2<on9OM0; +og@nRmN9OLP[eT:9EMR;GNb;nh_:Rl69CLc1j@;cYH_8RdG`Pn43ljB;CLR;OL`YN0A1R@P3fXUM +k>W70P00Rl2;AO2;68]5k8_cRoR9ALR;ENR;`X_8`NT2ljF;b8]5l8?Q0o>TRdg8RggX0mn968]H +12_JREP4ReDD:mN9EA@3chU=k8?j0@n>N08000_KMD6;@0`m020007<5j`R=@02h020008_8Reg` +Re<lRl?XH7P008U5i0_0MQN;b8]CC8_3j<DM~2RDGPRD<4Rd]<R@^;AO23N0@03hOUo_oojB42 +~2RdG`PWPe0G@DPWPd00n5G@000?I0A80?Q5<0~2^@40~2ReG\RdG`j0=h~22l0?Q>`1~2SD00 +RedDBhUM58]=k8eA0HUEk88i2Pn4d04008?k0@n4a`400;T1~3RdG`j<Ug~22l1ecNVa0@00RdG` +PWPd0@n5J`000?I0A80?Q640~2^@40~2Re0lj9ag~22l0?Q8D1~2^@40~2Reg\Rm>;MO2;a^Sh +7000RlJ;CAA9RDdDSE<1REG\PS\:3hAI0@00PoT13hA@0@00^@40~2Re0lj59g~22l1e^^Tj0@00 +o8]554R9AMP?Q2`1~2?OP?~2O@C[1h_0^?P?~2RlR;AO2;D3cX7WL008U5i0_03hH40@00SD00 +RegTRl^;ONb;eh]el8_6j7@L~2RlR9CN2h2P0000_TlZj=Oomd0S?oRGg@2ol?Q900~2ReHlRoZh +2P0008_;2nCb[Xeoog@2<ol;o`n4I`0008e5e51Z0B_jAb_kEomf8;04j000~2Pl@@RDGL2l1d +5LL5l4@303`0~2Xl1<0`22CPP2jaR;AO2;F0R2hoj9F0R2hof9F0QVad0foon3OM`0M1@c`8?4 +>5mNFfB?1@00~2Pl@4GL>;AM10RDG\jcklRdg\RegP0l^9CNb;AMP[`hU5f7@X?OP?~2O@C[1h_0 +^?P?~2RlR;AO2;D3cX6WH008U5i0_03hOoo_ooRdD@>DG\MRN;AO36@1X1mT080W@:adG\~4jaSl +RdG\aP00RdD@RDG\j`V;`<M5k000~2RdG\Pl@hGeiKI8l5~4Pl@4GL<0~;EFRHg`40I?le~4RnaT +RBd0~3Dh?\8<M5n000~22l1d1H8h07D>a`G`A0<010000>\kRl0;dWD<a`G`A0<00`000>\YRlZ; +f8eEi8_1j0hc~22l2;`gDEJP0cbHeEi8?\3>QUJ000Pl@@RDGhRdGhPl@PFfB?1@00~2Pl@4GL<0 +~;EFRHg`40I?le~4RnaTRBd0~3Dh?\68UEn0_BMAg71O140`0<~3PlSoPl@HFfB?1@00~2Pl@4 +GL?7AO@1~3RdghmT480W@Fa`G`A0<020000<M5m?oooooYC00008]=n8]9>8?Q3WDEa`G`A0<0 +:0000<M5m?ooooo[;X_0RdghPWTJ0GDSRdT8Pn41MA?71O140`0Y~3adGdooooon\8RdghRe5< +RA63OOCoM@j;COR2B@P2jM40~2Rl28AO>;GOR3Nd033hB@~3Rd\<>D\43i?22]9d:X]CC8_3j04^ +~2>d<<M0c7AOCooooojIL0~2RdGhReQ<RAS7@0@0~3Reghod<4R`^=D@694hYElhPAPg]00Pn5 +G@00089ml`X?QE<0~2Rd\4Re=<Rl?X[Rd003]317@=adGdooooonU4~3o8]5n8]HC8THad04~4 +jb>=@02i0@0008eElh]5n>PdM`00RDGd2l1e2LM5m?ooooo[3h]5n<I06P8c`8Y5lhU5m8]5m8?4 +65]TS`D0~3Pl@4GL<0~=EFRHg`40I?le~4RnaTRBd0~3DeIGPn`DRedLREg`2m]e7\L5l4@300`0 +~2<l23a1AOGU]TS`D0~3Pl@4GL<;dW@42lUe53?0Pl@DGeiKI8l5~4Pl@4GL?7AN`0~3Reg`mT<8 +0W@@a`G`A0<020000>Uo~3o8]Ml8]k>8?W2GDEa`G`A0<07P00089;20;YH00008_0Reg`PW\J +0WDCa`G`A0<07000089;20;[AHe008]Ml8=k@0=d7h_jRo6C3jo?Rm?XF04008_><m;gmh_GThUM +k>\LRl2;fPn_bh_@RdG`j2d0~2Rl\cd_OaRm69ANb3ON`0MPN;AO36@1X1RdG\Pl@DGeiKI8l5 +~4Pl@4GL=ERnaCEUN3k229A@R9E@b9CA37AO00~3adG\~4PgP@07@[<oJ;F11;REP@RU`H68PJ +AT8klGD:RlJ3a21OGU_9`h=h401egHUE38Uel8]el3Ue40n6Y00008]mj8]E38]Mk8]528e0089h +=@0?QE80~2Rdd@:lj1n@0P~2L`F;nN\6o;l08000REGPREgTRmR;ch]C?8MMi>RbL@00ReGPRlR; +AN@;bGA@RmZCRDGTRl?X4AL008]Ei8_8Rl>;fN\[Rl2;fY>;CA0[cXU5h8_3j7Ya~2ReGPRlR; +`h_I2lUe2X_6Pl@PGeiKbL<3d`?c>gD@3h9^ooooRGG`RdG`Pl@PGeiKbL=ERnaCEUN3k229A@R9 +E@b9CA37AO00~3PgP@07@^<oJ=@02;F11;REP@RU`H68PJAT8klGD:RlJ3a21OGU_9`h=h401e +gHUE38Uel8]ml3Um40n6`P0008]Mk8]ej8]528_0PgP400n5F00008]@387j020007<7Rm[[28e0 +0;\08000RGgTRoR;bh]G?8Mmi>RaL000Rm2;AN@;dPn4M00008UMi8_JTh_8Re=<Rl>7GNCX1aH0 +08_8RdGTRDP4RdQ<R@R;D0B;CA0[cc_:MPJ;l^\7Rl2;MA0[mhUMh8_>Ra29ANB;G@b;`hMMh>RT +1@00Z@00E02;CN2;ANB;40?FRA03cXU=32U`10?n>gd@3h9<ooooRGg`RdG`Pl@PGeiKbL<0~= +EFRHg`40I?le~4Rnb3k0QTRBd0~32l0?Q6X0~2SDS`RDglIX5i3]FU3hEH~3I\M13P00PWT<478I +DK01j000~2Pl@4RnETS`D0~3Pl@4GL>;COb2B@dP<l2:@@b9AOS7@@@0~3P64:06J1H@P008]5 +n8\DQOA40`294HT<QOA40`2;iFB?1@00~2Pl@4GL<0~>EFRHg`40I?le~4Rnb3k1ATRBd0~3DeIG +2l1e4c?0GeiKRnETS`D0~3Pl@4GL>;d8_j<l23bOob[X_2mm59RDglRafd:P<0REgdadGh~4Pg\\ +00n6E@0003?BRl2;n8U5k8]=o8_g<l3b[XU5l2_nRln;@cB=?9D0~3R`@hRoR7AO0c`?>VM0DK +`8?Hoh]mk8]=l9L;ogD9RgglPS`i?G@8@X_:>d\\L[:9EOR;GOB;COPkBbac8h]K=8]=n<7Q0X\4 +2h]Mo0?3@5mNFh_UI8l5~4Pl@4GL<c`5mNFh_UI8l5~4Pl@4GL<0~=EH_\Dh?\38\=]2X308^9 +U04008\I2m]m1oOKja6=@02;7K@Z0`2;Vi@1~2Ra^1nj05~2OPj;3K@Z0`2;BA3[7He008\M]2X3 +08^KU04008\;SAb=~4`N46:l^9COB;7JQ30`29GOP;fgDVRmRh90000>P^0@00RDGh2l2;`gD8 +<l23a0aKbL>;GOR97JQ30`1Z0FX1RdgdReGhPn`<j:X?~2Pl@PFlW3~<EH_\Pn`<DeIGRDD8RED< +RDd@<m^:F@f;nh?W7hUmo8eJoc_H3hbS~3RgGhSD00Rm6=B`Fn0@0003?0PoTO3io0B2?`dnJ; +bP?aRT4;R4H;Po\7O229COB=BoVh0@0003?BPoTO3io2BR?2ReGddn2;bPQ12hQN38\4WOA40`29 +1XTdWOA40`2:D@f0h^2:APdT7`[2R4H=adH4~4P6H:06J1IPP004N:APdTh2Go~30lN8APeVadH> +~2Bc]M20n=I_ooohUmo8]548YH3H3Sh87So`0000=Mo8QH3H]M28QH35mNFlW3SD00EFRHg`40 +I?le~4RnaTRBd0~3DeN3k2@;`7@5PoS_MQ<c`8?495mKI8l5~4Pl@4GL>;f8ek48_7j;5>~2PnP4 +RmOgfR?G>mL?U<:1h_l0~2:l:9AO2;`cg`o`l03hIH~3JQ=GSDgdDK03j000~2Pl@<2l2;`g@C +<l23a2AOFfB?1@00~2Pl@4GL>;GOAVad<>eJF;GO2;OOB8G`b;GOB90h]5m8?048?495mKI8l5 +~4Pl@4GL>;GO2=79gdA0<0R`\;bG@?RDgdR`V92nWi~3SD00Rdg`@HU=k8?i47dOPcb=m4@3~2 +MAF;`463nA1m2X<lSOA40`00M?29CNb;ENb3nQ1d;H_hS@bEm4@308\IREgdR`>90LL3~4Rdgd +RdG`j=[moon9AOB;anVF~3adGX~4Rdg`Pl45^`40~2<m:3nAl?Wl9:8m[ChhUMh87k~20@1c4\M5 +i0000@37ANP1~3j`R;`8]Mh8UMi8_hJQ?oMNB=GOAC\0?X~4Pl@<2l2;ag@C<l23a2AOFfB?1@00 +~2Pl@4GL>3ONP0M22;n8]Mm<L3~4Rdgd^P\0~2RdG`j3omoon9AOB;ah]Mm6K7@`kEYH]Ml8]m +m8QO38]Mm8T3RdGdPl0@Pl@TGe]TS`D0~3Pl@4GL<0~;EH_\EUN7dH_aRoR;b\7Y0_>URlZ3h@?c +Y8_::oV;aemNbL<0~<EFRHg`40I?le~4RnaTRBd0~3DeIGPn`PRDD@2l1e5H?8oh?485mNFfB? +1@00~2Pl@4GL>;CA29CNR:0C`mM18:`7@>@HX1?3ed10[0MOF9CNR;CNP[CA2;7K@Z0`29GO37 +AN`0~3Pg\\00n6E@0003?BRl6;OA29AN2;mc?0lZj9AM`[oX_?Rd<dSCbE~4R`@hRoR7AM`c`?>V +M0DK`8?Hoh]mg8]=h9L;ogD;RP@8?3ed30[0M0Q2Rl8k@bab\8UEk8]Ml8]Ek3]C;0n3C`0008]c +=8]Ek<7R0X\l5S?0PlWolZkgdDV;Lc0[lHUeh8]e48_n<l23bOob[X]5h?OAB@?1RD<`Re\dRC@C +<l23a21OGU]TS`D0~3Pl@4GL>;GO2;Dbbi3`0002?:MD:3`Q71hP:;@cCX7V@008U5i0_0MAo7 +1O140`0=~3PlSoPl@PGeiKI8l5~4Pl@4GL>;GO2;ANB9@cBS544308]Ml8]c;8eF0HUC;<7V0X]C +=8]m48Tl<X]c;<7V0X]C=<L4<P00~2<l23bOob[_OABD41Bc0c`8?485mNFfB?1@00~2Pl@4GL<0 +~;j@00~2Qm^@j@00~5EH_\DeIGRlZ;d8_iRoLc`8?9oo:^Ro[gdH_IPlWolZi?Rl_1j@;cYH_; +Pn43ljB;`UmNFlW3~>EH_\EUN;bX_@RoTc`8?9oo:^mm4[nH_bljId1A_0PmSoGek9``00~=EH_\ +EUN;bX_@RoV;mc?0PlWolZkgdH_1Ro[1j@;cYH_8Pn43lj@[n8_7Gek9``00~<EH_\Pn`8RDD8 +<m:=A@SXbB`008?42<W3~<EH_\Eh_h<l23bOob[_OABH_1GlW3~?EH_\DeIGRoZ;d8_g<\3b[X_2 +:oj;eh_hRmn3bOlb`?:^Rl=?Rl[1j@;cYH_:Pn43ljC61`1OGU_9``00~<EH_\EUN;nX_@RoLc +`?:^DB_nRln;nX_1`NT2ljF;b8?Q0o>TFC?0ljZ;`UmNbL<0~<EH_\Dh?\=8_HSDg<DK01j000 +~2Pl@4<lV:CLj9CMPcbHY=cHU=g3?9RTg<RDgP<lV:CM29CN@cbHY=dDV9CNPcbFJ;CM:1jF`7 +~2RDg\adGh100000_KM1:=AMSX3TT008_;R@63a3AKbL>=AMSXo4P008?4=5_9``00~<EH_\Pn`< +DeIGRED<RDd@RDGl2lUd@H8h;7DeSG01RGGlRagl@`<0<m::5S?0IX\4DoK027@QRl16<lV:3S?0 +IX\4BoK027G`RGGlj`Z=@00c`5mNFlW3adGd~4RdGlPSP]M@k7AO@1~3@8U5o>\=o8]5o88h:gD4 +@8U5o<M5n000~2Rcgl@`<0RgGl<lV:3S?0IX\4CoK00W@[<m^=@02;`c?KRQj3jc03`8d4P0?H +AS?9RPhc`6J;14of`09eh8UMn8Ueo8]M38]=o8T;Pggd07@8RdGhmmS[1?b;AOQOGU_9`eF;k5=F +Eh?\>;RH<0<0j37foon9ANb9AO0;`7@5PSP0MEVQ]2X308^0U04008?018\=W30308T8XK@Z0`2; +P9@1~2a`0\0@00XK@Z0`2;P9@1~2Pl0\R`fP<0<0R@S71L0[0`1@AP00a`Fl:`<00@0008?4>5mN +FlW3ReG\RoXc`8?9oo:^Qm7gdTZ3nP<?P\L3~2RaFd:P<0RkZD0@00PlL4Ro5VYJB;5K@Z0`2; +TY@1~2aT87088i07@LSE41REG\PSX0M16=D@:9ENb2>P1d1X?10hU=k8]5k88h07DlXK@Z0`2; +P9@1~2a`00~3XK@Z0`2;P9@1~2aT0\0<L5`2\3~5a`Fl:`<0~4Pl@hGeiKbL<cbHeEl8]5k>S] +oOooRDG8R`fd:P<0RhVD0@00RdG8JM0l~3RA6;CO29CNb2>@1e=8\=]2X308^9U0400<I1;031 +h0B=1<2=342=3<R93L0[0`371K`[0`00~3Pl@hGeiKbL>Q]2X308^hU04008?7;8]Ek8_bIZFT +XK@Z0`2;P9@1~2aT0_08]Mb<7S18dLfhd4Fhd4`j?0:`<0a`Fl:`<00@00088j07@C<lV;`491 +PSX0M0F3n@=lm8UEk8]5k88h00n4L@800;T1~3SEG`j23moon9ALR;GLR3n`4?S5D2~2Po\<3hm< +0P00RdG`RDG\^@40~2SEG`j?Gloon9ALb;AO0kAN`?Q2X2~2Reg<Po_l3h`N0P00Po\43hlE0P00 +RDG\^@40~2SEG`j<7loon9AM2;GN`iGO0?Q?H1~2Pgg<07DEReg@Po\13hcT0@00Po\O3hoK0@00 +Pgg<07@DRdG@2l0?S<X1~2PoP63ho10@00RdG`RDG\^@40~2SEG`j6[loon9AMB;AO0kAN`?Q9l1 +~2RDG\^@40~2SEG`j4_loon9AMR;GMR3n`4?S801~2Po\<3hmg0@00RdG`RDG\^@40~2SEG`j23l +oon9AMb;AO0kAN`?Q5D1~2RegLPo_l3ha90@00Po\43hm00@00RDG\^@40~2SEG`j>ckoon9AN2; +GN`iGO0?Q241~2PggL07DERegPPo\13h`?0@00Po\O3hl60@00PggL07@DRdGP2l0?S?D0~2PoP6 +3ho\~3RdG`RDG\^@40~2SEG`j9Gkoon9ANB;AO0kAN`?Q<X0~2RDG\^@40~2SEG`j7Kkoon9ANR; +GO0kGN`?Q:\0~2PS\03hFR~3Rafd:P<0Ri^D0@00Rdg8RD\8Rdg<Rafd:P<0Ri^D0@00RD\@Rdg@ +Rafd:P<0Ri^D0@00RD\HRdgDRafd:P<0Ri^D0@00RD\PRdgHRafd:P<0Ri^D0@00RD\<RdgLRafd +:P<0Ri^D0@00RD\DRdgPRafd:P<0Ri^D0@00RD\LRdgTRafd:P<0Ri^D0@00RD\TRdgXRafd:P<0 +Ri^D0@00RD\XPl@hGeiKbL<0~;EH_\DeLk`WhK>lQo2c_:O0Lcfn\8SD00^`40~2Ro_[5he003_8 +OP`kbWd8^`40~2j`?l<m^;n`_oMCHkb7DGRafd:P<0Rk^D0@00RelX0elP>edDOQ\kbWDPRafd +:P<0Rk^D0@00RelT:elX>edDOPVh0P0005mKbL<kb7DVRafd:P<0Rh>D0@00RePPRgdD>mmo40=H +:3_OOPVh0@0005mKbL<kbWDaXK@Z0`2;^9@1~2RdLTRedD>l=n72]7:3_3OaF3OAP0M0Vh0`00 +0>\4Rl0c`5mKbL<c`5mKbL=ERnb3k0QCEUL;bG@CRafd:P<0Ri^D0@00Re\8ja6;`8\M]2X308^K +U04008]K38UMo0_9M1:;?K@Z0`2;_i@1~2Rgl@ja3lRafd:P<0Ri^D0@00Rg\DRGgh2lUd4X\M +]2X308^KU04008]K6>\@o8\M]2X308^KU04008]K78_hRdglR`b:RdDD0l63`0Fn1`0009WgoX_7 +0l\[bX]Mn?OKBhdlg@00~2:o\[cdV925mNFlW3Rl1ERnb3k0QCEUL;bG@CRafd:P<0Ri^D0@00 +Re\8ja6;`8\M]2X308^KU04008]K38UMo0_9M1:;?K@Z0`2;_i@1~2Rgl@ja3lRafd:P<0Ri^D +0@00Rg\DRGgh2lUd4X\M]2X308^KU04008]K6>\@o8\M]2X308^KU04008]K78_8RgglRgbjo4N; +AA@3ah?01Kh7~3VOOnmmZ3`PNn1`0008_2VOOnRl6;MOQ>S@ce~4:lh3b`?:0lm9R@QOGU_9`he0 +05F;k5>9E@b9CA2;5K@Z0`2;TY@1~2PgX@07D@ReX8Re8H0eBIo4Z94>]7o8\M]2X308^KU040 +08=k401n7X_HogDD^@40~2ReD@Pn`<j>Gnoon;`h?44>\HRl3oMABi0@0008]E48?\3>PAo_oo +Pl@@XK@Z0`2;V9@1~2Pg\D07DFRdD@Rd\<Re\L0eb8o4^;A@b965_9`j6d:P<0Rh2D0@00PgPD +07h?ReD@RdD<<lUKbNUoo_ooReD@RdD<<lUKbNVhoOooEH_\Pn`TDeIGRED<2l1d1H<hogD7<l1O +GU_9`h\@:m69EOP;dWd7<l1OGU_9`h]=n8_1^h1A0@2Imo^;f8fk:eh008Umk8d4_@00~2_[D5 +~2VOOnRo29MNQ8VHOjUX?W0`?g`Oh2JOQ]0@000oj9OM`[edZ9EOC1h`N=7=^=5=^=59>=55<[ +bXU=o9Tc`R_2Pn03<l8[`WD:^=P`0`3[28e00;RT<0<0RDG`PgdD00n4kP0008\M]2X308^KU040 +089k;01e48]M3<M38?oooooYe`000?coMMb;CO2=EN2=ANB3k0cXC?kooh]M60_K3iC1PN7o~3 +DOmeo8]=m8]Eh8]5i8?\3>S9noooPl@TRdd<RD4P2m]e2H?h0@n5R@0008]M38=k800?SW`0~2 +Rafd:P<0Ri^D0@00RdGl0d<X^h1A0@2Imo\;`7i0odG\PGgdK@4007D8odGX<l3[2?b;AOA0RDGd +RDGdRafd:P<0Ri^D0@00RdGl0d<X^h1A0@2Imo^9EOc[8He00:6d:P<0Rh2D0@00Rd0X0DGlj`_l +RdD<ad0P~4RdGXPl04ReD<RD8DRegdREXLad8@~4RgG`PlH4RGG`>Aio3Om248?613TNO_J9MO2; +CO23j@B9CO2;M@b;GQ`[6D>9GPb;ANb3`0Fk1`0009WgnhUF68]mo8_7^a0>~2VOOkRlZ;f8UN +28d4W@00~2`N<6:mR;akll~3VOOo:l>9APBk?00008_1VOOkRlJ945mNFlW3~?EH_\3j\@^000 +~23i;0bL>@~3EH_\Dh?\38U528UE3<M5n000~2PgQ00g@ORdQ4Pn41MAN2N1X2MA7XRa<008?h +0GD7adGhoooooh=mn00?QK00~2Rdd8<l2:@CD;`7@ePoP1M0SYR`0008e008]528]8A8?Q0GD= +Rd0PodP8jH40~2Rl2;A@R;@23X\GX00>U_~3Red8og<P\07X~4Pl@4RDGh2l1e6_I3A05d;omc +<;01j000~2Pl@4RDGh2l1d6h]5289820;71O140`0l~3RdGhXl1<0`3[8h]=2?ma?;01j000~2 +Pl@4ja6;`;[k~3^0`a0`3X0GD008=mn01e3h]E38]52>RDK000j`V;`<M5n?oooon;AOR3a0aK +bL<0~;EH_\DeIGPn`XRDD8RED<RDd@mT080W@Aad04~4<l23a2QOGU_9`h]528]`?8Uel8]m38Um +k89h=01e6h]548_@Rl[1j@;cYH_:Pn43ljB3a2QOGU_9`h]548?h0GHSRdg`PW`1o`d?QGd0~2 +B8U548]526K7@3H=0>U[~3SD00Reg`RP^;MNb83X8k3@n5B00008\=l4@308U=j;T1~3Rm>;O@R; +anSGF@00PoP1MAZ:2h;i2W@;IX7Qo`1VRDlfjaN;ANc600[[3h]5j:?`A0<0RdD8PV08o[P1~3 +Pl@XGeiKbL>;GO29GNBh3@0008]e28_k:ghlReD@RlX[ch]mi0_TlZj=Oomd0S?oRlZ;aP_o3hBh +~3RmN;MNb=@022NP4:MCZ9AMR;aXU=g9>;l8_kREgPRmX[f8_3RlS1j@;cYH_8RdGHPn43ljB; +CMb;MN03llH62TJ=FP;[=X_0Roj9CMb7nhU5h8_::lm1RoN;nh_1RDgH`NT2ljF;b8]5h8?Q0o>T +RdgLRggHRo>=FP43mhUeh8_iRm29GMbh3@0008_c:g8lQggL:lj;MN0;i?:^SGooM08coh]=g8_2 +RmL;o`n5E_ooohUek8UMl8]El8]Mk8_bRo^;A@P[D3b;AA0[`X_@Rl[1j@;cYH_:Pn43lj@[G@`3 +`h?4:5mNFlW3~2EH_\Pn`8RlZImoV9AOR9EOb;A@R;COR928]=o8U81<W3~?EH_\DeIGPNb8~3 +RDD8RDd@2lUd20_0MA8;dWD>PlSoPLB8~3GeiKbL<;dWDNPgd80GDHa`G`A0<0300008?8oh74 +R00005mNFlW3RdD8RDF@2l1e3<M5c=BP0@29EIC[?H_J^?01~2j1c[oon;dhU5W0_0MAO71O14 +0`0=~3adGPooooonWo2000o8UEU<M5X000~2adG<e:410<M5h000~2PgdH00nD`8Q5YX]m]8]= +48_GRmV;nc?0PlWolZkgdB_i^2D0~2lZj=Oomd0S?oRl^7ehUE`0_B3h@V2000JR1Z02_CDU>= +EI1B\0GoELb;bh?458?hnWD;megPj@<8~2SD00RmV;CL2;AN03`B_3RDGP@LM5f000~2^`40~2 +<oJ;`8_A@C?0RP:3j223n10?QhT0~2obB5P9P108_0g9P1~2V@4009T10>RH0@00V@4009T1~2 +V@4009T1~2V@4009T1~2V@40d9P1~2V@40a9P1~2V@4009T10?BH0@2;aX;80H_`jcJ=@02;aX;8 +0X_`jbZ=@02;aX;818_`jaj=@02;aX;828_`ja:=@02;aX;848_`j`J=@00cfdT;f`n5FOoooh_F +REGHPSTZMB>;AAB=F0B9GAB;08U5e0_0O@f2bP6;lXUef?OHRDGD@N\do<M5e000~2Ragl@`<0 +<oKl<m::4FJ;15>3h09d4h_6Ro:3kS03`8d4P0?`@N_RRl29MMB2>Bid3<M5g?oooooYD`0008_a +@H8i:WDHRlj;AAB=F0B9GAB;08U5g8?10^\fSD00adGL~4Ragl@`<0<oKl<m::4FJ;15>3h09d +4h_6Ro:3kS03`8d4P0?`@N_RRl29MMb:0CaXM0PlK7@4?4ae2hX1R4FW@N\7SD00aTFW83?0RP63 +n2D?Q><0~2PnQ5PoPc3hLO1P00obB539X10<bK0@3<V`40c9\102BP0@0TX0409:0102BP0@0T +X0409:0102BP0@0TX0409:0102BP0@0TX0409:0102BP0@0TX0409:0102BP0@1dW0409:0102BP +0@0TX0409:0102BP0@0TX0409:0102BP0@0TX0409:010?bJ0@1dW040c9\10<bK0@3<V`409:01 +07BL0@0TX0409:0102BP0@0TX04019l107BL0@1dW0409:0102BP0@0lW`409:0107BL0@0TX040 +9:0107BL0@2;fFXPJP1Z0E>=AI1@\0GoELb;bh?458U5j>Ta1@00o89mYf`?QGH0~2RmV;AAB= +D0B9EAAVRa2=AJ[Xf7T008_;RDGXPoSoM@k7ANP0~3jOX4~2Rl2;AM@[ANR9AM0;`7l;adG@~4 +j`^;`?I5f05d0oMMd8_IJR3oMM2;ANQ@SDFZD8e5T52`1OmEc8_;Pl@DRDGXjK84~2Rl2;AAB= +F0B9GAB;08Q5ZX]5e4R9AM0;`7d;adG@~4j`^;`?I5f05d0oMMd8_IJR3oMM1Z0He5ZU2=AI1@ +\0GoELb;bh?458U5j>UP1000PSU6MA>2OJH0M0g7ANP0~3BNU81000RP68AJ^;ALb9AIR:AJN8 +AJZ2OJY<MBF;GAB=@a29AAB;0hV5M?oooh]318V5N?oooh]328V5O?ooon\DRedDSD<8RDDDR`>9 +ANb;@`B9AO22OJM<M@Z=QGCoooo[1H_0SDG\RmWoMAR=EJYBogGLogGDRdgHSEF@Pn`<j7Ai~2 +Rl^3a1b9ANSY^`<008e0089mYfQe5X8iL7@ARdDDSEP4REdD3kl0RDGTj`j;AAB=F0B9GAB;08U5 +i8=mg01m3<M5g040~2jan=@023OM`0MA:3ON@0M@c7ANP0~3jF@3~2PVGHkh8iL7D;aTFZK<I5 +ZeS[3?b:AJN8AJZ:0HQ5ZhemShUm[89mZfme2LM5^0P0~2ja^:AJ\lN7@4?5Qe2LM5^100~2j`O7 +AKP:~3adG8~4RTF[?6Ad23aY3hE0~3RdGT2l1m5<I5Z2g7ALP1~3mmR9ANC[9h_0mTGH0W@>aTFX +:lM5b040~2ja;lmTGH17@;aTFX8<M5b040~2PWf[F7D9^;@d0`3[1h_0^<Pd0`29AK22OJYXM@eV +RegTPN?oo`00REgTRgGT2oId9X]E\8]M^8U=4?a?RlJ;lS?Bmo>7lXX<<XP?Ro0;`7GZRGGTRdd@ +SEf?:mn9GKb;AM`[`hU5i0_0OPC[18_0<l29ALCfAMP83h@i~3Pgfl07HcPWf[KgDARmR3n`5c +9\M5a040~2jaglRTF[?7Qd13aHMA76AJP`RTF[R4FYadG80P0008]5e2]5_2]5b2]5a8U5i0_0 +ORGfAMP1M0Ogf8U5i>\OmTGH47@IRdGT0DG4adGT~4j`Z=@037AN@0~3RdGT2l1n0^\2<l2;fFXP +D?meb8eEZ5:=EI1B\0F;MLcoeX_;RmJ3a1B9ANR3n?Yd6VX`RdG4D?me_5N=AI1@\0GodX_;Pl@D +RDGXPggXnW@XRdGT2l1m1N\5SD00<l2;fFXPD6X0JP2=EI1B\0GoELb;bh?458U5j8=mj?X?Q4H1 +~2RdGTVC?2:l:;GL@3GK`3GLP3f8UMj>T[0@00SD00PWfWJ7DFRdDDSEP4REdDR`2;GN1VRAS[ +4he008]558eH18UM58\0RegPRAS7ANP0~3jO00~2RdDDSEP4REdDR`29AL0;`7DZadGXn_oooh=m +X00?Q<d0~2RmV=AI1@\07X408008_;Pl@4jKH0~2Rl22OJM\MBj;fH]5c8U5V?meg?mee?mef8e5 +T53oML2`1NRW1000Rl^3a1B9ANSYPP0008_0RoN;fH]m`3?0PlWolZj7fH_nmm=;REgXPggL07d6 +REgLja?lRdGX>dGLO@C[1H_0RdGLRDGXRdGD:dGXRDG@2l1m2LM5d000~2j`WfAMP1M0?gGM2; +fFXPogG@RdGXD?me`8e5T52`1OmEc8_;Pl@DRDGXj`Z;`<M5j000~2BH=mj?Ye1_MMh>\=o46; +ANP1AN3Y[?OoohUm]8U=48]Mh0_K3haS~3ReD@RoXc`8?9oo:^mm59RDgXJR1Z055BSEF@D[05 +oeG<Pl@DPoSjM@[gfhUMh>\cSD00RdGX0DGPPgd807D8RdFDaP00jab3OJ00M1J=CI1A\07Xc`00 +08?418?hnWD3megPPgd807@8RdFLj:[Noon;AN21a8P0~2GeiKbL=ERnaCEUN;MA@;mWh^<l2: +AAR:h8_8`N4@2l6;E@R;NPB;gX_;`NT2lj^;bh?Q0o>ZRlj;@P@3`HU218]E40_BMR6;A@R;N0B; +M@b;fX_;`NT2ljF;bh?Q0o>TReP40mZ9F0B;MA@;mWdammj9MA@c`8Y568[PRmS1ha0;`h]M28]k +18_FRl[1j@;cZh_:Pn43ljZ;D`@3eXUC18]550=545mNFlW3Rl1ERnb3k0b;A@R3>05e7H]848]@ +18]03>PhGP00PoSoMBJhn_oooh?43<W3Rdd8Re4@Rd4<j6Md~22l1d2[SjooooPl@<bL>;C@S7 +@A00~3<l23a0c9`eF;k8?\55=FElM5o000~2RgD8Reh@mm^1`o01~2REghRgdD2ol?SZh0~2RGgl +RUDHRl0kn`n<H00008Uml0nf`XUEm8[PRlS1hA0;`H]n38]>48Uek0?iRm>;lX_>`NT2lj^;cX]e +k8?Q0o>ZRgg`0EH@E[01j2cooon;EOB3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9 +OAB9GOPc`8Y568[PRlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]e52Ue +n8]E40_B3hJh~3RdGlPoSj3hB\~30l:9AOb;O@b;MOR;G@SlRlHk`Pn7GP0008Uek8_?REG`Rg\< +Re<@0oZ;lHU=m8_@Rl[1j@;cYH_:ReG\Pn43ljB;OOB;lP5345>`0NQVo_ooReG`Pl@4PoSjM@_7 +AOcjooooja:;`8_6:m03o[k`0@00ji^=@029EA29O@b9MOR;A@R;N0b;F103nh]e38]M48_CRl[1 +j@;cYH_:Pn43lj@1F12;AOP[`hU5n8]m50_o3hfm~3RdGlPoSj3hBa~3mmn9OA@3ahU5o8YE68]M +n8]e2?`kn`n<H00008Uml0nf`XUEk8[PRlS1hA0;`H]n38]>48Uem0?iRm>;lX_>`NT2lj^;cX]e +m8?Q0o>ZRgg`0EH@E[01j9Smoon;ENb3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9 +OA@c`8Y568[PRlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]5o5mNFlW3 +SD00EH_\DeIGPn`PPgdH00n==`0008]=28U=j6J3>@1d3Ob3`@9VPcT0MON9CNR;ANP[A@RIPn81 +0l;An8U568]=48?Q27D5dN29AAR3OAP0MB2;C@b;D@QZ8?me56X0ogD8DK05om:3a1B9AO3Y>P40 +0?I540P?Q9H0~2RdDHdN3Xo=goohU5k0_0MAW7AO3jooooa`G`A0<03@000>Vi~3SD00Reg\REgP +RgD8RGGXRgdH2ol?Q3d0~2IX<n07@gRdg`IX\FRl?XhVl008_8PoSoM@Nin_ooon\@0mU?PlH2 +2omd1VJ3?P1ef8U=l8Um68UMh8Uej8=ml?X?Q5P0~2RdGP:dG\RDG`jDX0~2RdDHj6SMoon9AN`; +`7DEadG`n_ooolL5l4@300d0~2jbR;`8]M68_3j4;Moon;bhU5k8]E2>SUK@00RDG`PoSoM@O7 +AO3jooooReg`Po_j3h@l~3RdDD:l>9AN@;`7d:adGT~4j`[lmTD@0G@3megTRdd<Rg48JR3oMNB; +EO1BogG\DK05omJ3a1B9AO2;ANcXP]Wooh]5l8?485mNFlW3~?EH_\Pn`8^Qh0~2XK@Z0`23`2CX +Y>goo`_03hG:~3R`fd:P<0mT4T0Pn5^P000>S7~3XJ`Z0`3XWL_ooj6`:P<0j9?;oon;3K0Z0`2; +BC`;bG@;DK01j000~2Pl@4R`fX:P<0RdTl2lUd2e6`0NP0~3Pl@4R`f\:P<0RdTl2lUd2e6`0NP0 +~3Pl@4<m:QZ2X30>S;FP00<m:Q[2X30>RoFP00<m:Q\2X30>RcFP00R`fd:P<0Rd4dj:GHoonQ +o4<308?X0^RHf?ooR`fd:P<0Rh5H0@00j8OHoon3a0S9jNiN~2Pl@8bL<0~<EFRHg`40I?le~4 +RnaTRBd0~3Pn`DadGl~4XK@Z0`2;P;01~2RDGh2l1d?8_0RdGhRdPTRDgdRdQ4Pn4PMAlcd^R8 +k?oo2l1e2?m5o>\?SD00adGlooooon\=SD00RdGdRDGh2l1eaX]5o8?456B?1@00~2Pl@4GL<0 +~;EH_\DeIGPn`DRDD8mT080W@Ga`G`A0<020000;P1~3Pl@DGeiKbL>;C@R2NAX0M@k6@AX4<l23 +a1AOGU_9`h]=28=i@0=e5LM14000~2aT4J13?0Pl@DGeiKbL>;A@R;B0B9CO1VPgPfog@:@HU= +l6K7@3Kooh]e289n6P4?QLl0~2adH@~4ReG`2m8?Q:L0~2RdI49H00~23hFI~3PWhd0@n5C000 +08\n^0X0~2Rdh42nCb[Xeoog@2<on;aP_oM36;mh_>Ro12@H_i^0X0~2RmT[7X]>12_;2nCb[Xeo +og@2<on;aX_g2omeehUEl8U528e=k55Z0H]=l?OIDH]=2?ma8;04j000~2Pl@@2l1d7<L5l4@3 +03`0~2Xl1<0`2h0@0008?455mNFlW3RdD8PV15kh]528]HC8THad04~4jDH0~2Rl2;G@R2NaX2 +MC^;OO2;ch]CC8_3j4`0~2>lMd6LM31000~2Rd]<R@^h0@0008?455mNFlW3RdD8ad04~4ReQ< +RAR;G@S6@aX4<l23a1AOGU_9``00~=EH_\Pn`XDeIGRDD8RmR9E@b9CA37AM`0~3adGl~4adG\ +~4mT<h17@hSD=8D6X2JP3oLb2`1>P0~3Pl@@RDGX2l1d7<L5l4@303`0~2Xl1<0`2;`h98208c +`5mNFlW3Red8PW\d0@n53P<008]538U5n8]548U5l<M5m00P~2Re\lREgT2l0?QW\2~2SD00Regh +Ro^h2P0008]=l0_TlZj=Oomd0S?o2ol?Q2P2~2:o^9ON0kOOAc1X_7j`F;`8]5m8_@ReghRdGT +Ro>9GMR;n8_JRl_1j@;cYH_;RegHPn43ljB;nh_b0oj9OOP3aXU5i8]Mm2_NREgdReG`:mJ9EO0Y +MN2;CN`3cXU=k8?k0Pn2\@0006J;=B0a0`1VRC17RGgh@HU=k8?00XU5i4Z9EO23j`:9GOCoAM`; +f`n5^P4008eMo5=X020008]M2?mc??mc8;04j000~2Pl@@RDGXPGgl020007D42l1d>h]M289; +20;71O140`0l~3RdGX2l1d1>\7Rl2h7@000:?0C0<0RegLmm^1``0P~2RdG\:l=OGU_9`lM5g000 +~2RdD8Rd0lRDGTadGd02000>Tg0@00o8e=o56;GOCgfh73020005>;C@SoLCcoLB2`1>P0~3Pl@@ +RDGX>eglM@@;`7@oRed8PT\80\L5l4@303`0~2RdGX2l1d1N\8SD00^1d0~2Xl1<0`2;GOCgfh73 +020008]5g0=5k2_3GeiKbL>;GN0;f`n6I@0008e=o55CogGhRdd8og4P\0CX~4Pl@@RDGX>Egl +M@@;`7@]Red8PT\80\L5l4@303`0~2RdGX2l1d0n\6o;PM~3Xl1<0`2;ANaOGU_9`h]5o2U5h2U5 +l8]Mn0?HREgh0DG\RdD8Rd0lIX\M8c4306J96?m5n8?00XU5i?m5k?m=l<M5m?hO~2adGL0@00 +0>\YSD00RgGhRggTRdG`RmR;bl7Y0_>URl^3h@?cY055k2U5m<M5l000~2Pgg`00n7R?goohe= +o56;GOCgfh73020005>;C@SoLCcoLB2`1>P0~3Pl@@RDGX>eglM@P;`0n4T@0008]M289;20;7 +1O140`0l~3RdGX2l1d1N\8SD00^1d0~2Xl1<0`2;GOCgfh73020008]5g0=5k2_3GeiKbL>=COaA +Red@Dome38]=2?ma8;04j000~2Pl@@RDGX>EglM@@;`7@URed8PT\80\L5l4@303`0~2RdGX2l1d +0n\6o;PM~3Xl1<0`2;AOb9ANb;ANaOGU_9``00~:EH_\Dh?\78U528UE3<M5l000~2adG\0@00 +0<H20LI20@?7@PP0~3ad8<01000<M21000~2ad8@3P0008\=o4<303?KRQPcdVJ;55Wf`PQd5?a0 +<m::43?KIX\LDOK327G`RDD8Red8<l2:0h?XHH?h5Pn7RP000?lTQKB]0@2=@00X[P40=:h103B^ +0@0d[P40=:h103B^0@0d[P40=:h103B^0@0d[P40=:h103B^0@0d[P40=:h103B^0@0d[P40=:h1 +012^0@0d[P40=:h103B^0@0d[P407:h108]53898107[8he008]5389810;[5he008]5389810C[ +2he00>TI1P00SD00Red8@hUM23?0RP>3n2]d38?hHW@WjD80~2Rl2;G@b2B`@8RdD8SDP1RDd8 +PSURMB_60`23`0:9A@S[88]M3<H308]528e80HU=288i:gD<PT\428?00XU52>\0RdD8PSP03hBP +1@00R`gl@`<0RdD8<m::43?KIX\LDOK327@H@3?BRQ0cffJ;757f``Qel8U52>\ESD00Pgg\07@< +RdD8PSP\3hE\1@00XOa30`2;C@PcfhXIIX^4F0@4~23ko02l0?Q3<5~2PoP\M6:3j6:3n18?Qah5 +~2obB58:l108e008b_0@0d]040=;@103Bd0@0d]040=;@103Bd0@0d]040=;@103Bd0@3<\040 +=;@103Bd0@0d]040=;@103Bd0@0<\P40=;@104Rc0@23OO003hGL1000odD8adG`0@000<M5k000 +~2jJ`4~2^@L0~2^]`d0`2;G@R;`nPLH0002l2;``n5Z0@008?01hU528\=o4<303?KRQPcdVJ; +55Wf`PQd5Xe0040cdXX@<m]VRaaAm\<8MO29A@R;G@R=@`69A@R2>cd?QFD4~2R`gl@`<0<m:: +43?KIX\LDOK327@ERl10<m::43?KIX\LDOK327G`RDD8^@X0~2SEGdRed8Rl?XJf4008U5n3]M +m0n47@@008]=3?I1405d73gdO`00MS?71O140`0a~3^040~2Pl@LFlW3PGghn7l007HEa`G`A0<0 +<@000;P1~3Pl@LFlW3Red<Rd\@Pn42MAf;COPiB`Qf5LL5l4@303<0~2^040~2Pl@LFlW3Regh +2m]d2X]538UH389P4?^;AOB9A@S7AO00~3adG\0@000>U^0`00Rl2i1@000;[T=0<0Red8Rl?X +g5h000_0Rl<?QFP3~2Pl05RDD8R`gl@`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f +``Qel8U528]M28e30HU5288k?@n59@<008\=o4<303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ; +757f``Qel8U52;T:~3SEGdRed8Rl?X:f0008U5n3]Mm0n4g@8008]=3?I1405d73gdO`00MS?7 +1O140`0a~3^040~2Pl@LFlW3PGghn7l007HEa`G`A0<0<@000;P1~3Pl@LFlW3Red<Rd\@Pn44 +MAf;COPiB`ac5LL5l4@303<0~2^040~2Pl@LFlW3Regh2m]d2X]538UH289P4?f;AOB9A@S7AO00 +~3adG\0@000>T^0P00Rl2i1@000;[\=0<0Red8Rl?XW5d000_0Rl<?QBP2~2Pl05RDD8R`gl@`<0 +<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5288k?@n5i@4008\= +o4<303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52:7l@`<0Rdd8<m^:6FJ;Q5P4 +10003ko0PoQVM0f3n7Id5>U3~3SD00RdD<PV0@o^\oSD00Red<Rd\@Pn44MAj1N`cdO`00MQG7 +1O140`0a~3^040~2Pl@LFlW3RdD<PTP@0N\:Rl3YC@4008e008]528e@0HUE28\Mo4<303?9RPYV +Pka;10@0069e1X?00XU528]5389P4?O7AO00~3adG\0@000>Wb~3Rl2i10000;[d=0<0Red8Rl?X +H5`000_0Rl<?QN`0~2Pl04RDD8R`gl@`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f +``Qel8U528]M28e30HU5288k?@n5Z@0008\=o4<303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ; +757f``Qel8U52:7l@`<0Rdd8<m^:6FJ;Q5P410003ko0PoQ]M0G[;he00;T6~3^_`d0`2;G@R; +`nRdF`002l0?QD80~2Rdd<aT410H?31XUM2>\5o>\`Rl37AO00~3adG\0@000>\4jab;`8]5288h +00n5H?[ooh=ml01e23?0Pl@LFlW3a`G`A0<00`000;P1~3Pl@LFlW3~=EH_\Dh?\98U528UE38e= +g8U=m0_0MCF;3B180`29COP;bGDN^>`0~2j2;>oonS84P308U5n0_0M@Pc`8?495_9`j7`A0<0 +RDG`jc>;3KA<0`29COP;bGDN^>`0~2j>g=oonS]4`308U5n0_0M@Pc`8?495_9`h]528\0RDG` +Pgg`?7DSocG0C0<0^RPa0`2;AOB3k0SX1KKooh?43<M5k040~2j`SladG\~4ogG\SDgdDH]=38]M +n8_CRdG`Pn`<j0<c~2Rl>3a3QKbL<0~>EH_\bNVSH000SD00EH_\Rd08bNWPC@00EH_\Dh]8288i +07D8Pl_oja2=@02;B0R=F@69F0PcfhXIRl=KbL>;`5F;k8?hog@6bNUVH000bL=ERnb3n?md2H]B +2<WY9ed00<W3o5F;k8?hog@3odX8bL>=@01ERnaCPna0RDd@adGd~4adGh~42lUe23?0PlA0FlW3 +PoP1M0N3n09d8^\`2m9e2H?8oh?4@5_9`lM5i62e0@37ANRT]@40REG\jbk7ANAD]@40adGXU;D1 +0>\N2m9e2H?8oh?4@5_9`lM5i6be0@37ANRh]@40REG\RdDDRDGLRdDHRDGPRl2;CA0c`8X12l1d +2H?h9G@<jbj;`>VK~3SD00ReD@@Xe5b>Pd4@00RDD@RdgdSEG8SDGTj2\H~2RDG`jaf;`8eEi8]M +48X3j0<1~2RDG`@hUM4<M5b040~2RdG`Pl06PoP5Mc[o98G4]P40SD00k;H10?Bf0@3d]P40jKH1 +0?Bf0@3L]P40Pggh07l7adGhooooon\Mo?m=4>UPooooRdG`0DGdPgg807D3odGhjDcooon;AOR3 +a41KbL>=@01ERnaCEUN3k129A@R9E@b9CA37AO00~3PgT407D:<l23a11OGU_9`h]M38\cRl?o +eX_CRDG\RmR;MO2;A@SlPo_oM2>;CA0iL@An6`_0M0>8642;fX_hAX\CRl?odX_CRmR;an_Io8UM +k8Uel8]E38]b18]5k?oFRdG`2l1n1>\5Rl23b?n3a11OGU_9`oaERnaCEh?\48Q528_8RED<adG` +~4XOa30`0?]]TcbFJ;35Sf`@Qd>h_0RmZ;4h_3om:;dhU5m8\Mo4<306J;34>3h@Qd2?m5l>_O +SD00ReD<RdX4RdGdom6;AO23a11OFlW3RdD<Ra3odXU5m3?9RTd8>l5e3;P1~3Pl@@Ge_9`h]E +38]:18]mm8_7om63oome1X?8on\6o;SmooooPl@@Ge_9`eF;k8?\3=]m33?9RTP8PoU<M363nFad +2>UC~3SD00RdPDSE44RE0DR`V9CO`;bGD4<l39`h]=o=]]3=dIjD\0~2o8]858eA18U@58\9RDgh +2lUe13?0bL>;COR;E@b94H]E48UA18]E58UA2>\NRdPDSE44RE0DR`V9CO@;bGD4<l39`h]5m=]] +3=TH^040~2bL>=@01ERnb3k1ACEc?KRUP8Po]<3hBN~3Po]\M0GY>04008]H58ek18Uh58\KREgl +2m]e1S?0Ge_9`h_IPo\1M0f3n`=d?>VB0@00SD002m9d78]Mo8\ml3D308TkRcgd=@<0RG\4jG81 +~2SD00Reglg@G`=@<0fN3M6nUM0@00Rl0;dW@LReglRcg@=@<0RC^;?M@e0`29N`CY?P4008e0 +08]Mo=d5d3D30=WPgA_Y:@4008_0RePDSG\4RGPDRa^9GOP;fgD6<l1OFlW3RmV3n`5d3H?k0gA4 +jOh0~2SD002m9d98]Mn8\mESH308TkRceJ=P<0RG\4RceN=P<0RG\8jMD0~2Rl2;GOSK;EHf0`3I +h=\kjL40~2Rl0;dW@TReghRceZ=P<0RC^;?Fhf0`29N`B;?G8f0`29N`SYV@0008_0ReghfbeZ +=P<0fN3K>nV5~3Rl2;F1B=N`B9N1B;6hUMm0_KM@Hc`5mKbL>3n@5d2h?i0g@fjE`0~2o0_BM12; +AOB;7B0f0`296>]:SD00RdGdRadP=P<0PO<0~2P8UMl=U5l=THjbj=@00;dW@@RdGdRadX=P<0 +RAS[6Xe008]5m8\M:3H3087c~3P8UMk=U5k=TH^040~2Ge_9`eF;k<J49?o_ool0DeIGPNb\4`00 +RDD8RED<Rm[7ANP0~3adGP~4adG@~4adGL~4adGH0@0008];18U=i0_9MB^3>`1e6M\]24@308_3 +j2Wmoon;d`_0M@K70P40~2<l21a:`C~2GeiKbL>;A@SlRmR;4ooBThUMl8\Eo4<306J;35Z3h@Qd +1om5j>_RRl37AMAF4`00adG8~4adG<~4adG4~4adG0~4SHEPk?ooRDG\RdG`PoP]M0F3n2]e>h]M +i4^9GNAe4;SmooooPLB\4`00GeiKbL>;AO2;GNb80d>9GNb3n2ee1lM5f000~2RdD8Ra3odXU5 +l8]538=h600?Q5h2~2RdG`PoQ>M0V3n6h?QIL0~2Red8Ra>;`ooBRm>9AO23n65d6X?h@G@ERdX4 +om6hoOoooh74[1<005mNFlW3Red8Ra>;`ooBRm>9AO23n4id6X?hKW@ERdX4om6hoOoooh74[1<0 +05mNFlW3Red<Pc\0MAVi0@0008]Ef8_3j87lool;`7D6a`<1~3RdG\0dGXSIePk?oo:l>3`0>1 +a:`C~2GeiKbL>;AO23n6Ud2H?hB@n5Y@4008]M28\CRl?odX_CRDG`PoQ^M1Z3n4id5H]:1?oA +^?gooon1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hIW@JPoQ6M1F;BPCodKSmooooPLB\4`00 +GeiKbL>;G@R;4h_3om:;dhU5l8?hJGA7PoQ9M4:;BPCodH]M38<k07DI^@<0~2ReGHRl?X_?_o +o`_0M@K70`40~2RdG\0dGXSIePk?oo:l>3`0>1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hKW@J +PoQ>M1F;BPCodKSmooooPLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hJG@JPoQ9M1F;BPCodKSm +ooooPLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hM7@JPoQDM1F;BPCodKSmooooPLB\4`00GeiK +bL>;G@R;4h_3om:;dhU5l8?hNG@JPoQIM1F;BPCodKSmooooPLB\4`00GeiKbL>;G@b3>`1e6KT3 +~3ReGHRl?Xbo[oo`_0M@K70`40~2RdG\0dGXSIePk?oo:l>3`0R1a:`C~2GeiKbL>;ANc60310 +RDG\Rdg0Rgg@Reg`RgFlSD00RdGTB8U5i0_03hb=0@00Pgg<00n4N`0008_3PoP[M0R3n2ed0n\] +o8=ma01e1X=mg01n3;T1~3jB<1~2Rl37AL@1~3_P40~2jA01~2SD00RHeLk?ooXK@Z0`2;P9P1 +~2Re04Rl\c`6J;14Z;SEc\ooof`09d3Om5g;h1~3j`R=@02i0@000>W?~3Rl2;`h?h<7@iPoQ5 +M0b3n6Ed1nUB~3Rl0;ogl6PggP07@BadG<0@000;h1~3jIX0~2o;T1~3jHl0~2Rl0;ogl<Pgg8 +07D6<l3[1h_0^040~2Ro0;`0n4KP0004OYJ00008e008V=G>cooj6d:P<0Rh2H0@00Re04Rl\c +`6J;14Z;SEc\ooof`09d2DNn0@000>\fo:6d:P<0Ri1P0@00<l2:0S_3MAf3OLP0M0Ni0@000>\E +adG80@000;h1~3j`N;`;T1~32lUe=`_fM1^;AMB=D?n9EM@;`7h>RdG\R1Q0RDG\j`J=@03oAN2; +fH]528\@om:;bh_HjFOnoon=@029OM29GO2;E@R;LPB;AO3oeX=md01e1X=mh01d38=mc01d?h=m +g01e>H=ml?me8H]Mk8f=H>coob_IB`_KOPVhoOooon\5Rl23b?n;f>\6o;_mooooRl>1a:`C~2 +GeiKbL>;ANc6~2RgD<Pch03hES~3PWh8C7DZ<m:=QF3\oon3k0SX>SX008_6Pl@8j<Cgoon3`?lK +`40Uo`000>\YSD00<m:=QF3\oon3k0SXd3@008?428]53>RImoooPl3o6l109Ol0~22l1d2H]M +3<L30@0008]5k8fMH>coob_3B8]Mj0=Mh0?3PLB\4`00GeiKbL>;`5F;k5=FEh?\88U528UE38_J +RDd@adG`~4aTGS08]578<h40n5B@0008?i<0n5@0000<M5l040~2R4gSRdDDRa3odX_CRDD@SD[o +RDd<2lUn88?hN7@5PoQHMAJ;CA28CN>;AAB;4?oBRDD@odd<odG`RddLPcT03hEY~3Rdd@PoT` +3hED~3odG`R4gSRdDDRa3odXU548]=34V9C@`;bGh]PoQhM0F3n5Qe8h]=7<L1400008]=48Q= +hh]558\@om:9AA3oAO3oC@c[5h_0RdDLa`08~3j`[lRdDLa`0:~3Reg`RdDH0AR;AAb3>0Qe1kX; +~3jaN;GAb3>a1e2;P8~3j`Kl^0X0~2Rm2;A@R9ANa2RmZ;MNB;CA2;`8]E34Z9E@`;dPn<`@00 +08U5g8\E]2X308^BV04008]j18_1<m9VRaA7RdGLm\82M0^=LM3YF00008e008U5g8\E]2X308^B +V04008]j18_1<m9VRaA7RdGLm\90M0J=LJW[;_b9AMb;5K@Z0`2;TYP1~2RgX4Rl4cdVJ;54N; +AMcf`X1d1XeabN\6o;kooomoReDL>C9n>0_fM@V;d2]Ek0_BOPn;dd\;dWh8R0Q0j`R=@02;EASo +0X_hR4gSRdDDRa3odX_8RlOY<_oooh_0RDD8RDd@ReDDRg84RdD@omJ;A@P[ANb9ANP;`7l6PWgS +<7D8RdGXjbR=@023OO00OPZkoOooon\FSD00Pgd@ogD6PlSoj`Kl^?gooon;f8_3Pl@PGeiKbL>= +@01ERnaCEh?\48U528UE38U=4<M5m000~2PgT407DB2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSo +ehU5l8?hog@eRdd@ReGd>E44ORZ;N@b;BA0;i?:^SGooM08co`_oM1F;E@P;dW@6R092RED8odGd +jkn=@02;E@b;NPB;AO3oeh=mm01n2X]520_0M0?6~2Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?go +oon;f8_3Pl@@Ge_9`eF;k5>3k2R9A@R9E@c7AO@0~3RdT4RDg`2lUe23?0Pl@XFlW3RdD<Ra3o +dXU5n8?hogD9PlSoPl@XFlW3adG\~4Pgg`00n>i0000?b;COR8CN:i0P0008eEhXe5h>QNAP00 +RDGXPoSoM0Z3n09d:^Ul~3ReD<RdX4RdGhom63ON`0M@^hoOoooh?4:5_9`h]5m8?4:5_9`h]M +38\CRl?odX_CRDGTPoSoMB2;BPB;AOSodH=mk01e2H?8oh?4:5_9`h]5m8?4:5_9`h]Mn8QMhX]M +i8QMhkT2~3SEGRSDGPj=Q5~2RDGXj`>=@037AN`1~3RdGX0DGdRdD82l1d3FJ;GN1VRAR3`0:9 +A@R;GO1;REg`RdD<Ra3odXU5n8?hog@82m\?Sagooon;E@b;BPB;AOSodH]5m8?4:5_9`oaERnaC +Eh?\;8U528UE3<M5l000~2adG\~4RdT4RDgX2lUe4P_0M0EVa`0003?0Pl@\Ge_9`h]E3?b;fX\C +Rl?odX_CRDGdRagl@`<0IX\<@h?Q27@8odG\jmn=@023OOCoM@Z3b?n3a2aOFlW3adGT~4PggX +00n>6@4008e008]Mm8QMf[T2~3SEGJSDGHj>94~2RDGPPoSoM0Z3n09d>nVL~3ReD<RdX4RdGd +om63ON@0M@bhoOoooh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9`h]M38\CRl?odX_C +RDGLPoSoMC6;BPB;AOCodH=mi01e2X?8oh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9 +`h]Mm8QMfX]Mg8QMfkT2~3SEGJSDGHj3Y4~2RDGPj`7ladGT0@0008]5h055l8]520_0M0eVRegH +IXTHPl02RDD8RegXBhUMj8]538\@om:9AOB;5Oa30`2;n3?9IX\<N_K127D=PoSoM0P;f`n?j_ko +oh]E38]j18]5m?oGRdD82l1d1FK7~3RdG\0dG`Pl@\Ge_9`h_0EH_\DeN3k129A@R9E@b9CA37 +AO@0~3PgT407DB2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSoehU5l8?hog@eRdd@ReGd>E44ORZ; +N@b;BA0;i?:^SGooM08co`_oMAF;E@P;dW@6R092RED8odGdjkn=@02;E@b;NPB;AO3oeh=mm01n +2X]520_0M0?6~2Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?gooon;f8_3Pl@@Ge_9`eF;k5=GPn`@ +RDD8RED<R`d4=@<0RDgdPSXZM@c70040~2@XUE3>\9RdD8a`00~3R`fd:P<0RhVH0@00Rd44ReD< +<m^:6S?9IX\<F?K10Pn4JP0008]52<M01000~2R`fd:P<0RhVH0@00RgT4<m^:6S?9IX\<GoK1 +0W@hRl0cbHX:PnT`ReP40m^=79\3fHUH14:;7K@Z0`2;ViP1~2Rg\4<lV:2S?KIX\LCoK30WG= +RED<adG`0@000>\8o<M5l000~2SGgdRed<RQ<?]\:i0`000?:^SGooM08coh_22omd3X]E28Q2 +24>9G@c[2H_0RdD8aT0888]538X8Rgd8R4l9SEP1REd<P_UK3hEW~3RQ^2neie2HQO2H?00XU5 +38]=28]538U1388h07D5<m_[;?b;G@R;F`b2>eee4KX8=@<0RdD<@>QoAP00@>\=^PPe0`2;A@cX +KdH008_HRdD8REP@Rl^;A@`3`HU5388hGGD4@8U538=ml01e78]5289h2F=e2LM01040~2j`Z; +A@S7@0CooomoRdD<Pl@@Ge_9`eF;k5>3k0c7AOP0~3Rl2;f8\Com:CREgdRaGl@`<0IX\<FX?Q +27@7odGhjn:;`8=mm2Ee2X]5n423a0aKbL>3OOCoM@J3b?o[1_bhoOoooh?435_9`oaERnb3k0aC +<lV:B0R3nFQd2h?iK7@VjD40~2o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePD +SD\4RDPDRa^9GOP;fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@ +^040~2FlW3EH_\DeN3k1B9A@R9E@c7AO@0~3adG\~4PgT407D@2l1d0lH003?0Pl@DGe_9`h]E +38e008_jRmV;5h_7om:;eh_;RoR9OO2;7Oa30`1VR`AkPn08M0KoANc[fOb;GO23nomd?8\Eo4<3 +08_k<l1VR`Ajm\08MBV;AO@i@@An8H]520_0M0J86429A@R;fOm5m8]538\@om:;bhU5l>^mo8=m +m01n2X]520_0M0?6~2ReD<RgX4RdG`omN;AO@;`7h60dG\j`ClPlSoPl@DGe_9`h_0EH_\Pn`< +Dc?9RTP8PoUXM0^3nFad9^U1~3o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePD +SD\4RDPDRa^9GOP;fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@ +^040~2FlW3EH_\Dh?\=8U528UE38U=4<M5j000~2adG\~4PgT407DnPcT0MC62N@U`MAF;@AB= +D0B9DAB;0<L0~4jaR;`3?BRed@Rl?X<?ooo`_0M@K70`40~2<l23a3AKbL>=AMB9AOR;E@clRmZ; +4h_3om:;dhU5m8\Mo4<306J;34>3h@Qd2?m5j>_OSD00RdD@Rd04RDG`RdGdPoP[M0F3n2ee:X]M +l4^9GO1e2kSmooooPl@dFlW3RdgdReghR0^;A@b;4?oBRDGd@hUMn8]5n<H0<429AOR=G@QCSEg\ +Dome38]=m8]El8?\3>Qam?ooPl@HRDGTPoSmM2N3n?md1N\[SD00ReghSDgD:mU;2m]n1kSmoooo +j`>3b?n3a3AKbL>hoOoooh?4=5_9`h]=n8]Ei0?:RDghaP40ReD@PcX03hEK~3PWX9L7D\RdXD +SD44RD8DRaT;fg@ARdd8<m:=AMCXX4@008T3jcF;AA370040~2jb[lRdd8<m:=AMB3k0cXP4@0 +08?438_@Red@Rl?XiOgoo`_0M@K70`40~2RdGhSEgD:l=8RegX0eg\0l>3a3AKbL>3a3AKbL>; +`5F;k5>3k329A@R9E@b9CA2;fLM5j000~2adG\~4Rd<4RDG`2l1e8X<k07DE<m:;`nP\o?ooRl\; +`7D6a`41~3<l23a31KbL>=AMB9AOR;E@b=@02;fX\CRl?odX_CRDGdRagl@`<0IX\<@h?Q27@8 +odGXjmn=@02;AOB3n2ed1H?h:gDZReg`BhUMl7D;^?gooon3a31KbL>;COB;GOR82h]538\@om:9 +AOA3REghRdGhaP0`@8U5n8eM25>=GNaCogD<RdgdReG`Pn`<j<[boon3a1R9ANB3n?ed98?hog@2 +jbR;GOR=CM@[fD\;fgh7^?goooo[0h?8oh?4<5_9`kSmooooPl@`FlW3RdghReGT0lZ9COS60@2; +GA23>`1e9X]=23?BSDGDPn`<j>Y1~2Pl@<Rm2;`nPRnooo2l1e1\L30@0008]5n8eMe2_3B8]M +j0=Mk0?3Pl@`FlW3Pl@`FlW3SD00EH_\Pn`8RDD8RED<RDd@<l2:@PV3n2D?Q;02~2PnQ5PoPc +3hNi0P00obB5j<h101W@0@0Id0406M0109[A0@2Jd@40V]4109[A0@2Jd@40V]4109[A0@2Jd@40 +V]4109[A0@2Jd@40V]4109[A0@2Jd@40V]4109[A0@05d040V]4109[A0@2Md040V]4109[A0@39 +d040V]4109[A0@2Jd@40V]410?G@0@2hc`406M0101W@0@0Id040V]410<c?0@2Jd@40V]4109[A +0@2Jd@40IM410=g?0@1Ad@40V]4109[A0@11d040V]410?7?0@2Jd@40V]4100G@0@2;C@b;E@Rh +2P0008?42<WYP?gooh]=38]E23?0Pl@8bNU_oOooRdd<ReD8^0P0~2Pl@8bNVGnoooRdd<ReD8 +^0X0~2Pl@8bNV3noooRdd<ReD8^100~2Pl@8bNU_noooRdd<PWT9AWD@PgTH07D:^?[ooon3a0S9 +`h]E38]528?42<WYQn[ooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB;0H]=38]E28?4 +2<WYboCooh]=38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNVCnOooRdd<PcT0 +M0Lc`>\ASD00ReD<RdXDSD44RD8DR`6;C@b;E@R3a0S9jGOboon;C@b3>@1d1c?0ja6=@02;E@b; +BQB=@@B9@QB;0H]=38]E28?42<WY1oKooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB; +0H]=38]E28?42<WYco;ooh]=38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNW3 +iOooRdd<ReD8^100~2Pl@8bNTSn_ooRdD<PcP0M@R;EA3X>oSooh]=3<L10@0003?0Pl@8bL>; +C@c70@40~2RdD8Pl@8bNVnmooo^?[ooon3a0S9`h?42<W3~?RlP?_L73~2EH_\<l39``00~;EH_\ +Pn`HDeIGRg0@2oH?SE00~2RlSggXUa48_6^``0~2VOOkRmJARDgdSAb=~4SAaK:m=e3bU85<M0 +4000~2jD00~2RegdSD\1:DPD`N<2SAaK:eP@Pl<<REP@jbJ;`8]H48?k2ghLTkT<~3VOOiThUM +m05H58]Mm<7S0XdLFbUH48]H5873K0L0087k\PL007`8PO_e1`00OPR3b?mOGU_9`h\M]2X308^K +U04008\K2m]m1OOKj`olRafd:P<0Ri^D0@00Ra^1nj05~2OPj;3K@Z0`2;BA3[7He008\M]2X3 +08^KU04008\;SAb=~4`N46:l^;f8U=k8]359VC<mX[fX?S0c?J:mYe1kYX<@<0j`Fj=34308UE +l<M5n000~2RdPDPL5[1`00POVb1`00O3@cfh_0Ro>;f8_1VI<cfR_JPn<3<mX[fPnD`h7So`00 +0873K@4000?NBH7i\PL007gCREghRo2;GO2;CQ2;OP`3?8]?0gghRGghRdH8Rdh4RaK1i`N=??n= +7?n=79n=75l3fXdDS@00~2`N46:lX3bl7P18d4`8dL@8dLf0?IRdg\0mV9GOb;GR29GNQZ06X1 +RmJ=AOb3k0cX_kgooh_6Pl@DRdPPPl41PoT43hMk~3obB=b=<104CD0@14e040A=@10=cC0@3d +d`40Rafd:P<0Ri^D0@00Re\X:EgljE40~2o8=mj01e2\M08000~2jd7lPggX17DNRafd:P<0Ri^D +0@00Re\X:Eglad0P0P000>\OSD00XK@Z0`2;P9@1~2Rd0X:DGlj`WlPlSoGeiKbL>3OO`0O@J3 +b?o[1?b;AOaOGU_9``00~:EH_\XiQ30`295Ia30`39`eF;k;U\?0<0POT@@@<0Lb2iK3`308e0 +03T1M`Ti@@Af18_1bL>3`@b1nA110`1bj8\=V4<300_9M1j;5Ia30`0kbW<D>@5g2CU117H4Rl79 +`h?133_:L^`c`<W3EH_\Dh?\28_HSDghDFX1\0;X~4Pl@82l2;`gD:a`FD@`<00@000>P6~3Pl@8 +FlW3EH_\POS0d@40M0FSW34308<mX4<3~2MAEZ06X0J:130`1Z0;04j000~2Pl@@bL=EJ9SO0@1T +ocD0~3RnaTRBd0~3DeN3k1B9AA29EAB9CASf@0@2M1<c`8?455mKI8l5~4Pl@4GL>;CA3f@@@@ +M1n;3K@Z0`3f@B@2M1<c`8?455mKI8l5~4Pl@4GL>;AA2;03fF~2`0n4f@0003fL~2`0n4B040 +03d30070M0GY[@4006X0ogDHogDDogD@\0CXGPP008?448?hogDDPlSoPl@DGe]TS`D0~3Pl@4 +GL>;AA2;@1B3n05d;h?h17@2jdbi0@0003?B^0X0~2j>lh~22l0?Q5D0~2<lV;EAR;AA3XHP80 +0>]6^@40~2<m:h1P000>S7>0002l1d<C?9ReDHRdD@j3h2~2jb:i0@0003?B^0@0~2j:<h~22l1d +3C?9ReDHRdD@j1X2~2PlSoPl@DGe]TS`D0~3Pl@4GL=Z0?me6?me5?me4;04j9`7~2Pl@@PoSo +MAB3b?n3a1AOFfB?1@00~2Pl@4GL>i0@000;Z6~3^0<0~2j3`h~22l1d3C?9ReDHRdD@j;<1~2 +RddHPl44<m9VRe44P>80IXUA18?8oh?455mKI8l5~4Pl@4GL=Z0?me6?me5?me4;04j287~2Pl@@ +PoSoMAB3b?n3a1AOFfB?1@00~2Pl@4GL>i0@000;ZB~3^0<0~2j<8g~22l1d3C?9ReDHRdD@j3T1 +~2RddHPZ6U~3mh?8oh?455mKI8l5~4Pl@4GL?7AOBP<@<0PcfP<@<0o`n4l@0008]568?028U5 +l8_0Rdd@ReGdR`4i0Pn5a000089j101d;6X0ogDHogDDDK04j7h6~2Pl@@PoSoMAB3b?n3a1AO +FfB?1@00~2Pl@4GL>;COB:@@D:`0n4K00008]m484oV@00`7DiRedHmP<8M36;CO3f@@42M2Ri +0@000;Z:~39Ol0~2j?@f~2Rm<;`8_7M3@cbNQ]~3jb^=@02i0@0008]Mm3?BRU<6<l2:@`GXbCH0 +00_0M0dcbH]E68]54>Q0~3RdGdPWP707@Q<lV;EAR;AA3X:P000>\BRdGdPl08RDGdPcSo3hDJ +oooo<l23a1AOFfB?1@00~2Pl@4GL>=@01ERnaCEUN3k5b9A@R9E@b9CA37AM@1~3adG`~4J31e +~2ocFP@`<0\0;X~4R`fd:P<0PTTT0Xe=a56=CM1A\0;X~4Pl@@adGP~4PcfP<P<007@X<oJ=1;E8 +<P<0Rdd8R`Ti27D8Rd1HRDG`j`]6PcbeX383~2MMf9MN37AM`2~3RdGPPcb5X383~23hEL~3RdD8 +PCP30070MD?7AM@0~3adGL~4Rd0DPoP1M1F3n0Ad1>\JRl37AO1[~3jbV=@037AO1\~3jaf=@037 +AO1]~3ja6=@037AO1`~3adGL0`0008]M2?lcJPR;AM2;@0co<6X4Rd<<D6X8ogGLogG`\0SXGP<0 +08?48?I3105d3VX0JW6`0^Q:0`00Pl@8PggD00n43`<008]M3?H30G@URdD@2l1d0^\6Red8Rd<< +Rm2;G@b;PiP0~2j0H8~2RDGHj`SladGH~4RdGH2l1d6_m`16X8JP5XP@000;04j>l2~2Pl@@jaf; +`8]540_0M1A@JPQZ0FR1~3\0CXd08008?448]M3?H30W@9^0P0~2j`N;`;ShooooRDG\Red<mP<1 +M0Rk20000>\6o;_hooooREg<RdD<mP01M0Rh10000>\6o;SlooooRDG8Red<mP<4M0c7ANP4~3 +j`Z=@037ANSlooooSDFXj9Ta~2JP1ZM;02j5H2~2Red<ok>D~3Rgg\EoncT00005Oo\h`0~2Eonc +R00005MZ16Ye\0[X:@800?ncZ00008]5c53o\h@0~2EoncP00005Oo\iP0~2D6X4JWJ`2^So0@00 +ogF\JPSoLgb;ONQGogFXJPSo\j00~2RgG8EVX4JWN`2^SI0@00ogFdJPSoLgAGogF`JPSoLgQG +JPAZN;0:j;`1~2ogFlJPSo\j`0~2E_me^6X8og=`EfX4JWV`2^RL0@00PLC@~3mP<83h@j0@00 +JP1ZO;02j881~2SG\DocMZ1?mc46X8SG<<ocIZ1?mc16X4JPAZOK0:j5l1~2og<LJPCoLaQZ28\7 +`NP@D6X4SG\8ocMZ16X4JWj`2^Pk0@00R`HUool008U5i6X0JWn`0^PV0@00Rm>3a62;MNB1o_oo +~23hB^~3RlK1h10;aXU5i<M5h000~2R`o1j@^3h@OAhKl3~3<l23nAl?Wl188oSCih]=`3?K<oJ; +`8]5i2?7>lL?Q5P0~2<l1VRd@J:?K4P7@7^@`e0`3[1KT>=@<0Rl:=51R9AJ3oLR1Z2?mb96X8 +IX]2:2GoO`00D6X4DHU=Y6X0RlI@JP5Z1FR0~3\0cXP00008]EX8]=Y8?4<<7W0TJ3``Z3oPQl +ShUeh>\CRl1Z06R2~3\0;XEP0008?428]52?I0111d3VX0JW:`0^Po~3Pl@8JP1ZLk02j340~2 +Pl@8ocFP@`<0\07X~4Pl@4Rdd8mT440GD:^6<0~2j6\B~2PlALGeiKbL>=@01ERnaCEUN1k:00 +~2Pgd<00n>o0000<M5l000~2ReG\RggXSEd@<oJ=@`B;4h]k18?320_BOA6=PP0c0`29A;G4jKh0 +~2Rl0;dWD<RGbea>V_~3SD00RKEPooooRoN9WFcooon;f[T@~3Rgg`SI@mL?oooh_6RKEToooo +j9P\~2RmN;n3?0PlWolZkgdDV9SFSooonh<30`<8fl5G3ooon;lh_>`NT2lj^;cX^eH?oooh?Q +0o>ZRkeToooo^A00~2SD@Em8fD67cooon7WFcooon;QFSoool[d8_7Pn`<j3@\~2Pl@<j9Pd~2 +RiE\ooooRdg`SH`=L?ooohU<]LA6PdG`2C]e30n<5_oooh]=38eEa8]52>S\2`00PLBP~3GeiK +bL?lEFRHg`40I?le~4RnaTRBd0~3DeIGPn`DadG`~4R`fd:P<0mT4T0W@D<l23a1AOGU]TS`D0 +~3Pl@4GL>;CA2;@@cXm_GoohU5k0_0M0aVRdP:PN40P000MA@c`8?455mNFfB?1@00~2Pl@4GL>; +ON`cbFJ;C`[faD0?Q<X0~2RgD@R`j1nA`00<0?U<>1hol0~2POVG~2`0nD`2Go~32mR1nI@00<0? +U<:1h_l0~22m>1nID00<0?U<>1hol0~22mZ1nIH00<0?U<:1h_l0~22m>;g`_@POVH~2`0nD`2Go +~32l:1nIT00<0?U<:1h_l0~22m21nIX00<0?U<61hOl0~22lYd>h]m68]74>PSmOooRmJ;cc_3 +M@hc`6J;@`SXi24008U5l8]5l8?hogDBPl@DGeiKI8l5~4Pl@4GL<c`8?455mNFfB?1@00~2Pl@4 +GL>=@01ERnb3k1C7AOP0~3RdD8RdP4^P80~28m4?QNT0~2RaFd:P<0mT8T0W@<P\T1RDP4jM80 +~2o8]538?028U5o8]528\0?@40080?Q;P0~2;Il00<23n04?QZX0~2;F;o~2PoP23hN;~3obB5 +3>010:7P0@0Hh0406>0108<m[4<3~2MAB;AOb3`0B;28T=14@30<L0<0`208]5284h0`01`7Dd +Rd0DPoP1M0R3n0Ad3n\Io88=[4<300C[;He0088=[4<300;[8He0088=[4<300S[5He008]5284h +0P01`7D7PPf\@`<04<M5n?ooooo[4_b;AOb;B0B;EA2;A@SXioOooh]5n8?45<W3SD00EH_\Pn`` +X@A40`29AOb;`<M5f000~2adGL~4adGP~4adGT~4adGX~4adG\~4adG`~4adGd~4adGh~4^P@0 +~2^:a30`3X3R\000_0M0k7AMP20070jG<0~2Rl37ANP4~3^P80~2^:a30`3XiRX000_0M1;7AMP3 +0070adG\0@000>]7Rl2j0@000;R\@`<0j<4Z~22l1d4LM5f0<00L37AN`4~3jb;l^P<0~2^:a3 +0`3XWBX000_0M0k7AMP30070adG\0`0008=mf01d5He=f56`0NP0~3Pl@4jAKooon;`8]5o8?4 +<<W3EH_\Pn`@RdD8RdP4Pn44MA2;CA2;E@cXJ??ooh?44<W3PcfD@`<007@@SDglDFX0\0;X~4 +Pl@8<l23a139`he005F;k5=FPn`8RDD8RmR9E@`;f`n4N@0008_2j67bool;`0n4JP0003?9IX]8 +2X_3m\F03hAI~3R`R9CO@;b@n4@P0008]01>Pcl_oo2l1d=S?9IX]82_K5P7@[RgGdo8_6RDD8 +RaR;l`_KM1N;@0CX2o;oo`_0M0\cffJ;F0[fah1eg8Uem8]528?425iKbL<c`8?425iKbL<0~= +EH_\Pn`\RED<RDd@PSP0MBO7AN00~3adGT01000<M5j000~2aTG\0LM5l1P0~2RDGdjbN;`;T1 +~3SEGPj9LY~2PoP1MA>;AA@;`7@5j7jLoolc`8?4;<W3RddDRDglRdd<SEGPSDGlj3\U~2PoP1 +M@Lc`8?4;<W3Pgd@07@7RdGlPTQ40H]=o89i=@=e>H]1<>R=7@00RDGh2l1d7X]=o<I1=@6;COc7 +@D03~3Rdglad4<~4jb7lRdGlaT0e0>\GSD00RdglPWTe0GD;Rd4`j4\M~2RDGhRdgl<l2:@CF3 +n08?Qml0~2obB5U><10?WS0@2Ph`40j><108eEn8]5o>Ri:@00PoP1MA4cdX]5o>Rf7@00<l23 +a2c9`h]5o8]=n8U888]5n8]848]5o8U8D8]5o<M0E000~2jIH0~2SD00<m:;AOcXOQd003?0Pl@\ +bL>:ENb;AOcXP00008?h0GDA<m:;AOcXGAd003?0Pl@\bL=Z4fP08000RdglPl4lDK03j000~2 +Pl@<2l1d4C?BRdGlj30M~2<l23a2c9`h]5o8=h@0=d:nQ_8`002l1d8S?BRdGlj0dM~2<l23a2c9 +`n\?^SH1~2^0@c0`3XDBD008]5o8?4;<W3o5F;k5>3k329A@S7AOR08000PN;o~3PoX3Mc3o99FX +i040o;ST0@30i040d>@10<ST0@22COP@jb6;`89=n23[6H_0PTgh@>\ARl2j_@400;P@<`<0j>dT +~2RdD8Rd0hPoP<3hNJ~3obB5n>@108e008SU0@0\i@40B>D108SU0@1Xi@40R>D108SU0@28i@40 +R>D103SU0@1Hi@40R>D107SU0@37AO@1~3jEl0~2PTgh0\M5m040~2jDl0~2PTgh0LM5m180~2 +jd:=@022COP2adGd4P000>\bSD00PTgh0\M5m140~2jb:=@022COP2adGd4@000>\BSD00^_41 +~2^1`c0`3X=B@008]52?I0A0Ad189=nD2i104008]E28]B<3?0j88L~2RDGX2l1e2kP1~3Pl@` +FlW3Red8Rd<`j9fIoon;ANR9@c1Z0?men?mem6X0JP2=CNaASD\PDE2`2>P0~3RmR3a229GO0; +f`n4`P0008?k10n5H@000<M5i400~2SDgLDHe=i56`0^P0~3Pl@8PggT07DKa`G`A0<0?00008TM +`4`30;P1~3Pl@`FlW3JP3oMOSoMOAZ06X0SDg\DH]=28eA85;oLC2`2>P0~3Pl@PRDG`Pgg`87DE +a`G`A0<02@000;P1~3Pl@`FlW3Pgg`KWDEa`G`A0<02P000;P1~3Pl@`FlW3Reg`2m]d6lL5l4@3 +03`0~2RAg0C0<0^040~2Pl@`FlW3Pgg\0GD7RdD8PV14oX]M28_3j>Z8oon2Nc@13hGW~3Rd=4 +9H00~23hGI~3Rd<hm\04M@Wf`0P?Q<P0~2Rdd8SE58DVX2J_ooLB2`1>P0~3Pl@@RDG`2l1d;Cf3 +~3M@Pc`8?4<5_9`lL5l4@303`0~2Reg`RAg0C0<0^040~2Pl@`FlW3SDgPDFX1SDgKDH]=2?ma +8;04j000~2Pl@@RDG`2l1d6\L5l4@303`0~2Xl1<0`2h0@0008?4<5_9`h9mfaYe>h]=2?maB?ma +8;02j000~2Pl@8RDG`2l1d6\L5l4@303`0~2Xl1<0`2h0@0008?4<5_9`h]52898AB2;G@R;BdB1 +hH00~23hE;~3mT<h17@9^080~2j`B;`3?0Red8SD]8DH_8DFX0og<P\0CX~4Pl@@RDG`2l1d6\L5 +l4@303`0~2Xl1<0`2h0@0008?4<5_9`c?0Pl@`FlW3~<EH_\Pn`8EUN9A@R9E@`;bG@jPST0M3F2 +>@1d7[h1~3SD00RP680T52PST0M0R;aTJ3n5ilkHUE38]53<H0>Xe80LH188?00XU538e=n57o +=BPc0`3oM@QXS00008]=38]E68]558?\3>Qe6000Pl@LRDGl?C`1~2MDQX^4`306X^J1`e0`1Z +0[04j000~2J;Q<0`1Z0fQ<=@<0JP:`1>P0~3J;Q<0`1Z0VQ@=@<0JP:`1>P0~3Pl@`jOX0~2o85m +o3d1~2MBJnE3D308]E38_j^@P0~2ljEVYJB;nS?0PlWolZkgdDV;`EmNbL>1OO`n0@00MDQX^4`3 +06X^J1`e0`1Z0[04j000~2J;Q<0`1Z0fQh=@<0JP:`1>P0~3J;Q<0`1Z0VQ@=@<0JP:`1>P0~3 +Pl@`jGX0~2o85mo3l1~2MDMX^4`306X^J1`e0`1Z0[04j000~2J;Q<0`1Z0fQl=@<0JP:`1>P0 +~3J;Q<0`1Z0VQ@=@<0JP:`1>P0~3Pl@`jbb=@023OO`2MB>nP3D308]E38_j^@H0~2ljF;nS?0 +PlWolZkgdDV;`EmNbL>;C@b;EOS61140RdGhGek9`h_0EH_\PNc`~3DE8cbHfE4?oooh?\3>PE +o_ooSDglDE2=SA3ooomAJP:`1>P0~3SDglDFX2J50e0`1Z0[04j000~2Pl@dbL<0~>EFRHg`40 +I?le~4RnaTRBd0~3DeIGPn`LRDD@REDD2l1e6H_2j2nHoon3a1aOGU]TS`D0~3Pl@4GL>3OA@0 +MAb;AA3X^iCooc?0Pl@LGeiKI8l5~4Pl@4GL>;CA23jA29CO1VPGT>eJEd53?0Pl@LGeiKI8l5 +~4Pl@4GL>;CO22N@`@3h9Y~3RdDDj<6Goon9AN`;`7DD<l23a1aOGU]TS`D0~3Pl@4GL>;CO2; +0C]557<4j`F;`8]558]el8?648]Mk8_kRlS1j@;cYH_8Pn43ljB;AA3X89Cooh_3Pl@LGeiKI8l5 +~4Pl@4GL>3OAC_MQ@c`8?475mNFfB?1@00~2Pl@4GL>;MAB=OQ2;anP]i_ooUX?^18_?mmTScc_? +3iC1PN7o~3:o69MNR;EO0cbHY:38U=i3_a3hiH~3j0NGoon9AN`;`7DD<l23a1aOGU]TS`D0~3 +Pl@4GL>;AA2;ENb;l8_jReg`Ra^;bl7Y0_>URl^3h@?cY8_bj7BCoon;aX?475mNFfB?1@00~2 +Pl@4GL>;ENB;ANPk`Wd8Rdg`j;:Eoon;AO2;GAB968?048?475mNFfB?1@00~2Pl@4GL<0~<EH_\ +DeIGRoRh~4mPOoM@j3k`;mlZklAhOKQm^7feNioooooo:^mm59Rm5ARoNo0@000;\0~3Qm^7fhOK +[3`03hB7~3?21d7c`9M1\lG7@[?29dDoO30@0007D7Ah?;0HOKT4;[eI3g``80~2M0A2jlV@Pn?n +jl>7fi3g``40~2M@A7Pl\1^Ooooon7o_>^CoOAQoj\?29d1@?AC^^LdNUc44;[UI3g``40~2M@A7 +Pl\1ml<2~3M@R3b`;YN?oooh?SoNU`ooooRCf<<0<00mM7`NL20mN;`X?\1>R@UOooPl@4PoP0 +MB2i~4^P00~2\6B3k0cX`?cooh?436X8JP7X20800:>@<0<0^`00~2FD6;d5h3nXTjPl84ljB7 +fhOKQm^7fj`l00n4Y`0003`PM2<l2G@O?5ad=c`RM6og``40~2M@^9>X?218?;0HOKT:[[dI3g +``80~2M0BZjlF@ml<1~3M;b3hoj`0:[[]?O30@0007D8RCZ3`PB3b`6iooooohOnlji?mm67oZ`l +8[1LM0OcZTk[RXOKdNWcZW<J\2:ZjG[ooon7foO30@0007D8RCZ3`PB3b`7g``80~2M@R3b`;Y +F?oooh?SoNU@ooooml<1~3M0B`0:Z@a`80~3GeiKbL>@EH_\DeIGPn`8RDD8RhRl0@00Rg4@adG` +~4PSh0M2\cd_b;gX_`Ro\c`8?9oo:^Ro^;a_OABHdd3dJ;cR_?0DP`@X8n07GKREG`RdG`Pl0? +P^3`@8U5l<7P0^POU?ooRed8RD<d2l1e2h?8oh?425mNFlW3RdD8RiRl0@00Rg<@PSh0M2_lRm2; +BRb=F@69FRc1h@:;FSB9=0^;oS?0PlWolZj;`_OAB@?aAX8n07GFRed8Re<\`N82Rd\da`@A~4 +Re\dRAdD@@<0<l23a0QOGU_9``00~:EH_\DeIGRo29M@R;nX_O\02ioooooo:^mm6;dHOKQm^\ +?01d2h_klZh;bH_:MO6@RlI8:dD8GeiKbL>@EH_\D6X1\0;X~4Pl@8bL<0~=EH_\Pn`PDeIGRDD8 +RED<RDd@adGl~4adGh~4PWPe00n5K08006J;F3IVPo_oM0n86TV9CA3oAOQVad0foon;A@Sf@4D@ +M1b3OA00MPj2B0P1a`G`A0<07@0008]5n5mNFlW3SDglDOme48]=38]En0?:DH]M2?mc8;04j000 +~2Pl@@RlP;`7@KPT\80\L5l4@303`0~2R@g0C0<0<l1OGU_9`h]Mn0=Mo8UMo7DHRed8PT\80LL5 +l4@301d0~2<l1OGU_9`h]M289k=04?QIl2~2Re=4m\:0REGT3hA=~3ReD<RoZh6P0008]=o0_T +lZj=Oomd0S?oRdGTRGgd2omd8h;<48U3A3_jM@j2B`P1a`G`A0<07@0008]5m2]535mNFlW3RdGl +GeiKbL>;A@b;GOb2O1So6Pn5<P8008]528]8A87Q020000n5808003]M40n3F@0008?k0GDBPTP8 +0LL5l4@301d0~2jc^;`8e=n55Z0F[oRed8og<P\0CX~4Pl@@RlP;`7@KPT\80\L5l4@303`0~2 +R@g0C0<0<l1OGU_9`h]5o4QOGU_9`he=n55Z0He=je6;G@SoLb2`1>P0~3Pl@@RlP;`7@KPT\8 +0\L5l4@303`0~2R@g0C0<0<l1OGU_9`h=mn01d?He=n55Z0F[oRed8og<P\0CX~4Pl@@RlP;`0n4 +F`40089;20;71O140`0l~3R@g0C0<0<l1OGU_9`h=mo05e5X]5289820771O140`0M~3jcb=@02= +COQAJP5Zoh]M2?mc8;04j000~2Pl@@RlP;`7@KPT\80\L5l4@303`0~2R@g0C0<0<l1OGU_9`h]5 +o4QOGU_9`h]=o3U=40n6eP0008]E38]el8]Mk8]528_0RdPPRgQ@>GTDMA6;N5@iNAQo2KT1~3 +j`B;`3?92lUd6X98AA22B0P1a`G`A0<07@0008]5o5mNFlW3PGQDn0l000nD`@[9M0n;B52;2HU8 +D<M0E000~2RdPPRgQ@>GTDM@R;LAP[L5C[2h]`E?ONPLKh3`00Rgd@>oic1X_Oj`B;`8_NRGGT +Rg1@RdQDRDGP0o63aPR;nX_3RlS1j@;cYH_8RdGPPn43ljB;MN@3d`5Mo8]8E0?;RDQDRdgl>Dd@ +3hLhooooRdGlGeiKbL=ERnaCEUN3k1B9A@R9E@b9CA37AO00~3PWPe07D=j22foon9AO3Y<P40 +08]52?I0>0Ad4X]888]958U8D8]888]968U8E8=m400?Q]d0~2SD00RdD8PGQDn0l000nD`@[9 +3hA4~3RdQ@R`T;bG@6RDQ@jbclRed8Rd<Pj?D0~2PoP1M@n2B`P2RdG`Pl@DGeiKbL>;A@R;F22; +FaB9F52;A@S7@5@0~3Red8Re]Dmm^1`oP?~2REg\RdD@>mQf0n\4o8]5k8]M28]kD8]CE0?jPlL8 +ReD<Ro:;b<7Y0_>URlR3h@?cY8_:RdG\ReD@>m1f60?8RDd<:m29EA01AO2;De@3d8UCE>\Eo8]= +405=l8]528]HE0?IREQDj`_lPgd@00n79_oooh]=28]I88]AD3UC57D@RdUD>D\HO`Rh0@000>\3 +o3?02l1d38]=28]I88]9E8U;68]5l8?455mNFlW3~?EH_\Pn`4Dh_HJQ=X010008e=o56`0nP0 +~3Pl@<2l2;`g@Ba`G`A0<03@000;P1~3FlW3Regla`<0~3PgP@07DKReglREP@Reglad<4~4ad0P +~4ja>;`8]H58]=o8T;RdPDReglRD\4ReglREPDad0H~4od0P<l1KbL<0~=EH_\Pn`4JP2=COlc +dX?\3>R3~3Pl@@bL>;`5F;k8?\16X1SDgo<m:3k0cXI`0008?44<W3Rl1ERnb3k0aZ08e=mh?\ +3>Q=~3Pl@@gEghPWgg07@:a`G`A0<00P000=e5n<W3Rl1ERnb3k0aZ0He=mh?\3>PM~3Pl@@gEgh +PWgg07@:a`G`A0<00P000=e5n<W3Rl1ERnaCEX?\@8U528UE38U=4<M5l000~2adGX~4adGT0@00 +08e=a8U=m<M5k040~2SDgIRDgL2m9d0XT2Rdd@aP40RcGl@`<0RdD8Rl0cdXX@IX\<EX?Q27@3 +@>_`RDD8ReD8<lV:2X?i:g@@PoT]M0C[38_0adG\~4odD8R`fd:P<0Rh6H0@00Rg04RdD8RP0? +]]QVRaANPn823hFc0@00RhUP0@00>04?Q:D1~2PgdD00n4SP4002Go~3PnQ9PoPU3hMm0@00obB5 +P?H108_0J?L10?Cg0@3dm`40m?L10?Cg0@0Hm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40m?L1 +0?Cg0@3dm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40 +m?L10?Cg0@3dm`40m?L10?Cg0@1Xm`40m?L10?Cg0@3dm`40m?L101Sg0@2i0`000;ZH=@<0Red8 +Rl?XT1P000_03hG0~3Rdd<2lUd1H?30hTIPgg\07@=g@G`=@<0PlA0GU_9`md5l3D30=WPPlA0 +GU_9`nV=~3o;T8~3^Y`e0`2;G@R;`nQ060002l1e;X]=30_9M0F3``R96H=mk01d3Md5d3D308?4 +@5iKbL?M1M0e0`3Ih8?4@5iKbL>i0`000;ZX=@<0Red8Rl?XnQL000_0MBj;C@`;bG@5Pl<3RAV3 +ON`0M0gM1M0e0`23a41NFlW3g@G@=@<0fN23a41NFlW3g@DTC0<0PlA0GU_9`h\M]2X308^cH040 +08]528X8>0ie98^KV04008]c13?KRUP1IX\4GX?P0WD=g@DTC0<0PlA0GU_9`h]5288h<7D>Rl10 +PSP`M?Z9A@R=@02Q]2X308^0V04008]818]528XH3kKCIX\4DH?P0W@MRdGdSDgH>lQf2hPH@8U5 +m>\6SD00odG`odD8jlB;7K@Z0`2;Vf01~2RdD8RPPh2`n5G`000429A@R=GL@iGOAe6h8h<7DF +RgG`SD00@4j2>31dnHUel8U528e00:6d:P<0Rh2H0@00RdP4RdD8RQP?]]=VR`AAPn02M1V;AOB= +CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0lIG@8?4D?QJD0~2Red8@hUM23?0RP>3n2]d3X?h +;G@2j`[7ANCoooooodD8XK@Z0`2;P9P1~2Rd04Red8<lV:2c?KIX\LB?K30WA2RDGPSD00RdgP +RdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc4h7So`0008?S3`?0S@B00l>9ANSoA@S[aX_0 +RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT0@0008]530_0M0F;G@R968e5a3U5m7DPPgg\ +07@=g@DTC0<0PlA0GU_9`md5;4`308?4@5iKbL>1ONQVIVH63h9D~3PggT0GDXRdD@aP01Pgg\ +07@=g@G@=@<0PlA0GU_9`md5d3D30=WPPlA0GU_9`h]54<H00X=mk01d3Md594`308?4@5iKbL?M +1Ba<0`23a41NFlW3RdGT3jm5j8]El0?@REG`RdGdaP00Pgg\07@BRdd@SDG4j9lL~2PlA0GU_9 +`h]=48]El8e5a>R:7000fN23a41NFlW3~=EH_\Pn`@SDgo<m;X=00008?44<W3SD00EH_\Pn`P +SDgoj1h0~2fgg\PWgo07@:a`G`A0<00P000=]]k8?48<W3SD00EH_\DeJ3k529A@R9E@b9CA37 +AO00~3adGX~4adGT0@0008e=]8U=m<M5k040~2SDgIRDgL2m9d0XT2Rdd@aP40RcGl@`<0RdD8 +Rl0cdXX@IX\<EX?Q27@3@>_`RDD8ReD8<lV:2X?i:g@@PoT]M0C[38_0adG\~4odD8R`fd:P<0 +Rh6H0@00Rg04RdD8RP0?]]QVRaANPn823hFW0@00RhUP0@00>04?Q9T1~29Ol0~2PnQ9PoPU3hMk +0@00obB5\?\109Sl0@0To@409?d102Cm0@0To@40B?`102Cm0@0To@409?d102Cm0@0To@409?d1 +02Cm0@0To@409?d102Cm0@0To@409?d102Cm0@0To@409?d102Cm0@0To@409?d102Cm0@0To@40 +9?d102Cm0@0To@409?d102Cm0@0To@40V?`102Cm0@0To@409?d102Cm0@18o040^@<0~2^Z`e +0`2;G@R;`nQP4`002l0?QL00~2Rdd<2lUd1H?30hTIPgg\07@=fbeF=P<0PlA@GU_9`m\]ESH3 +0=WPPlA@GU_9`nV=~3o;T8~3^[0e0`2;G@R;`nP@4`002l1e;X]=30_9M0F3``R96H=mk01d3M\] +JSH308?4D5iKbL?K;FXf0`3Ih8?4D5iKbL>i0`000;Zl=@<0Red8Rl?XbQ8000_0MBj;C@`;bG@5 +Pl<3RAV3ON`0M0gK;FXf0`23a51NFlW3fbeZ=P<0fN23a51NFlW3fbeXA0<0PlA@GU_9`h\M]2X3 +08^cH04008]528X8>0ie98^KV04008]c13?KRUP1IX\4GX?P0WD=fbeXA0<0PlA@GU_9`h]5288h +<7D>Rl10PSP`M?Z9A@R=@02Q]2X308^0V04008]818]528XH3kKCIX\4DH?P0W@MRdGdSDgH>lQf +2hPH@8U5m>\6SD00odG`odD8jlB;7K@Z0`2;Vf01~2RdD8RPPh2`n5G`000429A@R=GK@iGOAe +6h8h<7DFRgG`SD00@4j2>31dnHUel8U528e00:6d:P<0Rh2H0@00RdP4RdD8RQP?]]=VR`AAPn02 +M1V;AOB=CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0lIG@8?4D?QJD0~2Red8@hUM23?0RP>3 +n2]d3X?h;G@2j`[7ANCoooooodD8XK@Z0`2;P9P1~2Rd04Red8<lV:2c?KIX\LB?K30WA2RDGP +SD00RdgPRdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc4h7So`0008?S3`?0S@B00l>9ANSo +A@S[aX_0RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT0@0008]530_0M0F;G@R968e5]3U5 +m7DPPgg\07@=fbeXA0<0PlA@GU_9`m\]`3D308?4D5iKbL>1ONQVIVH63h9D~3PggT0GDXRdD@ +aP01Pgg\07@=fbe<=P<0PlA@GU_9`m\]C3H30=WPPlA@GU_9`h]54<H00X=mk01d3M\]J4@308?4 +D5iKbL?K;L0e0`23a51NFlW3RdGT3jm5j8]El0?@REG`RdGdaP00Pgg\07@BRdd@SDFdj8\F~2 +PlA@GU_9`h]=48]El8e5]>Qf5P00fN23a51NFlW3~=EH_\DeN3k1S7AO00~3REGdmT880W@Ha`G` +A0<020000<M5l?oooooYCP0008_0ReGdRe8hPn8>MAG71O140`0X~3adG`ooooon\^Rl2;EOB2 +NQX1MB>;DPR3hP5e4lL5l4@302T0~2adG`ooooon\8ReGdReY<RAZ3OO3oMA6;GOB2B`P2PlSo +Pl@HGe_9`h]mm8=o@0=d58_IUh_Gj<hG~2Rl^9ANb;an\Bo8_IRm2;AOCXN?;ooh_;RDG\Pgg\ +07@7RdGdaT0J0SU=k7d:PlSoPl@HGe_9`h]5k8?465mKbL<0~<EH_\DeIGPSP0M42;3K@Z0`2; +TKP1~22m9d<?b;f8_k<l23bOob[_OA:oV;LPccYW@56l23f?n;bi4;bGD7Rl9OGU_9`h\B2m9e +dC?0GeiKbL<0~=EE=FEh_\ogD\ogDXogDTogDPDE9@j?`W~2RnEOGU]M`i0005F;k3?0bL<0~< +EH_\<l39``00~;EH_\Dh?\18U528UE38=h@0=d>X]8A8?Q0WDbRdQ<2lUd:h_19Ol?~2M@eA\07X +~4Pl@4j`^;A@R;@4cX_Ggooh]52<M0C000~2Red8Rd=4Pn0P3hEJ~3Pgd<00n5D00008]3;>RB +OOooRd<`j8Ymoon;@b@;`7@6Rd\XRDPXRed8Rd<X2l1d2h]K98UH9>\DSD00RdD8RePTXK@Z0`29 +V;01~2RdD8Pl@4FlWYBWgooh?415_9``00~:EH_\EUN3k0b9A@R9E@b9CO@;dWD7adD<?3<308]m +33?0PlWolZkgdDV1n@@1~2LQ?71O140`02~3<l23a0aOG\W3Pgd807D[^0@1~2j3R0oon9A@P; +`7DCa`G`A0<03@0003?0Pl@<Gek9`lM5m0@1~2ogGdogD8JPGoM@b`1>P0~3Pl@@RDG`2l1d;X?h +KgD>a`G`A0<00P000>\DRl371O140`0l~3RdG`Xl1<0`0c`8?435mNbL>;M@R2?P1d3ob2?Rme +0lH6G4J2?P1elX]E28_j<l23bOob[_OABH8l2Uae48_j<l23bOob[_OABLH42P2;A@R3a0aOG\W3 +~?EH_\Dh?\78U5n<M5m000~2mT080W@Ea`G`A0<020000<M5m?ooooo[>X_0RdGhPWPJ0WDCa`G` +A0<070000<M5m?ooooo[78]5n8]0>8?P2GDAa`G`A0<07P000<M5m?oooon3OOCoMA2;COR2B@P2 +PlSoPl@LFlW3RdghRe4@2m9d54Z9DA0c`8Y44AR9AOCYm@0008_0RdghPgU00`n4L`0008=i100? +QDd0~2Rd4<?@0P~2L`?[1_bh020008_8RdGhRe0lj6[[oon9AO0;`7D?adGdooooonVZ~3SD00 +Rdg`ReghRe=<Rl?X_93oohU318];C8T;RdGhR`R=F@6963?KRQV9GOCoB0CYMP0008e008]5n89h +=@5d1X9h=01e;KT1~3SEG_RdGhj07[ool;`7@=<m^:GNn9GOC[AXe00<M5m?ooooo[>Xe00;T1 +~3ReghRe<lRl?Xd^[oo`_0Rl=d6;T1~3SEG_j3N@oolcbHY=khU=m>\8o<M5m?oooon3OOCoM0N; +AOS6@1X1RdGdPl@LFlW3~?EH_\Pn`8DeJ;l0nfbX?11K\1~3<l23nAl?Wl188mR;a]?SREghP_X7 +L`cgdh_88l^9COc[<Ob=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5fW@4RmS[1B]5 +n8_HREglRdGlGU_9`oaERnb3k0QCEX_`3kK:Pl45^`40~2<l23nAl?Wl188mR;a]?SREglP_X7 +L`b;b3?;RDghjcN=@02=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5fW@8RmP3GOc[ +1_`[AOb;f8UMn8]5n5iKbL?lEFRHg`40I?le~4RnaTRBd0~3DeIGPn`P<\V;`0nf`H\dQOA40`0; +mPn4QP4008_ASD[i^040~2<m^2nAl?Wl=;8l?Ch8_:mm28AN<coh]Mj8e008Y63H?P7hU5k0n4 +5@4008_IR]>;a^PJooooRl^;f8Y@3H?R7c]Ek0n5k`0006J1N0kEY@n4h`0000_oMA\?]]6=59Gd +A0<0REGTR`J90X]Ei8\BREG`j`N;1XT7RDG`<l2:@`gf`40?Q:<0~2Pgg\0GDUR]69CMb;aX?\ +2>Q2o_ooPl@8D;01j000~2RdgLPl@4jG`0~2RmV:dh_6j27noon;bh_HRU0=Pn8OPoX1OAF3b?n3 +a21OGU]TS`D0~3Pl@4GL>:@`gnb8Q33BGo~3P^2oR4<=P_T7LPJ:AN<P@`^2B`dP3kK1RaB5n4@3 +08TCRAb5n4@30<M31000~2P6<:06J1H`P00>\5o89>3D2;MO3[?8e008_nRcK[<h_0RGG`2ome +4@nf`H\FRAB5m4@30>\7SD00R`J91hU=g8\fogG`\07X~4RdgLPl@42oH?QJ?noon9GNR;`D62 +nA0?PUcnoolc`8?485mNFfB?1@00~2Pl@4GL<0~;EH_\Dh?\18]H387kl0l007LVTnSXN_ooRlR; +`hU8C0_9MDG71O140`0=~3^040~2Pl@4FlW3RmQZ4omc38e;C56`0nP0~3Pl@<2l2;`g@Ea`G` +A0<03@000;P1~3Pl@4FlW3ReQ<RAPc`8?415_9``00~=EH_\DeIGPn`<PcP0MCR;lX_iRmRjH000 +0;P1~3j6d?~2RmJ;ci>9GO0;fgDPa`G`A0<03@000;P1~3Pl@<GeiKbL>;68UMl8=SA23f@Q01 +M0N;GO22Bd@4mT4@0G@7Reg`PT]44?I1409d3OI240Qd1h]Ml89;A@;f@A04M0gf@Q0@M0N;GO22 +BdD4mT4@27@7Reg`PT]528_`RcZ;GO29Nbb;NQB9Nc2:0HQ3=8Y10HQ3=H_6I\M3=_ooPWT10G@6 +mT8@17@IReg`aT<e0LM3@0<0~2ad<<~4ja>;`8]Ml<M3@040~2ad<<010008]Ml8=k@0=d8h]i +48?W17D:RgT<RG\<ja>;`8]J48?S47D9RgX4Reg`RG\<ReT4ReG`REXhaT8J0<I2G0?7@UP0~3 +PcP0MC2948\M]2X308^K\04008UJ9<M2:000~2ReXT2m]d0hUC::6d:P<0Reg`RIR`0@00<l23 +a0aOGU_9``00~:EH_\Pn`PRlZARDgh^@X0~2SEG\j3\0~2RDGl^@80~2SEGh^6<0~2j1KPoonQ +]2X3089890:hH`000>QGiOooPl@PbL<0~=EH_\Pn`\DeIGSEgeREglREGh2l1e4<H2<8e20LH0 +08_2GeiKbL>;GOa;REglaP<02l1m2h?i2WD6mmS60Re22l1d8X]eo8_0RmY>RoTcd_OgQmZCRX2H +=P<0R0J;``_KMNJ9MOb;OOb;mc?0PlWolZkgdH_1Ro[1j@;cYH_8Pn43ljB;AOQOGU_9``00~; +EH_\Pn`@EXU528U=40_BM@Dc`5k9`h=m401e1X?8oek9`hUEo88j07DARdD82l1d1FK7~3<l1N +bL>Q]2X308^0D040088h0GDJRdD82l1d2h]Eo6HcbHX:IXT8^040~2G\W3XK@Z0`2;P:P1~2RDGh +2l1e3LM5m?oooooYF0000?c7AO@0~3RgGhRPJ8AO4:`0n4@00008Y60HQ5l0[0M3J=@02;AOb: +03Y5lG8>>TG`M`W7AO@1~3jaR;aXe`0XX>R4ga2\Ud2XY00hQ5l0[0MM29MOR3OOCoM@J3b?mN +bL>3OO@0MAZ;M@P;mW@;RdglIS?0RP5VR@Jh0@0005k9`h=m409c1X?8oek9`h]520_0M1R;COb: +4HQEld69COb:2HQ=lVJ;CO9VR@Rh0P0005k9``00~<Rd@T18]D90R;C2@<Pn`<j239oon3a0c3 +<lT?\a0CbH_1`hOKEH_\DE9@oeDDbL>@D>Qfe?ooQ`@T`hOKEH_\S<WX9@0008cIj1h0~2S<7X +5`0008cQj100~2S>WX2@0008cAj080~2bL<[dPl3dHT@Pl04`i00EH_\DeIGPn`8RDD8RED<RcGl +@`<0SD00<m^:66J;55j3hPQd0d3[l8U528]528X02\1d13`\M@fh0@0008?425mNFlW3RmV;A@SX +d@d008_;RDD82l1e5lL5l4@300d0~2^040~2Pl@8GeiKbL<;bG@LRdD<ad0401000<M02000~2 +aT0<0LM041P0~2Red<a`<0~3RgD8RG<DRohc`8?9oo:^mm590o5>RGG`Ragl@`<0Rl0cbHX>IX\4 +Bh?P27@3C^_`RGG`RdG`@8U5l<H003?0Pl@8GeiKbL<0~<EH_\DeJ3k0b9A@R9E@b;2XU=m0_9 +3hBM~3PgT807@PmT0h0Pn4P0000<L5l4@300T0~2^040~2Pl@<GU_9`h]52?I0>08?Q5d0~2RdGd +Rd0@Rc0;mW@hReg`SD00RaiF\07X~4Pl@42l1d6lL5l4@303`0~2Xl1<0`2h0@0008?435iKbL>; +l`_KMLj;AOB;F1370`00~2ReP@REPDad0H~4RdGdod08jM00~2Rl2;G@Sf@cP1M1K71O140`0: +~3^040~2Pl@<GU_9`kPT~3j7mdoon9AO@;`7DFa`G`A0<03@000;P1~3Pl@<GU_9`h]=38]em8Ta +adH@~4RlKX1>Koo`_0RlId4NS]L?oo^040~2Pl@<GU_9`h]M28]3<>Sn2`00RegdRD<<2l1e4h_3 +j<E`oonh0@0008?435iKbL>;GOC7@`P1~3ad<4~4XK@Z0`2;P;P1~2R@<;`7@3REP4XK@Z0`2; +GOB9V;P1~2<l23a0aNFlW3~=^040~2``00EH_\EUN3k0B;20_9M0J;D0B9D@B;B0@;bG@9Ra29 +4N\ASD00Ra2;3K@Z0`29TKP1~2Rg0@2oId6Xe008_>RoR;<E6`0NP0~3RlN3a0@;mWGYRo2;APcX +2g3ooh_6Pl@4Gek9jOi_ool0~=EH_\DeIGRo2;gX_j\02ioooooo:^mm6;dB_jQm^7fi2\?01d +2o:^:oX;bH_:M?6@RlI8:l=OGU_9`i00EH_\Pn`4DeIG2lUe1c?0GeiKbL>9COb;?Oa30`0cbHX: +RQP?]_=VRha?10@006HiS7L41000RdglMC\:fg@gB@_9M3:9COa0@X\mo4<303?9RPZ:60nflfJ; +S4l41000ISV<M`@4~2RdglM@T:fg@5B@_9MLj;?Oa30`0cfhXHIX^4G`@4~23ko0<m^:6VJ;W5l4 +10003koK:l=OGU_9``00~=EH_\DeIGPn`XRo:9CA29AO2;7Oa30`0cdXX@<lUVR`aCRmKf`@Qd +6h_`Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUMl>\=o8]M +l88k:gD4@hUMl8_JRo2=CMR;EA2;AO3X5PX008_CRlH;dW@@PggT07@8RegHRA[[0ob90X=mj01d +5<L5l4@30040~2<l23a2QOGU_9`h=mk01d<h=mh01e2H5mg000081f5lL5l4@30080~2^0000823 +a2QOGU_9`h]5g?OHPl@XGeiKbL>3ON00M@V1OMcooomoMQO71O140`02~3^?ooogn3a2QOGU_9 +`h]5g8?4:5mNFlW3~>EH_\DeIGPn`XRo:9CA29AO2;7Oa30`0cdXX@<lUVR`aCRmKf`@Qd6h_` +Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUMl>\=o8]Ml88k +:gD4@hUMl8_JRo2=CMR;EA2;AO3XkPP008_CRlH;dW@@PggT07@8RegHRA[[0ob90X=mj01d5<L5 +l4@30040~2<l23a2QOGU_9`h=mh01d5LL5l4@30080~2PlSoPl@XGeiKbL>3ON`0M0f;AMcgf8?4 +:5mNFlW3RdGLPl@XGeiKbL<0~>EH_\Pn`4RDGlR`gl@`<0<m::46J;S5420P00R0P:bG@LSD00 +@8\=o4<303?BRQ1VRhaA0P8008P82\Ueih]5o<W3~>EH_\Pn`4DlM5o?ooooof@PP2M1371O14 +0`08~3jF40~2o89j6P9e5\L5l4@30240~2PTX80^U7~3SD00RdXhPn49MA371O140`0N~3PTX8 +0^\\PgX@0W8>a`G`A0<07`000>\JRl2;BQ2=F@69FQ28A0XHaT8J0H9R2?j9AOb;AOaKbL<0~= +EH_\Pn`@EXUE38U=40_BM0@;`7D5<l1NbL>;CA29COb;5K@Z0`2;TU01~2PSX13hE;~32lT?Q2\1 +~2SD00Rdd<IX\9IXU=lX9ml`1d1X?8oek9`h9mlP1e2<H00>T40@00RTgbR0R;COa9RDglPdD< +0T0;bGG7jNX0~2Rl23OO`03hCN~3Rl2;C@aVR`UVRDgbPWgc07DHRTgbR0Q02\T?Q;h0~2odgl +jJP0~2Rl2;3K@Z0`2;RJP1~2RDgh2lUe3LM5m?oooooYF0000?c7AO@0~3RgGhRPj8CO4:b@n4 +@00008Y>0HQ=l0[9M3J=@02:CO<jCO5b43Y=l7L;adGd0@000>\JRl2;cXea0XXFR5Ga2]9d2XY9 +0hQ=l0[9MM29MOR3OO@1MB>;COb3n@9b;hYElhP@SG01RUGbR1J3j@:9COb3`0;[2He008?8oek9 +`h=530:3OO`03hDTooooRdD@:dGlG\W3~?EH_\Pn`<D`_0M@Dc`5_9`fJ9EOJ2OOL0M@f:COJ8 +2;P1~3FlW3R`fd:P<0RhU@0@00PST1M@J3b?mKbL>;3K@Z0`2;RJP1~2RDgl2lUe3lM5n?oooooY +FP0008e00<M5n000~2RdglRQ68EOD:dPn4@00008YA0HQEm0[BM3J=@02:EOLjEOEb43YEm7L; +adGh0@000>\JRl2;dHe:0XXIR5ge2]]d2XYB0hQEm0[BMM29COb3OOP1MA>:GON8642:GOJ86;P2 +~3FlW3PlSoFlW3~>EH_\Pn`<<lTcd[QR~3j2CDoolc`8?43<W3~=EH_\<l39`oaERn`c`<W3~= +EH_\<l39``00~;b0h005JKfGglVmT]b3H309_Kh]W^PoX0O0j1nX0C~23hfU~3j`b1nX3\ool? +SY80~2Ro2h~4[3`0M13L3L0f0`0T3hU5m=Y5m>_[PoX0M5ao;oOJRl:3h3l3`8d4P=^Xf3H30=ki +Rl8U`1l007@m`NP60l2=183KZ5Pi0`3NnN\[Rl:3h3l3`8d4P=^Xf3H30=k9Rl8U`1l007@@`NP6 +0l2=183KZ5Pi0`3NbM\]C3H30=SIVmoPWW@DVmoPZ11d4<H10^\;gMSK;D`f0`360@6Kfn:KfFgl +G\W3T0000<P<~2EY_IOObKfBgD=P<0Vm_RfNj3nP1l2X7j008007ekj`b1nP3nool?SXH0~2Ro2h +~4[3`0M13L3L`f0`0T3hU5m=Y5m>_[Rl:3n01d>7l2mmR;l8?P?`?0S@B0fjSH=P<0RlHU`040 +07@@`NP60l2=183KZ5Pi0`3NbH?j07d4g_W[0]k9gEgdgDGdg1GP=@<0VmoPWWH=gMSM1NPe0`36 +0@7[3m`Ef3D309_Oh9ic0lH10Y_KhY_IKOaNbL>@EFRHg`40I?le~4RnaTRBd0~3DeN3k0R;fPn_ +f8_3j<EZoon;b8U=m0_9M1`cdXYAoOK287@B<l2;nH_;`NT2lj^;bh?Q0o>ZRdGdPl@8Ge]TS`D0 +~3Pl@4GL<0~;EH_\DeIGPn`\RDD8RmR9E@b9CA37ANP0~3REG`Rd\<>D\43i?02\1d:8]CC8_3 +j<n@oon;bc]137@8Pl@\GeiKbL>;A@R;F4b96<M01000~2ReD8PgY00Pn56`4008]J32]J18UM +i8]Ml8_k^0X0~2RgD@Rlh;i?:^SGooM08coh_>2omd<h_go8_6:l<[b8eN0G@OSE7oRo^h2P00 +08_:2nCb[Xeoog@2<on;bX_g2omeeXUMl8U=48]El8]e32_FREG\2m8?QZ`0~2>eGT3hMD~3Red8 +Rc^;`X_8`NT2ljF;b8?Q0o>TRlZ;0`?1R@<3B`B9B`B;Ddb;`nSoSooo>d<4M0R3a2aOGU_9`h]5 +28]HC8THad04~4RdG\RDGXjDl0~2Red8Rd\42lUf9X]CC8_3j<B?oolk@`Ad28?4;5mNFlW3RdD8 +ReQ<RAS7@0@0~3Reg\Rl^;E@b;A@SXV8ooohU5j3_3M0R3a2aOGU_9`h]=40_93hJe~3RgGXRegP +RdD8o8]@32]@18UEi3_AMPN;fN\6SD00RegTRGGDRDgHRl^9CNb;>8]El8_bRDgL`NT2ljF;bh]M +e8?Q0o>TRdgHRggLRo>;60?ORAP3ehUEl8]H10?OREP4:ll3mh]@33_J3i?32]^;gg@h2lUf=8U= +g8_:RoR;EdcXnHkooh]=g9N;D0`knW@>RlL3aR_2Pl@\GeiKbL>;D4b94<M01000~22lT?QeSo +oon9MNR;ANR3a2aOGU_9``00~<EH_\EUN3k0R;d8_j<l23bOob[X_jmm59@H_1j0aXoon;d8_7 +REGd2m9d7H_g<l23bOob[_OARl6;n\7Y0_>URlR3h@?cY>\:a`G`A0<03@0008]5m8?425mNbL<0 +~;EH_\Pn`DDeIGRDD8RED<RDd@ad4@~4ad4<~4ad48~4ad44~42m9l2X?j0G@5PoXTOPn;AA37 +@101~3GeiKbL>3O@`03hE_~3RdD8PSP`3hEG~3@8U528X0?7Qd13aHMC6Q]2X308^0V04008]@ +18]5240cfhXH<lUVR`aJm\41M129A@S7A@`@~3jF@0~2o8]54<M03040~2adD<20000>U=~3Rl37 +A@`:~3jCl0~2Pgd<47DiRdD8PSP`MC6:@04lN7@4?5Qe9Z6d:P<0Rh2H0@00RdP4RdD8Pl02<m:: +43?KIX\LDOK30G@3RDD8adGl~4Red<PlSo<m;glhU5n8UEm3?KRdD8RgG`Rl29GNb;3K@Z0`2; +RIP1~2RgT4RPP?]]TcdVJ;55n;GNcf`P9d3h7Qo`0008_aPnh`jcN;`8\=]2X308^9V04008]i +13?9RPR=34lcdVJ;4OK60G@@IX^a10@000nomX?^En\6o;kooomoRdd<>lif>8]=4<M13040~2 +Rdgh>mUg2C_IMA<kMOAf3X]=4<M12040~2<m_[2X_;Red<3joI0mi0jESooon9GOb9A@R;CA2; +EOb9D@B;E@R94EmNFlW3~?EH_\Pn`XDhU520_BMC>;fVXHSDgHDFX1D;04j000~2Rm>3a129AO`; +`7@@a`G`A0<05`0008?8oe_9`c?0FlW3PoX6M@[7AOQ28000jc7lPoX4M@_7AOQ08000jb:;`8?j +0WD;adGh@B000>\BRl371O140`0T~3PlSoFlW3JP3oMOQZ0FX0JP2=CO1ASDgdDOme2;08j000 +~2Pl@PRDGl2l1e4_mem;01j000~2Pl@4<l1KbL>;AOb3n09d3h?h0g@:PoQkM0F3n6ie3<L5l4@3 +01L0~2jbj;AOb3n0Ed1H?h87D?a`G`A0<060000>\ESD00a`G`A0<0?00008]5o:?0C0<0PlSo +FlW3~<EFRHg`40I?le~4RnaTRBd0~3Pn`HRDGl2l1e7<L5l4@300`0~2PlSoPl@HI8l5~4Pl@4 +GL>;AOb2N3D0M1O71O140`0W~3adGhooooonUO~3o8]5o8]888U=n?I0>0Ad2LM5m0@0~2j`O7 +AO@0~3RdGlPWPd0GD<adG`0P000>\:SD00adG`~4RdglmT5587@8^100~2j`?l<l2;EO@;EO0; +d8]5n>P62000RdGhPl@HI8l5~4Pl@4GL<0~;EH_\Pn`8SDghDHe=o56;b56`0nP0~3Pl@<2l1e +5H]=o87Qo`0008?i0GD7^040~2bL<c`<W3~<EH_\Dh?\68U5287j080007@KPOX0@000M1?71O14 +0`0T~3PlSoPl@HFlW3RmZ=AOA@SDGhD8]5252`0nP0~3Rm>3a0`;`7@Ca`G`A0<0:`0008?8oh?4 +65_9`h_JRdD8j6`7~2Rm=VRDG^mTGho`nE`H7Qo`0008U=l87j080007D6<l3[1h_0^080~2IX]M +kVJj701V8m<?_m8;AO0;d8]52>Sh1P003koKm\<2M0Rk04000>\6o;\0P000Rl>3a1QKbL<0~> +EH_\Dh?\;8U528UE36XHSDgHDFX1D;04j000~2Pl@@2l1d4lL5l4@301L0~2PlSoPl@\FlW3Red< +I\M30P00I\M32000I\M32P00SEGHRl?XAPL006K7@`@003?0IX]5k?K047@=I\M31<11jI80~2 +Rl1VRdG\Pn083hF3~3RdD<IX]H16J1b`21IXUH16J;CNb3h@5e1h3;P6J9F0B;C@R9COR2>@1d +2D62>@1enXU=n8]5n8eHo8UMn3]M27I1PS\^MA6j@3<308?X0nR_1`002l1d9;Y4<`<0Regh@h_3 +j9\7~22l2;`g@>^TPc0`3XR`L000_0M@N;A@b2B0A0Ragl@`<0RdD8<lV:26J;W4\41000IX_; +P_UQLR>2nGYg7X9h0CYe687So`0008?[HH]536J9F0aVRAS[8he008e=l56=COAA\0;X~4Pl@8 +ReGdBX]=36J9D@aVRA4c`8?4;5_9``00~:EH_\Pn`dRED<JP1X4B0006X1JP1Z08e=n56=COaA +D;08j000~2Pl@PIXU5mVH;`7@_IX?h17D<a`G`A0<06@000>\EIX=mmVh?UL0Uo`0008?05j?` +A0<0PlSoPl@dbL=Z68e=g55Z0Omeo;04j000~2Pl@@IXU5mVH;`7@Ya`G`A0<0?00002Goo`00 +Xl1<0`3oMOb`0NP0~3Pl@4PlSoPl@dbL>3O@`03hGF~3SDg@DK01j000~2Pl@4IXU5mVH;`7@Y +a`G`A0<0?00002Goo`00Xl1<0`3oMOb`0NP0~3Pl@4PlSoPl@dbL<c`8Y5e8Y=i8;Qh2@O2\R8 +CN@c`8Y5eFJ;CNAVPN4Oo\7P1FHUo`5V2lQVRDgT<l1VRdGF;K`7~2RTgUP>41dN0:b8Q=iC?0 +RTGBVH?R0@?2dOR:CNJ2hN0T7`[8R4gV<l2:AM5VRdgVIX7Q7oS1h0EV9Ol7IP_8IXU=iS?0RTG@ +RTgWP>47`N032\R8CNOYT00008_0RdD<Pl04j0eNoon;b8]138YEi8;Rh2@O2]28ENB;@A10IX]E +i6J1hQon`N05IRGo0FH;d6J9ENB;@AB3j52:ENF0hP7Ah0[@R5GUR`6ITX?P0@?@dOZ:ANHTh8;R +7`[2R4GVRe44IX]5iVHU7oS1hPEVPN;o1fH;`VJ9ANJ;@@R:CNN0h@O1h0<:b8Q=ifXHSDgLDFX1 +ogGl\0CX~4Pl@@IXU5mVH;`7@Ya`G`A0<0?00002Goo`00Xl1<0`3oMOb`0NP0~3Pl@4PlSoPl@d +bL?oMOb`0NP0~3Pl@4IXU5mVH;`7@La`G`A0<0?00002Goo`00Xl1<0`23b?n3a3C9`c?0Pl@d +bL<0~=EH_\Dh?\13goo`00O`@;`7d8<l23a0AKbL>3?CQ<0`00MAF;f>Pj0@002l2;`gD8<l23 +a0AKbL>;7CQ<0`0i@cao5H_Hj280~22l2;`g@8<l23a0AKbL>;7CQ<0`2=18>3`423a0AKbL>; +`5EXV=l106Co=@00~2Rnb3k1QTRBd0~3Dh_HSDg\DK01j000~2<\3X~4Rl>3a0@;`7DMR`dhC0<0 +RDgladGh01000<M5m?03~2jD\0~2o8\=>4`308]I?3_HObn=39V3`D29COa0:l?1h098VH7Ro`l0 +00?2`OP<@<7P38U5n<M5m004~2ja6=@037AO`0~3adG`~4Rdgl2lUd:FP@1000ogGhDK03j000 +~2Pl@<RDG`2l1e3h\=>4`308]A?0=Em8UA?3;0j000~2SDgXDK01j000~2Pl@4RdG`Fh_UI8l5 +~4Pl@4GL>=@01EJ9SO0@1TocD0~3RnaTRBd0~3Pn`lSDgXDK01j000~2<\3X~4Pl@4PcdhC0<0 +00n5i`0008e=k56=CNAA\0;X~4^B@0~2SEG@RdG\R`3X@>Cooh?428e=d8U=m89md01d2_a1PST0 +MOZ9COC7AOa<<`<0PSe<<`<007@C^D`c0`2;`462>@1enXU=o8e008]5o8e8ohU=o88i;WD6PnP2 +RDGlRdgdBHU=m8X1ReGlR0:=EM0kbWOGJP=XC3<308e=n56`0nP0~3Pl@<RDG`2l1e2h]=n8T= +>4`30>\jPgg`0WDdJP=X010406Q<<`<0SDghDK04j000~2Pl@@RDG`2l1e4h]=n8T=>4`303?0 +j>Wmoon9AO0b`>P0~3SDgPDK01j000~2Pl@4XCQ<0`23a3aTS`D0~3Pl@4GL?lEH_\Dh?\28_J +j4;moon;dhU5n0_0M@YVPlSoPl@8FlW3RdGhIXT@IX_2Pl@8FlW3EH_\Pn`8j1Gmoon9AO`;`7D8 +IS?0Pl@8bL>;COaVR`63a0S9`he005F;k5>3k0R;f^SZo?ooRm>9AOP;`7D:IX?8oh?425_9`h]5 +n6H;46J946J;`X?425_9`oaERnaCPn`8Rm[X]_cooh_CRDGh2l1e23?0Pl@8FlW3RdGh3kl03koB +QM0?UL0Uo`0008?425_9``00~:EH_\DeN3k0b;fX_h<lV=D`R=@`[X?`0008U768_8SE<4SD<6 +j2l0~2RDLDRdlHRm>=@`;X7`0008_CRlR;ahU878]:38U846K7@0H108?435mKbL>=@01ERnb3 +k2QVPcX0MA5VPcP0M@\;bG@7Rl63a2S9`hX8Pn4OdN69CMaVR`R1hOl7~2`NT5RDgPRTP1PN7o +~3`NT3RDgTRPZ3hAn9CNQVR`Z1hOl1~2`NT5BHU=k8Y:0H7Qo`000=7YPl5@RDg`adGlooooohe5 +g>QOZOooPl@XbL<0~=EH_\Pn`4DeIGRlZ;7Oa30`0cdXXARDglRPP?]_UVRkAC10@008]Eo6Hi +]7\41000MCD:bG@aRl10SEX1R`gl@`<0<m::4hUMo8XH3kKkIX^dD@@4~2ReGlISVdN@@4~2M@@: +fgGARcgl@`<0<m^:66J;Q5l410003ko0<m^:6VJ;W5l410003koK:l=OGU_9``00~<odeCAe=5 +Ac<b0060~2E2T108d5:2T2051ERnb;A@B7A@R9A@AMj@00~2o`00ool0~9 diff --git a/support/vvcode/checkos.h b/support/vvcode/checkos.h new file mode 100644 index 0000000000..630b1b15c3 --- /dev/null +++ b/support/vvcode/checkos.h @@ -0,0 +1,476 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "checkos.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** [tbs] +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + + +/*- +****************************************************************************** +****************************************************************************** +** +** OPERATING ENVIRONMENTS SUPPORTED +** +****************************************************************************** +****************************************************************************** +*/ + + +/*- +**============================================================================ +** Reset the operating system macros +**============================================================================ +*/ +#ifdef OS_MSDOS +# undef OS_MSDOS +#endif +#define OS_MSDOS 0 + +#ifdef OS_OS2 +# undef OS_OS2 +#endif +#define OS_OS2 0 + +#ifdef OS_UNIX +# undef OS_UNIX +#endif +#define OS_UNIX 0 + +#ifdef OS_VAXVMS +# undef OS_VAXVMS +#endif +#define OS_VAXVMS 0 + +#ifdef OS_VMCMS +# undef OS_VMCMS +#endif +#define OS_VMCMS 0 + + + +/*- +****************************************************************************** +****************************************************************************** +** +** MS-DOS implementations +** +****************************************************************************** +****************************************************************************** +*/ + +/*- +**---------------------------------------------------------------------------- +** Reset the MS-DOS specific macros +**---------------------------------------------------------------------------- +*/ +#ifdef MSDOS_MSC +# undef MSDOS_MSC +#endif +#define MSDOS_MSC 0 + +#ifdef MSDOS_TURBOC +# undef MSDOS_TURBOC +#endif +#define MSDOS_TURBOC 0 + +/*- +**---------------------------------------------------------------------------- +** Microsoft C defines the macros MSDOS and M_I86 but since it also defines +** them under OS/2, we check also that OS2 is not defined. +**---------------------------------------------------------------------------- +*/ +#ifndef OS2 +# ifdef MSDOS +# ifdef M_I86 +# undef OS_MSDOS +# define OS_MSDOS 1 +# undef MSDOS_MSC +# define MSDOS_MSC 1 +# endif /* M_I86 */ +# endif /* MSDOS */ +#endif /* NOT OS2 */ + +/*- +**---------------------------------------------------------------------------- +** Borland Turbo C for MS-DOS defines the macros __MSDOS__ and __TURBOC__ +**---------------------------------------------------------------------------- +*/ +#ifdef __MSDOS__ +# ifdef __TURBOC__ +# undef OS_MSDOS +# define OS_MSDOS 1 +# undef MSDOS_TURBOC +# define MSDOS_TURBOC 1 +# endif /* __TURBOC__ */ +#endif /* __MSDOS__ */ + + + +/*- +****************************************************************************** +****************************************************************************** +** +** OS/2 implementations +** +****************************************************************************** +****************************************************************************** +*/ + +/*- +**---------------------------------------------------------------------------- +** Reset the OS/2 specific macros +**---------------------------------------------------------------------------- +*/ +#ifdef OS2_MSC +# undef OS2_MSC +#endif +#define OS2_MSC 0 + +#ifdef OS2_CSET +# undef OS2_CSET +#endif +#define OS2_CSET 0 + +#ifdef OS2_EMXGNUC +# undef OS2_EMXGNUC +#endif +#define OS2_EMXGNUC 0 + +#ifdef OS2_GNUC +# undef OS2_GNUC +#endif +#define OS2_GNUC 0 + +/*- +**---------------------------------------------------------------------------- +** The IBM C Set/2 compiler defines the macros __OS2__, __IBMC__ & __32BIT__ +** When the migration library is being used, the macro __MIG__ is also +** defined. +**---------------------------------------------------------------------------- +*/ +#ifdef __OS2__ +# ifdef __IBMC__ +# ifdef __32BIT__ +# ifdef __MIG__ +# undef OS_OS2 +# define OS_OS2 1 +# undef OS2_CSET +# define OS2_CSET 1 +# endif /* __MIG__ */ +# endif /* __32BIT__ */ +# endif /* __IBMC__ */ +#endif /* __OS2__ */ + +/*- +**---------------------------------------------------------------------------- +** The OS2 Makefile defines the macro OS2. Eberhard Mattes' implementation +** of EMX and GCC 2.1 also defines the macros __GNUC__ and __EMX__. +**---------------------------------------------------------------------------- +*/ +#ifdef OS2 +# ifdef __GNUC__ +# undef OS_OS2 +# define OS_OS2 1 +# undef OS2_GNUC +# define OS2_GNUC 1 +# if __EMX__ +# undef OS2_EMX +# define OS2_EMX 1 +# endif /* __EMX__ */ +# endif /* __GNUC__ */ +#endif /* OS2 */ + +/*- +**---------------------------------------------------------------------------- +** The OS2 Makefile defines the macro OS2. The Microsoft C v6.00 compiler +** also defines the macros _MSC_VER and MSDOS (??). +**---------------------------------------------------------------------------- +*/ +#ifdef OS2 +# ifdef MSDOS +# ifdef _MSC_VER +# undef OS_OS2 +# define OS_OS2 1 +# undef OS2_MSC +# define OS2_MSC 1 +# endif /* _MSC_VER */ +# endif /* MSDOS */ +#endif /* OS2 */ + + + +/*- +****************************************************************************** +****************************************************************************** +** +** Unix implementations +** +****************************************************************************** +****************************************************************************** +*/ + +/*- +**---------------------------------------------------------------------------- +** Reset the UNIX specific macros +**---------------------------------------------------------------------------- +*/ +#ifdef UNIX_BSD +# undef UNIX_BSD +#endif +#define UNIX_BSD 0 + +#ifdef UNIX_BSD41 +# undef UNIX_BSD41 +#endif +#define UNIX_BSD41 0 + +#ifdef UNIX_BSD42 +# undef UNIX_BSD42 +#endif +#define UNIX_BSD42 0 + +#ifdef UNIX_BSD43 +# undef UNIX_BSD43 +#endif +#define UNIX_BSD43 0 + +#ifdef UNIX_GNUC +# undef UNIX_GNUC +#endif +#define UNIX_GNUC 0 + +#ifdef UNIX_MSC +# undef UNIX_MSC +#endif +#define UNIX_MSC 0 + +#ifdef UNIX_SYSV +# undef UNIX_SYSV +#endif +#define UNIX_SYSV 0 + +/*- +**---------------------------------------------------------------------------- +** The Unix Makefile defines the macro BSD43 for BSD 4.3 systems. +**---------------------------------------------------------------------------- +*/ +#ifdef BSD43 +# undef OS_UNIX +# define OS_UNIX 1 +# undef UNIX_BSD43 +# define UNIX_BSD43 1 +#endif /* BSD43 */ + + +/*- +**---------------------------------------------------------------------------- +** The Unix Makefile defines the macro BSD42 for BSD 4.2 systems. +**---------------------------------------------------------------------------- +*/ +#ifdef BSD42 +# undef OS_UNIX +# define OS_UNIX 1 +# undef UNIX_BSD42 +# define UNIX_BSD42 1 +#endif /* BSD42 */ + + +/*- +**---------------------------------------------------------------------------- +** The Unix Makefile defines the macro BSD41 for BSD 4.1 systems +**---------------------------------------------------------------------------- +*/ +#ifdef BSD41 +# undef OS_UNIX +# define OS_UNIX 1 +# undef UNIX_BSD41 +# define UNIX_BSD41 1 +#endif /* BSD41 */ + + +/*- +**---------------------------------------------------------------------------- +** The Unix Makefile defines the macro SYSV for Unix System V +**---------------------------------------------------------------------------- +*/ +#ifdef SYSV +# undef OS_UNIX +# define OS_UNIX 1 +# undef UNIX_SYSV +# define UNIX_SYSV 1 +#endif /* SYSV */ + + +/*- +**---------------------------------------------------------------------------- +** If any of the UNIX_BSDxx macros were set, we define a the macro UNIX_BSD +**---------------------------------------------------------------------------- +*/ +#if (UNIX_BSD41 || UNIX_BSD42 || UNIX_BSD43) +# undef UNIX_BSD +# define UNIX_BSD 1 +#endif /* (UNIX_BSD41 || UNIX_BSD42 || UNIX_BSD43) */ + + +/*- +**---------------------------------------------------------------------------- +** The Unix GNU C compiler defines __GNUC__ +**---------------------------------------------------------------------------- +*/ +#if (OS_UNIX) +# ifdef __GNUC__ +# undef UNIX_GNUC +# define UNIX_GNUC 1 +# endif /* __GNUC__ */ +#endif /* (OS_UNIX) */ + + +/*- +**---------------------------------------------------------------------------- +** The Unix Makefile defines MSC when the SCO Unix Microsoft C compiler +** is used +**---------------------------------------------------------------------------- +*/ +#if (OS_UNIX) +# ifdef MSC +# undef UNIX_MSC +# define UNIX_MSC 1 +# endif /* MSC */ +#endif /* (OS_UNIX) */ + + + +/*- +****************************************************************************** +****************************************************************************** +** +** VAX/VMS implementations +** +****************************************************************************** +****************************************************************************** +*/ + +/*- +**---------------------------------------------------------------------------- +** Reset the VMS specific macros +**---------------------------------------------------------------------------- +*/ +#ifdef VMS_GNUC +# undef VMS_GNUC +#endif +#define VMS_GNUC 0 + +#ifdef VMS_VAXC +# undef VMS_VAXC +#endif +#define VMS_VAXC 0 + +/*- +**---------------------------------------------------------------------------- +** The VAX/VMS C compiler defines the macros VMS and VAXC +**---------------------------------------------------------------------------- +*/ +#ifdef VMS +# ifdef VAXC +# undef OS_VAXVMS +# define OS_VAXVMS 1 +# undef VMS_VAXC +# define VMS_VAXC 1 +# endif /* VAXC */ +#endif /* VMS */ + +/*- +**---------------------------------------------------------------------------- +** The VAX/VMS GNU C compiler defines the macros VMS and __GNUC__ +**---------------------------------------------------------------------------- +*/ +#ifdef VMS +# ifdef __GNUC__ +# undef OS_VAXVMS +# define OS_VAXVMS 1 +# undef VMS_GNUC +# define VMS_GNUC 1 +# endif /* __GNUC__ */ +#endif /* VMS */ + + + +/*- +****************************************************************************** +****************************************************************************** +** +** VM/CMS implementations +** +****************************************************************************** +****************************************************************************** +*/ + +/*- +**---------------------------------------------------------------------------- +** Reset the VM/CMS specific macros +**---------------------------------------------------------------------------- +*/ + +/*- +**---------------------------------------------------------------------------- +** The VM/CMS make EXEC defines the macro VMCMS +**---------------------------------------------------------------------------- +*/ +#ifdef VMCMS +# undef OS_VMCMS +# define OS_VMCMS 1 +#endif /* VMCMS */ diff --git a/support/vvcode/decode.xlt b/support/vvcode/decode.xlt new file mode 100644 index 0000000000..85c932d798 --- /dev/null +++ b/support/vvcode/decode.xlt @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# TEST.XLT +# ~~~~~~~~ +# Test translation table file +#----------------------------------------------------------------------------- +xlt-from BIT-REVERSED +xlt-to ASCII +xlt-substchar 042 # asterisk +# +255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 # 255 - 240 +239 238 237 236 235 234 233 232 231 230 229 228 227 226 225 224 # 239 - 224 +223 222 221 220 219 218 217 216 215 214 213 212 211 210 209 208 # 223 - 208 +207 206 205 204 203 202 201 200 199 198 197 196 195 194 193 192 # 207 - 192 +# +191 190 189 188 187 186 185 184 183 182 181 180 179 178 177 176 # 191 - 176 +175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 160 # 175 - 160 +159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 # 159 - 144 +143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 # 143 - 128 +# +# +127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 # 127 - 112 +111 110 109 108 107 106 105 104 103 102 101 100 099 098 097 096 # 111 - 96 +095 094 093 092 091 090 089 088 087 086 085 084 083 082 081 080 # 96 - 80 +079 078 077 076 075 074 073 072 071 070 069 068 067 066 065 064 # 79 - 64 +# +063 062 061 060 059 058 057 056 055 054 053 052 051 050 049 048 # 63 - 48 +047 046 045 044 043 042 041 040 039 038 037 036 035 034 033 032 # 47 - 32 +031 030 029 028 027 026 025 024 023 022 021 020 019 018 017 016 # 31 - 16 +015 014 013 012 011 010 009 008 007 006 005 004 003 002 001 000 # 15 - 0 diff --git a/support/vvcode/descrip.mms b/support/vvcode/descrip.mms new file mode 100644 index 0000000000..2bd1c8156d --- /dev/null +++ b/support/vvcode/descrip.mms @@ -0,0 +1,186 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @MMS-Description-File{ +## FILENAME = "descrip.mms", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This is the VVCODE description file for use with +## the VAX/VMS Module Management System (MMS) - DEC's +## equivalent to Make. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your system is already supported it should not be necessary to modify +# any part of the description file except the local definitions below. +# +# COMPILER/LINKER +# +# CC the command used to invoke the C compiler +# CFLAGS compiler command line flags to be used +# CCDEFINES symbols to be #defined when compiling +# +# LINK the command used to invoke the linker +# LINKFLAGS linker command line flags to be used +# +# The definitions are used to compile and link as shown below: +# +# Compiling C programs (e.g. xx.c) +# +# $(CC) $(CFLAGS) $(CCDEFINES) xx.c +# +# Linking object files (e.g. xx.obj, yy.obj & zz.obj) +# +# $(LINK) $(LINKFLAGS) xx.obj,yy.obj,zz.obj,vvcode.opt/OPTION +# +# where vvcode.opt contains the single line: +# +# SYS$LIBRARY:VAXCRTL/SHAREABLE +# +# Here are some examples known to work. +# +# VAX/VMS C v3.1 +# +# CC = cc +# CFLAGS = /WARNINGS /STANDARD=PORTABLE /DEBUG /NOOPTIMIZE +# CCDEFINES = +# +# LINK = LINK /TRACEBACK /NODEBUG +# LINKFLAGS = /TRACEBACK +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = cc +CFLAGS = /WARNINGS /STANDARD=PORTABLE /DEBUG /NOOPTIMIZE +CCDEFINES = + +LINK = LINK /TRACEBACK /NODEBUG +LINKFLAGS = /TRACEBACK +############################################################################## +# End of local definitions. +############################################################################## + + +#############################################################################= +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) - + vvutils$(OBJ) vaxvms$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + + +############################################################################## +# Top level targets +############################################################################## +vvcode : $(EXEFILES) + @ WRITE SYS$OUTPUT "VVcode built at ''F$TIME()'" + +clean : + @ WRITE SYS$OUTPUT "Cleaning up at ''F$TIME()'" + PURGE + IF F$SEARCH ("*.dia;*") .NES. "" THEN $ DELETE *.dia;* + IF F$SEARCH ("*.exe;*") .NES. "" THEN $ DELETE *.exe;* + IF F$SEARCH ("*.lis;*") .NES. "" THEN $ DELETE *.lis;* + IF F$SEARCH ("*.obj;*") .NES. "" THEN $ DELETE *.obj;* + + +############################################################################## +# Dependencies for executables +############################################################################## +vvencode$(EXE) : vvencode$(OBJ) vvutils$(OBJ) vaxvms$(OBJ) vvcode.opt + $(LINK) $(LINKFLAGS) vvencode$(OBJ), vvutils$(OBJ), vaxvms$(OBJ), - + vvcode.opt/OPTION + +vvdecode$(EXE) : vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) - + vaxvms$(OBJ) vvcode.opt + $(LINK) $(LINKFLAGS) vvdecode$(OBJ), vveparse$(OBJ), - + vvutils$(OBJ), vaxvms$(OBJ), - + vvcode.opt/OPTION + +############################################################################## +# Dependencies for the linker option file +############################################################################## +vvcode.opt : + OPEN /WRITE options_file vvcode.opt + WRITE options_file "SYS$LIBRARY:VAXCRTL /SHAREABLE" + CLOSE options_file + +############################################################################## +# Dependencies for object files +############################################################################## +vvencode$(OBJ) : vvencode.c $(HDRFILES) + +vvdecode$(OBJ) : vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ) : vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ) : vvutils.c $(HDRFILES) + +vaxvms$(OBJ) : vaxvms.c $(HDRFILES) diff --git a/support/vvcode/doc/texinfo.tex b/support/vvcode/doc/texinfo.tex new file mode 100644 index 0000000000..32eec25962 --- /dev/null +++ b/support/vvcode/doc/texinfo.tex @@ -0,0 +1,3229 @@ +%% TeX macros to handle texinfo files + +% Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc. + +%This texinfo.tex file is free software; you can redistribute it and/or +%modify it under the terms of the GNU General Public License as +%published by the Free Software Foundation; either version 2, or (at +%your option) any later version. + +%This texinfo.tex file is distributed in the hope that it will be +%useful, but WITHOUT ANY WARRANTY; without even the implied warranty +%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%General Public License for more details. + +%You should have received a copy of the GNU General Public License +%along with this texinfo.tex file; see the file COPYING. If not, write +%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, +%USA. + + +%In other words, you are welcome to use, share and improve this program. +%You are forbidden to forbid anyone else to use, share and improve +%what you give them. Help stamp out software-hoarding! + +\def\texinfoversion{2.65} +\message{Loading texinfo package [Version \texinfoversion]:} +\message{} + +% Print the version number if in a .fmt file. +\everyjob{\message{[Texinfo version \texinfoversion]}\message{}} + +% Save some parts of plain tex whose names we will redefine. + +\let\ptexlbrace=\{ +\let\ptexrbrace=\} +\let\ptexdots=\dots +\let\ptexdot=\. +\let\ptexstar=\* +\let\ptexend=\end +\let\ptexbullet=\bullet +\let\ptexb=\b +\let\ptexc=\c +\let\ptexi=\i +\let\ptext=\t +\let\ptexl=\l +\let\ptexL=\L + +\def\tie{\penalty 10000\ } % Save plain tex definition of ~. + +\message{Basics,} +\chardef\other=12 + +\hyphenation{ap-pen-dix} +\hyphenation{mini-buf-fer mini-buf-fers} +\hyphenation{eshell} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen \bindingoffset \bindingoffset=0pt +\newdimen \normaloffset \normaloffset=\hoffset +\newdimen\pagewidth \newdimen\pageheight +\pagewidth=\hsize \pageheight=\vsize + +%---------------------Begin change----------------------- +% +%%%% For @cropmarks command. +% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\cornerlong \newdimen\cornerthick +\newdimen \topandbottommargin +\newdimen \outerhsize \newdimen \outervsize +\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks +\outerhsize=7in +%\outervsize=9.5in +% Alternative @smallbook page size is 9.25in +\outervsize=9.25in +\topandbottommargin=.75in +% +%---------------------End change----------------------- + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions itself, but you have to call it yourself. +\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}} +\def\onepageout#1{\hoffset=\normaloffset +\ifodd\pageno \advance\hoffset by \bindingoffset +\else \advance\hoffset by -\bindingoffset\fi +{\escapechar=`\\\relax % makes sure backslash is used in output files. +\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}% +{\let\hsize=\pagewidth \makefootline}}}% +\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} + +%%%% For @cropmarks command %%%% + +% Here is a modification of the main output routine for Near East Publications +% This provides right-angle cropmarks at all four corners. +% The contents of the page are centerlined into the cropmarks, +% and any desired binding offset is added as an \hskip on either +% site of the centerlined box. (P. A. MacKay, 12 November, 1986) +% +\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up + \shipout + \vbox to \outervsize{\hsize=\outerhsize + \vbox{\line{\ewtop\hfill\ewtop}} + \nointerlineskip + \line{\vbox{\moveleft\cornerthick\nstop} + \hfill + \vbox{\moveright\cornerthick\nstop}} + \vskip \topandbottommargin + \centerline{\ifodd\pageno\hskip\bindingoffset\fi + \vbox{ + {\let\hsize=\pagewidth \makeheadline} + \pagebody{#1} + {\let\hsize=\pagewidth \makefootline}} + \ifodd\pageno\else\hskip\bindingoffset\fi} + \vskip \topandbottommargin plus1fill minus1fill + \boxmaxdepth\cornerthick + \line{\vbox{\moveleft\cornerthick\nsbot} + \hfill + \vbox{\moveright\cornerthick\nsbot}} + \nointerlineskip + \vbox{\line{\ewbot\hfill\ewbot}} + } + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi} +% +% Do @cropmarks to get crop marks +\def\cropmarks{\let\onepageout=\croppageout } + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +\dimen@=\dp#1 \unvbox#1 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. +% The argument can be delimited with [...] or with "..." or braces +% or it can be a whole line. +% #1 should be a macro which expects +% an ordinary undelimited TeX argument. + +\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx} + +\def\parseargx{% +\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else% +\aftergroup \parseargline % +\fi \endgroup} + +{\obeyspaces % +\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}} + +\gdef\obeyedspace{\ } + +\def\parseargline{\begingroup \obeylines \parsearglinex} +{\obeylines % +\gdef\parsearglinex #1^^M{\endgroup \next {#1}}} + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +%% These are used to keep @begin/@end levels from running away +%% Call \inENV within environments (after a \begingroup) +\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} +\def\ENVcheck{% +\ifENV\errmessage{Still within an environment. Type Return to continue.} +\endgroup\fi} % This is not perfect, but it should reduce lossage + +% @begin foo is the same as @foo, for now. +\newhelp\EMsimple{Type <Return> to continue} + +\outer\def\begin{\parsearg\beginxxx} + +\def\beginxxx #1{% +\expandafter\ifx\csname #1\endcsname\relax +{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else +\csname #1\endcsname\fi} + +%% @end foo executes the definition of \Efoo. +%% foo can be delimited by doublequotes or brackets. + +\def\end{\parsearg\endxxx} + +\def\endxxx #1{% +\expandafter\ifx\csname E#1\endcsname\relax +\expandafter\ifx\csname #1\endcsname\relax +\errmessage{Undefined command @end #1}\else +\errorE{#1}\fi\fi +\csname E#1\endcsname} +\def\errorE#1{ +{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}} + +% Single-spacing is done by various environments. + +\newskip\singlespaceskip \singlespaceskip = \baselineskip +\def\singlespace{% +{\advance \baselineskip by -\singlespaceskip +\kern \baselineskip}% +\baselineskip=\singlespaceskip +} + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt \char '100}} + +% Define @` and @' to be the same as ` and ' +% but suppressing ligatures. +\def\`{{`}} +\def\'{{'}} + +% Used to generate quoted braces. + +\def\mylbrace {{\tt \char '173}} +\def\myrbrace {{\tt \char '175}} +\let\{=\mylbrace +\let\}=\myrbrace + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=3000 } + +% @w prevents a word break +\def\w #1{\hbox{#1}} + +% @group ... @end group forces ... to be all on one page. + +\def\group{\begingroup% \inENV ??? +\ifnum\catcode13=\active \else +\errmessage{@group invalid in context where filling is enabled}\fi +\def \Egroup{\egroup\endgroup} +\vbox\bgroup} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +\def\need{\parsearg\needx} + +\def\needx #1{\par % +% This method tries to make TeX break the page naturally +% if the depth of the box does not fit. +{\baselineskip=0pt% +\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 +\prevdepth=-1000pt +}} + +% @br forces paragraph break + +\let\br = \par + +% @dots{} output some dots + +\def\dots{$\ldots$} + +% @page forces the start of a new page + +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +\def\exdent{\errmessage{@exdent in filled text}} + % @lisp, etc, define \exdent locally from \internalexdent + +{\obeyspaces +\gdef\internalexdent{\parsearg\exdentzzz}} + +\def\exdentzzz #1{{\advance \leftskip by -\lispnarrowing +\advance \hsize by -\leftskip +\advance \hsize by -\rightskip +\leftline{{\rm#1}}}} + +% @include file insert text of that file as input. + +\def\include{\parsearg\includezzz} +\def\includezzz #1{{\def\thisfile{#1}\input #1 +}} + +\def\thisfile{} + +% @center line outputs that line, centered + +\def\center{\parsearg\centerzzz} +\def\centerzzz #1{{\advance\hsize by -\leftskip +\advance\hsize by -\rightskip +\centerline{#1}}} + +% @sp n outputs n lines of vertical space + +\def\sp{\parsearg\spxxx} +\def\spxxx #1{\par \vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% +\parsearg \commentxxx} + +\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } + +\let\c=\comment + +% Prevent errors for section commands. +% Used in @ignore and in failing conditionals. +\def\ignoresections{% +\let\chapter=\relax +\let\unnumbered=\relax +\let\top=\relax +\let\unnumberedsec=\relax +\let\unnumberedsection=\relax +\let\unnumberedsubsec=\relax +\let\unnumberedsubsection=\relax +\let\unnumberedsubsubsec=\relax +\let\unnumberedsubsubsection=\relax +\let\section=\relax +\let\subsec=\relax +\let\subsubsec=\relax +\let\subsection=\relax +\let\subsubsection=\relax +\let\appendix=\relax +\let\appendixsec=\relax +\let\appendixsection=\relax +\let\appendixsubsec=\relax +\let\appendixsubsection=\relax +\let\appendixsubsubsec=\relax +\let\appendixsubsubsection=\relax +\let\contents=\relax +\let\smallbook=\relax +\let\titlepage=\relax +} + +\def\ignore{\begingroup\ignoresections +% Make sure that spaces turn into tokens that match what \ignorexxx wants. +\catcode32=10 +\ignorexxx} +\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces} + +\def\direntry{\begingroup\direntryxxx} +\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces} + +% Conditionals to test whether a flag is set. + +\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx} + +\def\ifsetxxx #1{\endgroup +\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail +\else \let\temp=\relax \fi +\temp} +\def\Eifset{} +\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx} +\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces} + +\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx} + +\def\ifclearxxx #1{\endgroup +\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax +\else \let\temp=\ifclearfail \fi +\temp} +\def\Eifclear{} +\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx} +\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces} + +% @set foo to set the flag named foo. +% @clear foo to clear the flag named foo. +\def\set{\parsearg\setxxx} +\def\setxxx #1{ +\expandafter\let\csname IF#1\endcsname=\set} + +\def\clear{\parsearg\clearxxx} +\def\clearxxx #1{ +\expandafter\let\csname IF#1\endcsname=\relax} + +% Some texinfo constructs that are trivial in tex + +\def\iftex{} +\def\Eiftex{} +\def\ifinfo{\begingroup\ignoresections\ifinfoxxx} +\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces} + +\long\def\menu #1\end menu{} +\def\asis#1{#1} + +% @math means output in math mode. +% We don't use $'s directly in the definition of \math because control +% sequences like \math are expanded when the toc file is written. Then, +% we read the toc file back, the $'s will be normal characters (as they +% should be, according to the definition of Texinfo). So we must use a +% control sequence to switch into and out of math mode. +% +% This isn't quite enough for @math to work properly in indices, but it +% seems unlikely it will ever be needed there. +% +\let\implicitmath = $ +\def\math#1{\implicitmath #1\implicitmath} + +\def\node{\ENVcheck\parsearg\nodezzz} +\def\nodezzz#1{\nodexxx [#1,]} +\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} +\let\lastnode=\relax + +\def\donoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\setref{\lastnode}\fi +\let\lastnode=\relax} + +\def\unnumbnoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi +\let\lastnode=\relax} + +\def\appendixnoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi +\let\lastnode=\relax} + +\let\refill=\relax + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \readauxfile + \opencontents + \openindices + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \global\let\setfilename=\comment % Ignore extra @setfilename cmds. + \comment % Ignore the actual filename. +} + +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}}, + node \samp{\losespace#1{}}} +\def\losespace #1{#1} + +\message{fonts,} + +% Font-change commands. + +% Texinfo supports the sans serif font style, which plain TeX does not. +% So we set up a \sf analogous to plain's \rm, etc. +\newfam\sffam +\def\sf{\fam=\sffam \tensf} +\let\li = \sf % Sometimes we call it \li, not \sf. + +%% Try out Computer Modern fonts at \magstephalf +\let\mainmagstep=\magstephalf + +\ifx\bigger\relax +\let\mainmagstep=\magstep1 +\font\textrm=cmr12 +\font\texttt=cmtt12 +\else +\font\textrm=cmr10 scaled \mainmagstep +\font\texttt=cmtt10 scaled \mainmagstep +\fi +% Instead of cmb10, you many want to use cmbx10. +% cmbx10 is a prettier font on its own, but cmb10 +% looks better when embedded in a line with cmr10. +\font\textbf=cmb10 scaled \mainmagstep +\font\textit=cmti10 scaled \mainmagstep +\font\textsl=cmsl10 scaled \mainmagstep +\font\textsf=cmss10 scaled \mainmagstep +\font\textsc=cmcsc10 scaled \mainmagstep +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep + +% A few fonts for @defun, etc. +\font\defbf=cmbx10 scaled \magstep1 %was 1314 +\font\deftt=cmtt10 scaled \magstep1 +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} + +% Fonts for indices and small examples. +% We actually use the slanted font rather than the italic, +% because texinfo normally uses the slanted fonts for that. +% Do not make many font distinctions in general in the index, since they +% aren't very useful. +\font\ninett=cmtt9 +\font\indrm=cmr9 +\font\indit=cmsl9 +\let\indsl=\indit +\let\indtt=\ninett +\let\indsf=\indrm +\let\indbf=\indrm +\let\indsc=\indrm +\font\indi=cmmi9 +\font\indsy=cmsy9 + +% Fonts for headings +\font\chaprm=cmbx12 scaled \magstep2 +\font\chapit=cmti12 scaled \magstep2 +\font\chapsl=cmsl12 scaled \magstep2 +\font\chaptt=cmtt12 scaled \magstep2 +\font\chapsf=cmss12 scaled \magstep2 +\let\chapbf=\chaprm +\font\chapsc=cmcsc10 scaled\magstep3 +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +\font\secrm=cmbx12 scaled \magstep1 +\font\secit=cmti12 scaled \magstep1 +\font\secsl=cmsl12 scaled \magstep1 +\font\sectt=cmtt12 scaled \magstep1 +\font\secsf=cmss12 scaled \magstep1 +\font\secbf=cmbx12 scaled \magstep1 +\font\secsc=cmcsc10 scaled\magstep2 +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 + +% \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad. +% \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded. +% \font\ssecsl=cmsl10 scaled \magstep1 +% \font\ssectt=cmtt10 scaled \magstep1 +% \font\ssecsf=cmss10 scaled \magstep1 + +%\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx. +%\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than +%\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1. +%\font\ssectt=cmtt10 scaled 1315 +%\font\ssecsf=cmss10 scaled 1315 + +%\let\ssecbf=\ssecrm + +\font\ssecrm=cmbx12 scaled \magstephalf +\font\ssecit=cmti12 scaled \magstephalf +\font\ssecsl=cmsl12 scaled \magstephalf +\font\ssectt=cmtt12 scaled \magstephalf +\font\ssecsf=cmss12 scaled \magstephalf +\font\ssecbf=cmbx12 scaled \magstephalf +\font\ssecsc=cmcsc10 scaled \magstep1 +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled \magstep1 +% The smallcaps and symbol fonts should actually be scaled \magstep1.5, +% but that is not a standard magnification. + +% Fonts for title page: +\font\titlerm = cmbx12 scaled \magstep3 +\let\authorrm = \secrm + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts, we +% don't bother to reset \scriptfont and \scriptscriptfont (which would +% also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy + \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf + \textfont\ttfam = \tentt \textfont\sffam = \tensf +} + + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this so that font changes will continue to work +% in math mode, where it is the current \fam that is relevant in most +% cases, not the current. Plain TeX does, for example, +% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need +% to redefine \bf itself. +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \resetmathfonts} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \resetmathfonts} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \resetmathfonts} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \resetmathfonts} +\def\indexfonts{% + \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl + \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc + \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy + \resetmathfonts} + +% Set up the default fonts, so we can use them for creating boxes. +% +\textfonts + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\font\shortcontrm=cmr12 +\font\shortcontbf=cmbx12 +\font\shortcontsl=cmsl12 + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} +\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\var=\smartitalic +\let\dfn=\smartitalic +\let\emph=\smartitalic +\let\cite=\smartitalic + +\def\b#1{{\bf #1}} +\let\strong=\b + +\def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null} +\let\ttfont = \t +%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} +\def\samp #1{`\tclose{#1}'\null} +\def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +\let\file=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\newdimen\tclosesave +\newdimen\tcloserm +\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font +\fontdimen2\font=\tcloserm +% prevent breaking lines at hyphens. +\exhyphenpenalty=10000 +\def\ {{\fontdimen2\font=\tclosesave{} }}% + \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null} +\let\code=\tclose +%\let\exp=\tclose %Was temporary + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else\tclose{\look}\fi +\else\tclose{\look}\fi} + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of +% @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} + +\def\l#1{{\li #1}\null} % + +\def\r#1{{\rm #1}} % roman font +% Use of \lowercase was suggested. +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\def\titlefont#1{{\titlerm #1}} + +\newtoks\realeverypar +\newif\ifseenauthor +\newif\iffinishedtitlepage + +\def\titlepage{\begingroup \parindent=0pt \textfonts + \let\subtitlerm=\tenrm +% I deinstalled the following change because \cmr12 is undefined. +% This change was not in the ChangeLog anyway. --rms. +% \let\subtitlerm=\cmr12 + \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% + % + \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% + % + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % + % Now you can print the title using @title. + \def\title{\parsearg\titlezzz}% + \def\titlezzz##1{\leftline{\titlefont{##1}} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt \vskip4pt}% + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Now you can put text using @subtitle. + \def\subtitle{\parsearg\subtitlezzz}% + \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% + % + % @author should come last, but may come many times. + \def\author{\parsearg\authorzzz}% + \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi + {\authorfont \leftline{##1}}}% + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \oldpage + \let\page = \oldpage + \hbox{}}% +% \def\page{\oldpage \hbox{}} +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + \HEADINGSon +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks \evenheadline % Token sequence for heading line of even pages +\newtoks \oddheadline % Token sequence for heading line of odd pages +\newtoks \evenfootline % Token sequence for footing line of even pages +\newtoks \oddfootline % Token sequence for footing line of odd pages + +% Now make Tex use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + +\def\evenheading{\parsearg\evenheadingxxx} +\def\oddheading{\parsearg\oddheadingxxx} +\def\everyheading{\parsearg\everyheadingxxx} + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\oddfooting{\parsearg\oddfootingxxx} +\def\everyfooting{\parsearg\everyfootingxxx} + +{\catcode`\@=0 % + +\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} +\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} +\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} +\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} +\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} +\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% +\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} +\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}} +\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} +% +}% unbind the catcode of @. + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{ +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{ +%\pagealignmacro +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +} +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{ +%\pagealignmacro +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +} + +% Subroutines used in generating headings +% Produces Day Month Year style of output. +\def\today{\number\day\space +\ifcase\month\or +January\or February\or March\or April\or May\or June\or +July\or August\or September\or October\or November\or December\fi +\space\number\year} + +% Use this if you want the Month Day, Year style of output. +%\def\today{\ifcase\month\or +%January\or February\or March\or April\or May\or June\or +%July\or August\or September\or October\or November\or December\fi +%\space\number\day, \number\year} + +% @settitle line... specifies the title of the document, for headings +% It generates no output of its own + +\def\thistitle{No Title} +\def\settitle{\parsearg\settitlezzz} +\def\settitlezzz #1{\gdef\thistitle{#1}} + +\message{tables,} + +% @tabs -- simple alignment + +% These don't work. For one thing, \+ is defined as outer. +% So these macros cannot even be defined. + +%\def\tabs{\parsearg\tabszzz} +%\def\tabszzz #1{\settabs\+#1\cr} +%\def\tabline{\parsearg\tablinezzz} +%\def\tablinezzz #1{\+#1\cr} +%\def\&{&} + +% Tables -- @table, @ftable, @item(x), @kitem(x), @xitem(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table and @ftable define @item, @itemx, etc., with these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\par \parsearg\itemzzz} + +\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} +\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz} + +\def\internalBkitem{\smallbreak \parsearg\kitemzzz} +\def\internalBkitemx{\par \parsearg\kitemzzz} + +\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% + \itemzzz {#1}} + +\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% + \itemzzz {#1}} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemfont{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % Be sure we are not still in the middle of a paragraph. + \parskip=0in + \par + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0 + \nobreak + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. Since that + % text will be indented by \tableindent, we make the item text be in + % a zero-width box. + \noindent + \rlap{\hskip -\tableindent\box0}% + \fi + \endgroup +} + +\def\item{\errmessage{@item while not in a table}} +\def\itemx{\errmessage{@itemx while not in a table}} +\def\kitem{\errmessage{@kitem while not in a table}} +\def\kitemx{\errmessage{@kitemx while not in a table}} +\def\xitem{\errmessage{@xitem while not in a table}} +\def\xitemx{\errmessage{@xitemx while not in a table}} + +%% Contains a kludge to get @end[description] to work +\def\description{\tablez{\dontindex}{1}{}{}{}{}} + +\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} +{\obeylines\obeyspaces% +\gdef\tablex #1^^M{% +\tabley\dontindex#1 \endtabley}} + +\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} +{\obeylines\obeyspaces% +\gdef\ftablex #1^^M{% +\tabley\fnitemindex#1 \endtabley +\def\Eftable{\endgraf\endgroup\afterenvbreak}% +\let\Etable=\relax}} + +\def\dontindex #1{} +\def\fnitemindex #1{\doind {fn}{\code{#1}}}% + +{\obeyspaces % +\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% +\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} + +\def\tablez #1#2#3#4#5#6{% +\aboveenvbreak % +\begingroup % +\def\Edescription{\Etable}% Neccessary kludge. +\let\itemindex=#1% +\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % +\ifnum 0#4>0 \tableindent=#4\mil \fi % +\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % +\def\itemfont{#2}% +\itemmax=\tableindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \tableindent % +\parindent = 0pt +\parskip = \smallskipamount +\ifdim \parskip=0pt \parskip=2pt \fi% +\def\Etable{\endgraf\endgroup\afterenvbreak}% +\let\item = \internalBitem % +\let\itemx = \internalBitemx % +\let\kitem = \internalBkitem % +\let\kitemx = \internalBkitemx % +\let\xitem = \internalBxitem % +\let\xitemx = \internalBxitemx % +} + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\def\itemize{\parsearg\itemizezzz} + +\def\itemizezzz #1{% + \begingroup % ended by the @end itemsize + \itemizey {#1}{\Eitemize} +} + +\def\itemizey #1#2{% +\aboveenvbreak % +\itemmax=\itemindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \itemindent % +\parindent = 0pt % +\parskip = \smallskipamount % +\ifdim \parskip=0pt \parskip=2pt \fi% +\def#2{\endgraf\endgroup\afterenvbreak}% +\def\itemcontents{#1}% +\let\item=\itemizeitem} + +\def\bullet{$\ptexbullet$} +\def\minus{$-$} + +% Set sfcode to normal for the chars that usually have another value. +% These are `.?!:;,' +\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 + \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\def\enumerate{\parsearg\enumeratezzz} +\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + \begingroup % ended by the @end enumerate + % + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a <number>. + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call itemizey, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \itemizey{#1.}\Eenumerate\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + +% Definition of @item while inside @itemize. + +\def\itemizeitem{% +\advance\itemno by 1 +{\let\par=\endgraf \smallbreak}% +\ifhmode \errmessage{\in hmode at itemizeitem}\fi +{\parskip=0in \hskip 0pt +\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% +\vadjust{\penalty 1200}}% +\flushcr} + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within \newindex. +{\catcode`\@=11 +\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. + +\def\newindex #1{ +\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file +\openout \csname#1indfile\endcsname \jobname.#1 % Open the file +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\doindex {#1}} +} + +% @defindex foo == \newindex{foo} + +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. + +\def\newcodeindex #1{ +\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file +\openout \csname#1indfile\endcsname \jobname.#1 % Open the file +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\docodeindex {#1}} +} + +\def\defcodeindex{\parsearg\newcodeindex} + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +\def\synindex #1 #2 {% +\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname +\expandafter\let\csname#1indfile\endcsname=\synindexfoo +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\doindex {#2}}% +} + +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +\def\syncodeindex #1 #2 {% +\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname +\expandafter\let\csname#1indfile\endcsname=\synindexfoo +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\noexpand\docodeindex {#2}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +\def\indexdummies{% +\def\_{{\realbackslash _}}% +\def\w{\realbackslash w }% +\def\bf{\realbackslash bf }% +\def\rm{\realbackslash rm }% +\def\sl{\realbackslash sl }% +\def\sf{\realbackslash sf}% +\def\tt{\realbackslash tt}% +\def\gtr{\realbackslash gtr}% +\def\less{\realbackslash less}% +\def\hat{\realbackslash hat}% +\def\char{\realbackslash char}% +\def\TeX{\realbackslash TeX}% +\def\dots{\realbackslash dots }% +\def\copyright{\realbackslash copyright }% +\def\tclose##1{\realbackslash tclose {##1}}% +\def\code##1{\realbackslash code {##1}}% +\def\samp##1{\realbackslash samp {##1}}% +\def\t##1{\realbackslash r {##1}}% +\def\r##1{\realbackslash r {##1}}% +\def\i##1{\realbackslash i {##1}}% +\def\b##1{\realbackslash b {##1}}% +\def\cite##1{\realbackslash cite {##1}}% +\def\key##1{\realbackslash key {##1}}% +\def\file##1{\realbackslash file {##1}}% +\def\var##1{\realbackslash var {##1}}% +\def\kbd##1{\realbackslash kbd {##1}}% +} + +% \indexnofonts no-ops all font-change commands. +% This is used when outputting the strings to sort the index by. +\def\indexdummyfont#1{#1} +\def\indexdummytex{TeX} +\def\indexdummydots{...} + +\def\indexnofonts{% +\let\w=\indexdummyfont +\let\t=\indexdummyfont +\let\r=\indexdummyfont +\let\i=\indexdummyfont +\let\b=\indexdummyfont +\let\emph=\indexdummyfont +\let\strong=\indexdummyfont +\let\cite=\indexdummyfont +\let\sc=\indexdummyfont +%Don't no-op \tt, since it isn't a user-level command +% and is used in the definitions of the active chars like <, >, |... +%\let\tt=\indexdummyfont +\let\tclose=\indexdummyfont +\let\code=\indexdummyfont +\let\file=\indexdummyfont +\let\samp=\indexdummyfont +\let\kbd=\indexdummyfont +\let\key=\indexdummyfont +\let\var=\indexdummyfont +\let\TeX=\indexdummytex +\let\dots=\indexdummydots +} + +% To define \realbackslash, we must make \ not be an escape. +% We must first make another character (@) an escape +% so we do not become unable to do a definition. + +{\catcode`\@=0 \catcode`\\=\other +@gdef@realbackslash{\}} + +\let\indexbackslash=0 %overridden during \printindex. + +\def\doind #1#2{% +{\count10=\lastpenalty % +{\indexdummies % Must do this here, since \bf, etc expand at this stage +\escapechar=`\\% +{\let\folio=0% Expand all macros now EXCEPT \folio +\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now +% so it will be output as is; and it will print as backslash in the indx. +% +% Now process the index-string once, with all font commands turned off, +% to get the string to sort the index by. +{\indexnofonts +\xdef\temp1{#2}% +}% +% Now produce the complete index entry. We process the index-string again, +% this time with font commands expanded, to get what to print in the index. +\edef\temp{% +\write \csname#1indfile\endcsname{% +\realbackslash entry {\temp1}{\folio}{#2}}}% +\temp }% +}\penalty\count10}} + +\def\dosubind #1#2#3{% +{\count10=\lastpenalty % +{\indexdummies % Must do this here, since \bf, etc expand at this stage +\escapechar=`\\% +{\let\folio=0% +\def\rawbackslashxx{\indexbackslash}% +% +% Now process the index-string once, with all font commands turned off, +% to get the string to sort the index by. +{\indexnofonts +\xdef\temp1{#2 #3}% +}% +% Now produce the complete index entry. We process the index-string again, +% this time with font commands expanded, to get what to print in the index. +\edef\temp{% +\write \csname#1indfile\endcsname{% +\realbackslash entry {\temp1}{\folio}{#2}{#3}}}% +\temp }% +}\penalty\count10}} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% This is what you call to cause a particular index to get printed. +% Write +% @unnumbered Function Index +% @printindex fn + +\def\printindex{\parsearg\doprintindex} + +\def\doprintindex#1{% + \tex + \dobreak \chapheadingskip {10000} + \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other + \catcode`\$=\other\catcode`\_=\other + \catcode`\~=\other + % + % The following don't help, since the chars were translated + % when the raw index was written, and their fonts were discarded + % due to \indexnofonts. + %\catcode`\"=\active + %\catcode`\^=\active + %\catcode`\_=\active + %\catcode`\|=\active + %\catcode`\<=\active + %\catcode`\>=\active + % % + \def\indexbackslash{\rawbackslashxx} + \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt + \begindoublecolumns + % + % See if the index file exists and is nonempty. + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + (Index is nonexistent) + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + (Index is empty) + \else + \input \jobname.#1s + \fi + \fi + \closein 1 + \enddoublecolumns + \Etex +} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +% Same as \bigskipamount except no shrink. +% \balancecolumns gets confused if there is any shrink. +\newskip\initialskipamount \initialskipamount 12pt plus4pt + +\def\initial #1{% +{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt +\ifdim\lastskip<\initialskipamount +\removelastskip \penalty-200 \vskip \initialskipamount\fi +\line{\secbf#1\hfill}\kern 2pt\penalty10000}} + +\def\entry #1#2{ +{\parfillskip=0in \parskip=0in \parindent=0in +\hangindent=1in \hangafter=1% +\noindent\hbox{#1}\indexdotfill #2\par +}} + +% Like \dotfill except takes at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm + +\def\secondary #1#2{ +{\parfillskip=0in \parskip=0in +\hangindent =1in \hangafter=1 +\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par +}} + +%% Define two-column mode, which is used in indexes. +%% Adapted from the TeXBook, page 416 +\catcode `\@=11 + +\newbox\partialpage + +\newdimen\doublecolumnhsize \doublecolumnhsize = 3.11in +\newdimen\doublecolumnvsize \doublecolumnvsize = 19.1in +\newdimen\availdimen@ + +\def\begindoublecolumns{\begingroup + \output={\global\setbox\partialpage= + \vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject + \output={\doublecolumnout}% + \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize} +\def\enddoublecolumns{\output={\balancecolumns}\eject + \endgroup \pagegoal=\vsize} + +\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth + \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar \unvbox255 \penalty\outputpenalty} +\def\pagesofar{\unvbox\partialpage % + \hsize=\doublecolumnhsize % have to restore this since output routine +% changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986) + \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} +\def\balancecolumns{% +% Unset the glue. + \setbox255=\vbox{\unvbox255} + \dimen@=\ht255 + \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip + \divide\dimen@ by2 + \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage +% If the remaining data is too big for one page, +% output one page normally, then work with what remains. + \ifdim \dimen@>\availdimen@ + { + \splittopskip=\topskip \splitmaxdepth=\maxdepth + \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + } +% Recompute size of what remains, in case we just output some of it. + \dimen@=\ht255 + \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip + \divide\dimen@ by2 + \fi + \setbox0=\vbox{\unvbox255} + \splittopskip=\topskip + {\vbadness=10000 \loop \global\setbox3=\copy0 + \global\setbox1=\vsplit3 to\dimen@ + \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat} + \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3} + \pagesofar} + +\catcode `\@=\other +\message{sectioning,} +% Define chapters, sections, etc. + +\newcount \chapno +\newcount \secno \secno=0 +\newcount \subsecno \subsecno=0 +\newcount \subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount \appendixno \appendixno = `\@ +\def\appendixletter{\char\the\appendixno} + +\newwrite \contentsfile +% This is called from \setfilename. +\def\opencontents{\openout \contentsfile = \jobname.toc} + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise + +\def\thischapter{} \def\thissection{} +\def\seccheck#1{\if \pageno<0 % +\errmessage{@#1 not allowed after generating table of contents}\fi +% +} + +\def\chapternofonts{% +\let\rawbackslash=\relax% +\let\frenchspacing=\relax% +\def\TeX{\realbackslash TeX} +\def\dots{\realbackslash dots} +\def\copyright{\realbackslash copyright} +\def\tt{\realbackslash tt} +\def\bf{\realbackslash bf } +\def\w{\realbackslash w} +\def\less{\realbackslash less} +\def\gtr{\realbackslash gtr} +\def\hat{\realbackslash hat} +\def\char{\realbackslash char} +\def\tclose##1{\realbackslash tclose {##1}} +\def\code##1{\realbackslash code {##1}} +\def\samp##1{\realbackslash samp {##1}} +\def\r##1{\realbackslash r {##1}} +\def\b##1{\realbackslash b {##1}} +\def\key##1{\realbackslash key {##1}} +\def\file##1{\realbackslash file {##1}} +\def\kbd##1{\realbackslash kbd {##1}} +% These are redefined because @smartitalic wouldn't work inside xdef. +\def\i##1{\realbackslash i {##1}} +\def\cite##1{\realbackslash cite {##1}} +\def\var##1{\realbackslash var {##1}} +\def\emph##1{\realbackslash emph {##1}} +\def\dfn##1{\realbackslash dfn {##1}} +} + +\def\thischaptername{No Chapter Title} +\outer\def\chapter{\parsearg\chapterzzz} +\def\chapterzzz #1{\seccheck{chapter}% +\secno=0 \subsecno=0 \subsubsecno=0 +\global\advance \chapno by 1 \message{Chapter \the\chapno}% +\chapmacro {#1}{\the\chapno}% +\gdef\thissection{#1}% +\gdef\thischaptername{#1}% +% We don't substitute the actual chapter name into \thischapter +% because we don't want its macros evaluated now. +\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}% +{\chapternofonts% +\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec +}} + +\outer\def\appendix{\parsearg\appendixzzz} +\def\appendixzzz #1{\seccheck{appendix}% +\secno=0 \subsecno=0 \subsubsecno=0 +\global\advance \appendixno by 1 \message{Appendix \appendixletter}% +\chapmacro {#1}{Appendix \appendixletter}% +\gdef\thissection{#1}% +\gdef\thischaptername{#1}% +\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}% +{\chapternofonts% +\edef\temp{{\realbackslash chapentry + {#1}{Appendix \appendixletter}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\global\let\section = \appendixsec +\global\let\subsection = \appendixsubsec +\global\let\subsubsection = \appendixsubsubsec +}} + +\outer\def\top{\parsearg\unnumberedzzz} +\outer\def\unnumbered{\parsearg\unnumberedzzz} +\def\unnumberedzzz #1{\seccheck{unnumbered}% +\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)} +\unnumbchapmacro {#1}% +\gdef\thischapter{#1}\gdef\thissection{#1}% +{\chapternofonts% +\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\global\let\section = \unnumberedsec +\global\let\subsection = \unnumberedsubsec +\global\let\subsubsection = \unnumberedsubsubsec +}} + +\outer\def\numberedsec{\parsearg\seczzz} +\def\seczzz #1{\seccheck{section}% +\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % +\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% +{\chapternofonts% +\edef\temp{{\realbackslash secentry % +{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\outer\def\appendixsection{\parsearg\appendixsectionzzz} +\outer\def\appendixsec{\parsearg\appendixsectionzzz} +\def\appendixsectionzzz #1{\seccheck{appendixsection}% +\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % +\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% +{\chapternofonts% +\edef\temp{{\realbackslash secentry % +{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsec{\parsearg\unnumberedseczzz} +\def\unnumberedseczzz #1{\seccheck{unnumberedsec}% +\plainsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +\outer\def\numberedsubsec{\parsearg\numberedsubseczzz} +\def\numberedsubseczzz #1{\seccheck{subsection}% +\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % +\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% +{\chapternofonts% +\edef\temp{{\realbackslash subsecentry % +{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\outer\def\appendixsubsec{\parsearg\appendixsubseczzz} +\def\appendixsubseczzz #1{\seccheck{appendixsubsec}% +\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % +\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% +{\chapternofonts% +\edef\temp{{\realbackslash subsecentry % +{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz} +\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% +\plainsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +\outer\def\numberedsubsubsec{\parsearg\numberedsubsubseczzz} +\def\numberedsubsubseczzz #1{\seccheck{subsubsection}% +\gdef\thissection{#1}\global\advance \subsubsecno by 1 % +\subsubsecheading {#1} + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% +{\chapternofonts% +\edef\temp{{\realbackslash subsubsecentry % + {#1} + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} + {\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz} +\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% +\gdef\thissection{#1}\global\advance \subsubsecno by 1 % +\subsubsecheading {#1} + {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% +{\chapternofonts% +\edef\temp{{\realbackslash subsubsecentry{#1}% + {\appendixletter} + {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} +\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% +\plainsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +% These are variants which are not "outer", so they can appear in @ifinfo. +% Actually, they should now be obsolete; ordinary section commands should work. +\def\infotop{\parsearg\unnumberedzzz} +\def\infounnumbered{\parsearg\unnumberedzzz} +\def\infounnumberedsec{\parsearg\unnumberedseczzz} +\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} +\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} + +\def\infoappendix{\parsearg\appendixzzz} +\def\infoappendixsec{\parsearg\appendixseczzz} +\def\infoappendixsubsec{\parsearg\appendixsubseczzz} +\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} + +\def\infochapter{\parsearg\chapterzzz} +\def\infosection{\parsearg\sectionzzz} +\def\infosubsection{\parsearg\subsectionzzz} +\def\infosubsubsection{\parsearg\subsubsectionzzz} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and +% such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + +\def\majorheading{\parsearg\majorheadingzzz} +\def\majorheadingzzz #1{% +{\advance\chapheadingskip by 10pt \chapbreak }% +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +\def\chapheading{\parsearg\chapheadingzzz} +\def\chapheadingzzz #1{\chapbreak % +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +\def\heading{\parsearg\secheadingi} + +\def\subheading{\parsearg\subsecheadingi} + +\def\subsubheading{\parsearg\subsubsecheadingi} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{ +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{ +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{ +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +\def\CHAPFplain{ +\global\let\chapmacro=\chfplain +\global\let\unnumbchapmacro=\unnchfplain} + +\def\chfplain #1#2{% + \pchapsepmacro + {% + \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #2\enspace #1}% + }% + \bigskip + \penalty5000 +} + +\def\unnchfplain #1{% +\pchapsepmacro % +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 10000 % +} +\CHAPFplain % The default + +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 10000 % +} + +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} + +\def\CHAPFopen{ +\global\let\chapmacro=\chfopen +\global\let\unnumbchapmacro=\unnchfopen} + +% Parameter controlling skip before section headings. + +\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt +\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} + +\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt +\def\secheadingbreak{\dobreak \secheadingskip {-1000}} + +% @paragraphindent is defined for the Info formatting commands only. +\let\paragraphindent=\comment + +% Section fonts are the base font at magstep2, which produces +% a size a bit more than 14 points in the default situation. + +\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} +\def\plainsecheading #1{\secheadingi {#1}} +\def\secheadingi #1{{\advance \secheadingskip by \parskip % +\secheadingbreak}% +{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}% +\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } + + +% Subsection fonts are the base font at magstep1, +% which produces a size of 12 points. + +\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} +\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip % +\subsecheadingbreak}% +{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}% +\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } + +\def\subsubsecfonts{\subsecfonts} % Maybe this should change: + % Perhaps make sssec fonts scaled + % magstep half +\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}} +\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip % +\subsecheadingbreak}% +{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}% +\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000} + + +\message{toc printing,} + +% Finish up the main text and prepare to read what we've written +% to \contentsfile. + +\newskip\contentsrightmargin \contentsrightmargin=1in +\def\startcontents#1{% + \ifnum \pageno>0 + \pagealignmacro + \immediate\closeout \contentsfile + \pageno = -1 % Request roman numbered pages. + \fi + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \unnumbchapmacro{#1}\def\thischapter{}% + \begingroup % Set up to handle contents files properly. + \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. +} + + +% Normal (long) toc. +\outer\def\contents{% + \startcontents{Table of Contents}% + \input \jobname.toc + \endgroup + \vfill \eject +} + +% And just the chapters. +\outer\def\summarycontents{% + \startcontents{Short Contents}% + % + \let\chapentry = \shortchapentry + \let\unnumbchapentry = \shortunnumberedentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl + \rm + \advance\baselineskip by 1pt % Open it up a little. + \def\secentry ##1##2##3##4{} + \def\unnumbsecentry ##1##2{} + \def\subsecentry ##1##2##3##4##5{} + \def\unnumbsubsecentry ##1##2{} + \def\subsubsecentry ##1##2##3##4##5##6{} + \def\unnumbsubsubsecentry ##1##2{} + \input \jobname.toc + \endgroup + \vfill \eject +} +\let\shortcontents = \summarycontents + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapter-level things, for both the long and short contents. +\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} + +% See comments in \dochapentry re vbox and related settings +\def\shortchapentry#1#2#3{% + \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\strut\raggedright + {#2\labelspace #1}\dotfill\doshortpageno{#3}}% +} + +\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} +\def\shortunnumberedentry#1#2{% + \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\strut\raggedright + #1\dotfill\doshortpageno{#2}}% +} + +% Sections. +\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} +\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} + +% Subsections. +\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} +\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} + +% And subsubsections. +\def\subsubsecentry#1#2#3#4#5#6{% + \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} +\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} + + +% This parameter controls the indentation of the various levels. +\newdimen\tocindent \tocindent = 3pc + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we would want to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip\baselineskip + % This \vbox (and similar ones in dosecentry etc.) used to be a + % \line; changed to permit linebreaks for long headings. See + % comments above \majorheading. Here we also use \strut to + % keep the top end of the vbox from jamming up against the previous + % entry in the table of contents. + \vbox{\chapentryfonts + \hyphenpenalty=10000\tolerance=5000 % this line and next introduced + \parindent=0pt\strut\raggedright % with \line -> \vbox change + #1\dotfill + \dopageno{#2}}% + \nobreak\vskip .25\baselineskip +} + +\def\dosecentry#1#2{% + \vbox{\secentryfonts \leftskip=\tocindent + \hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\strut\raggedright #1\dotfill + \dopageno{#2}}% +} + +\def\dosubsecentry#1#2{% + \vbox{\subsecentryfonts \leftskip=2\tocindent + \hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\strut\raggedright #1\dotfill + \dopageno{#2}}% +} + +\def\dosubsubsecentry#1#2{% + \vbox{\subsubsecentryfonts \leftskip=3\tocindent + \hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\strut\raggedright #1\dotfill + \dopageno{#2}}% +} + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\let\subsecentryfonts = \textfonts +\let\subsubsecentryfonts = \textfonts + + +\message{environments,} + +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% Furthermore, these definitions must come after we define our fonts. +\newbox\dblarrowbox \newbox\longdblarrowbox +\newbox\pushcharbox \newbox\bullbox +\newbox\equivbox \newbox\errorbox + +\let\ptexequiv = \equiv + +%{\tentt +%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} +%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} +%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} +%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} +% Adapted from the manmac format (p.420 of TeXbook) +%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex +% depth .1ex\hfil} +%} + +\def\point{$\star$} + +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} + +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% Adapted from the TeXbook's \boxit. +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} + +\global\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{ + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} + +% The @error{} command. +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\def\tex{\begingroup +\catcode `\\=0 \catcode `\{=1 \catcode `\}=2 +\catcode `\$=3 \catcode `\&=4 \catcode `\#=6 +\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie +\catcode `\%=14 +\catcode 43=12 +\catcode`\"=12 +\catcode`\==12 +\catcode`\|=12 +\catcode`\<=12 +\catcode`\>=12 +\escapechar=`\\ +% +\let\{=\ptexlbrace +\let\}=\ptexrbrace +\let\.=\ptexdot +\let\*=\ptexstar +\let\dots=\ptexdots +\def\@{@}% +\let\bullet=\ptexbullet +\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl +\let\L=\ptexL +% +\let\Etex=\endgroup} + +% Define @lisp ... @endlisp. +% @lisp does a \begingroup so it can rebind things, +% including the definition of @endlisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^M gets inside @lisp +% phr: changed space to \null, to avoid overfull hbox problems. +{\obeyspaces% +\gdef\lisppar{\null\endgraf}} + +% Cause \obeyspaces to make each Space cause a word-separation +% rather than the default which is that it acts punctuation. +% This is because space in tt font looks funny. +{\obeyspaces % +\gdef\sepspaces{\def {\ }}} + +\newskip\aboveenvskipamount \aboveenvskipamount= 0pt +\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip +\endgraf \ifdim\lastskip<\aboveenvskipamount +\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}} + +\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount +\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi} + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. +\let\nonarrowing=\relax + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \cartouche: draw rectangle w/rounded corners around argument +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\long\def\cartouche{% +\begingroup + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt %we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18pt % allow for 3pt kerns on either +% side, and for 6pt waste from +% each corner char + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=\comment + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \hsize=\cartinner + \kern3pt + \begingroup + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip +\def\Ecartouche{% + \endgroup + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup +\endgroup +}} + +\def\lisp{\aboveenvbreak +\begingroup\inENV % This group ends at the end of the @lisp body +\hfuzz=12truept % Don't be fussy +% Make spaces be word-separators rather than space tokens. +\sepspaces % +% Single space lines +\singlespace % +% The following causes blank lines not to be ignored +% by adding a space to the end of each line. +\let\par=\lisppar +\def\Elisp{\endgroup\afterenvbreak}% +\parskip=0pt +% @cartouche defines \nonarrowing to inhibit narrowing +% at next level down. +\ifx\nonarrowing\relax +\advance \leftskip by \lispnarrowing +\let\nonarrowing=\relax +\fi +\parindent=0pt +\let\exdent=\internalexdent +\obeyspaces \obeylines \tt \rawbackslash +\def\next##1{}\next} + + +\let\example=\lisp +\def\Eexample{\Elisp} + +\let\smallexample=\lisp +\def\Esmallexample{\Elisp} + +% Macro for 9 pt. examples, necessary to print with 5" lines. +% From Pavel@xerox. This is not really used unless the +% @smallbook command is given. + +\def\smalllispx{\aboveenvbreak\begingroup\inENV +% This group ends at the end of the @lisp body +\hfuzz=12truept % Don't be fussy +% Make spaces be word-separators rather than space tokens. +\sepspaces % +% Single space lines +\singlespace % +% The following causes blank lines not to be ignored +% by adding a space to the end of each line. +\let\par=\lisppar +\def\Esmalllisp{\endgroup\afterenvbreak}% +\parskip=0pt +% @cartouche defines \nonarrowing to inhibit narrowing +% at next level down. +\ifx\nonarrowing\relax +\advance \leftskip by \lispnarrowing +\let\nonarrowing=\relax +\fi +\parindent=0pt +\let\exdent=\internalexdent +\obeyspaces \obeylines \ninett \indexfonts \rawbackslash +\def\next##1{}\next} + +% This is @display; same as @lisp except use roman font. + +\def\display{\begingroup\inENV %This group ends at the end of the @display body +\aboveenvbreak +% Make spaces be word-separators rather than space tokens. +\sepspaces % +% Single space lines +\singlespace % +% The following causes blank lines not to be ignored +% by adding a space to the end of each line. +\let\par=\lisppar +\def\Edisplay{\endgroup\afterenvbreak}% +\parskip=0pt +% @cartouche defines \nonarrowing to inhibit narrowing +% at next level down. +\ifx\nonarrowing\relax +\advance \leftskip by \lispnarrowing +\let\nonarrowing=\relax +\fi +\parindent=0pt +\let\exdent=\internalexdent +\obeyspaces \obeylines +\def\next##1{}\next} + +% This is @format; same as @lisp except use roman font and don't narrow margins + +\def\format{\begingroup\inENV %This group ends at the end of the @format body +\aboveenvbreak +% Make spaces be word-separators rather than space tokens. +\sepspaces % +\singlespace % +% The following causes blank lines not to be ignored +% by adding a space to the end of each line. +\let\par=\lisppar +\def\Eformat{\endgroup\afterenvbreak} +\parskip=0pt \parindent=0pt +\obeyspaces \obeylines +\def\next##1{}\next} + +% @flushleft and @flushright + +\def\flushleft{% +\begingroup\inENV %This group ends at the end of the @format body +\aboveenvbreak +% Make spaces be word-separators rather than space tokens. +\sepspaces % +% The following causes blank lines not to be ignored +% by adding a space to the end of each line. +% This also causes @ to work when the directive name +% is terminated by end of line. +\let\par=\lisppar +\def\Eflushleft{\endgroup\afterenvbreak}% +\parskip=0pt \parindent=0pt +\obeyspaces \obeylines +\def\next##1{}\next} + +\def\flushright{% +\begingroup\inENV %This group ends at the end of the @format body +\aboveenvbreak +% Make spaces be word-separators rather than space tokens. +\sepspaces % +% The following causes blank lines not to be ignored +% by adding a space to the end of each line. +% This also causes @ to work when the directive name +% is terminated by end of line. +\let\par=\lisppar +\def\Eflushright{\endgroup\afterenvbreak}% +\parskip=0pt \parindent=0pt +\advance \leftskip by 0pt plus 1fill +\obeyspaces \obeylines +\def\next##1{}\next} + +% @quotation - narrow the margins. + +\def\quotation{% +\begingroup\inENV %This group ends at the end of the @quotation body +{\parskip=0pt % because we will skip by \parskip too, later +\aboveenvbreak}% +\singlespace +\parindent=0pt +\def\Equotation{\par\endgroup\afterenvbreak}% +% @cartouche defines \nonarrowing to inhibit narrowing +% at next level down. +\ifx\nonarrowing\relax +\advance \leftskip by \lispnarrowing +\advance \rightskip by \lispnarrowing +\let\nonarrowing=\relax +\fi} + +\message{defuns,} +% Define formatter for defuns +% First, allow user to change definition object font (\df) internally +\def\setdeffont #1 {\csname DEF#1\endcsname} + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deftypemargin \deftypemargin=12pt +\newskip\deflastargmargin \deflastargmargin=18pt + +\newcount\parencount +% define \functionparens, which makes ( and ) and & do special things. +% \functionparens affects the group it is contained in. +\def\activeparens{% +\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active +\catcode`\[=\active \catcode`\]=\active} +{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) +\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } +\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + +% Definitions of (, ) and & used in args for functions. +% This is the definition of ( outside of all parentheses. +\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested % +\global\advance\parencount by 1 } +% +% This is the definition of ( when already inside a level of parens. +\gdef\opnested{\char`\(\global\advance\parencount by 1 } +% +\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. +% also in that case restore the outer-level definition of (. +\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi +\global\advance \parencount by -1 } +% If we encounter &foo, then turn on ()-hacking afterwards +\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } +% +\gdef\normalparens{\boldbrax\let&=\ampnr} +} % End of definition inside \activeparens +%% These parens (in \boldbrax) actually are a little bolder than the +%% contained text. This is especially needed for [ and ] +\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&} +\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} + +% First, defname, which formats the header line itself. +% #1 should be the function name. +% #2 should be the type of definition, such as "Function". + +\def\defname #1#2{% +% Get the values of \leftskip and \rightskip as they were +% outside the @def... +\dimen2=\leftskip +\advance\dimen2 by -\defbodyindent +\dimen3=\rightskip +\advance\dimen3 by -\defbodyindent +\noindent % +\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% +\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line +\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations +\parshape 2 0in \dimen0 \defargsindent \dimen1 % +% Now output arg 2 ("Function" or some such) +% ending at \deftypemargin from the right margin, +% but stuck inside a box of width 0 so it does not interfere with linebreaking +{% Adjust \hsize to exclude the ambient margins, +% so that \rightline will obey them. +\advance \hsize by -\dimen2 \advance \hsize by -\dimen3 +\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% +% Make all lines underfull and no complaints: +\tolerance=10000 \hbadness=10000 +\advance\leftskip by -\defbodyindent +{\df #1}\enskip % Generate function name +} + +% Actually process the body of a definition +% #1 should be the terminating control sequence, such as \Edefun. +% #2 should be the "another name" control sequence, such as \defunx. +% #3 should be the control sequence that actually processes the header, +% such as \defunheader. + +\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2{\begingroup\obeylines\activeparens\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\begingroup % +\catcode 61=\active % +\obeylines\activeparens\spacesplit#3} + +\def\defmethparsebody #1#2#3#4 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} + +\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 ##2 {\def#4{##1}% +\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\begingroup\obeylines\activeparens\spacesplit{#3{#5}}} + +% These parsing functions are similar to the preceding ones +% except that they do not make parens into active characters. +% These are used for "variables" since they have no arguments. + +\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2{\begingroup\obeylines\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\begingroup % +\catcode 61=\active % +\obeylines\spacesplit#3} + +\def\defvrparsebody #1#2#3#4 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\begingroup\obeylines\spacesplit{#3{#4}}} + +\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 ##2 {\def#4{##1}% +\begingroup\obeylines\spacesplit{#3{##2}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\begingroup\obeylines\spacesplit{#3{#5}}} + +% Split up #2 at the first space token. +% call #1 with two arguments: +% the first is all of #2 before the space token, +% the second is all of #2 after that space token. +% If #2 contains no space token, all of it is passed as the first arg +% and the second is passed as empty. + +{\obeylines +\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% +\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% +\ifx\relax #3% +#1{#2}{}\else #1{#2}{#3#4}\fi}} + +% So much for the things common to all kinds of definitions. + +% Define @defun. + +% First, define the processing that is wanted for arguments of \defun +% Use this to expand the args and terminate the paragraph they make up + +\def\defunargs #1{\functionparens \sl +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +\hyphenchar\tensl=0 +#1% +\hyphenchar\tensl=45 +\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi% +\interlinepenalty=10000 +\advance\rightskip by 0pt plus 1fil +\endgraf\penalty 10000\vskip -\parskip\penalty 10000% +} + +\def\deftypefunargs #1{% +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +\functionparens +\code{#1}% +\interlinepenalty=10000 +\advance\rightskip by 0pt plus 1fil +\endgraf\penalty 10000\vskip -\parskip\penalty 10000% +} + +% Do complete processing of one @defun or @defunx line already parsed. + +% @deffn Command forward-char nchars + +\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} + +\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% +\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defun == @deffn Function + +\def\defun{\defparsebody\Edefun\defunx\defunheader} + +\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Function}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefun int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} + +% #1 is the data type. #2 is the name and args. +\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} +% #1 is the data type, #2 the name, #3 the args. +\def\deftypefunheaderx #1#2 #3\relax{% +\doind {fn}{\code{#2}}% Make entry in function index +\begingroup\defname {\code{#1} #2}{Function}% +\deftypefunargs {#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} + +% #1 is the classification. #2 is the data type. #3 is the name and args. +\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} +% #1 is the classification, #2 the data type, #3 the name, #4 the args. +\def\deftypefnheaderx #1#2#3 #4\relax{% +\doind {fn}{\code{#3}}% Make entry in function index +\begingroup\defname {\code{#2} #3}{#1}% +\deftypefunargs {#4}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defmac == @deffn Macro + +\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} + +\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Macro}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defspec == @deffn Special Form + +\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} + +\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Special Form}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% This definition is run if you use @defunx +% anywhere other than immediately after a @defun or @defunx. + +\def\deffnx #1 {\errmessage{@deffnx in invalid context}} +\def\defunx #1 {\errmessage{@defunx in invalid context}} +\def\defmacx #1 {\errmessage{@defmacx in invalid context}} +\def\defspecx #1 {\errmessage{@defspecx in invalid context}} +\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} +\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} + +% @defmethod, and so on + +% @defop {Funny Method} foo-class frobnicate argument + +\def\defop #1 {\def\defoptype{#1}% +\defopparsebody\Edefop\defopx\defopheader\defoptype} + +\def\defopheader #1#2#3{% +\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index +\begingroup\defname {#2}{\defoptype{} on #1}% +\defunargs {#3}\endgroup % +} + +% @defmethod == @defop Method + +\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} + +\def\defmethodheader #1#2#3{% +\dosubind {fn}{\code{#2}}{on #1}% entry in function index +\begingroup\defname {#2}{Method on #1}% +\defunargs {#3}\endgroup % +} + +% @defcv {Class Option} foo-class foo-flag + +\def\defcv #1 {\def\defcvtype{#1}% +\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} + +\def\defcvarheader #1#2#3{% +\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index +\begingroup\defname {#2}{\defcvtype{} of #1}% +\defvarargs {#3}\endgroup % +} + +% @defivar == @defcv {Instance Variable} + +\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} + +\def\defivarheader #1#2#3{% +\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index +\begingroup\defname {#2}{Instance Variable of #1}% +\defvarargs {#3}\endgroup % +} + +% These definitions are run if you use @defmethodx, etc., +% anywhere other than immediately after a @defmethod, etc. + +\def\defopx #1 {\errmessage{@defopx in invalid context}} +\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} +\def\defcvx #1 {\errmessage{@defcvx in invalid context}} +\def\defivarx #1 {\errmessage{@defivarx in invalid context}} + +% Now @defvar + +% First, define the processing that is wanted for arguments of @defvar. +% This is actually simple: just print them in roman. +% This must expand the args and terminate the paragraph they make up +\def\defvarargs #1{\normalparens #1% +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000} + +% @defvr Counter foo-count + +\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} + +\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% +\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} + +% @defvar == @defvr Variable + +\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} + +\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{Variable}% +\defvarargs {#2}\endgroup % +} + +% @defopt == @defvr {User Option} + +\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} + +\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{User Option}% +\defvarargs {#2}\endgroup % +} + +% @deftypevar int foobar + +\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} + +% #1 is the data type. #2 is the name. +\def\deftypevarheader #1#2{% +\doind {vr}{\code{#2}}% Make entry in variables index +\begingroup\defname {\code{#1} #2}{Variable}% +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000 +\endgroup} + +% @deftypevr {Global Flag} int enable + +\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} + +\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% +\begingroup\defname {\code{#2} #3}{#1} +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000 +\endgroup} + +% This definition is run if you use @defvarx +% anywhere other than immediately after a @defvar or @defvarx. + +\def\defvrx #1 {\errmessage{@defvrx in invalid context}} +\def\defvarx #1 {\errmessage{@defvarx in invalid context}} +\def\defoptx #1 {\errmessage{@defoptx in invalid context}} +\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} +\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} + +% Now define @deftp +% Args are printed in bold, a slight difference from @defvar. + +\def\deftpargs #1{\bf \defvarargs{#1}} + +% @deftp Class window height width ... + +\def\deftp{\defvrparsebody\Edeftp\deftpx\deftpheader} + +\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% +\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} + +% This definition is run if you use @deftpx, etc +% anywhere other than immediately after a @deftp, etc. + +\def\deftpx #1 {\errmessage{@deftpx in invalid context}} + +\message{cross reference,} +% Define cross-reference macros +\newwrite \auxfile + +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% \setref{foo} defines a cross-reference point named foo. + +\def\setref#1{% +%\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Ysectionnumberandtype}} + +\def\unnumbsetref#1{% +%\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Ynothing}} + +\def\appendixsetref#1{% +%\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Yappendixletterandtype}} + +% \xref, \pxref, and \ref generate cross-references to specified points. +% For \xrefX, #1 is the node name, #2 the name of the Info +% cross-reference, #3 the printed node name, #4 the name of the Info +% file, #5 the name of the printed manual. All but the node name can be +% omitted. +% +\def\pxref#1{see \xrefX[#1,,,,,,,]} +\def\xref#1{See \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup% +\def\printedmanual{\ignorespaces #5}% +\def\printednodename{\ignorespaces #3}% +% +\setbox1=\hbox{\printedmanual}% +\setbox0=\hbox{\printednodename}% +\ifdim \wd0=0pt% +\def\printednodename{\ignorespaces #1}% +%%% Uncommment the following line to make the actual chapter or section title +%%% appear inside the square brackets. +%\def\printednodename{#1-title}% +\fi% +% +% +% If we use \unhbox0 and \unhbox1 to print the node names, TeX does +% not insert empty discretionaries after hyphens, which means that it +% will not find a line break at a hyphen in a node names. Since some +% manuals are best written with fairly long node names, containing +% hyphens, this is a loss. Therefore, we simply give the text of +% the node name again, so it is as if TeX is seeing it for the first +% time. +\ifdim \wd1>0pt +section ``\printednodename'' in \cite{\printedmanual}% +\else% +\turnoffactive% +\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}% +\fi +\endgroup} + +% \dosetq is the interface for calls from other macros + +% Use \turnoffactive so that punctuation chars such as underscore +% work in node names. +\def\dosetq #1#2{{\let\folio=0 \turnoffactive% +\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% +\next}} + +% \internalsetq {foo}{page} expands into +% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} +% When the aux file is read, ' is the escape character + +\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} + +% Things to be expanded by \internalsetq + +\def\Ypagenumber{\folio} + +\def\Ytitle{\thischapter} + +\def\Ynothing{} + +\def\Ysectionnumberandtype{% +\ifnum\secno=0 Chapter\xreftie\the\chapno % +\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno % +\else \ifnum \subsubsecno=0 % +Section\xreftie\the\chapno.\the\secno.\the\subsecno % +\else % +Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % +\fi \fi \fi } + +\def\Yappendixletterandtype{% +\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}% +\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno % +\else \ifnum \subsubsecno=0 % +Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno % +\else % +Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % +\fi \fi \fi } + +\gdef\xreftie{'tie} + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Non-3.0. +\else + \def\linenumber{\the\inputlineno:\space} +\fi + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. + +\def\refx#1#2{% + \expandafter\ifx\csname X#1\endcsname\relax + % If not defined, say something at least. + $\langle$un\-de\-fined$\rangle$% + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \else + % It's defined, so just use it. + \csname X#1\endcsname + \fi + #2% Output the suffix in any case. +} + +% Read the last existing aux file, if any. No error if none exists. + +% This is the macro invoked by entries in the aux file. +\def\xrdef #1#2{ +{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}} + +\def\readauxfile{% +\begingroup +\catcode `\^^@=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\^^C=\other +\catcode `\^^D=\other +\catcode `\^^E=\other +\catcode `\^^F=\other +\catcode `\^^G=\other +\catcode `\^^H=\other +\catcode `\=\other +\catcode `\^^L=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode 26=\other +\catcode `\^^[=\other +\catcode `\^^\=\other +\catcode `\^^]=\other +\catcode `\^^^=\other +\catcode `\^^_=\other +\catcode `\@=\other +\catcode `\^=\other +\catcode `\~=\other +\catcode `\[=\other +\catcode `\]=\other +\catcode`\"=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode `\$=\other +\catcode `\#=\other +\catcode `\&=\other +% the aux file uses ' as the escape. +% Turn off \ as an escape so we do not lose on +% entries which were dumped with control sequences in their names. +% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ +% Reference to such entries still does not work the way one would wish, +% but at least they do not bomb out when the aux file is read in. +\catcode `\{=1 \catcode `\}=2 +\catcode `\%=\other +\catcode `\'=0 +\catcode `\\=\other +\openin 1 \jobname.aux +\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue +\fi +% Open the new aux file. Tex will close it automatically at exit. +\openout \auxfile=\jobname.aux +\endgroup} + + +% Footnotes. + +\newcount \footnoteno + +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only.. +\let\footnotestyle=\comment + +\let\ptexfootnote=\footnote + +{\catcode `\@=11 +\long\gdef\footnote #1{\global\advance \footnoteno by \@ne +\unskip +\edef\thisfootno{$^{\the\footnoteno}$}% +\let\@sf\empty +\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi +\thisfootno\@sf \footnotezzz{#1}} +% \parsearg\footnotezzz} + +\long\gdef\footnotezzz #1{\insert\footins{ +\interlinepenalty\interfootnotelinepenalty +\splittopskip\ht\strutbox % top baseline for broken footnotes +\splitmaxdepth\dp\strutbox \floatingpenalty\@MM +\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip +\footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}} + +}%end \catcode `\@=11 + +% End of control word definitions. + +\message{and turning on texinfo input format.} + +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% Set some numeric style parameters, for 8.5 x 11 format. + +%\hsize = 6.5in +\newdimen\defaultparindent \defaultparindent = 15pt +\parindent = \defaultparindent +\parskip 18pt plus 1pt +\baselineskip 15pt +\advance\topskip by 1.2cm + +% Prevent underfull vbox error messages. +\vbadness=10000 + +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. This makes it come to about 9pt for the 8.5x11 format. +% +\ifx\emergencystretch\thisisundefined \else + \emergencystretch = \hsize + \divide\emergencystretch by 45 +\fi + +% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) +\def\smallbook{ +\global\lispnarrowing = 0.3in +\global\baselineskip 12pt +\global\parskip 3pt plus 1pt +\global\hsize = 5in +\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in +\global\vsize=7.5in +\global\tolerance=700 +\global\hfuzz=1pt +\global\contentsrightmargin=0pt + +\global\pagewidth=\hsize +\global\pageheight=\vsize + +\global\let\smalllisp=\smalllispx +\global\let\smallexample=\smalllispx +\global\def\Esmallexample{\Esmalllisp} +} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{ +\global\tolerance=700 +\global\hfuzz=1pt +\global\baselineskip=12pt +\global\parskip 15pt plus 1pt + +\global\vsize= 53\baselineskip +\advance\vsize by \topskip +%\global\hsize= 5.85in % A4 wide 10pt +\global\hsize= 6.5in +\global\outerhsize=\hsize +\global\advance\outerhsize by 0.5in +\global\outervsize=\vsize +\global\advance\outervsize by 0.6in +\global\doublecolumnhsize=\hsize +\global\divide\doublecolumnhsize by 2 +\global\advance\doublecolumnhsize by -0.1in +\global\doublecolumnvsize=\vsize +\global\multiply\doublecolumnvsize by 2 +\global\advance\doublecolumnvsize by 0.1in + +\global\pagewidth=\hsize +\global\pageheight=\vsize +} + +%% For a final copy, take out the rectangles +%% that mark overfull boxes (in case you have decided +%% that the text looks ok even though it passes the margin). +\def\finalout{\overfullrule=0pt} + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} + +% This macro is used to make a character print one way in ttfont +% where it can probably just be output, and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt \char '042}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt \char '176}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +% Subroutine for the previous macro. +\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}} + +% \lvvmode is equivalent in function to \leavevmode. +% Using \leavevmode runs into trouble when written out to +% an index file due to the expansion of \leavevmode into ``\unhbox +% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our +% magic tricks with @. +\def\lvvmode{\vbox to 0pt{}} + +\catcode`\|=\active +\def|{{\tt \char '174}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +%\catcode 27=\active +%\def^^[{$\diamondsuit$} + +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +\def\turnoffactive{\let"=\normaldoublequote +\let~=\normaltilde +\let^=\normalcaret +\let_=\normalunderscore +\let|=\normalverticalbar +\let<=\normalless +\let>=\normalgreater +\let+=\normalplus} + +% Set up an active definition for =, but don't enable it most of the time. +{\catcode`\==\active +\global\def={{\tt \char 61}}} + +\catcode`\@=0 + +% \rawbackslashxx output one backslash character in current font +\global\chardef\rawbackslashxx=`\\ +%{\catcode`\\=\other +%@gdef@rawbackslashxx{\}} + +% \rawbackslash redefines \ as input to do \rawbackslashxx. +{\catcode`\\=\active +@gdef@rawbackslash{@let\=@rawbackslashxx }} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\rawbackslashxx}} + +% Say @foo, not \foo, in error messages. +\escapechar=`\@ + +% \catcode 17=0 % Define control-q +\catcode`\\=\active + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\{ in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% +@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi} + +%% These look ok in all fonts, so just make them not special. The @rm below +%% makes sure that the current font starts out as the newly loaded cmr10 +@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other + +@textfonts +@rm +@message{Setting default page type to A4.} +@afourpaper + +@c Local variables: +@c page-delimiter: "^\\\\message" +@c End: diff --git a/support/vvcode/doc/vvcode.tex b/support/vvcode/doc/vvcode.tex new file mode 100644 index 0000000000..8a0ac20b6b --- /dev/null +++ b/support/vvcode/doc/vvcode.tex @@ -0,0 +1,255 @@ +\input texinfo.tex @c -*-texinfo-*- +@tableindent=0.9in + +@comment %**start of header +@setfilename vve-port.info +@settitle VVcode +@node Porting Guide, Porting Guide, Top, Top +@comment %**end of header + +@iftex +@finalout +@end iftex + +@c ------------------------------------------------------------------------- +@c Note: Please update the edition number, month, and year +@c Edition number is set at: settitle, subtitle and top node +@c Month or date is set at: subtitle and top node; +@c Search for: !!set +@c ------------------------------------------------------------------------- + +@ifinfo +This file documents Vvcode, a superior replacement for UUcode to allow the +documentation system that uses a single source file to produce both on-line +information and a printed manual. + +This is the first edition of the VVcode documentation, +@w{May 1992,} for VVcode version 1.00. + +Copyright (C) 1992 Niel Kempson + +This is the first edition of the VVcode documentation,@* +and is consistent with version 1.00 of VVcode. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation approved +by the Free Software Foundation. +@end ifinfo + + + +@c +@c ************************************************************************* +@c TITLE PAGE +@c ************************************************************************* +@setchapternewpage odd +@titlepage + +@c !!set Set the month and edition here. +@title{VVcode} +@subtitle{Last revised May 1992} +@subtitle{for VVcode version 1.00} +@author{Niel Kempson} +@page + +@vskip 1in +This is the first edition of the VVcode documentation and should be +consistent with the following versions of VVcode: + +@itemize @bullet + @item VVcode system v1.00 + @item MS-DOS port v1.00-001 + @item OS/2 port v1.00-001 + @item Unix port v1.00-001 + @item VAX/VMS port v1.00-001 + @item VM/CMS port v1.00-001 +@end itemize + +As VVcode is ported to new environments this documentation should be +updated. + +@vskip 0pt plus 1filll +Copyright @copyright{} 1992 Niel Kempson + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end titlepage +@page + + + +@c ************************************************************************* +@c NODE: the top +@c ************************************************************************* +@ifinfo +@node Top, Copying, (dir), (dir) +@top VVcode + +VVcode is a superior replacement for UUcode to enable the reliable +transmission of data over the world's e-mail networks. + +@c !!set Set the date and edition here. +This is the first edition of the VVcode documentation, +@w{May 1992,} for VVcode version 1.00. +@end ifinfo + +@menu +* Copying:: VVcode copying conditions +* Introduction:: Introduction to VVcode +* User Manual:: Guide to using VVcode +* Porting Guide:: How to port VVcode to a new environment +* Testing Guide:: How to test VVcode +* File Formats:: Definition of VVcode-related file formats +@end menu + + + +@c ************************************************************************* +@c CHAPTER: VVcode copying conditions +@c ************************************************************************* +@c node-name, next, previous, up +@node Copying, Copying, Top, Top +@unnumbered VVcode copying conditions + +The programs currently being distributed that relate to VVcode are +@dfn{free}; this means that everyone is free to use them and free to +redistribute them freely. The VVcode-related programs are not in the +public domain; they are copyrighted and there are restrictions on their +distribution, but these restrictions are designed to permit everything that +a good cooperating citizen would want to do. What is not allowed is to try +to prevent others from further sharing any version of these programs that +they might get from you.@refill + + Specifically, we want to make sure that you have the right to give away +copies of the programs that relate to VVcode, that you receive source code +or else can get it if you want it, that you can change these programs or +use pieces of them in new free programs, and that you know you can do these +things.@refill + + To make sure that everyone has such rights, we have to forbid you to +deprive anyone else of these rights. For example, if you distribute copies +of the VVcode related programs, you must give the recipients all the rights +that you have. You must make sure that they, too, receive or can get the +source code. And you must tell them their rights.@refill + + Also, for our own protection, we must make certain that everyone finds +out that there is no warranty for the programs that relate to VVcode. If +these programs are modified by someone else and passed on, we want their +recipients to know that what they have is not what we distributed, so that +any problems introduced by others will not reflect on our +reputation.@refill + + The precise conditions of the licenses for the programs currently being +distributed that relate to VVcode are found in the General Public Licenses +that accompany them.@refill + + + +@c ************************************************************************* +@c CHAPTER: Contributors to VVcode +@c ************************************************************************* +@c node-name, next, previous, up +@node Contributors, Contributors, Top, Top +@unnumbered Contributors to VVcode + +In addition to Niel Kempson, several people have contributed to the +development of VVcode. + +@itemize @bullet + @item Rainer Sch@"opf @code{<schoepf@@sc.ZIB-Berlin.de>} wrote the VM/CMS + implementation and has been very helpful during the testing of + VVcode. + @item Brian Hamilton Kelly @code{<TeX@@rmcs.cranfield.ac.uk>} for + encouragement and testing of the VAX/VMS implementation. + @item Konrad Bernlohr @code{<bern@@dhdmpi50.bitnet>} made some helpful + suggestions for improvements to the original version. + @item The Aston University @TeX{} archive group for help and + encouragement during the long gestation period. In alphabetical + order: + @itemize @bullet + @item Adrian Clark @code{<alien@@essex.ac.uk>} + @item Brian Hamilton Kelly @code{<tex@@rmcs.cranfield.ac.uk>} + @item Dave Osborne @code{<d.osborne@@mips.nottingham.ac.uk>} + @item Max Calvini @code{<m_calvini@@TeX.ac.uk>} + @item Peter Abbott @code{<p.abbott@@aston.ac.uk>} + @item Phil Taylor @code{<chaa006@@vax.rhbnc.ac.uk>} + @item Rainer Sch@"opf @code{<schoepf@@sc.ZIB-Berlin.de>} + @item Sebastian Rahtz @code{<s_rahtz@@TeX.ac.uk>} + @end itemize +@end itemize + + + +@c ************************************************************************* +@c CHAPTER: Introduction to VVcode +@c ************************************************************************* +@include vvintro.texinfo + + + +@c ************************************************************************* +@c CHAPTER: Guide to using VVcode +@c ************************************************************************* +@include vvuser.texinfo + + + +@c ************************************************************************* +@c CHAPTER: Installing VVcode +@c ************************************************************************* +@include vvinstal.texinfo + + + +@c ************************************************************************* +@c CHAPTER: How to port VVcode to a new environment +@c ************************************************************************* +@include vvport.texinfo + + + +@c ************************************************************************* +@c CHAPTER: How to test VVcode +@c ************************************************************************* +@include vvtest.texinfo + + + +@c ************************************************************************* +@c CHAPTER: Definition of VVcode-related file formats +@c ************************************************************************* +@include vvfiles.texinfo + + + +@c ************************************************************************* +@c Table of Contents +@c ************************************************************************* +@contents +@bye diff --git a/support/vvcode/doc/vvfiles.tex b/support/vvcode/doc/vvfiles.tex new file mode 100644 index 0000000000..bf019f4ddb --- /dev/null +++ b/support/vvcode/doc/vvfiles.tex @@ -0,0 +1,1287 @@ +@c ************************************************************************* +@c CHAPTER: Definition of VVcode-related file formats +@c ************************************************************************* +@c node-name, next, previous, up +@node File Formats, File Formats, Top, Top +@chapter Definition of VVcode-related file formats + + +@c ========================================================================= +@c SECTION: Format of the VVE file +@c ========================================================================= +@section Format of the VVE file + +A VVE file consists of three logical sections in the following logical +format: + +@example +<VVE file> ::= <initial preamble> + <encoded data lines> + <terminal postamble> +@end example + +The @code{<initial preamble>} and @code{<terminal postamble>} sections +contain VVE "header" lines used to record and control the characteristics +of the encoding/decoding process. The @code{<encoded data lines>} section +contains the data from the original file, encoded using the VVcode scheme. + +It is sometimes desirable to transmit the VVE file in more than one part, +so the logical format is extended to cater for multi-part files: + +@example +<first part> ::= <initial preamble> + <encoded data lines> + <continuation postamble> + +<middle part> ::= <continuation preamble> + <encoded data lines> + <continuation postamble> + +<last part> ::= <continuation preamble> + <encoded data lines> + <terminal postamble> +@end example + +There is always one @code{<first part>} and one @code{<last part>} part in +a multi-part VVE file. There may be zero (for a two part file) or more +@code{<middle part>} parts. + +The sections are described in more detail below. + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: Line Prefix and Suffix +@c ------------------------------------------------------------------------- +@subsection Line Prefix and Suffix +@itemize @bullet + @item each line has a "Vv" prefix and "V" suffix + + @item prefix - elimination of mailer lines + + @item postfix - avoid space stripping by certain mailers +@end itemize + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: Preamble Sections +@c ------------------------------------------------------------------------- +@subsection Preamble Sections +The preamble sections are used to initialize VVdecode before it starts to +decode the encoded file data. Each preamble consists of a set of VVE +header lines, each specifying a particular parameter relevant to the +encoding/decoding operation. Each preamble section comprises a set of +optional header lines followed by the set of required header lines. the +syntax and use of the header lines is described in section 1.4. + + +@subsubsection Preamble +The initial preamble is used to initialize VVdecode parameters before it +starts to decode the encoded file (e.g. the file mode and timestamp). The +logical format of this section is: + +@example +<initial preamble> ::= <optional initialization headers> + <begin header> +@end example + +The @code{mode}, @code{format} and optional headers may be in any order, +but the @code{begin} header must be the last header in this preamble +section. None, any or all of the following optional headers may be present +in the initial preamble section: + +@example +<optional initializiation headers> ::= <characterset header> + <comment header> + <decodeversion header> + <format header> + <mode header> + <operatingsystem header> + <recordlength header> + <table header> + <timestamp header> +@end example + +Note that only the @code{comment} header line may appear more than once in +this section. + +@subsubsection Continuation Preamble + +The initial preamble is used to reset certain VVdecode parameters before it +starts to decode the next section of the VVE file. The logical format of +this section is: + +@example +<continuation preamble> ::= <optional continuation headers> + <skipfrom header> +@end example + +The optional headers may be in any order, but the @code{skipfrom} header +must be the last header in this preamble section. None, any or all of the +following optional headers may be present in this section: + +@example +<optional initializiation headers> ::= <comment header> + <table header> +@end example + +Note that only the @code{comment} header line may appear more than once in +this section. + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: Postamble Sections +@c ------------------------------------------------------------------------- +@subsection Postamble Sections +The preamble sections are used to initialize VVdecode before it starts to +decode the encoded file data. Each preamble consists of a set of VVE +header lines, each specifying a particular parameter relevant to the +encoding/decoding operation. Each preamble section comprises a set of +optional header lines followed by the set of required header lines. + +@subsubsection Postamble +[TODO] put in some text here +@example +<continuation postamble> ::= <skipto header> + <comment header> +@end example + +The @code{comment} header line is optional and may appear more than once in +this section. + +@subsubsection Terminal Postamble +[TODO] put in some text here +@example +<continuation preamble> ::= <end header> + <optional terminal headers> + +<optional initializiation headers> ::= <bytecount header> + <comment header> + <crc32 header> +@end example + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: Encoded Data Lines +@c ------------------------------------------------------------------------- +@subsection Encoded Data Lines +[TODO] put in some text here +@itemize @bullet + @item describe what these lines are used for + + @item format of the encoded line + + @item termination of each section of encoded data (zero length line) + + @item describe the different underlying data formats for fixed, stream + and variable format records +@end itemize + + +@c ========================================================================= +@c SECTION: VVE Header Lines +@c ========================================================================= +@section VVE Header Lines + +A VVE header line takes the form + +@example +<header-name> <parameter-1> <parameter-2> ... <parameter-N> +@end example + +Most headers take only one parameter and parameters are normally separated +by whitespace, though certain headers (e.g. @code{begin}) take more than one +parameter and can include whitespace in the parameters. The format of each +of the VVE header lines is described below. Two important symbols used in +the description are: + +@table @code + @item <WS> + used to denote whitespace which may include spaces, tabs but not + the end of the line. The syntax + + @example + xyz <WS> parameter <WS> <EOL> + @end example + + states that header @code{xyz} takes a parameter which starts at the + first non-whitespace character after the @code{xyz} header name and + is terminated by the first whitespace character after that or the + end of line. This syntax is used to specify parameters which do + not contain whitespace. + + @item <EOL> + used to denote the end of the line. The syntax + + @example + xyz <WS> parameter <EOL> + @end example + + states that header @code{xyz} takes a parameter which starts at the + first non-whitespace character after the @code{xyz} header name and + is terminated by the end of the line. This format would be used to + specify that parameters can include whitespace. + + @item <NXT-HDR> + used to denote the next VVE header in the file. The syntax + + @example + xyz <WS> parameter <NXT-HDR> + @end example + + states that the header @code{xyz} takes a parameter which starts at + the first non-whitespace character after the @code{xyz} header + name and is terminated by the start of the next VVE header. This + format would be used to specify that parameters can span several + lines. + + NOTE: the @code{<EOL>} characters are removed when the contents of + the lines are joined together. +@end table + +Following is a detailed description of each VVE header. For each header +there is a set of headings in the format shown below for the @code{example} +header. + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{example} +@c ------------------------------------------------------------------------- +@page +@subsection @code{example} + +@table @strong + @item Purpose: + Brief summary of the purpose of this header. + + @item Location: + Describe where in the VVE file that this header will be found. The + locations are: + + @itemize @bullet + @item initial preamble + @item continuation preamble + @item continuation postamble + @item terminal postamble + @end itemize + + Also indicated is whether the header is required or optional. + + @item Syntax: + @code{example <WS> parameter <WS> <EOL>} + + This part shows the syntax of the header including the header name, + the number of parameters and the delimiters used to separate the + parameters. + + @item Remarks: + This part provides extra information on the use of the header and + includes any limits that are imposed on the parameter value. + + @item VVencode: + The header will be written to the VVE file by Vvencode and this + part describes the circumstances under which VVencode will write + the header line. + + @item VVdecode: + This part describes how VVdecode should behave when it encounters + the header in a VVE file. In addition, specific processing rules + are documented for specific cases, namely: + + @table @code + @item OK + what VVdecode should do if a valid header line is found in + the VVE file. + + @item MISSING + what VVdecode should do if the header line was not found in + the VVE file. + + @item INVALID + what VVdecode should do if the header line was found, but + with missing or invalid parameter values. + @end table + + @item Example: + @code{example parameter} + + Here you'll find a simple example of a valid example header line. +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{begin} +@c ------------------------------------------------------------------------- +@page +@subsection @code{begin} +@table @strong + @item Purpose: + Signifies the absolute start of the VVencoded data. + + @item Location: + Initial preamble (required). + + @item Syntax: + @code{begin <WS> file-specification <EOL>} + + @item Remarks: + The file specification may include spaces, though leading and + trailing spaces will be lost. There is no restriction on the + characters used in the file specification, but characters outside + the VVcode default encoding table may be corrupted when passing + through mail gateways or systems with differing character sets. + + @item VVencode: + The file specification recorded in the VVE file is usually derived + from the input file specification stripped of any preamble or + postamble components and will therefore consist only of a name + and/or extension component. The value recorded can be explicitly + specified with the @code{header_filespec} command qualifier. + + @item VVdecode: + VVdecode will use the file specification recorded to construct the + default file specification for the output file. If the output file + is specified on the VVdecode command line, the value specified on + the @code{begin} header will only be used if the implementation of + VVcode for the operating system has been defined to use "sticky + defaults". + + The file specification may have been derived from a different + operating system and may therefore be invalid on the local system. + Before it is used VVdecode will convert the file specification to + one that is valid. + + Processing rules: + + @table @code + @item OK + If required, convert the file specification so that it is + legal on the local operating system and use the legal value + as the default file specification for the output file. + + @item MISSING + Issue a fatal error message and stop. + + @item INVALID + Issue a fatal error message and stop. + @end table + + @item Example: + @code{begin input-file.txt}@* + @code{begin input file name with spaces} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{bytecount} +@c ------------------------------------------------------------------------- +@page +@subsection @code{bytecount} +@table @strong + @item Purpose: + Records the total number of bytes read by VVencode. + + @item Location: + Final postamble (optional). + + @item Syntax: + @code{bytecount <WS> total-bytes-read <WS> <EOL>} + + @item Remarks: + The total is a positive signed 32 decimal bit number and must + therefore be in the range 0 - 2147483647. On systems which + differentiate between binary and text files, this number is likely + to be dependent on the mode (i.e. binary/text) used to read and + encode the file. + + @item VVencode: + VVencode keeps a cumulative total of the bytes read and record this + total in the terminal postamble of VVE file. + + @item VVdecode: + VVdecode keeps a cumulative total of the bytes decoded and written + and compare it with the VVE recorded value as a confidence check. + + Processing rules: + + @table @code + @item OK + Compare the VVE recorded value with the total bytes written + by VVdecode. Issue a warning if the two totals are + different. + + @item MISSING + Don't attempt the comparison. + + @item INVALID + Issue a non-fatal error message and assume that the header + is missing. + @end table + + @item Example: + @code{bytecount 8388608} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{characterset} +@c ------------------------------------------------------------------------- +@page +@subsection @code{characterset} +@table @strong + @item Purpose: + Records the character set of the VVencoded data. + + @item Location: + Initial preamble (optional). + + @item Syntax: + @code{characterset <WS> charset-string <WS> <EOL>} + + @item Remarks: + The parameter string records the character set of the encoded data + in the VVE file. There are no formal controls on the string to use + for a particular character set, the string is simply compared + against a local value. Eventually, an informal directory of + character set strings may evolve. + + @item VVencode: + VVencode will record the character set of the encoded data which + under normal circumstances the character set will be the local + character set for the operating system. If the + @code{translation_file} command line qualifier is specified, + VVencode will translate the original data from the local character + set to a new character set specified by the translation file. In + this case, VVencode will record the new character set. + + @item VVdecode: + VVdecode uses this header to determine whether the encoded data in + the VVE file is of the same character set as that used on the local + operating system. If the character sets are different, a warning + will be issued. + + If the @code{translation_file} command line qualifier is specified, + VVdecode will translate the VVE encoded data to a new character set + specified by the translation file. In this case, VVdecode will + compare the VVE file character set with the "from" character set + expected by the translation file. + + Processing rules: + + @table @code + @item OK + Compare the VVE character set with the local operating + system character set (or the translation file "from" + character set if appropriate). Issue a warning message if + the two character sets are different. + + @item MISSING + Assume that the VVE character set is the same as the local + operating system character set. + + @item INVALID + Issue a non-fatal error message and assume that the header + is missing. + @end table + + @item Example: + @code{characterset ASCII} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{comment} +@c ------------------------------------------------------------------------- +@page +@subsection @code{comment} +@table @strong + @item Purpose: + Records commentary information deemed to be of sufficient + importance to warrant displaying it when VVdecoding the file. + + @item Location: + Initial preamble, continuation preamble, continuation postamble, + final postamble (optional). + + @item Syntax: + @code{comment <WS> comment-string <EOL>} + + @item Remarks: + The comment string is free form text, but care should be taken not + to use characters that may be corrupted by mail gateways or when + passing through systems with different character sets. + + @item VVencode: + VVencode will record information deemed (by the programmer) to be + important and worth flagging to the VVdecode user. Currently this + facility is only used to record the original character set when + VVencode has been invoked with @code{translation_file} command line + qualifier to convert the original data to a new character set + before VVencoding. + + @item VVdecode: + Generally VVdecode will display any comments encountered on the log + file. + + Processing rules: + + @table @code + @item OK + If the @code{log} command line qualifier was specified, + display the comment on the log file, otherwise ignore the + comment. + + @item MISSING + No action. + + @item INVALID + Issue a non-fatal error message and ignore the comment. + @end table + + @item Example: + @code{comment This file is only useful on Unix systems}@* + @code{Original character set was `EBCDIC'} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{crc32} +@c ------------------------------------------------------------------------- +@page +@subsection @code{crc32} +@table @strong + @item Purpose: + Records the 32 bit CRC of the bytes read by VVencode. + + @item Location: + Final postamble (optional). + + @item Syntax: + @code{crc32 <WS> input-file-crc32 <WS> <EOL>} + + @item Remarks: + The CRC value is an unsigned 32 bit hexadecimal number and must + therefore be in the range 0 - FFFFFFFF. On systems which + differentiate between binary and text files, this number is likely + to be dependent on the mode (i.e. binary/text) used to read and + encode the file. + + The CRC polynomial used is the same as that used by the popular ZIP + and ARJ archiving programs. When encoding in binary mode, the CRC + recorded should be identical to that computed by ARJ and ZIP. + + @item VVencode: + VVencode computes a 32 bit CRC of the bytes read and record this + CRC in the terminal postamble of VVE file. + + @item VVdecode: + VVdecode computes a 32 bit CRC of the bytes decoded and written and + compare it with the VVE recorded value as a confidence check. + + Processing rules: + + @table @code + @item OK + Compare the VVE recorded value with the total bytes written + by VVdecode. Issue a warning if the two CRCs are + different. + + @item MISSING + Don't attempt the comparison. + + @item INVALID + Issue a non-fatal error message and assume that the header + is missing. + @end table + + + @item Example: + @code{crc32 1e0cb8a7} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{decodeversion} +@c ------------------------------------------------------------------------- +@page +@subsection @code{decodeversion} +@table @strong + @item Purpose: + Records the minimum major version number of VVcode required to + decode the VVE file. + + @item Location: + Initial preamble (optional). + + @item Syntax: + @code{decodeversion <WS> min-decode-version <WS> <EOL>} + + @item Remarks: + The minimum decode version is a positive integer and records the + minimum major version of VVcode required to decode the VVE file. + + The VVcode version number has a "major" and "minor" version. For + example, VVcode version 1.2 has a major version of 1 and a minor + version of 2 and the header + + @example + decodeversion 2 + @end example + + signifies that VVdecode version 2.0 or later is required to decode + the file. + + Whenever a change is made to the VVE file format that is not + backwards compatible, the major version number of VVcode will be + incremented. + + @item VVencode: + VVencode records the minimum major version number required to + decode the VVE file in the initial preamble of the VVE file. + + @item VVdecode: + VVdecode uses the recorded value to check whether it can decode the + file. + + Processing rules: + + @table @code + @item OK + Check that the major version of VVdecode is not less than + the recorded value. If it is, issue a fatal error message + and stop. + + @item MISSING + Assume that the current version of VVdecode is OK and + proceed. + + @item INVALID + Issue a non-fatal error message and assume that the header + is missing. + @end table + + @item Example: + @code{decodeversion 1} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{end} +@c ------------------------------------------------------------------------- +@page +@subsection @code{end} +@table @strong + @item Purpose: + Signifies the absolute end of the VVencoded data. + + @item Location: + Final postamble (required). + + @item Syntax: + @code{end <WS> <EOL>} + + @item Remarks: + This header signifies that there are no more encoded data lines to + process and that the terminal preamble is about to start. + + @item VVencode: + After the complete input file has been encoded, VVencode will write + a "zero length" encoded line followed by the @code{end} header line + and the terminal postamble section. + + @item VVdecode: + After reading this header, VVdecode will cease decoding the encoded + data bytes and start to read the terminal postamble. + + Processing rules: + + @table @code + @item OK + Cease decoding the encoded data bytes and start to read the + terminal postamble. + + @item MISSING + Issue a fatal error message and stop. + + @item INVALID + This shouldn't be possible, but if so issue a fatal error + message and stop. + @end table + + @item Example: + @code{end} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{format} +@c ------------------------------------------------------------------------- +@page +@subsection @code{format} +@table @strong + @item Purpose: + Records the file organization format of the VVencoded file. + + @item Location: + Initial preamble (optional). + + @item Syntax: + @code{format <WS> format-string <WS> <EOL>} + + @item Remarks: + The format string must be one of "fixed", "stream" or "variable", + though the value may be lower, upper or mixed case. VVcode + supports these three type of file organization, though not all + operating systems will support all three. Note that the internal + format of the encoded data will depend on the file organization. + + @item VVencode: + VVencode records the organization of the encoded file. Note that + this is the format used by VVencode to read the file which may not + necessarily be the real format of the original file. + + @item VVdecode: + VVdecode will use this header to identify the internal format of + the encoded data to enable it to be decoded correctly. The format + will also be used as the default format to create the output file. + + If the VVE file format is not supported by the local operating + system, VVdecode will create the output file using the default file + format for the operating system. The @code{format} command line + qualifier may be used to override the format of the output file. + + Processing rules: + + @table @code + @item OK + Use the header value to decode the encoded data bytes and + to determine the default format of the output file. + + @item MISSING + Issue a fatal error message and stop. + + @item INVALID + Issue a fatal error message and stop. + @end table + + @item Example: + @code{format stream} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{mode} +@c ------------------------------------------------------------------------- +@page +@subsection @code{mode} +@table @strong + @item Purpose: + Records the mode of the VVencoded file. + + @item Location: + Initial preamble (optional). + + @item Syntax: + @code{mode <WS> mode-string <WS> <EOL>} + + @item Remarks: + The format string must be one of "binary" or "text", though the + value may be lower, upper or mixed case. VVcode supports both + binary and text mode files, though not all operating systems will + support both modes. The mode will often influence the default file + format used by the operating system. Most operating systems + distinguish between text and binary files, though Unix is a notable + exception. + + @item VVencode: + VVencode records the mode of the encoded file. Note that this is + the mode used by VVencode to read the file which may not + necessarily be the real mode of the original file. + + @item VVdecode: + VVdecode will use this header to mode of the encoded file. The + mode will also be used as the default mode for the output file. + + If the VVE file mode is not supported by the local operating + system, VVdecode will create the output file using the default file + mode for the operating system. The @code{mode} command line + qualifier may be used to override the mode of the output file. + + Processing rules: + + @table @code + @item OK + Use the header value to determine the default mode of the + output file. + + @item MISSING + Issue a fatal error message and stop. + + @item INVALID + Issue a fatal error message and stop. + @end table + + @item Example: + @code{mode binary} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{operatingsystem} +@c ------------------------------------------------------------------------- +@page +@subsection @code{operatingsystem} +@table @strong + @item Purpose: + Records the operating system on which the file was VVencoded. + + @item Location: + Initial preamble (optional). + + @item Syntax: + @code{operatingsystem <WS> operating-system-name <WS> <EOL>} + + @item Remarks: + The parameter string records the operating system on which the + version of VVencode used to create the VVE file was running. There + are no formal controls on the string to use for a particular + character set, the string is simply compared against a local value. + The string is coded into the VVcode machine dependent header file + so this shouldn't be too much of a problem. + + It is useful for the decoder to know whether the file was encoded + on the same operating system to influence the decoding process. + For example, if the original operating system is different any + private data would usually be ignored. + + @item VVencode: + VVencode will record the string for the local operating system as + coded in the machine dependent header file (machine.h). + + @item VVdecode: + VVdecode will compare the header value with that recorded for the + local operating system in the machine dependent header file + (machine.h) to determine whether the original file was encoded on + the same operating system. + + Processing rules: + + @table @code + @item OK + Compare the header value with the local operating system + string to determine whether the two operating systems are + different. Parts of the decoding process will be affected + by this decision. + + @item MISSING + Assume that the operating system on which the file was + encoded is the same as the local operating system. + + @item INVALID + Issue a non-fatal error message and assume that the header + is missing. + @end table + + @item Example: + @code{operatingsystem MS-DOS}@* + @code{operatingsystem Unix} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{recordlength} +@c ------------------------------------------------------------------------- +@page +@subsection @code{recordlength} +@table @strong + @item Purpose: + Records the maximum and longest length records in the VVencoded + file. + + @item Location: + Initial preamble (optional). + + @item Syntax: + @code{recordlength <WS> max-rec-len <WS> long-rec-len <WS> <EOL>} + + @item Remarks: + Both versions of the record length must be either a decimal number + within the VVcode supported range of 0 - 65535 or -1. The value -1 + has a special meaning for each of the record lengths: + + max-rec-len the maximum record length is unknown or there is no + explicit maximum record length for this file + (this usually defaults to the maximum record + length supported by the operating system). + + lng-rec-len the length of the longest record in the file is + unknown. + + The record length is usually relevant only for fixed and variable + length record format files. The maximum record length is that + allowed by the operating system for the file, whereas the longest + is the length of the longest record in the file. For variable + length record files the longest length must be less than or equal + to the maximum record length, whereas for fixed length record + files, the longest record length should be equal to the maximum + record length. + + @item VVencode: + Where possible, VVencode will attempt to determine these parameters + and record them in the VVE file. Note that the @code{recordlength} + header is in the initial preamble so these parameters must be + determined before the file is opened for encoding. The value may + be overridden by the @code{record_length} command line qualifier. + + @item VVdecode: + If the output file format is fixed or variable length records, + Vvdecode will use these values to create a file of the correct + type. The parameter values will be checked, even if they will not + be used during the subsequent decoding activities. If the + parameter values are unknown or invalid, VVdecode will use default + values appropriate to the file format and the local operating + system. + + Note that the record length might be valid for the VVE file (i.e. + in the range 0 - 65535), but be invalid for the file format and + local operating system. + + Processing rules: + + @table @code + @item OK + Use the values to create a file of the correct type and + format. + + @item MISSING + Use appropriate default values for the file format and + local operating system. + + @item INVALID + Issue a non-fatal error message and assume that the header + is missing. + @end table + + @item Example: + @code{recordlength -1 132}@* + @code{recordlength 255 -1}@* + @code{recordlength 32256 32256} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{skipfrom} +@c ------------------------------------------------------------------------- +@page +@subsection @code{skipfrom} +@table @strong + @item Purpose: + Signifies the start of a segment of VVencoded data. + + @item Location: + Continuation preamble (required). + + @item Syntax: + @code{skipfrom <WS> part-number <WS> file-specification <EOL>} + + @item Remarks: + The @code{skipfrom} header is used when VVencode creates a + multi-part VVE file and is analogous to the @code{begin} header in + the first part. The part-number parameter records the number of + the previous VVE file part. Both parameters are included in the + header to provide a reasonable degree of confidence that the wanted + part of the encoded file has been found. + + @item VVencode: + A @code{skipfrom} header will only be written if VVencode was + invoked with the @code{split_size} command line qualifier and the + VVE file is long enough to require more than one part. The file + specification recorded in the VVE file is the same as that in the + @code{begin} header. The number of the previous VVE file part is + also recorded. + + @item VVdecode: + VVdecode will check that the file specification and part number + match those expected for the next part. If both do not match, + VVdecode will continue to look for the wanted VVE file part. + + Processing rules: + + @table @code + @item OK + If the wanted part has been found, start to decode the next + section of encoded data lines. If this @code{skipfrom} + does not correspond to the wanted part, continue to search + for the correct @code{skipfrom} header. + + @item MISSING + Issue a fatal error message and stop. + + @item INVALID + Issue a non-fatal error message and ignore the header. + @end table + + @item Example: + @code{skipfrom 2 input-file.txt}@* + @code{skipfrom 2 file name with spaces} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{skipto} +@c ------------------------------------------------------------------------- +@page +@subsection @code{skipto} +@table @strong + @item Purpose: + Signifies the end of a segment of VVencoded data with more data + still to come. + + @item Location: + Continuation postamble (required). + + @item Syntax: + @code{skipto <WS> part-number <WS> <EOL>} + + @item Remarks: + The @code{skipto} is used when VVencode creates a multi-part VVE + file and is analogous to the @code{end} header in the last part. + The parameter records the number of the next VVE file part. + + @item VVencode: + A @code{skipto} header will only be written if VVencode was invoked + with the @code{split_size} command line qualifier and the VVE file + is long enough to require more than one part. The number of the + next VVE file part is recorded. + + After the section of encoded files has been completed, VVencode + will write a "zero length" encoded line followed by the @code{skipto} + header line. + + @item VVdecode: + After reading this header, VVdecode will check that the part number + recorded is correct. If it is, VVdecode will start to search for + the next VVE file part. + + Processing rules: + + @table @code + @item OK + Start to search for the next VVE file part. + + @item MISSING + Issue a fatal error message and stop. + + @item INVALID + Issue a fatal error message and stop. + @end table + + @item Example: + @code{skipto 2} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{table} +@c ------------------------------------------------------------------------- +@page +@subsection @code{table} +@table @strong + @item Purpose: + Records the character table used to encode the file data bytes. + + @item Location: + Initial preamble, continuation preamble (optional). + + @item Syntax: + @code{table <WS> table-contents <NXT-HDR>} + + @item Remarks: + The encoding table is recorded along with the data to enable the + decoding program to detect any simple character translations or + corruptions that may have occurred during the transmission of the + VVE file. There is no restriction on the characters that may be + used in the encoding table, but it is sensible to use characters + that are normally immune to network corruptions. + + The table comprises 64 characters which are used to represent the + codes 0 - 63 of the VVcode encoding character set. The table + contents may be presented on the same line as the @code{table} + header or preferably split over several lines to avoid the wrapping + of long lines performed by some mail gateways. If the table + contents are split over several lines, the newline characters are + removed before the lines are concatenated. The next valid header + line encountered will terminate the reading of the table contents. + + Note that whitespace characters at the end of a line may be removed + in transmission by certain systems that strip trailing whitespace + from files. It is strongly recommended that whitespace characters + are not used in encoding tables. + + @item VVencode: + VVencode will record the contents of the encoding table used to + encode the original file. + + @item VVdecode: + VVdecode will use the contents of the encoding table to construct + (by inversion) the table to decode the VVE file data. The table + contents will be checked for length and repeated characters which + would prevent the construction of a valid decoding table. + + Processing rules: + + @table @code + @item OK + Use the table contents to construct the decoding table and + thus decode the VVE file. + + @item MISSING + Assume the default VVcode table. + + @item INVALID + Issue a fatal error message and stop. + @end table + + @item Example: + @code{table}@* + @code{+-0123456789}@* + @code{abcdefghijklmnopqrstuvwxyz}@* + @code{ABCDEFGHIJKLMNOPQRSTUVWXYZ}@* + @code{begin file-specification} +@end table + + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: @code{timestamp} +@c ------------------------------------------------------------------------- +@page +@subsection @code{timestamp} +@table @strong + @item Purpose: + Records the modification time of the VVencoded file. + + @item Location: + Initial preamble (optional). + + @item Syntax: + @code{timestamp <WS> VVcode-timestamp <WS> <EOL>} + + @item Remarks: + This header is used to record the modification time of the encoded + file so that it can be preserved when the file is decoded. The + timestamp is recorded in the format: + + @example + YYYY.MM.DD-HH:MM:SS + @end example + + where each of the components are defined as: + + @table @code + @item YYYY + year (range: 1970 - 2037) + @item MM + month (range: 01 -12) + @item DD + day of month (range: 01 - 31) + @item HH + hour (range: 00 - 23) + @item MM + minutes (range: 00 - 59) + @item SS + seconds (range: 00 - 59) + @end table + + The time is based on the Unix internal time format which represents + the time as a signed 32 bit integer recording the number of seconds + since 1-Jan-1970 00:00 GMT. The VVE timestamp recorded must be in + the range: + + 1970.01.01-00:00:00 to 2037.12.31-23:59:59 GMT + + Some operating systems support a wider range of system times (e.g. + VAX/VMS) and some support only a narrower range (e.g. MS-DOS) but + implementations of VVcode for these systems must ensure that + timestamps in the VVcode range can be handled when encoding and + decoding. + + Note: The timestamp is always recorded as a GMT (or Coordinated + Universal Time) time. + + @item VVencode: + VVencode will record the modification time of the encoded file or + that specified with the @code{timestamp} command line qualifier. + If VVencode cannot determine the modification time of the encoded + file and the time is not specified using the @code{timestamp} + command line qualifier, the @code{timestamp} VVE header line will + not be recorded. If the timestamp of the file is outside the range + of times supported by the VVE file, VVencode should either + "truncate" the time value to a value that is within the range or + not record the timestamp. In either case, a warning should be + issued. + + @item VVdecode: + VVdecode will use the @code{timestamp} header value to set the + modification of the decoded file to that recorded. If the + implementation of VVdecode is unable to do this, it should issue a + warning. + + If the timestamp recorded in the VVE file is outside the range of + times supported by the operating system, VVdecode should either + "truncate" the time value to a value that is within the range or + not set the file timestamp. In either case, a warning should be + issued. + + Processing rules: + + @table @code + @item OK + Use the header value to set the modification time of the + decoded file. + + @item MISSING + Do not attempt to set the modification time of the output + file (it will probably be created with a timestamp of the + current date and time). + + @item INVALID + Issue a non-fatal error message and assume that the header + is missing. + @end table + + @item Example: + @code{timestamp 1991.12.01-12:10:34 GMT} +@end table + + +@c ========================================================================= +@c SECTION: VVE encoded data format +@c ========================================================================= +@section VVE encoded data format + + +@c ========================================================================= +@c SECTION: XLT translation file format +@c ========================================================================= +@section XLT translation file format + + +@c ========================================================================= +@c SECTION: TBL encoding table file format +@c ========================================================================= +@section TBL encoding table file format + + diff --git a/support/vvcode/doc/vvinstal.tex b/support/vvcode/doc/vvinstal.tex new file mode 100644 index 0000000000..58700b0e5a --- /dev/null +++ b/support/vvcode/doc/vvinstal.tex @@ -0,0 +1,17 @@ +@c ************************************************************************* +@c CHAPTER: Installing VVcode +@c ************************************************************************* +@c node-name, next, previous, up +@node Installing, Installing, Top, Top +@chapter Installing VVcode + + +@c ========================================================================= +@c SECTION: File distribution +@c ========================================================================= +@section{File distribution} + +@c ========================================================================= +@c SECTION: Installation examples +@c ========================================================================= +@section{Installation examples} diff --git a/support/vvcode/doc/vvintro.tex b/support/vvcode/doc/vvintro.tex new file mode 100644 index 0000000000..303a08ce48 --- /dev/null +++ b/support/vvcode/doc/vvintro.tex @@ -0,0 +1,483 @@ +@c ************************************************************************* +@c CHAPTER: Introduction to VVcode +@c ************************************************************************* +@c node-name, next, previous, up +@node Introduction, Introduction, Top, Top +@chapter Introduction to VVcode + +Reliable and faithful exchange of binary files between computers over +networks is a well-known problem, especially if the computers use different +operating systems and are connected to different networks via a gateway. +Unfortunately inter-networking and electronic mail are very much children +of the 1960s: they might have had to wait until the 1970s for their +naissance, but their progenitors were mentally locked-in to the concept of +the 7-bit ASCII code for conveying textual information. The @TeX{} +community has long been aware of this problem when trying to exchange +``machine-independent'' @file{.dvi} files and font-related data such as +@file{.tfm} and @file{.pk} files. It has sometimes been possible to +exchange this binary data by using encoding schemes that allow the data to +be represented using a subset of the seven-bit ASCII character set. + +Academics and authors in many fields have hitherto been able to pass +@file{.tex} files back-and-forth by electronic mail---apart from a few +minor quirks and blemishes, such @TeX{} source files pass unharmed across +the planet's networks. Problems are encountered when mail passes through +certain gateway machines which introduce irreversible character +corruptions. Particularly notorious is the Janet/Bitnet gateway +which has the unfortunate habit of converting @samp{^} to @samp{~} and +@samp{~} to @samp{%}: since it leaves @samp{%} itself unaffected, this +makes recovery of the original file a non-trivial exercise. It sometimes +also changes the brace characters @samp{@{@}} into odd characters above +128: this is particularly embarrassing, of course, for @file{.tex} files! + +For some years many @TeX{} users, particularly those working in languages +other than English, and thus familiar with character set encodings +containing other than the basic ASCII set, have been agitating for +@TeX{} to be able to handle input in their mother tongues, using their own +languages' character sets. In 1989, Knuth announced @TeX{} V3, and +implementors world-wide beavered away to bring each implementation +up-to-date. @TeX{} V3 now supports eight-bit character sets and so +@file{.tex} source files are now effectively `binary' files and will +therefore suffer from the same exchange problems experienced with +@file{.dvi} files. + +All those authors that had previously been able to cooperate, despite being +separated by hundreds or thousands of miles, might once again be forced to +entrust floppy disks to the vagaries of the world's postal systems +(although one shouldn't underestimate the bandwidth of the Royal [or other] +Mail system). + +Unless or until the various e-mail protocols, networks and software are +converted to support uncorrupted transmission of characters codes +@code{0x20 @dots{} 0x7e} and @code{0xa1 @dots{} 0xfe}, it will have to +become the norm for @file{.tex} sources to be encoded for transmission by +e-mail. + +This problem is of course well known outside the @TeX{} community. + + +@c ========================================================================= +@c SECTION: The Aston Archive +@c ========================================================================= +@section{The Aston Archive} +The author is a volunteer assistant to Peter Abbott in running the world's +principal repository of @TeX{}-related material at Aston University in +Birmingham. The archive (host: @code{TeX.Ac.Uk}) holds several hundred +megabytes of text and binary files including: + +@itemize @bullet + @item program sources for @TeX{}, @code{METAFONT}, DVI drivers and many + other utilities; + @item binary executables for a variety of popular operating systems (e.g. + Atari, Macintosh, MS-DOS, Unix, VAX/VMS and VM/CMS); + @item @code{METAFONT} sources for Computer Modern and other fonts; + @item binary font files (mainly @file{.tfm} and @file{.pk}) for a number of + different output devices; + @item text macro and style files. +@end itemize + +The archive provides access to these files via the following services: + +@itemize @bullet + @item NIFTP@footnote{Network Independent File Transfer Protocol --- in the + UK, one does not perform the pseudo-login that + Internet users are accustomed to using with the FTP + protocol: instead, one issues a ``transfer request'' + for a file to be sent to or from the remote + machine --- the transfer itself takes place + asynchronously. One nice consequence is that such + transfers can be queued for overnight execution, + leaving daytime bandwidth free for e-mail and true + remote interactive logins.} + from Janet hosts---typically 300 megabytes of data are transferred + every month; this would probably be much greater if we were not + limited by the bandwidth of our 9600Bd connection to Janet. + @item FTP and Telnet access from Internet hosts. + @item Interactive browsing service via Janet PAD, including the facility + to send files out using NIFTP (and later FTP). + @item Interactive browsing service via dialup modem lines, including the + facility to download files using Kermit and similar protocols. + @item An e-mail file server which typically sends 150 megabytes of data per + month to sites all over the world (though predominantly to + EARN/Bitnet sites). + @item A magnetic media distribution service via surface carriers. + Copies of the entire archive have been sent to embryonic @TeX{} + communities in Czechoslovakia, Hungary and Poland. +@end itemize + +We have experienced many problems trying to support all of these file +types, operating systems and access methods. The e-mail file server +clearly needs a reliable method of encoding files if its many customers are +not to be denied access to the non-text files in the archive. + +Binary files such as @file{.pk} font files are stored in different ways to +accommodate the requirements of the different operating systems supported. +Currently we maintain multiple font directory trees for the Macintosh, +MS-DOS, Unix and VAX/VMS with all the attendant problems of +synchronization, disk space and archivists' time. We need a single storage +format which allows export to all of our supported operating systems. + + +@c ========================================================================= +@c SECTION: Specification for a Coding Scheme +@c ========================================================================= +@section{Specification for a Coding Scheme} +In mid-1990, the archivists came to the conclusion that a universal +encoding scheme was required to accommodate the many different kinds of +file and file organizations that needed to be supported by the archive. + +Niel Kempson formulated the first draft of this specification in mid-1990; +the requirements of the encoding scheme may be summarized as follows: + +@table @strong + @item Preserving File Structure + It is insufficient, especially for an archive holding text and + binary files for a variety of machine types, merely to encode data + simply as a stream of bytes: + + @itemize @bullet + @item Virtually all operating systems (except Unix) make a + distinction between binary and text files, so the coding + system should recognize and maintain this distinction. + @item Unix and most PC-based operating systems treat files as + streams of bytes with no further structure imposed. On the + other hand, certain widely-used operating systems (e.g. + VAX/VMS and VM/CMS) have record-oriented file systems where + different types of file are stored in a format appropriate to + the type of file@footnote{It is often argued that the + increase in efficiency more than offsets the increase in + complexity.}. + + For these operating systems, we consider it essential that + the encoding scheme should identify, preserve and record the + most commonly used file organizations. The decoding program + should be able to use this information to create the output + file using the organization appropriate to the operating + system in use. If the information is of no consequence to + the receiving system, the default file structure (if any) + should be created. If the encoding system does not have + structure in its files, the receiving system may provide + suitable defaults automatically. In all cases the programs + should permit the user to override or supplement file + structure information. + + @item Whenever possible, these details of structure should be + determined automatically by the encoding program; at the very + least, an indication of whether the file is text or binary + shall be provided, even under an operating system such as + Unix that need make no such distinction for its own use, to + allow decoding to an appropriate file organization on those + systems that {@emph do} make such a distinction. + @end itemize + + @item Coding Scheme + Whatever method is used must allow encoded data to be e-mailed: + + @itemize @bullet + @item It should be possible to specify the coding table to be used + to encode the data. The coding table used shall be recorded + with each part of the encoded data. + @item If a recorded coding table is found while decoding, it should + be used to construct an appropriate decoding table. Simple + one-to-one character corruptions should be corrected as long + as only one of the input characters is mapped to any one + output character. + @item The recommended encoding uses only the following characters: + @quotation + @code{+-0123456789}@* + @code{abcdefghijklmnopqrstuvwxyz}@* + @code{ABCDEFGHIJKLMNOPQRSTUVWXYZ} + @end quotation + + Such an encoding as originally used for XXcode has been shown + to pass successfully through all the gateways which are known + to corrupt characters. + @end itemize + + @item Integrity of Encoded Data + We want to ensure that the @emph{whole} encoded file passes through + the e-mail network. + + @itemize @bullet + @item Encoded lines should be prefixed by an appropriate character + string to distinguish them from unwanted lines such as mail + headers and trailers. Whilst not essential, this feature + does assist the decoding program in ignoring these spurious + data. + @item Lines should not end with whitespace characters as some + mailers and operating systems strip off trailing whitespace. + @item The encoding program should calculate parameters of the input + file such as the number of bytes and CRC and record them at + the end of the encoded data. + + The decoding program should calculate the same parameters + from the decoded data and compare the values obtained from + those recorded at the end of the encoded data. + @end itemize + @item Making Files Mailable + A mechanism is needed to overcome some gateways' refusal to handle + large files. + + @itemize @bullet + @item The encoding program should be able to split the encoded + output into parts, each no larger than a maximum specified + size. Splitting the output into smaller parts is useful if + the encoded data is to be transmitted using electronic mail + or over unreliable network links that do not stay up long + enough to transmit a large file. The recommended default + maximum part size is 30kB. + @item The decoding program should be able to decode a multi-part + encoded file very flexibly. It should @emph{not} be + necessary to: + + @enumerate + @item strip out mail headers and trailers; + @item combine all of the parts into one file in the + correct order; + @item process each part of the encoded data as a + separate file. + @end enumerate + @item In addition any file specifications from the operating system + on which the VVE file was created must not prevent the file + from being decoded. + @end itemize + + @item Miscellaneous + Further considerations include: + + @itemize @bullet + @item Support for character sets other than ASCII is essential + if the encoding scheme is to be useful to IBM hosts. The + encoding program should label the character set used by the + encoded data, and both encoder and decoder should enable the + conversion between the local character set and another + character set. For example a user on an EBCDIC host + should be able to encode text files for transmission to another + EBCDIC host, or to convert them to ASCII before + encoding and transmission to an ASCII host. Similarly, + that user should be able to decode text files from ASCII + and EBCDIC machines, creating EBCDIC output files. + @item Where possible, the original file's timestamp should be encoded + and used by the decoding program when recreating the file: this + will permit archives to retain the originator's time of + creation for files, and thus permit the users (not to mention + the archivists) to identify more clearly when a new version of + a file has been made available. Timezones should be supported + where possible. + @item The encoding and decoding schemes should be able to read and + write files that are compatible with one or more of the well + established coding schemes (e.g. UUcode, XXcode). + @item The source code for the programs should be freely available. + It should also be portable and usable with as many computers, + operating systems and compilers as possible. + @end itemize +@end table + + +@c ========================================================================= +@c SECTION: The Search Commences +@c ========================================================================= +@section{The Search Commences} +Naturally, the first step was to examine the existing coding schemes in +comparison with the above ideal specification. Such schemes fell into two +broad classes: @dfn{portable schemes}, which were intended to permit the +encoding of files on any computer architecture into a form that could be +transmitted electronically, and decoded on the same or a different +architecture; and @dfn{platform-specific schemes}, which provided rather +better support for transferring files between two computers using the same +architecture and operating system. + +@subsection{Portable Coding Schemes} +The most commonly used coding schemes supported by a variety of platforms +are: + +@itemize @bullet + @item @code{BOO} + @item @code{UU} + @item @code{XX} +@end itemize + +Most implementations of these schemes known to the authors are designed for +use with stream file systems. These programs have no means of recording, +let alone preserving, record structure and are thus unsuitable for our +purposes. This is not surprising since @code{UUcode} and its mutation +@code{XXcode} were developed specifically for exchanging files between Unix +systems. In fairness to these schemes, they are well suited to the +transmission of text files and certain unstructured binary files. + +Standard @code{UUcode} encodes files using characters @samp{ } @dots +@samp{_} of ASCII. This can result in one or more spaces appearing at +the ends of lines: some mailers decide that this is information not worth +transmitting, with consequent inability to reconstruct the original file. + +Files containing characters such as @samp{^} are often irreversibly +corrupted by mail gateways; this problem led to the development of +@code{XXcode} which uses a rather more robust character set, namely: + +@quotation + @code{+-0123456789}@* + @code{abcdefghijklmnopqrstuvwxyz}@* + @code{ABCDEFGHIJKLMNOPQRSTUVWXYZ} +@end quotation + +The encoding table used is recorded with the encoded data to allow the +detection of character corruptions, and the correction of reversible +character transpositions. Whilst superficially a step forward, +@code{XXcode} offered little more than most existing versions of +@code{UUcode}, which already supported coding tables. Its major +contribution was in formalizing the encoding table, and in particular its +default table was proof against all the known gateway-induced corruptions. + + +@subsection{Platform Specific Coding Schemes} + +Encoding schemes have been developed to support transfer of files +possessing some structure which therefore cannot be reconstructed correctly +when encoded by the portable schemes. When the encoding and decoding +programs of such a platform specific scheme are each used on the same +computer and operating system type, files may be encoded and transmitted +with a great deal of confidence that the decoded file will reproduce the +original's structure and attributes in their entirety. + +Examples of such programs are @code{TELCODE} and @code{MFTU} for VMS, +@code{NETDATA} for IBM mainframes, and @code{Stuffit} and @code{MacBinary} +for the Macintosh. But these programs have the major disadvantage that +they have each been implemented @emph{only} on the single architecture for +which they were designed: thus the only two of these schemes that could be +used on the VMS-based Aston Archive would be of minimal interest elsewhere! + +The Archive's content is in some respects artificially inflated by the +presence of @file{.hqx} files for Macintoshes, @file{.boo} for MS-DOS, +etc., which have to be held in pre-encoded form for transfer by those +requiring them. + + +@c ========================================================================= +@c SECTION: VVcode is Born +@c ========================================================================= +@section{VVcode is Born} + +Realizing that none of the existing portable schemes were close enough to +our ideal, an early version of our specification was circulated on various +mailing lists by Niel Kempson towards the end of 1990. When the anticipated +``nil return'' was all that resulted, Brian Hamilton Kelly went ahead and +created a rudimentary @code{VVencode} by modifying an existing VAX Pascal +implementation of @code{uuencode}. After generating the companion +@code{VVdecode}, he then re-implemented the programs in Turbo C under the +MS-DOS operating system on the IBM-PC, and thereby was able to prove that +the new scheme was both viable and sufficient. + +This version didn't support file formats, time stamping, file splitting, +character sets or CRC checking. + + +@subsection{A Production VVcode} + +Following the minor feasibility study, Niel Kempson re-engineered the pair +of programs from scratch (adding certain features of the evolving +specification), paying particular attention to making the code portable +across a wide variety of operating systems. Particular care was taken to +avoid the use of supposedly ``standard'' C functions that experience had +shown behaved differently under individual manufacturer's implementations, +or were even non-existent in some. Therefore the code may sometimes appear +to be performing certain operations in a very long-winded way; it's very +easy to look at it and say ``why didn't the author use the @code{foo()} +function, which does this much more efficiently?'', but this function may +not even exist under another implementation of C, or behave in a subtly +different manner. + +The core functions of @code{VVcode} are implemented as a collection of +routines written in as portable a fashion as possible, and a separate +module of a few operating system specific routines for file I/O, +timestamping, command-line or other interface, etc. Porting @code{VVcode} +to a new platform should require only that this latter module be +re-implemented, in most cases by adapting an existing one. + +@code{VVcode} implements all of the features listed in the specification, +apart from the ability to generate @code{UUcode} and @code{XXcode} +compatible files. However, the decoding program is backwards compatible +and can decode files generated by @code{UUcode} and @code{XXcode}. + + +@subsection{Arguments against VVcode} + +When the advent of the @code{VVcode} system was first aired in the various +electronic digests, some heated debate followed along the lines that a new +encoding scheme was unnecessary, since @code{UUcode}/@code{XXcode} sufficed +@emph{for them}. However, all these correspondents were Unix users who had +interpreted the @samp{VV} as meaning ``Vax-to-Vax'' by analogy with +@samp{uu}@footnote{@samp{V} was chosen simply because it followed @samp{U}; +at one time, we'd seriously considered calling it @code{YAFES} --- Yet +Another File Encoding Scheme!} and who felt that such a scheme should be +private to VAXen. The authors' reply was to the effect that the encoding +scheme was intended to support the needs of archives like Aston's, and as +such, had to provide + +@enumerate + @item an automated tool (it would be somewhat difficult to expect our + users to be able to tell the encoder what sort of file structure + it was handling, when this concept was entirely alien to many of + them); + @item facilities to encode binaries for many operating systems; + @item mail server features, such as splitting of large files; + @item operation across the widest possible combination of platforms. +@end enumerate + +The overhead of using the @code{VVcode} system is at most a couple of +hundred bytes over using @code{UUcode}, and the extra functionality and +@emph{universality} with respect to @code{UUcode} or @code{XXcode} thereby +comes almost for free. + + +@c ========================================================================= +@c SECTION: +@c ========================================================================= +@section{Availability of VVcode} + +At present, the @code{VVcode} system is only available in C, but it has +been shown to run successfully on the following combinations of hardware, +operating system and compiler: + +@table @strong + @item Macintosh + At the time of writing (May 1991) John Rawnsley of the University + of Warwick had commenced development of a Macintosh port, which + will encode the resource and data forks in a manner that will + permit the former to be ignored by non-Macintosh systems. + + @item MS-DOS + @itemize @bullet + @item IBM PS/2, PC (and clones); MS-DOS 3.3, 4.01, 5.00; + Borland Turbo C 1.5, 2.0, Borland C++ 1.0, 2.0, 3.0 and + Microsoft C 5.1, 6.0 + @end itemize + + @item OS/2 + @itemize @bullet + @item IBM PS/2, PC (and clones); OS/2 2.0; Microsoft C 6.0 and + GNU C 2.1 + @end itemize + + @item Unix + @itemize @bullet + @item Sun 3; SunOS 3.x and 4.0.3; native C and GNU C + @item Sun Sparcstation 1; SunOS 4.1; native C and GNU C + @item SCO Unix V/386 v3.2.2, Microsoft C compiler + @end itemize + + @item VAX/VMS + @itemize @bullet + @item All VAXen; VMS 5.2--5.4-1; VAX C V3.0--V3.2 and GNU C 1.40 + @end itemize + + @item VM/CMS + @itemize @bullet + @item VM/CMS; Whitesmith C compiler v1.0 (This implementation was + ported by Rainer Sch@"opf; basing it upon the Unix + implementation, this took him about one day.) + @end itemize + +@end table + + + diff --git a/support/vvcode/doc/vvport.tex b/support/vvcode/doc/vvport.tex new file mode 100644 index 0000000000..a385c5644d --- /dev/null +++ b/support/vvcode/doc/vvport.tex @@ -0,0 +1,704 @@ +@c ************************************************************************* +@c CHAPTER: How to port VVcode to a new environment +@c ************************************************************************* +@c node-name, next, previous, up +@node Porting Guide, Porting Guide, Top, Top +@chapter How to port VVcode to a new environment + +This chapter introduces the facilities provided for porting VVcode to a new +environment and recommends the approach that should be taken for particular +examples. + +@itemize @bullet + @item introduction and philosophy + @item @file{machine.h} + @item @file{specific.h} and @file{xxx.c} + @item local.h +@end itemize + + + + +@c ========================================================================= +@c SECTION: The @file{os.h} header file +@c ========================================================================= +@c node-name, next, previous, up +@section The @file{os.h} header file + +The @file{os.h} file contains tests to identify the environment on which +VVcode is being built. Once the environment has been identified the file +defines preprocessor macros to define the environment in the format +expected by VVcode. Environments are defined as the operating system and +variants due to dialects of the operating system or the compiler. + +@itemize @bullet + @item explain the @samp{OS_xxxx} macros, including the operating systems + currently supported + @item explain the @samp{UNIX_yyyy} and related macros +@end itemize + + + +@c ========================================================================= +@c SECTION: The @file{machine.h} header file +@c ========================================================================= +@c node-name, next, previous, up +@section The @file{machine.h} header file + +The header file @file{machine.h} + +@itemize @bullet + @item defines macros to control the behaviour and compilation of VVcode + @item several categories of definition required: + + @itemize @bullet + @item environment + @item command line interface + @item file specifications + @item file formats + @end itemize +@end itemize + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: VVcode environment +@c ------------------------------------------------------------------------- +@subsection VVcode Environment + +@itemize @bullet + @item definitions for the environment in which VVcode is built +@end itemize + +@subsubsection @code{VV_OPERATING_SYSTEM} + +A string recording the operating system for which this version of VVcode +has been implemented. This value is recorded in the VVE file and used by +VVdecode to detect whether the original file was encoded on a different +operating system. For example: + +@example +#define VV_OPERATING_SYSTEM "MS-DOS" +@end example + + +@subsubsection @code{VV_IMPLEMENTATION} + +A string describing the implementation of VVcode. Displayed when VVcode +programs are started and recorded in log and VVE files. For example: + +@example +#define VV_IMPLEMENTATION "MS-DOS Turbo-C version 09.1-001 (31 May 1992)" +@end example + + +@subsubsection @code{ANSI_SYNTAX} + +Define as @code{TRUE} if the compiler supports the draft ANSI standard for +C syntax (it shouldn't matter if the run time library is not fully ANSI +compliant). Define as @code{FALSE} if this syntax is not supported. The +macro is used to control the declaration of functions and the use of new +ANSI keywords such as @samp{const}. If your compiler requires old-style +function declarations like: + +@example +char *allocate_buffer (); /* Declaration */ +... +char *allocate_buffer (buf_len, buf_name) /* Function code */ + size_t buf_len; + char *buf_name; +@{ +... +@} +@end example + +you should define @code{ANSI_SYNTAX} to @code{FALSE}. Many Unix systems +have compilers that fall into this category, though the GNU C compiler is a +notable exception. If you have a modern compiler that accepts ANSI style +function declarations like: + +@example +char *allocate_buffer (const size_t buf_len, /* Declaration */ + const char *buf_name); +... +char *allocate_buffer (const size_t buf_len, /* Function code */ + const char *buf_name) +@{ +... +@} +@end example + +you should define @code{ANSI_SYNTAX} to @code{TRUE}. The GNU C compiler +and most of the PC compilers support the ANSI standard. + + +@c ------------------------------------------------------------------------- +@c SECTION: VVcode Command Line Interface +@c ------------------------------------------------------------------------- +@subsection{VVcode Command Line Interface} + +@itemize @bullet + @item defines how to start VVcode and how it interprets the command line + @item explain concepts of @dfn{parameters} and @dfn{qualifiers} + @item @dfn{parameters} - + @item @dfn{qualifiers} - modify the behaviour of a command# + @item give an example and compare the commands @code{rm -i foo} and + @code{delete /confirm foo} + @item this does not preclude implementations that may not usually use + a command line interface (e.g. Mac). For example VMS does use a + CLI but provides a set of system services to handle the CL. Under + these circumstances these definitions will only be used to display + help text in the correct format +@end itemize + +@subsubsection @code{QUAL_INTRO} + +A string containing a set of characters, each of which may be used to +introduce a command line qualifier. For example: + +@example +#define QUAL_INTRO "/-" /* MS-DOS */ +#define QUAL_INTRO "-" /* Unix */ +@end example + +The examples above indicate that on a Unix system @samp{-} would be used to +introduce a command qualifier, whereas on MS-DOS either @samp{-} or +@samp{/} could be used. + + +@subsubsection @code{QUAL_SEP} + +A string containing a set of characters, each of which may be used to +separate a command line qualifier from its value. For example: + +@example +#define QUAL_SEP "=:-" /* MS-DOS */ +#define QUAL_SEP " " /* Unix */ +#define QUAL_SEP " " /* Unix */ +@end example + +The examples above indicate that on an MS-DOS system the qualifier value is +separated from the qualifier by one of the characters @samp{=}, @samp{:} or +@samp{-}. The Unix example indicates that the value is separated from the +qualifier by a space, i.e. it is the next command line parameter. + + +@subsubsection @code{OPTIONAL_QUALIFIER_VALUES} + +Define as @code{TRUE} if the operating system convention can handle command +line qualifiers with optional values. On systems such as MS-DOS, VAX/VMS +and VM/CMS the qualifiers are separated from each other by spaces and from +their values by another character such as an equals sign (@samp{=}). In +the following example it is obvious whether the optional value for the +@samp{log} qualifier is present: + +@example + vvencode /overwrite /log=log-file ip-file op-file + vvencode /overwrite /log ip-file op-file +@end example + +On Unix, the convention is to separate qualifiers from each other by spaces +and from their qualifiers by spaces. In the following example it is +difficult if not impossible to determine whether the @samp{log} qualifier +value is present: + +@example + vvencode -overwrite -log log-file ip-file op-file + vvencode -overwrite -log ip-file op-file +@end example + +This problem could be overcome by forcing Unix users to use a different +character like @samp{=} to introduce the qualifier value or by imposing +strict rules on the ordering of parameters and qualifiers. Neither of +these approaches is likely to be popular so we take the easy way out and +specify whether such optional qualifier values are supported. If they are +not supported, the qualifiers which could take optional values are modified +either to require a value or to take no value. + +Example: + +@example + #define OPTIONAL_QUALIFIER_VALUES TRUE /* MS-DOS, VMS */ + #define OPTIONAL_QUALIFIER_VALUES FALSE /* Unix */ +@end example + + +@subsubsection @code{STICKY_DEFAULTS} + +Define as @code{TRUE} if the VVcode programs should apply default file +names when determining output file specifications. For example, on Unix +the definition would usually be: + +@example + #define STICKY_DEFAULTS FALSE /* Unix */ +@end example + +and the commands: + +@example + vvencode one + vvencode one two + vvencode one two -log three +@end example + +would create the files @file{one.vve}, @file{two}, and @file{two} plus a +log file @file{three} respectively. On other systems such as MS-DOS and +VAX/VMS where default file names are customary the definition would usually +be + +@example + #define STICKY_DEFAULTS TRUE /* MS-DOS, VMS */ +@end example + +and the commands: + +@example + vvencode one + vvencode one two + vvencode one two -log three +@end example + +would create the files @file{one.vve}, @file{two.vve} and @file{two.vve} +plus a log file @file{three.log} respectively. + + +@subsubsection @code{STDOUT_OUTPUT} + +Define as @code{TRUE} if the VVencode program should write to standard +output if an output file is not explicitly specified on the command line. +The command: + +@example + vvencode ip-file +@end example + +would write the VVE file to standard output if @code{STDOUT_OUTPUT} is defined +as @code{TRUE} or to @file{ip-file.vve} if it is defined as @code{FALSE}. + +Examples: + +@example + #define STDOUT_OUTPUT TRUE /* Unix */ + #define STDOUT_OUTPUT FALSE /* MS-DOS, VMS */ +@end example + + +@subsubsection @code{SUPPORT_PIPING} + +Define as @code{TRUE} if the VVcode programs should support reading from +standard input and/or writing to standard output so that they may be used +as filters. The programs do not behave as true filters since an input file +must always be specified, but specifying a certain string (e.g. @samp{-}) +as the input file specification will cause the program to read from +standard input. The string used is defined by the macro +@code{STDIO_SYMBOL}. + +Examples: + +@example + #define SUPPORT_PIPING TRUE /* Unix, MS-DOS */ + #define SUPPORT_PIPING FALSE /* VMS, VM/CMS */ +@end example + +@subsubsection @code{STDIO_SYMBOL} + +A string which when used as a file specification will cause the VVcode +programs to read/write to standard input/output depending on whether that +file is an input or output file. This string is only used if the macro +@code{SUPPORT_PIPING} is defined as @code{TRUE}. If it is unused, define +it as "". + +On a Unix system, the following definitions would be usual: + +@example + #define SUPPORT_PIPING TRUE + #define STDIO_SYMBOL "-" /* Unix, MS-DOS */ +@end example + +and piping a binary file into VVencode to could be achieved with the shell +command: + +@example + cat binary-file | vvencode - - | mail kempson@@TeX.Ac.Uk +@end example + + +@c ------------------------------------------------------------------------- +@c SECTION: File Specifications +@c ------------------------------------------------------------------------- +@subsection File Specifications + +explain here the VVcode file specification model and how it is used + + +@subsubsection @code{MAX_PATH} + +The maximum number of characters allowed in a file specification. + +Example: + +@example + #define MAX_PATH 80 /* MS-DOS */ + #define MAX_PATH 255 /* BSD Unix */ + #define MAX_PATH 255 /* VAX/VMS, some Unix */ +@end example + + +@subsubsection @code{MAX_PREAMBLE} + +The maximum number of characters in the preamble component of a file +specification. If the system does not support a preamble component, define +as zero. + +Example: + +@example + #define MAX_PREAMBLE 64 /* MS-DOS */ + #define MAX_PREAMBLE 255 /* BSD Unix */ + #define MAX_PREAMBLE 255 /* VAX/VMS */ +@end example + + +@subsubsection @code{MAX_NAME} + +The maximum number of characters in the name component of a file +specification. + +Example: + +@example + #define MAX_NAME 8 /* MS-DOS */ + #define MAX_NAME 255 /* BSD Unix */ + #define MAX_NAME 39 /* VAX/VMS */ +@end example + + +@subsubsection @code{MAX_EXT} + +The maximum number of characters in the extension component of a file +specification. If the system does not support an extension component, +define as zero. + +Example: + +@example + #define MAX_EXT 3 /* MS-DOS */ + #define MAX_EXT 255 /* BSD Unix */ + #define MAX_EXT 39 /* VAX/VMS */ +@end example + + +@subsubsection @code{MAX_POSTAMBLE} + +The maximum number of characters in the postamble component of a file +specification. If the system does not support a postamble component, +define as zero. + +Example: + +@example + #define MAX_POSTAMBLE 0 /* MS-DOS */ + #define MAX_POSTAMBLE 0 /* BSD Unix */ + #define MAX_POSTAMBLE 5 /* VAX/VMS */ +@end example + + +@subsubsection @code{PREAMBLE_END} + +A string containing a set of characters, each of which may be used to +denote the end of the preamble component of a file specification. If the +system does not support a preamble component, define as "". + +Example: + +@example + #define PREAMBLE_END ":\\" /* MS-DOS */ + #define PREAMBLE_END ":/" /* BSD Unix */ + #define PREAMBLE_END ":>]" /* VAX/VMS */ +@end example + + +@subsubsection @code{EXTENSION_BEGIN} + +The single character that may be used to denote the start of the extension +component of a file specification. If the system does not support an +extension component, define as @samp{\000}. + +Example: + +@example + #define EXTENSION_BEGIN '.' /* MS-DOS */ + #define EXTENSION_BEGIN '.' /* BSD Unix */ + #define EXTENSION_BEGIN '.' /* VAX/VMS */ +@end example + + +@subsubsection @code{POSTAMBLE_BEGIN} + +A string containing a set of characters, each of which may be used to denote +the start of the postamble component of a file specification. If the system +does not support a postamble component, define as "". + +Example: + +@example + #define POSTAMBLE_BEGIN "" /* MS-DOS */ + #define POSTAMBLE_BEGIN "" /* BSD Unix */ + #define POSTAMBLE_BEGIN ";" /* VAX/VMS */ +@end example + + +@subsubsection @code{UPPERCASE_FILESYSTEM} + +Define as @code{TRUE} if the file system is case insensitive. For the +benefit of file systems that do care (where lower case names are usual), +VVencode will convert file specifications to lower case before recording +them in the VVE file. + +Example: + +@example + #define UPPERCASE_FILESYSTEM TRUE /* MS-DOS, VAX/VMS */ + #define UPPERCASE_FILESYSTEM FALSE /* Unix */ +@end example + + +@c ------------------------------------------------------------------------- +@c SECTION: File Formats +@c ------------------------------------------------------------------------- +@subsection{File Formats} + +explain the different file formats and provide a small table showing how +they are used for different operating systems + + +@subsubsection @code{SUPPORT_FIXED_FMT} + +Define as @code{TRUE} if the file system supports fixed length record +format files. + +Example: + +@example + #define SUPPORT_FIXED_FORMAT TRUE /* VAX/VMS, VM/CMS */ + #define SUPPORT_FIXED_FORMAT FALSE /* MS-DOS, Unix */ +@end example + + +@subsubsection @code{SUPPORT_STREAM_FMT} + +Define as @code{TRUE} if the file system supports stream format files. + +Example: + +@example + #define SUPPORT_STREAM_FILES TRUE /* MS-DOS, Unix, VAX/VMS */ + #define SUPPORT_STREAM_FILES FALSE /* VM/CMS */ +@end example + + +@subsubsection @code{SUPPORT_VARIABLE_FMT} + +Define as @code{TRUE} if the file system supports variable length record +format files. + +Example: + +@example + #define SUPPORT_VARIABLE_FORMAT TRUE /* VAX/VMS, VM/CMS */ + #define SUPPORT_VARIABLE_FORMAT FALSE /* MS-DOS, Unix */ +@end example + + +@subsubsection @code{TEXT_LINE_OVERHEAD} + +The extra number of characters written by the file system when writing +lines to text files. For example, when writing to text files MS-DOS +converts @samp{\n} to @samp{\r\n} and therefore has an overhead of 1. + +Example: + +@example + #define TEXT_LINE_OVERHEAD 1 /* MS-DOS, VAX/VMS */ + #define TEXT_LINE_OVERHEAD 0 /* Unix */ +@end example + + +@subsubsection @code{DEF_MODE} + +Define as the default mode for file encoding & decoding to be used if the +mode is not specified on the command line and cannot be determined from the +input file. It must be @code{MODE_BINARY} or @code{MODE_TEXT}. + +Example: + +@example + #define DEF_MODE MODE_BINARY /* most systems */ +@end example + + +@subsubsection @code{DEF_TEXT_FMT} + +Define as the default file format for text files. It must be one of +@code{FMT_FIXED}, @code{FMT_STREAM} and @code{FMT_VARIABLE} and only a +supported format may be specified. + +Example: + +@example + #define DEF_TEXT_FMT FMT_STREAM /* MS-DOS, Unix */ + #define DEF_TEXT_FMT FMT_VARIABLE /* VAX/VMS */ +@end example + + +@subsubsection @code{DEF_BINARY_FMT} + +Define as the default file format for text files. It must be one of +@code{FMT_FIXED}, @code{FMT_STREAM} and @code{FMT_VARIABLE} and only a +supported format may be specified. + +Example: + +@example + #define DEF_BINARY_FMT FMT_STREAM /* MS-DOS, Unix */ + #define DEF_BINARY_FMT FMT_FIXED /* VAX/VMS */ +@end example + + +@subsubsection @code{MIN_VARIABLE_RECORD_LEN} + +The minimum record length in bytes supported by the file system for +variable length record format files. Must be within the VVcode limits of 0 +to 65535. If the system doesn't support variable length record format files +define as @code{INV_RECORD_LEN}. + +Example: + +@example + #define MIN_VARIABLE_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */ + #define MIN_VARIABLE_RECORD_LEN 0 /* VAX/VMS */ +@end example + + +@subsubsection @code{MAX_VARIABLE_RECORD_LEN} + +The maximum record length in bytes supported by the file system for +variable length record format files. Must be within the VVcode limits of 0 +to 65535. If the system doesn't support variable length record format files +define as @code{INV_RECORD_LEN}. + +Example: + +@example + #define MAX_VARIABLE_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */ + #define MAX_VARIABLE_RECORD_LEN 32765 /* VAX/VMS */ + #define MAX_VARIABLE_RECORD_LEN 65535 /* VM/CMS */ +@end example + + +@subsubsection @code{DEF_VARIABLE_RECORD_LEN} + +The default maximum record length in bytes supported by the file system for +variable length record format files. Must be in the range defined by +@code{MIN_VARIABLE_RECORD_LEN} and @code{MAX_VARIABLE_RECORD_LEN}. If the +system doesn't support variable length record format files define as +@code{INV_RECORD_LEN}. + +Example: + +@example + #define DEF_VARIABLE_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */ + #define DEF_VARIABLE_RECORD_LEN 512 /* VAX/VMS */ + #define DEF_VARIABLE_RECORD_LEN 255 /* VM/CMS */ +@end example + + +@subsubsection @code{MIN_FIXED_RECORD_LEN} + +The minimum record length in bytes supported by the file system for fixed +length record format files. Must be within the VVcode limits of 0 to +65535. If the system doesn't support fixed length record format files +define as @code{INV_RECORD_LEN}. + +Example: + +@example + #define MIN_FIXED_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */ + #define MIN_FIXED_RECORD_LEN 0 /* VAX/VMS */ +@end example + + +@subsubsection @code{MAX_FIXED_RECORD_LEN} + +The maximum record length in bytes supported by the file system for fixed +length record format files. Must be within the VVcode limits of 0 to +65535. If the system doesn't support fixed length record format files +define as @code{INV_RECORD_LEN}. + +Example: + +@example + #define MAX_FIXED_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */ + #define MAX_FIXED_RECORD_LEN 32765 /* VAX/VMS */ + #define MAX_FIXED_RECORD_LEN 65535 /* VM/CMS */ +@end example + + +@subsubsection @code{DEF_FIXED_RECORD_LEN} + +The default record length in bytes supported by the file system for fixed +length record format files. Must be in the range defined by +@code{MIN_FIXED_RECORD_LEN} and @code{MAX_FIXED_RECORD_LEN}. If the system +doesn't support fixed length record format files define as +@code{INV_RECORD_LEN}. + +Example: + +@example + #define DEF_FIXED_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */ + #define DEF_FIXED_RECORD_LEN 512 /* VAX/VMS */ + #define DEF_FIXED_RECORD_LEN 255 /* VM/CMS */ +@end example + + +@subsubsection @code{DEF_TEXT_PADCHAR} + +Define as the default character used to pad out short records in text fixed +length record format files. Must be a valid character constant and will +usually be a space character. If the system doesn't support fixed length +record format files, define as @samp{\000}. + +Example: + +@example + #define DEF_TEXT_PADCHAR '\000' /* MS-DOS, Unix */ + #define DEF_TEXT_PADCHAR ' ' /* VAX/VMS, VM/CMS */ +@end example + + +@subsubsection @code{DEF_BINARY_PADCHAR} + +Define as the default character used to pad out short records in binary +fixed length record format files. Must be a valid character constant and +will usually be a null character. If the system doesn't support fixed +length record format files, define as '\000'. + +Example: + +@example + #define DEF_BINARY_PADCHAR '\000' /* MS_DOS, Unix */ + #define DEF_BINARY_PADCHAR '\000' /* VAX/VMS, VM/CMS */ +@end example + + + +@c ========================================================================= +@c SECTION: The @file{xxx.c} operating system specific module +@c ========================================================================= +@section The @file{xxx.c} operating system specific module + + + +@c ========================================================================= +@c SECTION: Porting VVcode - an example +@c ========================================================================= +@section Porting VVcode - an example diff --git a/support/vvcode/doc/vvtest.tex b/support/vvcode/doc/vvtest.tex new file mode 100644 index 0000000000..60fef19959 --- /dev/null +++ b/support/vvcode/doc/vvtest.tex @@ -0,0 +1,432 @@ +@c ************************************************************************* +@c CHAPTER: How to test VVcode +@c ************************************************************************* +@c node-name, next, previous, up +@node Testing Guide, Testing Guide, Top, Top +@chapter How to test VVcode + + +@c ========================================================================= +@c SECTION: Testing VVencode +@c ========================================================================= +@section Testing VVencode + + +@subsection User Help +@itemize @bullet + @item @samp{help} qualifier should cause ``usage'' message to be displayed + @item invalid qualifier (e.g. @samp{ZZZZ}) should cause ``usage'' message + to be displayed +@end itemize + + +@subsection User Information (@samp{log} & @samp{debug} qualifiers) +@itemize @bullet + @item @samp{log} with no qualifier value writes to @code{stderr} + @item @samp{log} qualifier value specifying invalid output file + @item @samp{log} file spec missing @file{.log} extension component + @file{.log} added if @code{STICKY_DEFAULTS} defined) + @item @samp{debug} writes extra information to @code{stderr} + @item @samp{debug} assumes @samp{log} even if @samp{log} not specified +@end itemize + + +@subsection File overwriting (@samp{overwrite_files} qualifier) +@itemize @bullet + @item @samp{overwrite_files} should always overwrite unless the operating + system objects + @item should ask before overwriting an existing file + @item don't ask whether to overwrite if reading from @code{stdin} - just + fail +@end itemize + + +@subsection VVE header file specification (@samp{header_file} qualifier) +@itemize @bullet + @item missing qualifier value + @item if @samp{header_file} not specified, the input file specification + is used, stripped of any preamble and postamble components + @item check that command line value overrides input file specification + and is used without modification +@end itemize + + +@subsection Maximum VVE file size (@samp{split_size} qualifier) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier (less than 4) + @item check that O/P files are really no greater than this size + @item file splitting disabled when writing to @code{stdout}, a pipe or + non-file device +@end itemize + + +@subsection Input file examination +@itemize @bullet + @item mode + @item format + @item modification time (unsupported timestamps ``normalized'') + @item maximum record length + @item longest record length + @item unsupported file organizations rejected (mainly by format and + record length) +@end itemize + + +@subsection File mode (@samp{mode} qualifier) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier value + @item check that command line value overrides @code{examine_file()} and + default mode values + @item check that @code{examine_file()} mode value overrides default +@end itemize + + +@subsection File format (@samp{format} qualifier) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier value + @item check that command line value overrides @code{examine_file()} and + default format values + @item check that @code{examine_file()} format value overrides default +@end itemize + + +@subsection File record length (@samp{record_length} qualifier) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier value (within OS limits and < 65536) + @item check that command line value overrides @code{examine_file()} and + default format values and also resets longest record length + @item check that @code{examine_file()} format value overrides default +@end itemize + + +@subsection File timestamp (@samp{timestamp} qualifier) +@itemize @bullet + @item missing qualifier value (optional on some systems, required on + others) + @item invalid qualifier value (before 1970 or after 2037) + @item check that command line value overrides @code{examine_file()} value +@end itemize + + +@subsection Encoding table (@samp{encoding_table} qualifier) +@itemize @bullet + @item missing qualifier file spec + @item non-existent file specified + @item file spec missing @file{.enc} extension component + @item short encoding table file: @file{tooshort.enc} + @item long encoding table file: @file{toolong.enc} + @item correct encoding table file: @file{uucode.enc} + @item duplication of character(s) in encoding file: @file{duplicat.enc} + @item contents of file specified on command line overrides default + table +@end itemize + + +@subsection Character set translation (@samp{translation_file} qualifier) +@itemize @bullet + @item missing qualifier file spec + @item non-existent file specified + @item file spec missing @file{.xlt} extension component + @item comment handling + @item correct translation table file: @file{encode.xlt} + @item short translation table file: @file{tooshort.xlt} + @item long translation table file: @file{toolong.xlt} + @item translation table with invalid values: @file{badvalue.xlt} + @item translation of unsupported characters: @file{toascii.xlt} + @item missing @file{xlt-from} header: @file{frommiss.xlt} + @item invalid @file{xlt-from} header value: @file{frombad.xlt} + @item missing @file{xlt-to} header: @file{tomiss.xlt} + @item invalid @file{xlt-to} header value: @file{tobad.xlt} + @item missing @file{xlt-substchar} header: @file{submiss.xlt} + @item invalid @file{xlt-substchar} header value: @file{subbad.xlt} + @item @file{xlt-from} character set different to the local character set: + @file{difffrom.xlt} +@end itemize + + +@subsection Input file +@itemize @bullet + @item missing command line value + @item non-existent file specified + @item file opened using the correct parameters (mode, format etc) + @item rejection of unsupported file types + @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc) + @item specify zero length (empty) file + @item specify @code{stdin} +@end itemize + + +@subsection Output file +@itemize @bullet + @item missing command line value - use input file name plus @file{.vve} + extension + @item invalid or unwritable file specification + @item check correct application of file specification defaults when + partial specification is supplied (if @code{STICKY_DEFAULTS} + defined) + @item O/P file opened using the correct parameters (mode, format etc) + @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc) + @item specify @code{stdout} +@end itemize + + +@subsection Internal +@itemize @bullet + @item for variable length records, check that zero and maximum length + records are handled and recorded correctly + @item total byte count - may be different for text/binary + @item CRC-32 value (check with ZIP or ARJ) - may be different for + text/binary + @item internal buffer allocation + @item file closing + @item running out of memory + @item log information +@end itemize + + + +@c ========================================================================= +@c SECTION: Testing VVdecode +@c ========================================================================= +@section Testing VVdecode + +@subsection User Help +@itemize @bullet + @item @samp{help} qualifier should cause ``usage'' message to be displayed + @item invalid qualifier (e.g. @samp{ZZZZ}) should cause ``usage'' message + to be displayed +@end itemize + + +@subsection User Information (@samp{log} & @samp{debug} qualifiers) +@itemize @bullet + @item @samp{log} with no qualifier value + @item @samp{log} qualifier value specifying invalid output file + @item @samp{log} file spec missing @file{.log} extension component + @item @samp{debug} generates extra information + @item @samp{debug} assumes @samp{log} even if @samp{log} not specified +@end itemize + + +@subsection File overwriting (@samp{overwrite_files} qualifier) +@itemize @bullet + @item @samp{overwrite_files} should always overwrite unless the operating + system objects + @item should ask before overwriting an existing file + @item when reading from a pipe or non-file device, don't ask whether + to overwrite - just fail +@end itemize + + +@subsection VVE input file examination +@itemize @bullet + @item @code{decodeversion} + @item @code{operatingsystem} + @item @code{characterset} + @item @code{comment} + @item @code{mode} + @item @code{format} + @item @code{modification time} + @item @code{recordlength} + @item @code{table} +@end itemize + + +@subsection File mode (@samp{mode qualifier}) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier value + @item check that command line value overrides VVE file and default + mode values + @item check that VVE file mode value overrides default +@end itemize + + +@subsection File format (@samp{format qualifier}) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier value + @item check that command line value overrides VVE file and default + format values + @item check that VVE file format value overrides default +@end itemize + + +@subsection File record length (@samp{record_length} qualifier) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier value (within OS limits and < 65536) + @item check that command line value overrides VVE file and default + format values and also resets longest record length + @item check that VVE file format value overrides default +@end itemize + + +@subsection File timestamp (@samp{timestamp} qualifier) +@itemize @bullet + @item missing qualifier value (optional on some systems, required on + others) + @item invalid qualifier value (before 1970 or after 2037) + @item check that command line value overrides VVE file value +@end itemize + + +@subsection Encoding table (@samp{encoding_table} qualifier) +@itemize @bullet + @item missing qualifier file spec + @item non-existent file specified + @item file spec missing @file{.enc} extension component + @item short encoding table file: @file{tooshort.enc} + @item long encoding table file: @file{toolong.enc} + @item correct encoding table file: @file{uucode.enc} + @item duplication of character(s) in encoding file: @file{duplicat.enc} + @item contents of file specified on command line overrides VVE table + and default table + @item VVE table overrides default table +@end itemize + + +@subsection Character set translation (@samp{translation_file} qualifier) +@itemize @bullet + @item missing qualifier file spec + @item non-existent file specified + @item file spec missing @file{.xlt} extension component + @item comment handling + @item correct translation table file: @file{decode.xlt} + @item short translation table file: @file{tooshort.xlt} + @item long translation table file: @file{toolong.xlt} + @item translation table with invalid values: @file{badvalue.xlt} + @item translation of unsupported characters: @file{toascii.xlt} + @item missing @samp{xlt-from} header: @file{frommiss.xlt} + @item invalid @samp{xlt-from} header value: @file{frombad.xlt} + @item missing @samp{xlt-to} header: @file{tomiss.xlt} + @item invalid @samp{xlt-to} header value: @file{tobad.xlt} + @item missing @samp{xlt-substchar} header: @file{submiss.xlt} + @item invalid @samp{xlt-substchar} header value: @file{subbad.xlt} + @item @samp{xlt-from} character set different to the VVE character set: + @file{difffrom.xlt} + @item @samp{xlt-to} character set different to the local character set: + @file{diffto.xlt} + @item @samp{xlt-from} character set different to the VVE character set + and @samp{xlt-to} character set different to the local character + set: @file{diffboth.xlt} +@end itemize + + +@subsection File padding character (@samp{pad_character} qualifier) +@itemize @bullet + @item missing qualifier value + @item invalid qualifier + @item qualifier value overrides default values + @item use of different default values for text and binary files +@end itemize + + +@subsection UUdecoding (@samp{uudecode} qualifier) +@itemize @bullet + @item correct decoding of UUencoded file without @samp{Vv} line start + @item error if file contains VVcode specific headers +@end itemize + + +@subsection XXdecoding (@samp{xxdecode} qualifier) +@itemize @bullet + @item correct decoding of XXencoded file without @samp{Vv} line start + @item error if file contains VVcode specific headers +@end itemize + + +@subsection Input file +@itemize @bullet + @item missing command line value + @item non-existent file specified + @item file opened using the correct parameters (mode, format etc) + @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc) + @item specify zero length (empty) file + @item specify @code{stdin} +@end itemize + + +@subsection Output file +@itemize @bullet + @item missing command line value - use of VVE header + @item invalid or unwritable file specification + @item check correct application of file specification defaults (for those + systems that use support them) + @item file opened using the correct parameters (mode, format etc) + @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc) + @item specify @code{stdout} +@end itemize + + +@subsection Internal +@itemize @bullet + @item for variable length records, check that zero and maximum length + records in the VVE file are handled and recorded correctly + @item total byte count + @item CRC-32 value (check with ZIP or ARJ) + @item internal buffer allocation + @item file closing + @item running out of memory +@end itemize + + +@c ========================================================================= +@c SECTION: Testing file interchnage +@c ========================================================================= +@section Testing file interchange + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: Interchange of Common Files between Operating Systems +@c ------------------------------------------------------------------------- +@subsection Interchange of Common Files between Operating Systems +@itemize @bullet + @item text file + @item @TeX{} @file{.dvi}file + @item @TeX{} @file{.tfm} file + @item @TeX{} @file{.pk} file +@end itemize + + +@c ------------------------------------------------------------------------- +@c SUBSECTION: Operating System-specific Files +@c ------------------------------------------------------------------------- +@subsection Operating System-specific Files + +@subsubsection MS-DOS +@itemize @bullet + @item @file{.zip} file + @item @file {.Z} @code{compress} file +@end itemize + +@subsubsection OS/2 +@itemize @bullet + @item @file{.zip} file + @item @file {.Z} @code{compress} file +@end itemize + +@subsubsection Unix +@itemize @bullet + @item @file{.tar} file + @item @file {.Z} @code{compress} file +@end itemize + +@subsubsection VAX/VMS +@itemize @bullet + @item backup save set (fixed length 32256 byte records) + @item @file{.obj} file (variable length binary) + @item @file{.exe} file (fixed length 512 byte records) + @item text file (@code{STREAM_LF} format) + @item compress @file{.Z} file (variable length binary) +@end itemize + +@subsubsection VM/CMS +@itemize @bullet + @item @code{EXEC} file + @item @code{MODULE} file (variable length 65535 byte records) +@end itemize diff --git a/support/vvcode/doc/vvuser.tex b/support/vvcode/doc/vvuser.tex new file mode 100644 index 0000000000..26f0a1ec51 --- /dev/null +++ b/support/vvcode/doc/vvuser.tex @@ -0,0 +1,200 @@ +@c ************************************************************************* +@c CHAPTER: Guide to using VVcode +@c ************************************************************************* +@c node-name, next, previous, up +@node User Manual, User Manual, Top, Top +@chapter Guide to using VVcode + +@itemize @bullet + @item general introduction +@end itemize + +@c ========================================================================= +@c SECTION: VVencode command options +@c ========================================================================= +@section{VVencode command options} + +@itemize @bullet + @item described in a generic manner with operating system specifics at + the end of the section +@end itemize + +The general syntax of the VVencode command line is: +@example + vvencode [options] input-file [options] [output-file] [options] +@end example + +There are two @dfn{parameters} and many optional @dfn{qualifiers}. The +parameters are: + +@table @code + @item input-file + + @item output-file +@end table + +The command qualifiers modify the behaviour of VVcode and are all optional. +Qualifiers may appear before, between or after the parameters. The +qualifiers acceptable to VVencode are: + +@table @code + @item debug + Write copious debugging output to the standard error device or to + the log file if the @code{+log} qualifier was specified. This + qualifier would normally only be used when trying to report a + @code{VVencode} problem and may indeed have been disabled for the + version that you are using. + @item encoding_table file-spec + Read the encoding table to be used from the file @file{file-spec}. + The file must contain the 64 characters to be used by + @code{VVencode}. If this qualifier is not specified, the default + @code{VVencode} encoding table will be used. + @item format file-format + Explicitly specify the file format that should be assumed by + @code{VVencode} when it is reading the input file. The + @code{file-format} value must be one of @samp{fixed}, @samp{stream} + and @samp{variable}. This qualifier would only be used if it was + necessary to override the value determined automatically by + VVencode. + @item header_filespec file-spec + + @item help + VVencode will display a usage message on the standard error device + and exit. + @item log file-spec + + @item mode file-mode + Explicitly specify the file mode that should be assumed by + @code{VVencode} when it is reading the input file. The + @code{file-format} value must be one of @samp{binary} and + @samp{text}. This qualifier would only be used if it was + necessary to override the value determined automatically by + VVencode. + @item overwrite + + @item record_length + + @item split_size + + @item timestamp time + + @item translation_file file-spec + +@end table + + +@c ========================================================================= +@c SECTION: VVdecode command options +@c ========================================================================= +@section{VVdecode command options} + +The general syntax of the VVdecode command line is: +@example + vvdecode [options] input-file [options] [output-file] [options] +@end example + + +@c ========================================================================= +@c SECTION: Operating system specific considerations +@c ========================================================================= +@section{Operating system specific considerations} + +@c ------------------------------------------------------------------------- +@c SUBSECTION: MS-DOS +@c ------------------------------------------------------------------------- +@subsection MS-DOS +@itemize @bullet + @item qualifiers introduced with @samp{/} or @samp{-} and must be + separated from each other by whitespace + @item values separated from qualifier by @samp{=} or @samp{:} + @item optional values supported + @item VVcode will act as a filter when @samp{-} is specified as the input + or output file + @item optional file specification for @samp{log} qualifier + @item examples of VVencode usage +@end itemize + +@c ------------------------------------------------------------------------- +@c SUBSECTION: OS/2 +@c ------------------------------------------------------------------------- +@subsection OS/2 +@itemize @bullet + @item qualifiers introduced with @samp{/} or @samp{-} and must be + separated from each other by whitespace + @item values separated from qualifier by @samp{=} or @samp{:} + @item optional values supported + @item VVcode will act as a filter when @samp{-} is specified as the input + or output file + @item optional file specification for @samp{log} qualifier + @item GCC 2.1 implementation does not support file timestamping + @item HPFS file names supported + @item OS/2 extended attributes not supported yet + @item examples of VVencode usage +@end itemize + +@c ------------------------------------------------------------------------- +@c SUBSECTION: Unix +@c ------------------------------------------------------------------------- +@subsection Unix +@itemize @bullet + @item qualifiers introduced with @samp{-} or @samp{+} and must be + separated from each other by whitespace + @item values separated from qualifier by whitespace + @item optional values not supported + @item VVcode will act as a filter when @samp{-} is specified as the input + or output file + @item examples of VVencode usage +@end itemize + +@c ------------------------------------------------------------------------- +@c SUBSECTION: VAX/VMS +@c ------------------------------------------------------------------------- +@subsection VAX/VMS +@itemize @bullet + @item qualifiers introduced with @samp{/} + @item values separated from qualifier by @samp{=} + @item standard VMS CLD conventions + @item optional values supported + @item VVcode will act as a filter when @samp{-} is specified as the input + or output file though meaningless on VMS + @item optional file specification for @samp{log} qualifier + @item examples of VVencode usage +@end itemize + +@c ------------------------------------------------------------------------- +@c SUBSECTION: VM/CMS +@c ------------------------------------------------------------------------- +@subsection VM/CMS +@itemize @bullet + @item qualifiers introduced with @samp{(} and must be + separated from each other by whitespace + @item values separated from qualifier by @samp{=} or @samp{:} + @item command line driven through REXX EXEC + @item optional values supported + @item VVcode does not support input or output from/to standard I/O + @item optional file specification for @samp{log} qualifier + @item examples of VVencode usage +@end itemize + + +@c ========================================================================= +@c SECTION: Transferring files between systems +@c ========================================================================= +@section{Transferring files between systems} +@itemize @bullet + @item file type and format + @item character set + @item electronic mail + @item timestamping +@end itemize + + +@c ========================================================================= +@c SECTION: Unusual applications of VVcode +@c ========================================================================= +@section{Unusual applications of VVcode} +@itemize @bullet + @item character set conversion + @item file type conversion + @item VMS file format conversion vs. @code{CONVERT} +@end itemize diff --git a/support/vvcode/encode.xlt b/support/vvcode/encode.xlt new file mode 100644 index 0000000000..74edc8d38f --- /dev/null +++ b/support/vvcode/encode.xlt @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# TEST.XLT +# ~~~~~~~~ +# Test translation table file +#----------------------------------------------------------------------------- +xlt-from ASCII +xlt-to BIT-REVERSED +xlt-substchar 042 # asterisk +# +255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 # 255 - 240 +239 238 237 236 235 234 233 232 231 230 229 228 227 226 225 224 # 239 - 224 +223 222 221 220 219 218 217 216 215 214 213 212 211 210 209 208 # 223 - 208 +207 206 205 204 203 202 201 200 199 198 197 196 195 194 193 192 # 207 - 192 +# +191 190 189 188 187 186 185 184 183 182 181 180 179 178 177 176 # 191 - 176 +175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 160 # 175 - 160 +159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 # 159 - 144 +143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 # 143 - 128 +# +# +127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 # 127 - 112 +111 110 109 108 107 106 105 104 103 102 101 100 099 098 097 096 # 111 - 96 +095 094 093 092 091 090 089 088 087 086 085 084 083 082 081 080 # 96 - 80 +079 078 077 076 075 074 073 072 071 070 069 068 067 066 065 064 # 79 - 64 +# +063 062 061 060 059 058 057 056 055 054 053 052 051 050 049 048 # 63 - 48 +047 046 045 044 043 042 041 040 039 038 037 036 035 034 033 032 # 47 - 32 +031 030 029 028 027 026 025 024 023 022 021 020 019 018 017 016 # 31 - 16 +015 014 013 012 011 010 009 008 007 006 005 004 003 002 001 000 # 15 - 0 diff --git a/support/vvcode/globals.h b/support/vvcode/globals.h new file mode 100644 index 0000000000..b5afedf6ac --- /dev/null +++ b/support/vvcode/globals.h @@ -0,0 +1,1108 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "globals.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** [tbs] +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + + +/*- +**============================================================================ +** +** SECTION 1 - VVCODE VERSION +** +**============================================================================ +*/ +#define VV_MAJOR_VERSION_NO 0 +#define VV_MINOR_VERSION_NO 9 +#define VV_VERSION_STR "0.97 beta" +#define VV_DATE "25 Nov 1992" + +/*- +**============================================================================ +** +** SECTION 2 - MACROS TO IMPROVE THE READABILITY OF THE SOURCE CODE +** +** +** Consider the macro definition: +** +** #define SHOW(num1, num2) printf("num1 = %d, num2 = %d", num1, num2) +** +** and the C code using the macro: +** +** SHOW (1234, 5678); +** +** The expected result is: +** +** printf ("num1 = %d, num2 = %d", 1234, 5678); +** +** since examples of the parameters should not be expanded within strings. +** A certain brain-dead compiler actually expands the parameters within the +** strings even though both editions of Kernighan & Ritchie and every C manual +** that I've read prohibit this behaviour. The result is: +** +** printf ("1234 = %d, 5678 = %d", 1234, 5678); +** +** which is of course silly. +** +** To avoid this misbehaviour, all macro parameters will begin with an +** underscore (_) and the parameter string must not appear in the macro +** definition, except where parameter expansion is desired. The above macro +** would have to be redefined as: +** +** #define SHOW(_n1, _n2) printf("num1 = %d, num2 = %d", _n1, _n2) +** +** +** Oh, the brain dead compiler is VAX/VMS C v3.1 +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Macros for ANSI function prototypes. If the compiler supports ANSI C, we +** take advantage of the new ANSI prototypes. If not, the ARGS macro will +** remove the prototype declarations. ANSI_SYNTAX will have been set +** appropriately in machine.h +**---------------------------------------------------------------------------- +*/ +#if (ANSI_SYNTAX) +# define ARGS(_plist) _plist +# define CONST const +# define SIZE_T size_t +# define TIME_T time_t +#else /* NOT (ANSI_SYNTAX) */ +# define ARGS(_plist) () +# define CONST +# define SIZE_T unsigned +# define TIME_T long +#endif /* (ANSI_SYNTAX) */ + + +/*- +**---------------------------------------------------------------------------- +** Useful macros to make the source code more readable. +**---------------------------------------------------------------------------- +*/ +#define PRINTF (void) printf +#define FPRINTF (void) fprintf +#define SPRINTF (void) sprintf +#define FSCANF (void) fscanf +#define NULLCHAR (char *) NULL + + +/*- +**---------------------------------------------------------------------------- +** Macros emulating functions. Different C compilers support the +** character/string functions below in different ways. Some of the functions +** are not supported at all (e.g. strncmpi). To be on the safe side, these +** functions have been defined by VVCODE. +**---------------------------------------------------------------------------- +*/ +#define MINIMUM(_a, _b) (((_a) < (_b)) ? (_a) : (_b)) +#define MAXIMUM(_a, _b) (((_a) > (_b)) ? (_a) : (_b)) + +#define STRCHR vstrchr +#define STRRCHR vstrrchr +#define STRSTR vstrstr +#define STRRSTR vstrrstr +#define STRCMP strcmp +#define STRCMPI vstricmp +#define STRNCMP vstrncmp +#define STRNCMPI vstrnicmp +#define STRDUP vstrdup +#define TOLOWER(_c) (isupper(_c) ? tolower(_c) : (_c)) +#define TOUPPER(_c) (islower(_c) ? toupper(_c) : (_c)) +#define LEAPYEAR(i) (((i)%4)==0) && ((((i)%100)!=0) || (((i)%400)==0)) +#define UPDATE_CRC32(_cc, _bb)\ + _cc = G_crc32_table[(Byte) (((Byte) _cc ^ (Byte) _bb) & 0xff)] ^ (_cc >> 8) + + + +/*- +**============================================================================ +** +** SECTION 3 - MACROS DEFINING LIMITS AND GENERAL CONSTANTS +** +**============================================================================ +*/ +#define MAX_ENCODED_BYTES 45 +#define MAX_IP_LINE_LEN 512 +#define IO_BUFFER_SIZE 4096 +#define MAX_VV_RECORD_LEN 65535L +#define DECODE_REC_LEN 0 +#define DECODE_DATA 1 +#define ENCODE_REC_LEN 0 +#define ENCODE_DATA 1 +#define MIN_SPLIT_SIZE 4L +#define OVERWRITE_NO 0 +#define OVERWRITE_YES 1 +#define OVERWRITE_ASK 2 +#define XLT_BUFFER_SIZE 4096 + +#define INFO_STATUS -1 +#define NORMAL_STATUS 0 +#define LOG_STATUS 1 +#define WARNING_STATUS 2 +#define ERROR_STATUS 3 +#define FATAL_STATUS 4 + +#define FS_PREAMBLE 8 +#define FS_NAME 2 +#define FS_EXTENSION 4 +#define FS_POSTAMBLE 1 +#define FS_NOTHING 0 + + +/* +**---------------------------------------------------------------------------- +** Macros used by lookup_key() defining whether the qualifier needs a +** value. +**---------------------------------------------------------------------------- +*/ +#define LOOKUP_UNKNOWN (-1) +#define LOOKUP_AMBIGUOUS (-2) + +#define NO_ABBREVIATIONS 0 +#define ALLOW_ABBREVIATIONS 1 + +#define CASE_INSENSITIVE 0 +#define CASE_SENSITIVE 1 + + +/* +**---------------------------------------------------------------------------- +** VV timestamp format +**---------------------------------------------------------------------------- +*/ +#define DUMMY_VV_TIMESTAMP "1991.02.15-16:12:32 GMT" +#define VV_TIMESTAMP_FORMAT "%04d.%02d.%02d-%02d:%02d:%02d" + + +/* +**---------------------------------------------------------------------------- +** CRC-32 constants +**---------------------------------------------------------------------------- +*/ +#define CRC32_TABLE_SIZE 256 +#define CRC32_MASK (Unsigned32) 0xFFFFFFFFL +#define CRC32_POLYNOMIAL (Unsigned32) 0xEDB88320L + + +#define INV_FORMAT ((Int16) -1) +#define INV_MODE ((Int16) -1) +#define INV_RECORD_LEN ((Int32) -1) +#define INV_TABLE_ENTRY ((Int16) -1) +#define INV_TIMESTAMP ((TIME_T) -2147483647L) + + +/*- +**============================================================================ +** +** SECTION 4 - ENCODING / DECODING +** +**============================================================================ +*/ + +#define UU_DECODING 1 +#define VV_DECODING 2 +#define XX_DECODING 3 + +/*- +**---------------------------------------------------------------------------- +** There are two commonly used UUcode tables, one with a space in it, and a +** later one with the space replaced by a tilde to avoid problems with some +** mail gateways removing trailing spaces. This UUcode table is the one that +** doesn't have a space in it. +**---------------------------------------------------------------------------- +*/ +#define UU_ENCODE_TABLE \ + "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" +#define VV_ENCODE_TABLE \ + "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +#define XX_ENCODE_TABLE \ + "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + +#define ENCODE_TABLE_LEN (sizeof (VV_ENCODE_TABLE) - 1) +#define DECODE_TABLE_LEN 256 +#define XLT_TABLE_LEN 256 +#define ENCODE(c) G_encode_table[(c) & (ENCODE_TABLE_LEN - 1)] + + + +/*- +**============================================================================ +** +** SECTION 5 - STRUCTURES AND TYPEDEFS USED +** +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Typedefs +**---------------------------------------------------------------------------- +*/ +typedef char Boolean; +typedef unsigned char Byte; +typedef unsigned char Unsigned8; +typedef unsigned short Unsigned16; +typedef unsigned long Unsigned32; +typedef short Int16; +typedef long Int32; + +/*- +**---------------------------------------------------------------------------- +** Structures +**---------------------------------------------------------------------------- +*/ +typedef struct +{ + char *q_string; + Boolean val_needed; + Boolean present; + char *value; +} Qualifier_Struct; + +typedef struct +{ + char *h_string; + Boolean present; + char *value; +} Header_Struct; + +typedef struct +{ + char file_spec[MAX_PATH + 1]; + FILE *file_ptr; + Boolean pipe_flag; + Int32 line_no; + + Int16 mode; + Int16 format; + Int32 max_rec_len; + Int32 lng_rec_len; + TIME_T mod_time; + + Int32 bytecount; + Unsigned32 crc32; +} File_Info; + +typedef struct +{ + char *xlt_from; + char *xlt_to; + Int16 xlt_tbl[XLT_TABLE_LEN]; +} Xlt_Struct; + + + +/*- +**============================================================================ +** +** SECTION 6 - GLOBAL VARIABLES +** +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Declared by the VVcode main modules, but referenced as 'extern' by other +** modules. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + Unsigned32 G_crc32_table[CRC32_TABLE_SIZE]; + Int16 G_status; + Boolean G_debugging; + Int16 G_decode_table[DECODE_TABLE_LEN + 1]; + char G_encode_table[ENCODE_TABLE_LEN + 1]; + File_Info G_log_file; + Xlt_Struct G_xlt_table; +#else /* NOT VVCODE_MAIN */ + extern Unsigned32 G_crc32_table[CRC32_TABLE_SIZE]; + extern Int16 G_status; + extern Boolean G_debugging; + extern Int16 G_decode_table[DECODE_TABLE_LEN + 1]; + extern char G_encode_table[ENCODE_TABLE_LEN + 1]; + extern File_Info G_log_file; + extern Xlt_Struct G_xlt_table; +#endif /* VVCODE_MAIN */ + + +/*- +**---------------------------------------------------------------------------- +** Global buffers allocated dynamically at startup. +** +** G_ip_buffer [IP_BUFFER_SIZE] temporary string buffer used for reading +** from files. +** G_op_buffer [OP_BUFFER_SIZE] temporary string buffer used for writing +** to files. +** G_tmp_msg [MAX_MSG_LEN] temporary string buffer for user messages +** +**---------------------------------------------------------------------------- +*/ +#define IP_BUFFER_SIZE 2048 +#define OP_BUFFER_SIZE 2048 +#define MAX_MSG_LEN 4096 + +#ifdef VVCODE_MAIN + char *G_ip_buffer; + char *G_op_buffer; + char *G_tmp_msg; +#else /* NOT VVCODE_MAIN */ + extern char *G_ip_buffer; + extern char *G_op_buffer; + extern char *G_tmp_msg; +#endif /* VVCODE_MAIN */ + + +/*- +**---------------------------------------------------------------------------- +** Global variables used only by VVencode / VVdecode +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + char *G_hdrf_spec; + File_Info G_ip_file; + File_Info G_op_file; + File_Info G_vv_file; + Int32 G_ippart_bytes; + Int16 G_ippt_no; + Int32 G_oppart_bytes; + Int16 G_oppt_no; + Int16 G_overwrite_flag; + Int32 G_split_size; + +# ifdef VVDECODE + char G_op_padchar; + Int16 G_dec_type; + Int16 G_vv_decode_version; + char *G_vv_operating_system; + char *G_vv_character_set; +# endif /* VVDECODE */ +#endif /* VVCODE_MAIN */ + + + +/*- +**============================================================================ +** +** SECTION 7 - COMMAND LINE PARSING +** +** The command line qualifiers fall into three categories: +** +** a. those that do not take a value +** b. those that require a value +** c. those that take an optional value +** +** On systems such as MS-DOS and VAX/VMS, qualifiers are separated from each +** other by spaces and from their values by equals signs. For example: +** +** program /qI /qII=value paramI paramII +** program /qI /qII paramI paramII +** +** For this type of command syntax it is straightforward to detect whether an +** optional qualifier is present. +** +** On Unix, the convention is to separate qualifiers both from each other and +** from their values by spaces. Consider the command lines: +** +** program -qI -qII value paramI paramII +** program -qI -qII paramI paramII +** +** It is difficult if not impossible to determine whether the value following +** a qualifier is a qualifier value or a parameter unless the delimiting +** characters are different or strict rules on the ordering of parameters +** and qualifiers are imposed. We take the easy way out and specify in the +** machine.h file whether the implementation supports optional qualifier +** values. If these values are not supported, qualifiers which could take +** optional values become qualifiers which require values. +**============================================================================ +*/ +#define VALUE_NEEDED 0 +#define VALUE_NONE 1 +#define VALUE_OPTIONAL 2 + + +/*- +**---------------------------------------------------------------------------- +** +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + static Qualifier_Struct G_cmdqual[] = + { + {"debug", VALUE_NONE, FALSE, NULL}, + {"encoding_table", VALUE_NEEDED, FALSE, NULL}, + {"format", VALUE_NEEDED, FALSE, NULL}, + {"help", VALUE_NONE, FALSE, NULL}, + +# if (OPTIONAL_QUALIFIER_VALUES) + {"log", VALUE_OPTIONAL, FALSE, NULL}, +# else /* NOT (OPTIONAL_QUALIFIER_VALUES) */ + {"log", VALUE_NONE, FALSE, NULL}, +# endif /* (OPTIONAL_QUALIFIER_VALUES) */ + + {"mode", VALUE_NEEDED, FALSE, NULL}, + {"overwrite", VALUE_NONE, FALSE, NULL}, + {"record_length", VALUE_NEEDED, FALSE, NULL}, + +# if (OPTIONAL_QUALIFIER_VALUES) + {"timestamp", VALUE_OPTIONAL, FALSE, NULL}, +# else /* NOT (OPTIONAL_QUALIFIER_VALUES) */ + {"timestamp", VALUE_NEEDED, FALSE, NULL}, +# endif /* (OPTIONAL_QUALIFIER_VALUES) */ + + {"translation_file", VALUE_NEEDED, FALSE, NULL}, + +# ifdef VVENCODE + {"header_filespec", VALUE_NEEDED, FALSE, NULL}, + {"split_size", VALUE_NEEDED, FALSE, NULL}, +# endif /* VVENCODE */ + + +# ifdef VVDECODE + {"index_file", VALUE_NEEDED, FALSE, NULL}, + {"pad_character", VALUE_NEEDED, FALSE, NULL}, + {"uudecode", VALUE_NONE, FALSE, NULL}, + {"xxdecode", VALUE_NONE, FALSE, NULL}, +# endif /* VVDECODE */ + + {NULL, VALUE_NONE, FALSE, NULL} +}; + + + static Qualifier_Struct G_cmd_ipfile = + {"input_file", VALUE_NEEDED, FALSE, NULL}; + + static Qualifier_Struct G_cmd_opfile = + {"output_file", VALUE_NEEDED, FALSE, NULL}; + +#endif /* VVCODE_MAIN */ + + +#define CMDQ_DEBUG 0 +#define CMDQ_ENCODE 1 +#define CMDQ_FORMAT 2 +#define CMDQ_HELP 3 +#define CMDQ_LOG 4 +#define CMDQ_MODE 5 +#define CMDQ_OVERWRITE 6 +#define CMDQ_RECORDLEN 7 +#define CMDQ_TIMESTAMP 8 +#define CMDQ_TRANSLATE 9 + +#ifdef VVENCODE +# define CMDQ_HDRFILE 10 +# define CMDQ_SPLIT 11 +#endif /* VVENCODE */ + +#ifdef VVDECODE +# define CMDQ_INDEXFILE 10 +# define CMDQ_PADCHAR 11 +# define CMDQ_UUDECODE 12 +# define CMDQ_XXDECODE 13 +#endif /* VVDECODE */ + + +/*- +**---------------------------------------------------------------------------- +** Macros used as convenient flags to test whether certain command line +** arguments and qualifiers are present. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN +# define Q_DEBUG (G_cmdqual[CMDQ_DEBUG].present == TRUE) +# define Q_ENCODE (G_cmdqual[CMDQ_ENCODE].present == TRUE) +# define Q_FORMAT (G_cmdqual[CMDQ_FORMAT].present == TRUE) +# define Q_INPUT_FILE (G_cmd_ipfile.present == TRUE) +# define Q_LOG (G_cmdqual[CMDQ_LOG].present == TRUE) +# define Q_HELP (G_cmdqual[CMDQ_HELP].present == TRUE) +# define Q_MODE (G_cmdqual[CMDQ_MODE].present == TRUE) +# define Q_OUTPUT_FILE (G_cmd_opfile.present == TRUE) +# define Q_OVERWRITE (G_cmdqual[CMDQ_OVERWRITE].present == TRUE) +# define Q_RECORDLEN (G_cmdqual[CMDQ_RECORDLEN].present == TRUE) +# define Q_TIMESTAMP (G_cmdqual[CMDQ_TIMESTAMP].present == TRUE) +# define Q_TRANSLATE (G_cmdqual[CMDQ_TRANSLATE].present == TRUE) + +# ifdef VVENCODE +# define Q_HEADER_FILE (G_cmdqual[CMDQ_HDRFILE].present == TRUE) +# define Q_SPLIT (G_cmdqual[CMDQ_SPLIT].present == TRUE) +# endif /* VVENCODE */ + +# ifdef VVDECODE +# define Q_INDEXFILE (G_cmdqual[CMDQ_INDEXFILE].present == TRUE) +# define Q_PADCHAR (G_cmdqual[CMDQ_PADCHAR].present == TRUE) +# define Q_UUDECODE (G_cmdqual[CMDQ_UUDECODE].present == TRUE) +# define Q_XXDECODE (G_cmdqual[CMDQ_XXDECODE].present == TRUE) +# endif /* VVDECODE */ + +#endif /* VVCODE_MAIN */ + + + +/*- +**---------------------------------------------------------------------------- +** The VVENCODE file mode strings are recorded in a global string +** array and indexed using the series of "MODE_" macros defined below. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + CONST char *G_mode_str[] = + { + "binary", + "text", + NULL + }; +#else /* NOT VVCODE_MAIN */ + extern CONST char *G_mode_str[]; +#endif /* VVCODE_MAIN */ + +#define MODE_BINARY 0 +#define MODE_TEXT 1 + + +/*- +**---------------------------------------------------------------------------- +** The VVENCODE file format strings are recorded in a global string +** array and indexed using the series of "FMT_" macros defined below. +**---------------------------------------------------------------------------- +*/ +#ifdef VVCODE_MAIN + CONST char *G_fmt_str[] = + { + "default", + "stream", + "fixed", + "variable", + NULL + }; +#else /* NOT VVCODE_MAIN */ + extern CONST char *G_fmt_str[]; +#endif /* VVCODE_MAIN */ + + +#define FMT_DEFAULT 0 +#define FMT_STREAM 1 +#define FMT_FIXED 2 +#define FMT_VARIABLE 3 + + + +/*- +**============================================================================ +** +** SECTION 8 - VVE FILE DEFINITIONS AND PROCESSING +** +**============================================================================ +*/ + +/*- +**---------------------------------------------------------------------------- +** Macros fundamental to the VVENCODEd file. +** +** VV_EOL_MARKER - the string appended to every line of VVENCODEd +** data to avoid the possibility of a line ending +** with a space character which may be +** subsequently stripped. +** VV_PREFIX - the string prepended to every line of +** VVENCODEd data to help VVDECODE ignore +** unwanted lines such as mail headers. +**---------------------------------------------------------------------------- +*/ +#define VV_EOL_MARKER "V" +#define VV_PREFIX "Vv" +#define VV_POSTAMBLE_LEN 60L + +#ifdef VVDECODE + char *G_vv_prefix; + char *G_eol_marker; +#endif /* VVDECODE */ + +#ifdef VVENCODE + static CONST char *G_vv_advert[] = + { + "**********************************************************************", + "** This is a VVencoded file. Implementations of VVDECODE and **", + "** VVENCODE are freely available for many different computers and **", + "** operating systems. The master portable C source is available **", + "** from the Aston University TeX archive - the home of VVCODE. **", + "** **", + "** If you want to find out more about VVCODE, send a message to **", + "** List_Server@TeX.Ac.Uk with the subject text 'HELP VVCODE' **", + "**********************************************************************", + NULL + }; +#endif /* VVENCODE */ + + +#ifdef VVCODE_MAIN + Header_Struct G_vvehdr[] = + { + {"attrbegin", FALSE, NULL}, + {"attrend", FALSE, NULL}, + {"begin", FALSE, NULL}, + {"bytecount", FALSE, NULL}, + {"characterset", FALSE, NULL}, + {"comment", FALSE, NULL}, + {"crc32", FALSE, NULL}, + {"decodeversion", FALSE, NULL}, + {"end", FALSE, NULL}, + {"format", FALSE, NULL}, + {"mode", FALSE, NULL}, + {"operatingsystem", FALSE, NULL}, + {"recordlength", FALSE, NULL}, + {"skipfrom", FALSE, NULL}, + {"skipto", FALSE, NULL}, + {"table", FALSE, NULL}, + {"timestamp", FALSE, NULL}, + {NULL, FALSE, NULL} + }; +#else /* NOT VVCODE_MAIN */ + extern Header_Struct G_vvehdr; +#endif /* VVCODE_MAIN */ + + +#define HDR_UNKNOWN (-1) +#define HDR_ATTRBEGIN 0 +#define HDR_ATTREND 1 +#define HDR_BEGIN 2 +#define HDR_BYTECOUNT 3 +#define HDR_CHARACTERSET 4 +#define HDR_COMMENT 5 +#define HDR_CRC32 6 +#define HDR_DECODEVERSION 7 +#define HDR_END 8 +#define HDR_FORMAT 9 +#define HDR_MODE 10 +#define HDR_OPERATINGSYSTEM 11 +#define HDR_RECORDLEN 12 +#define HDR_SKIPFROM 13 +#define HDR_SKIPTO 14 +#define HDR_TABLE 15 +#define HDR_TIMESTAMP 16 + + +/*- +**---------------------------------------------------------------------------- +** Macros used as convenient flags to test whether certain VVE header lines +** and arguments have been read. +**---------------------------------------------------------------------------- +*/ +#ifdef VVDECODE + +# define VVEH_ATTRBEGIN (G_vvehdr[HDR_ATTRBEGIN].present == TRUE) +# define VVEH_ATTREND (G_vvehdr[HDR_ATTREND].present == TRUE) +# define VVEH_BEGIN (G_vvehdr[HDR_BEGIN].present == TRUE) +# define VVEH_BYTECOUNT (G_vvehdr[HDR_BYTECOUNT].present == TRUE) +# define VVEH_CHARACTERSET (G_vvehdr[HDR_CHARACTERSET].present == TRUE) +# define VVEH_COMMENT (G_vvehdr[HDR_COMMENT].present == TRUE) +# define VVEH_CRC32 (G_vvehdr[HDR_CRC32].present == TRUE) +# define VVEH_DECODEVERSION (G_vvehdr[HDR_DECODEVERSION].present == TRUE) +# define VVEH_END (G_vvehdr[HDR_END].present == TRUE) +# define VVEH_FORMAT (G_vvehdr[HDR_FORMAT].present == TRUE) +# define VVEH_MODE (G_vvehdr[HDR_MODE].present == TRUE) +# define VVEH_OPERATINGSYSTEM (G_vvehdr[HDR_OPERATINGSYSTEM].present == TRUE) +# define VVEH_RECORDLEN (G_vvehdr[HDR_RECORDLEN].present == TRUE) +# define VVEH_SKIPFROM (G_vvehdr[HDR_SKIPFROM].present == TRUE) +# define VVEH_SKIPTO (G_vvehdr[HDR_SKIPTO].present == TRUE) +# define VVEH_TABLE (G_vvehdr[HDR_TABLE].present == TRUE) +# define VVEH_TIMESTAMP (G_vvehdr[HDR_TIMESTAMP].present == TRUE) + +#endif /* VVDECODE */ + + + +/*- +**============================================================================ +** +** SECTION 9 - XLT FILE DEFINITIONS AND PROCESSING +** +**============================================================================ +*/ +#define XLT_COMMENT_CHAR '#' +#define IDX_COMMENT_CHAR '#' + +#ifdef VVCODE_MAIN + Header_Struct G_xlthdr[] = + { + {"xlt-from", FALSE, NULL}, + {"xlt-to", FALSE, NULL}, + {"xlt-substchar", FALSE, NULL}, + {NULL, FALSE, NULL} + }; +#else /* NOT VVCODE_MAIN */ + extern Header_Struct G_xlthdr[]; +#endif /* VVCODE_MAIN */ + + +/*- +**---------------------------------------------------------------------------- +** Macros used as convenient flags to test whether certain XLT header lines +** and arguments have been read. +**---------------------------------------------------------------------------- +*/ +#define HDR_XLT_UNKNOWN (-1) +#define HDR_XLT_FROM 0 +#define HDR_XLT_TO 1 +#define HDR_XLT_SUBSTCHAR 2 + + +/*- +**============================================================================ +** +** SECTION 10 - MACROS USED IN LIEU OF VARIABLE LENGTH ARGUMENT LISTS +** +**============================================================================ +*/ + + +/*- +**---------------------------------------------------------------------------- +** Internal error message +**---------------------------------------------------------------------------- +*/ +#define INTERNAL_ERROR(_caller)\ + SPRINTF (G_tmp_msg, "Internal error detected in %s()", _caller);\ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file); \ + vv_exit () + + +/*- +**---------------------------------------------------------------------------- +** Log file messages +**---------------------------------------------------------------------------- +*/ +#define LOGMSG(_fmt) \ + user_message (LOG_STATUS, _fmt, &G_log_file) + +#define LOGMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + +#define LOGMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + +#define LOGMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + +#define LOGMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (LOG_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Explanatory messages +**---------------------------------------------------------------------------- +*/ +#define INFOMSG(_fmt) \ + user_message (INFO_STATUS, _fmt, &G_log_file) + +#define INFOMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + +#define INFOMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + +#define INFOMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + +#define INFOMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (INFO_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Warning messages +**---------------------------------------------------------------------------- +*/ +#define WARNMSG(_fmt) \ + user_message (WARNING_STATUS, _fmt, &G_log_file) + +#define WARNMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + +#define WARNMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + +#define WARNMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + +#define WARNMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (WARNING_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Error messages +**---------------------------------------------------------------------------- +*/ +#define ERRORMSG(_fmt) \ + user_message (ERROR_STATUS, _fmt, &G_log_file) + +#define ERRORMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + +#define ERRORMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + +#define ERRORMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + +#define ERRORMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (ERROR_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Fatal error messages +**---------------------------------------------------------------------------- +*/ +#define FATALMSG(_fmt) \ + user_message (FATAL_STATUS, _fmt, &G_log_file) + +#define FATALMSG_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + +#define FATALMSG_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + +#define FATALMSG_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + +#define FATALMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + user_message (FATAL_STATUS, G_tmp_msg, &G_log_file) + + +/*- +**---------------------------------------------------------------------------- +** Usage error messages +**---------------------------------------------------------------------------- +*/ +#define USAGE(_fmt) \ + usage_error (_fmt) + +#define USAGE_1(_fmt, _arg1) \ + SPRINTF (G_tmp_msg, _fmt, _arg1); \ + usage_error (G_tmp_msg) + +#define USAGE_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \ + usage_error (G_tmp_msg) + +#define USAGE_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \ + usage_error (G_tmp_msg) + +#define USAGE_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \ + usage_error (G_tmp_msg) + + +/*- +**---------------------------------------------------------------------------- +** DEBUG messages +**---------------------------------------------------------------------------- +*/ +#if (VV_DEBUG_SUPPORT) + +# define DEBUG(_fmt) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_1(_fmt, _arg1) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_2(_fmt, _arg1, _arg2) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1, _arg2);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_3(_fmt, _arg1, _arg2, _arg3) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1, _arg2, _arg3);\ + FPRINTF (stderr, "\n");\ + } + +# define DEBUG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + if (G_debugging == TRUE)\ + {\ + FPRINTF (stderr, "DEBUG: ");\ + FPRINTF (stderr, _fmt, _arg1, _arg2, _arg3, _arg4);\ + FPRINTF (stderr, "\n");\ + } + +#else /* NOT (VV_DEBUG_SUPPORT) */ + +# define DEBUG(_fmt) +# define DEBUG_1(_fmt, _arg1) +# define DEBUG_2(_fmt, _arg1, _arg2) +# define DEBUG_3(_fmt, _arg1, _arg2, _arg3) +# define DEBUG_4(_fmt, _arg1, _arg2, _arg3, _arg4) + +#endif /* (VV_DEBUG_SUPPORT) */ + + + +/*- +**---------------------------------------------------------------------------- +** Writing to the VVE file +**---------------------------------------------------------------------------- +*/ +#ifdef VVENCODE + +# define VVEOUT(_fmt) \ + SPRINTF (G_op_buffer, _fmt); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_1(_fmt, _arg1) \ + SPRINTF (G_op_buffer, _fmt, _arg1); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_2(_fmt, _arg1, _arg2) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_3(_fmt, _arg1, _arg2, _arg3) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_4(_fmt, _arg1, _arg2, _arg3, _arg4) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3, _arg4); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +# define VVEOUT_5(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \ + SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5); \ + { \ + Int32 msg_length; \ + msg_length = (Int32) strlen (G_op_buffer); \ + write_bytes (msg_length, G_op_buffer, &G_op_file); \ + G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \ + } + +#endif /* VVENCODE */ + + + + +/*- +**============================================================================ +** +** SECTION 11 - MISCELLANEOUS BODGES +** +**============================================================================ +*/ +#ifndef VVCODE_MAIN + void usage_error ARGS ((CONST char *reason)); +#endif /* VVCODE_MAIN */ diff --git a/support/vvcode/local.h b/support/vvcode/local.h new file mode 100644 index 0000000000..185f60b114 --- /dev/null +++ b/support/vvcode/local.h @@ -0,0 +1,250 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "local.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** [tbs] +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + + +/*- +**---------------------------------------------------------------------------- +** VV_DEBUG_SUPPORT controls whether the debugging code is compiled into the +** program. Define to one of the following two values: +** +** 0 don't compile in debugging code +** 1 compile in debugging code +**---------------------------------------------------------------------------- +*/ +#define VV_DEBUG_SUPPORT 1 + + + +/*- +**---------------------------------------------------------------------------- +** VV_TIMEZONE defines the timezone of your local computer. On most Unix +** systems the timezone will be known to the operating system, so this +** definition will not strictly be necessary. It is however essential for +** systems such as MS-DOS where writers of many compilers have assumed their +** local timezone (e.g. Microsoft C assumes US West Coast time and Turbo C +** assumes US East Coast time). +** +** The string to be used for the times should conform to the Unix standard +** format for timezones, namely: +** +** SSSwwDDD +** +** SSS the three letter abbreviation of the timezone. +** ww the number of hours WEST of GMT (Universal Time) in this timezone. +** Timezones EAST of GMT have negative values. +** DDD (optional) the three letter abbreviation of the timezone when +** daylight saving time is in effect. If this part of the string is +** not present it is assumed that daylight saving time is never in +** effect. +** +** Examples of valid timezones are shown below, though some of the names may +** be incorrect. +** +** +** NST-12NDT New Zealand Standard Time +** ???-11??? GMT+1100 +** EST-10??? Eastern Australia Standard Time +** JST-9??? Japanese Standard Time +** WST-8??? Western Australia Standard Time +** ???-7??? GMT+0700 +** ???-6??? GMT+0600 +** ???-5??? GMT+0500 +** ???-4??? GMT+0400 +** ???-3??? GMT+0300 +** EET-2EST East European Time +** CET-1CST Central European Time +** +** UTC0 Coordinated universal time (GMT) +** GMT0BST Greenwich Mean Time, British Summer Time +** +** ???1??? GMT-0100 +** ???2??? GMT-0200 +** ???3??? GMT-0300 +** AST4ADT Atlantic Standard Time +** EST5EDT Eastern Standard Time +** CST6CDT Central Standard Time +** MST7MDT Mountain Standard Time +** PST8PDT Pacific Standard Time +** YST9YDT Yukon Standard Time +** HST10HDT Hawaii Standard Time +** BST11BDT Bering Standard Time +**---------------------------------------------------------------------------- +*/ +#define VV_TIMEZONE "GMT0BST" + + + +/*- +**---------------------------------------------------------------------------- +** DEFAULT FILE EXTENSIONS +** +** VVcode uses default file 'extensions' for different types of files. If the +** implementation is compiled with STICKY_DEFAULTS defined, the appropriate +** 'extension' will be assumed if a file without 'extension' is specified. +** The file 'extensions' used are: +** +** DEF_ENC_EXT - VVcode encoding table files +** DEF_IDX_EXT - VVdecode translation table index files +** DEF_LOG_EXT - VVcode log files +** DEF_VV_EXT - VVcode 'VVE' files +** DEF_XLT_EXT - VVcode character set translation files +** +** Examples are: +** +** #define DEF_ENC_EXT "tbl" +** #define DEF_IDX_EXT "idx" +** #define DEF_LOG_EXT "log" +** #define DEF_VV_EXT "vve" +** #define DEF_XLT_EXT "xlt" +** +** NOTE: most operating systems separate the 'extension' from the 'name' +** by a certain character (e.g. '.' for MS-DOS, VAX/VMS and ' ' for +** VM/CMS). DO NOT include this character in the 'extension' string. +**---------------------------------------------------------------------------- +*/ +#define DEF_ENC_EXT "tbl" +#define DEF_IDX_EXT "idx" +#define DEF_LOG_EXT "log" +#define DEF_VV_EXT "vve" +#define DEF_XLT_EXT "xlt" + + + +/*- +**---------------------------------------------------------------------------- +** DEFAULTS FOR MULTI-PART VVE FILES +** +** When encoding and decoding multi-part VVE files, VVcode uses different +** file 'extensions' to identify the different parts. +** +** VV_EXT_FMT - printf() compatible format used to construct the +** string for the file 'extension'. The format string +** must accept one Int16 integer as an argument and must +** result in a legal file 'extension' for this +** implementation of VVcode. +** MAX_VV_PARTS - the maximum number of VVE parts allowed. It must be +** be less than or equal to the unique file 'extensions' +** that can be constructed by the VV_EXT_FMT format +** string. +** +** Examples are: +** +** #define VV_EXT_FMT "v%02d" +** #define MAX_VV_PARTS 99 +** +** #define VV_EXT_FMT "vve_part_%04x" +** #define MAX_VV_PARTS 32767 +**---------------------------------------------------------------------------- +*/ +#define VV_EXT_FMT "v%02d" +#define MAX_VV_PARTS 99 + + + +/*- +**---------------------------------------------------------------------------- +** LOCAL CHARACTER SET +** +**---------------------------------------------------------------------------- +*/ +#define VV_CHARACTERSET "ASCII" + + + +/*- +**---------------------------------------------------------------------------- +** VVDECODE INDEX FILE DEFAULTS +** +** When decoding a VVE file encoded on a system with a different character +** set, VVdecode can use a character translation table. If the user does not +** explictily specify the table file with the "translation_file" command +** qualifier, VVdecode expects to look up the correct translation file in a +** translation index file. This file contains lines of the form: +** +** ##----------------------------------------------- +** ## From To Translation +** ## char set char set table file +** ##----------------------------------------------- +** ASCII EBCDIC-1 asc-ebc1.xlt +** ASCII PC-437 asc-437.xlt +** ##----------------------------------------------- +** +** VVdecode tries to determine the index file to use by applying the +** following rules in order: +** +** 1. If the "index_file" command qualifier was used to specify the index +** file, use its value as the file specification of the index file. +** +** 2. If the environment variable specified by the preprocessor macro +** VV_INDEX_ENVVAR is defined, use its value as the file specification of +** the index file. If the operating system does not support environment +** variables and retrieval of their values by getenv(), set this value to +** NULL. +** +** 3. The preprocessor macro VV_INDEX_FILE specifies the default index file +** to be used if neither of the preceeding cases were successful. If +** a default file is not to be used, set this value to NULL. +** +** The preprocessor macros VV_INDEX_ENVVAR and VV_INDEX_FILE should be defined +** below. +**---------------------------------------------------------------------------- +*/ +#define VV_INDEX_ENVVAR "VV_INDEX_FILE" +#define VV_INDEX_FILE "vv-xlt.idx" diff --git a/support/vvcode/machine.h b/support/vvcode/machine.h new file mode 100644 index 0000000000..9505de1ac8 --- /dev/null +++ b/support/vvcode/machine.h @@ -0,0 +1,889 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "machine.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** [tbs] +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + +/*- +****************************************************************************** +****************************************************************************** +** +** MACROS TO BE DEFINED +** +** For each of the operating environments, the macros listed below must be +** defined. For full details of the meaning of these macros, see the file +** porting.doc that comes with vvcode. +** +** VVcode Environment +** +** VV_OPERATING_SYSTEM +** VV_IMPLEMENTATION +** ANSI_SYNTAX +** +** Command Line Interface +** +** QUAL_INTRO +** QUAL_SEP +** OPTIONAL_QUALIFIER_VALUES +** STICKY_DEFAULTS +** STDOUT_OUTPUT +** SUPPORT_PIPING +** STDIO_SYMBOL +** +** File Specifications +** +** MAX_PATH +** MAX_PREAMBLE +** MAX_NAME +** MAX_EXT +** MAX_POSTAMBLE +** PREAMBLE_END +** EXTENSION_BEGIN +** POSTAMBLE_BEGIN +** UPPERCASE_FILESYSTEM +** LEGAL_FILESPEC_CHARS +** REPLACEMENT_FILESPEC_CHAR +** +** File Formats +** +** SUPPORT_FIXED_FMT +** SUPPORT_STREAM_FMT +** SUPPORT_VARIABLE_FMT +** TEXT_LINE_OVERHEAD +** +** DEF_MODE +** DEF_TEXT_FMT +** DEF_BINARY_FMT +** +** MIN_VARIABLE_RECORD_LEN +** MAX_VARIABLE_RECORD_LEN +** DEF_VARIABLE_RECORD_LEN +** +** MIN_FIXED_RECORD_LEN +** MAX_FIXED_RECORD_LEN +** DEF_FIXED_RECORD_LEN +** +** DEF_TEXT_PADCHAR +** DEF_BINARY_PADCHAR +** +****************************************************************************** +****************************************************************************** +*/ + + +/*- +****************************************************************************** +****************************************************************************** +** +** COMPILERS AND ENVIRONMENTS SUPPORTED +** +** The compilers and environments supported are summarized here. More +** details are provided under the header comment for each environment. +** +** MS-DOS +** MS-DOS, PC-DOS v3.2, v3.3, v4.01, v5.00 +** +** Borland Turbo C v1.5, v2.0 +** Borland Turbo C++ v1.0, v2.0, v3.0 +** Microsoft C v5.1, v6.0 +** +** OS/2 +** IBM OS/2 v2.0 +** +** GNUC C v2.1 with EMX v0.8c or later +** Microsoft C v6.0 +** IBM C Set/2 v1.0 +** +** UNIX +** BSD 4.1, BSD 4.2, BSD 4.3, System V +** +** GNU C v1.38 +** native cc +** +** VAX/VMS +** v5.1 - v5.4-1 +** +** GNU C v1.38 +** VMS cc v3 +** +** VM/CMS +** version ? +** +** Waterloo C version ? +** +****************************************************************************** +****************************************************************************** +*/ + + +#ifdef FALSE +# undef FALSE +#endif +#define FALSE 0 + +#ifdef TRUE +# undef TRUE +#endif +#define TRUE 1 + + +/* +**============================================================================ +** OS_MSDOS +** +** Definitions for the Microsoft MS/PC-DOS operating system used on the IBM +** PC and compatibles. The compilers supported are: +** +** Borland Turbo C v1.5, v2.0 MSDOS_TURBOC +** Borland Turbo C++ v1.0, v2.0, v3.0 MSDOS_TURBOC +** Microsoft C v5.1 MSDOS_MSC +** Microsoft C v6 MSDOS_MSC +** +**============================================================================ +*/ +#if (OS_MSDOS) + +/* +**---------------------------------------------------------------------------- +** VVCODE ENVIRONMENT +** +** Both MS-DOS C compilers support the ANSI standard. +** The MS-DOS implementation of VVCODE does not act as a filter. +**---------------------------------------------------------------------------- +*/ +# define VV_OPERATING_SYSTEM "MS-DOS" + +# if (MSDOS_TURBOC) +# define ANSI_SYNTAX TRUE +# define VV_IMPLEMENTATION "MS-DOS Turbo C" +# endif /* (MSDOS_TURBOC) */ + +# if (MSDOS_MSC) +# define ANSI_SYNTAX TRUE +# define VV_IMPLEMENTATION "MS-DOS Microsoft C" +# endif /* (MSDOS_MSC) */ + +/*- +**---------------------------------------------------------------------------- +** INCLUDE FILES +**---------------------------------------------------------------------------- +*/ +# include <stddef.h> +# include <stdlib.h> +# include <string.h> +# include <ctype.h> +# include <dos.h> +# include <errno.h> +# include <sys/types.h> +# include <sys/stat.h> +# include <time.h> + +# if (MSDOS_TURBOC) +# include <alloc.h> +# endif /* (MSDOS_TURBOC) */ + +# if (MSDOS_MSC) +# include <malloc.h> +# endif /* (MSDOS_MSC) */ + +/* +**---------------------------------------------------------------------------- +** COMMAND LINE PARSING +** +** MS-DOS qualifiers are usually introduced with a '/' and values separated +** with an '='. A typical command line would be: +** +** program /qualifier file1 /qual=VALUE file2 +**---------------------------------------------------------------------------- +*/ +# define QUAL_INTRO "/-" +# define QUAL_SEP "=:-" +# define OPTIONAL_QUALIFIER_VALUES TRUE +# define STICKY_DEFAULTS TRUE +# define STDOUT_OUTPUT FALSE +# define SUPPORT_PIPING TRUE +# define STDIO_SYMBOL "-" + +/* +**---------------------------------------------------------------------------- +** FILE SPECIFICATIONS +** +** The general MS-DOS file specification has the form: +** +** \\node\dir1\dir2\name.ext +** device:\dir1\dir2\name.ext +** +** The preamble is terminated by one of ':' or '\'. +** There is no postamble. +**---------------------------------------------------------------------------- +*/ +# define MAX_PATH 80 +# define MAX_PREAMBLE 64 +# define MAX_NAME 8 +# define MAX_EXT 4 +# define MAX_POSTAMBLE 0 + +# define PREAMBLE_END ":\\" +# define EXTENSION_BEGIN '.' +# define POSTAMBLE_BEGIN "" +# define UPPERCASE_FILESYSTEM TRUE + +# define LEGAL_FILESPEC_CHARS \ + "@#$%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890" +# define REPLACEMENT_FILESPEC_CHAR '_' + +/* +**---------------------------------------------------------------------------- +** FILE FORMATS +** +** MS-DOS has a stream file system and does not support the different file +** formats - they are all written as stream files. Text and binary files are +** written differently. +**---------------------------------------------------------------------------- +*/ +# define SUPPORT_FIXED_FMT TRUE +# define SUPPORT_STREAM_FMT TRUE +# define SUPPORT_VARIABLE_FMT TRUE + +# define TEXT_LINE_OVERHEAD 1 + +# define DEF_MODE MODE_BINARY +# define DEF_TEXT_FMT FMT_STREAM +# define DEF_BINARY_FMT FMT_STREAM + +# define MIN_VARIABLE_RECORD_LEN 1 +# define MAX_VARIABLE_RECORD_LEN 32765 +# define DEF_VARIABLE_RECORD_LEN 80 + +# define MIN_FIXED_RECORD_LEN 1 +# define MAX_FIXED_RECORD_LEN 32767 +# define DEF_FIXED_RECORD_LEN 512 + +# define DEF_TEXT_PADCHAR ' ' +# define DEF_BINARY_PADCHAR 0 + + +#endif /* (OS_MSDOS) */ + + + +/* +**============================================================================ +** OS_OS2 +** +** Definitions for the IBM OS/2 operating system used on the IBM PC and +** compatibles. The compilers supported are: +** +** GNUC C v2.1 with EMX OS2_GNUC +** IBM C Set/2 OS2_CSET +** Microsoft C v6 OS2_MSC +** +**============================================================================ +*/ +#if (OS_OS2) + +/* +**---------------------------------------------------------------------------- +** VVCODE ENVIRONMENT +** +** All three OS/2 C compilers support the ANSI standard. +** The OS/2 implementation of VVCODE does not act as a filter. +**---------------------------------------------------------------------------- +*/ +# define VV_OPERATING_SYSTEM "OS/2" + +# if (OS2_CSET) +# define ANSI_SYNTAX TRUE +# define VV_IMPLEMENTATION "OS/2 2.x IBM C Set/2" +# endif /* (OS2_CSET) */ + +# if (OS2_GNUC) +# define ANSI_SYNTAX TRUE +# define VV_IMPLEMENTATION "OS/2 2.x EMX/GNU C" +# endif /* (OS2_GNUC) */ + +# if (OS2_MSC) +# define ANSI_SYNTAX TRUE +# define VV_IMPLEMENTATION "OS/2 Microsoft C" +# endif /* (OS2_MSCT) */ + +/*- +**---------------------------------------------------------------------------- +** INCLUDE FILES +**---------------------------------------------------------------------------- +*/ +# include <stddef.h> +# include <stdlib.h> +# include <string.h> +# include <ctype.h> +# include <errno.h> +# include <sys/types.h> +# include <sys/stat.h> +# include <time.h> + +/* +**---------------------------------------------------------------------------- +** COMMAND LINE PARSING +** +** OS/2 qualifiers are usually introduced with a '/' and values separated +** with an '='. A typical command line would be: +** +** program /qualifier file1 /qual=VALUE file2 +**---------------------------------------------------------------------------- +*/ +# define QUAL_INTRO "/-" +# define QUAL_SEP "=:-" +# define OPTIONAL_QUALIFIER_VALUES TRUE +# define STICKY_DEFAULTS TRUE +# define STDOUT_OUTPUT FALSE +# define SUPPORT_PIPING TRUE +# define STDIO_SYMBOL "-" + +/* +**---------------------------------------------------------------------------- +** FILE SPECIFICATIONS +** +** The general OS/2 file specification has the form: +** +** \\node\dir1\dir2\name.ext +** device:\dir1\dir2\name.ext +** +** The preamble is terminated by one of ':' or '\'. +** There is no postamble. +**---------------------------------------------------------------------------- +*/ +# define MAX_PATH 80 +# define MAX_PREAMBLE 64 +# define MAX_NAME 8 +# define MAX_EXT 4 +# define MAX_POSTAMBLE 0 + +# define PREAMBLE_END ":\\" +# define EXTENSION_BEGIN '.' +# define POSTAMBLE_BEGIN "" +# define UPPERCASE_FILESYSTEM TRUE + +# define LEGAL_FILESPEC_CHARS \ + "@#$%^-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890" +# define REPLACEMENT_FILESPEC_CHAR '_' + +/* +**---------------------------------------------------------------------------- +** FILE FORMATS +** +** OS/2 has a stream file system and does not support the different file +** formats - they are all written as stream files. Text and binary files are +** written differently. +**---------------------------------------------------------------------------- +*/ +# define SUPPORT_FIXED_FMT FALSE +# define SUPPORT_STREAM_FMT TRUE +# define SUPPORT_VARIABLE_FMT FALSE + +# define TEXT_LINE_OVERHEAD 1 + +# define DEF_MODE MODE_BINARY +# define DEF_TEXT_FMT FMT_STREAM +# define DEF_BINARY_FMT FMT_STREAM + +# define MIN_VARIABLE_RECORD_LEN INV_RECORD_LEN +# define MAX_VARIABLE_RECORD_LEN INV_RECORD_LEN +# define DEF_VARIABLE_RECORD_LEN INV_RECORD_LEN + +# define MIN_FIXED_RECORD_LEN INV_RECORD_LEN +# define MAX_FIXED_RECORD_LEN INV_RECORD_LEN +# define DEF_FIXED_RECORD_LEN INV_RECORD_LEN + +# define DEF_TEXT_PADCHAR ' ' +# define DEF_BINARY_PADCHAR 0 + +#endif /* (OS_OS2) */ + + + +/* +**============================================================================ +** OS_UNIX +** +** Definitions for the Unix operating system. The variants of Unix & +** compilers supported are: +** +** BSD 4.1 Unix UNIX_BSD41, UNIX_BSD +** BSD 4.2 Unix UNIX_BSD42, UNIX_BSD +** BSD 4.3 Unix UNIX_BSD43, UNIX_BSD +** Unix system V UNIX_SYSV +** SCO Unix system V UNIX_SYSV +** +** The GNU C compiler UNIX_GNUC +** The Microsoft C compiler (on SCO Unix) UNIX_MSC +**============================================================================ +*/ +#if (OS_UNIX) + +/* +**---------------------------------------------------------------------------- +** VVCODE ENVIRONMENT +** +** The standard Berkeley C compiler does not support the ANSI standard. +** The Unix implementation of VVCODE acts as a filter. +**---------------------------------------------------------------------------- +*/ +# define VV_OPERATING_SYSTEM "UNIX" + +# if (UNIX_BSD) +# define VV_IMPLEMENTATION "BSD Unix" +# endif /* (UNIX_BSD) */ + +# if (UNIX_SYSV) +# define VV_IMPLEMENTATION "Unix System V" +# endif /* (UNIX_SYSV) */ + +#ifndef VV_IMPLEMENTATION +# define VV_IMPLEMENTATION "Generic Unix C" +# endif /* (VV_IMPLEMENTATION) */ + +# if (UNIX_GNUC || UNIX_MSC) +# define ANSI_SYNTAX TRUE +# else /* NOT (UNIX_GNUC || UNIX_MSC) */ +# define ANSI_SYNTAX FALSE +# endif /* (UNIX_GNUC || UNIX_MSC) */ + +/*- +**---------------------------------------------------------------------------- +** INCLUDE FILES +**---------------------------------------------------------------------------- +*/ +# if (ANSI_SYNTAX) +# include <stdlib.h> +# endif /* (ANSI_SYNTAX) */ + +# if (UNIX_STRINGS_H) +# include <strings.h> +# else /* NOT (UNIX_STRINGS_H) */ +# include <string.h> +# endif /* (UNIX_STRINGS_H) */ + +# include <errno.h> +# include <ctype.h> +# include <sys/types.h> +# include <sys/stat.h> +# include <time.h> + +/* +**---------------------------------------------------------------------------- +** COMMAND LINE INTERFACE +** +** Unix qualifiers are usually introduced with a '-' and values separated +** from the qualifier by whitespace. A typical command line would be: +** +** program -overwrite file1 -mode binary file2 +**---------------------------------------------------------------------------- +*/ +# define QUAL_INTRO "-" +# define QUAL_SEP " =:" +# define OPTIONAL_QUALIFIER_VALUES FALSE +# define STICKY_DEFAULTS FALSE +# define STDOUT_OUTPUT TRUE +# define SUPPORT_PIPING TRUE +# define STDIO_SYMBOL "-" + +/* +**---------------------------------------------------------------------------- +** FILE SPECIFICATIONS +** +** The general Unix file specification has the form: +** +** node:/device/dir1/dir2/name.ext +** +** The preamble is terminated by one of ':' or '/'. +** There is no postamble. +**---------------------------------------------------------------------------- +*/ +# if (UNIX_BSD41) +# define MAX_PATH 255 +# define MAX_PREAMBLE 255 +# define MAX_NAME 14 +# define MAX_EXT 14 +# define MAX_POSTAMBLE 0 +# endif /* (UNIX_BSD41) */ + +# if (UNIX_BSD42) +# define MAX_PATH 255 +# define MAX_PREAMBLE 255 +# define MAX_NAME 255 +# define MAX_EXT 255 +# define MAX_POSTAMBLE 0 +# endif /* (UNIX_BSD42) */ + +# if (UNIX_BSD43) +# define MAX_PATH 1024 +# define MAX_PREAMBLE 1024 +# define MAX_NAME 1024 +# define MAX_EXT 1024 +# define MAX_POSTAMBLE 0 +# endif /* (UNIX_BSD43) */ + +# if (UNIX_SYSV) +# define MAX_PATH 255 +# define MAX_PREAMBLE 255 +# define MAX_NAME 14 +# define MAX_EXT 14 +# define MAX_POSTAMBLE 0 +# endif /* (UNIX_SYSV) */ + +# define PREAMBLE_END ":/" +# define EXTENSION_BEGIN '.' +# define POSTAMBLE_BEGIN "" +# define UPPERCASE_FILESYSTEM FALSE + +# define LEGAL_FILESPEC_CHARS \ + ".@#$%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890" +# define REPLACEMENT_FILESPEC_CHAR '_' + +/* +**---------------------------------------------------------------------------- +** FILE FORMATS +** +** UNIX has a stream file system and does not support the different file +** formats - they are all written as stream files. Text and binary files +** are not differentiated either. +**---------------------------------------------------------------------------- +*/ +# define SUPPORT_FIXED_FMT FALSE +# define SUPPORT_STREAM_FMT TRUE +# define SUPPORT_VARIABLE_FMT FALSE + +# define TEXT_LINE_OVERHEAD 0 + +# define DEF_MODE MODE_BINARY +# define DEF_TEXT_FMT FMT_STREAM +# define DEF_BINARY_FMT FMT_STREAM + +# define MIN_VARIABLE_RECORD_LEN INV_RECORD_LEN +# define MAX_VARIABLE_RECORD_LEN INV_RECORD_LEN +# define DEF_VARIABLE_RECORD_LEN INV_RECORD_LEN + +# define MIN_FIXED_RECORD_LEN INV_RECORD_LEN +# define MAX_FIXED_RECORD_LEN INV_RECORD_LEN +# define DEF_FIXED_RECORD_LEN INV_RECORD_LEN + +# define DEF_TEXT_PADCHAR 0 +# define DEF_BINARY_PADCHAR 0 + +#endif /* (OS_UNIX) */ + + + +/* +**============================================================================ +** OS_VAXVMS +** +** Digital Equipment Corporation's proprietary VMS operating system for their +** VAX series of computers. The versions and VMS and compilers supported +** are: +** +** VAX/VMS v5.1 - v5.4-1 +** +** VMS cc v3 VMS_VAXC +** GNU C v1.38 VMS_GNUC +** +**============================================================================ +*/ +#if (OS_VAXVMS) + +/* +**---------------------------------------------------------------------------- +** GENERAL DEFINITIONS +** +** The VAX/VMS C compiler supports most of the ANSI standard. +**---------------------------------------------------------------------------- +*/ +# define VV_OPERATING_SYSTEM "VAX-VMS" + +# if (VMS_VAXC) +# define ANSI_SYNTAX TRUE +# define VV_IMPLEMENTATION "VAX/VMS C" +# endif /* (VMS_VAXC) */ + +# if (VMS_GNUC) +# define ANSI_SYNTAX TRUE +# define VV_IMPLEMENTATION "VAX/VMS GNU C" +# endif /* (VMS_GNUC) */ + +/*- +**---------------------------------------------------------------------------- +** INCLUDE FILES +**---------------------------------------------------------------------------- +*/ +# include <stddef.h> +# include <stdlib.h> +# include <string.h> +# include <errno.h> +# include <ctype.h> +# include <stat.h> +# include <time.h> +# include <types.h> +# include <unixio.h> + +/* +**---------------------------------------------------------------------------- +** COMMAND LINE INTERFACE +** +** VAX/VMS qualifiers are usually introduced with a '/' and values separated +** with an '='. A typical command line would be: +** +** program /qualifier file1 /qual=VALUE file2 +** +** The VMS system utilities for command line parsing are used by VVCODE. +** These definitions are used mainly for printing help and error messages. +**---------------------------------------------------------------------------- +*/ +# define QUAL_INTRO "/" +# define QUAL_SEP "=:" +# define OPTIONAL_QUALIFIER_VALUES TRUE +# define STICKY_DEFAULTS TRUE +# define STDOUT_OUTPUT FALSE +# define SUPPORT_PIPING FALSE +# define STDIO_SYMBOL "-" + +/* +**---------------------------------------------------------------------------- +** FILE SPECIFICATION PARSING +** +** The general VAX/VMS file specification has six components in the form: +** +** node::device:[dir1.dir2]name.ext;version +** node::device:<dir1.dir2>name.ext;version +** +** The preamble is terminated by one of ':', ']' or '>' +** The extension is terminated by ';' +**---------------------------------------------------------------------------- +*/ +# define MAX_PATH 255 +# define MAX_PREAMBLE 255 +# define MAX_NAME 39 +# define MAX_EXT 39 +# define MAX_POSTAMBLE 5 + +# define PREAMBLE_END ":>]" +# define EXTENSION_BEGIN '.' +# define POSTAMBLE_BEGIN ";" +# define UPPERCASE_FILESYSTEM TRUE + +# define LEGAL_FILESPEC_CHARS \ + "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890" +# define REPLACEMENT_FILESPEC_CHAR '_' + +/* +**---------------------------------------------------------------------------- +** FILE FORMATS +** +** VAX/VMS has a record/block oriented stream file system and supports all of +** the different file formats. The default format for text files is variable +** length records and for binary files, fixed length records. +**---------------------------------------------------------------------------- +*/ +# define SUPPORT_FIXED_FMT TRUE +# define SUPPORT_STREAM_FMT TRUE +# define SUPPORT_VARIABLE_FMT TRUE + +# define TEXT_LINE_OVERHEAD 1 + +# define DEF_MODE MODE_BINARY +# define DEF_TEXT_FMT FMT_VARIABLE +# define DEF_BINARY_FMT FMT_FIXED + +# define MIN_VARIABLE_RECORD_LEN 0L +# define MAX_VARIABLE_RECORD_LEN 32765L +# define DEF_VARIABLE_RECORD_LEN 0L + +# define MIN_FIXED_RECORD_LEN 2 +# define MAX_FIXED_RECORD_LEN 32767L +# define DEF_FIXED_RECORD_LEN 512L + +# define DEF_TEXT_PADCHAR ' ' +# define DEF_BINARY_PADCHAR '\0' + +#endif /* (OS_VAXVMS) */ + + + +/* +**============================================================================ +** OS_VMCMS +** +** IBM's VM/CMS operating system for their S/370 and S/390 series of +** computers. The versions of VM/CMS and compilers supported +** are: +** +** VM/CMS version ? +** +** Waterloo C version ? +** +** +**============================================================================ +*/ +#if (OS_VMCMS) + +/* +**---------------------------------------------------------------------------- +** GENERAL DEFINITIONS +** +** The VM/CMS C compiler supports most of the ANSI standard. +**---------------------------------------------------------------------------- +*/ +# define VV_OPERATING_SYSTEM "VM/CMS" +# define VV_IMPLEMENTATION "VM/CMS C" +# define ANSI_SYNTAX TRUE + +/*- +**---------------------------------------------------------------------------- +** INCLUDE FILES +**---------------------------------------------------------------------------- +*/ +# include <stddef.h> +# include <stdlib.h> +# include <string.h> +# include <errno.h> +# include <ctype.h> +# include <time.h> +# include <types.h> + +/* +**---------------------------------------------------------------------------- +** COMMAND LINE INTERFACE +** +** VM/CMS qualifiers are usually introduced with a '(' and values separated +** with a ':'. A typical command line would be: +** +** program (qualifier) file1 (qual:VALUE) file2 +** +** The VM/CMS system utilities for command line parsing are used by VVCODE. +** These definitions are used mainly for printing help and error messages. +**---------------------------------------------------------------------------- +*/ +# define QUAL_INTRO "(" +# define QUAL_SEP "=:" +# define OPTIONAL_QUALIFIER_VALUES TRUE +# define STICKY_DEFAULTS TRUE +# define STDOUT_OUTPUT FALSE +# define SUPPORT_PIPING FALSE +# define STDIO_SYMBOL "-" + +/* +**---------------------------------------------------------------------------- +** FILE SPECIFICATION PARSING +** +** The general VM/CMS file specification has three components in the form: +** +** filename filetype filemode +** +** which is often supported by C compilers as +** +** filename.filetype.filemode +** +** The name and extension components are terminated by ' '. +**---------------------------------------------------------------------------- +*/ +# define MAX_PATH 19 +# define MAX_PREAMBLE 0 +# define MAX_NAME 8 +# define MAX_EXT 9 +# define MAX_POSTAMBLE 3 + +# define PREAMBLE_END "" +# define EXTENSION_BEGIN ' ' +# define POSTAMBLE_BEGIN " " +# define UPPERCASE_FILESYSTEM FALSE + +# define LEGAL_FILESPEC_CHARS \ + "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890" +# define REPLACEMENT_FILESPEC_CHAR 'X' + +/* +**---------------------------------------------------------------------------- +** FILE OPENING +** +** VM/CMS has a record/block oriented stream file system and supports +** variable length and fixed format files. The default format for text files +** is variable length records and for binary files, fixed length records. +**---------------------------------------------------------------------------- +*/ +# define SUPPORT_FIXED_FMT FALSE +# define SUPPORT_STREAM_FMT TRUE +# define SUPPORT_VARIABLE_FMT TRUE + +# define TEXT_LINE_OVERHEAD 1 + +# define DEF_MODE MODE_BINARY +# define DEF_TEXT_FMT FMT_VARIABLE +# define DEF_BINARY_FMT FMT_FIXED + +# define MIN_VARIABLE_RECORD_LEN 0L +# define MAX_VARIABLE_RECORD_LEN 65535L +# define DEF_VARIABLE_RECORD_LEN 0L + +# define MIN_FIXED_RECORD_LEN 2L +# define MAX_FIXED_RECORD_LEN 32760L +# define DEF_FIXED_RECORD_LEN 512L + +# define DEF_TEXT_PADCHAR ' ' +# define DEF_BINARY_PADCHAR '\0' + +#endif /* (OS_VMCMS) */ + + diff --git a/support/vvcode/ms-bcc.mak b/support/vvcode/ms-bcc.mak new file mode 100644 index 0000000000..4400550fb8 --- /dev/null +++ b/support/vvcode/ms-bcc.mak @@ -0,0 +1,160 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "ms-bcc.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This file is part of VVcode. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your MS-DOS compiler is already supported it should not be necessary to +# modify any part of the Makefile except the local definitions below. Here +# are some examples known to work for my MS-DOS C compilers. +# +# Borland Turbo C v1.5, v2.0 +# +# CC = TCC +# LINK = TCC +# CCMODEL = -ms +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N +# LFLAGS = $(CCMODEL) -v -y +# +# Borland C++ v1.0, v2.0, v3.0 +# +# CC = BCC +# LINK = BCC +# CCMODEL = -ms +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N +# LFLAGS = $(CCMODEL) -v -y +# +# Microsoft C v5.1, v6.0 +# +# CC = CL +# LINK = CL +# CCMODEL = /AS +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od +# LFLAGS = $(CCMODEL) +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = BCC +LINK = BCC +CCMODEL = -ms +CCDEFINES = +CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N +LFLAGS = $(CCMODEL) -v -y +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) msdos$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +vvcode: $(EXEFILES) + @ echo VVcode built + +clean: + - del *$(OBJ) + - del *$(EXE) + +############################################################################## +# Dependencies for executables +############################################################################## +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ) + $(LINK) $(LFLAGS) vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) msdos$(OBJ) + $(LINK) $(LFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) msdos$(OBJ) + +#----------------------------------------------------------------------------- +# Dependencies for object files +#----------------------------------------------------------------------------- +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +msdos$(OBJ): msdos.c $(HDRFILES) diff --git a/support/vvcode/ms-msc.mak b/support/vvcode/ms-msc.mak new file mode 100644 index 0000000000..5fe5b5067b --- /dev/null +++ b/support/vvcode/ms-msc.mak @@ -0,0 +1,160 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "ms-msc.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This file is part of VVcode. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your MS-DOS compiler is already supported it should not be necessary to +# modify any part of the Makefile except the local definitions below. Here +# are some examples known to work for my MS-DOS C compilers. +# +# Borland Turbo C v1.5, v2.0 +# +# CC = TCC +# LINK = TCC +# CCMODEL = -ms +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N +# LFLAGS = $(CCMODEL) -v -y +# +# Borland C++ v1.0, v2.0, v3.0 +# +# CC = BCC +# LINK = BCC +# CCMODEL = -ms +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N +# LFLAGS = $(CCMODEL) -v -y +# +# Microsoft C v5.1, v6.0 +# +# CC = CL +# LINK = CL +# CCMODEL = /AS +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od +# LFLAGS = $(CCMODEL) +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = CL +LINK = CL +CCMODEL = /AS +CCDEFINES = +CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od +LFLAGS = $(CCMODEL) +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) msdos$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +vvcode: $(EXEFILES) + @ echo VVcode built + +clean: + - del *$(OBJ) + - del *$(EXE) + +############################################################################## +# Dependencies for executables +############################################################################## +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ) + $(LINK) $(LFLAGS) vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) msdos$(OBJ) + $(LINK) $(LFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) msdos$(OBJ) + +#----------------------------------------------------------------------------- +# Dependencies for object files +#----------------------------------------------------------------------------- +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +msdos$(OBJ): msdos.c $(HDRFILES) diff --git a/support/vvcode/msdos.c b/support/vvcode/msdos.c new file mode 100644 index 0000000000..15e4eff679 --- /dev/null +++ b/support/vvcode/msdos.c @@ -0,0 +1,1883 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "msdos.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** apply_defaults - Apply default file name and extension to a +** full file specification if either of these +** components is missing. +** confirm_yesno - Display a message to the user and wait for a +** yes/no answer. +** examine_file - Examine a file and determine its key features, +** including mode, format, record length and +** timestamp. +** explain_error - Explain the reason for an error. +** f_open_in - Open a file for input using the appropriate +** mode, format etc for the file. +** f_open_out - Open a file for output using the appropriate +** mode, format etc for the file. +** file_exists - Determine whether a file exists. +** force_file_ext - Force the file extension of a full file +** specification to a specified value. +** is_a_file - Determine whether a file stream is connected +** to a real file rather than a character +** device, pipe etc. +** legal_filespec - Takes an arbitrary string which may a file +** specification from another operating system +** and manipulates it to produce a legal file +** specification for the current operating +** system. +** make_filespec - Construct a full file specification from +** component parts. +** prompt_for_string - Present a prompt string and accept a string +** from the user. +** read_bytes - Read bytes from a currently open file. +** read_line - Read a line from a currently open (text) file. +** read_record - Read a record from a currently open file. +** scan_cmd_line - [tbs] +** set_ftime - Set the timestamp of a file to a specified +** value. +** set_pipe_mode - Set the mode of a file stream connected to a +** pipe, character device, redirected +** stdin/stdout/stderr, in fact any non-file. +** split_file_spec - Split a full file specification into its +** component parts. +** tz_offset - Determine the offset of local time from +** Greenwich Mean Time (Coordinated Universal +** Time) at a specified date and time. +** user_message - Present a message to the user. +** vv_exit - Exit the program, returning the appropriate +** status to the operating system. +** write_bytes - Write bytes to a currently open file. +** write_record - Write a record to a currently open file. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + +/*- +**---------------------------------------------------------------------------- +** Include files +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" + +/*- +**---------------------------------------------------------------------------- +** Implementation (compiler) specific include files +**---------------------------------------------------------------------------- +*/ +#if (MSDOS_TURBOC) +#include <fcntl.h> +#include <io.h> +#endif /* (MSDOS_TURBOC) */ + +#if (MSDOS_MSC) +#include <fcntl.h> +#include <io.h> +#include <sys/utime.h> +#endif /* (MSDOS_MSC) */ + +/*- +**---------------------------------------------------------------------------- +** Implementation (compiler) specific functions and variables +**---------------------------------------------------------------------------- +*/ +#if (MSDOS_TURBOC) + static int TC_utime ARGS ((char *path, TIME_T file_time)); +#endif /* (MSDOS_TURBOC) */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** apply_defaults +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void apply_defaults (CONST char *default_name, + CONST char *default_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void apply_defaults (default_name, default_ext, + full_spec) + CONST char *default_name; + CONST char *default_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char extension[MAX_EXT + 1]; + Unsigned16 path_parts; + char preamble[MAX_PREAMBLE + 1]; + + path_parts = split_file_spec (full_spec, preamble, name, extension, NULL); + + + if (((path_parts & FS_NAME) == 0) && (default_name != NULL)) + { + strncpy (name, default_name, MAX_NAME); + } + + if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL)) + { + strncpy (extension, default_ext, MAX_EXT); + } + + make_file_spec (preamble, name, extension, NULL, full_spec); +} /* apply_defaults */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** confirm_yesno +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean confirm_yesno (CONST char *confirm_str) +#else /* NOT (ANSI_SYNTAX) */ + Boolean confirm_yesno (confirm_str) + CONST char *confirm_str; +#endif /* (ANSI_SYNTAX) */ +{ + int answer; + + FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str); + fflush (stderr); + + do + { + answer = getchar (); + + if (answer == EOF) + { + ERRORMSG ("EOF detected on standard input"); + answer = 'N'; + } + else + { + answer = TOUPPER (answer); + } + } while (!((answer == 'N') || (answer == 'Y'))); + + return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE); +} /* confirm_yesno */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** examine_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#define EX_SAMPLE_SIZE 512 + +#if (ANSI_SYNTAX) + void examine_file (File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + void examine_file (ex_file) + File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_buffer[EX_SAMPLE_SIZE]; + SIZE_T bytes_read; + SIZE_T bc; + SIZE_T eol_count; + int i; + struct stat stat_buffer; + + /*- + **------------------------------------------------------------------------ + ** Initialize the File_Info structure before starting work. If the input + ** file is not a real file (i.e. a device or pipe), these are the values + ** that will be returned. + **------------------------------------------------------------------------ + */ + ex_file->mode = INV_MODE; + ex_file->format = INV_FORMAT; + ex_file->max_rec_len = INV_RECORD_LEN; + ex_file->lng_rec_len = INV_RECORD_LEN; + ex_file->mod_time = INV_TIMESTAMP; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + ex_file->file_ptr = fopen (ex_file->file_spec, "rb"); + + if (ex_file->file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + + /*- + **------------------------------------------------------------------------ + ** Test to see if the file is 'real'. + **------------------------------------------------------------------------ + */ + if (is_a_file (ex_file) == FALSE) + { + DEBUG_1 ("examine_file: `%s' is not a regular file", + ex_file->file_spec); + f_close (ex_file); + ex_file->pipe_flag = TRUE; + ex_file->file_ptr = (FILE *) NULL; + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE, + ex_file->file_ptr); + eol_count = 0; + + for (bc = 0; bc < (bytes_read - 1); bc++) + { + if ((tmp_buffer[bc] == '\r') && (tmp_buffer[bc + 1] == '\n')) + { + ++eol_count; + } + } + f_close (ex_file); + ex_file->file_ptr = (FILE *) NULL; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (bytes_read > (80U * eol_count)) + { + ex_file->mode = MODE_BINARY; + ex_file->format = DEF_BINARY_FMT; + } + else + { + ex_file->mode = MODE_TEXT; + ex_file->format = DEF_TEXT_FMT; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + i = stat (ex_file->file_spec, &stat_buffer); + + if (i != FALSE) + { + ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + ex_file->mod_time = stat_buffer.st_mtime; + +} /* examine_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** explain_error +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void explain_error (void) +#else /* NOT (ANSI_SYNTAX) */ + void explain_error () +#endif /* (ANSI_SYNTAX) */ +{ + INFOMSG_1 ("reason for error: %s", strerror (errno)); +} /* explain_error */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_in +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_in (File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_in (ip_file) + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (ip_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (ip_file->file_spec, "rb"); + break; + case MODE_TEXT: + file_ptr = fopen (ip_file->file_spec, "rt"); + break; + default: + ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode); + return ((FILE *) NULL); + } + + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_in */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_out +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_out (CONST Int16 overwrite_files, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_out (overwrite_files, op_file) + CONST Int16 overwrite_files; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((overwrite_files != OVERWRITE_YES) + && (file_exists (op_file->file_spec))) + { + if (overwrite_files == OVERWRITE_ASK) + { + SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?", + op_file->file_spec); + + if (!confirm_yesno (G_tmp_msg)) + { + INFOMSG ("operation cancelled"); + return ((FILE *) NULL); + } + } + else + { + ERRORMSG_1 ("file `%s' exists", op_file->file_spec); + return ((FILE *) NULL); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (op_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (op_file->file_spec, "wb"); + break; + case MODE_TEXT: + file_ptr = fopen (op_file->file_spec, "wt"); + break; + default: + ERRORMSG_1 ("invalid file mode specified (%d)", op_file->mode); + return ((FILE *) NULL); + } + + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_out */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** file_exists +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean file_exists (CONST char *file_spec) +#else /* NOT (ANSI_SYNTAX) */ + Boolean file_exists (file_spec) + CONST char *file_spec; +#endif /* (ANSI_SYNTAX) */ +{ + +#if (MSDOS_TURBOC) + return ((Boolean) (access (file_spec, 0) == 0)); +#endif /* (MSDOS_TURBOC) */ + +#if (MSDOS_MSC) + return ((Boolean) (access ((char *) file_spec, 0) == 0)); +#endif /* (MSDOS_MSC) */ + +} /* file_exists */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** force_file_ext +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void force_file_ext (CONST char *forced_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void force_file_ext (forced_ext, full_spec) + CONST char *forced_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char preamble[MAX_PREAMBLE + 1]; + + if (forced_ext == NULL) + { + return; + } + (void) split_file_spec (full_spec, preamble, name, NULL, NULL); + make_file_spec (preamble, name, forced_ext, NULL, full_spec); +} /* force_file_ext */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** is_a_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean is_a_file (CONST File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + Boolean is_a_file (ex_file) + CONST File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + int file_handle; + int status; + + file_handle = fileno (ex_file->file_ptr); + status = isatty (file_handle); + + if (status == 0) + { + return (TRUE); + } + else + { + return (FALSE); + } +} /* is_a_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** legal_filespec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *legal_filespec (CONST char *hdrf_spec) +#else /* NOT (ANSI_SYNTAX) */ + char *legal_filespec (hdrf_spec) + CONST char *hdrf_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char tmpf_name[MAX_NAME + 1]; + char tmpf_ext[MAX_EXT + 1]; + char *tmpf_spec; + char *tmp_ptr; + static char opf_spec[MAX_PATH + 1]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmpf_spec = STRDUP (hdrf_spec); + tmp_ptr = STRCHR (tmpf_spec, '.'); + + if (tmp_ptr != NULL) + { + strncpy (tmpf_ext, tmp_ptr, MAX_EXT); + tmpf_ext[MAX_EXT] = '\0'; + *tmp_ptr = '\0'; + } + else + { + strcpy (tmpf_ext, ""); + } + strncpy (tmpf_name, tmpf_spec, MAX_NAME); + tmpf_name[MAX_NAME] = '\0'; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + strcpy (opf_spec, tmpf_name); + strcat (opf_spec, tmpf_ext); + + if (strcmp (hdrf_spec, opf_spec) != 0) + { + WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'", + hdrf_spec, opf_spec); + } + return (opf_spec); +} /* legal_filespec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** make_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void make_file_spec (CONST char *preamble, + CONST char *name, + CONST char *extension, + CONST char *postamble, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void make_file_spec (preamble, name, extension, + postamble, full_spec) + CONST char *preamble; + CONST char *name; + CONST char *extension; + CONST char *postamble; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + int len; + char *tmp_ptr; + + /*- + **------------------------------------------------------------------------ + ** Start with an empty string and append components of the file + ** specification only if they exist. + **------------------------------------------------------------------------ + */ + strcpy (full_spec, ""); + + /*- + **------------------------------------------------------------------------ + ** The preamble component corresponds to the MS-DOS drive and/or path + ** components in the form: + ** + ** D: dir1 \dir1 \dir1\dir2 \dir1\dir2\ + ** D:\ D:dir1 D:\dir1 D:\dir1\dir2\ D:\dir1\dir2\ + ** + ** If the preamble component does not end in '\' or ':', '\' is appended + ** only if the component is not empty. + **------------------------------------------------------------------------ + */ + if ((preamble != NULL) && (*preamble != '\0')) + { + strncat (full_spec, preamble, MAX_PREAMBLE); + len = strlen (preamble); + tmp_ptr = STRCHR ("\\:", preamble[len - 1]); + + if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE)) + { + strcat (full_spec, "\\"); + } + } + + /*- + **------------------------------------------------------------------------ + ** Simply append the name if it is present. + **------------------------------------------------------------------------ + */ + if (name != NULL) + { + strncat (full_spec, name, MAX_NAME); + } + + /*- + **------------------------------------------------------------------------ + ** If the extension component does not begin with '.', prepend '.' before + ** appending the extension to the file specification. + **------------------------------------------------------------------------ + */ + if ((extension != NULL) && (*extension != '\0')) + { + if (*extension != '.') + { + strcat (full_spec, "."); + strncat (full_spec, extension, MAX_EXT - 1); + } + else + { + strncat (full_spec, extension, MAX_EXT); + } + } +} /* make_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** prompt_for_string +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void prompt_for_string (CONST char *confirm_str, + CONST Int16 buf_size, + char *return_buffer) +#else /* NOT (ANSI_SYNTAX) */ + void prompt_for_string (confirm_str, buf_size, + return_buffer) + CONST char *confirm_str; + CONST Int16 buf_size; + char *return_buffer; +#endif /* (ANSI_SYNTAX) */ +{ + char *status; + + FPRINTF (stderr, "\n%s", confirm_str); + fflush (stderr); + status = fgets (return_buffer, (int) buf_size, stdin); + + if (status == NULL) + { + FATALMSG ("error reading string from stdin"); + explain_error (); + vv_exit (); + } + + status = STRCHR (return_buffer, '\n'); + if (status != NULL) + { + *status = '\0'; + } +} /* prompt_for_string */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_bytes (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_bytes (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + int temp; + + for (idx = 0L; idx < max_bytes; idx++) + { + temp = fgetc (ip_file->file_ptr); + + if (temp == EOF) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (idx == 0) + { + return (-1L); + } + break; + } + buffer[(SIZE_T) idx] = (char) temp; + } + return (idx); +} /* read_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_line (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_line (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *tmp_ptr; + + tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr); + buffer[(SIZE_T) (max_bytes - 1)] = '\0'; + + if (tmp_ptr == NULL) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (feof (ip_file->file_ptr)) + { + return (-1L); + } + } + return ((Int32) strlen (buffer)); +} /* read_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_record (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_record (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + +#if SUPPORT_VARIABLE_FMT + + /*- + **------------------------------------------------------------------------ + ** Below is debugging code for simulating record reading on MS-DOS. + ** This code should be removed before official issue! + **------------------------------------------------------------------------ + */ + Int32 bytes_read; + + if (ip_file->mode == MODE_TEXT) + { + bytes_read = read_line (max_bytes, buffer, ip_file); + } + else + { + if (feof (ip_file->file_ptr)) + { + return (-1L); + } + bytes_read = (Int32) fread (buffer, sizeof (char), + (SIZE_T) max_bytes, ip_file->file_ptr); + + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + } + return (bytes_read); + +#else /* NOT SUPPORT_VARIABLE_FMT */ + + INTERNAL_ERROR ("read_record"); + return (-2L); + +#endif /* SUPPORT_VARIABLE_FMT */ +} /* read_record */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** scan_cmd_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void scan_cmd_line (CONST int qargc, + CONST char *qargv[], + CONST char *q_intro_str, + CONST char *q_sep_str, + Qualifier_Struct *qual_array, + Qualifier_Struct *qual_ipfile, + Qualifier_Struct *qual_opfile) +#else /* NOT (ANSI_SYNTAX) */ + void scan_cmd_line (qargc, qargv, q_intro_str, + q_sep_str, qual_array, qual_ipfile, + qual_opfile) + CONST int qargc; + CONST char *qargv[]; + CONST char *q_intro_str; + CONST char *q_sep_str; + Qualifier_Struct *qual_array; + Qualifier_Struct *qual_ipfile; + Qualifier_Struct *qual_opfile; +#endif /* (ANSI_SYNTAX) */ +{ + char *arg; + int arg_no; + int len; + int qual_found; + int q_no; + char *qsep_ptr; + char *qvalue_ptr; + char *tmp_qstr_ptr; + + + /*- + **------------------------------------------------------------------------ + ** Loop through each of the user supplied command line arguments. + **------------------------------------------------------------------------ + */ + tmp_qstr_ptr = NULL; + + for (arg_no = 1; arg_no < qargc; arg_no++) + { + arg = (char *) qargv[arg_no]; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (qual_array[CMDQ_DEBUG].present == TRUE) + { + G_debugging = TRUE; + } + DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg); + + /*- + **-------------------------------------------------------------------- + ** If the first character of the argument is one of the allowable + ** 'q_intro_str' characters then parse it as a qualifier, unless + ** the argument is the 'STDIO_SYMBOL' string when it is interpreted as + ** the standard input or output file. + **-------------------------------------------------------------------- + */ + if (((STRCHR (q_intro_str, *arg) != NULL) + && STRCMP (arg, STDIO_SYMBOL) != 0)) + { + + /*- + **---------------------------------------------------------------- + ** Extract the component of the qualifier string after the + ** 'q_intro_str' character before the 'q_sep_str' character + ** if it is present. + **---------------------------------------------------------------- + */ + if (tmp_qstr_ptr != NULL) + { + free (tmp_qstr_ptr); + } + tmp_qstr_ptr = STRDUP (arg + 1); + qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str); + qvalue_ptr = NULL; + + if (qsep_ptr != NULL) + { + *qsep_ptr = '\0'; + qvalue_ptr = qsep_ptr + 1; + } + + /*- + **---------------------------------------------------------------- + ** Search the command qualifier structure array for this + ** qualifier string. + **---------------------------------------------------------------- + */ + len = strlen (tmp_qstr_ptr); + qual_found = -1; + + for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++) + { + if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, len) == 0) + { + + /*- + **-------------------------------------------------------- + ** + **-------------------------------------------------------- + */ + if (qual_found < 0) + { + qual_found = q_no; + DEBUG_1 ("scan_cmd_line: matches qualifier: `%s'", + qual_array[q_no].q_string); + } + else + { + USAGE_1 ("ambiguous qualifier `%s'", qargv[arg_no]); + } + } + } + + /*- + **---------------------------------------------------------------- + ** If the qualifier string is unknown, return that status. + **---------------------------------------------------------------- + */ + if (qual_found < 0) + { + USAGE_1 ("unknown qualifier `%s'", qargv[arg_no]); + } + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + if (qsep_ptr == NULL) + { + if (qual_array[qual_found].val_needed == VALUE_NEEDED) + { + USAGE_2 ("qualifier `%.1s%s' must take a value", + QUAL_INTRO, qual_array[qual_found].q_string); + } + else + { + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = NULL; + } + } + else + { + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + if (*qvalue_ptr == '\0') + { + USAGE_1 ("value missing after qualifier `%s'", + qargv[arg_no]); + } + else + if (qual_array[qual_found].val_needed == VALUE_NONE) + { + USAGE_2 ("qualifier `%.1s%s' does not take a value", + QUAL_INTRO, qual_array[qual_found].q_string); + } + else + { + qual_array[qual_found].value = STRDUP (qvalue_ptr); + qual_array[qual_found].present = TRUE; + DEBUG_1 ("scan_cmd_line: qualifier value: `%s'", + qual_array[qual_found].value); + continue; + } + } + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + else + { + if (qual_ipfile->present == FALSE) + { + qual_ipfile->present = TRUE; + qual_ipfile->value = STRDUP (qargv[arg_no]); + } + else + if (qual_opfile->present == FALSE) + { + qual_opfile->present = TRUE; + qual_opfile->value = STRDUP (qargv[arg_no]); + } + else + { + USAGE ("too many file names specified"); + } + } + } +} /* scan_cmd_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_ftime +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_ftime (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_ftime (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + struct tm *tms; + +#if (MSDOS_MSC) + struct utimbuf utb; +#endif /* (MSDOS_MSC) */ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_2 ("set_ftime: setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + + /*- + **------------------------------------------------------------------------ + ** MS-DOS doesn't understand times before 1980.01.01-00:00:00 local time. + ** If the time is before this time, issue a warning message and rely on + ** utime() not to blow up when passed such a time. + **------------------------------------------------------------------------ + */ + tms = localtime (&(target_file->mod_time)); + if (tms->tm_year < 80) + { + WARNMSG_2 ("Cannot set file `%s' time to %s", target_file->file_spec, + vv_timestamp (target_file->mod_time)); + INFOMSG ("reason: MS-DOS does not support file times before 1980."); + WARNMSG_1 ("File `%s' time set to 1980.01.01-00:00:00 GMT", + target_file->file_spec); + } + + /*- + **------------------------------------------------------------------------ + ** Turbo C does not have a version of utime() so we use the TC_utime() + ** emulation instead. + **------------------------------------------------------------------------ + */ +#if (MSDOS_MSC) + utb.actime = target_file->mod_time; + utb.modtime = target_file->mod_time; + status = utime (target_file->file_spec, &utb); +#endif /* (MSDOS_MSC) */ + +#if (MSDOS_TURBOC) + status = TC_utime (target_file->file_spec, target_file->mod_time); +#endif /* (MSDOS_TURBOC) */ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status != 0) + { + ERRORMSG_2 ("error setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + explain_error (); + } + return; + +} /* set_ftime */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_pipe_mode +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_pipe_mode (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_pipe_mode (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int file_handle; + int status; + + file_handle = fileno (target_file->file_ptr); + switch (target_file->mode) + { + case MODE_BINARY: + status = setmode (file_handle, (int) O_BINARY); + break; + case MODE_TEXT: + status = setmode (file_handle, (int) O_TEXT); + break; + default: + INTERNAL_ERROR ("set_pipe_mode"); + } + + if (status < 0) + { + ERRORMSG_1 ("error setting mode of file `%s'", target_file->file_spec); + explain_error (); + } +} /* set_pipe_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** split_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Unsigned16 split_file_spec (CONST char *full_spec, + char *preamble, + char *name, + char *extension, + char *postamble) +#else /* NOT (ANSI_SYNTAX) */ + Unsigned16 split_file_spec (full_spec, preamble, name, + extension, postamble) + CONST char *full_spec; + char *preamble; + char *name; + char *extension; + char *postamble; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_full_spec[MAX_PATH + 1]; + char *start_ptr; + char *tmp_ptr; + int idx; + Unsigned16 path_components; + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (preamble != NULL) + { + *preamble = '\0'; + } + if (name != NULL) + { + *name = '\0'; + } + if (extension != NULL) + { + *extension = '\0'; + } + if (postamble != NULL) + { + *postamble = '\0'; + } + path_components = FS_NOTHING; + + if ((full_spec == NULL) || (*full_spec == '\0')) + { + return (path_components); + } + + strcpy (tmp_full_spec, full_spec); + start_ptr = (char *) tmp_full_spec; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRRSTR (start_ptr, ":\\"); + + if (tmp_ptr != NULL) + { + path_components |= FS_PREAMBLE; + + if (preamble != NULL) + { + for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr)); + idx++) + { + *preamble++ = *start_ptr++; + } + *preamble = '\0'; + } + start_ptr = ++tmp_ptr; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRCHR (start_ptr, '.'); + if (tmp_ptr != NULL) + { + path_components |= FS_EXTENSION; + + if (extension != NULL) + { + strncpy (extension, tmp_ptr, MAX_EXT); + } + *tmp_ptr = '\0'; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (*start_ptr != '\0') + { + path_components |= FS_NAME; + + if (name != NULL) + { + strncpy (name, start_ptr, MAX_NAME); + } + } + + return (path_components); +} /* split_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** tz_offset +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T tz_offset (TIME_T the_time) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T tz_offset (the_time) + TIME_T the_time; +#endif /* (ANSI_SYNTAX) */ +{ + struct tm *tm; + char *tz_str; + char set_tz_str[32]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tz_str = getenv ("TZ"); + + if (tz_str == NULL) + { + strcpy (set_tz_str, "TZ="); + strcat (set_tz_str, VV_TIMEZONE); + putenv (set_tz_str); + } + tzset (); + tm = localtime (&the_time); + + if (tm->tm_isdst > 0) + { + return (timezone - (TIME_T) 3600); + } + else + { + return (timezone); + } +} /* tz_offset */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** user_message +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void user_message (CONST Int16 status, + CONST char *msg_str, + File_Info *log_file) +#else /* NOT (ANSI_SYNTAX) */ + void user_message (status, msg_str, log_file) + CONST Int16 status; + CONST char *msg_str; + File_Info *log_file; +#endif /* (ANSI_SYNTAX) */ +{ + int to_stderr; + int to_logfile; + char *status_str; + + + /*- + **------------------------------------------------------------------------ + ** Check the value supplied for the message status and set the output + ** destinations accordingly. + **------------------------------------------------------------------------ + */ + to_logfile = TRUE; + to_stderr = FALSE; + + switch (status) + { + case LOG_STATUS: + case NORMAL_STATUS: + status_str = ""; + break; + case INFO_STATUS: + status_str = " -- "; + to_stderr = TRUE; + break; + case WARNING_STATUS: + status_str = "\nWARNING: "; + to_stderr = TRUE; + break; + case ERROR_STATUS: + status_str = "\nERROR: "; + to_stderr = TRUE; + break; + case FATAL_STATUS: + status_str = "\nFATAL: "; + to_stderr = TRUE; + break; + default: + INTERNAL_ERROR ("user_message"); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is NULL, just update the status and/or the message + ** show status. + **------------------------------------------------------------------------ + */ + if ((msg_str == NULL) || (*msg_str == '\0')) + { + if (status > G_status) + { + G_status = status; + } + return; + } + + /*- + **------------------------------------------------------------------------ + ** Make sure that we don't try to write to a NULL log file pointer. + **------------------------------------------------------------------------ + */ + if (log_file->file_ptr == (FILE *) NULL) + { + to_logfile = FALSE; + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file and stderr, check whether + ** the log file output is also to stderr. If it is, disable the 'stderr' + ** output. + **------------------------------------------------------------------------ + */ + if (to_logfile && to_stderr) + { + if (log_file->file_ptr == stderr) + { + to_stderr = FALSE; + } + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to stderr, output it here. + **------------------------------------------------------------------------ + */ + if (to_stderr) + { + FPRINTF (stderr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file, output it here. If + ** debugging is enabled, report also the name of the calling function. + **------------------------------------------------------------------------ + */ + if (to_logfile) + { + FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status > G_status) + { + G_status = status; + } +} /* user_message */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vv_exit +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void vv_exit (void) +#else /* NOT (ANSI_SYNTAX) */ + void vv_exit () +#endif /* (ANSI_SYNTAX) */ +{ + switch (G_status) + { + case LOG_STATUS: + case NORMAL_STATUS: + exit (0); + break; + case WARNING_STATUS: + exit (1); + break; + case ERROR_STATUS: + exit (2); + break; + case FATAL_STATUS: + default: + exit (3); + break; + } +} /* vv_exit */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_bytes (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_bytes (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + + for (idx = 0L; idx < max_bytes; idx++) + { + fputc (buffer[(SIZE_T) idx], op_file->file_ptr); + } +} /* write_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_record (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_record (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + +#if SUPPORT_VARIABLE_FMT + + /*- + **------------------------------------------------------------------------ + ** Below is debugging code for simulating record writing on MS-DOS. + ** This code should be removed before official issue! + **------------------------------------------------------------------------ + */ + Int32 no_bytes; + + no_bytes = max_bytes * sizeof (char); + + /*- + **------------------------------------------------------------------------ + ** Check that the buffer does not exceed the maximum allowable record + ** length. If it does, truncate the record and issue a warning. + **------------------------------------------------------------------------ + */ + if ((op_file->max_rec_len > 0) && (no_bytes > op_file->max_rec_len)) + { + ERRORMSG_2 ("output record too long (%ld bytes, max = %ld) - truncated", + no_bytes, op_file->max_rec_len); + no_bytes = op_file->max_rec_len / sizeof (char); + } + fwrite (buffer, sizeof (char), (SIZE_T) no_bytes, op_file->file_ptr); + +#else /* NOT SUPPORT_VARIABLE_FMT */ + + INTERNAL_ERROR ("write_record"); + +#endif /* SUPPORT_VARIABLE_FMT */ +} /* write_record */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** TC_utime +** +** DESCRIPTION +** +** Set the modification time of a file. This is a crude emulation of the +** Unix C utime() function for Turbo C which doesn't provide one +** (Microsoft C does). +** +** INPUT PARAMETERS +** +** file_spec - the file specification of the file +** file_time - the Unix format file modification time to be set. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** Zero if the time was set successfully, -1 otherwise. +** +**============================================================================ +*/ +#if (MSDOS_TURBOC) +static int TC_utime (char *file_spec, TIME_T file_time) +{ + int handle; + int status; + struct ftime fts; + struct tm *tms; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + handle = open (file_spec, O_RDWR); + + if (handle < 0) + { + ERRORMSG_1 ("error opening file `%s'", file_spec); + explain_error (); + return (-1); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tms = localtime (&file_time); + fts.ft_tsec = (tms->tm_sec / 2) & 0x1f; + fts.ft_min = (tms->tm_min) & 0x3f; + fts.ft_hour = (tms->tm_hour) & 0x1f; + fts.ft_day = (tms->tm_mday) & 0x1f; + fts.ft_month = (tms->tm_mon + 1) & 0x0f; + + /*- + **------------------------------------------------------------------------ + ** If the local time is before 1980.01.01-00:00:00, reset it to that. + **------------------------------------------------------------------------ + */ + if (tms->tm_year < 80) + { + fts.ft_tsec = 0; + fts.ft_min = 0; + fts.ft_hour = 0; + fts.ft_day = 0; + fts.ft_month = 0; + fts.ft_year = 0; + } + else + { + fts.ft_year = (tms->tm_year - 80) & 0x7f; + } + status = setftime (handle, &fts); + + if (status != 0) + { + ERRORMSG_2 ("error setting file `%s' time to %.24s", + file_spec, ctime (&file_time)); + explain_error (); + close (handle); + return (-1); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + status = close (handle); + + if (status < 0) + { + ERRORMSG_1 ("error closing file `%s'", file_spec); + return (-1); + } + return (0); +} +#endif /* (MSDOS_TURBOC) */ diff --git a/support/vvcode/msdos.mak b/support/vvcode/msdos.mak new file mode 100644 index 0000000000..2168ef5609 --- /dev/null +++ b/support/vvcode/msdos.mak @@ -0,0 +1,160 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "msdos.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This file is part of VVcode. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your MS-DOS compiler is already supported it should not be necessary to +# modify any part of the Makefile except the local definitions below. Here +# are some examples known to work for my MS-DOS C compilers. +# +# Borland Turbo C v1.5, v2.0 +# +# CC = TCC +# LINK = TCC +# CCMODEL = -ms +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N +# LFLAGS = $(CCMODEL) -v -y +# +# Borland C++ v1.0, v2.0, v3.0 +# +# CC = BCC +# LINK = BCC +# CCMODEL = -ms +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N +# LFLAGS = $(CCMODEL) -v -y +# +# Microsoft C v5.1, v6.0 +# +# CC = CL +# LINK = CL +# CCMODEL = /AS +# CCDEFINES = +# CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od +# LFLAGS = $(CCMODEL) +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = [to be specified] +LINK = [to be specified] +CCMODEL = [to be specified] +CCDEFINES = [to be specified] +CFLAGS = [to be specified] +LFLAGS = [to be specified] +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) msdos$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +vvcode: $(EXEFILES) + @ echo VVcode built + +clean: + - del *$(OBJ) + - del *$(EXE) + +############################################################################## +# Dependencies for executables +############################################################################## +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ) + $(LINK) $(LFLAGS) vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) msdos$(OBJ) + $(LINK) $(LFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) msdos$(OBJ) + +#----------------------------------------------------------------------------- +# Dependencies for object files +#----------------------------------------------------------------------------- +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +msdos$(OBJ): msdos.c $(HDRFILES) diff --git a/support/vvcode/os2-cset.mak b/support/vvcode/os2-cset.mak new file mode 100644 index 0000000000..1711447af1 --- /dev/null +++ b/support/vvcode/os2-cset.mak @@ -0,0 +1,161 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "os2-cset.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This file is part of VVcode. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your OS/2 compiler is already supported it should not be necessary to +# modify any part of the Makefile except the local definitions below. Here +# are some examples known to work for my OS/2 C compilers. +# +# EMX/GNUC v2.1 +# +# CC = GCC +# LINK = GCC +# CCMODEL = +# CCDEFINES = -DOS2 +# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@ +# LFLAGS = -g -o $@ +# +# IBM C Set/2 v1.00 (using migration libraries) +# +# CC = ICC +# LINK = ICC +# CCMODEL = +# CCDEFINES = +# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES) +# LFLAGS = /Q+ +# +# Microsoft C v6.0 +# +# CC = CL +# LINK = CL +# CCMODEL = /AS +# CCDEFINES = +# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp +# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = ICC +LINK = ICC +CCMODEL = +CCDEFINES = +CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES) +LFLAGS = /Q+ +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) os2$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +vvcode: $(EXEFILES) + @ echo VVcode built + +clean: + - del *$(OBJ) + - del *$(EXE) + +#----------------------------------------------------------------------------- +# Dependencies for executables +#----------------------------------------------------------------------------- +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \ + os2$(OBJ) $(LFLAGS) + +#----------------------------------------------------------------------------- +# Dependencies for object files +#----------------------------------------------------------------------------- +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +os2$(OBJ): os2.c $(HDRFILES) diff --git a/support/vvcode/os2-gcc.mak b/support/vvcode/os2-gcc.mak new file mode 100644 index 0000000000..062a595a2e --- /dev/null +++ b/support/vvcode/os2-gcc.mak @@ -0,0 +1,161 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "os2-gcc.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This file is part of VVcode. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your OS/2 compiler is already supported it should not be necessary to +# modify any part of the Makefile except the local definitions below. Here +# are some examples known to work for my OS/2 C compilers. +# +# EMX/GNUC v2.1 +# +# CC = GCC +# LINK = GCC +# CCMODEL = +# CCDEFINES = -DOS2 +# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@ +# LFLAGS = -g -o $@ +# +# IBM C Set/2 v1.00 (using migration libraries) +# +# CC = ICC +# LINK = ICC +# CCMODEL = +# CCDEFINES = +# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES) +# LFLAGS = /Q+ +# +# Microsoft C v6.0 +# +# CC = CL +# LINK = CL +# CCMODEL = /AS +# CCDEFINES = +# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp +# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = GCC +LINK = GCC +CCMODEL = +CCDEFINES = -DOS2 +CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@ +LFLAGS = -g -o $@ +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) os2$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +vvcode: $(EXEFILES) + @ echo VVcode built + +clean: + - del *$(OBJ) + - del *$(EXE) + +#----------------------------------------------------------------------------- +# Dependencies for executables +#----------------------------------------------------------------------------- +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \ + os2$(OBJ) $(LFLAGS) + +#----------------------------------------------------------------------------- +# Dependencies for object files +#----------------------------------------------------------------------------- +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +os2$(OBJ): os2.c $(HDRFILES) diff --git a/support/vvcode/os2-msc.mak b/support/vvcode/os2-msc.mak new file mode 100644 index 0000000000..22f499ba83 --- /dev/null +++ b/support/vvcode/os2-msc.mak @@ -0,0 +1,161 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "os2-msc.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This file is part of VVcode. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your OS/2 compiler is already supported it should not be necessary to +# modify any part of the Makefile except the local definitions below. Here +# are some examples known to work for my OS/2 C compilers. +# +# EMX/GNUC v2.1 +# +# CC = GCC +# LINK = GCC +# CCMODEL = +# CCDEFINES = -DOS2 +# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@ +# LFLAGS = -g -o $@ +# +# IBM C Set/2 v1.00 (using migration libraries) +# +# CC = ICC +# LINK = ICC +# CCMODEL = +# CCDEFINES = +# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES) +# LFLAGS = /Q+ +# +# Microsoft C v6.0 +# +# CC = CL +# LINK = CL +# CCMODEL = /AS +# CCDEFINES = +# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp +# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = CL +LINK = CL +CCMODEL = /AS +CCDEFINES = +CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp +LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) os2$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +vvcode: $(EXEFILES) + @ echo VVcode built + +clean: + - del *$(OBJ) + - del *$(EXE) + +#----------------------------------------------------------------------------- +# Dependencies for executables +#----------------------------------------------------------------------------- +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \ + os2$(OBJ) $(LFLAGS) + +#----------------------------------------------------------------------------- +# Dependencies for object files +#----------------------------------------------------------------------------- +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +os2$(OBJ): os2.c $(HDRFILES) diff --git a/support/vvcode/os2.c b/support/vvcode/os2.c new file mode 100644 index 0000000000..773730234b --- /dev/null +++ b/support/vvcode/os2.c @@ -0,0 +1,1774 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "os2.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** apply_defaults - Apply default file name and extension to a +** full file specification if either of these +** components is missing. +** confirm_yesno - Display a message to the user and wait for a +** yes/no answer. +** examine_file - Examine a file and determine its key features, +** including mode, format, record length and +** timestamp. +** explain_error - Explain the reason for an error. +** f_open_in - Open a file for input using the appropriate +** mode, format etc for the file. +** f_open_out - Open a file for output using the appropriate +** mode, format etc for the file. +** file_exists - Determine whether a file exists. +** force_file_ext - Force the file extension of a full file +** specification to a specified value. +** is_a_file - Determine whether a file stream is connected +** to a real file rather than a character +** device, pipe etc. +** legal_filespec - Takes an arbitrary string which may a file +** specification from another operating system +** and manipulates it to produce a legal file +** specification for the current operating +** system. +** make_filespec - Construct a full file specification from +** component parts. +** prompt_for_string - Present a prompt string and accept a string +** from the user. +** read_bytes - Read bytes from a currently open file. +** read_line - Read a line from a currently open (text) file. +** read_record - Read a record from a currently open file. +** scan_cmd_line - [tbs] +** set_ftime - Set the timestamp of a file to a specified +** value. +** set_pipe_mode - Set the mode of a file stream connected to a +** pipe, character device, redirected +** stdin/stdout/stderr, in fact any non-file. +** split_file_spec - Split a full file specification into its +** component parts. +** tz_offset - Determine the offset of local time from +** Greenwich Mean Time (Coordinated Universal +** Time) at a specified date and time. +** user_message - Present a message to the user. +** vv_exit - Exit the program, returning the appropriate +** status to the operating system. +** write_bytes - Write bytes to a currently open file. +** write_record - Write a record to a currently open file. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + +/*- +**---------------------------------------------------------------------------- +** Include files +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" + +/*- +**---------------------------------------------------------------------------- +** Implementation (compiler) specific include files +**---------------------------------------------------------------------------- +*/ +#if (OS2_GNUC) +# include <io.h> +# include <sys/fcntl.h> +# include <sys/utime.h> +# include <sys/timeb.h> +#endif /* (OS2_GNUC) */ + +#if (OS2_CSET) +# include <io.h> +# include <fcntl.h> +# include <sys/utime.h> +#endif /* (OS2_CSET) */ + +#if (OS2_MSC) +# include <io.h> +# include <fcntl.h> +# include <sys/utime.h> +#endif /* (OS2_MSC) */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** apply_defaults +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void apply_defaults (CONST char *default_name, + CONST char *default_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void apply_defaults (default_name, default_ext, + full_spec) + CONST char *default_name; + CONST char *default_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char extension[MAX_EXT + 1]; + Unsigned16 path_parts; + char preamble[MAX_PREAMBLE + 1]; + + path_parts = split_file_spec (full_spec, preamble, name, extension, NULL); + + + if (((path_parts & FS_NAME) == 0) && (default_name != NULL)) + { + strncpy (name, default_name, MAX_NAME); + } + + if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL)) + { + strncpy (extension, default_ext, MAX_EXT); + } + + make_file_spec (preamble, name, extension, NULL, full_spec); +} /* apply_defaults */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** confirm_yesno +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean confirm_yesno (CONST char *confirm_str) +#else /* NOT (ANSI_SYNTAX) */ + Boolean confirm_yesno (confirm_str) + CONST char *confirm_str; +#endif /* (ANSI_SYNTAX) */ +{ + int answer; + + FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str); + fflush (stderr); + + do + { + answer = getchar (); + + if (answer == EOF) + { + ERRORMSG ("EOF detected on standard input"); + answer = 'N'; + } + else + { + answer = TOUPPER (answer); + } + } while (!((answer == 'N') || (answer == 'Y'))); + + return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE); +} /* confirm_yesno */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** examine_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#define EX_SAMPLE_SIZE 512 + +#if (ANSI_SYNTAX) + void examine_file (File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + void examine_file (ex_file) + File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_buffer[EX_SAMPLE_SIZE]; + SIZE_T bytes_read; + SIZE_T bc; + SIZE_T eol_count; + int i; + struct stat stat_buffer; + + /*- + **------------------------------------------------------------------------ + ** Initialize the File_Info structure before starting work. If the input + ** file is not a real file (i.e. a device or pipe), these are the values + ** that will be returned. + **------------------------------------------------------------------------ + */ + ex_file->mode = INV_MODE; + ex_file->format = INV_FORMAT; + ex_file->max_rec_len = INV_RECORD_LEN; + ex_file->lng_rec_len = INV_RECORD_LEN; + ex_file->mod_time = INV_TIMESTAMP; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + ex_file->file_ptr = fopen (ex_file->file_spec, "rb"); + + if (ex_file->file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + + /*- + **------------------------------------------------------------------------ + ** Test to see if the file is 'real'. + **------------------------------------------------------------------------ + */ + if (is_a_file (ex_file) == FALSE) + { + DEBUG_1 ("examine_file: `%s' is not a regular file", + ex_file->file_spec); + f_close (ex_file); + ex_file->pipe_flag = TRUE; + ex_file->file_ptr = (FILE *) NULL; + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE, + ex_file->file_ptr); + eol_count = 0; + + for (bc = 0; bc < (bytes_read - 1); bc++) + { + if ((tmp_buffer[bc] == '\r') && (tmp_buffer[bc + 1] == '\n')) + { + ++eol_count; + } + } + f_close (ex_file); + ex_file->file_ptr = (FILE *) NULL; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (bytes_read > (80U * eol_count)) + { + ex_file->mode = MODE_BINARY; + ex_file->format = DEF_BINARY_FMT; + } + else + { + ex_file->mode = MODE_TEXT; + ex_file->format = DEF_TEXT_FMT; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + i = stat (ex_file->file_spec, &stat_buffer); + + if (i != FALSE) + { + ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + ex_file->mod_time = stat_buffer.st_mtime; + +} /* examine_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** explain_error +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void explain_error (void) +#else /* NOT (ANSI_SYNTAX) */ + void explain_error () +#endif /* (ANSI_SYNTAX) */ +{ + INFOMSG_1 ("reason for error: %s", strerror (errno)); +} /* explain_error */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_in +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_in (File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_in (ip_file) + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (ip_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (ip_file->file_spec, "rb"); + break; + case MODE_TEXT: + file_ptr = fopen (ip_file->file_spec, "r"); + break; + default: + ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode); + return ((FILE *) NULL); + } + + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_in */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_out +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_out (CONST Int16 overwrite_files, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_out (overwrite_files, op_file) + CONST Int16 overwrite_files; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((overwrite_files != OVERWRITE_YES) + && (file_exists (op_file->file_spec))) + { + if (overwrite_files == OVERWRITE_ASK) + { + SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?", + op_file->file_spec); + + if (!confirm_yesno (G_tmp_msg)) + { + INFOMSG ("operation cancelled"); + return ((FILE *) NULL); + } + } + else + { + ERRORMSG_1 ("file `%s' exists", op_file->file_spec); + return ((FILE *) NULL); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (op_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (op_file->file_spec, "wb"); + break; + case MODE_TEXT: + file_ptr = fopen (op_file->file_spec, "w"); + break; + default: + ERRORMSG_1 ("invalid file mode specified (%d)", op_file->mode); + return ((FILE *) NULL); + } + + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_out */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** file_exists +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean file_exists (CONST char *file_spec) +#else /* NOT (ANSI_SYNTAX) */ + Boolean file_exists (file_spec) + CONST char *file_spec; +#endif /* (ANSI_SYNTAX) */ +{ + return ((Boolean) (access ((char *) file_spec, 0) == 0)); +} /* file_exists */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** force_file_ext +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void force_file_ext (CONST char *forced_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void force_file_ext (forced_ext, full_spec) + CONST char *forced_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char preamble[MAX_PREAMBLE + 1]; + + if (forced_ext == NULL) + { + return; + } + (void) split_file_spec (full_spec, preamble, name, NULL, NULL); + make_file_spec (preamble, name, forced_ext, NULL, full_spec); +} /* force_file_ext */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** is_a_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean is_a_file (CONST File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + Boolean is_a_file (ex_file) + CONST File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + int file_handle; + int status; + + file_handle = fileno (ex_file->file_ptr); + status = isatty (file_handle); + + if (status == 0) + { + return (TRUE); + } + else + { + return (FALSE); + } +} /* is_a_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** legal_filespec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *legal_filespec (CONST char *hdrf_spec) +#else /* NOT (ANSI_SYNTAX) */ + char *legal_filespec (hdrf_spec) + CONST char *hdrf_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char tmpf_name[MAX_NAME + 1]; + char tmpf_ext[MAX_EXT + 1]; + char *tmpf_spec; + char *tmp_ptr; + static char opf_spec[MAX_PATH + 1]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmpf_spec = STRDUP (hdrf_spec); + tmp_ptr = STRCHR (tmpf_spec, '.'); + + if (tmp_ptr != NULL) + { + strncpy (tmpf_ext, tmp_ptr, MAX_EXT); + tmpf_ext[MAX_EXT] = '\0'; + *tmp_ptr = '\0'; + } + else + { + strcpy (tmpf_ext, ""); + } + strncpy (tmpf_name, tmpf_spec, MAX_NAME); + tmpf_name[MAX_NAME] = '\0'; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + strcpy (opf_spec, tmpf_name); + strcat (opf_spec, tmpf_ext); + + if (strcmp (hdrf_spec, opf_spec) != 0) + { + WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'", + hdrf_spec, opf_spec); + } + return (opf_spec); +} /* legal_filespec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** make_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void make_file_spec (CONST char *preamble, + CONST char *name, + CONST char *extension, + CONST char *postamble, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void make_file_spec (preamble, name, extension, + postamble, full_spec) + CONST char *preamble; + CONST char *name; + CONST char *extension; + CONST char *postamble; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + SIZE_T len; + char *tmp_ptr; + + /*- + **------------------------------------------------------------------------ + ** Start with an empty string and append components of the file + ** specification only if they exist. + **------------------------------------------------------------------------ + */ + strcpy (full_spec, ""); + + /*- + **------------------------------------------------------------------------ + ** The preamble component corresponds to the OS/2 drive and/or path + ** components in the form: + ** + ** D: dir1 \dir1 \dir1\dir2 \dir1\dir2\ + ** D:\ D:dir1 D:\dir1 D:\dir1\dir2\ D:\dir1\dir2\ + ** + ** If the preamble component does not end in '\' or ':', '\' is appended + ** only if the component is not empty. + **------------------------------------------------------------------------ + */ + if ((preamble != NULL) && (*preamble != '\0')) + { + strncat (full_spec, preamble, MAX_PREAMBLE); + len = strlen (preamble); + tmp_ptr = STRCHR ("\\:", preamble[len - 1]); + + if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE)) + { + strcat (full_spec, "\\"); + } + } + + /*- + **------------------------------------------------------------------------ + ** Simply append the name if it is present. + **------------------------------------------------------------------------ + */ + if (name != NULL) + { + strncat (full_spec, name, MAX_NAME); + } + + /*- + **------------------------------------------------------------------------ + ** If the extension component does not begin with '.', prepend '.' before + ** appending the extension to the file specification. + **------------------------------------------------------------------------ + */ + if ((extension != NULL) && (*extension != '\0')) + { + if (*extension != '.') + { + strcat (full_spec, "."); + strncat (full_spec, extension, MAX_EXT - 1); + } + else + { + strncat (full_spec, extension, MAX_EXT); + } + } +} /* make_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** prompt_for_string +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void prompt_for_string (CONST char *confirm_str, + CONST Int16 buf_size, + char *return_buffer) +#else /* NOT (ANSI_SYNTAX) */ + void prompt_for_string (confirm_str, buf_size, + return_buffer) + CONST char *confirm_str; + CONST Int16 buf_size; + char *return_buffer; +#endif /* (ANSI_SYNTAX) */ +{ + char *status; + + FPRINTF (stderr, "\n%s", confirm_str); + fflush (stderr); + status = fgets (return_buffer, (int) buf_size, stdin); + + if (status == NULL) + { + FATALMSG ("error reading string from stdin"); + explain_error (); + vv_exit (); + } + + status = STRCHR (return_buffer, '\n'); + if (status != NULL) + { + *status = '\0'; + } +} /* prompt_for_string */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_bytes (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_bytes (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + int temp; + + for (idx = 0L; idx < max_bytes; idx++) + { + temp = fgetc (ip_file->file_ptr); + + if (temp == EOF) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (idx == 0) + { + return (-1L); + } + break; + } + buffer[(SIZE_T) idx] = (char) temp; + } + return (idx); +} /* read_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_line (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_line (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *tmp_ptr; + + tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr); + buffer[(SIZE_T) (max_bytes - 1)] = '\0'; + + if (tmp_ptr == NULL) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (feof (ip_file->file_ptr)) + { + return (-1L); + } + } + return ((Int32) strlen (buffer)); +} /* read_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_record (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_record (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + +#if SUPPORT_VARIABLE_FMT + + /*- + **------------------------------------------------------------------------ + ** Below is debugging code for simulating record reading on OS/2. + ** This code should be removed before official issue! + **------------------------------------------------------------------------ + */ + Int32 bytes_read; + + if (ip_file->mode == MODE_TEXT) + { + bytes_read = read_line (max_bytes, buffer, ip_file); + } + else + { + if (feof (ip_file->file_ptr)) + { + return (-1L); + } + bytes_read = (Int32) fread (buffer, sizeof (char), + (SIZE_T) max_bytes, ip_file->file_ptr); + + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + } + return (bytes_read); + +#else /* NOT SUPPORT_VARIABLE_FMT */ + + INTERNAL_ERROR ("read_record"); + return (-2L); + +#endif /* SUPPORT_VARIABLE_FMT */ +} /* read_record */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** scan_cmd_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void scan_cmd_line (CONST int qargc, + CONST char *qargv[], + CONST char *q_intro_str, + CONST char *q_sep_str, + Qualifier_Struct *qual_array, + Qualifier_Struct *qual_ipfile, + Qualifier_Struct *qual_opfile) +#else /* NOT (ANSI_SYNTAX) */ + void scan_cmd_line (qargc, qargv, q_intro_str, + q_sep_str, qual_array, qual_ipfile, + qual_opfile) + CONST int qargc; + CONST char *qargv[]; + CONST char *q_intro_str; + CONST char *q_sep_str; + Qualifier_Struct *qual_array; + Qualifier_Struct *qual_ipfile; + Qualifier_Struct *qual_opfile; +#endif /* (ANSI_SYNTAX) */ +{ + char *arg; + int arg_no; + int len; + int qual_found; + int q_no; + char *qsep_ptr; + char *qvalue_ptr; + char *tmp_qstr_ptr; + + + /*- + **------------------------------------------------------------------------ + ** Loop through each of the user supplied command line arguments. + **------------------------------------------------------------------------ + */ + tmp_qstr_ptr = NULL; + + for (arg_no = 1; arg_no < qargc; arg_no++) + { + arg = (char *) qargv[arg_no]; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (qual_array[CMDQ_DEBUG].present == TRUE) + { + G_debugging = TRUE; + } + DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg); + + /*- + **-------------------------------------------------------------------- + ** If the first character of the argument is one of the allowable + ** 'q_intro_str' characters then parse it as a qualifier, unless + ** the argument is the 'STDIO_SYMBOL' string when it is interpreted as + ** the standard input or output file. + **-------------------------------------------------------------------- + */ + if (((STRCHR (q_intro_str, *arg) != NULL) + && STRCMP (arg, STDIO_SYMBOL) != 0)) + { + + /*- + **---------------------------------------------------------------- + ** Extract the component of the qualifier string after the + ** 'q_intro_str' character before the 'q_sep_str' character + ** if it is present. + **---------------------------------------------------------------- + */ + if (tmp_qstr_ptr != NULL) + { + free (tmp_qstr_ptr); + } + tmp_qstr_ptr = STRDUP (arg + 1); + qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str); + qvalue_ptr = NULL; + + if (qsep_ptr != NULL) + { + *qsep_ptr = '\0'; + qvalue_ptr = qsep_ptr + 1; + } + + /*- + **---------------------------------------------------------------- + ** Search the command qualifier structure array for this + ** qualifier string. + **---------------------------------------------------------------- + */ + len = strlen (tmp_qstr_ptr); + qual_found = -1; + + for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++) + { + if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, len) == 0) + { + + /*- + **-------------------------------------------------------- + ** + **-------------------------------------------------------- + */ + if (qual_found < 0) + { + qual_found = q_no; + DEBUG_1 ("scan_cmd_line: matches qualifier: `%s'", + qual_array[q_no].q_string); + } + else + { + USAGE_1 ("ambiguous qualifier `%s'", qargv[arg_no]); + } + } + } + + /*- + **---------------------------------------------------------------- + ** If the qualifier string is unknown, return that status. + **---------------------------------------------------------------- + */ + if (qual_found < 0) + { + USAGE_1 ("unknown qualifier `%s'", qargv[arg_no]); + } + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + if (qsep_ptr == NULL) + { + if (qual_array[qual_found].val_needed == VALUE_NEEDED) + { + USAGE_2 ("qualifier `%.1s%s' must take a value", + QUAL_INTRO, qual_array[qual_found].q_string); + } + else + { + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = NULL; + } + } + else + { + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + if (*qvalue_ptr == '\0') + { + USAGE_1 ("value missing after qualifier `%s'", + qargv[arg_no]); + } + else + if (qual_array[qual_found].val_needed == VALUE_NONE) + { + USAGE_2 ("qualifier `%.1s%s' does not take a value", + QUAL_INTRO, qual_array[qual_found].q_string); + } + else + { + qual_array[qual_found].value = STRDUP (qvalue_ptr); + qual_array[qual_found].present = TRUE; + DEBUG_1 ("scan_cmd_line: qualifier value: `%s'", + qual_array[qual_found].value); + continue; + } + } + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + else + { + if (qual_ipfile->present == FALSE) + { + qual_ipfile->present = TRUE; + qual_ipfile->value = STRDUP (qargv[arg_no]); + } + else + if (qual_opfile->present == FALSE) + { + qual_opfile->present = TRUE; + qual_opfile->value = STRDUP (qargv[arg_no]); + } + else + { + USAGE ("too many file names specified"); + } + } + } +} /* scan_cmd_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_ftime +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_ftime (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_ftime (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + struct tm *tms; + struct utimbuf utb; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_2 ("set_ftime: setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + + /*- + **------------------------------------------------------------------------ + ** OS/2 doesn't understand times before 1980.01.01-00:00:00 local time. + ** If the time is before this time, issue a warning message and rely on + ** utime() not to blow up when passed such a time. + **------------------------------------------------------------------------ + */ + tms = localtime (&(target_file->mod_time)); + if (tms->tm_year < 80) + { + WARNMSG_2 ("Cannot set file `%s' time to %s", target_file->file_spec, + vv_timestamp (target_file->mod_time)); + INFOMSG ("reason: OS/2 does not support file times before 1980."); + WARNMSG_1 ("File `%s' time set to 1980.01.01-00:00:00 GMT", + target_file->file_spec); + } + + utb.actime = target_file->mod_time; + utb.modtime = target_file->mod_time; + status = utime (target_file->file_spec, &utb); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status != 0) + { + ERRORMSG_2 ("error setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + explain_error (); + } + return; + +} /* set_ftime */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_pipe_mode +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_pipe_mode (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_pipe_mode (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int file_handle; + int status; + + file_handle = fileno (target_file->file_ptr); + switch (target_file->mode) + { + case MODE_BINARY: + status = setmode (file_handle, (int) O_BINARY); + break; + case MODE_TEXT: + status = setmode (file_handle, (int) O_TEXT); + break; + default: + INTERNAL_ERROR ("set_pipe_mode"); + } + + if (status < 0) + { + ERRORMSG_1 ("error setting mode of file `%s'", target_file->file_spec); + explain_error (); + } +} /* set_pipe_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** split_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Unsigned16 split_file_spec (CONST char *full_spec, + char *preamble, + char *name, + char *extension, + char *postamble) +#else /* NOT (ANSI_SYNTAX) */ + Unsigned16 split_file_spec (full_spec, preamble, name, + extension, postamble) + CONST char *full_spec; + char *preamble; + char *name; + char *extension; + char *postamble; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_full_spec[MAX_PATH + 1]; + char *start_ptr; + char *tmp_ptr; + int idx; + Unsigned16 path_components; + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (preamble != NULL) + { + *preamble = '\0'; + } + if (name != NULL) + { + *name = '\0'; + } + if (extension != NULL) + { + *extension = '\0'; + } + if (postamble != NULL) + { + *postamble = '\0'; + } + path_components = FS_NOTHING; + + if ((full_spec == NULL) || (*full_spec == '\0')) + { + return (path_components); + } + + strcpy (tmp_full_spec, full_spec); + start_ptr = (char *) tmp_full_spec; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRRSTR (start_ptr, ":\\"); + + if (tmp_ptr != NULL) + { + path_components |= FS_PREAMBLE; + + if (preamble != NULL) + { + for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr)); + idx++) + { + *preamble++ = *start_ptr++; + } + *preamble = '\0'; + } + start_ptr = ++tmp_ptr; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRCHR (start_ptr, '.'); + if (tmp_ptr != NULL) + { + path_components |= FS_EXTENSION; + + if (extension != NULL) + { + strncpy (extension, tmp_ptr, MAX_EXT); + } + *tmp_ptr = '\0'; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (*start_ptr != '\0') + { + path_components |= FS_NAME; + + if (name != NULL) + { + strncpy (name, start_ptr, MAX_NAME); + } + } + + return (path_components); +} /* split_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** tz_offset +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T tz_offset (TIME_T the_time) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T tz_offset (the_time) + TIME_T the_time; +#endif /* (ANSI_SYNTAX) */ +{ + struct tm *tm; + char *tz_str; + char set_tz_str[32]; + +#if (OS2_GNUC) + TIME_T timezone; + struct timeb timeb_struct; +#endif /* (OS2_GNUC) */ + +#if (OS2_CSET) + TIME_T timezone; +#endif /* (OS2_CSET) */ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tz_str = getenv ("TZ"); + + if (tz_str == NULL) + { + strcpy (set_tz_str, "TZ="); + strcat (set_tz_str, VV_TIMEZONE); + putenv (set_tz_str); + } + + +#if (OS2_GNUC) + ftime (&timeb_struct); + timezone = (TIME_T) timeb_struct.timezone * (TIME_T) 60; +#endif /* (OS2_GNUC) */ + +#if (OS2_MSC) + tzset (); +#endif /* (OS2_MSC) */ + +#if (OS2_CSET) + _tzset (); + timezone = (TIME_T) _timezone; +#endif /* (OS2_CSET) */ + + tm = localtime (&the_time); + + if (tm->tm_isdst > 0) + { + return (timezone - (TIME_T) 3600); + } + else + { + return (timezone); + } +} /* tz_offset */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** user_message +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void user_message (CONST Int16 status, + CONST char *msg_str, + File_Info *log_file) +#else /* NOT (ANSI_SYNTAX) */ + void user_message (status, msg_str, log_file) + CONST Int16 status; + CONST char *msg_str; + File_Info *log_file; +#endif /* (ANSI_SYNTAX) */ +{ + int to_stderr; + int to_logfile; + char *status_str; + + + /*- + **------------------------------------------------------------------------ + ** Check the value supplied for the message status and set the output + ** destinations accordingly. + **------------------------------------------------------------------------ + */ + to_logfile = TRUE; + to_stderr = FALSE; + + switch (status) + { + case LOG_STATUS: + case NORMAL_STATUS: + status_str = ""; + break; + case INFO_STATUS: + status_str = " -- "; + to_stderr = TRUE; + break; + case WARNING_STATUS: + status_str = "\nWARNING: "; + to_stderr = TRUE; + break; + case ERROR_STATUS: + status_str = "\nERROR: "; + to_stderr = TRUE; + break; + case FATAL_STATUS: + status_str = "\nFATAL: "; + to_stderr = TRUE; + break; + default: + INTERNAL_ERROR ("user_message"); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is NULL, just update the status and/or the message + ** show status. + **------------------------------------------------------------------------ + */ + if ((msg_str == NULL) || (*msg_str == '\0')) + { + if (status > G_status) + { + G_status = status; + } + return; + } + + /*- + **------------------------------------------------------------------------ + ** Make sure that we don't try to write to a NULL log file pointer. + **------------------------------------------------------------------------ + */ + if (log_file->file_ptr == (FILE *) NULL) + { + to_logfile = FALSE; + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file and stderr, check whether + ** the log file output is also to stderr. If it is, disable the 'stderr' + ** output. + **------------------------------------------------------------------------ + */ + if (to_logfile && to_stderr) + { + if (log_file->file_ptr == stderr) + { + to_stderr = FALSE; + } + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to stderr, output it here. + **------------------------------------------------------------------------ + */ + if (to_stderr) + { + FPRINTF (stderr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file, output it here. If + ** debugging is enabled, report also the name of the calling function. + **------------------------------------------------------------------------ + */ + if (to_logfile) + { + FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status > G_status) + { + G_status = status; + } +} /* user_message */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vv_exit +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void vv_exit (void) +#else /* NOT (ANSI_SYNTAX) */ + void vv_exit () +#endif /* (ANSI_SYNTAX) */ +{ + switch (G_status) + { + case LOG_STATUS: + case NORMAL_STATUS: + exit (0); + break; + case WARNING_STATUS: + exit (1); + break; + case ERROR_STATUS: + exit (2); + break; + case FATAL_STATUS: + default: + exit (3); + break; + } +} /* vv_exit */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_bytes (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_bytes (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + + for (idx = 0L; idx < max_bytes; idx++) + { + fputc (buffer[(SIZE_T) idx], op_file->file_ptr); + } +} /* write_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_record (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_record (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + +#if SUPPORT_VARIABLE_FMT + + /*- + **------------------------------------------------------------------------ + ** Below is debugging code for simulating record writing on OS/2. + ** This code should be removed before official issue! + **------------------------------------------------------------------------ + */ + Int32 no_bytes; + + no_bytes = max_bytes * sizeof (char); + + /*- + **------------------------------------------------------------------------ + ** Check that the buffer does not exceed the maximum allowable record + ** length. If it does, truncate the record and issue a warning. + **------------------------------------------------------------------------ + */ + if ((op_file->max_rec_len > 0) && (no_bytes > op_file->max_rec_len)) + { + ERRORMSG_2 ("output record too long (%ld bytes, max = %ld) - truncated", + no_bytes, op_file->max_rec_len); + no_bytes = op_file->max_rec_len / sizeof (char); + } + fwrite (buffer, sizeof (char), (SIZE_T) no_bytes, op_file->file_ptr); + +#else /* NOT SUPPORT_VARIABLE_FMT */ + + INTERNAL_ERROR ("write_record"); + +#endif /* SUPPORT_VARIABLE_FMT */ +} /* write_record */ diff --git a/support/vvcode/os2.mak b/support/vvcode/os2.mak new file mode 100644 index 0000000000..cc6d73716f --- /dev/null +++ b/support/vvcode/os2.mak @@ -0,0 +1,161 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "os2.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This file is part of VVcode. +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your OS/2 compiler is already supported it should not be necessary to +# modify any part of the Makefile except the local definitions below. Here +# are some examples known to work for my OS/2 C compilers. +# +# EMX/GNUC v2.1 +# +# CC = GCC +# LINK = GCC +# CCMODEL = +# CCDEFINES = -DOS2 +# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@ +# LFLAGS = -g -o $@ +# +# IBM C Set/2 v1.00 (using migration libraries) +# +# CC = ICC +# LINK = ICC +# CCMODEL = +# CCDEFINES = +# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES) +# LFLAGS = /Q+ +# +# Microsoft C v6.0 +# +# CC = CL +# LINK = CL +# CCMODEL = /AS +# CCDEFINES = +# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp +# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO +# +############################################################################## +# Start of local definitions. +############################################################################## +CC = [to be specified] +LINK = [to be specified] +CCMODEL = +CCDEFINES = [to be specified] +CFLAGS = [to be specified] +LFLAGS = [to be specified] +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = .exe +OBJ = .obj + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.obj: + $(CC) $(CFLAGS) $*.c + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) os2$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +vvcode: $(EXEFILES) + @ echo VVcode built + +clean: + - del *$(OBJ) + - del *$(EXE) + +#----------------------------------------------------------------------------- +# Dependencies for executables +#----------------------------------------------------------------------------- +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ) + $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \ + os2$(OBJ) $(LFLAGS) + +#----------------------------------------------------------------------------- +# Dependencies for object files +#----------------------------------------------------------------------------- +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +os2$(OBJ): os2.c $(HDRFILES) diff --git a/support/vvcode/random.tbl b/support/vvcode/random.tbl new file mode 100644 index 0000000000..962133ee64 --- /dev/null +++ b/support/vvcode/random.tbl @@ -0,0 +1 @@ + ~!@#$%^&*()_+`-=[]{};'\:"|,<.>/?1234567890ABCDEFGHIJKLMNOPQRST diff --git a/support/vvcode/reverse.xlt b/support/vvcode/reverse.xlt new file mode 100644 index 0000000000..74edc8d38f --- /dev/null +++ b/support/vvcode/reverse.xlt @@ -0,0 +1,29 @@ +#----------------------------------------------------------------------------- +# TEST.XLT +# ~~~~~~~~ +# Test translation table file +#----------------------------------------------------------------------------- +xlt-from ASCII +xlt-to BIT-REVERSED +xlt-substchar 042 # asterisk +# +255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 # 255 - 240 +239 238 237 236 235 234 233 232 231 230 229 228 227 226 225 224 # 239 - 224 +223 222 221 220 219 218 217 216 215 214 213 212 211 210 209 208 # 223 - 208 +207 206 205 204 203 202 201 200 199 198 197 196 195 194 193 192 # 207 - 192 +# +191 190 189 188 187 186 185 184 183 182 181 180 179 178 177 176 # 191 - 176 +175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 160 # 175 - 160 +159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 # 159 - 144 +143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 # 143 - 128 +# +# +127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 # 127 - 112 +111 110 109 108 107 106 105 104 103 102 101 100 099 098 097 096 # 111 - 96 +095 094 093 092 091 090 089 088 087 086 085 084 083 082 081 080 # 96 - 80 +079 078 077 076 075 074 073 072 071 070 069 068 067 066 065 064 # 79 - 64 +# +063 062 061 060 059 058 057 056 055 054 053 052 051 050 049 048 # 63 - 48 +047 046 045 044 043 042 041 040 039 038 037 036 035 034 033 032 # 47 - 32 +031 030 029 028 027 026 025 024 023 022 021 020 019 018 017 016 # 31 - 16 +015 014 013 012 011 010 009 008 007 006 005 004 003 002 001 000 # 15 - 0 diff --git a/support/vvcode/specific.h b/support/vvcode/specific.h new file mode 100644 index 0000000000..dc51aba6f5 --- /dev/null +++ b/support/vvcode/specific.h @@ -0,0 +1,1089 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "specific.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** apply_defaults - Apply default file name and extension to a +** full file specification if either of these +** components is missing. +** confirm_yesno - Display a message to the user and wait for a +** yes/no answer. +** examine_file - Examine a file and determine its key features, +** including mode, format, record length and +** timestamp. +** explain_error - Explain the reason for an error. +** f_open_in - Open a file for input using the appropriate +** mode, format etc for the file. +** f_open_out - Open a file for output using the appropriate +** mode, format etc for the file. +** file_exists - Determine whether a file exists. +** force_file_ext - Force the file extension of a full file +** specification to a specified value. +** is_a_file - Determine whether a file stream is connected +** to a real file rather than a character +** device, pipe etc. +** legal_filespec - Takes an arbitrary string which may a file +** specification from another operating system +** and manipulates it to produce a legal file +** specification for the current operating +** system. +** make_filespec - Construct a full file specification from +** component parts. +** prompt_for_string - Present a prompt string and accept a string +** from the user. +** read_bytes - Read bytes from a currently open file. +** read_line - Read a line from a currently open (text) file. +** read_record - Read a record from a currently open file. +** scan_cmd_line - [tbs] +** set_ftime - Set the timestamp of a file to a specified +** value. +** set_pipe_mode - Set the mode of a file stream connected to a +** pipe, character device, redirected +** stdin/stdout/stderr, in fact any non-file. +** split_file_spec - Split a full file specification into its +** component parts. +** tz_offset - Determine the offset of local time from +** Greenwich Mean Time (Coordinated Universal +** Time) at a specified date and time. +** user_message - Present a message to the user. +** vv_exit - Exit the program, returning the appropriate +** status to the operating system. +** write_bytes - Write bytes to a currently open file. +** write_record - Write a record to a currently open file. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + + +/*- +**============================================================================ +** +** FUNCTION +** +** apply_defaults +** +** DESCRIPTION +** +** Apply default file name and extension to a full file specification if +** either of these components is missing. +** +** INPUT PARAMETERS +** +** full_spec - a string buffer of size (MAX_PATH + 1) containing +** the full file specification. +** default_name - the default name component to be used if the full +** file specification does not contain a name +** component. If there is no default name component, +** set this parameter to the null character pointer +** defined by NULL. +** default_ext - the default extension component to be used if the +** full file specification does not contain an +** extension component. If there is no default +** extension component, set this parameter to the +** null character pointer defined by NULL. +** +** OUTPUT PARAMETERS +** +** full_spec - a string buffer of size (MAX_PATH + 1), which on +** return will contain the full file specification +** with default name and extension components applied +** if appropriate. +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void apply_defaults ARGS ((CONST char *default_name, + CONST char *default_ext, + char *full_spec)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** confirm_yesno +** +** DESCRIPTION +** +** Display a message to the user and wait for a yes/no answer. +** +** INPUT PARAMETERS +** +** confirm_str - a string containing the message to be displayed. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** TRUE if 'y' or 'Y' was entered, FALSE if 'n' or 'N' was entered. +** +**============================================================================ +*/ +Boolean confirm_yesno ARGS ((CONST char *confirm_str)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** examine_file +** +** DESCRIPTION +** +** Examine a file and determine its key features, including mode, format, +** record length and timestamp. The file information is passed via a +** File_Info structure. The following fields of the structure are used: +** +** INPUT PARAMETERS +** +** ex_file - the File_Info structure containing the feature +** information of the file to be examined. The +** following structure fields are used for input: +** +** .file_spec - the file specification of the file to be examined +** +** OUTPUT PARAMETERS +** +** ex_file - the File_Info structure whose elements will be +** updated to reflect the file features. The +** following structure fields are used for output: +** +** .mode - the mode of the file to be examined (binary/text). +** If the mode cannot be determined it shall be set +** to INV_MODE. +** .format - the format of the file to be examined (fixed, +** stream or variable). If the format cannot be +** determined or is not supported, it shall be set +** to INV_FMT. +** .max_rec_len - the maximum allowable record length. If the +** maximum allowable record length cannot be +** determined or is not supported, it shall be set +** to INV_RECORD_LEN. +** .lng_rec_len - the length of the longest record in the file. If +** the longest record length cannot be determined or +** is not supported, it shall be set to +** INV_RECORD_LEN. +** .mod_time - the modification time of the file in Unix format. +** If the time cannot be determined or is not +** supported, it shall be set to INV_TIMESTAMP. +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void examine_file ARGS ((File_Info *ex_info)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** explain_error +** +** DESCRIPTION +** +** Explain the reason for a detected error. +** +** INPUT PARAMETERS +** +** None +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void explain_error ARGS ((void)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_in +** +** DESCRIPTION +** +** Open a file for input using the appropriate mode, format etc for the +** file. +** +** INPUT PARAMETERS +** +** ip_file - the File_Info structure whose elements will be +** used to open the file. The following structure +** fields are used for input: +** +** .mode - the mode of the file (binary/text). +** .format - the format of the file (fixed, stream or variable). +** .max_rec_len - the maximum allowable record length. If this +** field is set to INV_RECORD_LEN, a sensible default +** shall be chosen if needed and possible. +** .lng_rec_len - the length of the longest record in the file. If +** this field is set to INV_RECORD_LEN, a sensible +** default shall be chosen if needed and possible. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** If the file was opened successfully, a (FILE *) pointer is returned, +** otherwise (FILE *) NULL in the event of failure. +** +**============================================================================ +*/ +FILE *f_open_in ARGS ((File_Info *ip_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_out +** +** DESCRIPTION +** +** Open a file for output using the appropriate mode, format etc for the +** file. +** +** INPUT PARAMETERS +** +** op_file - the File_Info structure whose elements will be +** used to open the file. The following structure +** fields are used for input: +** +** .mode - the mode of the file (binary/text). +** .format - the format of the file (fixed, stream or variable). +** .max_rec_len - the maximum allowable record length. If this +** field is set to INV_RECORD_LEN, a sensible default +** shall be chosen if needed and possible. +** .lng_rec_len - the length of the longest record in the file. If +** this field is set to INV_RECORD_LEN, a sensible +** default shall be chosen if needed and possible. +** +** overwrite_files - flag to control the overwriting of existing files. +** If TRUE, existing files will be overwritten, +** otherwise the user will be asked to confirm that +** the files should be overwritten. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** If the file was opened successfully, a (FILE *) pointer is returned, +** otherwise (FILE *) NULL in the event of failure. +** +**============================================================================ +*/ +FILE *f_open_out ARGS ((CONST Int16 overwrite_files, + File_Info *op_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** file_exists +** +** DESCRIPTION +** +** Determine whether a file exists. Access privileges (e.g. R, RW) are +** not checked. +** +** INPUT PARAMETERS +** +** file_spec - the file specification of the file to be checked. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** TRUE if the file exists, FALSE if not. +** +**============================================================================ +*/ +Boolean file_exists ARGS ((CONST char *file_spec)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** force_file_ext +** +** DESCRIPTION +** +** Force the file extension of a full file specification to a specified +** value. +** +** INPUT PARAMETERS +** +** full_spec - a string buffer of size (MAX_PATH + 1) containing +** the full file specification. +** forced_ext - the new extension component to be used in the +** full file specification. If there is no new +** extension component, set this parameter to the +** null character pointer defined by NULL. +** +** OUTPUT PARAMETERS +** +** full_spec - a string buffer of size (MAX_PATH + 1), which on +** return will contain the full file specification +** with the new extension component applied. +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void force_file_ext ARGS ((CONST char *forced_ext, + char *full_spec)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** is_a_file +** +** DESCRIPTION +** +** Determine whether an already open stream is connected to a real file +** rather than a character mode device or pipe. +** +** INPUT PARAMETERS +** +** ex_file +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** TRUE if the stream is connected to a real file, FALSE if not. +** +**============================================================================ +*/ +Boolean is_a_file ARGS ((CONST File_Info *ex_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** legal_filespec +** +** DESCRIPTION +** +** Takes an arbitrary string which may a file specification from another +** operating system and manipulates it to produce a legal file +** specification for the current operating system. The resultant file +** specification must not include any preamble or postamble components +** (i.e. name and/or extension only). +** +** The string may be truncated, characters translated, or even untouched. +** +** INPUT PARAMETERS +** +** hdrf_spec - the arbitrary string which is usually a file +** specification from another operating system. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** A pointer to the legal file specification string. The string is held +** in a static buffer and will be overwritten by successive calls to this +** function. +** +**============================================================================ +*/ +char *legal_filespec ARGS ((CONST char *hdrf_spec)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** make_file_spec +** +** DESCRIPTION +** +** Construct a full file specification from component parts. +** +** INPUT PARAMETERS +** +** preamble - the preamble component of the file specification. +** It shall not be necessary for the string to end +** in one of the characters '\' or ':'. If +** there is no name component, set this parameter to +** the null character pointer defined by NULL. +** name - the name component of the file specification. If +** there is no name component, set this parameter to +** the null character pointer defined by NULL. +** extension - the extension component of the file +** specification. It shall not be necessary for the +** string to begin with a '.'. If there is no +** extension component, set this parameter to the +** null character pointer defined by NULL. +** postamble - the postamble component of the file +** specification. MS-DOS doesn't support the +** postamble component of the VVcode file +** specification model so this parameter is ignored. +** +** OUTPUT PARAMETERS +** +** full_spec - a string buffer of size (MAX_PATH + 1), which on +** return will contain the full file specification. +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void make_file_spec ARGS ((CONST char *preamble, + CONST char *name, + CONST char *extension, + CONST char *postamble, + char *full_spec)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** prompt_for_string +** +** DESCRIPTION +** +** Display a message to the user and accept a string. +** +** INPUT PARAMETERS +** +** prompt_str - a string containing the message to be displayed. +** buf_size - the size of the buffer which will contain the +** returned string. +** +** OUTPUT PARAMETERS +** +** return_buffer - a buffer to contain the string entered by the +** user. +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void prompt_for_string ARGS ((CONST char *confirm_str, + CONST Int16 buf_size, + char *return_buffer)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_bytes +** +** DESCRIPTION +** +** Read bytes from a currently open file. This function is called to +** read stream and fixed length record format files. If the operating +** system does not support stream or fixed length record format files, +** this function will never be called, BUT IT MUST BE PRESENT to avoid +** linker errors. +** +** INPUT PARAMETERS +** +** ip_file - the File_Info structure whose elements will be +** used to read the record. The following structure +** fields are used for input: +** +** .file_ptr - the FILE structure of the stream +** +** max_bytes - the maximum number of bytes that may be read +** +** OUTPUT PARAMETERS +** +** buffer - a buffer of size 'max_bytes' or longer which on +** return will contain the bytes read from the file +** +** RETURN VALUE +** +** # - the number of bytes returned in the buffer +** (excluding the trailing '\0'). +** -1 - on EOF +** -2 - if an error was detected +** +**============================================================================ +*/ +Int32 read_bytes ARGS ((CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_line +** +** DESCRIPTION +** +** Read a line from a currently open file. This function is called to +** read text files. +** +** INPUT PARAMETERS +** +** ip_file - the File_Info structure whose elements will be +** used to read the record. The following structure +** fields are used for input: +** +** .file_ptr - the FILE structure of the stream +** +** max_bytes - the maximum number of bytes that may be read +** +** OUTPUT PARAMETERS +** +** buffer - a buffer of size 'max_bytes' or longer which on +** return will contain the line read from the file +** +** RETURN VALUE +** +** # - the number of bytes returned in the buffer +** (excluding the trailing '\0'). +** -1 - on EOF +** -2 - if an error was detected +** +**============================================================================ +*/ +Int32 read_line ARGS ((CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_record +** +** DESCRIPTION +** +** Read a record from a currently open file. This function is only +** called to read variable length format files. If the operating system +** does not support variable length format files, this function will +** never be called, BUT IT MUST BE PRESENT to avoid linker errors. +** +** INPUT PARAMETERS +** +** ip_file - the File_Info structure whose elements will be +** used to read the record. The following structure +** fields are used for input: +** +** .file_ptr - the FILE structure of the stream +** +** max_bytes - the maximum number of bytes that may be read +** +** OUTPUT PARAMETERS +** +** buffer - a buffer of size 'max_bytes' or longer which on +** return will contain the record read from the file +** +** RETURN VALUE +** +** # - the number of bytes returned in the buffer +** (including an appended '\n' characters but +** excluding the trailing '\0'). +** -1 - on EOF +** -2 - if an error was detected +** +**============================================================================ +*/ +Int32 read_record ARGS ((CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** scan_cmd_line +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** qargc - the number of command line arguments to be parsed +** (a copy of the main() argc parameter). +** qargv - an array of strings containing the command line +** arguments to be parsed (a copy of the main() argv +** parameter). +** q_intro_str - a string containing the valid single characters +** which may be used to introduce a command +** qualifier (e.g. "/-" for MS-DOS, "-" for Unix). +** q_sep_str - a string containing the valid single characters +** which may be used to separate a command qualifier +** from its value (e.g. "=:-" for MS-DOS, +** " " for Unix). +** +** OUTPUT PARAMETERS +** +** qual_array - the array of Qualifier_Struct structures which +** contain the status information for each of the +** valid command qualifiers +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void scan_cmd_line ARGS ((CONST int qargc, + CONST char *qargv[], + CONST char *q_intro_str, + CONST char *q_sep_str, + Qualifier_Struct *qual_array, + Qualifier_Struct *qual_ipfile, + Qualifier_Struct *qual_opfile)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_ftime +** +** DESCRIPTION +** +** Set the timestamp of a file to a specified value. Operating systems +** support different types of time, such as access, creation, revision or +** modification time. It is suggested that the creation and modification +** time be set to this value if possible. +** +** If the operating system does not support the setting of file +** timestamps, this should be an empty function, BUT IT MUST BE PRESENT. +** +** INPUT PARAMETERS +** +** target_file - the File_Info structure containing the feature +** information of the file whose timestamp is to be +** set. The following structure fields are used +** for input: +** +** .file_spec - the file specification of the file. +** .mod_time - the modification time of the file in Unix format. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void set_ftime ARGS ((File_Info *target_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_pipe_mode +** +** DESCRIPTION +** +** Set the mode of an already open file stream which is a +** character mode device or pipe rather than a real file. +** +** If text/binary mode has no meaning or mode setting is not supported, +** this function may be empty, BUT IT MUST BE PRESENT. +** +** INPUT PARAMETERS +** +** target_file - the File_Info structure containing the feature +** information of the file whose mode is to be +** changed. The following structure fields are used +** for input: +** +** .file_spec - the file specification of the open file. +** .file_ptr - the (FILE *) pointer to the open file +** .mode - the mode of the file to be examined (binary/text). +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void set_pipe_mode ARGS ((File_Info *target_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** split_file_spec +** +** DESCRIPTION +** +** Split a full file specification into its component parts and return +** a bit field indicating which components of the file specification +** were present. +** +** INPUT PARAMETERS +** +** full_spec - a string buffer of size (MAX_PATH + 1), which +** contains the full file specification. +** +** OUTPUT PARAMETERS +** +** preamble - a buffer of size (MAX_PREAMBLE + 1) to hold the +** preamble component of the file specification. +** The string shall end in one of the characters +** '\' or ':'. If there is no preamble component, +** this parameter shall be set to the null character +** pointer defined by NULL. +** name - a buffer of size (MAX_NAME + 1) to hold the name +** component of the file specification. If there is +** no name component, this parameter shall be set to +** the null character pointer defined by NULL. +** extension - a buffer of size (MAX_EXT + 1) to hold the +** extension component of the file specification. +** The string shall begin with '.' If there +** is no extension component, this parameter shall +** be set to the null character pointer defined by +** NULL. +** postamble - a buffer of size (MAX_POSTAMBLE + 1) to hold the +** postamble component of the file specification. +** MS-DOS doesn't support the postamble component of +** the VVcode file specification model so this +** parameter is ignored. +** +** RETURN VALUE +** +** An Int16 value indicating which components were found in the file +** specification. The value is composed of the following macros: +** +** FS_NOTHING - no components were present (i.e. an empty file +** or null specification) +** FS_PREAMBLE - a preamble component was present +** FS_NAME - a name component was present +** FS_EXTENSION - an extension component was present +** FS_POSTAMBLE - a postamble component was present +** +** If the full file specification contains more than one component, these +** values are OR'd together. +** +**============================================================================ +*/ +Unsigned16 split_file_spec ARGS ((CONST char *full_spec, + char *preamble, + char *name, + char *extension, + char *postamble)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** tz_offset +** +** DESCRIPTION +** +** Determine the offset of local time from Greenwich Mean Time +** (Coordinated Universal Time) at a specified date and time. The date +** and time is specified because the offset may vary due to different +** implementations of summer (daylight saving) time around the world. +** +** If the operating system does not support the concept of time zones, +** this function should return a zero offset. +** +** INPUT PARAMETERS +** +** the_time - the GMT time in Unix time_t format at which the +** offset is to be computed. +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** The offset of local time from GMT in seconds. Positive values denote +** times WEST of (i.e. behind) GMT, and negative values are EAST (i.e. +** ahead) of GMT. +** +**============================================================================ +*/ +TIME_T tz_offset ARGS ((TIME_T the_time)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** user_message +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +void user_message ARGS ((CONST Int16 status, + CONST char *msg_str, + File_Info *log_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vv_exit +** +** DESCRIPTION +** +** Exit the program, returning the appropriate status to the operating +** system. +** +** INPUT PARAMETERS +** +** status - the VVcode status value which will be used to +** determine the exit status passed to the operating +** system +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void vv_exit ARGS ((void)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_bytes +** +** DESCRIPTION +** +** Write bytes to a currently open file. +** +** INPUT PARAMETERS +** +** op_file - the File_Info structure whose elements will be +** used to write the record. The following structure +** fields are used for input: +** +** .file_ptr - the FILE structure of the stream +** .max_rec_len - the maximum allowable record length. +** +** buffer - a buffer of size 'rec_len' or longer which +** contains the record to be written to the file +** rec_len - the number of bytes in the record +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void write_bytes ARGS ((CONST Int32 rec_len, + CONST char *buffer, + File_Info *op_file)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_record +** +** DESCRIPTION +** +** Write a record to a currently open file. This function is only +** called to write variable length format files. If the operating +** system does not support variable length format files, this function +** will never be called, BUT IT MUST BE PRESENT to avoid linker errors. +** +** INPUT PARAMETERS +** +** op_file - the File_Info structure whose elements will be +** used to write the record. The following structure +** fields are used for input: +** +** .file_ptr - the FILE structure of the stream +** .max_rec_len - the maximum allowable record length. +** +** buffer - a buffer of size 'rec_len' or longer which +** contains the record to be written to the file +** rec_len - the number of bytes in the record +** +** OUTPUT PARAMETERS +** +** None +** +** RETURN VALUE +** +** None +** +**============================================================================ +*/ +void write_record ARGS ((CONST Int32 rec_len, + CONST char *buffer, + File_Info *op_file)); + + + diff --git a/support/vvcode/unix.c b/support/vvcode/unix.c new file mode 100644 index 0000000000..9630af200e --- /dev/null +++ b/support/vvcode/unix.c @@ -0,0 +1,1681 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "unix.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** apply_defaults - Apply default file name and extension to a +** full file specification if either of these +** components is missing. +** confirm_yesno - Display a message to the user and wait for a +** yes/no answer. +** examine_file - Examine a file and determine its key features, +** including mode, format, record length and +** timestamp. +** explain_error - Explain the reason for an error. +** f_open_in - Open a file for input using the appropriate +** mode, format etc for the file. +** f_open_out - Open a file for output using the appropriate +** mode, format etc for the file. +** file_exists - Determine whether a file exists. +** force_file_ext - Force the file extension of a full file +** specification to a specified value. +** is_a_file - Determine whether a file stream is connected +** to a real file rather than a character +** device, pipe etc. +** legal_filespec - Takes an arbitrary string which may a file +** specification from another operating system +** and manipulates it to produce a legal file +** specification for the current operating +** system. +** make_filespec - Construct a full file specification from +** component parts. +** prompt_for_string - Present a prompt string and accept a string +** from the user. +** read_bytes - Read bytes from a currently open file. +** read_line - Read a line from a currently open (text) file. +** read_record - Read a record from a currently open file. +** scan_cmd_line - [tbs] +** set_ftime - Set the timestamp of a file to a specified +** value. +** set_pipe_mode - Set the mode of a file stream connected to a +** pipe, character device, redirected +** stdin/stdout/stderr, in fact any non-file. +** split_file_spec - Split a full file specification into its +** component parts. +** tz_offset - Determine the offset of local time from +** Greenwich Mean Time (Coordinated Universal +** Time) at a specified date and time. +** user_message - Present a message to the user. +** vv_exit - Exit the program, returning the appropriate +** status to the operating system. +** write_bytes - Write bytes to a currently open file. +** write_record - Write a record to a currently open file. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + +/*- +**---------------------------------------------------------------------------- +** Include files +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" + +/*- +**---------------------------------------------------------------------------- +** Implementation (compiler) specific include files. The default +**---------------------------------------------------------------------------- +*/ +# if (UNIX_BSD) +# include <sys/timeb.h> + +# ifndef HAS_UTIME_H +# undef HAS_SYSUTIME_H +# define HAS_SYSUTIME_H 1 +# endif /* HAS_UTIME_H */ +# endif /* (UNIX_BSD) */ + +# if (UNIX_SYSV) +# ifndef HAS_SYSUTIME_H +# undef HAS_UTIME_H +# define HAS_UTIME_H 1 +# endif +# endif /* UNIX_SYSV */ + +#ifdef HAS_UTIME_H +# include <utime.h> +#endif /* HAS_UTIME_H */ + +#ifdef HAS_SYSUTIME_H +# include <sys/utime.h> +#endif /* HAS_SYSUTIME_H */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** apply_defaults +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void apply_defaults (CONST char *default_name, + CONST char *default_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void apply_defaults (default_name, default_ext, + full_spec) + CONST char *default_name; + CONST char *default_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char extension[MAX_EXT + 1]; + Unsigned16 path_parts; + char preamble[MAX_PREAMBLE + 1]; + + path_parts = split_file_spec (full_spec, preamble, name, extension, NULL); + + + if (((path_parts & FS_NAME) == 0) && (default_name != NULL)) + { + strncpy (name, default_name, MAX_NAME); + } + + if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL)) + { + strncpy (extension, default_ext, MAX_EXT); + } + + make_file_spec (preamble, name, extension, NULL, full_spec); +} /* apply_defaults */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** confirm_yesno +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean confirm_yesno (CONST char *confirm_str) +#else /* NOT (ANSI_SYNTAX) */ + Boolean confirm_yesno (confirm_str) + CONST char *confirm_str; +#endif /* (ANSI_SYNTAX) */ +{ + int answer; + + FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str); + fflush (stderr); + + do + { + answer = getchar (); + + if (answer == EOF) + { + ERRORMSG ("EOF detected on standard input"); + answer = 'N'; + } + else + { + answer = TOUPPER (answer); + } + } while (!((answer == 'N') || (answer == 'Y'))); + + return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE); +} /* confirm_yesno */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** examine_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#define EX_SAMPLE_SIZE 512 + +#if (ANSI_SYNTAX) + void examine_file (File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + void examine_file (ex_file) + File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_buffer[EX_SAMPLE_SIZE]; + int bytes_read; + int ctrl_count; + int eol_count; + int i; + struct stat stat_buffer; + + /*- + **------------------------------------------------------------------------ + ** Initialize the File_Info structure before starting work. If the input + ** file is not a real file (i.e. a device or pipe), these are the values + ** that will be returned. + **------------------------------------------------------------------------ + */ + ex_file->mode = INV_MODE; + ex_file->format = INV_FORMAT; + ex_file->max_rec_len = INV_RECORD_LEN; + ex_file->lng_rec_len = INV_RECORD_LEN; + ex_file->mod_time = INV_TIMESTAMP; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + ex_file->file_ptr = fopen (ex_file->file_spec, "r"); + + if (ex_file->file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + + /*- + **------------------------------------------------------------------------ + ** Test to see if the file is 'real'. + **------------------------------------------------------------------------ + */ + if (is_a_file (ex_file) == FALSE) + { + DEBUG_1 ("examine_file: `%s' is not a regular file", + ex_file->file_spec); + f_close (ex_file); + ex_file->pipe_flag = TRUE; + ex_file->file_ptr = (FILE *) NULL; + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE, + ex_file->file_ptr); + eol_count = 0; + ctrl_count = 0; + + for (i = 0; i < (bytes_read - 1); i++) + { + if (tmp_buffer[i + 1] == '\n') + { + ++eol_count; + } + if (tmp_buffer[i + 1] < 0x08) + { + ++ctrl_count; + } + } + f_close (ex_file); + ex_file->file_ptr = (FILE *) NULL; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((bytes_read > (80 * eol_count)) || (bytes_read < (80 * ctrl_count))) + { + ex_file->mode = MODE_BINARY; + ex_file->format = DEF_BINARY_FMT; + } + else + { + ex_file->mode = MODE_TEXT; + ex_file->format = DEF_TEXT_FMT; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + i = stat (ex_file->file_spec, &stat_buffer); + + if (i != FALSE) + { + ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + ex_file->mod_time = stat_buffer.st_mtime; + +} /* examine_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** explain_error +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void explain_error (void) +#else /* NOT (ANSI_SYNTAX) */ + void explain_error () +#endif /* (ANSI_SYNTAX) */ +{ + INFOMSG_1 ("Error number: %ld", (long) errno); +} /* explain_error */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_in +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_in (File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_in (ip_file) + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (ip_file->mode) + { + case MODE_BINARY: + case MODE_TEXT: + file_ptr = fopen (ip_file->file_spec, "rb"); + break; + default: + ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode); + return ((FILE *) NULL); + } + + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_in */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_out +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_out (CONST Int16 overwrite_files, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_out (overwrite_files, op_file) + CONST Int16 overwrite_files; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((overwrite_files != OVERWRITE_YES) + && (file_exists (op_file->file_spec))) + { + if (overwrite_files == OVERWRITE_ASK) + { + SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?", + op_file->file_spec); + + if (!confirm_yesno (G_tmp_msg)) + { + INFOMSG ("operation cancelled"); + return ((FILE *) NULL); + } + } + else + { + ERRORMSG_1 ("file `%s' exists", op_file->file_spec); + return ((FILE *) NULL); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (op_file->mode) + { + case MODE_BINARY: + case MODE_TEXT: + file_ptr = fopen (op_file->file_spec, "wb"); + break; + default: + ERRORMSG_1 ("invalid file mode specified (%d)", op_file->mode); + return ((FILE *) NULL); + } + + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_out */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** file_exists +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean file_exists (CONST char *file_spec) +#else /* NOT (ANSI_SYNTAX) */ + Boolean file_exists (file_spec) + CONST char *file_spec; +#endif /* (ANSI_SYNTAX) */ +{ + return ((Boolean) (access ((char *) file_spec, 0) == 0)); +} /* file_exists */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** force_file_ext +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void force_file_ext (CONST char *forced_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void force_file_ext (forced_ext, full_spec) + CONST char *forced_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char preamble[MAX_PREAMBLE + 1]; + + if (forced_ext == NULL) + { + return; + } + (void) split_file_spec (full_spec, preamble, name, NULL, NULL); + make_file_spec (preamble, name, forced_ext, NULL, full_spec); +} /* force_file_ext */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** is_a_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean is_a_file (CONST File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + Boolean is_a_file (ex_file) + CONST File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + int file_handle; + int status; + + file_handle = fileno (ex_file->file_ptr); + status = isatty (file_handle); + + if (status == 0) + { + return (TRUE); + } + else + { + return (FALSE); + } +} /* is_a_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** legal_filespec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *legal_filespec (CONST char *hdrf_spec) +#else /* NOT (ANSI_SYNTAX) */ + char *legal_filespec (hdrf_spec) + CONST char *hdrf_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char tmpf_name[MAX_NAME + 1]; + char tmpf_ext[MAX_EXT + 1]; + char *tmpf_spec; + char *tmp_ptr; + static char opf_spec[MAX_PATH + 1]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmpf_spec = STRDUP (hdrf_spec); + tmp_ptr = STRCHR (tmpf_spec, '.'); + + if (tmp_ptr != NULL) + { + strncpy (tmpf_ext, tmp_ptr, MAX_EXT); + tmpf_ext[MAX_EXT] = '\0'; + *tmp_ptr = '\0'; + } + else + { + strcpy (tmpf_ext, ""); + } + strncpy (tmpf_name, tmpf_spec, MAX_NAME); + tmpf_name[MAX_NAME] = '\0'; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + strcpy (opf_spec, tmpf_name); + strcat (opf_spec, tmpf_ext); + + if (strcmp (hdrf_spec, opf_spec) != 0) + { + WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'", + hdrf_spec, opf_spec); + } + return (opf_spec); +} /* legal_filespec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** make_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void make_file_spec (CONST char *preamble, + CONST char *name, + CONST char *extension, + CONST char *postamble, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void make_file_spec (preamble, name, extension, + postamble, full_spec) + CONST char *preamble; + CONST char *name; + CONST char *extension; + CONST char *postamble; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + int len; + char *tmp_ptr; + + /*- + **------------------------------------------------------------------------ + ** Start with an empty string and append components of the file + ** specification only if they exist. + **------------------------------------------------------------------------ + */ + strcpy (full_spec, ""); + + /*- + **------------------------------------------------------------------------ + ** The preamble component corresponds to the Unix network node and/or path + ** components in the form: + ** + ** node: node:dir1 node:/dir1 node:/dir1/ + ** node:/dir1/dir2 dir1 /dir1 /dir1/dir2 + ** + ** + ** If the preamble component does not end in '/' or ':', '/' is appended + ** only if the component is not empty. + **------------------------------------------------------------------------ + */ + if ((preamble != NULL) && (*preamble != '\0')) + { + strncat (full_spec, preamble, MAX_PREAMBLE); + len = strlen (preamble); + tmp_ptr = STRCHR ("/:", preamble[len - 1]); + + if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE)) + { + strcat (full_spec, "/"); + } + } + + /*- + **------------------------------------------------------------------------ + ** Simply append the name if it is present. + **------------------------------------------------------------------------ + */ + if (name != NULL) + { + strncat (full_spec, name, MAX_NAME); + } + + /*- + **------------------------------------------------------------------------ + ** If the extension component does not begin with '.', prepend '.' before + ** appending the extension to the file specification. + **------------------------------------------------------------------------ + */ + if ((extension != NULL) && (*extension != '\0')) + { + if (*extension != '.') + { + strcat (full_spec, "."); + strncat (full_spec, extension, MAX_EXT - 1); + } + else + { + strncat (full_spec, extension, MAX_EXT); + } + } +} /* make_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** prompt_for_string +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void prompt_for_string (CONST char *confirm_str, + CONST Int16 buf_size, + char *return_buffer) +#else /* NOT (ANSI_SYNTAX) */ + void prompt_for_string (confirm_str, buf_size, + return_buffer) + CONST char *confirm_str; + CONST Int16 buf_size; + char *return_buffer; +#endif /* (ANSI_SYNTAX) */ +{ + char *status; + + FPRINTF (stderr, "\n%s", confirm_str); + fflush (stderr); + status = fgets (return_buffer, (int) buf_size, stdin); + + if (status == NULL) + { + FATALMSG ("error reading string from stdin"); + explain_error (); + vv_exit (); + } + + status = STRCHR (return_buffer, '\n'); + if (status != NULL) + { + *status = '\0'; + } +} /* prompt_for_string */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_bytes (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_bytes (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + int temp; + + for (idx = 0L; idx < max_bytes; idx++) + { + temp = fgetc (ip_file->file_ptr); + + if (temp == EOF) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (idx == 0) + { + return (-1L); + } + break; + } + buffer[(SIZE_T) idx] = (char) temp; + } + return (idx); +} /* read_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_line (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_line (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *tmp_ptr; + + tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr); + buffer[(SIZE_T) (max_bytes - 1)] = '\0'; + + if (tmp_ptr == NULL) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (feof (ip_file->file_ptr)) + { + return (-1L); + } + } + return ((Int32) strlen (buffer)); +} /* read_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_record (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_record (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + INTERNAL_ERROR ("read_record"); + return (-2L); +} /* read_record */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** scan_cmd_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void scan_cmd_line (CONST int qargc, + CONST char *qargv[], + CONST char *q_intro_str, + CONST char *q_sep_str, + Qualifier_Struct *qual_array, + Qualifier_Struct *qual_ipfile, + Qualifier_Struct *qual_opfile) +#else /* NOT (ANSI_SYNTAX) */ + void scan_cmd_line (qargc, qargv, q_intro_str, + q_sep_str, qual_array, qual_ipfile, + qual_opfile) + CONST int qargc; + CONST char *qargv[]; + CONST char *q_intro_str; + CONST char *q_sep_str; + Qualifier_Struct *qual_array; + Qualifier_Struct *qual_ipfile; + Qualifier_Struct *qual_opfile; +#endif /* (ANSI_SYNTAX) */ +{ + char *arg; + int arg_no; + int len; + int qual_found; + int q_no; + char *qsep_ptr; + char *qvalue_ptr; + char *tmp_qstr_ptr; + + + /*- + **------------------------------------------------------------------------ + ** Loop through each of the user supplied command line arguments. + **------------------------------------------------------------------------ + */ + tmp_qstr_ptr = NULL; + + for (arg_no = 1; arg_no < qargc; arg_no++) + { + arg = (char *) qargv[arg_no]; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (qual_array[CMDQ_DEBUG].present == TRUE) + { + G_debugging = TRUE; + } + DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg); + + /*- + **-------------------------------------------------------------------- + ** If the first character of the argument is one of the allowable + ** 'q_intro_str' characters then parse it as a qualifier, unless + ** the argument is the 'STDIO_SYMBOL' string when it is interpreted as + ** the standard input or output file. + **-------------------------------------------------------------------- + */ + if (((STRCHR (q_intro_str, *arg) != NULL) + && STRCMP (arg, STDIO_SYMBOL) != 0)) + { + + /*- + **---------------------------------------------------------------- + ** Extract the component of the qualifier string after the + ** 'q_intro_str' character before the 'q_sep_str' character + ** if it is present. + **---------------------------------------------------------------- + */ + if (tmp_qstr_ptr != NULL) + { + free (tmp_qstr_ptr); + } + tmp_qstr_ptr = STRDUP (arg + 1); + qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str); + qvalue_ptr = NULL; + + if (qsep_ptr != NULL) + { + *qsep_ptr = '\0'; + qvalue_ptr = qsep_ptr + 1; + } + + /*- + **---------------------------------------------------------------- + ** Search the command qualifier structure array for this + ** qualifier string. + **---------------------------------------------------------------- + */ + len = strlen (tmp_qstr_ptr); + qual_found = -1; + + for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++) + { + if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, (Int16) len) == 0) + { + + /*- + **-------------------------------------------------------- + ** + **-------------------------------------------------------- + */ + if (qual_found < 0) + { + qual_found = q_no; + DEBUG_1 ("scan_cmd_line: matches qualifier: `%s'", + qual_array[q_no].q_string); + } + else + { + USAGE_1 ("ambiguous qualifier `%s'", qargv[arg_no]); + } + } + } + + /*- + **---------------------------------------------------------------- + ** If the qualifier string is unknown, return that status. + **---------------------------------------------------------------- + */ + if (qual_found < 0) + { + USAGE_1 ("unknown qualifier `%s'", qargv[arg_no]); + } + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + if (qsep_ptr == NULL) + { + if (qual_array[qual_found].val_needed == VALUE_NEEDED) + { + if ((arg_no + 1) < qargc) + { + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = STRDUP (qargv[++arg_no]); + DEBUG_1 ("scan_cmd_line: qualifier value: `%s'", + qual_array[qual_found].value); + } + else + { + USAGE_2 ("qualifier `%.1s%s' must take a value", + QUAL_INTRO, qual_array[qual_found].q_string); + } + } + else + { + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = NULL; + } + } + else + { + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + if (*qvalue_ptr == '\0') + { + USAGE_1 ("value missing after qualifier `%s'", + qargv[arg_no]); + } + else if (qual_array[qual_found].val_needed == VALUE_NONE) + { + USAGE_2 ("qualifier `%.1s%s' does not take a value", + QUAL_INTRO, qual_array[qual_found].q_string); + } + else + { + qual_array[qual_found].value = STRDUP (qvalue_ptr); + qual_array[qual_found].present = TRUE; + DEBUG_1 ("scan_cmd_line: qualifier value: `%s'", + qual_array[qual_found].value); + } + } + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + else + { + if (qual_ipfile->present == FALSE) + { + qual_ipfile->present = TRUE; + qual_ipfile->value = STRDUP (qargv[arg_no]); + } + else if (qual_opfile->present == FALSE) + { + qual_opfile->present = TRUE; + qual_opfile->value = STRDUP (qargv[arg_no]); + } + else + { + USAGE ("too many file names specified"); + } + } + } +} /* scan_cmd_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_ftime +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_ftime (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_ftime (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + +#if (UNIX_BSD) + TIME_T timep[2]; +#endif /* (UNIX_BSD) */ + +#if (UNIX_SYSV) + struct utimbuf utb; +#endif /* (UNIX_SYSV) */ + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_2 ("set_ftime: setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ +#if (UNIX_SYSV) + utb.actime = target_file->mod_time; + utb.modtime = target_file->mod_time; + status = utime ((char *) target_file->file_spec, &utb); +#endif /* (UNIX_SYSV) */ + +#if (UNIX_BSD) + timep[0] = target_file->mod_time; + timep[1] = target_file->mod_time; + status = utime ((char *) target_file->file_spec, timep); +#endif /* (UNIX_BSD) */ + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status != 0) + { + ERRORMSG_2 ("error setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + explain_error (); + } + return; + +} /* set_ftime */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_pipe_mode +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_pipe_mode (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_pipe_mode (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + return; +} /* set_pipe_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** split_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Unsigned16 split_file_spec (CONST char *full_spec, + char *preamble, + char *name, + char *extension, + char *postamble) +#else /* NOT (ANSI_SYNTAX) */ + Unsigned16 split_file_spec (full_spec, preamble, name, + extension, postamble) + CONST char *full_spec; + char *preamble; + char *name; + char *extension; + char *postamble; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_full_spec[MAX_PATH + 1]; + char *start_ptr; + char *tmp_ptr; + int idx; + Unsigned16 path_components; + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (preamble != NULL) + { + *preamble = '\0'; + } + if (name != NULL) + { + *name = '\0'; + } + if (extension != NULL) + { + *extension = '\0'; + } + if (postamble != NULL) + { + *postamble = '\0'; + } + path_components = FS_NOTHING; + + if ((full_spec == NULL) || (*full_spec == '\0')) + { + return (path_components); + } + + strcpy (tmp_full_spec, full_spec); + start_ptr = (char *) tmp_full_spec; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRRSTR (start_ptr, ":/"); + + if (tmp_ptr != NULL) + { + path_components |= FS_PREAMBLE; + + if (preamble != NULL) + { + for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr)); + idx++) + { + *preamble++ = *start_ptr++; + } + *preamble = '\0'; + } + start_ptr = ++tmp_ptr; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRCHR (start_ptr, '.'); + + if (tmp_ptr != NULL) + { + path_components |= FS_EXTENSION; + + if (extension != NULL) + { + strncpy (extension, tmp_ptr, MAX_EXT); + } + *tmp_ptr = '\0'; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (*start_ptr != '\0') + { + path_components |= FS_NAME; + + if (name != NULL) + { + strncpy (name, start_ptr, MAX_NAME); + } + } + + return (path_components); +} /* split_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** tz_offset +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T tz_offset (TIME_T the_time) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T tz_offset (the_time) + TIME_T the_time; +#endif /* (ANSI_SYNTAX) */ +{ + struct tm *tm; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ +#if (UNIX_BSD) + TIME_T timezone; + struct timeb timeb_struct; + + ftime (&timeb_struct); + timezone = (TIME_T) timeb_struct.timezone * (TIME_T) 60; +#endif /* (UNIX_BSD) */ + + tm = localtime (&the_time); + + if (tm->tm_isdst > 0) + { + return (timezone - (TIME_T) 3600); + } + else + { + return (timezone); + } +} /* tz_offset */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** user_message +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void user_message (CONST Int16 status, + CONST char *msg_str, + File_Info *log_file) +#else /* NOT (ANSI_SYNTAX) */ + void user_message (status, msg_str, log_file) + CONST Int16 status; + CONST char *msg_str; + File_Info *log_file; +#endif /* (ANSI_SYNTAX) */ +{ + int to_stderr; + int to_logfile; + char *status_str; + + + /*- + **------------------------------------------------------------------------ + ** Check the value supplied for the message status and set the output + ** destinations accordingly. + **------------------------------------------------------------------------ + */ + to_logfile = TRUE; + to_stderr = FALSE; + + switch (status) + { + case NORMAL_STATUS: + case LOG_STATUS: + status_str = ""; + break; + case INFO_STATUS: + status_str = " -- "; + to_stderr = TRUE; + break; + case WARNING_STATUS: + status_str = "\nWARNING: "; + to_stderr = TRUE; + break; + case ERROR_STATUS: + status_str = "\nERROR: "; + to_stderr = TRUE; + break; + case FATAL_STATUS: + status_str = "\nFATAL: "; + to_stderr = TRUE; + break; + default: + INTERNAL_ERROR ("user_message"); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is NULL, just update the status and/or the message + ** show status. + **------------------------------------------------------------------------ + */ + if ((msg_str == NULL) || (*msg_str == '\0')) + { + if (status > G_status) + { + G_status = status; + } + return; + } + + /*- + **------------------------------------------------------------------------ + ** Make sure that we don't try to write to a NULL log file pointer. + **------------------------------------------------------------------------ + */ + if (log_file->file_ptr == (FILE *) NULL) + { + to_logfile = FALSE; + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file and stderr, check whether + ** the log file output is also to stderr. If it is, disable the 'stderr' + ** output. + **------------------------------------------------------------------------ + */ + if (to_logfile && to_stderr) + { + if (log_file->file_ptr == stderr) + { + to_stderr = FALSE; + } + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to stderr, output it here. + **------------------------------------------------------------------------ + */ + if (to_stderr) + { + FPRINTF (stderr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file, output it here. If + ** debugging is enabled, report also the name of the calling function. + **------------------------------------------------------------------------ + */ + if (to_logfile) + { + FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status > G_status) + { + G_status = status; + } + +} /* user_message */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vv_exit +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void vv_exit (void) +#else /* NOT (ANSI_SYNTAX) */ + void vv_exit () +#endif /* (ANSI_SYNTAX) */ +{ + switch (G_status) + { + case LOG_STATUS: + case NORMAL_STATUS: + exit (0); + break; + case WARNING_STATUS: + exit (1); + break; + case ERROR_STATUS: + exit (2); + break; + case FATAL_STATUS: + default: + exit (3); + break; + } +} /* vv_exit */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_bytes (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_bytes (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + + for (idx = 0L; idx < max_bytes; idx++) + { + fputc (buffer[(SIZE_T) idx], op_file->file_ptr); + } +} /* write_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_record (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_record (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + INTERNAL_ERROR ("write_record"); +} /* write_record */ diff --git a/support/vvcode/unix.mak b/support/vvcode/unix.mak new file mode 100644 index 0000000000..bb28dcd135 --- /dev/null +++ b/support/vvcode/unix.mak @@ -0,0 +1,353 @@ +############################################################################## +############################################################################## +## +## ARCHIVE HEADER INFORMATION +## +## @Make-file{ +## FILENAME = "unix.mak", +## VERSION = "1.00", +## DATE = "", +## TIME = "", +## +## AUTHOR = "Niel Kempson", +## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +## TELEPHONE = "+44-242 579105", +## EMAIL = "kempson@tex.ac.uk (Internet)", +## +## SUPPORTED = "yes", +## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +## KEYWORDS = "VVcode, Unix", +## +## CODETABLE = "ISO/ASCII", +## CHECKSUM = "51492 1481 5732 57976", +## +## DOCSTRING = { This is the VVCODE makefile for different versions +## of UNIX. Below is a list of the environments on +## which VVCODE has been tested and found to work. Each +## entry is preceded by a status character: +## +## + tested and believed to work +## - tested but not all features available +## (e.g. file timestamping) +## ? not tested but should work +## X believed not to work. +## +## If you port VVCODE to a new environment or find that +## it works unchanged, please report back to the author +## so that this file can be updated for everyone else. +## +## + Data General Aviion, GNU cc: +## "make sysv-gcc" +## + DEC MIPS, Ultrix 4.2, native cc: +## "make bsd43" +## + HP 730, SysV, native cc: +## "make sysv" +## + HP 9000/827, SysV, native cc: +## "make sysv" +## + IBM RS6000, AIX 3.2, native cc: +## "make aix32" +## + SCO Unix V.3.2, MSC compiler: +## "make scosysv" +## + Sequent Symmetry, Dynix v3.1.2, native cc: +## "make sequent" +## + SUN, SunOS 3.x & 4.1.x, native cc: +## "make sunos" +## + SUN, SunOS 3.x & 4.1.x, GNU cc: +## "make sunos-gcc" +## } +## } +## +## MODULE CONTENTS +## +## [tbs] +## +## COPYRIGHT +## +## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +## +## This program is free software; you can redistribute it and/or +## modify it under the terms of the GNU General Public License as +## published by the Free Software Foundation; either version 1, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## In other words, you are welcome to use, share and improve this +## program. You are forbidden to forbid anyone else to use, share +## and improve what you give them. Help stamp out software-hoarding! +## +## CHANGE LOG +## +############################################################################## +############################################################################## + + +############################################################################## +# +# Local definitions for file types and compilation / linking. +# +# If your system is already supported it should not be necessary to modify +# any part of the Makefile except the local definitions below. +# +# COMPILER/LINKER +# +# CC the command used to invoke the C compiler +# CFLAGS compiler command line flags to be used +# CCDEFINES symbols to be #defined when compiling +# +# LD the command used to invoke the linker +# LDFLAGS linker command line flags to be used +# LDLIBS linker command line option to search the specified +# library files +# +# MAKE the command used to invoke Make to process this file. +# As distributed, it is defined as "make -f unix.mak" +# +# The definitions are used to compile and link as shown below: +# +# Compiling C programs (e.g. xx.c) +# +# $(CC) -c $(CFLAGS) $(CCDEFINES) xx.c +# +# Linking object files (e.g. xx.o, yy.o & zz.o) +# +# $(LD) -o $@ $(LDFLAGS) xx.o yy.o zz.o $(LDLIBS) +# +# The 'vanilla' settings should usually be: +# +# CC = cc +# CFLAGS = -g +# LD = cc +# LDFLAGS = -g +# +# For GNU C, the following settings are recommended: +# +# CC = gcc +# CFLAGS = -g -Wall -Wmissing-prototypes -Wconversion +# LD = gcc +# LDFLAGS = -g +# +############################################################################## +# Start of local definitions. +# +# NOTE: do not define CCDEFINES or LDLIBS below - they +# will be set by the system-specific target selected. +############################################################################## +CC = cc +CFLAGS = -g +LD = cc +LDFLAGS = -g +MAKE = make -f unix.mak +############################################################################## +# End of local definitions. +############################################################################## + + +############################################################################## +# File types and default rule for compilation +############################################################################## +EXE = +OBJ = .o + +.SUFFIXES: .c .h $(OBJ) $(EXE) + +.c.o: + $(CC) -c $(CFLAGS) $(CCDEFINES) $*.c + + +############################################################################## +# Target Groupings +############################################################################## +HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h + +OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) unix$(OBJ) + +EXEFILES = vvencode$(EXE) vvdecode$(EXE) + +############################################################################## +# Top level targets +############################################################################## +make: + @ echo 'You must specify the system for which VVCODE should be made.' + @ echo '' + @ echo 'For example: $(MAKE) bsd42' + @ echo '' + @ echo 'Valid system targets are:' + @ echo '' + @ echo ' clean, veryclean' + @ echo ' aix32, bsd41, bsd42, bsd43' + @ echo ' sequent, scosysv, sunos, sunos-gcc, sysv' + +vvcode: $(EXEFILES) + +clean: + @ echo 'Cleaning up ... ' + -rm -f $(OBJFILES) + +veryclean: + @ echo 'Cleaning up ... ' + -rm -f $(OBJFILES) + -rm -f $(EXEFILES) + + +############################################################################## +# Dependencies for executables +############################################################################## +vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) unix$(OBJ) + $(LD) -o $@ $(LDFLAGS) vvencode$(OBJ) vvutils$(OBJ) unix$(OBJ) \ + $(LDLIBS) + +vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) unix$(OBJ) + $(LD) -o $@ $(LDFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \ + vvutils$(OBJ) unix$(OBJ) $(LDLIBS) + +############################################################################## +# Dependencies for object files +############################################################################## +vvencode$(OBJ): vvencode.c $(HDRFILES) + +vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h + +vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h + +vvutils$(OBJ): vvutils.c $(HDRFILES) + +unix$(OBJ): unix.c $(HDRFILES) + + +############################################################################## +############################################################################## +## +## ENVIRONMENT SPECIFIC TARGETS +## +## The following symbols may be defined using "-D" to affect the +## compilation: +## +## BSD41 - BSD 4.1 target +## BSD42 - BSD 4.2 target +## BSD43 - BSD 4.3 target +## MSC - A Microsoft C compiler is being used +## SYSV - System V target +## HAS_STRINGS_H - The header file for string functions is +## <strings.h> rather than <string.h> +## HAS_SYSUTIME_H - The function utime() is defined in +## <sys/utime.h>. This is the default +## assumption for BSD targets. +## HAS_UTIME_H - The function utime() is defined in +## <utime.h>. This is the default assumption +## for SYSV targets. +############################################################################## +############################################################################## + + +############################################################################## +# IBM RS6000, AIX 3.2 BSD environment +# +# Normal BSD, as long as the BSD support library is linked in. +############################################################################## +aix32: + @ echo 'Making VVcode for IBM AIX 3.2 ... ' + $(MAKE) vvcode CCDEFINES=-DBSD42 \ + LDLIBS=-lbsd + + +############################################################################## +# BSD 4.1 environment +# +############################################################################## +bsd41: + @ echo 'Making VVcode for BSD 4.1 Unix ... ' + $(MAKE) vvcode CCDEFINES=-DBSD41 + + +############################################################################## +# BSD 4.2 environment +# +############################################################################## +bsd42: + @ echo 'Making VVcode for BSD 4.2 Unix ... ' + $(MAKE) vvcode CCDEFINES=-DBSD42 + + +############################################################################## +# BSD 4.3 environment +# +############################################################################## +bsd43: + @ echo 'Making VVcode for BSD 4.3 Unix ... ' + $(MAKE) vvcode CCDEFINES=-DBSD43 + + +############################################################################## +# Sequent Symmetry Dynix V3.1 BSD environment +# +# Normal BSD, except that it has <strings.h> rather than the usual +# <string.h> +############################################################################## +sequent: + @ echo 'Making VVcode for Sequent Symmetry DYNIX ... ' + $(MAKE) vvcode CCDEFINES="-DSTRINGS_H -DBSD42" + + +############################################################################## +# SCO Unix v3.2.2 System V.3.2 environment, Microsoft C compiler +# +# Fairly normal SYSV, except for the non Unix-like compiler syntax. +############################################################################## +scosysv: + @ echo 'Making VVcode for SCO System V Unix ... ' + $(MAKE) vvcode CCDEFINES="-DSYSV -DMSC" \ + CFLAGS="-M3 -Od -Zd -Zi -W3" \ + LDFLAGS="-M3 -Od -Zd" + + +############################################################################## +# SunOS 4.1.x Unix BSD environment, native compiler +# +# Normal BSD, except that it has <utime.h> rather than the usual +# <sys/utime.h> +############################################################################## +sunos: + @ echo 'Making VVcode for SunOS BSD Unix ... ' + $(MAKE) vvcode CCDEFINES="-DHAS_UTIME_H -DBSD42" + + +############################################################################## +# SunOS 4.1.x Unix BSD environment, GNU C compiler +# +# Normal BSD, except that it has <utime.h> rather than the usual +# <sys/utime.h> +############################################################################## +sunos-gcc: + @ echo 'Making VVcode for SunOS BSD Unix using GNU C ... ' + $(MAKE) vvcode CCDEFINES="-DHAS_UTIME_H -DBSD42" \ + CC=gcc \ + LD=gcc + + +############################################################################## +# System V environment +# +############################################################################## +sysv: + @ echo 'Making VVcode for System V Unix ... ' + $(MAKE) vvcode CCDEFINES=-DSYSV + + +############################################################################## +# System V environment, GNU C compiler +# +############################################################################## +sysv-gcc: + @ echo 'Making VVcode for System V Unix using GNU C ... ' + $(MAKE) vvcode CCDEFINES="-DHAS_UTIME_H -DSYSV" \ + CC=gcc \ + LD=gcc diff --git a/support/vvcode/uucode.tbl b/support/vvcode/uucode.tbl new file mode 100644 index 0000000000..6a64779e2b --- /dev/null +++ b/support/vvcode/uucode.tbl @@ -0,0 +1,5 @@ + !"#$%&'()*+,-./ +0123456789 +:;<=>?@ +ABCDEFGHIJKLMNOPQRSTUVWXYZ +[\]^_ diff --git a/support/vvcode/vaxvms.c b/support/vvcode/vaxvms.c new file mode 100644 index 0000000000..d987ab60eb --- /dev/null +++ b/support/vvcode/vaxvms.c @@ -0,0 +1,2655 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vaxvms.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** apply_defaults - Apply default file name and extension to a +** full file specification if either of these +** components is missing. +** confirm_yesno - Display a message to the user and wait for a +** yes/no answer. +** examine_file - Examine a file and determine its key features, +** including mode, format, record length and +** timestamp. +** explain_error - Explain the reason for an error. +** f_open_in - Open a file for input using the appropriate +** mode, format etc for the file. +** f_open_out - Open a file for output using the appropriate +** mode, format etc for the file. +** file_exists - Determine whether a file exists. +** force_file_ext - Force the file extension of a full file +** specification to a specified value. +** is_a_file - Determine whether a file stream is connected +** to a real file rather than a character +** device, pipe etc. +** legal_filespec - Takes an arbitrary string which may a file +** specification from another operating system +** and manipulates it to produce a legal file +** specification for the current operating +** system. +** make_filespec - Construct a full file specification from +** component parts. +** prompt_for_string - Present a prompt string and accept a string +** from the user. +** read_bytes - Read bytes from a currently open file. +** read_line - Read a line from a currently open (text) file. +** read_record - Read a record from a currently open file. +** scan_cmd_line - [tbs] +** set_ftime - Set the timestamp of a file to a specified +** value. +** set_pipe_mode - Set the mode of a file stream connected to a +** pipe, character device, redirected +** stdin/stdout/stderr, in fact any non-file. +** split_file_spec - Split a full file specification into its +** component parts. +** tz_offset - Determine the offset of local time from +** Greenwich Mean Time (Coordinated Universal +** Time) at a specified date and time. +** user_message - Present a message to the user. +** vv_exit - Exit the program, returning the appropriate +** status to the operating system. +** write_bytes - Write bytes to a currently open file. +** write_record - Write a record to a currently open file. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + + + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + + +/*- +**---------------------------------------------------------------------------- +** Include files +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" + + +/*- +**---------------------------------------------------------------------------- +** VAX/VMS specific include files +**---------------------------------------------------------------------------- +*/ +#include <atrdef.h> +#include <climsgdef.h> +#include <descrip.h> +#include <fab.h> +#include <fibdef.h> +#include <iodef.h> +#include <nam.h> +#include <ssdef.h> + +/*- +**---------------------------------------------------------------------------- +** VAX/VMS specific data types +**---------------------------------------------------------------------------- +*/ +struct utimbuf +{ + TIME_T actime; + TIME_T modtime; +}; + +struct acb_struct +{ + unsigned short w_size; + unsigned short w_type; + void *l_addr; +}; + +typedef struct dsc$descriptor_s String_Desc; + +static char *month_list[] = {"???", "JAN", "FEB", "MAR", "APR", + "MAY", "JUN", "JUL", "AUG", "SEP", + "OCT", "NOV", "DEC", NULL}; + +#define DUMMY_VMS_TIMESTAMP "15-FEB-1991 16:22:12.47" +#define VMS_TIMESTAMP_FORMAT "%02d-%3s-%04d %02d:%02d:%02d.%02d" + +/*- +**---------------------------------------------------------------------------- +** VAX/VMS specific functions +**---------------------------------------------------------------------------- +*/ +Int32 CLI$PRESENT ARGS ((String_Desc * qualifier)); +Int32 CLI$GET_VALUE ARGS ((String_Desc * qualifier, + String_Desc * result, + short *length)); +static void parse_qualifier ARGS ((Qualifier_Struct *qual_struct)); +static void FABFIBNAM_setup ARGS ((CONST char *file_spec, + CONST char *def_file_spec, + unsigned short *chan_ptr, + struct FAB *fab_ptr, + struct fibdef *fib_ptr, + struct NAM *nam_ptr, + char *esa, + char *rsa)); +char *vms_to_vv_timestamp ARGS ((CONST char *vms_time_str)); +char *vv_to_vms_timestamp ARGS ((CONST char *vv_time_str)); +static Int32 vax_utime ARGS ((CONST char *file_spec, + CONST struct utimbuf * utime_struct)); +Unsigned32 *unix_to_vms_time ARGS ((CONST TIME_T unix_time)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** apply_defaults +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void apply_defaults (CONST char *default_name, + CONST char *default_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void apply_defaults (default_name, default_ext, + full_spec) + CONST char *default_name; + CONST char *default_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char extension[MAX_EXT + 1]; + Unsigned16 path_parts; + char preamble[MAX_PREAMBLE + 1]; + + path_parts = split_file_spec (full_spec, preamble, name, extension, NULL); + + + if (((path_parts & FS_NAME) == 0) && (default_name != NULL)) + { + strncpy (name, default_name, MAX_NAME); + } + + if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL)) + { + strncpy (extension, default_ext, MAX_EXT); + } + + make_file_spec (preamble, name, extension, NULL, full_spec); +} /* apply_defaults */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** confirm_yesno +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean confirm_yesno (CONST char *confirm_str) +#else /* NOT (ANSI_SYNTAX) */ + Boolean confirm_yesno (confirm_str) + CONST char *confirm_str; +#endif /* (ANSI_SYNTAX) */ +{ + int answer; + + FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str); + fflush (stderr); + + do + { + answer = getchar (); + + if (answer == EOF) + { + ERRORMSG ("EOF detected on standard input"); + answer = 'N'; + } + else + { + answer = TOUPPER (answer); + } + } while (!((answer == 'N') || (answer == 'Y'))); + + return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE); +} /* confirm_yesno */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** examine_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#define EX_SAMPLE_SIZE 512 + +#if (ANSI_SYNTAX) + void examine_file (File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + void examine_file (ex_file) + File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_buffer[EX_SAMPLE_SIZE]; + int bytes_read; + int eol_count; + int i; + struct stat stat_buffer; + int status; + + /*- + **------------------------------------------------------------------------ + ** Initialize the File_Info structure before starting work. If the input + ** file is not a real file (i.e. a device or pipe), these are the values + ** that will be returned. + **------------------------------------------------------------------------ + */ + ex_file->mode = INV_MODE; + ex_file->format = INV_FORMAT; + ex_file->max_rec_len = INV_RECORD_LEN; + ex_file->lng_rec_len = INV_RECORD_LEN; + ex_file->mod_time = INV_TIMESTAMP; + +/*- +**---------------------------------------------------------------------------- +** VMS RECORD FORMATS +** ~~~~~~~~~~~~~~~~~~ +** RFM_UDF undefined (also stream binary) +** S RFM_FIX fixed length records +** S RFM_VAR variable length records +** RFM_VFC variable fixed control +** RFM_STM RMS-11 stream (valid only for sequential organization) +** S RFM_STMLF LF stream (valid only for sequential organization) +** RFM_STMCR CR stream (valid only for sequential organization) +** +** VMS RECORD ATTRIBUTES +** ~~~~~~~~~~~~~~~~~~~~~ +** S RAT_FTN FORTRAN or none +** S RAT_CR CR +** RAT_PRN print +** RAT_BLK block +**---------------------------------------------------------------------------- +*/ +#define RFM_UDF 0 +#define RFM_FIX 1 +#define RFM_VAR 2 +#define RFM_VFC 3 +#define RFM_STM 4 +#define RFM_STMLF 5 +#define RFM_STMCR 6 + +#define RAT_FTN 0 +#define RAT_CR 1 +#define RAT_PRN 2 +#define RAT_BLK 3 + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + ex_file->file_ptr = fopen (ex_file->file_spec, "rb"); + + if (ex_file->file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + + /*- + **------------------------------------------------------------------------ + ** Test to see if the file is 'real'. + **------------------------------------------------------------------------ + */ + if (is_a_file (ex_file) == FALSE) + { + DEBUG_1 ("examine_file: `%s' is not a regular file", + ex_file->file_spec); + f_close (ex_file); + ex_file->pipe_flag = TRUE; + ex_file->file_ptr = (FILE *) NULL; + return; + } + f_close (ex_file); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + status = stat (ex_file->file_spec, &stat_buffer); + + if (status != 0) + { + ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + ex_file->mod_time = stat_buffer.st_ctime; + + /*- + **------------------------------------------------------------------------ + ** Use the record attributes to determine whether the file is binary or + ** text. + **------------------------------------------------------------------------ + */ + switch (stat_buffer.st_fab_rat) + { + case RAT_CR: + case RAT_PRN: + ex_file->mode = MODE_TEXT; + break; + case RAT_FTN: + case RAT_BLK: + ex_file->mode = MODE_BINARY; + break; + default: + WARNMSG_2 ("file `%s' has an unsupported record attribute: %X", + ex_file->file_spec, (int) stat_buffer.st_fab_rfm); + break; + } + + /*- + **------------------------------------------------------------------------ + ** Use the record format to determine the file format. We support fixed, + ** variable and stream_lf files. + **------------------------------------------------------------------------ + */ + switch (stat_buffer.st_fab_rfm) + { + case RFM_FIX: + ex_file->format = FMT_FIXED; + break; + case RFM_VAR: + case RFM_VFC: + ex_file->format = FMT_VARIABLE; + break; + case RFM_STM: + case RFM_STMLF: + case RFM_STMCR: + ex_file->format = FMT_STREAM; + break; + case RFM_UDF: + default: + WARNMSG_2 ("file `%s' has an unsupported record format: %X", + ex_file->file_spec, (int) stat_buffer.st_fab_rfm); + break; + } + + /*- + **------------------------------------------------------------------------ + ** If the file is fixed or variable format, determine the record length. + **------------------------------------------------------------------------ + */ + if ((ex_file->format == FMT_FIXED) + || (ex_file->format == FMT_VARIABLE)) + { + ex_file->max_rec_len = stat_buffer.st_fab_mrs; + } + + return; +} /* examine_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** explain_error +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void explain_error (void) +#else /* NOT (ANSI_SYNTAX) */ + void explain_error () +#endif /* (ANSI_SYNTAX) */ +{ + INFOMSG_1 ("reason for error: %s", strerror (errno)); +} /* _error */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_in +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_in (File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_in (ip_file) + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + char mrs_str[16]; /* "mrs = XXXXXX" */ + char bls_str[16]; /* "bls = XXXXXX" */ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (ip_file->mode) + { + case MODE_BINARY: + case MODE_TEXT: + break; + default: + ERRORMSG_1 ("invalid I/P file mode specified: %X", ip_file->mode); + return ((FILE *) NULL); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (ip_file->format) + { + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case FMT_FIXED: + + if (ip_file->max_rec_len == INV_RECORD_LEN) + { + ip_file->max_rec_len = DEF_FIXED_RECORD_LEN; + } + + if ((ip_file->max_rec_len < MIN_FIXED_RECORD_LEN) + || (ip_file->max_rec_len > MAX_FIXED_RECORD_LEN)) + { + ERRORMSG_2 ("I/P file `%s' has invalid max fixed record \ +length specified: %ld", + ip_file->file_spec, ip_file->max_rec_len); + return ((FILE *) NULL); + } + SPRINTF (mrs_str, "mrs = %8ld", ip_file->max_rec_len); + SPRINTF (bls_str, "bls = %8ld", ip_file->max_rec_len); + + switch (ip_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (ip_file->file_spec, "rb", "rfm=fix", + "mbc=64", mrs_str, bls_str); + break; + case MODE_TEXT: + file_ptr = fopen (ip_file->file_spec, "r", "rfm=fix", + "mbc=64", mrs_str, bls_str); + break; + } + break; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case FMT_STREAM: + + switch (ip_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (ip_file->file_spec, "rb", "ctx=stm", + "mbc=64"); + break; + case MODE_TEXT: + file_ptr = fopen (ip_file->file_spec, "r", "ctx=stm", + "mbc=64"); + break; + } + break; + + case FMT_VARIABLE: + + if (ip_file->max_rec_len == INV_RECORD_LEN) + { + ip_file->max_rec_len = DEF_VARIABLE_RECORD_LEN; + } + + if ((ip_file->max_rec_len < MIN_VARIABLE_RECORD_LEN) + || (ip_file->max_rec_len > MAX_VARIABLE_RECORD_LEN)) + { + ERRORMSG_2 ("I/P file `%s' has invalid max variable record \ +length specified: %ld", + ip_file->file_spec, ip_file->max_rec_len); + return ((FILE *) NULL); + } + SPRINTF (mrs_str, "mrs = %8ld", ip_file->max_rec_len); + + switch (ip_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (ip_file->file_spec, "rb", "rfm=var", + "ctx=bin", "mbc=64"); + break; + case MODE_TEXT: + file_ptr = fopen (ip_file->file_spec, "r", "rfm=var", + "rat=cr", "mbc=64"); + break; + } + break; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + default: + ERRORMSG_1 ("invalid I/P file format specified: %X", + ip_file->format); + return ((FILE *) NULL); + break; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_in */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_out +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_out (CONST Int16 overwrite_files, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_out (overwrite_files, op_file) + CONST Int16 overwrite_files; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + char mrs_str[16]; /* "mrs = XXXXXX" */ + char bls_str[16]; /* "bls = XXXXXX" */ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((overwrite_files != OVERWRITE_YES) + && (file_exists (op_file->file_spec))) + { + if (overwrite_files == OVERWRITE_ASK) + { + SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?", + op_file->file_spec); + + if (!confirm_yesno (G_tmp_msg)) + { + INFOMSG ("operation cancelled"); + return ((FILE *) NULL); + } + } + else + { + ERRORMSG_1 ("file `%s' exists", op_file->file_spec); + return ((FILE *) NULL); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (op_file->mode) + { + case MODE_BINARY: + case MODE_TEXT: + break; + default: + ERRORMSG_1 ("invalid O/P file mode specified: %X", op_file->mode); + return ((FILE *) NULL); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (op_file->format) + { + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case FMT_FIXED: + + if (op_file->max_rec_len == INV_RECORD_LEN) + { + op_file->max_rec_len = DEF_FIXED_RECORD_LEN; + } + + if ((op_file->max_rec_len < MIN_FIXED_RECORD_LEN) + || (op_file->max_rec_len > MAX_FIXED_RECORD_LEN)) + { + ERRORMSG_2 ("O/P file `%s' has invalid max fixed record \ +length specified: %ld", + op_file->file_spec, op_file->max_rec_len); + return ((FILE *) NULL); + } + SPRINTF (mrs_str, "mrs = %8ld", op_file->max_rec_len); + SPRINTF (bls_str, "bls = %8ld", op_file->max_rec_len); + + switch (op_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (op_file->file_spec, "wb", "rfm=fix", + "mbc=64", mrs_str, bls_str); + break; + case MODE_TEXT: + file_ptr = fopen (op_file->file_spec, "w", "rfm=fix", + "mbc=64", mrs_str, bls_str); + break; + } + break; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case FMT_STREAM: + + switch (op_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (op_file->file_spec, "wb", "ctx=stm", + "mbc=64"); + break; + case MODE_TEXT: + file_ptr = fopen (op_file->file_spec, "w", "ctx=stm", + "mbc=64"); + break; + } + break; + + case FMT_VARIABLE: + + if (op_file->max_rec_len == INV_RECORD_LEN) + { + op_file->max_rec_len = DEF_VARIABLE_RECORD_LEN; + } + + if ((op_file->max_rec_len < MIN_VARIABLE_RECORD_LEN) + || (op_file->max_rec_len > MAX_VARIABLE_RECORD_LEN)) + { + ERRORMSG_2 ("O/P file `%s' has invalid max variable record \ +length specified: %ld", + op_file->file_spec, op_file->max_rec_len); + return ((FILE *) NULL); + } + SPRINTF (mrs_str, "mrs = %8ld", op_file->max_rec_len); + + switch (op_file->mode) + { + case MODE_BINARY: + file_ptr = fopen (op_file->file_spec, "wb", "rfm=var", + mrs_str, "ctx=bin", "mbc=64"); + break; + case MODE_TEXT: + file_ptr = fopen (op_file->file_spec, "w", "rfm=var", + mrs_str, "rat=cr", "mbc=64"); + break; + } + break; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + default: + ERRORMSG_1 ("invalid O/P file format specified: %X", + op_file->format); + return ((FILE *) NULL); + break; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_out */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** file_exists +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean file_exists (CONST char *file_spec) +#else /* NOT (ANSI_SYNTAX) */ + Boolean file_exists (file_spec) + CONST char *file_spec; +#endif /* (ANSI_SYNTAX) */ +{ + return ((Boolean) (access ((char *) file_spec, 0) == 0)); +} /* file_exists */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** force_file_ext +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void force_file_ext (CONST char *forced_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void force_file_ext (forced_ext, full_spec) + CONST char *forced_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char preamble[MAX_PREAMBLE + 1]; + + if (forced_ext == NULL) + { + return; + } + (void) split_file_spec (full_spec, preamble, name, NULL, NULL); + make_file_spec (preamble, name, forced_ext, NULL, full_spec); +} /* force_file_ext */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** is_a_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean is_a_file (CONST File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + Boolean is_a_file (ex_file) + CONST File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + int file_handle; + + file_handle = fileno (ex_file->file_ptr); + + if ((isatty (file_handle) == 1) || (isapipe (file_handle) == 1)) + { + return (FALSE); + } + else + { + return (TRUE); + } +} /* is_a_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** legal_filespec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *legal_filespec (CONST char *hdrf_spec) +#else /* NOT (ANSI_SYNTAX) */ + char *legal_filespec (hdrf_spec) + CONST char *hdrf_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char tmpf_name[MAX_NAME + 1]; + char tmpf_ext[MAX_EXT + 1]; + char *tmpf_spec; + char *tmp_ptr; + static char opf_spec[MAX_PATH + 1]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmpf_spec = STRDUP (hdrf_spec); + tmp_ptr = STRCHR (tmpf_spec, '.'); + + if (tmp_ptr != NULL) + { + strncpy (tmpf_ext, tmp_ptr, MAX_EXT); + tmpf_ext[MAX_EXT] = '\0'; + *tmp_ptr = '\0'; + } + else + { + strcpy (tmpf_ext, ""); + } + strncpy (tmpf_name, tmpf_spec, MAX_NAME); + tmpf_name[MAX_NAME] = '\0'; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++) + { + if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + strcpy (opf_spec, tmpf_name); + strcat (opf_spec, tmpf_ext); + + if (strcmp (hdrf_spec, opf_spec) != 0) + { + WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'", + hdrf_spec, opf_spec); + } + return (opf_spec); +} /* legal_filespec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** make_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void make_file_spec (CONST char *preamble, + CONST char *name, + CONST char *extension, + CONST char *postamble, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void make_file_spec (preamble, name, extension, + postamble, full_spec) + CONST char *preamble; + CONST char *name; + CONST char *extension; + CONST char *postamble; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + int len; + char *tmp_ptr; + + /*- + **------------------------------------------------------------------------ + ** Start with an empty string and append components of the file + ** specification only if they exist. + **------------------------------------------------------------------------ + */ + strcpy (full_spec, ""); + + /*- + **------------------------------------------------------------------------ + ** The preamble component corresponds to the VAX/VMS node, device, + ** directory and/or logical name components in the form: + ** + ** node:: + ** node::device:[dir1.dir2] + ** node::device:<dir1.dir2> + ** logical_name: + ** + ** If the preamble component does not end in ']', '>' or ':', we assume + ** that it is a logical name and ':' is appended only if the component + ** is not empty. + **------------------------------------------------------------------------ + */ + if ((preamble != NULL) && (*preamble != '\0')) + { + strncat (full_spec, preamble, MAX_PREAMBLE); + len = strlen (preamble); + tmp_ptr = STRCHR ("]>:", preamble[len - 1]); + + if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE)) + { + strcat (full_spec, ":"); + } + } + + /*- + **------------------------------------------------------------------------ + ** Simply append the name if it is present. + **------------------------------------------------------------------------ + */ + if (name != NULL) + { + strncat (full_spec, name, MAX_NAME); + } + + /*- + **------------------------------------------------------------------------ + ** If the extension component does not begin with '.', prepend '.' before + ** appending the extension to the file specification. + **------------------------------------------------------------------------ + */ + if ((extension != NULL) && (*extension != '\0')) + { + if (*extension != '.') + { + strcat (full_spec, "."); + strncat (full_spec, extension, MAX_EXT - 1); + } + else + { + strncat (full_spec, extension, MAX_EXT); + } + } + + + /*- + **------------------------------------------------------------------------ + ** The postamble component of a VAX/VMS file specification is the version + ** number of the file and is introduced with ';' or unusually '.': + ** + ** node::device:[dir1.dir2]name.extension;version + ** node::device:[dir1.dir2]name.extension.version + ** + ** The postamble component must be an integer in the range +/- 65535. + ** + ** If the postamble component does not begin with ';', prepend ';' before + ** appending the postamble to the file specification. + **------------------------------------------------------------------------ + */ + if ((postamble != NULL) && (*postamble != '\0')) + { + if (*postamble != ';') + { + strcat (full_spec, ";"); + strncat (full_spec, postamble, MAX_POSTAMBLE - 1); + } + else + { + strncat (full_spec, postamble, MAX_POSTAMBLE); + } + } +} /* make_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** prompt_for_string +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void prompt_for_string (CONST char *confirm_str, + CONST Int16 buf_size, + char *return_buffer) +#else /* NOT (ANSI_SYNTAX) */ + void prompt_for_string (confirm_str, buf_size, + return_buffer) + CONST char *confirm_str; + CONST Int16 buf_size; + char *return_buffer; +#endif /* (ANSI_SYNTAX) */ +{ + char *status; + + FPRINTF (stderr, "\n%s", confirm_str); + fflush (stderr); + status = fgets (return_buffer, (int) buf_size, stdin); + + if (status == NULL) + { + FATALMSG ("error reading string from stdin"); + explain_error (); + vv_exit (); + } + + status = STRCHR (return_buffer, '\n'); + if (status != NULL) + { + *status = '\0'; + } +} /* prompt_for_string */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_bytes (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_bytes (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + int temp; + + for (idx = 0L; idx < max_bytes; idx++) + { + temp = fgetc (ip_file->file_ptr); + + if (temp == EOF) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (idx == 0) + { + return (-1L); + } + break; + } + buffer[(SIZE_T) idx] = (char) temp; + } + return (idx); +} /* read_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_line (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_line (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *tmp_ptr; + + tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr); + buffer[(SIZE_T) (max_bytes - 1)] = '\0'; + + if (tmp_ptr == NULL) + { + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (feof (ip_file->file_ptr)) + { + return (-1L); + } + } + return ((Int32) strlen (buffer)); +} /* read_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_record (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_record (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 bytes_read; + int file_handle; + + file_handle = fileno (ip_file->file_ptr); + bytes_read = read (file_handle, buffer, max_bytes); + + if (ferror (ip_file->file_ptr)) + { + return (-2L); + } + + if (feof (ip_file->file_ptr)) + { + return (-1L); + } + return (bytes_read); +} /* read_record */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** scan_cmd_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void scan_cmd_line (CONST int qargc, + CONST char *qargv[], + CONST char *q_intro_str, + CONST char *q_sep_str, + Qualifier_Struct *qual_array, + Qualifier_Struct *qual_ipfile, + Qualifier_Struct *qual_opfile) +#else /* NOT (ANSI_SYNTAX) */ + void scan_cmd_line (qargc, qargv, q_intro_str, + q_sep_str, qual_array, qual_ipfile, + qual_opfile) + CONST int qargc; + CONST char *qargv[]; + CONST char *q_intro_str; + CONST char *q_sep_str; + Qualifier_Struct *qual_array; + Qualifier_Struct *qual_ipfile; + Qualifier_Struct *qual_opfile; +#endif /* (ANSI_SYNTAX) */ +{ + int qual_no; + char *tmp_buffer; + char *tmp_ptr; + + /*- + **------------------------------------------------------------------------ + ** Loop through each of the available command qualifiers and call a + ** separate function to parse that qualifier. + **------------------------------------------------------------------------ + */ + for (qual_no = 0; qual_array[qual_no].q_string != NULL; qual_no++) + { + parse_qualifier (&qual_array[qual_no]); + + if ((qual_no == CMDQ_DEBUG) && (qual_array[qual_no].present == TRUE)) + { + G_debugging = TRUE; + } + } + + /*- + **------------------------------------------------------------------------ + ** If VVcode was invoked with the /HELP qualifier return now before + ** attempting to parse the input or output file parameters. We do this + ** to allow the user to issue the command VVENCODE /HELP without + ** those parameters. + **------------------------------------------------------------------------ + */ + if (qual_array[CMDQ_HELP].present == TRUE) + { + return; + } + + /*- + **------------------------------------------------------------------------ + ** Now parse the parameters for the input and output files - it's the + ** same mechanism as for qualifiers. + **------------------------------------------------------------------------ + */ + parse_qualifier (qual_ipfile); + parse_qualifier (qual_opfile); + + /*- + **------------------------------------------------------------------------ + ** Because this is a VMS implementation, it is more natural to allow the + ** user to enter timestamps in the usual VMS format. If the /TIMESTAMP + ** qualifier was specified the CLI routines would have converted whatever + ** was entered into the VMS timestam format: "DD-MM-YYYY HH:MM:SS.CC" so + ** we convert that back to VVcode internal format. + **------------------------------------------------------------------------ + */ + if (qual_array[CMDQ_TIMESTAMP].present == TRUE) + { + tmp_ptr = (char *) qual_array[CMDQ_TIMESTAMP].value; + tmp_buffer = STRDUP (tmp_ptr); + strcpy (tmp_ptr, vms_to_vv_timestamp (tmp_buffer)); + } +} /* scan_cmd_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_ftime +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_ftime (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_ftime (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + struct utimbuf utb; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_2 ("set_ftime: setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + + utb.actime = target_file->mod_time; + utb.modtime = target_file->mod_time; + status = vax_utime (target_file->file_spec, &utb); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status != 0) + { + ERRORMSG_2 ("error setting file `%s' time to %.24s", + target_file->file_spec, ctime (&(target_file->mod_time))); + explain_error (); + } + return; + +} /* set_ftime */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_pipe_mode +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_pipe_mode (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_pipe_mode (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + return; +} /* set_pipe_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** split_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Unsigned16 split_file_spec (CONST char *full_spec, + char *preamble, + char *name, + char *extension, + char *postamble) +#else /* NOT (ANSI_SYNTAX) */ + Unsigned16 split_file_spec (full_spec, preamble, name, + extension, postamble) + CONST char *full_spec; + char *preamble; + char *name; + char *extension; + char *postamble; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_full_spec[MAX_PATH + 1]; + char *start_ptr; + char *tmp_ptr; + int idx; + Unsigned16 path_components; + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (preamble != NULL) + { + *preamble = '\0'; + } + if (name != NULL) + { + *name = '\0'; + } + if (extension != NULL) + { + *extension = '\0'; + } + if (postamble != NULL) + { + *postamble = '\0'; + } + path_components = FS_NOTHING; + + if ((full_spec == NULL) || (*full_spec == '\0')) + { + return (path_components); + } + + strcpy (tmp_full_spec, full_spec); + start_ptr = (char *) tmp_full_spec; + + /*- + **------------------------------------------------------------------------ + ** The preamble component corresponds to the VAX/VMS node, device, + ** directory and/or logical name components in the form: + ** + ** node:: + ** node::device:[dir1.dir2] + ** node::device:<dir1.dir2> + ** node::logical_name: + ** + ** The preamble can end in "::", ":", "]" or ">" and we need to find the + ** LAST occurrence of any of these items in the file specification. + ** + ** If the preamble component does not end in ']', '>' or ':', we assume + ** that it is a logical name and ':' is appended only if the component + ** is not empty. + **------------------------------------------------------------------------ + */ + tmp_ptr = STRRSTR (start_ptr, ":]>"); + + if (tmp_ptr != NULL) + { + path_components |= FS_PREAMBLE; + + if (preamble != NULL) + { + for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr)); + idx++) + { + *preamble++ = *start_ptr++; + } + *preamble = '\0'; + } + start_ptr = ++tmp_ptr; + } + + /*- + **------------------------------------------------------------------------ + ** The postamble component of a VAX/VMS file specification is the version + ** number of the file and is introduced with ';' or unusually '.': + ** + ** node::device:[dir1.dir2]name.extension;version + ** node::device:[dir1.dir2]name;version + ** node::device:[dir1.dir2]name.extension + ** node::device:[dir1.dir2]name.extension.version + ** + ** We support only the ';' style of version number at the moment. + **------------------------------------------------------------------------ + */ + tmp_ptr = STRCHR (start_ptr, ';'); + + if (tmp_ptr != NULL) + { + path_components |= FS_POSTAMBLE; + + if (postamble != NULL) + { + strncpy (postamble, tmp_ptr, MAX_POSTAMBLE); + } + *tmp_ptr = '\0'; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRCHR (start_ptr, '.'); + if (tmp_ptr != NULL) + { + path_components |= FS_EXTENSION; + + if (extension != NULL) + { + strncpy (extension, tmp_ptr, MAX_EXT); + } + *tmp_ptr = '\0'; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (*start_ptr != '\0') + { + path_components |= FS_NAME; + + if (name != NULL) + { + strncpy (name, start_ptr, MAX_NAME); + } + } + + return (path_components); +} /* split_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** tz_offset +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T tz_offset (TIME_T the_time) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T tz_offset (the_time) + TIME_T the_time; +#endif /* (ANSI_SYNTAX) */ +{ + return (0); +} /* tz_offset */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** user_message +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void user_message (CONST Int16 status, + CONST char *msg_str, + File_Info *log_file) +#else /* NOT (ANSI_SYNTAX) */ + void user_message (status, msg_str, log_file) + CONST Int16 status; + CONST char *msg_str; + File_Info *log_file; +#endif /* (ANSI_SYNTAX) */ +{ + int to_stderr; + int to_logfile; + char *status_str; + + + /*- + **------------------------------------------------------------------------ + ** Check the value supplied for the message status and set the output + ** destinations accordingly. + **------------------------------------------------------------------------ + */ + to_logfile = TRUE; + to_stderr = FALSE; + + switch (status) + { + case NORMAL_STATUS: + case LOG_STATUS: + status_str = ""; + break; + case INFO_STATUS: + status_str = "-VV-I-INFO, "; + to_stderr = TRUE; + break; + case WARNING_STATUS: + status_str = "%VV-W-WARNING, "; + to_stderr = TRUE; + break; + case ERROR_STATUS: + status_str = "%VV-E-ERROR, "; + to_stderr = TRUE; + break; + case FATAL_STATUS: + status_str = "%VV-F-FATAL, "; + to_stderr = TRUE; + break; + default: + INTERNAL_ERROR ("user_message"); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is NULL, just update the status and/or the message + ** show status. + **------------------------------------------------------------------------ + */ + if ((msg_str == NULL) || (*msg_str == '\0')) + { + if (status > G_status) + { + G_status = status; + } + return; + } + + /*- + **------------------------------------------------------------------------ + ** Make sure that we don't try to write to a NULL log file pointer. + **------------------------------------------------------------------------ + */ + if (log_file->file_ptr == (FILE *) NULL) + { + to_logfile = FALSE; + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file and stderr, check whether + ** the log file output is also to stderr. If it is, disable the 'stderr' + ** output. + **------------------------------------------------------------------------ + */ + if (to_logfile && to_stderr) + { + if (log_file->file_ptr == stderr) + { + to_stderr = FALSE; + } + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to stderr, output it here. + **------------------------------------------------------------------------ + */ + if (to_stderr) + { + FPRINTF (stderr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file, output it here. If + ** debugging is enabled, report also the name of the calling function. + **------------------------------------------------------------------------ + */ + if (to_logfile) + { + FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status > G_status) + { + G_status = status; + } +} /* user_message */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vv_exit +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void vv_exit (void) +#else /* NOT (ANSI_SYNTAX) */ + void vv_exit () +#endif /* (ANSI_SYNTAX) */ +{ + switch (G_status) + { + case INFO_STATUS: + case LOG_STATUS: + case NORMAL_STATUS: + exit (0x10000001L); + break; + case WARNING_STATUS: + exit (0x10000000L); + exit (1); + break; + case ERROR_STATUS: + exit (0x10000002L); + break; + case FATAL_STATUS: + default: + exit (0x10000004L); + break; + } +} /* vv_exit */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_bytes (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_bytes (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + + for (idx = 0L; idx < max_bytes; idx++) + { + fputc (buffer[(SIZE_T) idx], op_file->file_ptr); + } +} /* write_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_record (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_record (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 no_bytes; + + no_bytes = max_bytes * sizeof (char); + + /*- + **------------------------------------------------------------------------ + ** Check that the buffer does not exceed the maximum allowable record + ** length. If it does, truncate the record and issue a warning. + **------------------------------------------------------------------------ + */ + if ((op_file->max_rec_len > 0) && (no_bytes > op_file->max_rec_len)) + { + ERRORMSG_2 ("output record too long (%ld bytes, max = %ld) - truncated", + no_bytes, op_file->max_rec_len); + no_bytes = op_file->max_rec_len; + } + fwrite (buffer, (SIZE_T) no_bytes, 1, op_file->file_ptr); +} /* write_record */ + + + +/*- +****************************************************************************** +****************************************************************************** +** +** VAX/VMS specific functions private to this module. +** +****************************************************************************** +****************************************************************************** +*/ + +/*- +**============================================================================ +** +** FUNCTION +** +** [tbs] +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] - [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + static void parse_qualifier (Qualifier_Struct *qual_struct) +#else /* NOT (ANSI_SYNTAX) */ + static void parse_qualifier (qual_struct) + Qualifier_Struct *qual_struct; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + String_Desc qual_desc; + String_Desc result_desc; + short length; + char *tmp_str; + char *tmp_ptr; + char tmp_buffer[MAX_IP_LINE_LEN]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_str = STRDUP (qual_struct->q_string); + for (tmp_ptr = tmp_str; *tmp_ptr != '\0'; tmp_ptr++) + { + *tmp_ptr = TOUPPER (*tmp_ptr); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + qual_desc.dsc$w_length = strlen (tmp_str); + qual_desc.dsc$b_dtype = DSC$K_DTYPE_T; + qual_desc.dsc$b_class = DSC$K_CLASS_S; + qual_desc.dsc$a_pointer = tmp_str; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + result_desc.dsc$w_length = sizeof (tmp_buffer) - 1; + result_desc.dsc$b_dtype = DSC$K_DTYPE_T; + result_desc.dsc$b_class = DSC$K_CLASS_S; + result_desc.dsc$a_pointer = tmp_buffer; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + qual_struct->value = NULL; + status = CLI$PRESENT (&qual_desc); + switch (status) + { + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case CLI$_COMMA: + case CLI$_DEFAULTED: + case CLI$_PRESENT: + qual_struct->present = TRUE; + status = CLI$GET_VALUE (&qual_desc, &result_desc, &length); + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + switch (status) + { + case CLI$_COMMA: + case CLI$_CONCAT: + case SS$_NORMAL: + tmp_buffer[length] = '\0'; + qual_struct->value = STRDUP (tmp_buffer); + DEBUG_2 ("parse_qualifier: `/%s' present, value = `%s'", + qual_struct->q_string, qual_struct->value); + break; + case CLI$_ABSENT: + DEBUG_1 ("parse_qualifier: `/%s' present, no value given", + qual_struct->q_string); + break; + default: + FATALMSG_1 ("parse_qualifier: error parsing value of `/%s'", + qual_struct->q_string); + explain_error (); + vv_exit (); + break; + } + break; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case CLI$_LOCNEG: + case CLI$_ABSENT: + case CLI$_NEGATED: + qual_struct->present = FALSE; + DEBUG_1 ("parse_qualifier: `/%s' not present", + qual_struct->q_string); + break; + default: + FATALMSG_1 ("error checking qualifier `%s'", qual_struct->q_string); + explain_error (); + vv_exit (); + break; + } + free (tmp_str); +} /* parse_qualifier */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** [tbs] +** +** DESCRIPTION +** +** Perform FAB & NAM initialization. +** +** INPUT PARAMETERS +** +** file_spec - file specification +** def_file_spec - default file specification +** fab_ptr - FAB to initialize +** fib_ptr - FIB to initialize +** nam_block_ptr - NAM block for FAB to use +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + static void FABFIBNAM_setup (CONST char *file_spec, + CONST char *def_file_spec, + unsigned short *chan_ptr, + struct FAB *fab_ptr, + struct fibdef *fib_ptr, + struct NAM *nam_ptr, + char *esa, + char *rsa) +#else /* NOT (ANSI_SYNTAX) */ + static void FABFIBNAM_setup (file_spec, def_file_spec, chan_ptr, + fab_ptr, fib_ptr, nam_ptr, esa, rsa) + CONST char *file_spec; + CONST char *def_file_spec; + unsigned short *chan_ptr; + struct FAB *fab_ptr; + struct fibdef *fib_ptr; + struct NAM *nam_ptr; + char *esa; + char *rsa; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + String_Desc dev_name; + + /*- + **------------------------------------------------------------------------ + ** Initialize FAB. + **------------------------------------------------------------------------ + */ + memset (fab_ptr, 0, sizeof (*fab_ptr)); + fab_ptr->fab$b_bln = FAB$C_BLN; + fab_ptr->fab$b_bid = FAB$C_BID; + fab_ptr->fab$l_nam = nam_ptr; + fab_ptr->fab$b_fns = strlen (file_spec) & NAM$C_MAXRSS; + fab_ptr->fab$l_fna = file_spec; + fab_ptr->fab$b_dns = strlen (def_file_spec) & NAM$C_MAXRSS; + fab_ptr->fab$l_dna = def_file_spec; + + /*- + **------------------------------------------------------------------------ + ** Initialize NAM. + **------------------------------------------------------------------------ + */ + memset (nam_ptr, 0, sizeof (*nam_ptr)); + nam_ptr->nam$b_bln = NAM$C_BLN; + nam_ptr->nam$b_bid = NAM$C_BID; + nam_ptr->nam$l_esa = esa; + nam_ptr->nam$b_ess = NAM$C_MAXRSS; + nam_ptr->nam$l_rsa = rsa; + nam_ptr->nam$b_rss = NAM$C_MAXRSS; + + /*- + **------------------------------------------------------------------------ + ** Initialize the FIB. + **------------------------------------------------------------------------ + */ + memset (fib_ptr, 0, sizeof (*fib_ptr)); + + /*- + **------------------------------------------------------------------------ + ** Use SYS$PARSE to determine the current device. + **------------------------------------------------------------------------ + */ + status = sys$parse (fab_ptr, 0, 0); + if ((status & 1) != 1) + { + FATALMSG ("FABFIBNAM_setup: couldn't parse current device"); + explain_error (); + LIB$SIGNAL (status); + vv_exit (); + } + + /*- + **-------------------------------------------------------------------- + ** Initialize the 'dev_name' descriptor + **-------------------------------------------------------------------- + */ + dev_name.dsc$w_length = nam_ptr->nam$t_dvi[0] & NAM$C_MAXRSS; + dev_name.dsc$b_dtype = DSC$K_DTYPE_T; + dev_name.dsc$b_class = DSC$K_CLASS_S; + dev_name.dsc$a_pointer = (char *) &(nam_ptr->nam$t_dvi[1]); + + /*- + **-------------------------------------------------------------------- + ** Assign a channel to the file's device + **-------------------------------------------------------------------- + */ + status = sys$assign (&dev_name, chan_ptr, 0, 0); + + if ((status & 1) != 1) + { + FATALMSG_2 ("FABFIBNAM_setup: couldn't assign device `%*s'\n", + dev_name.dsc$a_pointer, dev_name.dsc$w_length); + explain_error (); + LIB$SIGNAL (status); + vv_exit (); + } +} /* FABFIBNAM_setup */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** [tbs] +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] - [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vms_to_vv_timestamp (CONST char *vms_time_str) +#else /* NOT (ANSI_SYNTAX) */ + char *vms_to_vv_timestamp (vms_time_str) + CONST char *vms_time_str; +#endif /* (ANSI_SYNTAX) */ +{ + static char *vv_time_str = DUMMY_VV_TIMESTAMP; + char *mstring = "XXX"; + int year; + int month; + int mday; + int hours; + int mins; + int secs; + int centi_secs; + int status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((vms_time_str == NULL) || (*vms_time_str == '\0')) + { + strcpy (vv_time_str, ""); + return (vv_time_str); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_1 ("vms_to_vv_timestamp: VMS timestamp provided = `%s'", + vms_time_str); + + status = sscanf (vms_time_str, VMS_TIMESTAMP_FORMAT, + &mday, mstring, &year, + &hours, &mins, &secs, ¢i_secs); + month = lookup_key (month_list, mstring, + NO_ABBREVIATIONS, CASE_SENSITIVE); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + sprintf (vv_time_str, VV_TIMESTAMP_FORMAT, + year, month, mday, hours, mins, secs); + DEBUG_1 ("vms_to_vv_timestamp: VV timestamp returned = `%s'", + vv_time_str); + + return (vv_time_str); +} /* vms_to_vv_timestamp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** [tbs] +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] - [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vv_to_vms_timestamp (CONST char *vv_time_str) +#else /* NOT (ANSI_SYNTAX) */ + char *vv_to_vms_timestamp (vv_time_str) + CONST char *vv_time_str; +#endif /* (ANSI_SYNTAX) */ +{ + static char *vms_time_str = DUMMY_VMS_TIMESTAMP; + char *mstring = "XXX"; + int year; + int month; + int mday; + int hours; + int mins; + int secs; + int status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((vv_time_str == NULL) || (*vv_time_str == '\0')) + { + strcpy (vms_time_str, ""); + return (vms_time_str); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_1 ("vv_to_vms_timestamp: VV timestamp provided = `%s'", + vv_time_str); + + status = sscanf (vv_time_str, VV_TIMESTAMP_FORMAT, + &year, &month, &mday, &hours, &mins, &secs); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + sprintf (vms_time_str, VMS_TIMESTAMP_FORMAT, + mday, month_list[month], year, hours, mins, secs, 0); + DEBUG_1 ("vv_to_vms_timestamp: VMS timestamp returned = `%s'", + vms_time_str); + + return (vms_time_str); +} /* vv_to_vms_timestamp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** [tbs] +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] - [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + static Int32 vax_utime (CONST char *file_spec, + CONST struct utimbuf *utime_struct) +#else /* NOT (ANSI_SYNTAX) */ + static Int32 vax_utime (file_spec, utime_struct) + CONST char *file_spec; + CONST struct utimbuf *utime_struct; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + short iosb[4]; + short rev_count; + char date_str[24]; + + struct acb_struct acb[4]; + struct fibdef fib; + struct FAB fab; + struct NAM nam; + unsigned short io_channel; + char *vv_time_str; + char *vms_time_str; + + char esa[NAM$C_MAXRSS]; + char rsa[NAM$C_MAXRSS]; + unsigned long revision_time[2]; + unsigned long creation_time[2]; + unsigned long *quad_actime; + unsigned long *quad_modtime; + String_Desc time_string; + String_Desc fib_desc; + short revision_count; + char ascdate_buffer[255]; + + /*- + **------------------------------------------------------------------------ + ** Convert the Unix format time to a VMS quadword time + **------------------------------------------------------------------------ + */ + quad_actime = unix_to_vms_time (utime_struct->actime); + quad_modtime = unix_to_vms_time (utime_struct->modtime); + + /*- + **------------------------------------------------------------------------ + ** Set up the FAB, FIB and NAM blocks for the supplied file specification. + **------------------------------------------------------------------------ + */ + FABFIBNAM_setup (file_spec, "", &io_channel, &fab, &fib, &nam, esa, rsa); + + /*- + **------------------------------------------------------------------------ + ** Check that the file exists + **------------------------------------------------------------------------ + */ + status = SYS$SEARCH (&fab, 0, 0); + if ((status & 1) != 1) + { + ERRORMSG_2 ("vax_utime: error searching for file `%*s'", + nam.nam$l_rsa, nam.nam$b_rsl); + explain_error (); + LIB$SIGNAL (status); + return (-1); + } + + /*- + **------------------------------------------------------------------------ + ** Copy the file ID from the NAM to FIB. + **------------------------------------------------------------------------ + */ + fib.fib$r_fid_overlay.fib$w_fid[0] = nam.nam$w_fid[0]; + fib.fib$r_fid_overlay.fib$w_fid[1] = nam.nam$w_fid[1]; + fib.fib$r_fid_overlay.fib$w_fid[2] = nam.nam$w_fid[2]; + + /*- + **------------------------------------------------------------------------ + ** Construct the attribute control block item list. + **------------------------------------------------------------------------ + */ + acb[0].w_size = ATR$S_CREDATE; + acb[0].w_type = ATR$C_CREDATE; + acb[0].l_addr = (void *) creation_time; + + acb[1].w_size = ATR$S_REVDATE; + acb[1].w_type = ATR$C_REVDATE; + acb[1].l_addr = (void *) revision_time; + + acb[2].w_size = 2; + acb[2].w_type = ATR$C_ASCDATES; + acb[2].l_addr = (void *) &revision_count; + + acb[3].w_size = 0; + acb[3].w_type = 0; + acb[3].l_addr = 0; + + /*- + **------------------------------------------------------------------------ + ** Build the FIB descriptor + **------------------------------------------------------------------------ + */ + fib_desc.dsc$w_length = FIB$C_LENGTH; + fib_desc.dsc$b_dtype = DSC$K_DTYPE_T; + fib_desc.dsc$b_class = DSC$K_CLASS_S; + fib_desc.dsc$a_pointer = (char *) &fib; + + /*- + **------------------------------------------------------------------------ + ** Set the file creation and revison dates and reset the revision count + ** to one. + **------------------------------------------------------------------------ + */ + revision_count = 1; + creation_time[0] = quad_modtime[0]; + creation_time[1] = quad_modtime[1]; + revision_time[0] = quad_actime[0]; + revision_time[1] = quad_actime[1]; + + /*- + **------------------------------------------------------------------------ + ** Modify the file. The IO$_MODIFY function is used to modify the file. + ** The file's revision and expiry dates will be changed by this action + ** but we don't really care since we've only just created the file. If + ** it ever becomes a problem, the change could be inhibited by the + ** assignment: fib.fib$r_acctl_overlay.fib$l_acctl = FIB$M_NORECORD + **------------------------------------------------------------------------ + */ + status = SYS$QIOW (0, + io_channel, + IO$_MODIFY, + iosb, + 0, 0, + &fib_desc, + 0, 0, 0, + acb, + 0); + + /*- + **------------------------------------------------------------------------ + ** Check the return status. + **------------------------------------------------------------------------ + */ + if ((status & 1) != 1) + { + ERRORMSG_2 ("vax_utime: error modifying file `%*s'", + nam.nam$l_rsa, nam.nam$b_rsl); + explain_error (); + LIB$SIGNAL (status); + return (-1); + } + + if ((iosb[0] & 1) != 1) + { + ERRORMSG_2 ("vax_utime: error modifying file `%*s'", + nam.nam$l_rsa, nam.nam$b_rsl); + explain_error (); + LIB$SIGNAL (iosb[0]); + return (-1); + } + + /*- + **------------------------------------------------------------------------ + ** De-access the I/O channel. + **------------------------------------------------------------------------ + */ + status = SYS$DASSGN (io_channel); + if ((status & 1) != 1) + { + ERRORMSG_2 ("vax_utime: error deaccessing file `%*s'", + nam.nam$l_rsa, nam.nam$b_rsl); + explain_error (); + LIB$SIGNAL (status); + return (-1); + } + + return (0); +} /* vax_utime */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** [tbs] +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] - [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Unsigned32 *unix_to_vms_time (CONST TIME_T unix_time) +#else /* NOT (ANSI_SYNTAX) */ + Unsigned32 *unix_to_vms_time (unix_time) + CONST TIME_T unix_time; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + struct tm *tms; + static unsigned long vms_quad_time[2]; + String_Desc vms_time_desc; + static char *vms_time_str = DUMMY_VMS_TIMESTAMP; + + /*- + **------------------------------------------------------------------------ + ** Convert the Unix time to a 'tm' structure + **------------------------------------------------------------------------ + */ + tms = localtime (&unix_time); + DEBUG_2 ("unix_to_vms_time: unix time provided = %lu (%.24s)", + unix_time, ctime (&unix_time)); + + /*- + **------------------------------------------------------------------------ + ** Convert the 'tm' structure into a VMS format time string + **------------------------------------------------------------------------ + */ + sprintf (vms_time_str, VMS_TIMESTAMP_FORMAT, + tms->tm_mday, month_list[tms->tm_mon + 1], + tms->tm_year + 1900, tms->tm_hour, + tms->tm_min, tms->tm_sec, 0); + DEBUG_1 ("unix_to_vms_time: VMS time string = `%s'", vms_time_str); + + /*- + **------------------------------------------------------------------------ + ** Use SYS$BINTIM to convert the string into a VMS quadword time + **------------------------------------------------------------------------ + */ + vms_time_desc.dsc$w_length = strlen (vms_time_str); + vms_time_desc.dsc$b_dtype = DSC$K_DTYPE_T; + vms_time_desc.dsc$b_class = DSC$K_CLASS_S; + vms_time_desc.dsc$a_pointer = vms_time_str; + + status = SYS$BINTIM (&vms_time_desc, vms_quad_time); + if ((status & 1) != 1) + { + FATALMSG_1 ("unix_to_vms_time: SYS$BINTIM error parsing `%s'", + vms_time_str); + explain_error (); + LIB$SIGNAL (status); + vv_exit (); + } + + DEBUG_2 ("unix_to_vms_time: VMS quadword time = %08x%08x", + vms_quad_time[1], vms_quad_time[0]); + return (vms_quad_time); +} /* vv_to_vms_timestamp */ diff --git a/support/vvcode/vmcms.c b/support/vvcode/vmcms.c new file mode 100644 index 0000000000..7db9c298c1 --- /dev/null +++ b/support/vvcode/vmcms.c @@ -0,0 +1,1829 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vmcms.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson and Rainer Schoepf", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet), +** schoepf@sc.ZIB-Berlin.de (Internet", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** apply_defaults - Apply default file name and extension to a +** full file specification if either of these +** components is missing. +** confirm_yesno - Display a message to the user and wait for a +** yes/no answer. +** examine_file - Examine a file and determine its key features, +** including mode, format, record length and +** timestamp. +** explain_error - Explain the reason for an error. +** f_open_in - Open a file for input using the appropriate +** mode, format etc for the file. +** f_open_out - Open a file for output using the appropriate +** mode, format etc for the file. +** file_exists - Determine whether a file exists. +** force_file_ext - Force the file extension of a full file +** specification to a specified value. +** is_a_file - Determine whether a file stream is connected +** to a real file rather than a character +** device, pipe etc. +** legal_filespec - Takes an arbitrary string which may a file +** specification from another operating system +** and manipulates it to produce a legal file +** specification for the current operating +** system. +** make_filespec - Construct a full file specification from +** component parts. +** prompt_for_string - Present a prompt string and accept a string +** from the user. +** read_bytes - Read bytes from a currently open file. +** read_line - Read a line from a currently open (text) file. +** read_record - Read a record from a currently open file. +** scan_cmd_line - [tbs] +** set_ftime - Set the timestamp of a file to a specified +** value. +** set_pipe_mode - Set the mode of a file stream connected to a +** pipe, character device, redirected +** stdin/stdout/stderr, in fact any non-file. +** split_file_spec - Split a full file specification into its +** component parts. +** tz_offset - Determine the offset of local time from +** Greenwich Mean Time (Coordinated Universal +** Time) at a specified date and time. +** user_message - Present a message to the user. +** vv_exit - Exit the program, returning the appropriate +** status to the operating system. +** write_bytes - Write bytes to a currently open file. +** write_record - Write a record to a currently open file. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** and Rainer Schoepf <schoepf@sc.ZIB-Berlin.de> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> +#define MAX_CMD 128 + + +/*- +**---------------------------------------------------------------------------- +** Include files +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" + + + +/*- +**============================================================================ +** +** FUNCTION +** +** apply_defaults +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void apply_defaults (CONST char *default_name, + CONST char *default_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void apply_defaults (default_name, default_ext, + full_spec) + CONST char *default_name; + CONST char *default_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char extension[MAX_EXT + 1]; + Int16 path_parts; + char postamble[MAX_POSTAMBLE + 1]; + + path_parts = split_file_spec (full_spec, NULL, name, extension, + postamble); + + + if (((path_parts & FS_NAME) == 0) && (default_name != NULL)) + { + strncpy (name, default_name, MAX_NAME); + } + + if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL)) + { + strncpy (extension, default_ext, MAX_EXT); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((path_parts & FS_POSTAMBLE) == 0) + { + strcpy (postamble, ".A"); + } + + make_file_spec (NULL, name, extension, postamble, full_spec); +} /* apply_defaults */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** confirm_yesno +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean confirm_yesno (CONST char *confirm_str) +#else /* NOT (ANSI_SYNTAX) */ + Boolean confirm_yesno (confirm_str) + CONST char *confirm_str; +#endif /* (ANSI_SYNTAX) */ +{ + int answer; + + FPRINTF (stderr, "\n%s [Y/N]:\n", confirm_str); + + do + { + answer = getchar (); + + if (answer == EOF) + { + ERRORMSG ("EOF detected on standard input"); + + answer = 'N'; + } + else + { + answer = TOUPPER (answer); + } + } while (!((answer == 'N') || (answer == 'Y'))); + + return (answer == 'Y' ? TRUE : FALSE); +} /* confirm_yesno */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** examine_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#define EX_SAMPLE_SIZE 512 + +#if (ANSI_SYNTAX) + void examine_file (File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + void examine_file (ex_file) + File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_buffer[EX_SAMPLE_SIZE]; + FILE *file_ptr; + int bytes_read; + int i, j; + char cmd_string[MAX_CMD]; + char dummy[9]; + char c; + int status; + struct tm tms; + + /*- + **------------------------------------------------------------------------ + ** Initialize the File_Info structure before starting work. If the input + ** file is not a real file (i.e. a device or pipe), these are the values + ** that will be returned. + **------------------------------------------------------------------------ + */ + ex_file->mode = INV_MODE; + ex_file->format = INV_FORMAT; + ex_file->max_rec_len = INV_RECORD_LEN; + ex_file->lng_rec_len = INV_RECORD_LEN; + ex_file->mod_time = INV_TIMESTAMP; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + sprintf (cmd_string, "LISTFILE %s (NOHEADER DATE LIFO", + ex_file->file_spec); + + for (i = 0; cmd_string[i] != '\0'; i++) + { + if (cmd_string[i] == '.') { + cmd_string[i] = ' '; + } + else if (islower (cmd_string[i])) { + cmd_string[i] = toupper (cmd_string[i]); + } + } + + DEBUG_1 ("examine_file: passing command `%s' to VM", cmd_string); + + status = system (cmd_string); + + if (status != 0) { + ERRORMSG_1 ("error reading info for file `%s'", + ex_file->file_spec); + explain_error (); + return; + } + + for (i = 1; i <=3; i++) { + status = scanf ("%s", dummy); + + DEBUG_1 ("examine_file: item skipped: `%s'", dummy); + + if (status != 1) { + ERRORMSG_1 ("error parsing info for file `%s'", + ex_file->file_spec); + explain_error (); + return; + } + } + + status = scanf (" %c %d %d %d", &c, &(ex_file->lng_rec_len), &i, &j); + + DEBUG_2 ("examine_file: record format: %c, record_length: %d", + c, ex_file->lng_rec_len); + + DEBUG_2 ("examine_file: number of records: %d, number of blocks: %d", + i, j); + + if (status != 4) { + ERRORMSG_2 ("error parsing record info for file `%s', only %d items parsed", + ex_file->file_spec, status); + explain_error (); + return; + } + + ex_file->max_rec_len = ex_file->lng_rec_len; + + switch (c) { + + case 'V': + ex_file->format = FMT_VARIABLE; + break; + + case 'F': + ex_file->format = FMT_FIXED; + break; + + default: + ERRORMSG_2 ("file `%s' has an unsupported record format (%c)", + ex_file->file_spec, c); + explain_error (); + return; + } + + status = scanf ("%d/%d/%d %d:%d:%d", + &tms.tm_mon, &tms.tm_mday, &tms.tm_year, + &tms.tm_hour, &tms.tm_min, &tms.tm_sec); + + DEBUG_3 ("examine_file: date as parsed: %02d/%02d/%02d", + tms.tm_mon, tms.tm_mday, tms.tm_year); + + DEBUG_3 ("examine_file: time as parsed: %02d:%02d:%02d", + tms.tm_hour, tms.tm_min, tms.tm_sec); + + + if (status == 5) { + tms.tm_sec = 0; + } + else if (status != 6) { + ERRORMSG_1 ("error parsing time info for file `%s'", + ex_file->file_spec); + explain_error (); + return; + } + + tms.tm_mon--; + + ex_file->mod_time = make_time (&tms); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + ex_file->file_ptr = fopen (ex_file->file_spec, "rb"); + + if (file_ptr == (FILE *) NULL) { + ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec); + explain_error (); + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + + bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE, + ex_file->file_ptr); + + ex_file->mode = MODE_TEXT; /* default */ + + for (i = 0; i < bytes_read - 1; i++) { + if (!isprint(tmp_buffer[i])) { + ex_file->mode = MODE_BINARY; + break; + } + } + f_close (ex_file); + ex_file->file_ptr = (FILE *) NULL; + +} /* examine_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** explain_error +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void explain_error (void) +#else /* NOT (ANSI_SYNTAX) */ + void explain_error () +#endif /* (ANSI_SYNTAX) */ +{ + INFOMSG_1 ("Error number: %ld", (long) errno); +} /* explain_error */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_in +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_in (File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_in (ip_file) + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + +/* if ((ip_file->rec_length < MIN_RECORD_LEN) || (ip_file->rec_length > MAX_RECORD_LEN)) { + FATALMSG_1 ("invalid record length specified `%d'", ip_file->rec_length); + vv_exit (G_status); + }*/ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (ip_file->mode) { + case MODE_BINARY: + file_ptr = fopen (ip_file->file_spec, "rb"); + break; + case MODE_TEXT: + file_ptr = fopen (ip_file->file_spec, "r"); + break; + default: + ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode); + return ((FILE *) NULL); + } + + if (file_ptr == (FILE *) NULL) { + ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_in */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_open_out +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + FILE *f_open_out (CONST Int16 overwrite_files, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + FILE *f_open_out (overwrite_files, op_file) + CONST Int16 overwrite_files; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *file_ptr; + char tmp_buffer[512]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((overwrite_files != OVERWRITE_YES) + && (file_exists (op_file->file_spec))) + { + if (overwrite_files == OVERWRITE_ASK) { + SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?", + op_file->file_spec); + + if (!confirm_yesno (G_tmp_msg)) + { + ERRORMSG ("operation cancelled"); + return ((FILE *) NULL); + } + } + else + { + ERRORMSG_1 ("file `%s' exists", op_file->file_spec); + return ((FILE *) NULL); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + + + if (op_file->format == FMT_VARIABLE ) { + if (op_file->max_rec_len == INV_RECORD_LEN) { + op_file->max_rec_len = op_file->lng_rec_len = DEF_VARIABLE_RECORD_LEN; + } else if ((op_file->max_rec_len < MIN_VARIABLE_RECORD_LEN) || + (op_file->max_rec_len > MAX_VARIABLE_RECORD_LEN)) { + WARNMSG_1 ("invalid record length specified `%d'", op_file->max_rec_len); + WARNMSG_1 ("using default (%d) instead", DEF_VARIABLE_RECORD_LEN); + op_file->max_rec_len = op_file->lng_rec_len = DEF_VARIABLE_RECORD_LEN; + } + + sprintf (tmp_buffer, "%s, RECFM=V", + op_file->mode == MODE_BINARY ? "wb" : "w"); + + } else if (op_file->format == FMT_FIXED ) { + if (op_file->max_rec_len == INV_RECORD_LEN) { + op_file->max_rec_len = op_file->lng_rec_len = DEF_FIXED_RECORD_LEN; + } else if ((op_file->max_rec_len < MIN_FIXED_RECORD_LEN) || + (op_file->max_rec_len > MAX_FIXED_RECORD_LEN)) { + WARNMSG_1 ("invalid record length specified `%d'", op_file->max_rec_len); + WARNMSG_1 ("using default (%d) instead", DEF_FIXED_RECORD_LEN); + op_file->max_rec_len = op_file->lng_rec_len = DEF_FIXED_RECORD_LEN; + } + + sprintf (tmp_buffer, "%s, RECFM=F, LRECL=%d", + op_file->mode == MODE_BINARY ? "wb" : "w", + op_file->lng_rec_len); + } + + DEBUG_2 ("f_open_out: going to open file `%s' with specification `%s'", + op_file->file_spec, tmp_buffer); + + file_ptr = fopen (op_file->file_spec, tmp_buffer); + + if (file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec); + explain_error (); + return ((FILE *) NULL); + } + return (file_ptr); +} /* f_open_out */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** file_exists +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean file_exists (CONST char *file_spec) +#else /* NOT (ANSI_SYNTAX) */ + Boolean file_exists (file_spec) + CONST char *file_spec; +#endif /* (ANSI_SYNTAX) */ +{ + FILE *fp; + int result; + + fp = fopen (file_spec, "r"); + + DEBUG_2 ("file_exists: trial open of file `%s' in \"r\" mode returns file pointer `%lx'", + file_spec, (long) fp); + + result = (fp != (FILE *) NULL); + + DEBUG_1 ("file_exists: result = %d", result); + + fclose (fp); + + return (result); +} /* file_exists */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** force_file_ext +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void force_file_ext (CONST char *forced_ext, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void force_file_ext (forced_ext, full_spec) + CONST char *forced_ext; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char name[MAX_NAME + 1]; + char postamble[MAX_POSTAMBLE + 1]; + + if (forced_ext == NULL) + { + return; + } + (void) split_file_spec (full_spec, NULL, name, NULL, postamble); + make_file_spec (NULL, name, forced_ext, postamble, full_spec); +} /* force_file_ext */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** is_a_file +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean is_a_file (CONST File_Info *ex_file) +#else /* NOT (ANSI_SYNTAX) */ + Boolean is_a_file (ex_file) + CONST File_Info *ex_file; +#endif /* (ANSI_SYNTAX) */ +{ + return (TRUE); +} /* is_a_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** legal_filespec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *legal_filespec (CONST char *hdrf_spec) +#else /* NOT (ANSI_SYNTAX) */ + char *legal_filespec (hdrf_spec) + CONST char *hdrf_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char tmpf_name[MAX_NAME + 1]; + char tmpf_ext[MAX_EXT + 1]; + char *tmpf_spec; + char *tmp_ptr; + static char opf_spec[MAX_PATH + 1]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmpf_spec = STRDUP (hdrf_spec); + tmp_ptr = strchr (tmpf_spec, '.'); + + if (tmp_ptr != NULL) { + strncpy (tmpf_ext, tmp_ptr, MAX_EXT); + tmpf_ext[MAX_EXT] = '\0'; + *tmp_ptr = '\0'; + } + else { + strcpy (tmpf_ext, ""); + } + strncpy (tmpf_name, tmpf_spec, MAX_NAME); + tmpf_name[MAX_NAME] = '\0'; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++) + { + if (strchr (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++) + { + if (strchr (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL) + { + *tmp_ptr = REPLACEMENT_FILESPEC_CHAR; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + strcpy (opf_spec, tmpf_name); + strcat (opf_spec, tmpf_ext); + + if (strcmp (hdrf_spec, opf_spec) != 0) { + WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'", + hdrf_spec, opf_spec); + } + return (opf_spec); +} /* legal_filespec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** make_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void make_file_spec (CONST char *preamble, + CONST char *name, + CONST char *extension, + CONST char *postamble, + char *full_spec) +#else /* NOT (ANSI_SYNTAX) */ + void make_file_spec (preamble, name, extension, + postamble, full_spec) + CONST char *preamble; + CONST char *name; + CONST char *extension; + CONST char *postamble; + char *full_spec; +#endif /* (ANSI_SYNTAX) */ +{ + int len; + char *tmp_ptr; + + /*- + **------------------------------------------------------------------------ + ** Start with an empty string and append components of the file + ** specification only if they exist. + **------------------------------------------------------------------------ + */ + strcpy (full_spec, ""); + + /*- + **------------------------------------------------------------------------ + ** VM/CMS has no preamble component. + **------------------------------------------------------------------------ + */ + + + /*- + **------------------------------------------------------------------------ + ** Simply append the name if it is present. + **------------------------------------------------------------------------ + */ + if (name != NULL) + { + strncat (full_spec, name, MAX_NAME); + } + + /*- + **------------------------------------------------------------------------ + ** If the extension component does not begin with '.', prepend '.' before + ** appending the extension to the file specification. + **------------------------------------------------------------------------ + */ + if ((extension != NULL) && (*extension != '\0')) + { + if (*extension != '.') + { + strcat (full_spec, "."); + strncat (full_spec, extension, MAX_EXT - 1); + } + else + { + strncat (full_spec, extension, MAX_EXT); + } + } + + /*- + **------------------------------------------------------------------------ + ** If the postamble component does not begin with '.', prepend '.' before + ** appending the extension to the file specification. + **------------------------------------------------------------------------ + */ + if ((postamble != NULL) && (*postamble != '\0')) + { + if (*postamble != '.') + { + strcat (full_spec, "."); + strncat (full_spec, postamble, MAX_POSTAMBLE - 1); + } + else + { + strncat (full_spec, postamble, MAX_POSTAMBLE); + } + } +} /* make_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** prompt_for_string +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void prompt_for_string (CONST char *confirm_str, + CONST Int16 buf_size, + char *return_buffer) +#else /* NOT (ANSI_SYNTAX) */ + void prompt_for_string (confirm_str, buf_size, + return_buffer) + CONST char *confirm_str; + CONST Int16 buf_size; + char *return_buffer; +#endif /* (ANSI_SYNTAX) */ +{ + char *status; + + FPRINTF (stderr, "\n%s", confirm_str); + status = fgets (return_buffer, (int) buf_size, stdin); + + if (status == NULL) + { + FATALMSG ("error reading string from stdin"); + explain_error (); + vv_exit (); + } + + status = STRCHR (return_buffer, '\n'); + if (status != NULL) + { + *status = '\0'; + } +} /* prompt_for_string */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_bytes (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_bytes (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + int temp; + + for (idx = 0L; idx < max_bytes; idx++) + { + temp = fgetc (ip_file->file_ptr); + if (temp == EOF) + { + return (idx); + } + buffer[(SIZE_T) idx] = (char) temp; + } + return (idx); +} /* read_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_line (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_line (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *tmp_ptr; + + tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr); + buffer[(SIZE_T) (max_bytes - 1)] = '\0'; + + if (tmp_ptr == NULL) + { + return (-1); + } + else + { + return ((Int32) strlen (buffer)); + } +} /* read_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** read_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 read_record (CONST Int32 max_bytes, + char *buffer, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 read_record (max_bytes, buffer, ip_file) + CONST Int32 max_bytes; + char *buffer; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + int i; + int c; + char *s; + + DEBUG_1 ("read_record: want to read record of with maximum size %d", + max_bytes); + + if (ip_file->mode == MODE_TEXT) { + s = fgets (buffer, max_bytes, ip_file->file_ptr); + + if (s == (char *) NULL) { + return (-1L); + } + + i = strlen (s); + } + else { + + if (feof (ip_file->file_ptr)) { + return (-1); + } + for (i = 0; i < max_bytes; i++) { + c = getc (ip_file->file_ptr); + if (c == EOF) { + break; + } + else { + buffer[i] = c; + } + } + } + + DEBUG_1 ("read_record: record with %d bytes read", i); + + return (i); +} /* read_record */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** scan_cmd_line +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void scan_cmd_line (CONST int qargc, + CONST char *qargv[], + CONST char *q_intro_str, + CONST char *q_sep_str, + Qualifier_Struct *qual_array, + Qualifier_Struct *qual_ipfile, + Qualifier_Struct *qual_opfile) +#else /* NOT (ANSI_SYNTAX) */ + void scan_cmd_line (qargc, qargv, q_intro_str, + q_sep_str, qual_array, qual_ipfile, + qual_opfile) + CONST int qargc; + CONST char *qargv[]; + CONST char *q_intro_str; + CONST char *q_sep_str; + Qualifier_Struct *qual_array; + Qualifier_Struct *qual_ipfile; + Qualifier_Struct *qual_opfile; +#endif /* (ANSI_SYNTAX) */ +{ + char *arg; + int arg_no; + int len; + int qual_found; + int q_no; + char *qsep_ptr; + char *qvalue_ptr; + char *tmp_qstr_ptr; + int paren_seen = 0; + char *file_specs[6]; + int i; + char tmp_buffer[512]; + + + /*- + **------------------------------------------------------------------------ + ** Initialize file spec array + **------------------------------------------------------------------------ + */ + + for (i = 0; i < 6; i++) { + file_specs[i] = NULL; + } + + /*- + **------------------------------------------------------------------------ + ** Loop through each of the user supplied command line arguments. + **------------------------------------------------------------------------ + */ + for (arg_no = 1; arg_no < qargc; arg_no++) { + arg = (char *) qargv[arg_no]; + + if (arg[0] == '(') { + paren_seen = 1; + break; + } + else if (arg_no > 6) { + USAGE ("too many arguments"); + } + else { + file_specs[arg_no - 1] = STRDUP (arg); + } + } + + if (arg_no == 1) { + USAGE ("too few arguments"); + } + + /* arg_no is now the first option argument */ + + strcpy (tmp_buffer, file_specs[0]); + if (arg_no > 2) { + strcat (tmp_buffer, "."); + strcat (tmp_buffer, file_specs[1]); + + if (arg_no > 3) { + strcat (tmp_buffer, "."); + strcat (tmp_buffer, file_specs[2]); + } + } + + for (i = 0; tmp_buffer[i] != '\0'; i++) { + if (islower (tmp_buffer[i])) { + tmp_buffer[i] = toupper (tmp_buffer[i]); + } + } + + qual_ipfile->present = TRUE; + qual_ipfile->value = STRDUP (tmp_buffer); + + if (arg_no > 4) { + if (strcmp (file_specs[3], "=") == 0) { + file_specs[3] = file_specs[0]; + } + strcpy (tmp_buffer, file_specs[3]); + if (arg_no > 5) { + if (strcmp (file_specs[4], "=") == 0) { + file_specs[4] = file_specs[1]; + } + strcat (tmp_buffer, "."); + strcat (tmp_buffer, file_specs[4]); + + if (arg_no > 6) { + if (strcmp (file_specs[5], "=") == 0) { + file_specs[5] = file_specs[2]; + } + strcat (tmp_buffer, "."); + strcat (tmp_buffer, file_specs[5]); + } + } + + for (i = 0; tmp_buffer[i] != '\0'; i++) { + if (islower (tmp_buffer[i])) { + tmp_buffer[i] = toupper (tmp_buffer[i]); + } + } + + qual_opfile->present = TRUE; + qual_opfile->value = STRDUP (tmp_buffer); + } + + for (; arg_no < qargc; arg_no++) { + arg = (char *) qargv[arg_no]; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + + DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg); + + if (*arg == '(') { + if (arg[1] == '\0') { + continue; + } + + ++arg; + + } + + /*- + **---------------------------------------------------------------- + ** Extract the component of the qualifier string before the + ** 'q_sep_str' character if it is present. + **---------------------------------------------------------------- + */ + tmp_qstr_ptr = STRDUP (arg); + qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str); + qvalue_ptr = NULL; + + if (qsep_ptr != NULL) { + *qsep_ptr = '\0'; + qvalue_ptr = qsep_ptr + 1; + } + + /*- + **---------------------------------------------------------------- + ** Search the command qualifier structure array for this + ** qualifier string. + **---------------------------------------------------------------- + */ + len = strlen (tmp_qstr_ptr); + qual_found = -1; + + for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++) { + + if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, len) == 0) { + + /*- + **-------------------------------------------------------- + ** + **-------------------------------------------------------- + */ + if (qual_found < 0) { + qual_found = q_no; + DEBUG_1 ("scan_cmd_line: matches option: `%s'", + qual_array[q_no].q_string); + } + else { + USAGE_1 ("ambiguous option `%s'", qargv[arg_no]); + } + } + } + + /*- + **---------------------------------------------------------------- + ** If the option string is unknown, return that status. + **---------------------------------------------------------------- + */ + if (qual_found < 0) { + USAGE_1 ("unknown option `%s'", qargv[arg_no]); + } + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + if (qsep_ptr == NULL) { + if (qual_array[qual_found].val_needed == VALUE_NONE) { + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = NULL; + + if (qual_found == CMDQ_DEBUG) { + G_debugging = TRUE; + } + + continue; + } + else { + + /*- + **-------------------------------------------------------- + ** + **-------------------------------------------------------- + */ + if (((arg_no + 1) < qargc) && + (STRCHR (QUAL_INTRO, *qargv[arg_no + 1]) == NULL)) { + + /*- + **---------------------------------------------------- + ** + **---------------------------------------------------- + */ + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = STRDUP (qargv[++arg_no]); + DEBUG_1 ("scan_cmd_line: option value: `%s'", qargv[arg_no]); + } + else { + /*- + **---------------------------------------------------- + ** + **---------------------------------------------------- + */ + if (qual_array[qual_found].val_needed == VALUE_NEEDED) { + USAGE_2 ("option `%.1s%s' needs a value", + QUAL_INTRO, + qual_array[qual_found].q_string); + } + else { + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = NULL; + } + } + continue; + } + } + else { + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + if (*qvalue_ptr == '\0') { + USAGE_1 ("value missing for option `%.1s%s'", + qargv[arg_no]); + } + else if (qual_array[qual_found].val_needed == VALUE_NONE) { + USAGE_2 ("option `%.1s%s' does not take a value", + QUAL_INTRO, qual_array[qual_found].q_string); + } + else { + qual_array[qual_found].present = TRUE; + qual_array[qual_found].value = STRDUP (qvalue_ptr); + DEBUG_1 ("scan_cmd_line: option value: `%s'", + qual_array[qual_found].value); + continue; + } + } + } +} /* scan_cmd_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_ftime +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_ftime (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_ftime (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + int i; + struct tm *tms; + char cmd_string[MAX_CMD]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_2 ("set_ftime: setting file `%s' time to %s", + target_file->file_spec, ctime (&(target_file->mod_time))); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tms = localtime (&(target_file->mod_time)); + sprintf (cmd_string, "EXEC TOUCH %s (%02d/%02d/%02d %02d:%02d:%02d)", + target_file->file_spec, + tms->tm_mon + 1, tms->tm_mday, tms->tm_year, + tms->tm_hour, tms->tm_min, tms->tm_sec); + + for (i = 0; cmd_string[i] != '\0'; i++) + { + if (cmd_string[i] == '.') { + cmd_string[i] = ' '; + } + else if (islower (cmd_string[i])) { + cmd_string[i] = toupper (cmd_string[i]); + } + } + + DEBUG_1 ("set_ftime: passing command `%s' to VM", cmd_string); + + status = system (cmd_string); + + if (status != 0) { + ERRORMSG_2 ("error setting file `%s' time to %s", + target_file->file_spec, ctime (&(target_file->mod_time))); + explain_error (); + } + + return; +} /* set_ftime */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_pipe_mode +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_pipe_mode (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_pipe_mode (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + return; +} /* set_pipe_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** split_file_spec +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Unsigned16 split_file_spec (CONST char *full_spec, + char *preamble, + char *name, + char *extension, + char *postamble) +#else /* NOT (ANSI_SYNTAX) */ + Unsigned16 split_file_spec (full_spec, preamble, name, + extension, postamble) + CONST char *full_spec; + char *preamble; + char *name; + char *extension; + char *postamble; +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_full_spec[MAX_PATH + 1]; + char *start_ptr; + char *tmp_ptr; + char *tmp_ptr2; + int idx; + Int16 path_components; + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (preamble != NULL) + { + *preamble = '\0'; + } + if (name != NULL) + { + *name = '\0'; + } + if (extension != NULL) + { + *extension = '\0'; + } + if (postamble != NULL) + { + *postamble = '\0'; + } + path_components = FS_NOTHING; + + if ((full_spec == NULL) || (*full_spec == '\0')) + { + return (path_components); + } + + strcpy (tmp_full_spec, full_spec); + start_ptr = (char *) tmp_full_spec; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_ptr = STRCHR (start_ptr, '.'); + + if (tmp_ptr != NULL) + { + path_components |= FS_EXTENSION; + + tmp_ptr2 = tmp_ptr; + tmp_ptr2++; + while (*tmp_ptr2 != '\0') { + if (*tmp_ptr2 == '.') { + *tmp_ptr2 = '\0'; + + tmp_ptr2++; + if ((tmp_ptr2 != '\0') && isalpha (*tmp_ptr2)) { + path_components |= FS_POSTAMBLE; + if (postamble != NULL) { + postamble[0] = '.'; + postamble[1] = *tmp_ptr2; + tmp_ptr2++; + if (isdigit (*tmp_ptr2)) { + postamble[2] = *tmp_ptr2; + postamble[3] = '\0'; + } + else { + postamble[2] = '\0'; + } + } + } + + break; + } + tmp_ptr2++; + } + + if (extension != NULL) + { + strncpy (extension, tmp_ptr, MAX_EXT); + } + *tmp_ptr = '\0'; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (*start_ptr != '\0') + { + path_components |= FS_NAME; + + if (name != NULL) + { + strncpy (name, start_ptr, MAX_NAME); + } + } + + return (path_components); +} /* split_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** tz_offset +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T tz_offset (TIME_T the_time) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T tz_offset (the_time) + TIME_T the_time; +#endif /* (ANSI_SYNTAX) */ + +{ + /* struct tm *tm; + TIME_T timezone; + + tm = localtime (&the_time); + + if (tm->tm_isdst > 0) { + return (timezone - (TIME_T) 3600); + } + else { + return (timezone); + } */ + return ((TIME_T) 0); +} /* tz_offset */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** user_message +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void user_message (CONST Int16 status, + CONST char *msg_str, + File_Info *log_file) +#else /* NOT (ANSI_SYNTAX) */ + void user_message (status, msg_str, log_file) + CONST Int16 status; + CONST char *msg_str; + File_Info *log_file; +#endif /* (ANSI_SYNTAX) */ +{ + int to_stderr; + int to_logfile; + char *status_str; + + + /*- + **------------------------------------------------------------------------ + ** Check the value supplied for the message status and set the output + ** destinations accordingly. + **------------------------------------------------------------------------ + */ + to_logfile = TRUE; + to_stderr = FALSE; + + switch (status) + { + case NORMAL_STATUS: + case LOG_STATUS: + status_str = ""; + break; + case INFO_STATUS: + status_str = " -- "; + to_stderr = TRUE; + break; + case WARNING_STATUS: + status_str = "\nWARNING: "; + to_stderr = TRUE; + break; + case ERROR_STATUS: + status_str = "\nERROR: "; + to_stderr = TRUE; + break; + case FATAL_STATUS: + status_str = "\nFATAL: "; + to_stderr = TRUE; + break; + default: + INTERNAL_ERROR ("user_message"); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is NULL, just update the status and/or the message + ** show status. + **------------------------------------------------------------------------ + */ + if ((msg_str == NULL) || (*msg_str == '\0')) + { + if (status > G_status) + { + G_status = status; + } + return; + } + + /*- + **------------------------------------------------------------------------ + ** Make sure that we don't try to write to a NULL log file pointer. + **------------------------------------------------------------------------ + */ + if (log_file->file_ptr == (FILE *) NULL) + { + to_logfile = FALSE; + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file and stderr, check whether + ** the log file output is also to stderr. If it is, disable the 'stderr' + ** output. + **------------------------------------------------------------------------ + */ + if (to_logfile && to_stderr) + { + if (log_file->file_ptr == stderr) + { + to_stderr = FALSE; + } + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to stderr, output it here. + **------------------------------------------------------------------------ + */ + if (to_stderr) + { + FPRINTF (stderr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** If the message is to be sent to the log file, output it here. If + ** debugging is enabled, report also the name of the calling function. + **------------------------------------------------------------------------ + */ + if (to_logfile) + { + FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (status > G_status) + { + G_status = status; + } + +} /* user_message */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vv_exit +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void vv_exit (void) +#else /* NOT (ANSI_SYNTAX) */ + void vv_exit () +#endif /* (ANSI_SYNTAX) */ +{ + switch (G_status) + { + case LOG_STATUS: + case NORMAL_STATUS: + exit (0); + break; + case WARNING_STATUS: + exit (1); + break; + case ERROR_STATUS: + exit (2); + break; + case FATAL_STATUS: + default: + exit (3); + break; + } +} /* vv_exit */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_bytes +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_bytes (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_bytes (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 idx; + + for (idx = 0L; idx < max_bytes; idx++) + { + fputc (buffer[(SIZE_T) idx], op_file->file_ptr); + } +} /* write_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** write_record +** +** NOTE: see related file 'specific.h' for functional description. +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void write_record (CONST Int32 max_bytes, + CONST char *buffer, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void write_record (max_bytes, buffer, op_file) + CONST Int32 max_bytes; + CONST char *buffer; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 no_bytes; + + no_bytes = max_bytes * sizeof (char); + fwrite (buffer, (Int16) no_bytes, 1, op_file->file_ptr); +} /* write_record */ diff --git a/support/vvcode/vmsbuild.com b/support/vvcode/vmsbuild.com new file mode 100644 index 0000000000..1624a82842 --- /dev/null +++ b/support/vvcode/vmsbuild.com @@ -0,0 +1,120 @@ +$!**************************************************************************** +$!**************************************************************************** +$! +$! ARCHIVE HEADER INFORMATION +$! +$! @VAX-VMS-shell-file{ +$! FILENAME = "vmsbuild.com", +$! VERSION = "1.00", +$! DATE = "", +$! TIME = "", +$! +$! AUTHOR = "Niel Kempson", +$! ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +$! TELEPHONE = "+44-242 579105", +$! EMAIL = "kempson@tex.ac.uk (Internet)", +$! +$! SUPPORTED = "yes", +$! ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +$! KEYWORDS = "VVcode", +$! +$! CODETABLE = "ISO/ASCII", +$! CHECKSUM = "51492 1481 5732 57976", +$! +$! DOCSTRING = { This is a simple VMS command procedure to build +$! VVcode. +$! } +$! } +$! +$! MODULE CONTENTS +$! +$! [tbs] +$! +$! COPYRIGHT +$! +$! Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +$! +$! This program is free software; you can redistribute it and/or +$! modify it under the terms of the GNU General Public License as +$! published by the Free Software Foundation; either version 1, or +$! (at your option) any later version. +$! +$! This program is distributed in the hope that it will be useful, +$! but WITHOUT ANY WARRANTY; without even the implied warranty of +$! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +$! General Public License for more details. +$! +$! You should have received a copy of the GNU General Public License +$! along with this program; if not, write to the Free Software +$! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +$! +$! In other words, you are welcome to use, share and improve this +$! program. You are forbidden to forbid anyone else to use, share +$! and improve what you give them. Help stamp out software-hoarding! +$! +$! CHANGE LOG +$! +$!**************************************************************************** +$!**************************************************************************** +$ ON ERROR THEN $ GOTO Exit_Label +$ ver_state = F$VERIFY (0) +$ WSO = "WRITE SYS$OUTPUT" +$! +$!---------------------------------------------------------------------------- +$! +$! Local definitions for file types and compilation / linking. +$! +$! Customize compiler & linker qualifiers here (e.g. to build a debugging +$! version or to use GNU C). +$! +$!---------------------------------------------------------------------------- +$ COMPILER = "CC" +$ CCFLAGS = "/WARNINGS /STANDARD=PORTABLE" +$ LINKFLAGS = "/TRACEBACK /NODEBUG" +$! +$!---------------------------------------------------------------------------- +$! Allow an optional parameter "LINKONLY". +$!---------------------------------------------------------------------------- +$ IF P1 .EQS. "LINKONLY" +$ THEN +$ SET VERIFY +$ GOTO Link_Stage +$ ENDIF +$! +$!---------------------------------------------------------------------------- +$! End of local definitions. +$!---------------------------------------------------------------------------- +$ WSO "Starting to build VVcode at ''F$TIME()'" +$ SET VERIFY +$ 'COMPILER' 'CCFLAGS' vvdecode.c +$ 'COMPILER' 'CCFLAGS' vvencode.c +$ 'COMPILER' 'CCFLAGS' vveparse.c +$ 'COMPILER' 'CCFLAGS' vvutils.c +$ 'COMPILER' 'CCFLAGS' vaxvms.c +$! +$!---------------------------------------------------------------------------- +$! All modules have been compiled so link them together. +$!---------------------------------------------------------------------------- +$Link_Stage: +$ LINK 'LINKFLAGS' vvencode.obj, vvutils.obj, vaxvms.obj, - + SYS$INPUT: /OPTIONS +SYS$LIBRARY:VAXCRTL /SHAREABLE +$!---------------------------------------------------------------------------- +$ LINK 'LINKFLAGS' vvdecode.obj, vveparse.obj, vvutils.obj, - + vaxvms.obj, SYS$INPUT: /OPTIONS +SYS$LIBRARY:VAXCRTL /SHAREABLE +$!---------------------------------------------------------------------------- +$ SET NOVERIFY +$ WSO "VVcode built at ''F$TIME()'" +$! +$!---------------------------------------------------------------------------- +$! We should always exit the command procedure here. If we came here as the +$! result of an error, return the error status on exit. +$!---------------------------------------------------------------------------- +$Exit_Label: +$ save_status = $STATUS +$ IF ver_state +$ THEN +$ SET VERIFY +$ ENDIF +$ EXIT 'save_status' diff --git a/support/vvcode/vvcode.cld b/support/vvcode/vvcode.cld new file mode 100644 index 0000000000..f67fcbf374 --- /dev/null +++ b/support/vvcode/vvcode.cld @@ -0,0 +1,465 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! +!! ARCHIVE HEADER INFORMATION +!! +!! @Digital-Command-Language-Def-file{ +!! FILENAME = "vvcode.cld", +!! VERSION = "1.00", +!! DATE = "", +!! TIME = "", +!! +!! AUTHOR = "Niel Kempson", +!! ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +!! TELEPHONE = "+44-242 579105", +!! EMAIL = "kempson@tex.ac.uk (Internet)", +!! +!! SUPPORTED = "yes", +!! ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +!! KEYWORDS = "VVcode", +!! +!! CODETABLE = "ISO/ASCII", +!! CHECKSUM = "51492 1481 5732 57976", +!! +!! DOCSTRING = { This is the VVCODE Command Line Definition file for +!! VAX/VMS. It defines the command verbs VVENCODE and +!! VVDECODE. +!! +!! NOTE: the string VVCODE_DIR used in the "image" +!! lines should be replaced by the appropriate +!! physical or logical directory specification +!! where the VVDECODE.EXE and VVENCODE.EXE +!! image files reside. +!! +!! To activate the command verbs, the DCL command +!! +!! SET COMMAND VVCODE +!! +!! should be issued. +!! } +!! } +!! +!! MODULE CONTENTS +!! +!! [tbs] +!! +!! COPYRIGHT +!! +!! Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +!! +!! This program is free software; you can redistribute it and/or +!! modify it under the terms of the GNU General Public License as +!! published by the Free Software Foundation; either version 1, or +!! (at your option) any later version. +!! +!! This program is distributed in the hope that it will be useful, +!! but WITHOUT ANY WARRANTY; without even the implied warranty of +!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +!! General Public License for more details. +!! +!! You should have received a copy of the GNU General Public License +!! along with this program; if not, write to the Free Software +!! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +!! +!! In other words, you are welcome to use, share and improve this +!! program. You are forbidden to forbid anyone else to use, share +!! and improve what you give them. Help stamp out software-hoarding! +!! +!! CHANGE LOG +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! +!! Define the verb VVENCODE. +!! +!! Parameters +!! +!! INPUT_FILE +!! +!! The file to be read and encoded. This parameter is required +!! (unless the /HELP qualifier is present) and must be a valid +!! VAX/VMS file specification. +!! +!! OUTPUT_FILE +!! +!! The encoded VVE file to be created by VVENCODE. This +!! parameter is optional, but if present, must be a valid +!! VAX/VMS file specification. +!! +!! Qualifiers +!! +!! /DEBUG +!! +!! generate copious debugging information +!! +!! /ENCODING_TABLE=file-spec +!! +!! specify a file containing the 64 character encoding table +!! used to encode/decode the file. The qualifier value is +!! required and must be a valid VAX/VMS file specification. +!! +!! /FORMAT=file_format +!! +!! specify the VVcode file format to be used when reading the +!! file. This qualifier is not normally required as the file +!! format will be determined automatically by the program. The +!! qualifier value is required and must be one of the values +!! defined for the CLD type 'file_format' (defined near the end +!! of this file): DEFAULT, FIXED, STREAM or VARIABLE. +!! +!! /HEADER_FILESPEC=string +!! +!! specify the file specification to be recorded in the VVE +!! file created by VVENCODE, to be subsequently used as the +!! default for the output file by VVDECODE. The qualifier value +!! is required and may be an arbitrary string. The value is not +!! checked or validated by VVENCODE. +!! +!! /HELP +!! +!! request a short summary of the command line syntax for +!! VVENCODE. NOTE: this qualifier invokes a special syntax +!! version of the verb that does not require an input file to be +!! specified. +!! +!! /LOG[=file_spec] +!! +!! specify a file to which status and logging information should +!! be written. The qualifier value is optional, but if present, +!! must be a valid VAX/VMS file specification. If absent, +!! logging information is written to SYS$OUTPUT. +!! +!! /MODE=file_mode +!! +!! specify the VVcode file mode to be used when reading the file. +!! This qualifier is not normally required as the file mode +!! will be determined automatically by the program. The +!! qualifier value is required and must be one of the values +!! defined for the CLD type 'file_mode' (defined near the end +!! of this file): BINARY or TEXT. +!! +!! /OVERWRITE +!! +!! specify that existing files can be overwritten by VVENCODE +!! without first requesting permission. On VAX/VMS, VVENCODE +!! would only request permission if the output file +!! specification included an explicit version number. +!! +!! /RECORD_LENGTH=decimal_number +!! +!! specify the maximum record length to be assumed when reading +!! a fixed or variable length record format file. This +!! qualifier is not normally required as the maximum record +!! length will be determined automatically by the program. The +!! qualifier value is required and must be an integer in the +!! supported for the different file formats (FIXED: 2 - 32767, +!! VARIABLE: 0 - 32765). +!! +!! /SPLIT_SIZE=decimal_number +!! +!! specify the maximum size in kilobytes of VVE file parts +!! created by VVENCODE. The qualifier value is required and must +!! be an integer no less than 4. +!! +!! /TIMESTAMP=time_value +!! +!! specify the timestamp to be recorded in the VVE file created +!! by VVENCODE, to be subsequently used by VVDECODE. The +!! qualifier value is optional, but if present, must be a VMS +!! absolute or combination time. If the qualifier value is +!! omitted the current date and time is used. This +!! qualifier is not normally required as the file timestamp +!! will be determined automatically by the program. +!! +!! /TRANSLATION_FILE=file_spec +!! +!! specify a file containing the rules for translating between +!! two character sets (e.g. ASCII -> EBCDIC). The qualifier +!! value is required and must be a valid VAX/VMS file +!! specification. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +define verb VVENCODE + image VVCODE_DIR:VVENCODE +! + parameter P1, + label=INPUT_FILE, + prompt="File_to_be_encoded", + value(required, type=$file) + parameter P2, + label=OUTPUT_FILE, + prompt="Output_File", + value(type=$file) +! + qualifier DEBUG + qualifier ENCODING_TABLE, + nonnegatable, + value(required, type=$file) + qualifier FORMAT, + nonnegatable, + value(required, type=FILE_FORMAT) + qualifier HEADER_FILESPEC, + nonnegatable, + value(required) + qualifier HELP, + syntax=VVENCODE_HELP + qualifier LOG + nonnegatable, + value(type=$file) + qualifier MODE, + nonnegatable, + value(required, type=FILE_MODE) + qualifier OVERWRITE, + negatable, + default + qualifier RECORD_LENGTH, + nonnegatable, + value(required, type=$number) + qualifier SPLIT_SIZE, + nonnegatable, + value(required, type=$number) + qualifier TIMESTAMP, + nonnegatable, + value(type=$datetime) + qualifier TRANSLATION_FILE, + nonnegatable, + value(required, type=$file) + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! +!! Define the verb VVDECODE. +!! +!! Parameters +!! +!! INPUT_FILE +!! +!! The encoded VVE file to be read and decoded. This parameter +!! is required (unless the /HELP qualifier is present) and must +!! be a valid VAX/VMS file specification. +!! +!! OUTPUT_FILE +!! +!! The decoded output file to be created by VVDECODE. This +!! parameter is optional, but if present, must be a valid +!! VAX/VMS file specification. +!! +!! Qualifiers +!! +!! /DEBUG +!! +!! generate copious debugging information +!! +!! /ENCODING_TABLE=file-spec +!! +!! specify a file containing the 64 character encoding table +!! used to encode/decode the file. The qualifier value is +!! required and must be a valid VAX/VMS file specification. +!! +!! /FORMAT=file_format +!! +!! specify the VVcode file format to be used to create the +!! output file. This qualifier is not normally required as the +!! VVE file specifies the format of the original file, but may +!! be used to override that value. The qualifier value is +!! required and must be one of the values defined for the CLD +!! type 'file_format' (defined near the end of this file): +!! DEFAULT, FIXED, STREAM or VARIABLE. +!! +!! /HELP +!! +!! request a short summary of the command line syntax for +!! VVDECODE. NOTE: this qualifier invokes a special syntax +!! version of the verb that does not require an input file to be +!! specified. +!! +!! /INDEX_FILE=file_spec +!! +!! specify a file containing the index of translation table +!! files to be used for translating between two character sets +!! (e.g. ASCII -> EBCDIC). The qualifier value is required and +!! must be a valid VAX/VMS file specification. This file is +!! used by VVDECODE if the file has been encoded using a +!! different character set and the /TRANSLATION_FILE qualifier +!! was not used to specify the translation table file. +!! +!! /LOG[=file_spec] +!! +!! specify a file to which status and logging information should +!! be written. The qualifier value is optional, but if present, +!! must be a valid VAX/VMS file specification. If absent, +!! logging information is written to SYS$OUTPUT. +!! +!! /MODE=file_mode +!! +!! specify the VVcode file mode to be used to create the +!! output file. This qualifier is not normally required as the +!! VVE file specifies the mode of the original file, but may +!! be used to override that value. The qualifier value is +!! required and must be one of the values defined for the CLD +!! type 'file_mode' (defined near the end of this file): +!! BINARY or TEXT. +!! +!! /OVERWRITE +!! +!! specify that existing files can be overwritten by VVDECODE +!! without first requesting permission. +!! +!! /PAD_CHARACTER=decimal_number +!! +!! specify the value of the character to be used to pad a fixed +!! length format output file to ensure that its length is an +!! exact multiple of the record length. The qualifier value is +!! required and must be an integer in the range 0 - 255. +!! +!! /RECORD_LENGTH=decimal_number +!! +!! specify the maximum record length to be used when creating +!! a fixed or variable length record format file. This +!! qualifier is not normally required as the VVE file specifies +!! the maximum record length of the original file. The +!! qualifier value is required and must be an integer in the +!! supported for the different file formats (FIXED: 2 - 32767, +!! VARIABLE: 0 - 32765). +!! +!! /TIMESTAMP=time_value +!! +!! specify the timestamp to be applied to the output file +!! created by VVDECODE. This qualifier is not normally required +!! as the VVE file specifies the timestamp of the original file. +!! The qualifier value is optional, but if present, must be a VMS +!! absolute or combination time. If the qualifier value is +!! omitted the current date and time is used. +!! +!! /TRANSLATION_FILE=file_spec +!! +!! specify a file containing the rules for translating between +!! two character sets (e.g. ASCII -> EBCDIC). The qualifier +!! value is required and must be a valid VAX/VMS file +!! specification. +!! +!! /UUDECODE +!! +!! specify that the input file is a UUencoded file and should be +!! decoded accordingly. This qualifier is provided to give +!! VVDECODE an element of backwards compatibility. NOTE: this +!! qualifier and the /XXDECODE qualifier are mutually exclusive. +!! +!! /XXDECODE +!! +!! specify that the input file is a XXencoded file and should be +!! decoded accordingly. This qualifier is provided to give +!! VVDECODE an element of backwards compatibility. NOTE: this +!! qualifier and the /UUDECODE qualifier are mutually exclusive. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +define verb VVDECODE + image VVCODE_DIR:VVDECODE +! + parameter P1, + label=INPUT_FILE, + prompt="File_to_be_decoded", + value(required, type=$file) + parameter P2, + label=OUTPUT_FILE, + prompt="Output_File", + value(type=$file) +! + qualifier DEBUG + qualifier ENCODING_TABLE, + nonnegatable, + value(required, type=$file) + qualifier FORMAT, + nonnegatable, + value(required, type=FILE_FORMAT) + qualifier HELP, + syntax=VVDECODE_HELP + qualifier INDEX_FILE, + nonnegatable, + value(required, type=$file) + qualifier LOG + nonnegatable, + value(type=$file) + qualifier MODE, + nonnegatable, + value(required, type=FILE_MODE) + qualifier OVERWRITE, + negatable, + default + qualifier PAD_CHARACTER, + nonnegatable, + value(required, type=$number) + qualifier RECORD_LENGTH, + nonnegatable, + value(required, type=$number) + qualifier TIMESTAMP, + nonnegatable, + value(type=$datetime) + qualifier TRANSLATION_FILE, + nonnegatable, + value(required, type=$file) + qualifier UUDECODE, + nonnegatable + qualifier XXDECODE, + nonnegatable + disallow UUDECODE AND XXDECODE + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! +!! Define an alternative syntax for VVENCODE & VVDECODE so that the user can +!! issue the command VVENCODE /HELP without being forced to specify a file +!! parameter. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +define syntax VVENCODE_HELP + image VVCODE_DIR:VVENCODE + noparameters + +define syntax VVDECODE_HELP + image VVCODE_DIR:VVDECODE + noparameters + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! +!! Define the keywords that can be specified as values for the /FORMAT +!! qualifier. No default value is specified because the value is normally +!! determined from the input file. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +define type FILE_FORMAT + keyword DEFAULT, + keyword FIXED, + keyword STREAM, + keyword VARIABLE + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! +!! Define the keywords that can be specified as values for the /MODE +!! qualifier. No default value is specified because the value is normally +!! determined from the input file. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +define type FILE_MODE + keyword BINARY, + keyword TEXT diff --git a/support/vvcode/vvdecode.c b/support/vvcode/vvdecode.c new file mode 100644 index 0000000000..d31fe5babc --- /dev/null +++ b/support/vvcode/vvdecode.c @@ -0,0 +1,3562 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vvdecode.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** +** MODULE CONTENTS +** +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + + +#define VVDECODE 1 +#define VVCODE_MAIN 1 + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + + +/*- +**---------------------------------------------------------------------------- +** Include the machine specific definitions +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" +#include "vveparse.h" + + +/*- +**---------------------------------------------------------------------------- +** Forward declarations of functions in this file +**---------------------------------------------------------------------------- +*/ +int main ARGS ((CONST int argc, + CONST char *argv[])); +Boolean choose_xlt_table ARGS ((CONST Qualifier_Struct *xlt_qualifier, + CONST Qualifier_Struct *idx_qualifier, + CONST char *from_charset, + CONST char *to_charset, + File_Info *xlt_file)); +void decode ARGS ((void)); +Int16 decode_bytes ARGS ((CONST Int16 bytes_left, + CONST char *ip_buf_ptr, + char *op_buf_ptr)); +void find_next_part ARGS ((CONST Int16 part_needed, + File_Info *ip_file_ptr)); +void initialize ARGS ((void)); +void open_ip_file ARGS ((CONST Qualifier_Struct *ip_qualifier, + File_Info *ip_file)); +void open_next_part ARGS ((CONST Int16 part_needed, + File_Info *ip_file)); +void open_op_file ARGS ((CONST Qualifier_Struct *op_qualifier, + CONST Int16 overwrite_flag, + CONST char *vve_hdr_spec, + File_Info *op_file)); +char *parse_enc_tbl ARGS ((CONST char *line_ptr, + Header_Struct *hdr_struct, + File_Info *ip_file)); +Boolean prs_idx_file ARGS ((CONST char *from_charset, + CONST char *to_charset, + File_Info *idx_file, + File_Info *xlt_file)); +void rdfi_headers ARGS ((CONST Int16 decoding_type, + File_Info *ip_file, + Header_Struct *vve_hdr_array)); +void rdfi_trailers ARGS ((CONST Int16 decoding_type, + File_Info *ip_file, + File_Info *vve_file, + Header_Struct *vve_hdr_array)); +void set_decoding_type ARGS ((CONST Qualifier_Struct *uu_qualifier, + CONST Qualifier_Struct *xx_qualifier, + Int16 *decoding_type, + char **vve_line_prefix, + char **vve_eol_marker)); +void set_enc_tbl ARGS ((CONST Qualifier_Struct *enc_qualifier, + CONST Int16 enc_tbl_len, + char *encode_table)); +void set_format ARGS ((CONST Qualifier_Struct *fmt_qualifier, + CONST File_Info *vve_file, + CONST char *vve_os_str, + CONST char *fmt_str_array[], + File_Info *op_file)); +Boolean set_idx_file ARGS ((CONST Qualifier_Struct *idx_qualifier, + File_Info *idx_file)); +void set_mode ARGS ((CONST Qualifier_Struct *mode_qualifier, + CONST File_Info *vve_file, + CONST char *mode_str_array[], + File_Info *op_file)); +void set_pad_char ARGS ((CONST Qualifier_Struct *pad_qualifier, + CONST File_Info *op_file, + char *pad_char)); +void set_record_len ARGS ((CONST Qualifier_Struct *rec_qualifier, + CONST File_Info *vve_file, + File_Info *op_file)); +void set_timestamp ARGS ((CONST Qualifier_Struct *time_qualifier, + CONST File_Info *vve_file, + File_Info *op_file)); +void terminate ARGS ((void)); +void usage_error ARGS ((CONST char *reason)); + + + +/*- +**============================================================================ +** +** FUNCTION +** +** choose_xlt_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** xlt_file +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** TRUE - a candidate translation file was found +** FALSE - a candidate translation file could not be +** identified +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) +Boolean choose_xlt_table (CONST Qualifier_Struct *xlt_qualifier, + CONST Qualifier_Struct *idx_qualifier, + CONST char *from_charset, + CONST char *to_charset, + File_Info *xlt_file) +#else /* NOT (ANSI_SYNTAX) */ +Boolean choose_xlt_table (xlt_qualifier, idx_qualifier, xlt_file, + from_charset, to_charset) + CONST Qualifier_Struct *xlt_qualifier; + CONST Qualifier_Struct *idx_qualifier; + CONST char *from_charset; + CONST char *to_charset; + File_Info *xlt_file; +#endif /* (ANSI_SYNTAX) */ +{ + File_Info idx_file; + Boolean status; + + /*- + **------------------------------------------------------------------------ + ** If the /TRANSLATION_FILE qualifier was specified, we use its value as + ** the file specification for the translation table file. + **------------------------------------------------------------------------ + */ + if (xlt_qualifier->present == TRUE) + { + strcpy (xlt_file->file_spec, xlt_qualifier->value); + + /*- + **-------------------------------------------------------------------- + ** If an extension has not been provided, use the default extension + ** for the translation table file. + **-------------------------------------------------------------------- + */ +#if (STICKY_DEFAULTS) + apply_defaults (NULL, DEF_XLT_EXT, xlt_file->file_spec); +#endif /* (STICKY_DEFAULTS) */ + + return (TRUE); + } + + /*- + **------------------------------------------------------------------------ + ** The /TRANSLATION_FILE qualifier was not specified, so we look for an + ** index file that might specify which translation file to use. The + ** function set_idx_file() will determine which index file to use or + ** return FALSE if it couldn't. + **------------------------------------------------------------------------ + */ + status = set_idx_file (idx_qualifier, &idx_file); + + if (status != TRUE) + { + LOGMSG ("\nTranslation index file: none"); + return (FALSE); + } + LOGMSG_1 ("\nTranslation index file: %s", idx_file.file_spec); + + /*- + **------------------------------------------------------------------------ + ** Now parse the index file to see if it contains an entry for the + ** desired character set translation. + **------------------------------------------------------------------------ + */ + status = prs_idx_file (from_charset, to_charset, &idx_file, xlt_file); + return (status); +} /* choose_xlt_table */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** DEC_BYTE +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#define DEC_BYTE(_from,_to) \ + if (G_decode_table[(int) (_from)] == INV_TABLE_ENTRY)\ + {\ + FATALMSG_4 ("invalid character %d (0x%02X) on line %ld of file `%s'",\ + (int) (_from), (int) (_from), G_ip_file.line_no,\ + G_ip_file.file_spec);\ + vv_exit ();\ + }\ + else\ + {\ + _to = G_decode_table[(int) (_from)];\ + } + + + +/*- +**============================================================================ +** +** FUNCTION +** +** decode +** +** DESCRIPTION +** +** [tbs] +** +** VVE O/P O/P Conversion +** Fmt Fmt Func Type +** -------------------------------------------------------------------- +** FIX FIX write_bytes() byte copy, filling records and +** wrapping round record boundaries. +** If necessary, the last O/P record +** will be padded. +** FIX STM write_bytes() byte copy. +** FIX VAR write_bytes() byte copy, filling records to +** maximum length and wrapping data +** round record boundaries. +** +** STM FIX write_bytes() byte, filling records and +** wrapping round record boundaries. +** If necessary, the last O/P record +** will be padded. +** STM STM write_bytes() byte copy +** STM VAR write_bytes() byte copy, filling records to +** maximum length and wrapping data +** round record boundaries. +** +** VAR FIX write_bytes() record byte copy, filling records +** and wrapping round record +** boundaries. If necessary, the last +** O/P record will be padded. +** VAR STM write_bytes() record byte copy +** VAR VAR write_record() record copy, truncating any +** overlong records +** -------------------------------------------------------------------- +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void decode (void) +#else /* NOT (ANSI_SYNTAX) */ + void decode () +#endif /* (ANSI_SYNTAX) */ +{ + Int16 bytes_left; + SIZE_T idx; + Int32 buffer_size; + Int16 bytes_decoded; + SIZE_T bytes_expected; + Int16 decode_state; + Int16 hdr_no; + char *ip_buf_ptr; + Int16 no_bytes_encoded; + char *op_buf_ptr; + Int16 part_ending; + Int32 rec_bytes_left; + char *record_buffer; + Int32 record_length; + char var_rec_size[32]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_2 ("\nPart %3d I/P file: %s", + G_ippt_no, G_ip_file.file_spec); + LOGMSG_2 ("Part %3d starts on line: %ld", + G_ippt_no, G_ip_file.line_no); + + /*- + **------------------------------------------------------------------------ + ** Allocate space to decode data. If the VVE file contains variable + ** length records, the decoded data bytes are accumulated in a buffer + ** before being written. + ** + ** The size of IO_BUFFER_SIZE should be chosen so that most of the + ** records received can be accommodated. If an unusually large record is + ** encountered, a larger buffer will be allocated on demand. + **------------------------------------------------------------------------ + */ + buffer_size = IO_BUFFER_SIZE; + record_buffer = allocate_buffer ((SIZE_T) buffer_size, "record_buffer"); + decode_state = DECODE_REC_LEN; + op_buf_ptr = record_buffer; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (;;) + { + ip_buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, + G_ip_buffer, &G_ip_file, &G_ippart_bytes); + + if (ip_buf_ptr == NULL) + { + if (feof (G_ip_file.file_ptr)) + { + FATALMSG ("premature EOF encountered while decoding"); + } + else + { + FATALMSG ("error reading encoded data"); + } + show_file_context (&G_ip_file, NULL); + explain_error (); + vv_exit (); + } + + /*- + **-------------------------------------------------------------------- + ** Decode the byte count character. If it's less than zero, something + ** has gone wrong. + **-------------------------------------------------------------------- + */ + DEC_BYTE (ip_buf_ptr[0], no_bytes_encoded); + ip_buf_ptr++; + + if (no_bytes_encoded < 0) + { + FATALMSG_1 ("invalid encoded byte count (%d)", no_bytes_encoded); + show_file_context (&G_ip_file, ip_buf_ptr); + vv_exit (); + } + + /*- + **-------------------------------------------------------------------- + ** If the byte count is zero, we're at the end of this segment. The + ** next line must be an 'end' or 'skipfrom' header line. + **-------------------------------------------------------------------- + */ + if (no_bytes_encoded == 0) + { + ip_buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, + G_ip_buffer, &G_ip_file, + &G_ippart_bytes); + + if (ip_buf_ptr == NULL) + { + FATALMSG ("error reading encoded data"); + show_file_context (&G_ip_file, NULL); + explain_error (); + vv_exit (); + } + + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + hdr_no = header_type (&G_ip_file, ip_buf_ptr, G_vvehdr); + + switch (hdr_no) + { + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + case HDR_END: + LOGMSG_2 ("Part %3d ends on line: %ld", + G_ippt_no, G_ip_file.line_no); + return; + + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + case HDR_SKIPTO: + if (G_dec_type != VV_DECODING) + { + FATALMSG_1 ("`%s' header only allowed in VVE files", + G_vvehdr[HDR_SKIPTO].h_string); + show_file_context (&G_ip_file, ip_buf_ptr); + vv_exit (); + } + parse_header (&G_ip_file, ip_buf_ptr, &G_vvehdr[hdr_no]); + sscanf (G_vvehdr[hdr_no].value, "%hd", &part_ending); + + G_ippt_no++; + if (part_ending != G_ippt_no) + { + FATALMSG_2 ("Unexpected `%s %d'", + G_vvehdr[HDR_SKIPTO].h_string, part_ending); + show_file_context (&G_ip_file, ip_buf_ptr); + vv_exit (); + } + + LOGMSG_2 ("Part %3d ends on line: %ld", + part_ending - 1, G_ip_file.line_no); + find_next_part (G_ippt_no, &G_ip_file); + continue; + + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + default: + FATALMSG ("invalid header found"); + show_file_context (&G_ip_file, ip_buf_ptr); + vv_exit (); + } + } + + /*- + **-------------------------------------------------------------------- + ** Check that there are enough characters in the line. The encoded + ** characters are always written in fours. + **-------------------------------------------------------------------- + */ + bytes_expected = (SIZE_T) (4 * ((no_bytes_encoded + 2) / 3)); + + if (G_eol_marker != NULL) + { + bytes_expected += strlen (G_eol_marker); + } + + if (strlen (ip_buf_ptr) < bytes_expected) + { + ERRORMSG_2 ("%d characters expected - %d found", + bytes_expected, strlen (ip_buf_ptr)); + show_file_context (&G_ip_file, ip_buf_ptr); + break; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (G_vv_file.format != FMT_VARIABLE) + { + + /*- + **---------------------------------------------------------------- + ** The VVE file was encoded in stream or fixed mode, so decode + ** this line of bytes and then write them, updating the CRC as we + ** go. + **---------------------------------------------------------------- + */ + op_buf_ptr = record_buffer; + bytes_left = no_bytes_encoded; + + while (bytes_left > 0) + { + bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr, + op_buf_ptr); + ip_buf_ptr += 4; + op_buf_ptr += bytes_decoded; + bytes_left -= bytes_decoded; + } + + for (idx = 0; idx < (SIZE_T) no_bytes_encoded; idx++) + { + UPDATE_CRC32 (G_op_file.crc32, record_buffer[idx]); + } + + /*- + **---------------------------------------------------------------- + ** If the /TRANSLATE command qualifier was specified, translate + ** the bytes read to the destination character set. + **---------------------------------------------------------------- + */ + if (Q_TRANSLATE) + { + for (idx = 0; idx < (SIZE_T) no_bytes_encoded; idx++) + { + record_buffer[idx] = + (char) G_xlt_table.xlt_tbl[(Byte) record_buffer[idx]]; + } + } + + + write_bytes ((Int32) no_bytes_encoded, record_buffer, &G_op_file); + G_op_file.bytecount += (Int32) no_bytes_encoded; + } + else + { + + /*- + **---------------------------------------------------------------- + ** The VVE file contains variable length records which are much + ** more difficult to process. + ** + ** If at the beginning of a record, treat the first two decoded + ** bytes as the record length. + **---------------------------------------------------------------- + */ + if (decode_state == DECODE_REC_LEN) + { + bytes_decoded = decode_bytes (2, ip_buf_ptr, var_rec_size); + record_length = 256L * (((Int32) var_rec_size[0]) & 0xff); + record_length += (((Int32) var_rec_size[1]) & 0xff); + + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + if ((record_length < 0L) || (record_length > MAX_VV_RECORD_LEN)) + { + FATALMSG_1 ("invalid record length recorded (%ld)", + (Int32) record_length); + show_file_context (&G_ip_file, ip_buf_ptr); + vv_exit (); + } + + /*- + **------------------------------------------------------------ + ** If this record is longer than the current buffer size, we + ** need to reallocate a larger buffer that most of the + ** records received can be accommodated. If an unusually + ** large record is encountered, a larger buffer will be + ** allocated on demand. + **------------------------------------------------------------ + */ + if (record_length > buffer_size) + { + record_buffer = (char *) realloc (record_buffer, + (SIZE_T) record_length); + if (record_buffer == NULL) + { + FATALMSG_1 ("couldn't reallocate %ld bytes \ +for the record buffer", record_length); + vv_exit (); + } + buffer_size = record_length; + DEBUG_1 ("decode: reallocated %ld bytes for the \ +record buffer", record_length); + } + + /*- + **------------------------------------------------------------ + ** The buffer is definitely big enough to hold the record, so + ** start decoding the encoded bytes into the buffer. + ** + ** NOTE + ** + ** We need to discard the first two decoded bytes which + ** contain the record length to avoid a full length record + ** overflowing the buffer. + **------------------------------------------------------------ + */ + bytes_left = no_bytes_encoded; + op_buf_ptr = record_buffer; + bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr, + op_buf_ptr); + ip_buf_ptr += 4; + op_buf_ptr[0] = op_buf_ptr[2]; + ++op_buf_ptr; + bytes_left -= bytes_decoded; + + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + while (bytes_left > 0) + { + bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr, + op_buf_ptr); + ip_buf_ptr += 4; + op_buf_ptr += bytes_decoded; + bytes_left -= bytes_decoded; + } + + decode_state = DECODE_DATA; + rec_bytes_left = record_length; + no_bytes_encoded -= 2; + rec_bytes_left -= (Int32) no_bytes_encoded; + } + else + { + + /*- + **------------------------------------------------------------ + ** We're part of the way through a record, so just decode the + ** bytes and append the result to the record buffer. + **------------------------------------------------------------ + */ + bytes_left = no_bytes_encoded; + + while (bytes_left > 0) + { + bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr, + op_buf_ptr); + ip_buf_ptr += 4; + op_buf_ptr += bytes_decoded; + bytes_left -= bytes_decoded; + } + rec_bytes_left -= (Int32) no_bytes_encoded; + } + + + /*- + **---------------------------------------------------------------- + ** If all of this record has now been read and decoded into + ** 'record_buffer', write it to the output file. + **---------------------------------------------------------------- + */ + if (rec_bytes_left <= 0L) + { + for (idx = 0; idx < (SIZE_T) record_length; idx++) + { + UPDATE_CRC32 (G_op_file.crc32, record_buffer[idx]); + } + + /*- + **------------------------------------------------------------ + ** If the /TRANSLATE command qualifier was specified, + ** translate the bytes read to the destination character set. + **------------------------------------------------------------ + */ + if (Q_TRANSLATE) + { + for (idx = 0; idx < (SIZE_T) record_length; idx++) + { + record_buffer[idx] = + (char) G_xlt_table.xlt_tbl[(Byte) record_buffer[idx]]; + } + } + + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + if (G_op_file.format == FMT_VARIABLE) + { + write_record (record_length, record_buffer, &G_op_file); + } + else + { + write_bytes (record_length, record_buffer, &G_op_file); + } + decode_state = DECODE_REC_LEN; + G_op_file.bytecount += (Int32) record_length; + } + } + } /* end for (;;) */ + free (record_buffer); +} /* decode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** decode_bytes +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int16 decode_bytes (CONST Int16 bytes_left, + CONST char *ip_buf_ptr, + char *op_buf_ptr) +#else /* NOT (ANSI_SYNTAX) */ + Int16 decode_bytes (bytes_left, ip_buf_ptr, op_buf_ptr) + CONST Int16 bytes_left; + CONST char *ip_buf_ptr; + char *op_buf_ptr; +#endif /* (ANSI_SYNTAX) */ +{ + register Int16 tmp0; + register Int16 tmp1; + register Int16 tmp2; + register Int16 tmp3; + register Int16 c1; + register Int16 c2; + register Int16 c3; + register Int16 bytes_decoded; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + bytes_decoded = 0; + + if (bytes_left >= 1) + { + DEC_BYTE (ip_buf_ptr[0], tmp0); + DEC_BYTE (ip_buf_ptr[1], tmp1); + c1 = (Int16) (tmp0 << 2) | (tmp1 >> 4); + op_buf_ptr[0] = (char) c1; + ++bytes_decoded; + } + + if (bytes_left >= 2) + { + DEC_BYTE (ip_buf_ptr[2], tmp2); + c2 = (Int16) (tmp1 << 4) | (tmp2 >> 2); + op_buf_ptr[1] = (char) c2; + ++bytes_decoded; + } + + if (bytes_left >= 3) + { + DEC_BYTE (ip_buf_ptr[3], tmp3); + c3 = (Int16) (tmp2 << 6) | (tmp3); + op_buf_ptr[2] = (char) c3; + ++bytes_decoded; + } + return (bytes_decoded); +} /* decode_bytes */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** find_next_part +** +** DESCRIPTION +** +** [tbs] +** +** NOTE: if every part is in a file of its own there will be an +** overhead of reading each file TWICE before trying to open +** the new file for the next part. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void find_next_part (CONST Int16 part_needed, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void find_next_part (part_needed, ip_file) + CONST Int16 part_needed; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *buf_ptr; + Int16 hdr_no; + Int32 start_line_no; + Int16 search_pass; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (part_needed > MAX_VV_PARTS) + { + FATALMSG_1 ("maximum number of parts reached (%d)", MAX_VV_PARTS); + vv_exit (); + } + search_pass = 1; + start_line_no = ip_file->line_no; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, G_ip_buffer, + ip_file, &G_ippart_bytes); + for (;;) + { + if (buf_ptr == NULL) + { + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + if (feof (ip_file->file_ptr)) + { + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + if (ip_file->pipe_flag == TRUE) + { + FATALMSG_1 ("EOF encountered on search pass %d", + search_pass); + show_file_context (&G_ip_file, NULL); + vv_exit (); + } + else + { + DEBUG_1 ("find_next_part: EOF encountered on search \ +pass %d", search_pass); + DEBUG_2 ("find_next_part: Context: line %ld of file `%s'", + ip_file->line_no, ip_file->file_spec); + } + + /*- + **------------------------------------------------------------ + ** + **------------------------------------------------------------ + */ + switch (search_pass) + { + case 1: + DEBUG_1 ("find_next_part: Rewinding file `%s'", + ip_file->file_spec); + rewind (ip_file->file_ptr); + ip_file->line_no = 0; + search_pass = 2; + buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, + G_vv_prefix, G_ip_buffer, + ip_file, &G_ippart_bytes); + continue; + case 3: + FATALMSG_2 ("couldn't find part %d in file `%s'", + part_needed, ip_file->file_spec); + vv_exit (); + case 2: + default: + FATALMSG_1 ("EOF encountered on search pass %d", + search_pass); + show_file_context (ip_file, NULL); + vv_exit (); + } + } + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + else + { + FATALMSG ("error reading file"); + show_file_context (ip_file, NULL); + explain_error (); + vv_exit (); + } + } + + /*- + **-------------------------------------------------------------------- + ** If on pass two, avoid redundant re-reading of the lines read on + ** pass one. + **-------------------------------------------------------------------- + */ + if ((search_pass == 2) && (ip_file->line_no >= start_line_no)) + { + DEBUG_2 ("find_next_part: Couldn't find part %d in file `%s'", + part_needed, ip_file->file_spec); + f_close (ip_file); + open_next_part (part_needed, ip_file); + search_pass = 3; + ip_file->line_no = 0; + } + + /*- + **-------------------------------------------------------------------- + ** Check whether this line is a header line. The only header lines + ** processed are the SKIPFROM and TABLE headers. + **-------------------------------------------------------------------- + */ + hdr_no = header_type (ip_file, buf_ptr, G_vvehdr); + + /*- + **-------------------------------------------------------------------- + ** If a SKIPFROM header is encountered and an encoding table was not + ** specified on the command line, it is checked to see if it + ** corresponds to the start of wanted part. + **-------------------------------------------------------------------- + */ + if (hdr_no == HDR_SKIPFROM) + { + if (chk_skipfrom (buf_ptr, part_needed, G_hdrf_spec, + &G_vvehdr[HDR_SKIPFROM], ip_file) == TRUE) + { + LOGMSG_2 ("Part %3d starts on line: %ld", + part_needed, ip_file->line_no); + return; + } + } + + /*- + **-------------------------------------------------------------------- + ** If a TABLE header is encountered and the table contents were not + ** specified on the command line, the encoding table is updated. + **-------------------------------------------------------------------- + */ + else + if ((!Q_ENCODE) && (hdr_no == HDR_TABLE)) + { + buf_ptr = parse_enc_tbl (buf_ptr, &G_vvehdr[HDR_TABLE], ip_file); + + if (buf_ptr == NULL) + { + FATALMSG ("error reading encoding table"); + show_file_context (ip_file, NULL); + vv_exit (); + } + strcpy ((char *) G_encode_table, G_vvehdr[HDR_TABLE].value); + continue; + } + buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, + G_ip_buffer, ip_file, &G_ippart_bytes); + } +} /* find_next_part */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** initialize +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void initialize (void) +#else /* NOT (ANSI_SYNTAX) */ + void initialize () +#endif /* (ANSI_SYNTAX) */ +{ + char *def_file_name; + Boolean status; + File_Info xlt_file; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + G_ip_file.line_no = 0; + G_ippt_no = 1; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + open_ip_file (&G_cmd_ipfile, &G_ip_file); + def_file_name = allocate_buffer ((MAX_PATH + 1), "def_file_name"); + (void) split_file_spec (G_ip_file.file_spec, NULL, def_file_name, + NULL, NULL); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (Q_OVERWRITE) + { + G_overwrite_flag = OVERWRITE_YES; + } + else + if (G_ip_file.pipe_flag == TRUE) + { + G_overwrite_flag = OVERWRITE_NO; + } + else + { + G_overwrite_flag = OVERWRITE_ASK; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + open_log_file (&G_cmdqual[CMDQ_LOG], def_file_name, G_overwrite_flag, + &G_log_file); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_3 ("VVdecode %s, %s release (%s)\n", + VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE); + LOGMSG_1 ("I/P file: %s", G_ip_file.file_spec); + LOGMSG_1 ("Overwrite existing files: %s", + (Q_OVERWRITE ? "yes" : "no")); + LOGMSG_1 ("Log file: %s", G_log_file.file_spec); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + (void) tz_offset (time ((TIME_T) NULL)); + set_decoding_type (&G_cmdqual[CMDQ_UUDECODE], &G_cmdqual[CMDQ_XXDECODE], + &G_dec_type, &G_vv_prefix, &G_eol_marker); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + rdfi_headers (G_dec_type, &G_ip_file, G_vvehdr); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (G_dec_type == VV_DECODING) + { + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + getv_decodeversion (&G_vvehdr[HDR_DECODEVERSION], + &G_vv_decode_version); + + if (G_vv_decode_version > (Int16) VV_MAJOR_VERSION_NO) + { + FATALMSG_2 ("VVdecode version %hd.0 or later is\ +required to decode file `%s'\n", + G_vv_decode_version, G_ip_file.file_spec); + vv_exit (); + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + G_vv_file.file_spec[0] = '\0'; + getv_mode (&G_vvehdr[HDR_MODE], G_mode_str, &G_vv_file); + getv_format (&G_vvehdr[HDR_FORMAT], G_fmt_str, &G_vv_file); + getv_reclen (&G_vvehdr[HDR_RECORDLEN], &G_vv_file); + getv_timestamp (&G_vvehdr[HDR_TIMESTAMP], &G_vv_file); + } + else + { + G_vv_decode_version = 0; + G_vv_file.file_spec[0] = '\0'; + G_vv_file.format = FMT_STREAM; + G_vv_file.mode = MODE_BINARY; + G_vv_file.mod_time = INV_TIMESTAMP; + G_vv_file.max_rec_len = INV_RECORD_LEN; + G_vv_file.lng_rec_len = INV_RECORD_LEN; + } + getv_operatingsystem (&G_vvehdr[HDR_OPERATINGSYSTEM], + &G_vv_operating_system); + getv_characterset (&G_vvehdr[HDR_CHARACTERSET], &G_vv_character_set); + + LOGMSG_1 ("VVE header file spec: %s", G_hdrf_spec); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + set_enc_tbl (&G_cmdqual[CMDQ_ENCODE], ENCODE_TABLE_LEN, G_encode_table); + set_dec_tbl (ENCODE_TABLE_LEN, G_encode_table, DECODE_TABLE_LEN, + G_decode_table); + + /*- + **------------------------------------------------------------------------ + ** ***CHANGES*** + **------------------------------------------------------------------------ + */ + G_xlt_table.xlt_from = NULL; + G_xlt_table.xlt_to = NULL; + + if ((Q_TRANSLATE) || (STRCMPI (G_vv_character_set, VV_CHARACTERSET) != 0)) + { + status = choose_xlt_table (&G_cmdqual[CMDQ_TRANSLATE], + &G_cmdqual[CMDQ_INDEXFILE], + G_vv_character_set, VV_CHARACTERSET, + &xlt_file); + + if (status == TRUE) + { + set_xlt_tbl (&xlt_file, &G_xlt_table, G_xlthdr); + } + else + { + LOGMSG ("\nTranslation performed: none"); + } + } + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((G_xlt_table.xlt_from != NULL) && (G_xlt_table.xlt_to != NULL)) + { + if (STRCMPI (G_vv_character_set, G_xlt_table.xlt_from) != 0) + { + WARNMSG_2 ("translation file translates from `%s' to `%s'", + G_xlt_table.xlt_from, G_xlt_table.xlt_to); + INFOMSG_1 ("VVE file character set is `%s'", G_vv_character_set); + } + + if (STRCMPI (VV_CHARACTERSET, G_xlt_table.xlt_to) != 0) + { + WARNMSG_2 ("translation file translates from `%s' to `%s'", + G_xlt_table.xlt_from, G_xlt_table.xlt_to); + INFOMSG_1 ("local character set is `%s'", VV_CHARACTERSET); + } + } /* if (xlt_file != NULL) */ + else + { + if (STRCMPI (G_vv_character_set, VV_CHARACTERSET) != 0) + { + WARNMSG_1 ("VVE file character set is `%s'", G_vv_character_set); + INFOMSG_1 ("local character set is `%s'", VV_CHARACTERSET); + } + } + + /*- + **------------------------------------------------------------------------ + ** Set the key File_Info parameters, taking into account the file + ** parameters and the command line qualifier values. + **------------------------------------------------------------------------ + */ + set_mode (&G_cmdqual[CMDQ_MODE], &G_vv_file, G_mode_str, &G_op_file); + set_format (&G_cmdqual[CMDQ_FORMAT], &G_vv_file, G_vv_operating_system, + G_fmt_str, &G_op_file); + set_record_len (&G_cmdqual[CMDQ_RECORDLEN], &G_vv_file, &G_op_file); + set_timestamp (&G_cmdqual[CMDQ_TIMESTAMP], &G_vv_file, &G_op_file); + set_pad_char (&G_cmdqual[CMDQ_PADCHAR], &G_op_file, &G_op_padchar); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + open_op_file (&G_cmd_opfile, G_overwrite_flag, G_hdrf_spec, &G_op_file); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + init_crc32_table (CRC32_TABLE_SIZE, CRC32_POLYNOMIAL, G_crc32_table); + G_op_file.crc32 = CRC32_MASK; + G_op_file.bytecount = 0L; + G_ip_file.bytecount = 0L; + G_ippart_bytes = 0L; + free (def_file_name); +} /* initialize */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** open_ip_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void open_ip_file (CONST Qualifier_Struct *ip_qualifier, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void open_ip_file (ip_qualifier, ip_file) + CONST Qualifier_Struct *ip_qualifier; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (ip_qualifier->present != TRUE) + { + INTERNAL_ERROR ("open_ip_file"); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + ip_file->file_ptr = (FILE *) NULL; + ip_file->mode = MODE_TEXT; + ip_file->format = DEF_TEXT_FMT; + ip_file->max_rec_len = INV_RECORD_LEN; + ip_file->lng_rec_len = INV_RECORD_LEN; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (STRCMP (ip_qualifier->value, STDIO_SYMBOL) == 0) + { + strcpy (ip_file->file_spec, "stdin"); + ip_file->file_ptr = stdin; + ip_file->pipe_flag = TRUE; + } + else + { + strcpy (ip_file->file_spec, ip_qualifier->value); + + /*- + **-------------------------------------------------------------------- + ** Apply the default file extension for VVencoded files. + **-------------------------------------------------------------------- + */ +#if (STICKY_DEFAULTS) + apply_defaults (NULL, DEF_VV_EXT, ip_file->file_spec); +#endif /* (STICKY_DEFAULTS) */ + + + DEBUG_1 ("open_ip_file: opening input file `%s'", ip_file->file_spec); + ip_file->file_ptr = f_open_in (ip_file); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (ip_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening input file `%s'", ip_file->file_spec); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((ip_file->pipe_flag == TRUE) || (is_a_file (ip_file) == FALSE)) + { + DEBUG_1 ("open_ip_file: `%s' is not a regular file", + ip_file->file_spec); + ip_file->pipe_flag = TRUE; + set_pipe_mode (ip_file); + } +} /* open_ip_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** open_next_part +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void open_next_part (CONST Int16 part_needed, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void open_next_part (part_needed, ip_file) + CONST Int16 part_needed; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char file_ext[MAX_EXT + 1]; + char prompt_str[65]; + + SPRINTF (file_ext, VV_EXT_FMT, part_needed); + force_file_ext (file_ext, ip_file->file_spec); + + if (!file_exists (ip_file->file_spec)) + { + ERRORMSG_2 ("couldn't find part %d file `%s'", + part_needed, ip_file->file_spec); + SPRINTF (prompt_str, "Enter file specification for part %d: ", + part_needed); + prompt_for_string (prompt_str, MAX_PATH, ip_file->file_spec); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + DEBUG_1 ("open_ip_file: opening input file `%s'", ip_file->file_spec); + ip_file->file_ptr = f_open_in (ip_file); + + if (ip_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("couldn't open part file `%s'", ip_file->file_spec); + vv_exit (); + } + LOGMSG_2 ("\nPart %3d I/P file: %s", + part_needed, ip_file->file_spec); +} /* open_next_part */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** open_op_file +** +** DESCRIPTION +** +** [tbs] +** +** Cmd VVE STICKY Result +** ------------------------------- +** Y N * Cmd +** Y Y N Cmd +** Y Y Y Cmd + VVE +** N Y * VVE +** N N * Error +** ------------------------------- +** +** Notes: 1. The VVE file specification is checked by legal_filespec() +** and transformed if appropriate. +** 2. 'Cmd + VVE' means that the command line value is used, +** with name/extension components taken from the VVE value if +** STICKY_DEFAULTS has been defined for the implementation. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void open_op_file (CONST Qualifier_Struct *op_qualifier, + CONST Int16 overwrite_flag, + CONST char *vve_hdr_spec, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void open_op_file (op_qualifier, overwrite_flag, + vve_hdr_spec, op_file) + CONST Qualifier_Struct *op_qualifier; + CONST Int16 overwrite_flag; + CONST char *vve_hdr_spec; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *vv_file_name; + char *vv_file_ext; + char *legal_hdrf_spec; + + op_file->file_ptr = (FILE *) NULL; + legal_hdrf_spec = allocate_buffer ((MAX_PATH + 1), "legal_hdrf_spec"); + vv_file_name = allocate_buffer ((MAX_PATH + 1), "vv_file_name"); + vv_file_ext = allocate_buffer ((MAX_PATH + 1), "vv_file_ext"); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (op_qualifier->present == TRUE) + { + if (STRCMP (op_qualifier->value, STDIO_SYMBOL) == 0) + { + op_file->pipe_flag = TRUE; + strcpy (op_file->file_spec, "stdout"); + op_file->file_ptr = stdout; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + else + { + strcpy (op_file->file_spec, op_qualifier->value); + +#if (STICKY_DEFAULTS) + if (VVEH_BEGIN) + { + strcpy (legal_hdrf_spec, legal_filespec (vve_hdr_spec)); + (void) split_file_spec (legal_hdrf_spec, NULL, + vv_file_name, vv_file_ext, NULL); + apply_defaults (vv_file_name, vv_file_ext, op_file->file_spec); + } +#endif /* (STICKY_DEFAULTS) */ + + DEBUG_1 ("open_op_file: opening output file `%s'", + op_file->file_spec); + op_file->file_ptr = f_open_out (overwrite_flag, op_file); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + if (VVEH_BEGIN) + { + strcpy (op_file->file_spec, legal_filespec (vve_hdr_spec)); + DEBUG_1 ("open_op_file: opening output file `%s'", op_file->file_spec); + op_file->file_ptr = f_open_out (overwrite_flag, op_file); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + { + INTERNAL_ERROR ("open_op_file"); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (op_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening output file `%s'", op_file->file_spec); + vv_exit (); + } + LOGMSG_1 ("O/P file: %s", op_file->file_spec); + + /*- + **------------------------------------------------------------------------ + ** Try to detect whether the output file is actually a character device + ** like a comms port. If it is, treat it as a pipe. + **------------------------------------------------------------------------ + */ + if ((op_file->pipe_flag == TRUE) || (is_a_file (op_file) == FALSE)) + { + DEBUG_1 ("open_op_file: `%s' is not a regular file", + op_file->file_spec); + op_file->pipe_flag = TRUE; + set_pipe_mode (op_file); + } + + free (vv_file_name); + free (vv_file_ext); + free (legal_hdrf_spec); +} /* open_op_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** parse_enc_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *parse_enc_tbl (CONST char *line_ptr, + Header_Struct *hdr_struct, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + char *parse_enc_tbl (line_ptr, hdr_struct, ip_file) + CONST char *line_ptr; + Header_Struct *hdr_struct; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *buf_ptr; + char dummy[MAX_IP_LINE_LEN + 1]; + char *tmp_ptr; + int chars_read; + int fields_read; + + /*- + **------------------------------------------------------------------------ + ** Allocate enough memory to hold an encoding table + **------------------------------------------------------------------------ + */ + hdr_struct->present = FALSE; + tmp_ptr = allocate_buffer ((ENCODE_TABLE_LEN + 1), "tmp_ptr"); + fields_read = sscanf (line_ptr, "%*s %[^\n]", dummy); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (fields_read == 1) + { + vstrtrws (dummy); + chars_read = strlen (dummy); + + if (chars_read <= ENCODE_TABLE_LEN) + { + strcpy (tmp_ptr, dummy); + } + else + { + ERRORMSG_1 ("too many characters (%d) in encoding table", + chars_read); + show_file_context (ip_file, NULL); + return (NULL); + } + } + else + { + *tmp_ptr = '\0'; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (;;) + { + chars_read = strlen ((char *) tmp_ptr); + buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, + G_ip_buffer, ip_file, &G_ippart_bytes); + + if (buf_ptr == NULL) + { + ERRORMSG ("error reading encoding table"); + show_file_context (ip_file, NULL); + explain_error (); + return (NULL); + } + + /*- + **-------------------------------------------------------------------- + ** The table is terminated by the next header line encountered. + **-------------------------------------------------------------------- + */ + if (header_type (ip_file, buf_ptr, G_vvehdr) != HDR_UNKNOWN) + { + break; + } + chars_read += strlen (buf_ptr); + + if (chars_read <= ENCODE_TABLE_LEN) + { + strcat (tmp_ptr, buf_ptr); + } + else + { + ERRORMSG_1 ("too many characters (%d) in encoding table", + chars_read); + show_file_context (ip_file, NULL); + return (NULL); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (strlen (tmp_ptr) != ENCODE_TABLE_LEN) + { + ERRORMSG_1 ("wrong number of characters (%d) in encoding table", + chars_read); + show_file_context (ip_file, NULL); + return (NULL); + } + hdr_struct->present = TRUE; + hdr_struct->value = tmp_ptr; + return (buf_ptr); +} /* parse_enc_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** prs_idx_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** xlt_file +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** TRUE - a candidate translation file was found +** FALSE - a candidate translation file could not be +** identified +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) +Boolean prs_idx_file (CONST char *from_charset, CONST char *to_charset, + File_Info *idx_file, File_Info *xlt_file) +#else /* NOT (ANSI_SYNTAX) */ +Boolean prs_idx_file (from_charset, to_charset, idx_file, xlt_file) + CONST char *from_charset; + CONST char *to_charset; + File_Info *idx_file; + File_Info *xlt_file; +#endif /* (ANSI_SYNTAX) */ +{ + char buffer[MAX_IP_LINE_LEN + 1]; + Int32 bytes_read; + char *comment; + int fields_read; + char idx_from_charset[MAX_IP_LINE_LEN + 1]; + char idx_to_charset[MAX_IP_LINE_LEN + 1]; + char idx_xlt_filespec[MAX_IP_LINE_LEN + 1]; + Boolean xlt_found; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + idx_file->mode = MODE_TEXT; + idx_file->format = DEF_TEXT_FMT; + idx_file->max_rec_len = INV_RECORD_LEN; + idx_file->lng_rec_len = INV_RECORD_LEN; + idx_file->line_no = 0; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + idx_file->file_ptr = f_open_in (idx_file); + + if (idx_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening translation index file `%s'", + idx_file->file_spec); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + xlt_found = FALSE; + + while (xlt_found != TRUE) + { + idx_file->line_no++; + bytes_read = read_line ((Int32) MAX_IP_LINE_LEN, buffer, idx_file); + + if (bytes_read < 0) + { + if (feof (idx_file->file_ptr) != 0) + { + break; + } + ERRORMSG ("error reading translation index file"); + show_file_context (idx_file, NULL); + explain_error (); + break; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + buffer[MAX_IP_LINE_LEN] = (char) '\0'; + comment = STRCHR (buffer, IDX_COMMENT_CHAR); + + if (comment != NULL) + { + *comment = '\0'; + } + (void) vstrtrws (buffer); + + if (strlen (buffer) == 0) + { + continue; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + fields_read = sscanf (buffer, "%s %s %s", idx_from_charset, + idx_to_charset, idx_xlt_filespec); + + if (fields_read != 3) + { + ERRORMSG ("error parsing 3 entries in translation index file"); + show_file_context (idx_file, buffer); + continue; + } + + DEBUG_4 ("prs_idx_file: %04ld: From: `%s', To: `%s', XLT-file: `%s'", + idx_file->line_no, idx_from_charset, idx_to_charset, + idx_xlt_filespec); + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if ((STRCMPI (idx_from_charset, from_charset) == 0) + && (STRCMPI (idx_to_charset, to_charset) == 0)) + { + strcpy (xlt_file->file_spec, idx_xlt_filespec); + xlt_found = TRUE; + } + } /* while (ret_status == TRUE) */ + f_close (idx_file); + return (xlt_found); +} /* prs_idx_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** rdfi_headers +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void rdfi_headers (CONST Int16 decoding_type, + File_Info *ip_file, + Header_Struct *vve_hdr_array) +#else /* NOT (ANSI_SYNTAX) */ + void rdfi_headers (decoding_type, ip_file, + vve_hdr_array) + CONST Int16 decoding_type; + File_Info *ip_file; + Header_Struct *vve_hdr_array; +#endif /* (ANSI_SYNTAX) */ +{ + char *buf_ptr; + Int16 hdr_no; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, G_ip_buffer, + ip_file, &G_ippart_bytes); + for (;;) + { + + if (buf_ptr == NULL) + { + if (feof (ip_file->file_ptr)) + { + FATALMSG_1 ("EOF encountered before `%s' header", + G_vvehdr[HDR_BEGIN].h_string); + show_file_context (ip_file, NULL); + explain_error (); + vv_exit (); + } + else + { + FATALMSG ("error reading file headers"); + show_file_context (ip_file, NULL); + explain_error (); + vv_exit (); + } + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + hdr_no = header_type (ip_file, buf_ptr, vve_hdr_array); + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (decoding_type != VV_DECODING) + { + switch (hdr_no) + { + case HDR_ATTRBEGIN: + case HDR_ATTREND: + case HDR_BYTECOUNT: + case HDR_CHARACTERSET: + case HDR_COMMENT: + case HDR_CRC32: + case HDR_DECODEVERSION: + case HDR_FORMAT: + case HDR_MODE: + case HDR_OPERATINGSYSTEM: + case HDR_RECORDLEN: + case HDR_SKIPFROM: + case HDR_SKIPTO: + case HDR_TIMESTAMP: + FATALMSG_1 ("VVcode header `%s' found when UU/XXdecoding", + G_vvehdr[hdr_no].h_string); + show_file_context (ip_file, buf_ptr); + vv_exit (); + break; + default: + break; + } + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + switch (hdr_no) + { + case HDR_UNKNOWN: + break; + case HDR_BEGIN: + if (vve_hdr_array[hdr_no].present == TRUE) + { + FATALMSG_1 ("header `%s' repeated", + vve_hdr_array[hdr_no].h_string); + show_file_context (ip_file, buf_ptr); + vv_exit (); + } + parse_begin_header (buf_ptr, ip_file, G_dec_type, + &vve_hdr_array[hdr_no], &G_hdrf_spec); + return; + case HDR_COMMENT: + display_comment (ip_file, buf_ptr, &vve_hdr_array[hdr_no]); + break; + case HDR_CHARACTERSET: + case HDR_DECODEVERSION: + case HDR_FORMAT: + case HDR_MODE: + case HDR_OPERATINGSYSTEM: + case HDR_RECORDLEN: + case HDR_TIMESTAMP: + if (vve_hdr_array[hdr_no].present == TRUE) + { + FATALMSG_1 ("header `%s' repeated", + vve_hdr_array[hdr_no].h_string); + show_file_context (ip_file, buf_ptr); + vv_exit (); + } + parse_header (ip_file, buf_ptr, &vve_hdr_array[hdr_no]); + break; + + /*- + **------------------------------------------------------------ + ** After parsing the encoding table, jump to the top of the + ** enclosing 'for' loop. + **------------------------------------------------------------ + */ + case HDR_TABLE: + buf_ptr = parse_enc_tbl (buf_ptr, &vve_hdr_array[hdr_no], + ip_file); + + if (buf_ptr == NULL) + { + FATALMSG ("error reading encoding table"); + show_file_context (ip_file, NULL); + vv_exit (); + } + continue; + case HDR_ATTRBEGIN: + case HDR_ATTREND: + WARNMSG_1 ("VVE header `%s' not yet supported", + vve_hdr_array[hdr_no].h_string); + show_file_context (ip_file, buf_ptr); + break; + case HDR_SKIPFROM: + case HDR_SKIPTO: + case HDR_END: + case HDR_BYTECOUNT: + case HDR_CRC32: + break; + default: + INTERNAL_ERROR ("rdfi_headers"); + break; + } + buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, + G_ip_buffer, ip_file, &G_ippart_bytes); + } +} /* rdfi_headers */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** rdfi_trailers +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void rdfi_trailers (CONST Int16 decoding_type, + File_Info *ip_file, + File_Info *vve_file, + Header_Struct *vve_hdr_array) +#else /* NOT (ANSI_SYNTAX) */ + void rdfi_trailers (decoding_type, ip_file, + vve_file, vve_hdr_array) + CONST Int16 decoding_type; + File_Info *ip_file; + File_Info *vve_file; + Header_Struct *vve_hdr_array; +#endif /* (ANSI_SYNTAX) */ +{ + char *buf_ptr; + int hdr_no; + int i; + int status; + + for (i = 0; i < 2; i++) + { + buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, + G_ip_buffer, ip_file, &G_ippart_bytes); + + if (buf_ptr == NULL) + { + break; + } + hdr_no = header_type (ip_file, buf_ptr, vve_hdr_array); + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (hdr_no == HDR_BYTECOUNT) + { + if (decoding_type != VV_DECODING) + { + FATALMSG_1 ("header `%s' not supported when UU/XXdecoding", + vve_hdr_array[hdr_no].h_string); + vv_exit (); + } + + parse_header (ip_file, buf_ptr, &vve_hdr_array[hdr_no]); + status = sscanf (vve_hdr_array[hdr_no].value, "%ld", + &(vve_file->bytecount)); + + if ((status != 1) || (vve_file->bytecount < 0)) + { + ERRORMSG_1 ("error parsing value of `%s' header", + vve_hdr_array[hdr_no].h_string); + show_file_context (ip_file, buf_ptr); + vve_hdr_array[hdr_no].present = FALSE; + } + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + else + if (hdr_no == HDR_CRC32) + { + + if (decoding_type != VV_DECODING) + { + FATALMSG_1 ("header `%s' not supported when UU/XXdecoding", + vve_hdr_array[hdr_no].h_string); + vv_exit (); + } + + parse_header (ip_file, buf_ptr, &vve_hdr_array[hdr_no]); + status = sscanf (vve_hdr_array[hdr_no].value, "%lx", + &(vve_file->crc32)); + + if (status != 1) + { + ERRORMSG_1 ("error parsing value of `%s' header", + vve_hdr_array[hdr_no].h_string); + show_file_context (ip_file, buf_ptr); + vve_hdr_array[hdr_no].present = FALSE; + } + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + else + { + break; + } + } +} /* rdfi_trailers */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_decoding_type +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_decoding_type ( + CONST Qualifier_Struct *uu_qualifier, + CONST Qualifier_Struct *xx_qualifier, + Int16 *decoding_type, + char **vve_line_prefix, + char **vve_eol_marker) +#else /* NOT (ANSI_SYNTAX) */ + void set_decoding_type (uu_qualifier, xx_qualifier, + decoding_type, vve_line_prefix, + vve_eol_marker) + CONST Qualifier_Struct *uu_qualifier; + CONST Qualifier_Struct *xx_qualifier; + Int16 *decoding_type; + char **vve_line_prefix; + char **vve_eol_marker; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (uu_qualifier->present == TRUE) + { + *decoding_type = UU_DECODING; + *vve_line_prefix = NULL; + *vve_eol_marker = NULL; + LOGMSG ("Decoding method: UUcode\n"); + } + else if (xx_qualifier->present == TRUE) + { + *decoding_type = XX_DECODING; + *vve_line_prefix = NULL; + *vve_eol_marker = NULL; + LOGMSG ("Decoding method: XXcode\n"); + } + else + { + *decoding_type = VV_DECODING; + *vve_line_prefix = STRDUP (VV_PREFIX); + *vve_eol_marker = STRDUP (VV_EOL_MARKER); + LOGMSG ("Decoding method: VVcode\n"); + } +} /* set_decoding_type */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_enc_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_enc_tbl (CONST Qualifier_Struct *enc_qualifier, + CONST Int16 enc_tbl_len, + char *encode_table) +#else /* NOT (ANSI_SYNTAX) */ + void set_enc_tbl (enc_qualifier, enc_tbl_len, + encode_table) + CONST Qualifier_Struct *enc_qualifier; + CONST Int16 enc_tbl_len; + char *encode_table; +#endif /* (ANSI_SYNTAX) */ +{ + File_Info enc_file; + int status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (enc_qualifier->present == TRUE) + { + strcpy (enc_file.file_spec, enc_qualifier->value); + + /*- + **-------------------------------------------------------------------- + ** If an extension has not been provided, use the default extension + ** for encoding table files. + **-------------------------------------------------------------------- + */ +#if (STICKY_DEFAULTS) + apply_defaults (NULL, DEF_ENC_EXT, enc_file.file_spec); +#endif /* (STICKY_DEFAULTS) */ + + status = rd_enc_tbl (&enc_file, enc_tbl_len, encode_table); + + if (!status) + { + FATALMSG_1 ("error reading encoding table file `%s'", + enc_file.file_spec); + vv_exit (); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + if (VVEH_TABLE) + { + strcpy (enc_file.file_spec, G_ip_file.file_spec); + strcpy ((char *) encode_table, G_vvehdr[HDR_TABLE].value); + } + + /*- + **------------------------------------------------------------------------ + ** There's no table in the file, nor one specified on the command + ** line, so use the default table for the particular decoding type. + **------------------------------------------------------------------------ + */ + else + { + switch (G_dec_type) + { + case UU_DECODING: + strcpy (enc_file.file_spec, "default UUcode"); + strcpy ((char *) encode_table, UU_ENCODE_TABLE); + break; + case XX_DECODING: + strcpy (enc_file.file_spec, "default XXcode"); + strcpy ((char *) encode_table, XX_ENCODE_TABLE); + break; + case VV_DECODING: + default: + strcpy (enc_file.file_spec, "default VVcode"); + strcpy ((char *) encode_table, VV_ENCODE_TABLE); + break; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("\nEncoding table source: %s", enc_file.file_spec); + LOGMSG_1 ("Encoding table contents: %.32s", encode_table); + LOGMSG_1 (" %.32s", encode_table + 32); + +} /* set_enc_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_format +** +** DESCRIPTION +** +** Set the format (fixed/stream/variable) to use when writing the output +** file. The format may be set from the command line, VVE file or the +** default specified in machine.h for the file mode. The logic used is: +** +** Cmd OS diff VVE Result +** ------------------------------- +** Y * * Cmd +** N Y * Def +** N N Y VVE +** N N N Def +** ------------------------------- +** +** INPUT PARAMETERS +** +** vve_file - a File_Info structure containing the results of +** parsing the VVE file headers. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_format (CONST Qualifier_Struct *fmt_qualifier, + CONST File_Info *vve_file, + CONST char *vve_os_str, + CONST char *fmt_str_array[], + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_format (fmt_qualifier, vve_file, vve_os_str, + fmt_str_array, op_file) + CONST Qualifier_Struct *fmt_qualifier; + CONST File_Info *vve_file; + CONST char *vve_os_str; + CONST char *fmt_str_array[]; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 cmd_format; + + /*- + **------------------------------------------------------------------------ + ** Get the format specified on the command line (if any). + **------------------------------------------------------------------------ + */ + cmd_format = getc_format (fmt_qualifier, fmt_str_array); + + + /*- + **------------------------------------------------------------------------ + ** IF a valid format was specified on the command line + ** THEN use the command line format value. + **------------------------------------------------------------------------ + */ + if (cmd_format != INV_FORMAT) + { + op_file->format = cmd_format; + } + + /*- + **------------------------------------------------------------------------ + ** IF a valid format was not specified on the command line + ** AND the VVE file was created on a different operating system + ** THEN use the default format and issue a warning. + **------------------------------------------------------------------------ + */ + else if (STRCMPI (vve_os_str, VV_OPERATING_SYSTEM) != 0) + { + WARNMSG_1 ("VVE file created on a different operating system: `%s'", + vve_os_str); + INFOMSG ("the output file will be created using the default format"); + op_file->format = (op_file->mode == MODE_BINARY) + ? DEF_BINARY_FMT : DEF_TEXT_FMT; + } + + /*- + **------------------------------------------------------------------------ + ** IF a valid format was not specified on the command line + ** AND the VVE file was created on the same operating system + ** AND the VVE file contained a valid format value + ** THEN use the VVE format value. + **------------------------------------------------------------------------ + */ + else if ((STRCMPI (vve_os_str, VV_OPERATING_SYSTEM) == 0) + && (vve_file->format != INV_FORMAT)) + { + op_file->format = vve_file->format; + } + + /*- + **------------------------------------------------------------------------ + ** ELSE use the default format value. + **------------------------------------------------------------------------ + */ + else + { + op_file->format = (op_file->mode == MODE_BINARY) + ? DEF_BINARY_FMT : DEF_TEXT_FMT; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + switch (op_file->format) + { + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case FMT_FIXED: + +#if (SUPPORT_FIXED_FMT) + break; +#else /* NOT (SUPPORT_FIXED_FMT) */ + WARNMSG_1 ("format `%s' is not supported by this implementation", + fmt_str_array[op_file->format]); + INFOMSG ("output file will be created using the default format"); + op_file->format = (op_file->mode == MODE_BINARY) + ? DEF_BINARY_FMT : DEF_TEXT_FMT; + break; +#endif /* (SUPPORT_FIXED_FMT) */ + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case FMT_STREAM: + +#if (SUPPORT_STREAM_FMT) + break; +#else /* NOT (SUPPORT_STREAM_FMT) */ + WARNMSG_1 ("format `%s' is not supported by this implementation", + fmt_str_array[op_file->format]); + INFOMSG ("output file will be created using the default format"); + op_file->format = (op_file->mode == MODE_BINARY) + ? DEF_BINARY_FMT : DEF_TEXT_FMT; + break; +#endif /* (SUPPORT_STREAM_FMT) */ + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case FMT_VARIABLE: + +#if (SUPPORT_VARIABLE_FMT) + break; +#else /* NOT (SUPPORT_VARIABLE_FMT) */ + WARNMSG_1 ("format `%s' is not supported by this implementation", + fmt_str_array[op_file->format]); + INFOMSG ("output file will be created using the default format"); + op_file->format = (op_file->mode == MODE_BINARY) + ? DEF_BINARY_FMT : DEF_TEXT_FMT; + break; +#endif /* (SUPPORT_VARIABLE_FMT) */ + + default: + op_file->format = (op_file->mode == MODE_BINARY) + ? DEF_BINARY_FMT : DEF_TEXT_FMT; + break; + } + + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (op_file->format != INV_FORMAT) + { + LOGMSG_1 ("O/P file format: %s", + fmt_str_array[op_file->format]); + } +} /* set_format */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_idx_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean set_idx_file (CONST Qualifier_Struct *idx_qualifier, + File_Info *idx_file) +#else /* NOT (ANSI_SYNTAX) */ + Boolean set_idx_file (idx_qualifier, idx_file) + CONST Qualifier_Struct *idx_qualifier; + File_Info *idx_file; +#endif /* (ANSI_SYNTAX) */ +{ + char *tmp_ptr; + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (idx_qualifier->present == TRUE) + { + strcpy (idx_file->file_spec, idx_qualifier->value); + + /*- + **-------------------------------------------------------------------- + ** If an extension has not been provided, use the default extension + ** for the translation index file. + **-------------------------------------------------------------------- + */ +#if (STICKY_DEFAULTS) + apply_defaults (NULL, DEF_IDX_EXT, idx_file->file_spec); +#endif /* (STICKY_DEFAULTS) */ + + return (TRUE); + } + + tmp_ptr = NULL; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((VV_INDEX_ENVVAR != NULL) && (strlen (VV_INDEX_ENVVAR) > 0)) + { + tmp_ptr = getenv (VV_INDEX_ENVVAR); + + if ((tmp_ptr != NULL) && (strlen (tmp_ptr) > 0)) + { + strcpy (idx_file->file_spec, tmp_ptr); + return (TRUE); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((tmp_ptr == NULL) && (VV_INDEX_FILE != NULL) + && (strlen (VV_INDEX_FILE) > 0) && file_exists (VV_INDEX_FILE)) + { + strcpy (idx_file->file_spec, VV_INDEX_FILE); + return (TRUE); + } + return (FALSE); +} /* set_idx_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_mode +** +** DESCRIPTION +** +** Set the mode (text/binary) to use when reading and encoding the input +** file. The mode may be set from the command line, VVE file or the +** default specified in machine.h. The logic used is: +** +** Cmd VVE Result +** ---------------------- +** Y * Cmd +** N N Def +** N Y VVE +** ---------------------- +** +** INPUT PARAMETERS +** +** vve_file - a structure containing the results of +** parsing the VVE file headers. +** +** OUTPUT PARAMETERS +** +** none +** +** RETURN VALUE +** +** none +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_mode (CONST Qualifier_Struct *mode_qualifier, + CONST File_Info *vve_file, + CONST char *mode_str_array[], + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_mode (mode_qualifier, vve_file, + mode_str_array, op_file) + CONST Qualifier_Struct *mode_qualifier; + CONST File_Info *vve_file; + CONST char *mode_str_array[]; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 cmd_mode; + + /*- + **------------------------------------------------------------------------ + ** Get the mode specified on the command line (if any). + **------------------------------------------------------------------------ + */ + cmd_mode = getc_mode (mode_qualifier, mode_str_array); + + if (cmd_mode != INV_MODE) + { + op_file->mode = cmd_mode; + } + else + if (vve_file->mode != INV_MODE) + { + op_file->mode = vve_file->mode; + } + else + { + op_file->mode = DEF_MODE; + } + + /*- + **------------------------------------------------------------------------ + ** One final check to make sure that the mode is valid. The mode can only + ** come from a validated command line or VVE file value, so it should not + ** be wrong. + **------------------------------------------------------------------------ + */ + switch (op_file->mode) + { + case MODE_BINARY: + case MODE_TEXT: + break; + default: + FATALMSG_1 ("invalid file encoding mode set (%d)", op_file->mode); + vv_exit (); + } + LOGMSG_1 ("\nO/P file mode: %s", + mode_str_array[op_file->mode]); +} /* set_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_pad_char +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_pad_char (CONST Qualifier_Struct *pad_qualifier, + CONST File_Info *op_file, + char *pad_char) +#else /* NOT (ANSI_SYNTAX) */ + void set_pad_char (pad_qualifier, op_file, pad_char) + CONST Qualifier_Struct *pad_qualifier; + CONST File_Info *op_file; + char *pad_char; +#endif /* (ANSI_SYNTAX) */ +{ + int tmp_pad_char; + int status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (pad_qualifier->present != TRUE) + { + DEBUG ("pad character not specified on the command line"); + + if (op_file->mode == MODE_BINARY) + { + tmp_pad_char = DEF_BINARY_PADCHAR; + } + else + { + tmp_pad_char = DEF_TEXT_PADCHAR; + } + } + else + { + tmp_pad_char = -1; + status = sscanf (pad_qualifier->value, "%d", &tmp_pad_char); + + if ((status != 1) || (tmp_pad_char < 0) || (tmp_pad_char > 255)) + { + USAGE ("pad character value must be in the range 0-255"); + vv_exit (); + } + } + + *pad_char = (char) (tmp_pad_char & 0xff); + + if (op_file->format == FMT_FIXED) + { + LOGMSG_2 ("O/P file padding character: %d (0x%02x)", + *pad_char, *pad_char); + } + +} /* set_pad_char */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_record_len +** +** DESCRIPTION +** +** Set the maximum record length to use when writing the output file. +** The record length may be set from the command line, VVE file or the +** the default specified in machine.h. The logic used is: +** +** Cmd VVE Result +** ---------------------- +** Y * Cmd +** N Y VVE +** N N Def +** ---------------------- +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_record_len ( + CONST Qualifier_Struct *rec_qualifier, + CONST File_Info *vve_file, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_record_len (rec_qualifier, vve_file, op_file) + CONST Qualifier_Struct *rec_qualifier; + CONST File_Info *vve_file; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 cmd_reclen; + + /*- + **------------------------------------------------------------------------ + ** Get the record length specified on the command line (if any). + **------------------------------------------------------------------------ + */ + cmd_reclen = getc_reclen (rec_qualifier, op_file); + + if (cmd_reclen != INV_RECORD_LEN) + { + op_file->max_rec_len = cmd_reclen; + } + else + if (vve_file->max_rec_len != INV_RECORD_LEN) + { + op_file->max_rec_len = vve_file->max_rec_len; + } + else + { + op_file->max_rec_len = INV_RECORD_LEN; + } + + /*- + **------------------------------------------------------------------------ + ** One final check to make sure that the maximum record length is valid. + ** The record length can only come from a validated command line or VVE + ** file value or the default setting, so it should not be wrong. + ** There is an exception: the default may be set to INV_RECORD_LEN so that + ** f_open_out() will use a default value. + **------------------------------------------------------------------------ + */ + if (op_file->max_rec_len == INV_RECORD_LEN) + { + return; + } + + if (op_file->format == FMT_VARIABLE) + { + if ((op_file->max_rec_len < MIN_VARIABLE_RECORD_LEN) + || (op_file->max_rec_len > MAX_VARIABLE_RECORD_LEN)) + { + FATALMSG_1 ("invalid maximum fixed record length set (%ld)", + op_file->max_rec_len); + vv_exit (); + } + } + else + { + if (op_file->format == FMT_FIXED) + { + if ((op_file->max_rec_len < MIN_FIXED_RECORD_LEN) + || (op_file->max_rec_len > MAX_FIXED_RECORD_LEN)) + { + FATALMSG_1 ("invalid maximum variable record length set (%ld)", + op_file->max_rec_len); + vv_exit (); + } + } + } + + /*- + **------------------------------------------------------------------------ + ** Only report the maximum record length if it is meaningful for the file + ** format. + **------------------------------------------------------------------------ + */ + if ((op_file->format == FMT_FIXED) || (op_file->format == FMT_VARIABLE)) + { + LOGMSG_1 ("O/P file maximum record length: %ld", + op_file->max_rec_len); + } +} /* set_record_len */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_timestamp +** +** DESCRIPTION +** +** Set the timestamp to record in the VVE file. The timestamp may be +** set from the command line or VVE file. The logic used is: +** +** Cmd VVE Result +** ------------------------------ +** Y * Cmd +** N Y ExF +** N N Inv +** ------------------------------ +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_timestamp ( + CONST Qualifier_Struct *time_qualifier, + CONST File_Info *vve_file, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_timestamp (time_qualifier, vve_file, op_file) + CONST Qualifier_Struct *time_qualifier; + CONST File_Info *vve_file; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + TIME_T cmd_timestamp; + + /*- + **------------------------------------------------------------------------ + ** Get the timestamp specified on the command line (if any). + **------------------------------------------------------------------------ + */ + cmd_timestamp = getc_timestamp (time_qualifier); + + if (cmd_timestamp != INV_TIMESTAMP) + { + op_file->mod_time = cmd_timestamp; + } + else + if (vve_file->mod_time != INV_TIMESTAMP) + { + op_file->mod_time = vve_file->mod_time; + } + else + { + op_file->mod_time = INV_TIMESTAMP; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (op_file->mod_time != INV_TIMESTAMP) + { + LOGMSG_1 ("O/P file timestamp: %s", + vv_timestamp (op_file->mod_time)); + } +} /* set_timestamp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** terminate +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void terminate (void) +#else /* NOT (ANSI_SYNTAX) */ + void terminate () +#endif /* (ANSI_SYNTAX) */ +{ + Boolean file_was_padded; + Int32 bytes_to_write; + Int32 total_records; + Int32 count; + + G_op_file.crc32 = G_op_file.crc32 ^ CRC32_MASK; + G_ip_file.bytecount += G_ippart_bytes; + rdfi_trailers (G_dec_type, &G_ip_file, &G_vv_file, G_vvehdr); + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (Q_INPUT_FILE && (G_ip_file.file_ptr != stdin)) + { + f_close (&G_ip_file); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((Q_OUTPUT_FILE || VVEH_BEGIN) && (G_op_file.file_ptr != stdout)) + { + + /*- + **-------------------------------------------------------------------- + ** If we're writing a fixed format file, pad an incomplete last + ** record with the file padding character. + **-------------------------------------------------------------------- + */ + file_was_padded = FALSE; + if ((G_op_file.format == FMT_FIXED) + && ((G_op_file.bytecount % G_op_file.max_rec_len) != 0L)) + { + total_records = (G_op_file.bytecount + G_op_file.max_rec_len - 1); + total_records /= G_op_file.max_rec_len; + + bytes_to_write = (total_records * G_op_file.max_rec_len); + bytes_to_write -= G_op_file.bytecount; + + for (count = 0; count < bytes_to_write; count++) + { + write_bytes (1L, &G_op_padchar, &G_op_file); + ++G_op_file.bytecount; + } + file_was_padded = TRUE; + } + f_close (&G_op_file); + } + + LOGMSG_1 ("\nTotal bytes read: %ld", G_ip_file.bytecount); + LOGMSG_1 ("Total I/P parts read: %d", G_ippt_no); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (VVEH_BYTECOUNT) + { + if (G_vv_file.bytecount == G_op_file.bytecount) + { + LOGMSG_1 ("Total bytes written: %ld [OK]", + G_op_file.bytecount); + } + else + { + LOGMSG_1 ("Total bytes written: %ld", + G_op_file.bytecount); + + if (file_was_padded == TRUE) + { + WARNMSG_2 ("last record was padded with value %d (0x%02x)", + G_op_padchar, G_op_padchar); + } + else + { + WARNMSG_1 ("file size does not match that recorded [%ld]", + G_vv_file.bytecount); + } + } + } + else + { + LOGMSG_1 ("Total bytes written: %ld [not recorded]", + G_op_file.bytecount); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (VVEH_CRC32) + { + if (G_vv_file.crc32 == G_op_file.crc32) + { + LOGMSG_1 ("CRC-32: %08lx [OK]", + G_op_file.crc32); + } + else + { + LOGMSG_1 ("CRC-32: %08lx", + G_op_file.crc32); + WARNMSG_1 ("CRC-32 does not match that recorded [%08lx]", + G_vv_file.crc32); + } + } + else + { + LOGMSG_1 ("CRC-32: %08lx [not recorded]", + G_op_file.crc32); + } + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((G_op_file.pipe_flag != TRUE) && (G_op_file.mod_time != INV_TIMESTAMP)) + { + set_ftime (&G_op_file); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (Q_LOG && (G_log_file.file_ptr != stderr)) + { + f_close (&G_log_file); + } +} /* terminate */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** usage_error +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void usage_error (CONST char *reason) +#else /* NOT (ANSI_SYNTAX) */ + void usage_error (reason) + CONST char *reason; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** Initial error message, followed by Unix style usage message. + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, "\nVVdecode %s, %s release (%s)\n\n", + VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE); + FPRINTF (stderr, "VVdecode: %s\n\n", reason); + FPRINTF (stderr, + "Usage: VVdecode [qualifiers] input_file [output_file]\n\n"); + FPRINTF (stderr, " Valid qualifiers are:\n\n"); + + /*- + **------------------------------------------------------------------------ + ** qualifier: 'debug' (if support compiled in) + **------------------------------------------------------------------------ + */ +#if (VV_DEBUG_SUPPORT) + FPRINTF (stderr, " %.1s%s\n", QUAL_INTRO, + G_cmdqual[CMDQ_DEBUG].q_string); +#endif /* (VV_DEBUG_SUPPORT) */ + + /*- + **------------------------------------------------------------------------ + ** qualifier: 'encoding_table' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s%.1sfile-spec\n", + QUAL_INTRO, G_cmdqual[CMDQ_ENCODE].q_string, QUAL_SEP); + + /*- + **------------------------------------------------------------------------ + ** qualifier: 'format' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, + " %.1s%s%.1sfile-format (formats supported: %s%s%s%s%s%s%s)\n", + QUAL_INTRO, G_cmdqual[CMDQ_FORMAT].q_string, QUAL_SEP, + G_fmt_str[FMT_DEFAULT], + +#if (SUPPORT_FIXED_FMT) + " ", G_fmt_str[FMT_FIXED], +#else /* NOT (SUPPORT_FIXED_FMT) */ + "", "", +#endif /* (SUPPORT_FIXED_FMT) */ + +#if (SUPPORT_STREAM_FMT) + " ", G_fmt_str[FMT_STREAM], +#else /* NOT (SUPPORT_STREAM_FMT) */ + "", "", +#endif /* (SUPPORT_STREAM_FMT) */ + +#if (SUPPORT_VARIABLE_FMT) + " ", G_fmt_str[FMT_VARIABLE]); +#else /* NOT (SUPPORT_VARIABLE_FMT) */ + "", ""); +#endif /* (SUPPORT_VARIABLE_FMT) */ + + + /*- + **------------------------------------------------------------------------ + ** qualifiers: 'help', 'index', 'log', 'mode', 'overwrite' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s\n", + QUAL_INTRO, G_cmdqual[CMDQ_HELP].q_string); + FPRINTF (stderr, " %.1s%s%.1sfile-spec\n", + QUAL_INTRO, G_cmdqual[CMDQ_INDEXFILE].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s[%.1sfile-spec]\n", + QUAL_INTRO, G_cmdqual[CMDQ_LOG].q_string, QUAL_SEP); + FPRINTF (stderr, + " %.1s%s%.1sfile-encoding-mode (modes supported: binary text)\n", + QUAL_INTRO, G_cmdqual[CMDQ_MODE].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s\n", + QUAL_INTRO, G_cmdqual[CMDQ_OVERWRITE].q_string); + + /*- + **------------------------------------------------------------------------ + ** qualifiers: 'pad_character', 'record_length', 'timestamp' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s%.1sdecimal-char-value\n", + QUAL_INTRO, G_cmdqual[CMDQ_PADCHAR].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s%.1sbytes\n", + QUAL_INTRO, G_cmdqual[CMDQ_RECORDLEN].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s[%.1stime]\n", + QUAL_INTRO, G_cmdqual[CMDQ_TIMESTAMP].q_string, QUAL_SEP); + + /*- + **------------------------------------------------------------------------ + ** qualifiers: 'translation_file', 'uudecode', 'xxdecode' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s%.1sfile-spec\n", + QUAL_INTRO, G_cmdqual[CMDQ_TRANSLATE].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s\n", + QUAL_INTRO, G_cmdqual[CMDQ_UUDECODE].q_string); + FPRINTF (stderr, " %.1s%s\n\n", + QUAL_INTRO, G_cmdqual[CMDQ_XXDECODE].q_string); + + G_status = FATAL_STATUS; + vv_exit (); +} /* usage_error */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** main +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + int main (CONST int argc, CONST char *argv[]) +#else /* NOT (ANSI_SYNTAX) */ + int main (argc, argv) + CONST int argc; + CONST char *argv[]; +#endif /* (ANSI_SYNTAX) */ +{ + SIZE_T bytes_reqd; + + /*- + **------------------------------------------------------------------------ + ** Allocate the global message buffer manually since it is used by the + ** various MESSAGE_x and DEBUG_x macros. + **------------------------------------------------------------------------ + */ + G_status = LOG_STATUS; + bytes_reqd = sizeof (char) * (SIZE_T) MAX_MSG_LEN; + G_tmp_msg = (char *) malloc (bytes_reqd); + + if (G_tmp_msg == NULL) + { + FPRINTF (stderr, "unable to allocate %ld bytes for buffer `G_tmp_msg'", + bytes_reqd); + G_status = FATAL_STATUS; + vv_exit (); + } + DEBUG_1 ("main: allocated %ld bytes for buffer `G_tmp_msg'", + (Int32) bytes_reqd); + + /*- + **------------------------------------------------------------------------ + ** Allocate the other global buffers. + **------------------------------------------------------------------------ + */ + G_ip_buffer = allocate_buffer ((SIZE_T) IP_BUFFER_SIZE, "G_ip_buffer"); + G_op_buffer = allocate_buffer ((SIZE_T) OP_BUFFER_SIZE, "G_op_buffer"); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + scan_cmd_line (argc, argv, QUAL_INTRO, QUAL_SEP, G_cmdqual, + &G_cmd_ipfile, &G_cmd_opfile); + +#if (VV_DEBUG_SUPPORT) +#else /* NOT (VV_DEBUG_SUPPORT) */ + if (Q_DEBUG) + { + WARNMSG ("Debugging support was not compiled into VVdecode"); + } +#endif /* (VV_DEBUG_SUPPORT) */ + + /*- + **------------------------------------------------------------------------ + ** If the 'help' option was selected, call usage_error() and stop. + **------------------------------------------------------------------------ + */ + if (Q_HELP) + { + USAGE ("help requested"); + } + + /*- + **------------------------------------------------------------------------ + ** If the 'debug' option was selected, ensure that the 'log' option is + ** selected. + **------------------------------------------------------------------------ + */ + if (Q_DEBUG) + { + if (!Q_LOG) + { + G_cmdqual[CMDQ_LOG].present = TRUE; + G_cmdqual[CMDQ_LOG].value = NULL; + } + G_debugging = TRUE; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (!Q_INPUT_FILE) + { + USAGE ("input file must be specified"); + } + + initialize (); + decode (); + + terminate (); + vv_exit (); + return (0); + +} /* main */ diff --git a/support/vvcode/vvencode.c b/support/vvcode/vvencode.c new file mode 100644 index 0000000000..99b8827879 --- /dev/null +++ b/support/vvcode/vvencode.c @@ -0,0 +1,2349 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vvencode.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** +** MODULE CONTENTS +** +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + + +#define VVENCODE 1 +#define VVCODE_MAIN 1 + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + + +/*- +**---------------------------------------------------------------------------- +** Include the machine specific definitions +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" + + +/*- +**---------------------------------------------------------------------------- +** Forward declarations of functions in this file +**---------------------------------------------------------------------------- +*/ +int main ARGS ((CONST int argc, + CONST char *argv[])); +Int32 enc_line ARGS ((CONST char *ip_buffer, + CONST Int32 num_bytes, + char *op_buffer)); +void encode ARGS ((void)); +void initialize ARGS ((void)); +void open_ip_file ARGS ((CONST Qualifier_Struct *ip_qualifier, + File_Info *ip_file)); +void open_op_file ARGS ((CONST Qualifier_Struct *op_qualifier, + CONST char *def_file_name, + CONST Int16 overwrite_flag, + File_Info *op_file)); +void set_enc_tbl ARGS ((CONST Qualifier_Struct *enc_qualifier, + CONST Int16 enc_tbl_len, + char *encode_table)); +void set_format ARGS ((CONST Qualifier_Struct *fmt_qualifier, + CONST File_Info *ex_file, + CONST char *fmt_str_array[], + File_Info *ip_file)); +void set_hdr_file_spec ARGS ((CONST Qualifier_Struct *hdr_qualifier, + CONST File_Info *ip_file, + char **hdr_file_spec)); +void set_ip_filespec ARGS ((CONST Qualifier_Struct *ip_qualifier, + File_Info *ip_file)); +void set_mode ARGS ((CONST Qualifier_Struct *mode_qualifier, + CONST File_Info *ex_file, + CONST char *mode_str_array[], + File_Info *ip_file)); +void set_record_len ARGS ((CONST Qualifier_Struct *rec_qualifer, + CONST File_Info *ex_file, + File_Info *ip_file)); +void set_split_size ARGS ((CONST File_Info *op_file, + Qualifier_Struct *split_qualifier, + Int32 *split_size)); +void set_timestamp ARGS ((CONST Qualifier_Struct *time_qualifier, + CONST File_Info *ex_file, + File_Info *ip_file)); +void start_next_op_file ARGS ((CONST Int16 overwrite_flag, + File_Info *op_file, + Int16 *op_part_no)); +void terminate ARGS ((void)); +void usage_error ARGS ((CONST char *reason)); +void wr_headers ARGS ((CONST Int16 part_no)); + + +/*- +**============================================================================ +** +** FUNCTION +** +** encode +** +** DESCRIPTION +** +** Encode the bytes from the input file and write them to the output +** file. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void encode (void) +#else /* NOT (ANSI_SYNTAX) */ + void encode () +#endif /* (ANSI_SYNTAX) */ +{ + char *ip_buffer; + char *buf_ptr; + Int32 buffer_size; + Int32 bytes_left; + Int32 bytes_read; + Int32 bytes_to_encode; + Int16 encode_state; + SIZE_T idx; + char tmp_buffer[MAX_ENCODED_BYTES + 2]; + char vv_buffer[2 * MAX_ENCODED_BYTES]; + Int32 vve_line_bytes; + Int32 vve_room_needed; + + /*- + **------------------------------------------------------------------------ + ** If the input file has variable length format records, then allocate + ** a buffer to hold the largest possible record. For fixed or stream + ** format files, allocate a smaller buffer of IO_BUFFER_SIZE bytes. + **------------------------------------------------------------------------ + */ + if (G_ip_file.format == FMT_VARIABLE) + { + buffer_size = (Int32) MAX_VARIABLE_RECORD_LEN; + } + else + { + buffer_size = (Int32) IO_BUFFER_SIZE; + } + ip_buffer = allocate_buffer ((SIZE_T) buffer_size, "ip_buffer"); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (;;) + { + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (G_ip_file.format == FMT_VARIABLE) + { + bytes_read = read_record (MAX_VARIABLE_RECORD_LEN, ip_buffer, + &G_ip_file); + if (bytes_read < 0L) + { + break; + } + G_ip_file.bytecount += bytes_read; + DEBUG_2 ("encode: record length = %5ld, total bytes read = %10ld", + bytes_read, G_ip_file.bytecount); + encode_state = ENCODE_REC_LEN; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + else + { + bytes_read = read_bytes ((Int32) MAX_ENCODED_BYTES, ip_buffer, + &G_ip_file); + if (bytes_read <= 0L) + { + break; + } + G_ip_file.bytecount += (long) bytes_read; + } + + /*- + **-------------------------------------------------------------------- + ** If the /TRANSLATE command qualifier was specified, translate the + ** bytes read to the destination character set. + **-------------------------------------------------------------------- + */ + if (Q_TRANSLATE) + { + for (idx = 0; idx < (SIZE_T) bytes_read; idx++) + { + ip_buffer[idx] = + (char) G_xlt_table.xlt_tbl[(Byte) ip_buffer[idx]]; + } + } + + /*- + **-------------------------------------------------------------------- + ** Compute the CRC of the bytes to be encoded in the VVE file. + **-------------------------------------------------------------------- + */ + for (idx = 0; idx < (SIZE_T) bytes_read; idx++) + { + UPDATE_CRC32 (G_ip_file.crc32, ip_buffer[idx]); + } + + /*- + **-------------------------------------------------------------------- + ** Write the remaining bytes in chunks of MAX_ENCODED_BYTES. If the + ** file is in variable length format, each record is likely to have a + ** shorter last line. + **-------------------------------------------------------------------- + */ + bytes_left = bytes_read; + buf_ptr = ip_buffer; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + while (bytes_left > 0L) + { + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + if ((G_ip_file.format == FMT_VARIABLE) + && (encode_state == ENCODE_REC_LEN)) + { + bytes_to_encode = MINIMUM (bytes_left, MAX_ENCODED_BYTES - 2); + tmp_buffer[0] = (char) (bytes_read / 256); + tmp_buffer[1] = (char) (bytes_read % 256); + + for (idx = 0; idx < (SIZE_T) bytes_to_encode; idx++) + { + tmp_buffer[2 + idx] = ip_buffer[idx]; + } + vve_line_bytes = enc_line (tmp_buffer, bytes_to_encode + 2, + vv_buffer); + bytes_left -= bytes_to_encode; + buf_ptr += (SIZE_T) bytes_to_encode; + encode_state = ENCODE_DATA; + } + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + else + { + bytes_to_encode = MINIMUM (bytes_left, MAX_ENCODED_BYTES); + vve_line_bytes = enc_line (buf_ptr, bytes_to_encode, + vv_buffer); + bytes_left -= bytes_to_encode; + buf_ptr += (SIZE_T) bytes_to_encode; + } + + /*- + **---------------------------------------------------------------- + ** If a maximum VVE output file size has been specified, check + ** whether this encoded line will cause that maximum size to be + ** exceeded. + **---------------------------------------------------------------- + */ + if (Q_SPLIT) + { + vve_room_needed = vve_line_bytes + TEXT_LINE_OVERHEAD + + VV_POSTAMBLE_LEN; + + if ((G_oppart_bytes + vve_room_needed) >= G_split_size) + { + start_next_op_file (G_overwrite_flag, &G_op_file, + &G_oppt_no); + G_op_file.bytecount += G_oppart_bytes; + G_oppart_bytes = 0L; + wr_headers (G_oppt_no); + } + } + + /*- + **---------------------------------------------------------------- + ** Write the encoded line to the VVE file. + **---------------------------------------------------------------- + */ + VVEOUT (vv_buffer); + } /* while (bytes_left > 0L) */ + } /* for (;;) */ +} /* encode */ + + + + +/*- +**============================================================================ +** +** FUNCTION +** +** initialize +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void initialize (void) +#else /* NOT (ANSI_SYNTAX) */ + void initialize () +#endif /* (ANSI_SYNTAX) */ +{ + File_Info ex_file_info; + char *def_file_name; + File_Info xlt_file; + + /*- + **------------------------------------------------------------------------ + ** Set up the input file specification from the command line argument. + ** The 'pipe_flag' structure field is also set up. + **------------------------------------------------------------------------ + */ + set_ip_filespec (&G_cmd_ipfile, &G_ip_file); + def_file_name = allocate_buffer ((MAX_PATH + 1), "def_file_name"); + (void) split_file_spec (G_ip_file.file_spec, NULL, def_file_name, + NULL, NULL); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (Q_OVERWRITE) + { + G_overwrite_flag = OVERWRITE_YES; + } + else + if (G_ip_file.pipe_flag == TRUE) + { + G_overwrite_flag = OVERWRITE_NO; + } + else + { + G_overwrite_flag = OVERWRITE_ASK; + } + + /*- + **------------------------------------------------------------------------ + ** If the 'log' qualifier was specified, open the log file. On systems + ** which use 'STICKY_DEFAULTS', this must be done after the input file + ** specification is known. + **------------------------------------------------------------------------ + */ + open_log_file (&G_cmdqual[CMDQ_LOG], def_file_name, G_overwrite_flag, + &G_log_file); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_3 ("VVencode %s, %s release (%s)\n", + VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE); + LOGMSG_1 ("I/P file: %s", G_ip_file.file_spec); + LOGMSG_1 ("Overwrite existing files: %s", + (Q_OVERWRITE ? "yes" : "no")); + LOGMSG_1 ("Log file: %s", G_log_file.file_spec); + LOGMSG ("Encoding method: VVcode\n"); + + /*- + **------------------------------------------------------------------------ + ** Ensure that the local timezone offset from GMT is initialized. + **------------------------------------------------------------------------ + */ + (void) tz_offset (time ((TIME_T) NULL)); + + /*- + **------------------------------------------------------------------------ + ** If we're not reading from standard input, attempt to determine the + ** the key file parameters by examining the file. + **------------------------------------------------------------------------ + */ + if (G_ip_file.pipe_flag != TRUE) + { + strcpy (ex_file_info.file_spec, G_ip_file.file_spec); + examine_file (&ex_file_info); + + LOGMSG_1 ("I/P file mode: %s", + (ex_file_info.mode != INV_MODE) ? + (char *) G_mode_str[ex_file_info.mode] : "unknown"); + LOGMSG_1 ("I/P file format: %s", + (ex_file_info.format != INV_FORMAT) ? + (char *) G_fmt_str[ex_file_info.format] : "unknown"); + + if (ex_file_info.lng_rec_len != INV_RECORD_LEN) + { + LOGMSG_1 ("I/P file longest record length: %ld", + ex_file_info.lng_rec_len); + } + else + { + LOGMSG ("I/P file longest record length: unknown"); + } + + if (ex_file_info.max_rec_len != INV_RECORD_LEN) + { + LOGMSG_1 ("I/P file maximum record length: %ld", + ex_file_info.max_rec_len); + } + else + { + LOGMSG ("I/P file maximum record length: unknown"); + } + + LOGMSG_1 ("I/P file timestamp: %s\n", + (ex_file_info.mod_time != INV_TIMESTAMP) ? + vv_timestamp (ex_file_info.mod_time) : "unknown"); + } + + /*- + **------------------------------------------------------------------------ + ** Set the key File_Info parameters, taking into account the file + ** parameters and the command line qualifier values. + **------------------------------------------------------------------------ + */ + set_mode (&G_cmdqual[CMDQ_MODE], &ex_file_info, G_mode_str, &G_ip_file); + set_format (&G_cmdqual[CMDQ_FORMAT], &ex_file_info, G_fmt_str, &G_ip_file); + set_record_len (&G_cmdqual[CMDQ_RECORDLEN], &ex_file_info, &G_ip_file); + set_timestamp (&G_cmdqual[CMDQ_TIMESTAMP], &ex_file_info, &G_ip_file); + + /*- + **------------------------------------------------------------------------ + ** Get and act upon the other command line qualifiers. + **------------------------------------------------------------------------ + */ + set_hdr_file_spec (&G_cmdqual[CMDQ_HDRFILE], &G_ip_file, &G_hdrf_spec); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + set_enc_tbl (&G_cmdqual[CMDQ_ENCODE], ENCODE_TABLE_LEN, G_encode_table); + set_dec_tbl (ENCODE_TABLE_LEN, G_encode_table, + DECODE_TABLE_LEN, G_decode_table); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (Q_TRANSLATE) + { + strcpy (xlt_file.file_spec, G_cmdqual[CMDQ_TRANSLATE].value); + set_xlt_tbl (&xlt_file, &G_xlt_table, G_xlthdr); + + if (STRCMPI (VV_CHARACTERSET, G_xlt_table.xlt_from) != 0) + { + WARNMSG_2 ("translation file translates from `%s' to `%s'", + G_xlt_table.xlt_from, G_xlt_table.xlt_to); + INFOMSG_1 ("local character set is `%s'", VV_CHARACTERSET); + } + } + else + { + LOGMSG ("Translation performed: none"); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + open_ip_file (&G_cmd_ipfile, &G_ip_file); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + open_op_file (&G_cmd_opfile, def_file_name, G_overwrite_flag, &G_op_file); + set_split_size (&G_op_file, &G_cmdqual[CMDQ_SPLIT], &G_split_size); + + /*- + **------------------------------------------------------------------------ + ** Initialize global variables. + **------------------------------------------------------------------------ + */ + init_crc32_table (CRC32_TABLE_SIZE, CRC32_POLYNOMIAL, G_crc32_table); + G_ip_file.crc32 = CRC32_MASK; + G_ip_file.bytecount = 0L; + G_op_file.bytecount = 0L; + G_oppart_bytes = 0L; + G_oppt_no = 1; + free (def_file_name); + + /*- + **------------------------------------------------------------------------ + ** Write the VVE file header lines. + **------------------------------------------------------------------------ + */ + wr_headers (G_oppt_no); +} /* initialize */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** open_ip_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void open_ip_file (CONST Qualifier_Struct *ip_qualifier, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void open_ip_file (ip_qualifier, ip_file) + CONST Qualifier_Struct *ip_qualifier; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (ip_qualifier->present != TRUE) + { + INTERNAL_ERROR ("open_ip_file"); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (ip_file->pipe_flag == TRUE) + { + ip_file->file_ptr = stdin; + } + else + { + DEBUG_1 ("encode: opening input file `%s'", ip_file->file_spec); + ip_file->file_ptr = f_open_in (ip_file); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (ip_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening input file `%s'", ip_file->file_spec); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((ip_file->pipe_flag == TRUE) || (is_a_file (ip_file) == FALSE)) + { + DEBUG_1 ("open_ip_file: `%s' is not a regular file", + ip_file->file_spec); + ip_file->pipe_flag = TRUE; + set_pipe_mode (ip_file); + } +} /* open_ip_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** open_op_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void open_op_file (CONST Qualifier_Struct *op_qualifier, + CONST char *def_file_name, + CONST Int16 overwrite_flag, + File_Info *op_file) +#else /* NOT (ANSI_SYNTAX) */ + void open_op_file (op_qualifier, def_file_name, + overwrite_flag, op_file) + CONST Qualifier_Struct *op_qualifier; + CONST char *def_file_name; + CONST Int16 overwrite_flag; + File_Info *op_file; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + op_file->file_ptr = (FILE *) NULL; + op_file->mode = MODE_TEXT; + op_file->format = DEF_TEXT_FMT; + op_file->max_rec_len = INV_RECORD_LEN; + op_file->lng_rec_len = INV_RECORD_LEN; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (op_qualifier->present == TRUE) + { + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ +#if (SUPPORT_PIPING) + if (STRCMP (op_qualifier->value, STDIO_SYMBOL) == 0) + { + op_file->pipe_flag = TRUE; + strcpy (op_file->file_spec, "stdout"); + op_file->file_ptr = stdout; + op_file->format = FMT_STREAM; + } + else +#endif /* (SUPPORT_PIPING) */ + + { + strcpy (op_file->file_spec, op_qualifier->value); + + /*- + **---------------------------------------------------------------- + ** The default file spec for the VVencoded file is the name of the + ** input file with the default extension for VVencoded files. + **---------------------------------------------------------------- + */ +#if (STICKY_DEFAULTS) + apply_defaults (def_file_name, DEF_VV_EXT, op_file->file_spec); +#endif /* (STICKY_DEFAULTS) */ + + DEBUG_1 ("open_op_file: opening output file `%s'", + op_file->file_spec); + op_file->file_ptr = f_open_out (overwrite_flag, op_file); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + { + +#if (STDOUT_OUTPUT) + strcpy (op_file->file_spec, "stdout"); + op_file->file_ptr = stdout; + op_file->pipe_flag = TRUE; + +#else /* NOT (STDOUT_OUTPUT) */ + + strcpy (op_file->file_spec, ""); + make_file_spec (NULL, def_file_name, NULL, NULL, op_file->file_spec); + apply_defaults (NULL, DEF_VV_EXT, op_file->file_spec); + DEBUG_1 ("open_op_file: opening output file `%s'", op_file->file_spec); + op_file->file_ptr = f_open_out (overwrite_flag, op_file); + +#endif /* (STDOUT_OUTPUT) */ + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (op_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening output file `%s'", op_file->file_spec); + vv_exit (); + } + LOGMSG_1 ("\nVVE O/P file: %s", op_file->file_spec); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((op_file->pipe_flag == TRUE) || (is_a_file (op_file) == FALSE)) + { + DEBUG_1 ("open_op_file: `%s' is not a regular file", + op_file->file_spec); + op_file->pipe_flag = TRUE; + set_pipe_mode (op_file); + } +} /* open_op_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_enc_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_enc_tbl (CONST Qualifier_Struct *enc_qualifier, + CONST Int16 enc_tbl_len, + char *encode_table) +#else /* NOT (ANSI_SYNTAX) */ + void set_enc_tbl (enc_qualifier, enc_tbl_len, + encode_table) + CONST Qualifier_Struct *enc_qualifier; + CONST Int16 enc_tbl_len; + char *encode_table; +#endif /* (ANSI_SYNTAX) */ +{ + File_Info enc_file; + int status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (enc_qualifier->present == TRUE) + { + strcpy (enc_file.file_spec, enc_qualifier->value); + + /*- + **-------------------------------------------------------------------- + ** If an extension has not been provided, use the default extension + ** for encoding table files. + **-------------------------------------------------------------------- + */ +#if (STICKY_DEFAULTS) + apply_defaults (NULL, DEF_ENC_EXT, enc_file.file_spec); +#endif /* (STICKY_DEFAULTS) */ + + status = rd_enc_tbl (&enc_file, enc_tbl_len, encode_table); + + if (!status) + { + FATALMSG_1 ("error reading encoding table file `%s'", + enc_file.file_spec); + vv_exit (); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + { + DEBUG ("encoding table not specified on the command line"); + strcpy (enc_file.file_spec, "default VVCODE"); + strcpy ((char *) encode_table, VV_ENCODE_TABLE); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("\nEncoding table source: %s", enc_file.file_spec); + LOGMSG_1 ("Encoding table contents: %.32s", encode_table); + LOGMSG_1 (" %.32s", encode_table + 32); +} /* set_enc_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_format +** +** DESCRIPTION +** +** Set the format (fixed/stream/variable) to use when reading and +** encoding the input file. The format may be set from the command +** line, examine_file() or the default specified in machine.h. The +** logic used is: +** +** Cmd ExFile Pipe Result +** ------------------------------ +** Y * * Cmd +** N N N Def +** N Y N ExF +** N * Y Stm +** ------------------------------ +** +** NOTE: if the input file is standard input, examine_file() is not +** called and stream format is used unless it is overrriden +** from the command line. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_format (CONST Qualifier_Struct *fmt_qualifier, + CONST File_Info *ex_file, + CONST char *fmt_str_array[], + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_format (fmt_qualifier, ex_file, fmt_str_array, + ip_file) + CONST Qualifier_Struct *fmt_qualifier; + CONST File_Info *ex_file; + CONST char *fmt_str_array[]; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 cmd_format; + + /*- + **------------------------------------------------------------------------ + ** Get the format specified on the command line (if any). The number of + ** 'if' statements could be reduced by making the second expression more + ** complicated at a cost of less readable code. + **------------------------------------------------------------------------ + */ + cmd_format = getc_format (fmt_qualifier, fmt_str_array); + + if (cmd_format != INV_FORMAT) + { + ip_file->format = cmd_format; + } + else + if (ip_file->pipe_flag == TRUE) + { + ip_file->format = FMT_STREAM; + } + else + if (ex_file->format != INV_FORMAT) + { + ip_file->format = ex_file->format; + } + else + { + if (ip_file->mode == MODE_BINARY) + { + ip_file->format = DEF_BINARY_FMT; + } + else + { + ip_file->format = DEF_TEXT_FMT; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("VVE encoding format: %s", + (ip_file->format != INV_FORMAT) ? + (char *) fmt_str_array[ip_file->format] : "not recorded"); +} /* set_format */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_hdr_file_spec +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_hdr_file_spec ( + CONST Qualifier_Struct *hdr_qualifier, + CONST File_Info *ip_file, + char **hdr_file_spec) +#else /* NOT (ANSI_SYNTAX) */ + void set_hdr_file_spec (hdr_qualifier, ip_file, + hdr_file_spec) + CONST Qualifier_Struct *hdr_qualifier; + CONST File_Info *ip_file; + char **hdr_file_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char file_name[MAX_NAME + 1]; + char file_ext[MAX_EXT + 1]; + +#if (UPPERCASE_FILESYSTEM) + char *tmp_ptr; +#endif /* (UPPERCASE_FILESYSTEM) */ + + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + *hdr_file_spec = allocate_buffer ((MAX_IP_LINE_LEN + 1), "hdr_file_spec"); + if (hdr_qualifier->present == TRUE) + { + strcpy (*hdr_file_spec, hdr_qualifier->value); + } + else + { + (void) split_file_spec (ip_file->file_spec, NULL, file_name, + file_ext, NULL); + make_file_spec (NULL, file_name, file_ext, NULL, *hdr_file_spec); + +#if (UPPERCASE_FILESYSTEM) + for (tmp_ptr = *hdr_file_spec; *tmp_ptr != '\0'; tmp_ptr++) + { + *tmp_ptr = (char) TOLOWER ((int) *tmp_ptr); + } +#endif /* (UPPERCASE_FILESYSTEM) */ + + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("VVE header file spec: %s", *hdr_file_spec); +} /* set_hdr_file_spec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_ip_filespec +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_ip_filespec ( + CONST Qualifier_Struct *ip_qualifier, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_ip_filespec (ip_qualifier, ip_file) + CONST Qualifier_Struct *ip_qualifier; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + if (ip_qualifier->present != TRUE) + { + INTERNAL_ERROR ("set_ip_filespec"); + } + +#if (SUPPORT_PIPING) + + if (STRCMP (ip_qualifier->value, STDIO_SYMBOL) == 0) + { + strcpy (ip_file->file_spec, "stdin"); + ip_file->pipe_flag = TRUE; + } + else + { + strcpy (ip_file->file_spec, ip_qualifier->value); + } + +#else /* NOT (SUPPORT_PIPING) */ + + strcpy (ip_file->file_spec, ip_qualifier->value); + +#endif /* (SUPPORT_PIPING) */ + +} /* set_ip_filespec */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_mode +** +** DESCRIPTION +** +** Set the mode (text/binary) to use when reading and encoding the input +** file. The mode may be set from the command line, examine_file() or +** the default specified in machine.h. The logic used is: +** +** Cmd ExFile Pipe Result +** ------------------------------ +** Y * * Cmd +** N N N Def +** N Y N ExF +** N * Y Def +** ------------------------------ +** +** NOTE: if the input file is standard input, examine_file() is not +** called and the default mode is used unless it is overrriden +** from the command line. +** +** INPUT PARAMETERS +** +** ex_file_info - a File_Info structure containing the results of +** the call to examine_file(). If the input file +** was specified as standard input, this structure +** will not be examined. +** +** OUTPUT PARAMETERS +** +** none +** +** RETURN VALUE +** +** none +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_mode (CONST Qualifier_Struct *mode_qualifier, + CONST File_Info *ex_file, + CONST char *mode_str_array[], + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_mode (mode_qualifier, ex_file, mode_str_array, + ip_file) + CONST Qualifier_Struct *mode_qualifier; + CONST File_Info *ex_file; + CONST char *mode_str_array[]; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 cmd_mode; + + /*- + **------------------------------------------------------------------------ + ** Get the mode specified on the command line (if any). The number of + ** 'if' statements could be reduced by making the second expression more + ** complicated at a cost of less readable code. + **------------------------------------------------------------------------ + */ + cmd_mode = getc_mode (mode_qualifier, mode_str_array); + + if (cmd_mode != INV_MODE) + { + ip_file->mode = cmd_mode; + } + else + if (ip_file->pipe_flag == TRUE) + { + ip_file->mode = DEF_MODE; + } + else + if (ex_file->mode != INV_MODE) + { + ip_file->mode = ex_file->mode; + } + else + { + ip_file->mode = DEF_MODE; + } + + /*- + **------------------------------------------------------------------------ + ** One final check to make sure that the mode is valid. The mode can only + ** come from a validated command line value, examine_file() or the default + ** setting, so it should not be wrong. + **------------------------------------------------------------------------ + */ + switch (ip_file->mode) + { + case MODE_BINARY: + case MODE_TEXT: + break; + default: + FATALMSG_1 ("invalid file encoding mode set (%d)", ip_file->mode); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("VVE encoding mode: %s", + mode_str_array[ip_file->mode]); +} /* set_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_record_len +** +** DESCRIPTION +** +** Set the maximum record length to use when reading and encoding the +** input file. The record length may be set from the command line, +** examine_file() or the default specified in machine.h. The logic used +** is: +** +** Cmd ExFile Pipe Result +** ------------------------------ +** Y * * Cmd +** N N N Def +** N Y N ExF +** N * Y Def +** ------------------------------ +** +** NOTE: if the input file is standard input, examine_file() is not +** called and the default record length is used unless it is +** overrriden from the command line. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_record_len ( + CONST Qualifier_Struct *rec_qualifier, + CONST File_Info *ex_file, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_record_len (rec_qualifier, ex_file, ip_file) + CONST Qualifier_Struct *rec_qualifier; + CONST File_Info *ex_file; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 cmd_reclen; + + /*- + **------------------------------------------------------------------------ + ** Get the record length specified on the command line (if any). The + ** number of 'if' statements could be reduced by making the second + ** expression more complicated at a cost of less readable code. + **------------------------------------------------------------------------ + */ + cmd_reclen = getc_reclen (rec_qualifier, ip_file); + + if (cmd_reclen != INV_RECORD_LEN) + { + ip_file->max_rec_len = cmd_reclen; + ip_file->lng_rec_len = INV_RECORD_LEN; + } + else + if (ip_file->pipe_flag == TRUE) + { + ip_file->max_rec_len = INV_RECORD_LEN; + ip_file->lng_rec_len = INV_RECORD_LEN; + } + else + if (ex_file->max_rec_len != INV_RECORD_LEN) + { + ip_file->max_rec_len = ex_file->max_rec_len; + ip_file->lng_rec_len = ex_file->lng_rec_len; + } + else + { + ip_file->max_rec_len = INV_RECORD_LEN; + ip_file->lng_rec_len = INV_RECORD_LEN; + } + + /*- + **------------------------------------------------------------------------ + ** One final check to make sure that the maximum record length is valid. + ** The longest record length can only come from examine_file() so it + ** should not be wrong. There is an exception: the default may be set to + ** INV_RECORD_LEN so that f_open_in() will use a default value. + **------------------------------------------------------------------------ + */ + if (ip_file->lng_rec_len == INV_RECORD_LEN) + { + LOGMSG ("VVE longest record length: not recorded"); + } + else if (ip_file->format == FMT_VARIABLE) + { + if ((ip_file->lng_rec_len < MIN_VARIABLE_RECORD_LEN) + || (ip_file->lng_rec_len > MAX_VARIABLE_RECORD_LEN)) + { + FATALMSG_1 ("invalid longest record length set (%ld)", + ip_file->lng_rec_len); + vv_exit (); + } + LOGMSG_1 ("VVE longest record length: %ld", + ip_file->lng_rec_len); + } + else if (ip_file->format == FMT_FIXED) + { + if ((ip_file->lng_rec_len < MIN_FIXED_RECORD_LEN) + || (ip_file->lng_rec_len > MAX_FIXED_RECORD_LEN)) + { + FATALMSG_1 ("invalid longest record length set (%ld)", + ip_file->lng_rec_len); + vv_exit (); + } + LOGMSG_1 ("VVE longest record length: %ld", + ip_file->lng_rec_len); + } + + + /*- + **------------------------------------------------------------------------ + ** One final check to make sure that the maximum record length is valid. + ** The record length can only come from a validated command line value, + ** examine_file() or the default setting, so it should not be wrong. + ** There is an exception: the default may be set to INV_RECORD_LEN so that + ** f_open_in() will use a default value. + **------------------------------------------------------------------------ + */ + if (ip_file->max_rec_len == INV_RECORD_LEN) + { + LOGMSG ("VVE maximum record length: not recorded"); + } + else if (ip_file->format == FMT_VARIABLE) + { + if ((ip_file->max_rec_len < MIN_VARIABLE_RECORD_LEN) + || (ip_file->max_rec_len > MAX_VARIABLE_RECORD_LEN)) + { + FATALMSG_1 ("invalid maximum record length set (%ld)", + ip_file->max_rec_len); + vv_exit (); + } + LOGMSG_1 ("VVE maximum record length: %ld", + ip_file->max_rec_len); + } + else if (ip_file->format == FMT_FIXED) + { + if ((ip_file->max_rec_len < MIN_FIXED_RECORD_LEN) + || (ip_file->max_rec_len > MAX_FIXED_RECORD_LEN)) + { + FATALMSG_1 ("invalid maximum record length set (%ld)", + ip_file->max_rec_len); + vv_exit (); + } + LOGMSG_1 ("VVE maximum record length: %ld", + ip_file->max_rec_len); + } +} /* set_record_len */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_split_size +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_split_size (CONST File_Info *op_file, + Qualifier_Struct *split_qualifier, + Int32 *split_size) +#else /* NOT (ANSI_SYNTAX) */ + void set_split_size (op_file, split_qualifier, + split_size) + CONST File_Info *op_file; + Qualifier_Struct *split_qualifier; + Int32 *split_size; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 tmp_split_size; + int status; + + if (split_qualifier->present != TRUE) + { + DEBUG ("split size not specified on the command line"); + LOGMSG ("VVE O/P file maximum size: no maximum"); + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (op_file->pipe_flag == TRUE) + { + split_qualifier->present = FALSE; + WARNMSG ("not encoding to a file - file splitting disabled"); + LOGMSG ("VVE O/P file maximum size: no maximum"); + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + tmp_split_size = -1; + status = sscanf (split_qualifier->value, "%ld", &tmp_split_size); + + if ((status != 1) || (tmp_split_size <= 0)) + { + USAGE_1 ("invalid split size specified `%s'", split_qualifier->value); + } + + if (tmp_split_size < (Int32) MIN_SPLIT_SIZE) + { + USAGE_1 ("split size must be at least %ld kB", (Int32) MIN_SPLIT_SIZE); + } + *split_size = tmp_split_size * 1024L; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("VVE O/P file maximum size: %ld kB", tmp_split_size); +} /* set_split_size */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_timestamp +** +** DESCRIPTION +** +** Set the timestamp to record in the VVE file. The timestamp may be +** set from the command line or by examine_file(). The logic used is: +** +** Cmd ExFile Pipe Result +** ------------------------------ +** Y * * Cmd +** N N N Inv +** N Y N ExF +** N * Y Inv +** ------------------------------ +** +** NOTE: if the input file is standard input, examine_file() is not +** called and the timestamp is set to INV_TIMESTAMP unless it is +** overrriden from the command line. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) +void set_timestamp ( + CONST Qualifier_Struct *time_qualifier, + CONST File_Info *ex_file, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + void set_timestamp (time_qualifier, ex_file, ip_file) + CONST Qualifier_Struct *time_qualifier; + CONST File_Info *ex_file; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + TIME_T cmd_timestamp; + + /*- + **------------------------------------------------------------------------ + ** Get the timestamp specified on the command line (if any). The number + ** of 'if' statements could be reduced by making the second expression + ** more complicated at a cost of less readable code. + **------------------------------------------------------------------------ + */ + cmd_timestamp = getc_timestamp (time_qualifier); + + if (cmd_timestamp != INV_TIMESTAMP) + { + ip_file->mod_time = cmd_timestamp; + } + else + if (ip_file->pipe_flag == TRUE) + { + ip_file->mod_time = INV_TIMESTAMP; + } + else + if (ex_file->mod_time != INV_TIMESTAMP) + { + ip_file->mod_time = ex_file->mod_time; + } + else + { + ip_file->mod_time = INV_TIMESTAMP; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("VVE file timestamp: %s", + (ip_file->mod_time != INV_TIMESTAMP) ? + vv_timestamp (ip_file->mod_time) : "not recorded"); +} /* set_timestamp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** start_next_op_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void start_next_op_file (CONST Int16 overwrite_flag, + File_Info *op_file, + Int16 *op_part_no) +#else /* NOT (ANSI_SYNTAX) */ + void start_next_op_file (overwrite_flag, op_file, + op_part_no) + CONST Int16 overwrite_flag; + File_Info *op_file; + Int16 *op_part_no; +#endif /* (ANSI_SYNTAX) */ +{ + char next_file_ext[MAX_EXT + 1]; + char tmp_buffer[32]; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (++(*op_part_no) > MAX_VV_PARTS) + { + FATALMSG_1 ("maximum number of parts reached (%d)", MAX_VV_PARTS); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + (void) enc_line ("", 0L, tmp_buffer); + VVEOUT (tmp_buffer); + + VVEOUT_2 ("%sskipto %d\n", VV_PREFIX, *op_part_no); + f_close (op_file); + + LOGMSG_2 ("Part %3d bytes written: %ld", + (*op_part_no - 1), G_oppart_bytes); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + SPRINTF (next_file_ext, VV_EXT_FMT, *op_part_no); + force_file_ext (next_file_ext, op_file->file_spec); + op_file->file_ptr = f_open_out (overwrite_flag, op_file); + + if (op_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening output file `%s'", op_file->file_spec); + vv_exit (); + } +} /* start_next_op_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** terminate +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void terminate (void) +#else /* NOT (ANSI_SYNTAX) */ + void terminate () +#endif /* (ANSI_SYNTAX) */ +{ + char tmp_buffer[32]; + + G_ip_file.crc32 = G_ip_file.crc32 ^ CRC32_MASK; + + /*- + **------------------------------------------------------------------------ + ** Write the line of zero encoded bytes to signify the end of encoded + ** data. + **------------------------------------------------------------------------ + */ + (void) enc_line ("", 0L, tmp_buffer); + VVEOUT (tmp_buffer); + + /*- + **------------------------------------------------------------------------ + ** End header. + **------------------------------------------------------------------------ + */ + VVEOUT_2 ("%s%s\n", VV_PREFIX, G_vvehdr[HDR_END].h_string); + + /*- + **------------------------------------------------------------------------ + ** Bytecount header. + **------------------------------------------------------------------------ + */ + VVEOUT_3 ("%s%s %ld\n", VV_PREFIX, + G_vvehdr[HDR_BYTECOUNT].h_string, G_ip_file.bytecount); + + /*- + **------------------------------------------------------------------------ + ** Crc32 header. + **------------------------------------------------------------------------ + */ + VVEOUT_3 ("%s%s %08lx\n", VV_PREFIX, + G_vvehdr[HDR_CRC32].h_string, G_ip_file.crc32); + G_op_file.bytecount += G_oppart_bytes; + LOGMSG_2 ("Part %3d bytes written: %ld", + G_oppt_no, G_oppart_bytes); + + /*- + **------------------------------------------------------------------------ + ** Close the input file if it's not connected to stdin. + **------------------------------------------------------------------------ + */ + if (G_ip_file.file_ptr != stdin) + { + f_close (&G_ip_file); + } + + /*- + **------------------------------------------------------------------------ + ** Close the output file if it's not connected to stdout. + **------------------------------------------------------------------------ + */ + if (G_op_file.file_ptr != stdout) + { + f_close (&G_op_file); + } + + /*- + **------------------------------------------------------------------------ + ** Finish off the log file, then close it if it's not connected to stderr. + **------------------------------------------------------------------------ + */ + LOGMSG_1 ("\nCRC-32: %08lx", G_ip_file.crc32); + LOGMSG_1 ("Total bytes read: %ld", G_ip_file.bytecount); + LOGMSG_1 ("Total bytes written: %ld", G_op_file.bytecount); + LOGMSG_1 ("Total O/P parts written: %d", G_oppt_no); + + if (G_log_file.file_ptr != stderr) + { + f_close (&G_log_file); + } + +} /* terminate */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** usage_error +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void usage_error (CONST char *reason) +#else /* NOT (ANSI_SYNTAX) */ + void usage_error (reason) + CONST char *reason; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** Initial error message, followed by Unix style usage message. + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, "\nVVencode %s, %s release (%s)\n\n", + VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE); + FPRINTF (stderr, "VVencode: %s\n\n", reason); + FPRINTF (stderr, + "Usage: VVencode [qualifiers] input_file [output_file]\n\n"); + FPRINTF (stderr, " Valid qualifiers are:\n\n"); + + /*- + **------------------------------------------------------------------------ + ** qualifier: 'debug' (if support compiled in) + **------------------------------------------------------------------------ + */ +#if (VV_DEBUG_SUPPORT) + FPRINTF (stderr, " %.1s%s\n", QUAL_INTRO, G_cmdqual[CMDQ_DEBUG].q_string); +#endif /* (VV_DEBUG_SUPPORT) */ + + /*- + **------------------------------------------------------------------------ + ** qualifier: 'encoding_table' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s%.1sfile-spec\n", + QUAL_INTRO, G_cmdqual[CMDQ_ENCODE].q_string, QUAL_SEP); + + /*- + **------------------------------------------------------------------------ + ** qualifier: 'format' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s%.1sfile-format (formats supported:%s%s%s%s%s%s)\n", + QUAL_INTRO, G_cmdqual[CMDQ_FORMAT].q_string, QUAL_SEP, + +#if (SUPPORT_FIXED_FMT) + " ", G_fmt_str[FMT_FIXED], +#else /* NOT (SUPPORT_FIXED_FMT) */ + "", "", +#endif /* (SUPPORT_FIXED_FMT) */ + +#if (SUPPORT_STREAM_FMT) + " ", G_fmt_str[FMT_STREAM], +#else /* NOT (SUPPORT_STREAM_FMT) */ + "", "", +#endif /* (SUPPORT_STREAM_FMT) */ + +#if (SUPPORT_VARIABLE_FMT) + " ", G_fmt_str[FMT_VARIABLE]); +#else /* NOT (SUPPORT_VARIABLE_FMT) */ + "", ""); +#endif /* (SUPPORT_VARIABLE_FMT) */ + + /*- + **------------------------------------------------------------------------ + ** qualifiers: 'header_filespec', 'help', 'log', 'mode' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s%.1sfile-spec\n", + QUAL_INTRO, G_cmdqual[CMDQ_HDRFILE].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s\n", + QUAL_INTRO, G_cmdqual[CMDQ_HELP].q_string); + FPRINTF (stderr, " %.1s%s[%.1sfile-spec]\n", + QUAL_INTRO, G_cmdqual[CMDQ_LOG].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s%.1sfile-mode (modes supported: binary text)\n", + QUAL_INTRO, G_cmdqual[CMDQ_MODE].q_string, QUAL_SEP); + + /*- + **------------------------------------------------------------------------ + ** qualifiers: 'overwrite', 'record_length', 'split_size' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s\n", + QUAL_INTRO, G_cmdqual[CMDQ_OVERWRITE].q_string); + FPRINTF (stderr, " %.1s%s%.1sbytes\n", + QUAL_INTRO, G_cmdqual[CMDQ_RECORDLEN].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s%.1skbytes\n", + QUAL_INTRO, G_cmdqual[CMDQ_SPLIT].q_string, QUAL_SEP); + + /*- + **------------------------------------------------------------------------ + ** qualifiers: 'timestamp', 'translation_file' + **------------------------------------------------------------------------ + */ + FPRINTF (stderr, " %.1s%s[%.1stime]\n", + QUAL_INTRO, G_cmdqual[CMDQ_TIMESTAMP].q_string, QUAL_SEP); + FPRINTF (stderr, " %.1s%s%.1sfile-spec\n\n", + QUAL_INTRO, G_cmdqual[CMDQ_TRANSLATE].q_string, QUAL_SEP); + + G_status = FATAL_STATUS; + vv_exit (); +} /* usage_error */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** enc_line +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 enc_line (CONST char *ip_buffer, + CONST Int32 num_bytes, + char *op_buffer) +#else /* NOT (ANSI_SYNTAX) */ + Int32 enc_line (ip_buffer, num_bytes, op_buffer) + CONST char *ip_buffer; + CONST Int32 num_bytes; + char *op_buffer; +#endif /* (ANSI_SYNTAX) */ +{ + int c1; + int c2; + int c3; + int c4; + SIZE_T idx; + int offset; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + strcpy (op_buffer, VV_PREFIX); + offset = strlen (op_buffer); + op_buffer[offset++] = ENCODE ((SIZE_T) num_bytes); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (idx = 0; idx < (SIZE_T) num_bytes; idx += 3) + { + c1 = (int) ip_buffer[idx] >> 2; + c2 = (int) ((ip_buffer[idx] << 4) & 0x30) + | ((ip_buffer[idx + 1] >> 4) & 0x0f); + c3 = (int) ((ip_buffer[idx + 1] << 2) & 0x3c) + | ((ip_buffer[idx + 2] >> 6) & 0x03); + c4 = (int) (ip_buffer[idx + 2] & 0x3f); + + op_buffer[offset++] = ENCODE (c1); + op_buffer[offset++] = ENCODE (c2); + op_buffer[offset++] = ENCODE (c3); + op_buffer[offset++] = ENCODE (c4); + } + op_buffer[offset] = '\0'; + strcat (op_buffer, VV_EOL_MARKER); + strcat (op_buffer, "\n"); + return ((Int32) strlen (op_buffer)); +} /* enc_line */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** wr_headers +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void wr_headers (CONST Int16 part_no) +#else /* NOT (ANSI_SYNTAX) */ + void wr_headers (part_no) + CONST Int16 part_no; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 adv_line; + + LOGMSG_2 ("\nPart %3d O/P file: %s", + G_oppt_no, G_op_file.file_spec); + LOGMSG_2 ("Part %3d started at I/P byte: %ld", + G_oppt_no, G_ip_file.bytecount); + + /*- + **------------------------------------------------------------------------ + ** Write the VVcode advert text at the top of the VVE file. + **------------------------------------------------------------------------ + */ + for (adv_line = 0; G_vv_advert[adv_line] != NULL; adv_line++) + { + VVEOUT_1 ("%s\n", G_vv_advert[adv_line]); + } + VVEOUT_1 ("Written by VVencode %s,\n", VV_VERSION_STR); + VVEOUT_2 (" %s release (%s)\n", VV_IMPLEMENTATION, VV_DATE); + VVEOUT ("\n"); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (part_no == 1) + { + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'decodeversion' + **-------------------------------------------------------------------- + */ + VVEOUT_3 ("%s%s %d\n", VV_PREFIX, + G_vvehdr[HDR_DECODEVERSION].h_string, VV_MAJOR_VERSION_NO); + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'operating system' + **-------------------------------------------------------------------- + */ + VVEOUT_3 ("%s%s %s\n", VV_PREFIX, + G_vvehdr[HDR_OPERATINGSYSTEM].h_string, VV_OPERATING_SYSTEM); + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'characterset' + ** + ** If the /TRANSLATE qualifier was used, add a 'comment' header + ** recording the original character set (even if it was the same as + ** the translated character set). + **-------------------------------------------------------------------- + */ + if (Q_TRANSLATE) + { + VVEOUT_3 ("%s%s %s\n", VV_PREFIX, + G_vvehdr[HDR_CHARACTERSET].h_string, G_xlt_table.xlt_to); + VVEOUT_3 ("%s%s Original file character set was %s\n", + VV_PREFIX, G_vvehdr[HDR_COMMENT].h_string, + VV_CHARACTERSET); + } + else + { + VVEOUT_3 ("%s%s %s\n", VV_PREFIX, + G_vvehdr[HDR_CHARACTERSET].h_string, VV_CHARACTERSET); + } + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'mode' + **-------------------------------------------------------------------- + */ + VVEOUT_3 ("%s%s %s\n", VV_PREFIX, + G_vvehdr[HDR_MODE].h_string, G_mode_str[G_ip_file.mode]); + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'format' + **-------------------------------------------------------------------- + */ + VVEOUT_3 ("%s%s %s\n", VV_PREFIX, + G_vvehdr[HDR_FORMAT].h_string, G_fmt_str[G_ip_file.format]); + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'recordlength' + ** + ** This header is included only if a valid record length was + ** determined. + **-------------------------------------------------------------------- + */ + if (G_ip_file.max_rec_len != INV_RECORD_LEN) + { + if (G_ip_file.lng_rec_len != INV_RECORD_LEN) + { + VVEOUT_4 ("%s%s %ld %ld\n", VV_PREFIX, + G_vvehdr[HDR_RECORDLEN].h_string, + G_ip_file.max_rec_len, G_ip_file.lng_rec_len); + } + else + { + VVEOUT_3 ("%s%s %ld\n", VV_PREFIX, + G_vvehdr[HDR_RECORDLEN].h_string, + G_ip_file.max_rec_len); + } + } + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'timestamp' + ** + ** This header is included only if a valid timestamp was determined. + **-------------------------------------------------------------------- + */ + if (G_ip_file.mod_time != INV_TIMESTAMP) + { + VVEOUT_3 ("%s%s %s\n", VV_PREFIX, + G_vvehdr[HDR_TIMESTAMP].h_string, + vv_timestamp (G_ip_file.mod_time)); + } + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'table' + ** + ** The 'table' header is followed by the encoding table. + **-------------------------------------------------------------------- + */ + VVEOUT_2 ("%s%s\n", VV_PREFIX, G_vvehdr[HDR_TABLE].h_string); + VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table); + VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table + 32); + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'begin' + **-------------------------------------------------------------------- + */ + VVEOUT_3 ("%s%s %s\n", VV_PREFIX, + G_vvehdr[HDR_BEGIN].h_string, G_hdrf_spec); + } + else + { + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'table' + ** + ** The 'table' header is followed by the encoding table. + **-------------------------------------------------------------------- + */ + VVEOUT_2 ("%s%s\n", VV_PREFIX, G_vvehdr[HDR_TABLE].h_string); + VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table); + VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table + 32); + + /*- + **-------------------------------------------------------------------- + ** VVE header: 'skipfrom' + **-------------------------------------------------------------------- + */ + VVEOUT_4 ("%s%s %d %s\n", VV_PREFIX, + G_vvehdr[HDR_SKIPFROM].h_string, G_oppt_no, G_hdrf_spec); + } +} /* wr_headers */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** main +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + int main (CONST int argc, CONST char *argv[]) +#else /* NOT (ANSI_SYNTAX) */ + int main (argc, argv) + CONST int argc; + CONST char *argv[]; +#endif /* (ANSI_SYNTAX) */ +{ + SIZE_T bytes_reqd; + + G_status = LOG_STATUS; + G_debugging = FALSE; + + /*- + **------------------------------------------------------------------------ + ** Allocate the global message buffer manually since it is used by the + ** various MESSAGE_x and DEBUG_x macros. + **------------------------------------------------------------------------ + */ + bytes_reqd = sizeof (char) * (SIZE_T) MAX_MSG_LEN; + G_tmp_msg = (char *) malloc (bytes_reqd); + + if (G_tmp_msg == NULL) + { + FPRINTF (stderr, "%s %ld bytes for the message buffer\n", + "FATAL: unable to allocate", bytes_reqd); + + G_status = FATAL_STATUS; + vv_exit (); + } + DEBUG_2 ("main: allocated %ld bytes for buffer `%s'", + (Int32) bytes_reqd, "G_tmp_msg"); + + /*- + **------------------------------------------------------------------------ + ** Allocate the other global buffers. + **------------------------------------------------------------------------ + */ + G_ip_buffer = allocate_buffer ((SIZE_T) IP_BUFFER_SIZE, "G_ip_buffer"); + G_op_buffer = allocate_buffer ((SIZE_T) OP_BUFFER_SIZE, "G_op_buffer"); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + scan_cmd_line (argc, argv, QUAL_INTRO, QUAL_SEP, G_cmdqual, + &G_cmd_ipfile, &G_cmd_opfile); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ +#if (VV_DEBUG_SUPPORT) +#else /* NOT (VV_DEBUG_SUPPORT) */ + if (Q_DEBUG) + { + WARNMSG ("Debugging support was not compiled into VVencode"); + } + G_debugging = FALSE; + G_cmdqual[CMDQ_DEBUG].present = FALSE; +#endif /* (VV_DEBUG_SUPPORT) */ + + /*- + **------------------------------------------------------------------------ + ** If the 'help' option was selected, call usage_error() and stop. + **------------------------------------------------------------------------ + */ + if (Q_HELP) + { + USAGE ("help requested"); + } + + /*- + **------------------------------------------------------------------------ + ** If the 'debug' option was selected, ensure that the 'log' option is + ** selected. + **------------------------------------------------------------------------ + */ + if (Q_DEBUG) + { + G_debugging = TRUE; + if (!Q_LOG) + { + G_cmdqual[CMDQ_LOG].present = TRUE; + G_cmdqual[CMDQ_LOG].value = NULL; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (!Q_INPUT_FILE) + { + USAGE ("input file must be specified"); + } + + initialize (); + encode (); + terminate (); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + vv_exit (); + return (0); +} /* main */ diff --git a/support/vvcode/vveparse.c b/support/vvcode/vveparse.c new file mode 100644 index 0000000000..c197f27e99 --- /dev/null +++ b/support/vvcode/vveparse.c @@ -0,0 +1,913 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vveparse.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** chk_skipfrom [tbs] +** getv_characterset - +** getv_decodeversion - +** getv_format - +** getv_mode - +** getv_operatingsystem - +** getv_reclen - +** getv_timestamp - +** parse_begin_header - +** rd_next_line - +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + + +/*- +**---------------------------------------------------------------------------- +** Include files +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" +#include "vveparse.h" + + +/*- +**============================================================================ +** +** FUNCTION +** +** chk_skipfrom +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean chk_skipfrom (CONST char *line_ptr, + CONST Int16 part_needed, + CONST char *hdr_file_spec, + CONST Header_Struct *skipfrom_hdr, + File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Boolean chk_skipfrom (line_ptr, part_needed, hdr_file_spec, + skipfrom_hdr, ip_file) + CONST char *line_ptr; + CONST Int16 part_needed; + CONST char *hdr_file_spec; + CONST Header_Struct *skipfrom_hdr; + File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + char pt_file_spec[MAX_IP_LINE_LEN + 1]; + Int16 pt_no; + int fields_read; + + strcpy (pt_file_spec, ""); + + /*- + **------------------------------------------------------------------------ + ** Header syntax: skipfrom <WS> part-no <WS> file-spec <WS> <EOL> + ** + ** The file-spec parameter may include whitespace, but leading or trailing + ** whitespace will be ignored. The Unix file "one two three" would be + ** supported with a skipfrom header like: + ** + ** skipfrom 1 one two three <EOL> + **------------------------------------------------------------------------ + */ + fields_read = sscanf (line_ptr, "%*s %hd %[^\n]", &pt_no, pt_file_spec); + + if (fields_read < 2) + { + FATALMSG_1 ("error parsing `%s' header value", skipfrom_hdr->h_string); + show_file_context (ip_file, line_ptr); + vv_exit (); + } + vstrtrws (pt_file_spec); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((pt_no == part_needed) && (STRCMP (hdr_file_spec, pt_file_spec) == 0)) + { + return (TRUE); + } + return (FALSE); +} /* chk_skipfrom */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getv_characterset +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void getv_characterset ( + CONST Header_Struct *characterset_hdr, + char **character_set) +#else /* NOT (ANSI_SYNTAX) */ + void getv_characterset (characterset_hdr, character_set) + CONST Header_Struct *characterset_hdr; + char **character_set; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (characterset_hdr->present != TRUE) + { + *character_set = STRDUP (VV_CHARACTERSET); + LOGMSG ("VVE character set: not recorded"); + WARNMSG ("VVE file character set was not recorded"); + INFOMSG_1 ("local character set `%s' assumed", VV_CHARACTERSET); + + } + else + { + *character_set = STRDUP (characterset_hdr->value); + LOGMSG_1 ("VVE character set: %s", *character_set); + } +} /* getv_characterset*/ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getv_decodeversion +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void getv_decodeversion ( + CONST Header_Struct *decodeversion_hdr, + Int16 *decode_version) +#else /* NOT (ANSI_SYNTAX) */ + void getv_decodeversion (decodeversion_hdr, + decode_version) + CONST Header_Struct *decodeversion_hdr; + Int16 *decode_version; +#endif /* (ANSI_SYNTAX) */ +{ + int fields_read; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + *decode_version = 0; + if (decodeversion_hdr->present != TRUE) + { + LOGMSG ("VVE minimum decode version: not recorded"); + return; + } + + fields_read = sscanf (decodeversion_hdr->value, "%hd", decode_version); + + if (fields_read != 1) + { + ERRORMSG_2 ("Error parsing `%s' header value: `%s'", + decodeversion_hdr->h_string, decodeversion_hdr->value); + } + else + { + LOGMSG_1 ("VVE minimum decode version: %d.0", *decode_version); + } +} /* getv_decodeversion */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getv_format +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void getv_format (CONST Header_Struct *format_hdr, + CONST char *format_str_array[], + File_Info *vve_file) +#else /* NOT (ANSI_SYNTAX) */ + void getv_format (format_hdr, format_str_array, vve_file) + CONST Header_Struct *format_hdr; + CONST char *format_str_array[]; + File_Info *vve_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 format_no; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + vve_file->format = INV_FORMAT; + + if (format_hdr->present != TRUE) + { + LOGMSG ("VVE format: not recorded"); + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + format_no = lookup_key (format_str_array, format_hdr->value, + NO_ABBREVIATIONS, CASE_INSENSITIVE); + + switch (format_no) + { + case FMT_FIXED: + case FMT_STREAM: + case FMT_VARIABLE: + LOGMSG_1 ("VVE format: %s", + format_str_array[format_no]); + vve_file->format = format_no; + break; + default: + ERRORMSG_2 ("invalid `%s' header value: `%s'", + format_hdr->h_string, format_hdr->value); + break; + } + return; +} /* getv_format */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getv_mode +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void getv_mode (CONST Header_Struct *mode_hdr, + CONST char *mode_str_array[], + File_Info *vve_file) +#else /* NOT (ANSI_SYNTAX) */ + void getv_mode (mode_hdr, mode_str_array, vve_file) + CONST Header_Struct *mode_hdr; + CONST char *mode_str_array[]; + File_Info *vve_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 mode_no; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + vve_file->mode = INV_MODE; + + if (mode_hdr->present != TRUE) + { + LOGMSG ("\nVVE mode: not recorded"); + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + mode_no = lookup_key (mode_str_array, mode_hdr->value, + NO_ABBREVIATIONS, CASE_INSENSITIVE); + + switch (mode_no) + { + case MODE_BINARY: + case MODE_TEXT: + LOGMSG_1 ("\nVVE mode: %s", + mode_str_array[mode_no]); + vve_file->mode = mode_no; + break; + default: + ERRORMSG_2 ("invalid `%s' header value: `%s'", + mode_hdr->h_string, mode_hdr->value); + break; + } + return; +} /* getv_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getv_operatingsystem +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void getv_operatingsystem ( + CONST Header_Struct *operatingsystem_hdr, + char **operating_system) +#else /* NOT (ANSI_SYNTAX) */ + void getv_operatingsystem (operatingsystem_hdr, + operating_system) + CONST Header_Struct *operatingsystem_hdr; + char **operating_system; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (operatingsystem_hdr->present != TRUE) + { + *operating_system = STRDUP (VV_OPERATING_SYSTEM); + LOGMSG ("VVE operating system: not recorded"); + WARNMSG ("VVE file operating system was not recorded"); + INFOMSG_1 ("local operating system `%s' assumed", VV_OPERATING_SYSTEM); + } + else + { + *operating_system = STRDUP (operatingsystem_hdr->value); + LOGMSG_1 ("VVE operating system: %s", *operating_system); + } +} /* getv_operatingsystem */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getv_reclen +** +** DESCRIPTION +** +** [tbs] +** +** NOTE: define record length meanings +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void getv_reclen (CONST Header_Struct *reclen_hdr, + File_Info *vve_file) +#else /* NOT (ANSI_SYNTAX) */ + void getv_reclen (reclen_hdr, vve_file) + CONST Header_Struct *reclen_hdr; + File_Info *vve_file; +#endif /* (ANSI_SYNTAX) */ +{ + int no_values; + char dummy1[MAX_IP_LINE_LEN + 1]; + char dummy2[MAX_IP_LINE_LEN + 1]; + int status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + vve_file->max_rec_len = INV_RECORD_LEN; + vve_file->lng_rec_len = INV_RECORD_LEN; + + if (reclen_hdr->present != TRUE) + { + LOGMSG ("VVE longest record length: not recorded"); + LOGMSG ("VVE maximum record length: not recorded"); + return; + } + + /*- + **------------------------------------------------------------------------ + ** Check how many values are with the recordlength header. There should + ** be one or two. + **------------------------------------------------------------------------ + */ + no_values = sscanf (reclen_hdr->value, "%s %s", dummy1, dummy2); + + switch (no_values) + { + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case 2: + status = sscanf (dummy2, "%ld", &vve_file->lng_rec_len); + if ((status != 1) + || (vve_file->lng_rec_len < 0) + || (vve_file->lng_rec_len > MAX_VV_RECORD_LEN)) + { + vve_file->lng_rec_len = INV_RECORD_LEN; + ERRORMSG_2 ("Invalid second value of `%s' header: `%s'", + reclen_hdr->h_string, reclen_hdr->value); + } + else + { + LOGMSG_1 ("VVE longest record length: %ld", + vve_file->lng_rec_len); + } + break; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + case 1: + status = sscanf (dummy1, "%ld", &vve_file->max_rec_len); + if ((status != 1) + || (vve_file->max_rec_len < 0) + || (vve_file->max_rec_len > MAX_VV_RECORD_LEN)) + { + vve_file->max_rec_len = INV_RECORD_LEN; + ERRORMSG_2 ("Invalid first value of `%s' header: `%s'", + reclen_hdr->h_string, reclen_hdr->value); + } + else + { + LOGMSG_1 ("VVE maximum record length: %ld", + vve_file->max_rec_len); + } + break; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + default: + ERRORMSG_2 ("Error parsing `%s' header value: `%s'", + reclen_hdr->h_string, reclen_hdr->value); + break; + } +} /* getv_reclen */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getv_timestamp +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void getv_timestamp (CONST Header_Struct *timestamp_hdr, + File_Info *vve_file) +#else /* NOT (ANSI_SYNTAX) */ + void getv_timestamp (timestamp_hdr, vve_file) + CONST Header_Struct *timestamp_hdr; + File_Info *vve_file; +#endif /* (ANSI_SYNTAX) */ +{ + TIME_T timestamp; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + vve_file->mod_time = INV_TIMESTAMP; + + if (timestamp_hdr->present != TRUE) + { + LOGMSG ("VVE timestamp: not recorded"); + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + timestamp = pars_time (timestamp_hdr->value); + + if (timestamp != INV_TIMESTAMP) + { + vve_file->mod_time = timestamp; + LOGMSG_1 ("VVE timestamp: %s", + vv_timestamp (vve_file->mod_time)); + } + else + { + ERRORMSG_2 ("invalid `%s' header value: `%s'", + timestamp_hdr->h_string, timestamp_hdr->value); + } +} /* getv_timestamp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** parse_begin_header +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void parse_begin_header (CONST char *line_ptr, + CONST File_Info *ip_file, + CONST Int16 decoding_type, + Header_Struct *hdr_struct, + char **hdr_file_spec) +#else /* NOT (ANSI_SYNTAX) */ + void parse_begin_header (line_ptr, ip_file, + decoding_type, hdr_struct, + hdr_file_spec) + CONST char *line_ptr; + CONST File_Info *ip_file; + CONST Int16 decoding_type; + Header_Struct *hdr_struct; + char **hdr_file_spec; +#endif /* (ANSI_SYNTAX) */ +{ + char *begin_value_buffer; + int fields_read; + + *hdr_file_spec = NULL; + begin_value_buffer = allocate_buffer ((MAX_IP_LINE_LEN + 1), + "begin_value_buffer"); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (decoding_type == VV_DECODING) + { + fields_read = sscanf (line_ptr, "%*s %[^\n]", begin_value_buffer); + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (fields_read == 1) + { + *hdr_file_spec = STRDUP (begin_value_buffer); + } + else + { + FATALMSG_1 ("error parsing value of `%s' header", + hdr_struct->h_string); + show_file_context (ip_file, line_ptr); + vv_exit (); + } + + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + { + fields_read = sscanf (line_ptr, "%*s %*s %[^\n]", begin_value_buffer); + + if (fields_read == 1) + { + *hdr_file_spec = STRDUP (begin_value_buffer); + } + else + { + FATALMSG_1 ("error parsing value of UU/XXcode `%s' header", + hdr_struct->h_string); + show_file_context (ip_file, line_ptr); + vv_exit (); + } + } + vstrtrws (*hdr_file_spec); + hdr_struct->present = TRUE; + free (begin_value_buffer); +} /* parse_begin_header */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** rd_next_line +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *rd_next_line (CONST Int32 max_chars, + CONST char *vve_line_prefix, + char *buffer, + File_Info *ip_file, + Int32 *byte_count) +#else /* NOT (ANSI_SYNTAX) */ + char *rd_next_line (max_chars, vve_line_prefix, + buffer, ip_file, byte_count) + CONST Int32 max_chars; + CONST char *vve_line_prefix; + char *buffer; + File_Info *ip_file; + Int32 *byte_count; +#endif /* (ANSI_SYNTAX) */ +{ + char *eol_ptr; + Int32 status; + int pfx_len; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (;;) + { + status = read_line (max_chars, buffer, ip_file); + buffer[(SIZE_T) max_chars - 1] = '\0'; + + if (status < 0) + { + return (NULL); + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + *byte_count += strlen (buffer); + eol_ptr = STRRCHR (buffer, '\n'); + + if (eol_ptr != NULL) + { + *eol_ptr = '\0'; + } + else + { + eol_ptr = &buffer[(SIZE_T) (max_chars - 1)]; + } + ip_file->line_no++; + + /*- + **-------------------------------------------------------------------- + ** If there's a line prefix, check that it's here. + **-------------------------------------------------------------------- + */ + if ((vve_line_prefix == NULL) || (*vve_line_prefix == '\0')) + { + break; + } + else + { + pfx_len = strlen (vve_line_prefix); + if (STRNCMPI (buffer, vve_line_prefix, (Int16) pfx_len) == 0) + { + buffer += pfx_len; + break; + } + } + } + return (buffer); +} /* rd_next_line */ + + + diff --git a/support/vvcode/vveparse.h b/support/vvcode/vveparse.h new file mode 100644 index 0000000000..eb569d6c59 --- /dev/null +++ b/support/vvcode/vveparse.h @@ -0,0 +1,109 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vveparse.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** chk_skipfrom [tbs] +** getv_characterset - +** getv_decodeversion - +** getv_format - +** getv_mode - +** getv_operatingsystem - +** getv_reclen - +** getv_timestamp - +** parse_begin_header - +** rd_next_line - +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + + +/* +**---------------------------------------------------------------------------- +** Forward declarations of functions in the file 'vveparse.c' +**---------------------------------------------------------------------------- +*/ +Boolean chk_skipfrom ARGS ((CONST char *line_ptr, + CONST Int16 part_needed, + CONST char *hdrf_spec, + CONST Header_Struct *skipfrom_hdr, + File_Info *ip_file)); +void getv_characterset ARGS (( + CONST Header_Struct *characterset_hdr, + char **character_set)); +void getv_decodeversion ARGS (( + CONST Header_Struct *decodeversion_hdr, + Int16 *decode_version)); +void getv_format ARGS ((CONST Header_Struct *format_hdr, + CONST char *format_str_array[], + File_Info *vve_file)); +void getv_mode ARGS ((CONST Header_Struct *mode_hdr, + CONST char *format_str_array[], + File_Info *vve_file)); +void getv_operatingsystem ARGS (( + CONST Header_Struct *operatingsystem_hdr, + char **operating_system)); +void getv_reclen ARGS ((CONST Header_Struct *reclen_hdr, + File_Info *vve_file)); +void getv_timestamp ARGS ((CONST Header_Struct *timestamp_hdr, + File_Info *vve_file)); +void parse_begin_header ARGS ((CONST char *line_ptr, + CONST File_Info *ip_file, + CONST Int16 decoding_type, + Header_Struct *hdr_struct, + char **hdr_file_spec)); +char *rd_next_line ARGS ((CONST Int32 max_chars, + CONST char *vve_line_prefix, + char *buffer, + File_Info *ip_file, + Int32 *byte_count)); diff --git a/support/vvcode/vvutils.c b/support/vvcode/vvutils.c new file mode 100644 index 0000000000..3cd59777af --- /dev/null +++ b/support/vvcode/vvutils.c @@ -0,0 +1,2729 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vvutils.c", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** allocate_buffer Allocate memory for a buffer. +** display_comment Display a VVE file comment. +** f_close Close a file. +** getc_format Get the format specified on the command line. +** getc_mode Get the mode specified on the command line. +** getc_reclen Get the maximum record length specified on +** the command line. +** getc_timestamp Get the timestamp specified on the command +** line. +** header_type Look for a header string in a list of headers. +** init_crc32_table Initialize the 32 bit CRC table. +** lookup_key Look for a string in a list of keywords. +** make_time Convert a 'tm' structure into a Unix style +** time_t value. +** open_log_file Open the log file for writing. +** parse_header Extract the value of a VVE/XLT header line. +** pars_time Parse a string in VVcode timestamp format and +** convert it to a Unix style time_t value. +** pars_xlt_tbl Parse a character set translation table. +** rd_enc_tbl Read and check an encoding table from a +** specified file. +** rd_xlt_tbl Read and check a character set translation +** table from a specified file. +** set_dec_tbl Invert an encoding table to form a decoding +** table. +** set_xlt_tbl Setup the character set translation table. +** show_file_context Show the context in which a file processing +** error occurred. +** vstrchr Search a string for the first occurrence of a +** specified character. +** vstricmp Compare two strings ignoring case differences. +** vstrnicmp Compare at most 'n' characters of two strings +** ignoring case differences. +** vstrrchr Search a string for the last occurrence of a +** specified character. +** vstrrstr Search a string for the last occurrence of +** any of a list of specified characters. +** vstrstr Search a string for the first occurrence of +** any of a list of specified characters. +** vv_timestamp Convert a Unix style time_t value into a +** VVcode format timestamp string. +** vstrdup Duplicate a string, allocating memory for the +** copy. +** vstrtrws Strip trailing whitespace from a string. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ +static char rcsid[] = "$Id$"; + + +#define VVUTILS 1 + + +/*- +**---------------------------------------------------------------------------- +** Standard include files +**---------------------------------------------------------------------------- +*/ +#include <stdio.h> + + +/*- +**---------------------------------------------------------------------------- +** Include files +**---------------------------------------------------------------------------- +*/ +#include "checkos.h" +#include "machine.h" +#include "local.h" +#include "globals.h" +#include "specific.h" +#include "vvutils.h" + + +/*- +**---------------------------------------------------------------------------- +** +**---------------------------------------------------------------------------- +*/ +static int month_days[12] = + { + 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }; + + +/*- +**============================================================================ +** +** FUNCTION +** +** allocate_buffer +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *allocate_buffer (CONST SIZE_T buf_len, + CONST char *buf_name) +#else /* NOT (ANSI_SYNTAX) */ + char *allocate_buffer (buf_len, buf_name) + CONST SIZE_T buf_len; + CONST char *buf_name; +#endif /* (ANSI_SYNTAX) */ +{ + SIZE_T bytes_required; + + char *buf_ptr; + + bytes_required = buf_len * sizeof (char); + buf_ptr = (char *) malloc (bytes_required); + + if (buf_ptr == NULL) + { + FATALMSG_2 ("error allocating %ld bytes for buffer `%s'", + (Int32) bytes_required, buf_name); + vv_exit (); + } + else + { + DEBUG_2 ("allocate_buffer: allocated %ld bytes for buffer `%s'", + (Int32) bytes_required, buf_name); + } + return (buf_ptr); +} /* allocate_buffer */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** display_comment +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void display_comment (CONST File_Info *ip_file, + CONST char *line_ptr, + Header_Struct *hdr_struct) +#else /* NOT (ANSI_SYNTAX) */ + void display_comment (ip_file, line_ptr, hdr_struct) + CONST File_Info *ip_file; + CONST char *line_ptr; + Header_Struct *hdr_struct; +#endif /* (ANSI_SYNTAX) */ +{ + char *comment_str_buffer; + int fields_read; + + hdr_struct->present = FALSE; + hdr_struct->value = NULL; + comment_str_buffer = allocate_buffer ((MAX_IP_LINE_LEN + 1), + "comment_str_buffer"); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + fields_read = sscanf (line_ptr, "%*s %[^\n]", comment_str_buffer); + if (fields_read == 1) + { + LOGMSG_1 ("VVE file comment: %s", comment_str_buffer); + } + else + { + ERRORMSG_1 ("error parsing value of `%s' header", hdr_struct->h_string); + show_file_context (ip_file, line_ptr); + } + free (comment_str_buffer); +} /* display_comment */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** f_close +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void f_close (File_Info *target_file) +#else /* NOT (ANSI_SYNTAX) */ + void f_close (target_file) + File_Info *target_file; +#endif /* (ANSI_SYNTAX) */ +{ + int status; + + if (target_file->file_ptr != (FILE *) NULL) + { + status = fclose (target_file->file_ptr); + + if (status != 0) + { + ERRORMSG_1 ("error closing file `%s'", target_file->file_spec); + explain_error (); + } + } +} /* f_close */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getc_format +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int16 getc_format (CONST Qualifier_Struct *qual_format, + CONST char *fmt_str_array[]) +#else /* NOT (ANSI_SYNTAX) */ + Int16 getc_format (qual_format, fmt_str_array) + CONST Qualifier_Struct *qual_format; + CONST char *fmt_str_array[]; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 format_no; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (qual_format->present != TRUE) + { + DEBUG ("getc_format: format not specified on the command line"); + return (INV_FORMAT); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + format_no = lookup_key (fmt_str_array, qual_format->value, + ALLOW_ABBREVIATIONS, CASE_INSENSITIVE); + + switch (format_no) + { + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + case FMT_FIXED: + +#if (SUPPORT_FIXED_FMT) + break; +#else /* NOT (SUPPORT_FIXED_FMT) */ + USAGE_1 ("format `%s' is not supported by this implementation", + fmt_str_array[format_no]); + break; +#endif /* (SUPPORT_FIXED_FMT) */ + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + case FMT_STREAM: + +#if (SUPPORT_STREAM_FMT) + break; +#else /* NOT (SUPPORT_STREAM_FMT) */ + USAGE_1 ("format `%s' is not supported by this implementation", + fmt_str_array[format_no]); + break; +#endif /* (SUPPORT_STREAM_FMT) */ + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + case FMT_VARIABLE: + +#if SUPPORT_VARIABLE_FMT + break; +#else /* NOT (SUPPORT_VARIABLE_FMT) */ + USAGE_1 ("format `%s' is not supported by this implementation", + fmt_str_array[format_no]); + break; +#endif /* (SUPPORT_VARIABLE_FMT) */ + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + case FMT_DEFAULT: + break; + + /*- + **---------------------------------------------------------------- + ** + **---------------------------------------------------------------- + */ + default: + USAGE_1 ("invalid format `%s'", qual_format->value); + } + + DEBUG_1 ("getc_format: command line specifies format `%s'", + fmt_str_array[format_no]); + return (format_no); +} /* getc_format */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getc_mode +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int16 getc_mode (CONST Qualifier_Struct *qual_mode, + CONST char *mode_str_array[]) +#else /* NOT (ANSI_SYNTAX) */ + Int16 getc_mode (qual_mode, mode_str_array) + CONST Qualifier_Struct *qual_mode; + CONST char *mode_str_array[]; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 mode_no; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (qual_mode->present != TRUE) + { + DEBUG ("getc_mode: mode not specified on the command line"); + return (INV_MODE); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + mode_no = lookup_key (mode_str_array, qual_mode->value, + ALLOW_ABBREVIATIONS, CASE_INSENSITIVE); + + switch (mode_no) + { + case MODE_BINARY: + case MODE_TEXT: + break; + default: + USAGE_1 ("invalid mode `%s'", qual_mode->value); + } + + DEBUG_1 ("getc_mode: command line specifies mode `%s'", + mode_str_array[mode_no]); + return (mode_no); +} /* getc_mode */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getc_reclen +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int32 getc_reclen (CONST Qualifier_Struct *qual_reclen, + CONST File_Info *ip_file) +#else /* NOT (ANSI_SYNTAX) */ + Int32 getc_reclen (qual_reclen, ip_file) + CONST Qualifier_Struct *qual_reclen; + CONST File_Info *ip_file; +#endif /* (ANSI_SYNTAX) */ +{ + Int32 record_len; + int status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (qual_reclen->present != TRUE) + { + DEBUG ("getc_reclen: record length not specified on the command line"); + return (INV_RECORD_LEN); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + record_len = INV_RECORD_LEN; + status = sscanf (qual_reclen->value, "%ld", &record_len); + + if (status != 1) + { + USAGE_1 ("invalid record length specified `%s'", qual_reclen->value); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (ip_file->format == FMT_VARIABLE) + { + if ((record_len < (Int32) MIN_VARIABLE_RECORD_LEN) + || (record_len > (Int32) MAX_VARIABLE_RECORD_LEN)) + { + USAGE_3 ("record length must be in the range %ld-%ld (not %ld)", + (Int32) MIN_VARIABLE_RECORD_LEN, + (Int32) MAX_VARIABLE_RECORD_LEN, record_len); + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + if (ip_file->format == FMT_FIXED) + { + if ((record_len < (Int32) MIN_FIXED_RECORD_LEN) + || (record_len > (Int32) MAX_FIXED_RECORD_LEN)) + { + USAGE_3 ("record length must be in the range %ld-%ld (not %ld)", + (Int32) MIN_FIXED_RECORD_LEN, + (Int32) MAX_FIXED_RECORD_LEN, record_len); + } + } + + DEBUG_1 ("getc_reclen: command line specifies maximum record length `%ld'", + record_len); + return (record_len); +} /* getc_reclen */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** getc_timestamp +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T getc_timestamp (CONST Qualifier_Struct *qual_timestamp) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T getc_timestamp (qual_timestamp) + CONST Qualifier_Struct *qual_timestamp; +#endif /* (ANSI_SYNTAX) */ +{ + TIME_T cmd_timestamp; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (qual_timestamp->present != TRUE) + { + DEBUG ("getc_timestamp: timestamp not specified on the command line"); + return (INV_TIMESTAMP); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((qual_timestamp->value == NULL) || (*qual_timestamp->value == '\0')) + { + (void) time (&cmd_timestamp); + } + else + { + cmd_timestamp = pars_time (qual_timestamp->value); + + if (cmd_timestamp == INV_TIMESTAMP) + { + USAGE_1 ("invalid timestamp string specified `%s'", + qual_timestamp->value); + } + } + return (cmd_timestamp); +} /* getc_timestamp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** header_type +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int16 header_type (CONST File_Info *ip_file, + CONST char *line_ptr, + CONST Header_Struct *hdr_array) +#else /* NOT (ANSI_SYNTAX) */ + Int16 header_type (ip_file, line_ptr, hdr_array) + CONST File_Info *ip_file; + CONST char *line_ptr; + CONST Header_Struct *hdr_array; +#endif /* (ANSI_SYNTAX) */ +{ + int cmp_len; + Int16 hdr_found; + Int16 hdr_no; + + + /*- + **------------------------------------------------------------------------ + ** If the string to be tested is NULL treat it as ambiguous and return. + **------------------------------------------------------------------------ + */ + if ((line_ptr == NULL) || (line_ptr[0] == '\0')) + { + return (HDR_UNKNOWN); + } + + /*- + **------------------------------------------------------------------------ + ** Search the VVE header structure array for this string. + **------------------------------------------------------------------------ + */ + hdr_found = -1; + + for (hdr_no = 0; hdr_array[hdr_no].h_string != NULL; hdr_no++) + { + cmp_len = strlen (hdr_array[hdr_no].h_string); + + if (STRNCMPI (hdr_array[hdr_no].h_string, line_ptr, cmp_len) == 0) + { + DEBUG_1 ("header_type: VVE line matches header: `%s'", + hdr_array[hdr_no].h_string); + + if (hdr_found < 0) + { + hdr_found = hdr_no; + } + else + { + ERRORMSG ("ambiguous header ignored"); + show_file_context (ip_file, line_ptr); + return (HDR_UNKNOWN); + } + } + } + + /*- + **------------------------------------------------------------------------ + ** If the header string is unknown, return that status. + **------------------------------------------------------------------------ + */ + if (hdr_found < 0) + { + DEBUG_1 ("header_type: ignored unknown VVE header line: `%s'", + line_ptr); + return (HDR_UNKNOWN); + } + else + { + return (hdr_found); + } +} /* header_type */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** init_crc32_table +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void init_crc32_table (CONST Int16 crc_table_size, + CONST Unsigned32 crc_polynomial, + Unsigned32 *crc_table) +#else /* NOT (ANSI_SYNTAX) */ + void init_crc32_table (crc_table_size, crc_polynomial, + crc_table) + CONST Int16 crc_table_size; + CONST Unsigned32 crc_polynomial; + Unsigned32 *crc_table; +#endif /* (ANSI_SYNTAX) */ +{ + Unsigned16 idx; + Unsigned16 j; + Unsigned32 r; + + for (idx = 0; idx < (Unsigned16) crc_table_size; idx++) + { + r = idx; + for (j = 0; j < 8; j++) + { + if (r & 1) + { + r = (r >> 1) ^ crc_polynomial; + } + else + { + r >>= 1; + } + } + crc_table[idx] = r; + } +} /* init_crc32_table */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** lookup_key +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int16 lookup_key (CONST char *key_list[], + CONST char *string, + CONST Int16 allow_abbrevs, + CONST Int16 case_sensitivity) +#else /* NOT (ANSI_SYNTAX) */ + Int16 lookup_key (key_list, string, allow_abbrevs, + case_sensitivity) + CONST char *key_list[]; + CONST char *string; + CONST Int16 allow_abbrevs; + CONST Int16 case_sensitivity; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 key_no; + int cmp_len; + Int16 look_status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((string == NULL) || (*string == '\0')) + { + return (LOOKUP_AMBIGUOUS); + } + cmp_len = strlen (string); + look_status = LOOKUP_UNKNOWN; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (key_no = 0; key_list[key_no] != NULL; key_no++) + { + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (allow_abbrevs == NO_ABBREVIATIONS) + { + cmp_len = strlen (key_list[key_no]); + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (case_sensitivity == CASE_INSENSITIVE) + { + if (STRNCMPI (key_list[key_no], string, cmp_len) == 0) + { + if (look_status == LOOKUP_UNKNOWN) + { + look_status = key_no; + } + else + { + look_status = LOOKUP_AMBIGUOUS; + } + } + } + else + { + if (STRNCMP (key_list[key_no], string, cmp_len) == 0) + { + if (look_status == LOOKUP_UNKNOWN) + { + look_status = key_no; + } + else + { + look_status = LOOKUP_AMBIGUOUS; + } + } + } + } + + return (look_status); +} /* lookup_key */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** make_time +** +** DESCRIPTION +** +** Convert the 'tm' structure (in GMT) to a standard 'TIME_T' value of +** the number of seconds since 1-Jan-1970 00:00:00 GMT. +** +** NOTE: the structure time is assumed to be GMT and only the fields +** tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec are used. +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T make_time (CONST struct tm *t_struct) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T make_time (t_struct) + CONST struct tm *t_struct; +#endif /* (ANSI_SYNTAX) */ +{ + TIME_T total_days; + TIME_T total_secs; + int i; + + DEBUG_3 ("make_time: date provided = %04d/%02d/%02d", + t_struct->tm_year, t_struct->tm_mon, t_struct->tm_mday); + DEBUG_3 ("make_time: time provided = %02d:%02d:%02d", + t_struct->tm_hour, t_struct->tm_min, t_struct->tm_sec); + + /*- + **------------------------------------------------------------------------ + ** Calculate the number of days since 1 January 1970, but do not return a + ** negative number. + **------------------------------------------------------------------------ + */ + if (t_struct->tm_year < 70) + { + return (0L); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + total_days = (TIME_T) 0; + for (i = 1970; i < (1900 + t_struct->tm_year); i++) + { + total_days += (TIME_T) 365; + if (LEAPYEAR (i) == TRUE) + { + ++total_days; + } + } + + for (i = 0; i < t_struct->tm_mon; i++) + { + total_days += month_days[i]; + if ((i == 1) && (LEAPYEAR (1900 + t_struct->tm_year) == TRUE)) + { + ++total_days; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + total_days += (TIME_T) (t_struct->tm_mday - 1); + + total_secs = ((TIME_T) total_days * 86400L) + + ((TIME_T) t_struct->tm_hour * 3600L) + + ((TIME_T) t_struct->tm_min * 60L) + + (TIME_T) t_struct->tm_sec; + + DEBUG_1 ("make_time: time_t value returned = %ld", total_secs); + return (total_secs); +} /* make_time */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** open_log_file +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void open_log_file (CONST Qualifier_Struct *log_qualifier, + CONST char *def_file_name, + CONST Int16 overwrite_flag, + File_Info *log_file) +#else /* NOT (ANSI_SYNTAX) */ + void open_log_file (log_qualifier, def_file_name, + overwrite_flag, log_file) + CONST Qualifier_Struct *log_qualifier; + CONST char *def_file_name; + CONST Int16 overwrite_flag; + File_Info *log_file; +#endif /* (ANSI_SYNTAX) */ +{ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + log_file->file_ptr = (FILE *) NULL; + log_file->mode = MODE_TEXT; + log_file->format = DEF_TEXT_FMT; + log_file->max_rec_len = INV_RECORD_LEN; + log_file->lng_rec_len = INV_RECORD_LEN; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (log_qualifier->present != TRUE) + { + DEBUG ("open_log_file: log file not specified on the command line"); + return; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (log_qualifier->value != NULL) + { + strcpy (log_file->file_spec, log_qualifier->value); + + /*- + **-------------------------------------------------------------------- + ** If a file spec was given for the log file, use the default log + ** file extension if one was not provided. + **-------------------------------------------------------------------- + */ +#if (STICKY_DEFAULTS) + apply_defaults (def_file_name, DEF_LOG_EXT, log_file->file_spec); +#endif /* (STICKY_DEFAULTS) */ + + DEBUG_1 ("open_log_file: opening log file `%s'", log_file->file_spec); + log_file->file_ptr = f_open_out (overwrite_flag, log_file); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + else + { + strcpy (log_file->file_spec, "stderr"); + log_file->file_ptr = stderr; + log_file->pipe_flag = TRUE; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (log_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening log file `%s'", log_file->file_spec); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((log_file->pipe_flag == TRUE) || (is_a_file (log_file) == FALSE)) + { + DEBUG_1 ("open_log_file: `%s' is not a regular file", + log_file->file_spec); + log_file->pipe_flag = TRUE; + set_pipe_mode (log_file); + } +} /* open_log_file */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** parse_header +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void parse_header (CONST File_Info *ip_file, + CONST char *line_ptr, + Header_Struct *hdr_struct) +#else /* NOT (ANSI_SYNTAX) */ + void parse_header (ip_file, line_ptr, hdr_struct) + CONST File_Info *ip_file; + CONST char *line_ptr; + Header_Struct *hdr_struct; +#endif /* (ANSI_SYNTAX) */ +{ + char *dummy; + int fields_read; + + hdr_struct->present = FALSE; + hdr_struct->value = NULL; + dummy = allocate_buffer ((MAX_IP_LINE_LEN + 1), "dummy"); + fields_read = sscanf (line_ptr, "%*s %s", dummy); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (fields_read == 1) + { + hdr_struct->value = STRDUP (dummy); + hdr_struct->present = TRUE; + } + else + { + ERRORMSG_1 ("error parsing value of `%s' header", hdr_struct->h_string); + show_file_context (ip_file, line_ptr); + } + free (dummy); +} /* parse_header */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** pars_time +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + TIME_T pars_time (CONST char *time_str) +#else /* NOT (ANSI_SYNTAX) */ + TIME_T pars_time (time_str) + CONST char *time_str; +#endif /* (ANSI_SYNTAX) */ +{ + int args; + TIME_T time_val; + struct tm tm_struct; + + /*- + **------------------------------------------------------------------------ + ** If the time string is empty or null, return an error. + **------------------------------------------------------------------------ + */ + time_val = INV_TIMESTAMP; + + if ((time_str == NULL) || (*time_str == '\0')) + { + return (INV_TIMESTAMP); + } + + DEBUG_1 ("pars_time: VVE timestamp string provided = `%s'", time_str); + + /*- + **------------------------------------------------------------------------ + ** Initialize the time structure to 1970.01.01-00:00:00 GMT + **------------------------------------------------------------------------ + */ + tm_struct.tm_year = 1970; + tm_struct.tm_mon = 1; + tm_struct.tm_mday = 1; + tm_struct.tm_hour = 0; + tm_struct.tm_min = 0; + tm_struct.tm_sec = 0; + + args = sscanf (time_str, VV_TIMESTAMP_FORMAT, + &tm_struct.tm_year, &tm_struct.tm_mon, &tm_struct.tm_mday, + &tm_struct.tm_hour, &tm_struct.tm_min, &tm_struct.tm_sec); + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((args < 1) || (args > 6)) + { + ERRORMSG_1 ("error parsing timestamp string `%s'", time_str); + return (INV_TIMESTAMP); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((tm_struct.tm_year < 1970) || (tm_struct.tm_year > 2037)) + { + ERRORMSG_1 ("year (YYYY) must be in the range 1970-2037 (not %d)\n", + tm_struct.tm_year); + return (INV_TIMESTAMP); + } + (tm_struct.tm_year) -= 1900; + + if ((tm_struct.tm_mon < 1) || (tm_struct.tm_mon > 12)) + { + ERRORMSG_1 ("month (MM) must be in the range 1-12 (not %d)\n", + tm_struct.tm_mon); + return (INV_TIMESTAMP); + } + --(tm_struct.tm_mon); + + if ((tm_struct.tm_mday < 1) || (tm_struct.tm_mday > 31)) + { + ERRORMSG_1 ("day (DD) must be in the range 1-31 (not %d)\n", + tm_struct.tm_mday); + return (INV_TIMESTAMP); + } + + if ((tm_struct.tm_hour < 0) || (tm_struct.tm_hour > 23)) + { + ERRORMSG_1 ("hours (HH) must be in the range 0-23 (not %d)\n", + tm_struct.tm_hour); + return (INV_TIMESTAMP); + } + + if ((tm_struct.tm_min < 0) || (tm_struct.tm_min > 59)) + { + ERRORMSG_1 ("minutes (MM) must be in the range 0-59 (not %d)\n", + tm_struct.tm_min); + return (INV_TIMESTAMP); + } + + if ((tm_struct.tm_sec < 0) || (tm_struct.tm_sec > 59)) + { + ERRORMSG_1 ("seconds (SS) must be in the range 0-59 (not %d)\n", + tm_struct.tm_sec); + return (INV_TIMESTAMP); + } + + tm_struct.tm_wday = 0; + tm_struct.tm_yday = 0; + tm_struct.tm_isdst = 0; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + time_val = make_time (&tm_struct); + DEBUG_1 ("pars_time: time_t value returned = %ld", time_val); + + return (time_val); +} /* pars_time */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** pars_xlt_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean pars_xlt_tbl (CONST char *xlt_buffer, + Xlt_Struct *xlt_tbl_struct, + Int16 subst_char) +#else /* NOT (ANSI_SYNTAX) */ + Boolean pars_xlt_tbl (xlt_buffer, xlt_tbl_struct, + subst_char) + CONST char *xlt_buffer; + Xlt_Struct *xlt_tbl_struct; + Int16 subst_char; +#endif /* (ANSI_SYNTAX) */ +{ + char *curr_ptr; + int fields_read; + char *item_end; + int item_num; + SIZE_T item_len; + char *item_start; + char *item_str; + Boolean status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + status = TRUE; + item_str = allocate_buffer (XLT_BUFFER_SIZE, "item_str"); + curr_ptr = (char *) xlt_buffer; + + for (item_num = 0;; item_num++) + { + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + while ((*curr_ptr != '\0') && isspace (*curr_ptr)) + { + ++curr_ptr; + } + if (*curr_ptr == '\0') + { + break; + } + else + { + item_start = curr_ptr; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + while ((*curr_ptr != '\0') && (!isspace (*curr_ptr))) + { + ++curr_ptr; + } + item_end = curr_ptr; + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + item_len = (SIZE_T) (item_end - item_start) + 1; + strncpy (item_str, item_start, item_len); + item_str[item_len] = '\0'; + + fields_read = sscanf (item_str, "%hd", + &(xlt_tbl_struct->xlt_tbl[item_num])); + if (fields_read != 1) + { + ERRORMSG_2 ("error parsing item %d (`%s') in translation file", + (item_num + 1), item_str); + status = FALSE; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if ((xlt_tbl_struct->xlt_tbl[item_num] < -1) + || (xlt_tbl_struct->xlt_tbl[item_num] > 255)) + { + ERRORMSG_2 ("invalid value (%d) of item %d in translation file", + xlt_tbl_struct->xlt_tbl[item_num], (item_num + 1)); + status = FALSE; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (xlt_tbl_struct->xlt_tbl[item_num] == -1) + { + xlt_tbl_struct->xlt_tbl[item_num] = subst_char; + } + } /* end-for */ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if ((status == TRUE) && (item_num != XLT_TABLE_LEN)) + { + ERRORMSG_1 ("wrong number of values in translation file: %d", + item_num); + status = FALSE; + } + free (item_str); + return (status); +} /* pars_xlt_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** rd_enc_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Boolean rd_enc_tbl (File_Info *enc_file, + CONST Int16 enc_tbl_len, + char *encode_table) +#else /* NOT (ANSI_SYNTAX) */ + Boolean rd_enc_tbl (enc_file, enc_tbl_len, encode_table) + File_Info *enc_file; + CONST Int16 enc_tbl_len; + char *encode_table; +#endif /* (ANSI_SYNTAX) */ +{ + char *buffer; + char *end_of_line; + int chars_read; + Boolean ret_status; + Int32 read_status; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + buffer = allocate_buffer ((MAX_IP_LINE_LEN + 1), "buffer"); + enc_file->mode = MODE_TEXT; + enc_file->format = DEF_TEXT_FMT; + enc_file->max_rec_len = INV_RECORD_LEN; + enc_file->lng_rec_len = INV_RECORD_LEN; + enc_file->line_no = 0; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + enc_file->file_ptr = f_open_in (enc_file); + + if (enc_file->file_ptr == (FILE *) NULL) + { + ERRORMSG_1 ("error opening encoding table file `%s'", + enc_file->file_spec); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + encode_table[0] = '\0'; + ret_status = TRUE; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (;;) + { + chars_read = strlen ((char *) encode_table); + enc_file->line_no++; + + read_status = read_line ((Int32) MAX_IP_LINE_LEN, buffer, enc_file); + + if (read_status < 0L) + { + if (feof (enc_file->file_ptr) != 0) + { + break; + } + + ERRORMSG ("error reading encoding table file"); + show_file_context (enc_file, NULL); + explain_error (); + ret_status = FALSE; + break; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + buffer[MAX_IP_LINE_LEN - 1] = (char) '\0'; + end_of_line = STRCHR (buffer, '\n'); + + if (end_of_line != NULL) + { + *end_of_line = '\0'; + } + chars_read += strlen (buffer); + + if (chars_read <= enc_tbl_len) + { + strcat ((char *) encode_table, buffer); + } + else + { + ERRORMSG_1 ("too many characters in encoding table file: %d", + chars_read); + show_file_context (enc_file, buffer); + ret_status = FALSE; + break; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + if (chars_read < enc_tbl_len) + { + ERRORMSG_1 ("not enough characters in encoding table file: %d", + chars_read); + ret_status = FALSE; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + f_close (enc_file); + free (buffer); + return (ret_status); +} /* rd_enc_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** rd_xlt_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + Int16 rd_xlt_tbl (Header_Struct *xlt_hdr_array, + File_Info *xlt_file, + Xlt_Struct *xlt_tbl_struct) +#else /* NOT (ANSI_SYNTAX) */ + Int16 rd_xlt_tbl (xlt_hdr_array, xlt_file, xlt_tbl_struct) + Header_Struct *xlt_hdr_array; + File_Info *xlt_file; + Xlt_Struct *xlt_tbl_struct; +#endif /* (ANSI_SYNTAX) */ +{ + char buffer[MAX_IP_LINE_LEN + 1]; + Int32 bytes_read; + int chars_read; + char *comment; + char *end_of_line; + int fields_read; + Int16 hdr_no; + Boolean ret_status; + Int16 subst_char; + char *xlt_buffer; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + xlt_file->mode = MODE_TEXT; + xlt_file->format = DEF_TEXT_FMT; + xlt_file->max_rec_len = INV_RECORD_LEN; + xlt_file->lng_rec_len = INV_RECORD_LEN; + xlt_file->line_no = 0; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + xlt_file->file_ptr = f_open_in (xlt_file); + + if (xlt_file->file_ptr == (FILE *) NULL) + { + FATALMSG_1 ("error opening translation file `%s'", + xlt_file->file_spec); + vv_exit (); + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + xlt_buffer = allocate_buffer (XLT_BUFFER_SIZE, "xlt_buffer"); + xlt_buffer[0] = 0; + ret_status = TRUE; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + while (ret_status == TRUE) + { + chars_read = strlen (xlt_buffer); + xlt_file->line_no++; + bytes_read = read_line ((Int32) MAX_IP_LINE_LEN, buffer, xlt_file); + + if (bytes_read < 0) + { + if (feof (xlt_file->file_ptr) != 0) + { + break; + } + ERRORMSG ("error reading translation file"); + show_file_context (xlt_file, NULL); + explain_error (); + ret_status = FALSE; + continue; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + buffer[MAX_IP_LINE_LEN - 2] = (char) '\n'; + buffer[MAX_IP_LINE_LEN - 1] = (char) '\0'; + comment = STRCHR (buffer, XLT_COMMENT_CHAR); + + if (comment != NULL) + { + *comment = '\n'; + *(++comment) = '\0'; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + end_of_line = STRCHR (buffer, '\n'); + + if (end_of_line != NULL) + { + *end_of_line = ' '; + } + chars_read += strlen (buffer); + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if ((xlt_hdr_array[HDR_XLT_FROM].present != TRUE) + || (xlt_hdr_array[HDR_XLT_SUBSTCHAR].present != TRUE) + || (xlt_hdr_array[HDR_XLT_TO].present != TRUE)) + { + hdr_no = header_type (xlt_file, buffer, xlt_hdr_array); + + switch (hdr_no) + { + case HDR_UNKNOWN: + break; + case HDR_XLT_FROM: + case HDR_XLT_SUBSTCHAR: + case HDR_XLT_TO: + if (xlt_hdr_array[hdr_no].present == TRUE) + { + ERRORMSG_1 ("header `%s' repeated in translation file", + xlt_hdr_array[hdr_no].h_string); + show_file_context (xlt_file, buffer); + ret_status = FALSE; + } + else + { + parse_header (xlt_file, buffer, &xlt_hdr_array[hdr_no]); + } + break; + default: + INTERNAL_ERROR ("rd_xlt_file"); + break; + } + continue; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + fields_read = sscanf (xlt_hdr_array[HDR_XLT_SUBSTCHAR].value, "%hd", + &subst_char); + if ((fields_read != 1) || (subst_char < 0) || (subst_char > 255)) + { + ERRORMSG_2 ("invalid `%s' header value in translation file: `%s'", + xlt_hdr_array[HDR_XLT_SUBSTCHAR].h_string, + xlt_hdr_array[HDR_XLT_SUBSTCHAR].value); + ret_status = FALSE; + break; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (chars_read <= XLT_BUFFER_SIZE) + { + strcat ((char *) xlt_buffer, buffer); + } + else + { + ERRORMSG_1 ("too many characters in translation file: %d", + chars_read); + show_file_context (xlt_file, buffer); + ret_status = FALSE; + break; + } + } + f_close (xlt_file); + + /*- + **------------------------------------------------------------------------ + ** The contents of the translation file have been read, now parse them to + ** create the translation table. + **------------------------------------------------------------------------ + */ + if (xlt_hdr_array[HDR_XLT_FROM].present != TRUE) + { + ERRORMSG_1 ("header `%s' not found in translation file", + xlt_hdr_array[HDR_XLT_FROM].h_string); + ret_status = FALSE; + } + else if (xlt_hdr_array[HDR_XLT_SUBSTCHAR].present != TRUE) + { + ERRORMSG_1 ("header `%s' not found in translation file", + xlt_hdr_array[HDR_XLT_SUBSTCHAR].h_string); + ret_status = FALSE; + } + else if (xlt_hdr_array[HDR_XLT_TO].present != TRUE) + { + ERRORMSG_1 ("header `%s' not found in translation file", + xlt_hdr_array[HDR_XLT_TO].h_string); + ret_status = FALSE; + } + else + { + xlt_tbl_struct->xlt_from = STRDUP (xlt_hdr_array[HDR_XLT_FROM].value); + xlt_tbl_struct->xlt_to = STRDUP (xlt_hdr_array[HDR_XLT_TO].value); + } + + /*- + **------------------------------------------------------------------------ + ** The contents of the translation file have been read, now parse them to + ** create the translation table. + **------------------------------------------------------------------------ + */ + if (ret_status == TRUE) + { + ret_status = pars_xlt_tbl (xlt_buffer, xlt_tbl_struct, subst_char); + } + + free (xlt_buffer); + return (ret_status); +} /* rd_xlt_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_dec_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_dec_tbl (CONST Int16 enc_tbl_len, + CONST char *encode_table, + CONST Int16 dec_tbl_len, + Int16 *decode_table) +#else /* NOT (ANSI_SYNTAX) */ + void set_dec_tbl (enc_tbl_len, encode_table, + dec_tbl_len, decode_table) + CONST Int16 enc_tbl_len; + CONST char *encode_table; + CONST Int16 dec_tbl_len; + Int16 *decode_table; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 i; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (i = 0; i < dec_tbl_len; i++) + { + decode_table[i] = INV_TABLE_ENTRY; + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (i = 0; i < enc_tbl_len; i++) + { + if (decode_table[encode_table[i]] == INV_TABLE_ENTRY) + { + decode_table[encode_table[i]] = i; + } + else + { + ERRORMSG_1 ("invalid encoding table - character 0x%02X duplicated", + encode_table[i]); + vv_exit (); + } + } +} /* set_dec_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** set_xlt_tbl +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void set_xlt_tbl (File_Info *xlt_file, + Xlt_Struct *xlt_table, + Header_Struct *xlt_hdr_array) +#else /* NOT (ANSI_SYNTAX) */ + void set_xlt_tbl (xlt_file, xlt_table, xlt_hdr_array) + File_Info *xlt_file; + Xlt_Struct *xlt_table; + Header_Struct *xlt_hdr_array; +#endif /* (ANSI_SYNTAX) */ +{ + Int16 status; + + /*- + **------------------------------------------------------------------------ + ** If an extension has not been provided, use the default extension + ** for translation table files. + **------------------------------------------------------------------------ + */ +#if (STICKY_DEFAULTS) + apply_defaults (NULL, DEF_XLT_EXT, xlt_file->file_spec); +#endif /* (STICKY_DEFAULTS) */ + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + xlt_table->xlt_from = NULL; + xlt_table->xlt_to = NULL; + status = rd_xlt_tbl (xlt_hdr_array, xlt_file, xlt_table); + + if (status < 0) + { + FATALMSG_1 ("error reading translation table file `%s'", + xlt_file->file_spec); + vv_exit (); + } + + LOGMSG_1 ("\nTranslation table source: %s", xlt_file->file_spec); + LOGMSG_2 ("Translation performed: `%s' to `%s'", + xlt_table->xlt_from, xlt_table->xlt_to); + +} /* set_xlt_tbl */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** show_file_context +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + void show_file_context (CONST File_Info *file, + CONST char *file_text) +#else /* NOT (ANSI_SYNTAX) */ + void show_file_context (file, file_text) + CONST File_Info *file; + CONST char *file_text; +#endif /* (ANSI_SYNTAX) */ +{ + if (file_text != NULL) + { + INFOMSG_2 ("context: line %ld of file `%s'", + file->line_no, file->file_spec); + INFOMSG_1 ("text: `%s'", file_text); + } + else + { + INFOMSG_2 ("context: line %ld of file `%s'", + file->line_no, file->file_spec); + } +} /* show_file_context */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrchr +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vstrchr (CONST char *str, CONST int ch) +#else /* NOT (ANSI_SYNTAX) */ + char *vstrchr (str, ch) + CONST char *str; + CONST int ch; +#endif /* (ANSI_SYNTAX) */ +{ + int i; + + for (i = 0; str[i] != '\0'; i++) + { + if (str[i] == (char) ch) + { + return ((char *) &str[i]); + } + } + return (NULL); +} /* vstrchr */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstricmp +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + int vstricmp (CONST char *str1, CONST char *str2) +#else /* NOT (ANSI_SYNTAX) */ + int vstricmp (str1, str2) + CONST char *str1; + CONST char *str2; +#endif /* (ANSI_SYNTAX) */ +{ + int i; + int u1; + int u2; + + i = 0; + while (((str1[i] != '\0') || (str2[i] != '\0'))) + { + u1 = (int) TOUPPER (str1[i]); + u2 = (int) TOUPPER (str2[i]); + if (u1 != u2) + { + return (u1 - u2); + } + i++; + } + return (0); +} /* vstricmp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrncmp +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + int vstrncmp (CONST char *str1, CONST char *str2, + CONST int max_chars) +#else /* NOT (ANSI_SYNTAX) */ + int vstrncmp (str1, str2, max_chars) + CONST char *str1; + CONST char *str2; + CONST int max_chars; +#endif /* (ANSI_SYNTAX) */ +{ + int i; + + i = 0; + while ((i < max_chars) && ((str1[i] != '\0') || (str2[i] != '\0'))) + { + if (str1[i] != str2[i]) + { + return ((int) (str1[i] != str2[i])); + } + i++; + } + return (0); +} /* vstrncmp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrnicmp +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + int vstrnicmp (CONST char *str1, CONST char *str2, + CONST int max_chars) +#else /* NOT (ANSI_SYNTAX) */ + int vstrnicmp (str1, str2, max_chars) + CONST char *str1; + CONST char *str2; + CONST int max_chars; +#endif /* (ANSI_SYNTAX) */ +{ + int i; + int u1; + int u2; + + i = 0; + while ((i < max_chars) && ((str1[i] != '\0') || (str2[i] != '\0'))) + { + u1 = (int) TOUPPER (str1[i]); + u2 = (int) TOUPPER (str2[i]); + if (u1 != u2) + { + return (u1 - u2); + } + i++; + } + return (0); +} /* vstrnicmp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrrchr +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vstrrchr (CONST char *str, CONST int ch) +#else /* NOT (ANSI_SYNTAX) */ + char *vstrrchr (str, ch) + CONST char *str; + CONST int ch; +#endif /* (ANSI_SYNTAX) */ +{ + int i; + int length; + + length = strlen (str); + + for (i = (length - 1); i >= 0; i--) + { + if (str[i] == (char) ch) + { + return ((char *) &str[i]); + } + } + return (NULL); +} /* vstrrchr */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrrstr +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vstrrstr (CONST char *str, CONST char *search_str) +#else /* NOT (ANSI_SYNTAX) */ + char *vstrrstr (str, search_str) + CONST char *str; + CONST char *search_str; +#endif /* (ANSI_SYNTAX) */ +{ + int i; + int length; + + length = strlen (str); + + for (i = (length - 1); i >= 0; i--) + { + if (vstrchr (search_str, str[i]) != NULL) + { + return ((char *) &str[i]); + } + } + return (NULL); +} /* vstrrstr */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrstr +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vstrstr (CONST char *str, CONST char *search_str) +#else /* NOT (ANSI_SYNTAX) */ + char *vstrstr (str, search_str) + CONST char *str; + CONST char *search_str; +#endif /* (ANSI_SYNTAX) */ +{ + int idx; + + for (idx = 0; str[idx] != '\0'; idx++) + { + if (vstrchr (search_str, str[idx]) != NULL) + { + return ((char *) &str[idx]); + } + } + return (NULL); +} /* vstrstr */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vv_timestamp +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vv_timestamp (TIME_T time_val) +#else /* NOT (ANSI_SYNTAX) */ + char *vv_timestamp (time_val) + TIME_T time_val; +#endif /* (ANSI_SYNTAX) */ +{ + static char time_string[32]; /* YYYY-MM-DD-HH:MM:SS GMT */ + int year; + int month; + int mday; + int hours; + int mins; + int secs; + TIME_T day_secs; + TIME_T days_this_month; + TIME_T year_secs; + TIME_T leap_year_secs; + TIME_T this_year_secs; + + /*- + **------------------------------------------------------------------------ + ** We can't cope with times before 1-Jan-1970 00:00:00. + **------------------------------------------------------------------------ + */ + DEBUG_1 ("vv_timestamp: time_t value provided = %ld", time_val); + + if (time_val < 0) + { + WARNMSG_1 ("time_t value < 0 (%ld) - converted to 0\n", time_val); + time_val = 0; + } + + day_secs = 86400L; + year_secs = 365L * 86400L; + leap_year_secs = year_secs + 86400L; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (year = 1970;; year++) + { + + if (LEAPYEAR (year)) + { + this_year_secs = leap_year_secs; + } + else + { + this_year_secs = year_secs; + } + + /*- + **-------------------------------------------------------------------- + ** + **-------------------------------------------------------------------- + */ + if (time_val >= this_year_secs) + { + time_val -= this_year_secs; + } + else + { + break; + } + } + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + for (month = 0;; month++) + { + days_this_month = month_days[month]; + + if ((month == 1) && (LEAPYEAR (year))) + { + ++days_this_month; + } + + if (time_val >= (day_secs * days_this_month)) + { + time_val -= day_secs * days_this_month; + } + else + { + break; + } + } + ++month; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + mday = (int) (time_val / day_secs); + ++mday; + time_val = time_val % day_secs; + + hours = (int) (time_val / 3600L); + time_val = time_val % 3600L; + + mins = (int) (time_val / 60L); + time_val = time_val % 60L; + + secs = (int) time_val; + + /*- + **------------------------------------------------------------------------ + ** + **------------------------------------------------------------------------ + */ + sprintf (time_string, VV_TIMESTAMP_FORMAT, + year, month, mday, hours, mins, secs); + strcat (time_string, " GMT"); + DEBUG_1 ("vv_timestamp: VVE timestamp string return value = `%s'\n", + time_string); + return (time_string); +} /* vv_timestamp */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrdup +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vstrdup (CONST char *str) +#else /* NOT (ANSI_SYNTAX) */ + char *vstrdup (str) + CONST char *str; +#endif /* (ANSI_SYNTAX) */ +{ + char *tmp_ptr; + SIZE_T no_bytes; + + no_bytes = (SIZE_T) (strlen (str) + 1) * sizeof (char); + tmp_ptr = (char *) malloc (no_bytes); + + if (tmp_ptr == NULL) + { + FATALMSG_2 ("couldn't allocate %d bytes to copy string `%s'", + no_bytes, str); + vv_exit (); + } + strcpy (tmp_ptr, str); + return (tmp_ptr); +} /* vstrdup */ + + + +/*- +**============================================================================ +** +** FUNCTION +** +** vstrtrws +** +** DESCRIPTION +** +** [tbs] +** +** INPUT PARAMETERS +** +** [tbs] +** +** OUTPUT PARAMETERS +** +** [tbs] +** +** RETURN VALUE +** +** [tbs] +** +**============================================================================ +*/ +#if (ANSI_SYNTAX) + char *vstrtrws (char *str) +#else /* NOT (ANSI_SYNTAX) */ + char *vstrtrws (str) + char *str; +#endif /* (ANSI_SYNTAX) */ +{ + char *end_ptr; + int length; + + if ((str == NULL) || (*str == '\0')) + { + return (str); + } + + length = strlen (str); + end_ptr = str + length - 1; + + while ((end_ptr >= str) && (isspace (*end_ptr))) + { + *end_ptr = '\0'; + --end_ptr; + } + return (str); +} /* vstrtrws */ diff --git a/support/vvcode/vvutils.h b/support/vvcode/vvutils.h new file mode 100644 index 0000000000..c4d45e6885 --- /dev/null +++ b/support/vvcode/vvutils.h @@ -0,0 +1,178 @@ +/*- +****************************************************************************** +****************************************************************************** +** +** ARCHIVE HEADER INFORMATION +** +** @C-file{ +** FILENAME = "vvutils.h", +** VERSION = "1.00", +** DATE = "", +** TIME = "", +** +** AUTHOR = "Niel Kempson", +** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England", +** TELEPHONE = "+44-242 579105", +** EMAIL = "kempson@tex.ac.uk (Internet)", +** +** SUPPORTED = "yes", +** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk", +** KEYWORDS = "VVcode", +** +** CODETABLE = "ISO/ASCII", +** CHECKSUM = "51492 1481 5732 57976", +** +** DOCSTRING = { This file is part of VVcode. +** } +** } +** +** MODULE CONTENTS +** +** allocate_buffer Allocate memory for a buffer. +** display_comment Display a VVE file comment. +** f_close Close a file. +** getc_format Get the format specified on the command line. +** getc_mode Get the mode specified on the command line. +** getc_reclen Get the maximum record length specified on +** the command line. +** getc_timestamp Get the timestamp specified on the command +** line. +** header_type Look for a header string in a list of headers. +** init_crc32_table Initialize the 32 bit CRC table. +** lookup_key Look for a string in a list of keywords. +** make_time Convert a 'tm' structure into a Unix style +** time_t value. +** open_log_file Open the log file for writing. +** parse_header Extract the value of a VVE/XLT header line. +** pars_time Parse a string in VVcode timestamp format and +** convert it to a Unix style time_t value. +** pars_xlt_tbl Parse a character set translation table. +** rd_enc_tbl Read and check an encoding table from a +** specified file. +** rd_xlt_tbl Read and check a character set translation +** table from a specified file. +** set_dec_tbl Invert an encoding table to form a decoding +** table. +** set_xlt_tbl Setup the character set translation table. +** show_file_context Show the context in which a file processing +** error occurred. +** vstrchr Search a string for the first occurrence of a +** specified character. +** vstricmp Compare two strings ignoring case differences. +** vstrnicmp Compare at most 'n' characters of two strings +** ignoring case differences. +** vstrrchr Search a string for the last occurrence of a +** specified character. +** vstrrstr Search a string for the last occurrence of +** any of a list of specified characters. +** vstrstr Search a string for the first occurrence of +** any of a list of specified characters. +** vv_timestamp Convert a Unix style time_t value into a +** VVcode format timestamp string. +** vstrdup Duplicate a string, allocating memory for the +** copy. +** vstrtrws Strip trailing whitespace from a string. +** +** COPYRIGHT +** +** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk> +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 1, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +** +** In other words, you are welcome to use, share and improve this +** program. You are forbidden to forbid anyone else to use, share +** and improve what you give them. Help stamp out software-hoarding! +** +** CHANGE LOG +** +****************************************************************************** +****************************************************************************** +*/ + + +/* +**---------------------------------------------------------------------------- +** Forward declarations of functions in the file 'vvutils.c' +**---------------------------------------------------------------------------- +*/ +char *allocate_buffer ARGS ((CONST SIZE_T buf_len, + CONST char *buf_name)); +void display_comment ARGS ((CONST File_Info *ip_file, + CONST char *line_ptr, + Header_Struct *hdr_struct)); +void f_close ARGS ((File_Info *file)); +Int16 getc_format ARGS ((CONST Qualifier_Struct *qual_format, + CONST char *fmt_str_array[])); +Int16 getc_mode ARGS ((CONST Qualifier_Struct *qual_mode, + CONST char *mode_str_array[])); +Int32 getc_reclen ARGS ((CONST Qualifier_Struct *qual_reclen, + CONST File_Info *ip_file)); +TIME_T getc_timestamp ARGS ((CONST Qualifier_Struct *qual_timestamp)); +Int16 header_type ARGS ((CONST File_Info *ip_file, + CONST char *line_ptr, + CONST Header_Struct *hdr_array)); +void init_crc32_table ARGS ((CONST Int16 crc_table_size, + CONST Unsigned32 crc_polynomial, + Unsigned32 *crc_table)); +Int16 lookup_key ARGS ((CONST char *key_list[], + CONST char *key_string, + CONST Int16 allow_abbrevs, + CONST Int16 case_sensitivity)); +TIME_T make_time ARGS ((CONST struct tm *t_struct)); +void open_log_file ARGS ((CONST Qualifier_Struct *log_qualifier, + CONST char *def_file_name, + CONST Int16 overwrite_flag, + File_Info *log_file)); +void parse_header ARGS ((CONST File_Info *ip_file, + CONST char *line_ptr, + Header_Struct *hdr_struct)); +TIME_T pars_time ARGS ((CONST char *time_str)); +Boolean pars_xlt_tbl ARGS ((CONST char *xlt_buffer, + Xlt_Struct *xlt_tbl, + Int16 subst_char)); +Boolean rd_enc_tbl ARGS ((File_Info *enc_file, + CONST Int16 enc_tbl_len, + char *encode_table)); +Int16 rd_xlt_tbl ARGS ((Header_Struct *xlt_hdr_array, + File_Info *xlt_file, + Xlt_Struct *xlt_tbl)); +void set_dec_tbl ARGS ((CONST Int16 enc_tbl_len, + CONST char *encode_table, + CONST Int16 dec_tbl_len, + Int16 *decode_table)); +void set_xlt_tbl ARGS ((File_Info *xlt_file, + Xlt_Struct *xlt_table, + Header_Struct *xlt_hdr_array)); +void show_file_context ARGS ((CONST File_Info *file, + CONST char *file_text)); +char *vstrchr ARGS ((CONST char *str, + CONST int ch)); +int vstricmp ARGS ((CONST char *str1, + CONST char *str2)); +int vstrncmp ARGS ((CONST char *str1, + CONST char *str2, + CONST int max_chars)); +int vstrnicmp ARGS ((CONST char *str1, + CONST char *str2, + CONST int max_chars)); +char *vstrrchr ARGS ((CONST char *str, + CONST int ch)); +char *vstrrstr ARGS ((CONST char *str, + CONST char *search_str)); +char *vstrstr ARGS ((CONST char *str, + CONST char *search_str)); +char *vv_timestamp ARGS ((TIME_T time_val)); +char *vstrdup ARGS ((CONST char *str)); +char *vstrtrws ARGS ((char *str)); |