V61%DHDURZ1.BITNET@cunyvm.cuny.edu (Ronald Lamprecht) (07/20/89)
This is a collection of patches that provid a general performance increase of
11% to 35% for the ST. One important patch should also be valid for the PC
and I would guess, that the result is a speedup of 3 to 7%.
The Improvements:
- Elimination of unnecessary multiplications in proc.c message stuff:
(This is common to ST and PC !)
Did you know that every message causes 4 pointer multiplications during
the phase where all interrupts are blocked ? And 3 of them could be
avoided !
The multiplications are hidden in the statements "proc_addr(caller)"
what expands to "&proc[NR_TASKS+caller]" causing a pointer multiplication
that cannot be avoided. But there is no reason to repeat this calculation
in every subroutine. Instead of transfering only the caller number the
related pointer to the process structure could and should be passed, too.
Furthermore even to 'sys_call' the interrupt handler can pass not only
the variable caller (extracted from the external cur_proc) but also
the related ptr which can be copied from 'proc_ptr'. By this means all
3 occurences of "proc_addr(caller)" in proc.c (sys_call,mini_send,
mini_rec) can be avoided. Only "proc_addr(dest)" remains.
You may be astonished, but on the ST this 4 multiplications costs more
than 50% of the message passing time (appr. 300 us)! And while the
processor executes these multiplications all interrupts are disabled !
On a PC it will not be that expensive because here you have only 16 bit
multiplications. But due to my results (see below) for the ST I expect
a more than noticable effect for the PC, too.
I think this is a good example for "The Book" to show that it is not
important to program everthing in assembler, but that you should take
care what C statements you choose in time-critical parts.
Effected by this patch are:
kernel/proc.c - new arguments for sys_call,mini_send,mini_rec
elimination of "proc_addr(caller)"
changed references for mini_send,mini_rec (notice:
"proc_addr(HARDWARE)" will be evaluated by the compiler
and causes no multiplication!)
kernel/system.c - changed reference to mini_*
(PC: please check *.c for further mini_*,sys_call
references !)
kernel/stmpx.s - changed reference to sys_call
(PC: change reference in klib88.s to sys_call !)
(PC: please note that the provided ST patches cannot be applied directly,
because of different line numbering and additional ST stuff in the old
routines. Therefore I would propose, that the first one who applies
these patches to the PC should post the appropriated PC cdiffs)
There are more hidden multiplications and divisions (ptr differences)
in proc.c. But they are in less time critical parts and more difficult
to eliminate. So I thinks it's not worth changing them.
All further patches apply only to 680x0 processors:
- Reduction of 32bit multiplications to 16bit multiplications in _mli.s:
The multiplications caused by "&proc[n]" statements will be compiled
to _mli.s subroutine calls. 32 bit multiplications are necessary
because both the element size and the index n could be greater than
64k (16 bit). But the 680(0,1)0 can only handle 16 bit multiplications.
Therefore 4 mulu calls are necessary to realize the 32 bit multiplication.
What I have done besides a slight code improvment is introducing a check
before executing the multiplications. When both arguments are less 64k
I will execute only the low word x low word multiplication and guess
the upper LW result. But nevertheless I will execute all 4 multiplications
if necessary.
Effected by this patch is:
lib/_mli.s - which should be substituted by the new one.
(don't forget to recompile the lib and copy it to
/usr/lib)
Of cause this patch affects not only the kernel but all other programs
that are linked with the new library. I haven't measured the speedup
for average other programs yet.
- improved phys_copy routine in optimized assembler:
This improvement is based on Dale Schumacher's posting [1],[2] and
Klamer Schutte's bug fix [3]. Indeed it's Klamer's version with a few
further improvments (more registers used for copy). I didn't apply
the patches for the FS as posted in [1] and rejected in [2] by Dale.
Effected by this patch are:
kernel/copy68k.s - new file containing phys_copy,...
kernel/system.c - #if 0 #endif elimination of old C phys_copy
I have been disappointed by the results of this patch. It's contribution
to the total resulting speed increase is very low. Even though Dale wrote:
>This version is
>optimized for the typical copy block sizes used most by Minix (determined
>by actual profiling, thanks Todd!),
he couldn't detect with profiling the time that is wasted during the
message handling with all interrupts disabled.
In [2] Dale asked:
> Also keep in mind that there is a factor of 16
>improvement in floppy performance just around the corner if someone can
>find another way of feeding data to the floppy task more efficiently!
Measuring a performance increase with synchronized floppy access doesn't
make much sense. But you could speed up the floppy access by simply
using another interleave factor (see results below).
- improved shadow routines in optimized assembler:
I rewrote the flipclicks,copyclicks and zeroclicks subroutines in
stshadow.
Effected by this patch are:
kernel/stshadow.c - #if 0 #endif elimination of old C routines
kernel/copy68k.s - new file containing assembler routines
The speed increase by this patch is quite impressive (see below).
- improved message_copy routine in optimized assembler:
Instead of using the struct copy statement "*dst_m = *src_m" that is
compiled by the ACK compiler to very bad code, I made a phys_copy
call, where a special fast copy for messages is provided. This patch
can be en/disabled by defining FSTRUCOPY in const.h. Other compilers
may produce better structure copying code.
Effected by this patch are:
kernel/const.h - FSTRUCOPY defined for ST-ACK
kernel/proc.c - phys_copy call introduced
kernel/copy68k.s - phys_copy optimized for message copies
Of course a further perfomance increase could be achieved by writing
a special assembler message copy routine. But this routine would be
dependent on the message size. My patches would work even if the
message size is changed without adapting copy68k.s (only a slight
performamce derease would be the consequence)
Perfomance report:
I have tested the following commands:
test for:
- img copy : cp minix.img /dev/fd0 phys_copy
- vi -> flex: calling flex from vi (both with more than 300k) shadow
- flex -? : a page of output to stderr messages
- cp : cp /usr/bin/flex /tmp all
- make : make make (a realistic application) all
Results:
old +mli +phys_cpy +shadow +caller_ptr +FSTRUCOPY perf.increase
img copy 40"5 39"9 39"9 39"3 39"5 39"3 ?
vi->flex 2"85 2"65 2"60 2"30 2"15 2"11 +35.1%
flex -? 10"65 9"70 9"66 9"53 8"85 8"50 +25.3% (*)
cp 5"48 5"14 5"04 5"05 4"41 4"39 +24.8%
make 4'40" 4'12" +11.1%
(*) after linking FS,MS with the _mli enhanced library version a further
performance increase to 8"26 = 28.9% could be measured!
(The time are measured by hand for 1 to 3 test calls -- thus giving 1/100 s
values does not always make sense)
Besides the floppy copy the results are quite impressive. Even make make
that spends a lot of time in usermode shows a speed increase of 11%.
Floppy access is overlapped by the rotation synchronization and therefor not
a good test object. But floppy access depends on the used interleave factor.
Because Dale's results [1] for the old kernel are extremly high:
>1:30 of wall-clock time under my older kernel (around 0:55 with a
>GCC-compiled kernel), but it only takes 0:12 seconds now!
I made some experiments with different interleave factors (all disks formatted
with 11 sec./track,1 sided for minix.img):
Interleave factor cp minix.img /dev/fd0 cp minix.img /dev/fd0
from harddisk from RAM disk
1 1'01"5 1'02"
2 39"5 35"
3 37"2 36"
4 38"1 41"
5 50"8 53"
6 45"4 44"
So I guess Dale uses an interleave of 1. Interesting is also the fact that
sometimes the harddisk is faster than the RAM disk due to the DMA usage
instead of a 68000 copy operation.
MANIFEST:
kernel/const.h_cdiff - FSTRUCOPY added
kernel/copy68k.s - new file
kernel/Makefile_cdiff - copy68k.s added
kernel/proc.c_cdiff - message speedup (caller_ptr, FSTRUCOPY)
kernel/stmpx.s - changed sys_call arguments
kernel/stshadow.c_cdi - copy routines disabled
kernel/system.c_cdiff - phys_copy disabled, mini_send arguments changed
lib/_mli.s - new version
README - this file
[1] Fast phys_copy() and direct FS copying by Dale Schumacher from 13 Jun 89
[2] Fast kernel copy BUG! by Dale Schumacher from 15 Jun 89
[3] Fix for phys_copy by Dale Schumacher by Klamer Schutte from 16 Jun 89
All patches have been tested thoroughly within the last few days and should
be free of bugs. Wish you a good performance increase and resulting more spare
time to make own contributions.
The cdiffs and additional files are shared, compressed and uuencoded
(Sorry, but I'm on EBCDIC-Bitnet):
Bitnet: V61@DHDURZ1 Ronald Lamprecht
UUCP: ...!unido!DHDURZ1.bitnet!V61 Theoretische Physik
ARPAnet: V61%DHDURZ1.BITNET@CUNYVM.CUNY.EDU (Heidelberg, West Germany)
-------------------------------cut here--------------------------------------
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 fcopy_sh.Z
M'YV-9<:@>0,"#X@6()J$65/&3!HV9;Z,(9/&C!D%<\J0 7'BA1<L+^:\&'D"z
MA(^$"QL^C#BQHAD0/'AP?'%" 185.%$R= CQ2XP8":B@J0/"2!DQ(&+0 %#y
MAHX8,W3 B)$T!XX<-EMHU:D28M"A()3485.UJ@X:-734R%'UJDV<<./*5?$Vx
M9PP62^-FW7JWQD&M+6R" &%S!8@@4Q+T #%FS$''+8@$H1)$2I(O4Z@<E#QDw
MR>8V-G# &"T8!!,BBD&\J#-'S@LV:<2\)E-ZB)74JUN_COUBC)W2;'"S=@U;v
M3-VYR(^#P,%"*0B]6 8_$:(D]1PZ;>#@<4'P>ILP:=QP!P%'SILQX^?DN5ZFu
M37HZ<]"$(?/FSG@NI1,,ID,GS_@Q;)RWQGAMM/>&'/YU1P<9W[UG1H!PP)$@t
M"-?=$5X:]^4WV'5CO"&>@FN(0<9[=I!1AX-NT/%>>>&I2!!^6(0 @GX@T!&&s
M&!"]QR <W)6&!!%2I.:""R^@T5L8;+#AAAPNH '"D$7V]H9[3D)I9(=N7-?Dr
MDT0:688<YC'I)(R#T6AE2&?PYU^578:4QAEN(+GEF?W!4<:69,XX&)9:.GE&q
M@%N6=]Z6:A*:AYUX[H50#LWY!5A@T8$P776+>:?=>]^%-YZ@Z'6W'AWMO1??p
M?/5E&"F-A1($H( $&HB@C@TJ^. ;$4Y8X86FEKDA'5B^%^*("I9XHJPIKBA'o
MBZ;*B.J-.2JXXW^TYA':@&_X"*20;8Z!I))B<AEEAU1Z>Z6'?8K[PI=A)GKJn
M8&?.D69_<[8YQYMQLA%OE'7>.::&C)&KHI^ .LDIH? ZF6^B+R@0T$ %'02"m
M%&7,5R!&&LWT44@CT632PQ$S6 9,,G54$Q9"I3$'"":#$$:_209$1QH>@O#&l
M2W"$P2L:99Q,AWQTD&>>'6ELM/(99;CQ)9+D?6G&@=^Y,<;'X8TA1\09R7P1k
M%C^54"-!,]2@]=)RU(@S")FY(*G1*&=WH(TIDF>S0!0.-);0;,Q!D!@?VX%Dj
MT"" +?;'4 QA4QAN;)0$"'>\,3<(9]21\QPLB&WSWR!,/<=8/:>\\AQV:E0'i
M'%:#,,/6(-Q0@@LVV234QTED]W-[1<.G0^I8(%0$;&V$9S/,;H1>AQM&/SW'h
M'&$@"$(;F*<!!VS:ODPNRKT/[%B!PX=!-(5TU&'1[)&B4/+)*8/;1LQT$)29g
MRH6#$#@((:106FF#@4 $WWDH#L(:;M0G><]EV/%E'L=[G/4^IBW6Y P$2X'#f
M&UKTI>,E;WEI:![O3F:B8[GA#/#;S]C@()^JW0%G4U-9DJ '*C!]#CXJ"R&.e
M!%2Q'QPF?:.;V=_:T*_%X2V#*K/# LE0L1#@<'4.9,/+("C!YQ7O8V@(&@][d
M%Q[*7<=FL$O1R43 J2_,APQR0(&V6B:'%(@ AQ^<7!GP4+/"Z8P@(C !I[;@c
M!"E\@3)36,(45K!%B,BA"R)@3!A8$YXSJ(P\"TQ1 Y$G1.4Q;W<>PN'.)J<Mb
MX+VA9WC+X0XU8C8AU*%G._L2U$Z6O\I1C7P$F9J=)K>S\"%I#&-!I!MPV,3^a
M_8]"=1"#>2X9GCN!( E9 M5\0D<'.1!N#F;X4A]EY@8V #"3>N0B"-Q0AS;@z
M+6R9Q.'4V #%C2B0@= D"#(Y]3CLR:$.8\A>"#NT.,)M)#Z*8\-&(EFSX6DDy
M<N5[ ^HB%3\CU$$.F93#^$+HRMZ5CR/JF8-$ME429&+SFW#HF7P*9T<]1B\,x
MPUOF(XEI3$6.36_'8A8!M]5 %(RQEV$(9\7,8!X:(O.C7ZH78^[Y!4ZE 1Bw
MN*0([6;1CTVSFN3I)>*2"+=&PI2 M$K#2$O*D2HF5 XGJ.0QDWBR OU2A&S v
M80P;<\^B"2]T5#3/&*Q(!BQJD:-=S&,3I0<"% 1TH$EB0>[<D(8O9*1P+,#Au
M6MLZM3&\U*>1#(,.@T;)LQD3!%D]#U>]RL/K>-&3F<K2/.,WF"S8[SL S.MUt
M/&0RG)$A<C'M&?G&=KY2GFPIA!SB(9V7I7Y=IZD'*H-%"0>"&L! :S)$)O6(s
M=[UVSNN"-4I#@<H:A@@Q272C 0%K4B"C(*3O@ROY&PZY.;P#@6", ;GD 3-9r
MM= :,H*J/-FV2(BN$VHWA!0A'HYZB,,G]&YEZTM#SRPTPOQ!\F.+Y!\9BS8Oq
M__VT@%4#X<?J1Q3YV-=#?XV!#6"J7KD^<+03K*1,301?@K0!@);#W,G,6H:/p
MX2U =WBIWY!YOL.-T4[AQ.'*]@G?A4KT9=H:[W,MXK*^.1>9@8/G&^2)P\.5o
MT@UK$%O*-,>X&6]DC&'(#D1<'#81 %$(,UY#'O^)SCOL#V69X^0C6:DV?!(.n
MDP01U!E\24-7XC.)N&TB1#/B3#MB5J;Q!0%_XY;.C=B((3C45@C#V+,A8 ^*m
M!9*BFNTGD!E7K8DO*U +I*9>[)*E9OB<PSQQ6 06BW2=2TU9S6Z6PC)PC['Ql
M8X@<C,:&%Y#5849S<O$:EV<4^NVL=53KA=Q:M,O.]0MUQ2&F9TWKY^).=Z3%k
M:A6OF,4Z?LF+LJZUL!FS4*)M9&K!G)K3#NBW5[_5U:NN:UG=&T%+!WO8M [Lj
M5GF- B14A@A7J$P1#LM>LD2R?TBJ T[%L%2@9F<E<K@VMC%M3CT:4,I!%"UVi
M2=N^8&N:TR'Y5*@@0VS"&=N3R;9J@X^W:KK0<][#1D'@=$ >B$"4@#@;0XY5h
MX +'^,T,]\PGP]GZ!16P -7;DC?$&8ML32[[9/U^>*936H9.6VH[)W.80 Q>g
ML98K^VFD0WF25+[RLDZ\X!>T:4-<#O0FKJ$X.,"!"\Y(H?6@E2PQE[7$AT#Qf
MY5'M8^XM,2DW^#.^;N1\DQ;( 1OIWI^J+$*PJ1A%ZDH'8\95YH/!&WX_)D.*e
ML%C9/8,-VICI3&'BMMY7++2'D':^ZVCO)8 >VQO4&>Q9OLQHB@;!ZI"=VELBd
MKLT^H]4;,@)/GE'.(7*X#C$_]D&"]!:".0LV=3^6=IQ1'<9V1N?B%*AZ9+[>c
M/"S"Z?I:8I$YN$_FF__8$8_7^21VM6CYOFX12UMOB@!M7L]#P5%!X/>$O_SXb
MF!ZK5CNN8$SB#(#+;R)$(AIH AX+Q4A#- KK36+NNR2"F%,D06JN6US;<@H$a
M86-@M@;@0P<G(&7KM39.LG,7-$R9Y!ZT$P0C!')?UD"U=T"O]U< =DP$$1HPz
M@ <P$'K"8S>I1W&T@Q 08R+AQ#NA,P,R( ;J%7U$E%VD(V PV#/6-8.D!3Z]y
M\P5M !M3QST_-#8YB&#/LW>0!EAJI%5;X 9X=&>@4FHG4VYN!RYPL!*T(7/_x
MY(- >#*7(TN*<WD;E229YX($AH,'MF\35&G+%! "A" XI'=[5#5B\$@&,S8Uw
M%T4],R]ZH'SI8U"%,T;+5$/JY'9;%C$E)#FK)',V0 ,YA@("=H8I4'Z4XX$Hv
M /-D0(AZ%,;" (+109#%HDW*(-&J%A#J$E@\S&@-19$44??!79N6#W&\T]3u
MLS=]2#EF.(I%J(8>LF@R=P6F=SC^]3'T@39X,R^%]4=S !MG@ 8]TR$\E#:"t
M8@>EAC(\V$MOH(+#M#)JIW%QV!"=!UVH='E^)%MI.'V9!XS05X<[DT*D%CNOs
M" +K=S*-N 8UAC@/01;B*%T4U6[RJ#^)(P<;81 8]GD"28J\>%[ITSB/4U/"r
M%2$-Q 17X$F7(T24:#3^4X'SZ'E4N(^@ E4(A)#HR$HO$3QOZ!^$@06,YFB@q
MDH2>Y3:49C)"B'>#41POP(48DG,(@5QPHWN%&$E?>!WJ)5TN.3:AMGJ+572Sp
MA@+%> (] S9$@V6>9(7)A4S%@3X;T2$2 F5;0W38EAO$$1O'5UXOL7<Z=C*Uo
MIS(LB8#]2#G_5G,P)5/;98<6:!Y;%F1SL%H]LWR"QQ ;82'MB$Q'61R^]"J>n
M-XQNX)0!!%%5Y69CPSD59B)P@$-^HU='<SUT&39:QF4GDP=EH"(G*(VO8TUHm
M8'5:"6%A6$O0(S,)U7]]*#3N5&9?,I.8]CVB^0;^4XTI(P87MQ$Q0P1(\C%3l
M(!#-%%(@=(" ))2XM04QT 4LL 4RT 58F9*8M@345"!A,YQ#P1]E@)PQY4<.k
M81!;, -=8#:XQ$,5HU[(:9U!]B7(F9'8USN Z20K$TQW0)DA!T*W28WP6%;Uj
M-S5G8#(E=#(&M!%^<YJ3Z'D400:)N9=PEP<.>8$GLV%C8P13H#)H.7HMN9K,i
M*9WU-C5JX#+IV3O0*9WL)C_!Z8N8UFC!]&@P%6EH^3;T.36T26MOV6FG.2U3h
MYS!MZ&0\ 50I AYLA5L<9)K1P@)#DI2S=J,!QQ[NX1@\.@(5P10@, *M-J7\g
MMU:J%#J3MQ%V5J0"=9JT@VG":)D_!7WA]7J!M*$GBDP1)D0G$UM,!9,"89X&f
M>#)8TDNQ04N)I(7:-#;E8R-D\:;D2"&=LQ%14XM_=C(9"4 89C9%X#_^)#?-e
MB*)#=@?F 2J7QE@^8)OPR8(F@T,^0"N!E@:O26244R>&UB];N4(:1R&F>D %d
MRGRJ=Z)-<"$&P92?^25KI1&B>J(AE3WQ9QX\T4>E1S@$J'G92 ;M<W>8-C;Dc
MI$X-RGV[&D[XV(Z"4JRXA4SM]V0I<P<0M:$5Y( X(U<"=#V?*'A^-)\@>5#>b
M97_B!1$C4F,D&IV6JGQSX)>;&C\G(8%V<S\5!CI-M%:..7::9(U_9 ;!ZEPRa
M)&"BJEO3J(>K.2NUDC1R #9- W1JP!I[.4M_"*T'8C1A,Z5V4R >LE&+B&D^z
MX!#I0SB9B3AA $ R%$P:,4QD8#,K\T_(1+%;:2/YRGS\9!$1)%0I8DP^)'--y
M0#7WM(T6B[&$TW1.HZBLIUY.HAY.@P;FP5:GRK/HUQC=1!\YTZ!RE1(.U)/Tx
M94N6U#-K%JWG=*@/>7H0LI4A-8(O"JM"!J$RQT>'YU[ZB4T69U\*&T[.16%*w
M5Y$H=&'U,8FA";&C&3>DXF265TL\R)JE>JICUA[C)0<U&C^',S68^D@E]C$/v
MHCP $D$$R *G6;H:IUWITX=:Q3S)^H61BWG0@T.G)1_T81]CRE@L*J)%*6DRu
M6FF;RUA,>KN/VW$.(Z4O$8)66CA8>FMQDFLRU*4@8&>S&WLTR:0YB@,#HI,]t
MVC?)E:="NHVQF;F5DYJ8M[OQ T20.:)2\W5U^Y)IF3)Q4 ?J!36N\SAI8%^$s
M^U,8IK@J63O[63&S-4 2$2WG2TMHTT2DZIH5<[FRJ;GJ.QBXQ!Z[)$-Z6XZ/r
MV4O@](P(_$11&#N I0)D<!T^" *+H0*ML55ML&2F%ZHR1Y7R&K]C$P2=T2_Oq
MUE#_U*@PM4O06 :1<SC?$8TK Z8'+"%QMBV1\T$'NSD@E@9(H["J=YJH6L!$p
M SYH678\-"*:-Z>UE\2]<VYN\ )I.EY)R$,L.TP62@524 5#\ 10D 6KR2?_o
M8C9/('(R_"5Y*7.0%7HJ:&&?F8C7\4WA5%6LF@?#],,JRKLL63%MZL7!>T3[n
MBFG:ZR];@A!%D1EM_,9Q3*TL.U+.E1DM8,-+<&U,^FF8;,147$<D9!Y_G(6Um
M5LD2HJ,GD\JE&:8(W,"YL[7.9<5 =8782Y8UE'K*US?Y:8%*,R5/"S51"[]Ll
MZW;&*53^DX286F@7)&*&&A!03!80;+Z^?,@)+(:4^)+7^WDVI%HRQT-V$HAMk
MLUD?\\U\:$M- $ 2:LZ%&) YUD\H\Q+1Q,?G^C'QC+ ,>'#S&88J<[.MB5O;j
MV[UEU8F;PXS.N%S)K$]!!G0\)+7VO$ZAVR]94@;UJW!CB050D,P9JW0*A$\Si
M6:;V!2KLX9BB.WD8ELA3TC0E/,E*>=,XC6TL_90'<FD(H5M^1,4@0'&, 3ISh
MM1U K1H\9 <O8 9D$((Y+6RJ'"V"@1! <Q G\2!C1-1U-$Q:;1 D-24@<-4Hg
MP(Y.PJ[UMTB],P.CL08OM2&X6Q]5W3<081 MX$*#0=1%/$!<>DEP@&;.@BY1f
MS5B^O,<Z!SJTQM6@ Y8O (-C_-6J@1V(/=BSEG+1@1#?P1"S1M29_<YDRUN>e
MM#="Z1@9F)!O/6^6;1,08[AS,+RS1KV#L0(_F 8@L *JO)4K,"JY6]N^)@<Md
MI5,KL,:;#,=R/!AV<K$ND*A?1SM)3<4T ,BX!>#,0,Y( )L,=W5?=V,1=TBc
M,#K;7=W2/6O<[=W"]@,V 30ML+)U/1@R( (X$-[M;0/P+0(V -6,U=YLC6GMb
M'0/AK=\B\!.UM@)=XP(Q4 (V =EW/1@Q -WR'3_5?0/V7=TV,&"8!M[D/1@Xa
MX-[]S5@9[EH!+@,UX (SH#4HH +'-P:3C6DU( (T@ /QL^+.,1@K#@-+H>(Bz
M ,;3@,L3A6TIN/4_>$TX (X8.!8T-F81@,G\-QY1-DWC>0QT-X!_A,$3N0Vy
M4>(O%09FD(A]J<93P )-<*'LBDPX^5QNL%!/LQ&$63P ]*DQ4Y_''&\/=]Q.x
MNVS0\[X71SH9+@,#MA@R('4YH#7/'$E.=3E3PZQ5#D3=NGR#WIAU^XFH2A7_w
M-#H[G4QU\Q=BPQJ,L[_#% ,OL. AN,=ZPP:.0T%O<$!MAR3@NA['0[9OE1$Av
M+00YPU<Z,S9<"\YNFC,2QH;U>[^BJ;_^ ZF2NNJ:W=DVD6:0:49_%"":Q<^Zu
MQ<S"E1'ZE(T /1!WH%W9[+X8W; %[HM&$+==2[<I@YM?0DT0690V]4A;:K4"t
MD;6FNJ7UED_@&#;N-3@]EHTUDC.:)08A&DZ46.MS^[5EL,XE3$R4,ZM^&S& s
MN[!,8A.P;I; "1'(2:@GTZ&HBDS4>Z-L^%%3\X, E$3-R#T^$ ,ZD-\R!*Y)r
M,F@!\JK=^CL7?3PRJTX-A/$H4#R*DSXPH!9^P:YA8!,^< 1#, 2#-B57.,,Wq
MF@)GECF:54S'E!(G<_-/3B$!X2$#GS]W<+1"/!\ /24?\V'")(77ZB3=YW*9p
M(TAR\+>BJ_ 3MEWAE:Q.RYU9R*X GA'H\0(@I7'- :M;7,6XFMQM< 8IL+FXo
M5$)FWS<*'S\H/G)I@-1]K]3]T]1/;?A&O?=)3<:-[]0PX)4W'=8T)!\"N?:Tn
MIOD/$P1- *_V&,#8QN,0%P,G,!71'=6JWQ1?1)/W?=/<O>&TO^)$=^$0-P,Wm
M( (R0-DS8 .QCVTU7G0SD.&HG],T$ /#/VRVCVVNY=Z470,ST/S"1N%%AQ8Ll
M3MDTH..T X">QY 1]? ?<V_HPUUEC_!\]Q(Q8)YDC^_#I#EU\Z=G;ZWQ91,Ek
M^YG-/NM(5#Q=93(Y)F5(L42DUBB'%!!]I(_[. [2@4R(0!,( L]N@-B$\&#!j
M?--+6!D>*+A0,5IQ-$B++[()#] )) $C4 0RPR2K9+FD24B$[A,_,)EP<V/$i
M[:!ML0PBRZ0%]]I1LP:3':4?10-I3J=1"#MA):Q ES 8,-E"VU%7Q%<]G%,Vh
M?K8*\7D)+7 PP+-#]3G*2F_[;7(@<KQ 3I8%P,_,V30U)R1(-IPC;(Q@L:D8g
M0H>;R8%W)$5Z(!BT.? AKMD')T@1BN">0BX*8#(T"R[X@P DH4:CC#$&+f
M8 ?)PRT[8@"DC,FKR.%L6HT[:B;]:: I0<9BDW 2#L0V.K ,.!DVE[+BAQ0He
M D' 1:!FX;)7A(/#& V@>(9@7!E"(V4A$ !5RY]S)T68Z$.V3"I6^2/;!"Gd
M[Z!VP@;H@PIAX7<L!ZR !4I446"%&(^*"8$J< 1D!$X[4;E0.Q6G7M@WB I_c
M"X:]PRT40_)4%!(?JIIJK0J 1,-=:)P:2/PX4>P).^G"[?21JJ%8BT1B(1L2b
M0YL@@0Z-C#H@P^A,^1-\5S%VQH%0',WHK\RGR/,QJ(GJL4_<)V:QKG,B-R@/a
M%H@D)*7"A([OE(XJRYXA"D/#QS0MIK',ZAQ&^U"XKI#@EOK#.8Y(L6MVI,/(z
MU8?>D:>.169),+1#"*@7HT$'B)H5L $Q @0@1]1!:2 %DA^3(ZQ2('%4XB8y
M0) I#PN##MB$*N#&H !18Q=#(@3\CJ#Q!D+ 3B0"/?$GNH ;1!-#P$T$BL)Fx
M=:26ES$'U([ZN&5IH/15!BA@7#X3Q?F*)> J9L7V)P22 !5P D6 "@"!(5 %w
MG$ 6L )-P 7P1;_H HH 5J0UW:8,\!4V\$S.0.2X O@.!!P!7D4X\L!82A@+v
M@R#8-1!@"?-21M@('>%BB 22L#$Z(\B8"2-#>:&QP] 9;(*,0 &DK UI!-95u
MI2K":L0;J>CTI('4X\':0#7*.C$".0C'X4@<BZ-Q/(YSP36Z1DSS!8Z'/$(9t
M3X)"!,6@./H.AQ/P/ 'L:#G#^"$$($H$(7RJ9U[ "0)VCK;4]7*-R#$]JL?Us
MB!R58XQPC3T@/LK'^4@?ZZ-]O(_X,3_JQ_RX'(L 1<@U3*5\P*'W&",&PPA@r
M+,"I'3*Y(3#3^A-E$P)X2T8 AK_P*+9"A;R0&#)#:L@-B2$I9$K:CE2!O[D q
M&& #A!Q;"%3; L)HPO<#*GK'=!PV!Y )N,<0P!YKI(VLD1.,UDR=%A,_7 "Hp
MP -*4?;U2+G7,WID22$Z.]):]<B;92.0))%D+%MQ>- .)\DCV<6/#))($HVIo
MIB<QVZ9D<+R18#),#L<9.6S,!@TA"VF 3 J;51@>Z47%D$@BR3RB+W1&(\6Dn
MG;R39!*7_+6:&#]BQA/1.-QC.ZZ<-B #7 !9X%&[J)%LA ]YT]I ^SN4F&P7m
M?8GE*&QFW@UX*>D-!20:+&@H,:7*$ .99VJ(D^C12^:)=I04?NV2$+6G9BCMl
MH,=S$@>BY1$J2EEKR,"CM(,%*58VD%E9((4-&9 !+" ,8*(PP.,0@L/1CG<Rk
M689)VN$"9IM-FS7CX]<=RK+".5+ "@B6]@W3R(BHY$E&94Y9>$)R3[ !)C$Mj
MN8\,(#K1\DY,2[,"!ZPE"["5M69;?B:$U%$<92QT,Y&QP(1+F+(\9HW1 ))6i
M9 T2G;:#:7[ERI$14\IHG('=80<HSF0)(>)1(6T$A3DPR\ 9:)7QPU;:A'])h
M!P+F&7B6F"9=8DQJV2ZOY>.C-?(2#162&90^4 "AO)?W3O7H2VPC!OHEIB$>g
M=@#66,R!.5$*YN^#. BS)%E,ANDP!21 HQ?3B6+N2X4Y,KG/Y<,".%-G?LSXf
MD2[=PZ$D S.@!9 !&L "6@"[/&V#04;@S/+W&3U)@&(/J2='0DMQ-S)MY;NDe
M >B2;4Y+MXDUB<X< %<ICOOH/F$C(["F"W RB^%5'H\8@"Y94<'$1/!RV/1-d
MJK 8"A*A;!B.DW#N2Y'I9 8#UGR7/Y-OFLN_B<(\T9MP$HYR.DVZ&(0"/L=Qc
M,TA]4-B( ;2!:0+$!?%!8R%>]LF78#"%T@AA" &/_\$J..$%A<W=["V'\V Zb
M3<X9.#_G\3B7^Q(^J(C*:3FSI>)42N\N7P9)FLDZ"5O0@)WE4EMZSDKU. F2a
M_@B=/. DA*#T1G0 !+ED+"=SWL@(P:DKPP:AZIQ/,R-TS(@),AF+\IPUOY+Hz
MU,SL2>929ZUAFN528RY-B[D=YN;3;#7UDVJ*.ZLY&+ZFR<R:6U-[6@ZC^>QZy
MCL444'J,Z*B![+"4A.5+\9*Y@PQ@SP0J+L]GQMR;LM-Q_CZ#(#A#)_PLG^.Rx
M::9/;+,^C6?WW)Z@DW$R!?WI2V:-0>R8A,0FN,XS,$(+IZ@[G.\2A3*6OCDZw
M&N?W7*$X='#:3;P9/('F\ 2<4910&E&B@#Z!Y0Q%F4ZS<[90*-I")></+:*3v
MTW"B3\19_&1G!"V>W!.*1DZU>3.I*/H$B[+3=#:0@&0!_Y&3:9\424G5FBN"u
M/V? NY2<V,9\%M(I"CS1YPP@.E>D@)[0=^D\9XV,(*3L"@^T@%$D0W*E0-J5t
M(7%Z#AM"6C"YI@#%-K\S;R9.]>E'9<8G=9^A%(:&C5+*2%4IW-R7D;1MFM)*s
MJCTQ*=4J")LT!G52_0%(>27-[*$W\S.Y%7IA$YJ7WU$ F+'/- R$0,=4X!.Dr
M&*#1(X"$T:@Q3D(U10.#\"7$!-2H'+ZI3X@!8> K$ 6Q0!9B %MPIVHA!^"\q
MMD ,)^0W5:?!L)V^4WE: ]("B*.GQ\$X*@<;P"AN0%Z "XH"!!!4%G #;@"%p
MA!0&4DNBC2G@;8C $[@"7R *8)L9D !>@ JH'+\C3HR7H^>X<E?%8"X9X62Ho
M@(01*4: 1/T83D"C*B4:T%$_ZH&4(671LHR%8?+11MUS8*F#H3#41J?6$%ACn
M*<,"AL&EJ@2TL06)FU!UIA6A-$#5ES 9*L-ER SO(U)XU(?*(;NJ5_VJ7?6Gm
M0E.%(4TWXQ'TC!4C-&[3C%$2O&FTH&6G460T4]M85$&#:" -6$ U%E52MAQAl
MXPTS&K/Q_.G5EX ;.\_.VHU3K$&V#>!8)Y6E8UV/:C)^V)DGH#Y @!QKC@/&k
MQ7D&LW&A7N2\J8X@X#H>CNQ(*P=#=YP7'H<54K$\6$'-'<!Z@Q_RL<K6]$@Fj
M&:0@D2*!DE:.+CB@NI+58!@CDK!&) Z8DO)RC SIK7ML.[JN\P"[<@X(6*Y_i
MQ%49U[+47&EEZFJNA@^!K0SI&CJ0*ZT$AP DN\HMXBH@)F(>8&DS<C^JU_7*h
M7MMK?>R/_Y$%!<@#$2$IY8&,'PGR8P1%!ND;'>1@@Y#+<4)F2*X*5@ML@?60g
MM#)$SH 162*O GCL&> 5%P:G=3@-]5-.DPPRLE>"@-\G8!BLB8Q+X"GQ8:#Tf
M\<-N4QO(32(,'5ZG!B(-N1-CD2.T<G0\N1%Y S[L=P)?!J'>4" \)NT&6#7Ze
M)Q'6$P:!#+L=EX)2H+$?=K<B5Q:P7)?L=35=VN7Y+$J($R-II5\0D3"@QCK8d
M 0C.REFS^6=1-N\!V4,HU 9#E260C76VJEGA2$>AY)/LD5>22BI)=G$D]V62c
M+)+L@DGN/#O[9MD%J-QC;79(5LDG$6=-7YE$*9MF,'P!)5M=[2RB=9%?H,DVb
M6FSC AZMHGVRJPM)6EK."%Z]9)I=LZ 6H:+98?,2T"1Y8 S/D;8YAAR37$OKa
MK &N9Y!T2-<X59(80Z/]M*$6U.9)-[ GGZ*?M!& TM7.&S/@-& 7Y[2#A.>9z
M=%?L^D_$E(9=.0H+B\@ '%L'0:86E6]509:CI.!/ 4EQ(FV<B &4%OFB1"Ny
M[1:QM:9+VW83R>EM,8VEQ)0^0%/"!T[)!CSEC0B5G^F>D$IP>2J?0*KDDT[Sx
MD&++8%DLG\.,S+4(U^$<N/D0;@$$8UD,M.8#M=&B(R.R+:]9MV7R/F$!<#MMw
MRR7$G34?"/LII8H+N]1M1,F<.E+C$MML&S\^+J;Y0"X.I\F(9-M CBNS)0B[v
M]4EH7)NP:&$#;VVN)-36FM#F&3=_'?,$M^*6#;Q;2BH[+VY$H0I-Q+ONR[IAu
M+\KE"& .3ZWHJLN,.2QYZ?-TNB>#*AP504IKS*<,?9K8AG+&#XX+();N%XT?t
ME[2K;-L-.\<F[;"ANDWSZE)2K=LVAR4>_;IRMYO\OK$K2\\NWSVZQ=9TN5VOs
M.W.;B;*UN5"6=,!:GD-T\*[5]:)>5W,"UHVP% ($K: Z.9<;P2ZMRT#-I=:\r
M 2\@#,B %A &;$#7?+?:<VR:30R:>EHKJMJM/'1E8)I6@WLWKL]M1$&W:F+,q
MF0<#W*6MU)HB%XP&B%T"^A@NC[,!>& IL!OT.CD7Z/ EEL87]:I>UIM\X>X_p
M8KY$A>'^3.@K?<\K]DJ[UO=J:M_5VWJ[I@R@ <07;(9-[&%8"<)!"[>#@?R^o
M*.J+?G,3QCR^9,#UMH#W._-B@/Q=HO0WA/R3^SM^H^_^/;_#1O@>ROAK,F, n
M\J6AW]= A5\L\GP=\/2%P,)& C=0[&LRUR_W3:%O /R*-?&;?SVP^35L$3C]m
M6DX3W'X',/SUH)8T 2^<^]N!RR__C<'^]VI:X #L?F^P =:<#W,'LV"%ZH)_l
M< B6P;RE^%9@K3EQ<_#RU< KF ,/!AK0A$%PK1'!O,4 7\OM&P:>'P*^PNZ0k
MABQA+NR#O3"M <-DN 9T30$3?Y$P!5W SG<+=V$8_(2#L.4<PERS!=!A[&N'j
MZ^]@6,-[V";P7I\;=,F +-&]7)<%[-9&9$5YR/NJ1N0D1<"3R%AO/.]DVI=?i
M*.]^($\W&ICN\W3$/31='9!.Q$=K"-GCP[5&#"2163.)J_#SQ&IM"$@JU*5@h
M$.K1 X;%;Q@*OUN3N7K) U.OC)B@G8> $5["539_">]%]LD&MJ!:Q.N;(VLg
MM$8//)?*(3-0K:E=M10"&\\:Z,H2L2OHLQOW!.ADVW]26"[/EK*X@5=*?DEKf
MO&9W;:_MD[WC3ZZ!0'G3]$#BU3C5%B'0W+ !>5<7Z5BNPA;;Z(%V/&ZCH+E%e
M&NT8U[ @>(Q%&M*S[:"7$JO)6X$R=NNMP[BW9D-4ZMMO:2J7H[^E _<XX+I-d
M84EP[>"Q1(_TN!X'L(6,[QQNRZTU$C>G]4WX%[TF<LD%NSK7)OACECL87"YCc
M";DZ>9DXWII+72/O/X&N03F 1=HOP5RA;- UNP$4[0+A.\$\:3*'4+IAX%*:b
MXAP<D7MRFXO'DTOJ8AO+RUCT;M:MOM(R$@O+F[:3E=.6(KQPF2O'CZ$,NQ:Oa
M[!S(R]8I$P2$G)=+[Z\\O:F7_0I@V(N 92\S1IO.N!\.9JI<> /HWV6ET/4Qz
M#ZC*W$4Y\PGUS);SEB;2&!I :P!HYCXVX#0;8[X[-^\"L63-&=,U(\_^NW7_y
M<+!\I'FY;;IFT;R5=7.P-,VYN34'R]0\=2/&K %Q-B#^8DM66CY Q\Q"K,]Hx
M].[+1_QJ"P=A7J[(.?A"80"L?2UP#:[#"!BZ0H5$7)C_[Q#NSMSW]>+@\$R5w
MD\(,(,^TV3"?Y]3KG1?S>O:^XOD]MV%@O#;],/>9S\0R/7O-^SQ_\S-\WLKRv
M&3$'Z#*LGHNO]A3/,N! "QN+,VMJP)-3SG,9 S?GT,$QT:TWP@*M9KDV8NJ\u
M1IDL54;.K-02;SP1EHGIP"96/9UXQGSB^'Q]+R4Q5M"*68+BNV5\02&S[7W*t
ME'E?3N/L&)-E\JD4-HXARZ@9;PP=P7&KO<B8AHJ5X\A[CA6''%#')9<=\^1Ws
M_)/1,DPNTM=XU.I)58F/[TRPA=*)]!\/"'*KE L/06[*!KG94C4T/6PF0DVVr
M%VSZ(9.%LLRETRW83<AU>H4U9(>,%L\M.K[2!*1+5V1YW&X9"^S-E)NR(]M;q
M4!F2\VVBQ<O]]M^N2L3IFOVN2R:3$,,].,Q8PEHIE"D9(<M'?("25HC+MI)Vp
M_-)@VK'2CC$@J+.G48X?.5GF4@@KC:7]-%J>-7_3)MCIK_QP<3(>Z+Z5>$OGo
M&HH\=X,U%A@#:KI81UP\$'/I<IM^O' Z6<GIK125>2ZF)4!7F32OT<-K^&JUn
M7Y:=AQKH .6H:W<G]#+*NUA7*_?AVAQP,S3%W=7IF/:42M4LK[\PVV2>PYI7m
M@&6Q_';G+Y_.->MZ2F?:J?NNK6Z\ALW-LR6/7&IEEW,-7J;-U19:]]9SG8,!l
M<T'6UJIB3M/HJUF,C[%ZSLB-V4QI9CUF>P^4R*[3XCHV1[69&TK:@Y"Z:+FWk
M.O_*&D"</7%V)KW75PIC3AQ]@A$P%?L)$MI?^^?#;(P3<WHNP+U3:8>*">Q!j
M;W33)L/(&)PA[?T,M$DVT6Z_W0]J=^T1++29]C'6GD<[!B3M8+RT2[;3;K]1i
M1VR79ZI=MMTVUD;;"&QK_^*Q;7JOMF)N#BY(;H]LLFU\[7:.-MIY6VUS[;EMh
M.0UW>HX!-R Y8U^^38&'MM]FO1.WXB(P$) #UG9_GMJ-^VMS31D@ V" X+Z[g
MQEF_\6RH37 5<>'XV?L2%4/BB.VS>7:*#@@KNFVTZ!>]E]*')X;8_WDL"\^-f
M=[,;B-[1>IQ$$[IB4:HZ/1K^/%FZ.JV%; GA0O+'T<(VYF0KMN4/- .,P"$5e
MGH:A13.?C="(*F]KT-[Q8P2XWH+]/,-WS>L9UF<7Y^S=6SC*-RJ<Q[%:68ICd
M3 ,ZG 0 .1G-,4F?VOI*I^_@5@IC+S@-XVM$33H.-@OZT_@[?^-),<UKR?1@c
M^+4A91\#:JGF!CZPHIF6 GDIO^E?3#J<;:,>-G"@'7=D.ZBG*;8[1MB_&E/?b
M-#BPPE8X"R_42"-=*Y\8OJ\+.&_)R)!ZWDKJCTRIN^5(QM0F65-'[)7LJ1W&a
M2RZ0H=H%4!R$(+OFY(1Z,7.*E:7JF;:JOS7[2,@(X255<04&I&P$!51&3PQIz
MI"NOYERX[#<[3:92V"0!?D:$_AFLND4^*2O%VDZ"+@[$% (]YP&59,&X9'[Hy
MI%2;:"4MHTVK2*++D$9E_$=)Y[<DG]Q(SN;D!D=U"M'M? XF63'8U4 ;)O Lx
M5BF:@RO!]7< H^%7>OO<Y&EMBUFI#C>YSK5'1A4LD,+QG2KOG-.Z6D]L!WZ6w
M%_7),)0V 0YT\ 2^RD$N'H!2UMIC$]8$OJW#*S"7RN!5.\=EXU;#>\G2M=?:v
MTS"@X5=^3<@>\*[EU^&H7',\*B.T>0K>"+P\>JRI21F<XP=+?LL8>UH2RT-*u
M=,K @4#?MAF>#QLQ<#^WM_"VHMU\0#D0894DT \S,AIDP+Q-Y^HI7O/ 99:=t
M*^";#W.6QK&SN?YTWO1[RD[L*06M>T9\I%(FP 0 $FQR,LR:S.@J7(+LSAI^s
MKGK\^2H5G@&=9>^-\7A9"/E)3^@7/0[,FFZT!BBQ\,P??!<I$.YK";4-P_/<r
M@"C] ]O-6))W[P+[UIPJ6F*U:&&=<7HZ#;C*V2'OZKE_CH'?. )3Z#03HS.6q
MT^2#W/#G'IGJVY"^=%8:T??E&,CJEIFK8^"V3C.'3)2.%JU<<[KOW]$S9(+]p
M'MQ]VV0/:)3M?1VSQ;SB8:-J5M"@'HG7.BL5W^-C(R!G\SUTJU2\MM;B.WY/o
M]NF,3!E+J]GLQ<C:,.X?7KB_=M96QB$$0"%VYI.;%CN(+AQ!=TA[8N!+N:NVn
MY=:^-(#U;CC-O95P@.<.F=O9;N=V!GVZYW7IK=QF._4.]]T.SGS[X@;LR3T,m
M+'<6$+@G=W&>W?G7"!N]U_S: _!5)SJR&XG.]KR.@*,Z)G[?O'LZ_>[1/HQOl
M^]L^[3LZM1_V*K9 77L\C\UR_7D2[_#0\HXW]?A>4_U9XW5I?B>$NDI^Z&"4k
MKH_2PH'/JY1:1_ Y6,&[:R9AX*L4YK76$CX6=_;XT6INJ2?^[NU\J+. HNZZj
MM^:(WO !]\,+3_/.HM%[S.S=:$Y& V^ZF7EEYWX/1&'#OYLZY1W@CREV[Y]Fi
M5$:+/,8NXDE\=Q_RL9M$1V)/#.$--NZ6ZBY^TL5H6D%TAC2V$=;1HJRWMJ :h
MXJ.PNRSJ&)C+4K$O6SVN6%G1<[\X:K-M>EVYP?PM+BOJK-7$J=X1RF]1^Z!.g
MO7E=VG8C?]^+/ D&WFW^SW?Y0"^&R;6?+_1"&CY@>0F!Y/L\>9CH.6/Q8C[/f
M.G_%-UZQ,&]B![QX@A>#KG>>3]\"YGO?ZX^>+N. IN?-2!JNW]'\KCF)<UW'e
MLQR^<$C.TR1@"#P^?VKT')<R^ H_ CX0#/#>I_3NGF^KNTOGMV>7]3U;R-L d
M6V_@";VU)/)>GJ@+>HS=[/?\M._-U5YH\WEL'S^<?89?\_C<VT-[<9^;L_V7c
MO_;S.MQ;>T1/[;O]NG_VY=[=:WMT+[75_;QG]]S^T,/[=J_OO_U9-_?2'M^Gb
M>X _X@5]JZGUX%W)TVYEO]3%@"C& Z08<=9X]K&\'<IS"7:1! := :(1-E! a
MR&L"0D#-K_19W#J5_<2&\]19%<]Y@1@KE[<>$_G ?9H';WVN.E$\D&^F5^IJz
M3-74$4T9QF:4'N$4FUJ,M4H:3P+0?X)QE28H!Z#_$]*I4" *1D&HN[BF@//.y
M0HBT"O5T*T@/?,I.D\* 40I2(2K !F+]0-J<50.U(\%K(7G(&H-9,[/JHQEx
MJU*!6=0='"$@*B$(!0?9<9TU-OC[ONF'$&5 B%4-VP@+1[?Y-N'F$\*3P,\(w
ML6 *V %P?Z@&(JI*&2P#9J "&62KSO$_XK-R3 <! 1NK5E68WE&+*,(#:UD5v
M=&2=C&\"/(P52)U4\"7PFXV5FE#3_MI_%%+U[4>*S/]1YSX'@GH?BYGA_1,2u
M0,K\P@%$%*%Y /Y\-?M9ZG8L_&3@\$L!<"-N(L>ND;O2G_I_0J-7(QC_\7#\t
MD'_WM]2*,/D/0^6_JIC_X6C^"]C]?];G#_WO!?J4?J$B-%"_ 5']KW](.<;7s
MGZID_^"GK3<A)TPXAGI0<4)I\*CNU;VZ5_=J'QU._% !"2 !)( $D 830 )(r
M #0B?GQ4^*$"W*M[=:_NU3[2_@()!:J $& "22#WF*9M@0) CM,@+9&CMT6.q
M%?8%VG'C/RK'!V&V#9#C-$C+#D@ ":"FDHTBX 2(0.3XA$.@""0!*U $(H=Sp
M$0)/@ H@@<&/,'4W6-D!"2 !U-2=0A!21F8C5Z>:+-#^2-$B*,25_@+M> <Do
M@ 104Q<XT*%%;FA_B2ZBXES:<="Q^P2!]D>*;Z8"V@ 6W $)( '4U)%.]E*Bn
M':?]D6(/)-0)QU =!6 H#1[5O;I7]^I>[:/#B1\J( $D@ 20 -)@ D@ "8!&m
MQ(^/"C]4@'MUK^[5O=I'VE\@H4 5$ ),( GD'M.T+5 R'$:I"5R]+;((0?@l
M0.1885^@'3?^HW)\$&;; #E.@[3L@ 20 &HJV2@"3H (1(Y/. 2*0!*P D4@k
M<C@7(? $J 2&/P(4W>#E1V0 !) 3=TI!"%E9#9R=:K) NTOD"L[; RR#B:"j
MGH,<@ ,[( '4U&]).E JQ28T":6-.Y?>-O@'0XN@$%?Z"[3C'9 $D!-7>! i
MAQ:YH?TENHB*<VG'0<?N$P3:'RF^F0IH UAP!R2 !%!31SK92XEVG/9'BCU@h
M]HFC<K@!S"'JL'V< #\^JED#8/&#]HM_3#9[T:8WZ6 BZ#G( 3@0_AE+BU@Fg
MX9_+Q_V/.@2J.JKB3>=$X- 05H9HVM. :OY9(7[( ="Q&*Z_5^EMCS^#3"FSf
M<J6_0#N&"0>AC;P1Q"!'0 ?X /4\DI_@79L$A9#&_D"4$ */($A<*%".H6Xe
MTE^@';./Q1 $_.)+>2E[(#_( 3B0WN" U-P"GY *?(%/> 2DTV(H E] "(1"d
MS" %AD#X+Q,B>=.$_PEY Q@%#G"HN/\FM,>;D!-R -=<< ,&.G#YN-_[-TCQc
M:$\"??F\ <%/!.@?I6O^&61*H0"0XS1RC4B? D7 "1"!E[('EF,"Z!V+ ?I_b
M%2X2.5;8%VC'C?^H//Z::LR<1N>< D7 "1 !5PH"A, 3H )(8/"7B2F% D".a
MT\@U'WT*% $G0 1 !_@ X,H!"R&)[ $7HH<@ /I#0Y(S2WP":G %_B$1T Zz
M+08W$/[+Q)1" ;TC!"R&)[ $7HI(WC0[H*:2C2+@!(@ X<-"@Y^Q]('(/QBFy
M% H .4XCUXCT3S@$BD 2L +C!@3L@>68 'K'8G@U=>6K<)'(L<*^0#MN_$?Ex
M\<^:K0IRG$;G_(1#H @D 2LP"IV+$'@"5 )#/XR(0?@0'J# U)S"WQ"*O %w
M/N$1D$Z+P0V$?\;2!TI#'TBH.<"0+CA' 1@B_V"0^QND>+0G@;Y\WH#@)P+Tv
MC](U_PPRI5 R'$:N4:D3X$BX 2(P$O9 \LQ ?2.Q0#]OPH7B1QR Y$CA7Vu
M!=IQXS\JC[^F&C.GT3FG0!%P D3 E8( (? $J 2&/QE8DJA )#C-'+-1Y\"t
M1< )$ $0P ?XP" * 8OA"2R!ER('X$!Z@P-2<PM\0BKP!3[A$9!.B\$-A/\Rs
M,:500.\( 8OA"2R!ER*2-\T.J*EDHP@X 2) ^+#0X&<L?2#R#X8IA0) CM/(r
M-2+]$PZ!(I $K,"X 0%[8#DF@-ZQ&%Y-7?DJ7"1R5 XX$#E6V!=HQXW_J#S^q
MP;!508[3Z)R?< @4@21@!4:A<Q$"3X *(('!7R;D !Q(;W! :FZ!3T@%OL Gp
M/ +2:3&X@?#/6/I :>@#9I\X*H<%QQQ^@E^ #H/!H[I7]^I>W:M]=#CQ0P4Do
M@ 20 !( ]$\ "2 !T(CX\5'AAPIPK^[5O;I7^TC["R04J )"@ DD 3O3(A ?n
MJS'\O2URM./&?U2.#\+4W6!E!R2 !%!3=PI!2!F]!)%MJ[J/^GV9"Z']D:)%m
MN/ =D 20$TE':V'AJ2,;X8WALE;H0,NA/9'BF^F MH %MP!"2 !U-213O92l
MHAV/*7]G\ ^&/9!0%]P-: [7$/=K517@7MVK>W6O]M'AQ \5D 20 )( - _k
M 22 !$ CXL='A1\JP+VZ5_?J7NTC[2^04* *" $FD 3L3(M ?*S&\/>VR'$%j
MCTKD:,>-_Z@<'X2IN\'*#D@ ":"F[A2"D#)Z"2+;5G4?]?LR%T+["^3*#AN#i
MK(.)H.=P!8_*#D@ -?5;D@Z42K$)34)IX\ZEMPW^P= B7/@.2 )H*:2CM9#h
M0U+&-\,;P^2MT $70OLCQ3=3 6T "^Z !) :NI()WLIT8['E+\S^ ?#'C#[g
MQ%$Y_ 3F\.0.*DZ 'Q\57%DS/S(YE)@K15C@RIJ!)^?BLD2.#H\</?5CG(#>f
MEE3@!^T7_]MQ98>-0=;!1-!SN()')7*0,'R'!2.'"N"86##\,Q:@X=L\^%@3e
M SL@ 22 FEK\:8N%>3P6:)V'#8@RUG;C%_#@@Y^Q W?AES'6H"(''8@B>R d
M!%!3Q]IN).@>.EF)KPLQ$O=^W4\?M/_A W?AESE4='8 0F@ILJCHI$F8"7Mc
MQ%E0[PSH)H6=K&A_[> +,8 Y/+FE@/OIR4<%5];,CTP.)>9*$1:XLF;@R;FXb
M+)&CPR-'3_T8)Z"W)17X0?O%_W9<V6%CD'4P$?0<VC$6C!PJ@&-BP?#/6("&a
M;_/@8TT,[( $D !J:O&G+1;F\5B@=1XV(,I8VXU?P(,/?L8"-'P;<AUK 2)Rz
MV($DL@,20$T=:[N1H'OH9"6^+L1(W/MU/WW0_H<#-'P;<I5'16,')(":*H^*y
M1IJ E;039T&],Z";%':RHOTWH3W>!+NPU:'"[X,.<?^C5@%H)X(>!P8*(0XMx
M2=0'R0S\W0Q!J(7UI@D$QL$P!*IZQ6,JS3^#3*FOHDQ\P&)@ A?U"U2!*5 $w
MI (".EP/C*&@,5@H;X %) "3V (?($V @)"N@MG'XNA"32!+P %I, 3& )?v
MH(VD "^8 $3RID$!1> +"(%0^ 6(0 FD H\_*Q@^L((%.^?U]RJ][?'7U)%.u
M]H(.K^Y.6>P\D+E> D!H_\-IQUBP<UY_PH+O'G]-'>EDKX$K:]Z!G#@%F>LEt
M (3V/YPII:M,V%%);W"@YUJ/DR'2H0!F8 )/@ I\ 2/P"<>-$=\T** (? $As
M$ J_ !$H@53@\==4:K5+VO'@Y_(3\LFY7JA %7#_36B/-\$NY !#6KI#$'08r
M#![5O;I7]^I>[:/#B1\J( $D@ 20 %Y-74D "2 !T(CX\5'AAPIPK^[5O;I7q
M^TC["R04L Q68#*,PA:!^'3F&/@J7"1RK+#&?U2.#\+4W6!E!R2 !%!315 Wp
MZ26(;%L1!&[YS6A_I&@1%.)*[X $D !JZDZ)(*#3CK_R;W5E*@8*<"Y!P"^^o
M%-H?*;Z9"F@#6' ')( $4%-'.ME+B78\IOR=P3\8]D!"=:? LG2/3\!0&CRJn
M>W6O[M6]VD>'$S]40 )( D@ ;R:NI( $D "H!'QXZ/"#Q7@7MVK>W6O]I'Vm
M%T@H8!FLP&08A2T"\>G,,?!5N$CDN()')7*LL,9_5(X/PM3=8&4')( $4%-%l
M4#?I)8AL6Q$$;OG-:'^!7-EA8Y!U,!'T'*[@4=D!":"F?DO2@5(I-J%)*&W<k
MN?2VP3\86@2%N-([( $D@)JZ4R((Z+3CK_Q;79F*@0*<2Q#PBR^%]D>*;Z8"j
MV@ 6W $)( '4U)%.]E*B'8\I?V?P#X8]8/:)HW(HW7)8!C@'Z! _/NH0V!83i
MBJAPJ\ /.1)"$X@<]:86+A\.UM*4%.T7_]MQ98>-0=;!1-!SN()')7*HL%;Sh
M);!@Y% !2#%G'I7POQU;!/"_:.%?1EA7L((%.^?U]RJ][?'7U)%.]DHX6$%.g
MG,*;=#!#1OO%/V.94BC@JW 1+)C>X$#/M1XG0Z1/@2+@!(A $G "1^"E?'0'f
MO0>"S93Z*LI$)H2@D-[^UX"6GP-;8-" E2[P4O9 0BW=<E@&/#W<3T\^ZA#8e
M%A.*J'"KP \Y$D(3B!SUIA8N'P[6TI04[1?_VW%EAXU!UL%$T'-X-E\""T8.d
M%8 4<^91"?_;L44 _XL6_KD\8YE2*."K<!$LF-[@0,^U'B=#I$^!(N $B$ 2c
M< )'X*5\= >]!X+-E/HJRD0FA*"0WO[7@):? UM@T("5+O!2]H#9)X[*H?O)b
M8;1 %:!#F0 0.:8%+(82UC'A0'J# SZHMVP!(E">"D0;:"FW+/R7B1(&1#NGa
MR[3C)@X%:!'.]QQ20 D#HK6MK&B?0^C!4P" R#'C= @P@230&3 #$AB!5" %z
M//X,T@=H)0DS830DA:TP'Q3^MV,) Z+IK0VX%5[],2K%E0[_,J(/+,>=7SNVy
M0O<SI&AA=.#^4P$@<DP+6 PEK&/"@?0&!WQ0;]D"1* \%8@VT%)N6?@O$R4,x
MB'9.EVG'31P*T"*<[SFD@!(&1&M;6=$^A]"#IP D6/&Z1!@ DF@,V &)# "w
MJ4 *>/P9I \LQ\$:6HN 86RJ<>R[DMEH85:NM ]ZER:L#8QX(^;!7TH\FQDNv
M\Y^E@,>_'*U4W3#D@X&$F3 :DL)6F \*_S)BYVO8$@9$TUL;<"N\^F-4BBL=u
M_F5$'UB..[_G:T:'<7.F3M OFVH58Q1][)$=<$XX3?HC RY@C^R <\ZITP<+t
M41_#,06GT$_/@I$M^[5C*]R<J</U8V<D(I$ZH'1+A:]?]F]">[P)=@$'<,T8s
MX&"APX2, 3B :[K3\0D8\H,:: T)8&PF@ 20 /HF)OK/TVDNMYW(7A'H?WX0r
MF<&!)7O-:ID $H",: -8,#]0S@3@-KUFM4P "4!L7NDOT(Z%:@(0F<&AI6@5q
M+/AZJV4"2 R8OLT6[""G#@%Q28T"<6YY ?*F0 D DOA%*^W6B: !%!QP4I^p
MH)P) -=[S6J9 !* C)@"1< )$($7\ F'0!%( E:@"+P (? $J 2R ]JH#4Do
M +=BFK9% D@ 8M,T;0L4 '*<!NH"*R?G2G^!=JQ6'/]8S8S3%'OHME)!!]-Dn
MV52K&*/H8P_=5BKH(&T;IW+U)N0$XY6[!&'3QZ=1'\,Q!:?03\_"E2W[M6,Km
M&*_<U7&X?NR,1"12*MR D<=AR_Y-:(\WP2[4 .8@8$8'=)B0_(TY")BE@/L?l
M3AQ(;W#@"[B!W3H'5L *"/^#H0]DU:0ZI;2R1W6O[M6]NE?[Z'#BAPI( D@k
M 20 1@ME$T "2 T(GY\5/BA MRK>W6O[M4^TOZ;T!YO0DZ0 3& .9#N$ 0=j
M)J0,<*<L@'3_/MS_</I :>@#N=]Y78VD^O9[OF9T&(!PX 3]LJE6,4;1KSI.i
M2A B_7$J5V]"3@"$ ^><.GVP$/4Q'%-P"OWT+'S]LE\[M@(@'#A</W9&(A*Ih
M _J<5 A![E0;TM:;D!/ZJ2'MIVP!.I2)!. >H( 4> )#0(>B@!:1 C0EZ"BWg
M6L53MI$W@ACD2/@O$PG /4R!)' $OL #A *=4P[ @?0&!UK*E;H@X;],) #Qf
MV%*TRAS0"N%?622 *>4R5\VSR?Z)OPA$CB;0!+X %) "3V (?($V$CE,0!MXe
M*2%@,3R!)?!!3T4"2 !E)(*@ !'02!13>,!8":$)B(#(X02>P!=P E6@"3S^d
M_) Y <2&]PH*5<*=RR&&# #JBIE(,WC9"40?564Q-H LB)G."3P5\F$H <c
M@ /I#0[T7.MQ,DS 8O #4* (. $BD 2<P!$(_Q.RGQK2?LH6</^I2 #N 0I(b
M@2<P!'0H"F@1*4!3@HYRJU4\91MY(XA!CH3_,I$ W,,42 )'X L\0"C0.>4 a
M'$AO<*"E7*D+$O[+1 (0CRU%J\P!K1#^E44"F%(N<]4\F^R?^(N ]=<J@R6+z
M>)OIG_C'3>1H DW@"T !*? $AL 7:".1PP2T@9<2 A;#$U@"'_14)( $4$8By
M" H0 8U$,84'C)40FH (B!Q.X E\ 2=0!9K X\\/"4 .P('T!@=:RI7"+8L!x
M!NR FDHY>-,(21E4;S4U@2: G,@)/AG\92(!R $XD-[@0,^U'B?#!"P&/P %w
MBH 3( ))P D<@?!/6V]"3K !,N NV T#QTFI V0 7?!!L@ AXK[(T4?B/R#v
MU?Q;U<O_5*>45O:H[M6]NE?W:A\=3OQ0 0D@ 22 ! !>$T "2 T(GY\5/BAu
M MRK>W6O[M4^TOZ;T!YO0DYH1(Q"OAU4G)!0Y1LFDF\#!O<_'.0R9%" 5N@=t
M/F Q%-_\H )0@!;A?,\A!9 !:VD84A@*T"*<[SFD ..S E9 ^!\,?>"IZGXNs
J/Q@\JGMUK^[5O=I'AQ,_5$ "2 )( '$E(<@0L5C D@ "8!&Q(^/.E8!r
q
end
-------------------------------------end-------------------------------------