[comp.os.minix] Faster harddisk

A430@HASARA11.BITNET (Dept. of Mol. Biology, Section of Mol. Cytology) (06/08/91)

A few months ago someone argued that it would be possible to increase
harddisk throughput considerably by reading/writing disk blocks in
one go.  I implemented something like that for at_wini.c with very
good results.  Rather than issueing a request to the controller for
every separate disk block my at_wini.c now can read/write up to 256
consecutive sectors with only one controller command.  It uses this
possibility when handling i/o vectors.
I did some timing experiments with it, the results of which you'll
see below.  The first column is the number of consecutive sectors per
command, the second column is the disk throughput for reading and the
third column is the disk throughput for writing.
 
sectors/    read      write
 command   Kb/sec    Kb/sec
   1         108        28
   2         175        54
   4         202       101
   8         236       162
  16         293       233
  32         376       259
  64         382       265
 128         396       268
 256         406       269
 
The experiment was to read/write a 1280 Kb ramdisk straight into/from
memory without fs intervention.  The timings were performed on a 16
Mhz 386sx with a 40 Mb MiniScribe 8051A IDE (MFM type) drive under
16-bit MINIX 1.5.10.
As you'll have seen it makes quite some difference to read 16 disk
blocks in one controller command or in 16 commands of one block each.
The same goes for writing.  I observed that writes of more than 32
consecutive blocks do occur with NR_BUFS equal to 54.
Below follows a compressed and uuencoded context diff for my current
at_wini.c.
 
Bert Gijsbers
 
table
 !"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 at_wini.cdif.Z
M'YV-*@*""$/GRYTT;M*X& ,CP90Z;D 0*3,&A(P9(&#$T 'C!D<9(&+DR %#z
M08N3( XF7)B 2ITR()1 ! &"AD48.FC8T%'#IL@<,10$'$JTJ JA F/88"$Cy
M!@BB)E$J96H#Q,F3"F@^S4I3A5:58]"4F4.GC)PO=,+,6:,C09LP"$&4<4-'x
M3IZ48B/.R4.V3!L0:>: $"/G39TS:.B J .'Z]8574$,01/&S9FQ@^\*,:OXw
M2!HU<\28G<,"1! X<M*P"3DR*.2G5N6R"2/FC1R",,>\H5N8#1NS(.24.1.Xv
MK!P09,:.20V'3IK=<Q2\]MH"!&J$BLD2K".X,AFY<@H?%TZ\[W'==.?2Z6[&u
M.(@Y9I]S!R\^^O38PMN\L5/F.QG&;*0Q!FX@Z):<=)%5AQY\8]3A''^#L?'&t
M&&MT)UQP981!Q@MWI$9'61'%M5MNN]7UAF_ Z=;&6VZ0X9@*+W#%U0@(C<%&s
M'<F!(,(:9KE1!ALNH"$"4D85261-,;! 0PY/#155=3JQ@ -&5[4P8W)F( 33r
M%4DX\844101!A%9D9H2'# V]X)6*+'YGAFT@T"$6<JE!2,<;&&KX5(PTC8"Eq
MEB!PZ>454B1!11%ET@0#'C.DN>8;*WH'PIO'R0D3&77"=&=*'L($XY5E9.ECp
MH%U^,04410R1A!%9E+DH4 FH62"D;4X*IZ6S\G;B;Y7B&<888Y31G'5AW-:&o
M8)]"YF>H@ KZ91%3%$%%HF;"0$.L7@D'GV)L2DJI=;8IMN@,1E25+ @(RGI%n
MC6*9]UY:=,PG1AKKN; G@LN*NF6I0E0Q1:O4+HJ#HX-Q=U<9>%#D($)G##1Km
MI"W>J^R?HSH+II@ NXH'#00+I^%=WX;Q<*WGYMMLJ48$4043TR:Z*)K8<DHOl
M3&:$40<;=)36!G>*:5N&8B53O*^7T1:Q!+5FQD P?&6L <(;3@?-;,6E$B%%k
M%$A7BT/,9! DLG!QO$26Q""83+67J0Z1]:+6QLS@G<=UG=9[=0 [UAQFW,S&j
M7;J%1U%9WTFM+ZE>=DE$$5@$C <,,KC]LUS\V85<8$X+9\>)"^]&MME#?U&$i
M%%(\(87B&L5LEGC@RJ'8SF.+EF?@,4X\=>=34!$$%?XF:G$11^"0KE?]_CO0h
M& _"A) =800H-V9O6'K<O.L!IA>\\Y%7G%GV@I#RRM/"^7GH4B (VZ_%/WW<g
MQ42T"F?11R-$?AH0TA9N=R#LC',:+;P-9[<MNB"^X"?S$IBFP+TIT 0%S@I>f
M%OBP.XPQ$&4J8]D#B58$HTW0<Z 3W073E@($_2Y0[!J+>TX')^C-P5X /-L7e
MB!"$)JQM<3'@FM<&0@9,W:U^Q7*:&YIG*XC #E]"(]P7J""%)<  :6QKG*SJd
M\BNGZ<$L>-JA8NKRDH&T!SC"&5" "$.@%'8N"$*00LM<MKAKR8I_WY&?ZOJSc
MN2 Z*PEC>J'28@;'2:7A1]^18@\CYD4A"D%,:2,CQV(&D;YE,2UB^ T( MG'b
M!(I)"$PXFL8&%C,QZ"F1$W):<LI"/#:>ZX/K<D-81 @<,J0A#&?8(7P&0Z\3a
MMG%V('#"$S (/@.2L72R$D,>RB(]4P[(.9;!T+;H9K?^>))/Z**)K*!0K#"Tz
MX6>CL56EYF3*M= )?F5 (3(Y!X)H#8$*HC-5$K2 J#+5( 9*] H<T, 7 27Oy
M/7^#TQS2\$3I9:8LR(I=V8+H37!*P51(6-48R<0DK<A*0F< R1O,T,U4^5.<x
MY'SEX+SY!53]$Y)/&((D08 "C&H4HD5X03_#.85Q%B$%!O4*ZQ3C.CB\X0[ w
M6:A%[D43KLBJ".'9WQN2DT]0#>Y["4@ 35H00UE=QD>W60T)C_.I(CGU2#UAv
M00V8!)6K@  '.&"!TJI2)9\"R@G_/)P5DC $:"4*!4T( A966"@KF-4K8JWHu
MY]B:!+=VL$]!3.M:=T=$@"D-!H"-V5OP4+8XI>&9@ME47>ZR*</0 0X.BA.>t
M!$73?<(RKA:EJUNU@@*G0 :L%0V"& V5A"<X80HIB-D=T'"B2V4*!":0RZ_0s
M0"S51:2/>GT6QI[5UY  ]H@I?0]K;_8=+::!B[R44V D"JC<$C$(IS7"Y\HDr
M@QI4);B#A2?Q;",8.*2H1+WAU<@DU4?0^NN?4$!"%FR) M#VRP@&] I%,^O1q
M): 4!+(:P=,8NDZ^V(L[P-&0#>< GYY"YH-/,(,9MB48[. )C5OH@C:!",LAp
M-($(7_@F$X20A4.1B6#H,=%J=,E+%/0%-;A!:1\MC&$H@&D(3V@"%,A45*]To
M:&;6R2*DO.N&.1#D.1$90QX"U"+@O* FS!T5B[]P6H>*SI86B9D;ZM &T1Q'n
MIOJ3@X$M.[@ECW1T9)J!:M$@(-IF6;+O*I9BS%"8OZSXPAG. A.^P(0G7(%,m
M9O2*A.YP3YC(5,A$3@Y3]<G-)0]!SE\(Z!&0H)4:Q(S,B.GS?@LT9(0(.LDPl
M6;+5K)#H,,41!#;@VFNG7.4 1TPL>GHSAI\ !1@?KDPWB%F(P_M=B/VPILKTk
MBA6*=<I$CF7"-'%Q76^'*++(H6Z*44D:0+"'H,KJ+7'!%#;?=6SBE69$<N'-j
M7;P;M]<VU:E&.=(-;B ED%15*C*@@59GX)2NXAH$PK8"L:67["_XJ#]?\)EBi
M>J"](# A6CL0JJR&N2FGK'8NN1*Q>%<Z&)CHN[+QGC=V0."&LTB;/W,(N,"]h
MX@0J6WG2%\?,N2+NX8G?X0O:B5?&G6WC$+HKY=4;SO7.4R+U;)GDB#+Y%Y:Jg
M<5F!I5TCS.EX9.ZN$-N\LES!>?WNADJ8G!RQ*Q<LTR]3, 4#YUMQD91CD0[Nf
M< _EJNH&2I,"(J-@MW7>$)EG*MD8EF)5?0OU!6D7=H!?X-7!ZL<!\'=T&:<Ye
M:4=UC F.8P'UJ9J&0'NBNX)HQS1Q%7W!L2A(P0X4<'@C)'[Q]$XXK<_B,3+Dd
M(?*3IXGEI:!X*8SI<FDH[AO@D(<OP*&9QP(]5T9?^M._(?6S8KWK52=[T5_>c
M])D/^1?$8##96S4&,YB!5FG0[JN4'=YG]W#:T[#VXE+F>7>'>YT_6E)RSKWNb
M(!#"W<T '+UGIN\P^7N\X"#XA8VJ\.@ZO-+[.X?A[Q(SW#D+_;=@WBF@5[U3a
M,'<Q0W_NM!H =AP"IBT%=B^'1WF(1WJ8UWB0\G@.TGL/6'L@@'JJIWNO9RQSz
M8(&TAWD:F'NMAQIT (*_QWAT<4W\,7S%)WE$TG5D]W4YL!1*XQ3G5ATQ$"4Qy
M4 -4XGR^!X' IW-,U&/D)P<H*(0JF&P(\04(02])B($FUX3:<C/K(7N0$8)#x
MN((G1P9O\ 5V( =D< <G"(-9F(*9=W+\,09H<1M&:!86:%,JT -T6(=V>(=Xw
MF(=ZN(=\V(=[>!1:H0)!%50_1TIGD19K,8A"129>$8,R>"3H1&[(AQ%001,)v
M, <'00=A@0)/=S<NT 9HD0?>A5)[P!6+2!,#LDI$D 13L 2Z100Z8(IDDHHPu
ML8JM^ 6$8BA%T!;'P6]=^(5B2(8H8 *=2&"2EP"$D2%K,'F'=XH%HA8P,05#t
M<#N' B885EJ\" +\YH5@&(PG2(Q? '6E\8OY-H9T('F#X3'+*(M:@24V@S-Ms
MD0"]N$A=(F],H'')& ;K:(E]("/'=P,YH%4X4 -6 80@<(F9N(G%>$*@2 >Br
M6 :DR(ZH"(T2P8JNB#ZQ:(FS2)&VZ(JY>"C9Z(M?P(W>.(P+>8SYN([-N)&Kq
M)(W4^#E%<(U/$)(I,9)?&(;F:)+A>#<HJ8ZA=Y!DXHY6&(_S6 3UZ&_XZ).Fp
MV(\U)8-0\74[&) R< -'5(G,)H>242R2LW5?DR'? 2<WQDM@(S9KUF;H-SEKo
M 6Q:83TO1T7$DQ)/^!1WX ;,J!43)P>ED1QV("!E4!I+)1C\!@-U21,2$DQ9n
M5I<.F&L201$[I2ESLI!-5UO.!$U:-F&'1Q-ZR9?:6#^N5Q<MX -B159%,)B m
MP5 HD)G! @(\D!$@P =\@!QEL)>IZ0/\!EJA65:HY8#R^#-U( =N@ )&^00Pl
M>)FER5&@V!QR\)DP5@5.,"TAP&]QUWTGI9O"$2^^"9Q'R03#^141P6_$^(1;k
M@)IE(( Q<P)S>0+@@AV)A2?J(3G?HER"$7(,R)V?.9<C^5K;&)M\^0*8-5=6j
M4U>CZ39A "'R26H?]RG$F0:F.9?UZ0;W.6VT27$6EREST$'-6)V]^9O!N9TTi
MP: ^8)^K9R PP6_'Z9D^T) /&7"RTI&O:#X5>8L?B2@(:I>F6:+)Z0-0\ 0Eh
M106EY00@4 +AMWVN*)T@\)P98:$'B:'7:91.8(\<JEUPLYDV^IDYNJ,]*E).g
M]D_229H*RE$F%D]RL +1:5)8^DTD95(HY0,IX08-BG+T!)'4R9O7"0-/>F8Kf
MX(ML^J$.NF>DZ:'V"6B6!AS\=F9'QHEY:I^H1@;(LJ9M.E@,\J1^ZJ!GQF\<e
M=69 &JGA& 9X\*@@ !DQT*>'ZJ")NIE?NEW' :2&VJ:)NJB8ZJ@4@5(IP"&Ad
MFJF;2A&@VJ:Z 1'[QIG(J9Q/P)Q4<*MZ^@4)>$/\A@)[>18D-A8H-:4^("96c
M RU3(*SVB1H34G%2VIDWZF(9Q612@)C$*2M40&:"(2&K-Q"^\5+T4S.JP4:Kb
M9Q8_ICF;XCK"X5VX00:6^15DID@H\)>JR6^Y]3U/%I'-^)<KL (]YQ4UDA_Ja
M,2NZ^C2B!!/<!@+FRGY"9B.>$B/-V*7]*G2"H:8!FT%2D)O-N)O6J:&EM9VZz
M*2M&D 9:QBUB02%HQC3%V97#M%SWEASX.I\)P+$GE[/Y-A8_@U(GIV^RUX#-y
MN$QF02E_@2M%B#?8P[/S>')/>X2&NIT]:YJ]R&]/8%_IJ(PJJK ,-0=U$RP$x
MEC=LX)=X0"\4^P;G.J.)"0+]B+1K*:>_N;4@T+4@\ -!FE%#:E(@H /T*)P_w
MR93)5'=^F+B*N[B,>X> V!6*2+5N"+5RH(AETHB!V+B:N[F<VP,SJG1$.+E6v
M.Y=(RI;N86S(!I<)(9=T.8"WEQZ]<I;RB;IO.:.E2)ST9W_XM!ASH*QW1YJFu
M"QP3EP9<NH+S*)@.&+?B.B=H!!@-1F OL7=WX5B0!4P-<P-]MIYG.6N[DB)Dt
M!@?Y&K?YYX(,Q6^D%@9PD*K#:JUC4''C.*O%2F"E,:;D]*0<.[[$5[['FKO+s
M6J%T&J<G"YR@\Z00!@-=L)F82CQLL*RD"6$Q<,!XVJ:HP9AM  <-3"O>L04Rr
M ,%]RWUD^F4@=<&VM@4SP,&8>IAQ"V$T8,*S"JA%=ARQM2A&8 0BW"9;4 ,<q
MK+Y_6FDO# (^H*8X@%*QQ6&'4L,9; ,YC*GRR0.K20,H]9J8.JJON2A!@+S$p
M"6$WD,2S&J*-J8W\QJ+HL[="%,:"ZRPQJK():IJ.!WDH9:1=BZ0FFZ$"+ 5Ho
M'%Q"("$4,HYP8;W2A)9.@QVGPQATD*\TX;-;# <BZL4O>I&>1K '^2THD 8]n
M()B P0/T&U(@O*6 <;".'%195 ;8A )(L'BE5P2E 8Y0A[59RU$J$;1DBS,?m
MV,9<Z[6W>Y"$:&]E@&\/QV]$5 6CJ9N>;+=SK,IS:\LNI3I!JR$(5"I@<@1)l
MPKN^:P:E@0+35WTHE<EH6I=!A;]WUZG\ALWDI,W%+(^;V;6DV0>RL4JUG "0k
M+,F4G 8\D%M\)06M8@*QA0)R8 )!K,COS,G /(]-N*S++$"\$\3:S+'XK,\Hj
M18='>I4E^[.Y3 :N_#B\+ 6^K,UQO*0#+,[/%S/C:A9.IQHC!A.506^!/"S?i
MDB%A :6VH;;!,BRXPK0$T0),1"&R^"BV!K%[8]+A(<B"L1O!DCU&8!MO\2$,h
M@T-WX3I>."IJP#,4FP8\<M,RP\=\MRU\C,4<["RCEU94D#T??2$X^V"_4=)Wg
M$ 9Y(-6;XH5]MUQY\#/^HY$SNLHH@-6*K-6BP]5PW+.;^:FZ^2/P <S+!IU"f
M"E+XU5!FJJ4FI<UJO<X)<,P%$99E,-#/XLREP<W2S%'5["-D<,U9"E*J;-G>e
M;-@/M:7_3!&@S!^B3,JB9<JP=9(8[;-4.!96&,M%.LN=?,M N\L@T,N_7+(9d
MK:$;#<SCC,ZKU:X<=1++9J1TJLWS:,YQ6\QQR[%X^SUP#-&Z++2[RMO *\QRc
M (,T8;ARV+GB/=Y_^"0WD20TD-X%B14T48J*.01:.;V1U95Z I:=@B%A(T*3b
M8I:X4DUKH)8T$;S'0;M,N+HJ,)?%VS.E0;QQ6Y@-@\*XRT[UU[_6(>'@&EP3a
MD<BX IE4UX&3:1RN-*.%;)K4W&/4I]G-JJV?>9N($J$5]Z 8!QO]&59M=5(8z
M$L ;RJ4DCATIWJLXJJ.D95JPQ5&7'!LQD (HI:0HVZ3^9K\UJN(_;J5"OIITy
M>N-RS*1.JN/&">7+V9RUW<%_6[]6OJ396<<=VIVM#9[.RN)S%[=*C)^\:J(Lx
M7M@SKEF]39_#RL4Y0J)0CJ+>1:T.RK[8RN<^SJU#X*V 3JPUI("DFJRZRZQQw
M?J/0.D#3FKS$.:F13J5 SJ-"_L.B35(!903!&MVF>69J>L)O&AOS-5?UE>3"v
MO-R6KA7TMYGGF[Z8*NAXR:C#&K^DP5&.WK\H=<E.SE&SSM PH)UC#MQT3)KMu
MO)GOK)J&+5<7):1TEP8'6QJS?J>?CMAB/K[[EP8<3'\7'N (W(:50;F&>LK>t
M+N%;8,"EL>K3[K>ED65FGNPH@,^*#.]?T.IB7.2"F^,.6,SQA[CD7? %?Q27s
M*8B#6)/<B)-D:+F,F)AS:/ 4W[F?&WTYQX4VV8TY::-("G61J0(VJG&N"\BQr
MVWDN"MDU"?)49[L.*"M(X!V*)#)K&*4RE08O@"=C*4*NM-NB^UT]IC#E@TD4q
MTF 1,2(2KWG=2W.VYC\)K[%:D7("0FVI^QP[3Q8H!QC[01'\=U%5 %]M?NENp
MJ1A67P;YC?7(\AQV  >E(?*:ZH3[P?9/H7YP;P>D2>"JNVP'3I?1;;RE47%Fo
MW^M!;ZJ]SK[V)@>D^>OWUV#[X:9/1)H.CD-XX'IOD'%QR[^+7^%\L>"-3W^5n
MW;MU[WH6'NLT8?B#GNDX&CJ'#E:D"?AQ )BHW^6CGL9>FMG]@5*N_[&QY/7Pm
MA5*OEQ!C@ (B$$JCY"[STC!J3Q$B\/=@4Z%<VOCS5$_FV_RP$?UEL% F-O9:l
M?_4%X?S1W?D2OIE4AKXH8/C(61I$,,V*CT\HE?QCP/EVX/@029KCJ_:BSQ>Tk
M/O[I:_JYCJPN^^@5"O5-.FD%_^3?L*-FH,_^%;O A.Q^GX 0?L0/Z  '2_(=j
MW-_RRS$3XO ]J=RE&U@/ CP+"E#"%4#/1^PD' !L?]#O3=4[A&;[-AOJFW,Ni
M;D)ADT55Y_Z37;%W (\XS:7-])T2PA98<T5@K)25L(?G[)-\(G1R+@B*)CH7h
M!*6=G4MT>FY$:;TUU.XDS',(6F=/,<06/\!J.)T3\#=?H+2TOBP#^ZR85A@Lg
ME _VZ3!)E>JJ@[[C=TQLVP$4@3+N)%_=8S_>R?UM@=Q'!&E".XM[FXGNJ3T>f
MJ <-6+4#A*L)#:H]"S8%X0 G<V@'J=A1'/U7_@H#&W)?ON[_ ;M&^)FN8/Y2e
M?YIP\06[P2:=L!;'6H 9 =D5)="AS?R:\3!-B[ 3?B$W0.&,E+ +#IL)RR&Ed
MOL8&5@E"XW&<T =<09<R3YR#YKAG14X'(3E<R&]TX3WBA;X0%L8]69@&Z060c
M@795KBAEIU;8"U\A1XF%PO +$4-KJ#G4%!HDAB@E)86M;/.5&$J64"1QS15"b
M0I8#;V /9;(0,*%K>37]UJ6(7H48"!=B00@];)*O@@K'&GQP0_<=$7L&S,@$a
M.!R&E8\<1H3JL BW %&Q@N(P(AK#B& +22&:FH?TT F\@=)0M8##!-M+AD$Pz
M^,,0!_4&T=0"0Q3!W+TA)#27YEU:0&9J[^^10566 ! B=W%V&.T2W<2", CYy
MS2(,BM+MR^DM>Q8,KR#W&W)=L$>!P93UM?011H-N)6NQ ;,$L.[XPAXD@^%Nx
M]/FV;/?-.AMI*UG$;5_!!!1PL'RBEAER*. -"BDCA^0N7% ),0CA)7 TNA4Sw
M@D"(< /(0WE(IF=B' KB0YR%%([?(#[=Q+$.(Q8D2U 1"GC!J2B<JJ)*.DAJv
M*":61)KH!FRBFJE[.A%,>;]FY!;+H#83A/MA,RW"3A42SIF;@XEL:#.FNS2#u
M$_=#:"1\]8X#KI[/$P(W'S0+?22P_)G 36C_K%^]4W(HX(W5)8'W\B9>Q7N.t
MC OA0:Y!E!ECX\^K7 LOXB4\Z,@=%=>,JHXR$=W5Q$9X&Q,BDL)[RH9UT9VLs
M 7[$TWS">V4O"V8]%7 4%1-R0C,X[PVT@)H')V;4Q"F-ZY$]*B8#%5,8BD!Lr
M$.6##,ZG6B:NKJ/#@ ^I@7D82.@P$"'$2LP>4L!N"9/99D_R8P8"4TZO*T"]q
M0K:"<A5=6'"E(==5(9P!^7;#@P-3I GS[2X5X.WJ0AU<D;O*N1&G&CF/3$!7p
MG -5\.Z!*=4X#<-A-=R(/DQ-9;)0-_L&7H=2BQRE-/JPAK;.3.2N0@%2<C4Yo
M%RD 7:: =*%C8DQ*"JXMV26_)',K=[)Q//+(TF EYQV8JF,Q(T.>K T)R^P)n
M?Y0#!;'9E<5#1U^H'6#X5\&AVH4VN2CO&J$_*UF.D19FOL!TT+06M+.2MPU'm
MYD)6"-B*Y!54E+NK&8I!P"8-UQXU?(JQ)2J:%LJ8#I42HHQ[!PNC64G5N!</l
MDI1L ?S&2FHS'AG:9*5NLE.QTC#0!==(G) CCO1N<NOYJ(GN2"SYT.-Z"I$Kk
M/!XAB!>(#M=3*);0$@]=O&%3<C1>FNR,O_'\41PRZ"9-U7G4?NEQ[P7(X.(>j
M9Y2,%#D\<CW*"@*D17A7@%ET=T/D0+W_2 ;'99G(+Y-&02H6!SFC(M]A8H^Ri
M(DN\+)8V:!P0@_0*5,!!B@P">67&EFC$D!H25S#,?"D:X\1U% [X2N*-R,R3h
M!O+2B/!+'JM;)D378Q:^@ L3-&R2APD:E ,C25]QPI(*D@<$)E<7P& =<5IJg
M4M ,T@1_Q2A=IJP8 KLA<B@&]T@;Y@#FX"5G)JV]EJ)Y--,/B)Q/- %7ZCK[f
MQ*<2D_)"F.2J;9VKY+%GUA5<^ U?B=O$JX@PKQR.L,@0@(.0(0<\L<Y\%BZ[e
M;MN":$VT,F07?V;0Y P#00P8S1N!-(?DICB99J$TC"I)(1QF0X)\FG&-#)+,d
MLP XI]:L6E6PH55I*@:AS1HGRS15@7!( BG%R6U,ILHT"]HL@7W.>42H"&;]c
MZ9R-,W0^3J^TF2QGZ92<M6H,J,XVA>GFVNB\G%'J4LTJ5S4&4(JGJIORA3>Qb
M'US!O5 $TVL3!1'"&!HJL&$Z3!$X8 BLA=&!!79_*B<&:Q%;8,FXF%018Z  a
M](Q@ZTO'5##K.<*63),Y; &(UBG(ZH SR:<-\S)9"GI&3]K9,IN1\H0SAV;.z
MU)DK\#VGIH-JG$..B-VY!' _,4S^3#1)8-&P,%PU.I/D57&?&4S32 %.@P0\y
M#0>C8D?D-:U!& <3XJ 3:TW^\PLD*KMHR-I4%%1D8*R1 ;,"^@58C:MYGINIx
M@1 !;A@-6=DA2V0,C46=L15Z/<E ]H0S+O0)'(ZL5BIB% V%"8Q-5@B!^H;(w
M&E-!3  G9ZD Q=(6P' FUL**!TE6/ $'4;VV5P]%,\03O"P]PZC&)A ;4XI>v
M"R].F3+PDTS1\@)I<,DW-)R!\!>-P[%!:7!"I9D9,.72A,44F1,RC0[0M-M@u
MT^#:>(D8NV&GF;P[&CV 6C81/42-(/"QMY#4+@6V:6IC(T!$-4,:EHY:5?L9t
M5ZV';H$L%D-1QEV['5Y-+( UP;!#"L18BPAE[:P9TK2&)^ 3"&AK@^RFM<02s
MFN>:Z)[[8A;I%=TV/;DV?03=:64XDK8Q-'.6+>O"(V1LC2U<)#,R(-F:V3.Cr
MD:!/6Y8XM8/BY& I1(JFZ6 %-O.U$^U=:21FNFF<R<,D:F-N:!?+H<$T1LTGq
M8*8N]MABH NJ0>D93^?U.D &G) ;8>")$E-YQLRD!3T3E&J*DB&WO";7 MK]p
MJ:8%38@)$:L1!4HEV(IU!A$6\K/;YM$.R_5S$$\4BKY-B:;;M-M65*-Z4;AAo
M5'8&)R+99FJ?N\VBC:9F&J96 $=U; :A4T!4RO84UB1F,W'6S)MFLZT(VQQ4n
M,HT\:-2B6D6B&DY7P#C=EJ*19LJQ<WH5TRE&E15!X'5PB/LF12=$@_ ;.RNNm
M-<8I:45!(L_,"!A-:BX;]CDB,!K.9)56E2_*BB3 4,*HKMBGF^1OT \*&"$Rl
M"6 @>X(A;XB2C7C4K!6WV1LL0#=5/U]QX[;2T+E9/\T-[#2>XK)H@R+)1+2Ek
M>:A2^L!=0J10$7%R"R\8-TZT<X3.EW,D1 "2' VF>+#\E994*[1D8-U(869%j
MUZ&2FX2EIF&:3HMY[HX0QJPLX"W71,OA2H>.@E-R$E]'!@PDII #L)=5H@F.i
MY='MU("4]ZJ@"_A3TW-9#3FV802 I1]LJ8$-K?[)U[I7"FIO88K"A_CL!="Sh
MR6RJ*=)RIRE3N*#UN@S7V76@"V8  KH<]W '# ,;( -NX 3T#.R6EUZ+>LT#g
M7, -B "LA1RI&Z]<2ZK100FTW7$$9, !/ Y&ZLC-P_M*!_+K\-NOP*&_$I< f
M.V"W18&=-DLEP2[8G_3;AME/^F[^""70@*FB)&P 5S%(T-5!2%<*2UV5C77%e
MKM23E\2PQ=%=7VP?<ZF,<KR" ()*T,YK;$FO+ZC:^3-+!%\Y"D"3L ^5PEI8d
M619+9HG &EFMZ34]52;+6^A9)^.P'I8+R($(:(A2@G\%L )6F#P.%% "& <>c
M8 %U5@;@@12@8L<1RJ$>O:Z[L=@&&]S(!'@[KC-((+ ;&, "9L!4&3N/RS%@b
MB/+@'H97&[UBHM2 (3#P9,"NZ__,KM4SA8G2![9I?6"GK5;BTX*)VA&VP4IMa
M&OBQ#HIW&C'LN<*F**8=84B,5/G84RNJO))@4(8@%(/.6A]*2OF-LS@5J6)5z
M9(&$U4V\RQA04'?!:#Z3P7@/YRGMFVMFM )QV3<6,[;H8XDLS<L?2BUAYF!=y
MYB<+9:/,])2R4^;:2!TKBVVO[ IM6UH6,Z9 +BM.Q5.\_(J7!CBH+8CC6=:-x
MI&*WS612+Q2Y#6[$"8N.N"@I V.<FM*P53+3FC#PA,,\K<D$M64!@F)/4NN+w
M**Z$0;443-7:3U'::CNN#ZRX]DG6ZB85=D$UK@_-M<?*QZ+<7JLA?FU(>&)Fv
M0@B800(J2HNM$$&VJH)5,-LIX&RA[7N %!++'OY;N+6QRB@H.J-NS+X,(BW*u
M1<'M%Q6W<:W%EEN#&RS0K6H#$^QV)QFC1OENC:IL@V5(->J2(L5D;[UAO@TPt
M=J,YL!$/1QBC2=8-N'.3X,I4%JMU"^U!,EPPMCI\U^,0R299M>,!+R[D9)SVs
M&I&J \\=89K6Y+[:-* "9N[%#;)LU"0<) @#<\=K$PNV>*"*31['2]>,;4&=r
M1DP@"8018C-Z#Q+'6F/:-JEJWF"&XX*;XSVWJ"W=$H%UV]K$KO=SO$75E<VVq
MM&O;KI+C%:FY;>!6M(LV>_ONLIN]_4CP!DLR@1R5(U< ;U:%!@ DJ0(#<,!Zp
MLQ+O)L 1G4J[@AB<X=$*Q/39K:;$2Z'HCCCM9"Q4PPC0_NECP9W%56 ,;.6*o
M4NWY8KHG_05/]A?DJ@B1NWGW+YPYG_XD?4K>+1" 8^WDM%7ZMWS"F2\C/WOFn
MR)7 !A31[,_^N7/C+Z)1-$B@Y4;@]PEG-DVG$1,7-/1FT&^HFIH8SN5$ /CCm
MTEQ%11==[@]=-:U&B,)0FF!ZB0:J"+K+MMX673,0;9&NO[6[4&]E>05OVT7#l
M+1YS&I*"9G6IMXN XFZ_I;O55JPZ70I4AM!HF%5=PA?MSMO;AF;UJRB1@.>Ak
M,L39.3"$[X)\*@%DH,\"!E5&:)]O,\*BCY<$8Q@37$%1L+-3P2#4I7I0K,5"j
M@^@0U0H]^%F@7M7+)8L81GV]V;8+1]TOC$S/KKQ-JB"Q#'_8,]QF!P2)Q1#&i
M!;FXEFD#A^5P&@"6M/?*^=T$ 'BG;]T*8-87QC8E1'LD9H -4#<<P]PXB?:&h
ME8H 'JAI)99#LAE(X47OJKZ](@CHZ(G-C4@2\P*ZVC-Y[T7P-$;:'<X 7' #g
M(=+:UBU**[R,UXV,L#NVH/:. VAEMRL>&!@++3#!EGL&PSC*HN 8H!=-@%ZEf
M 7HUPC(T4BC@':_@1:$TZBMC=)1#UAY+CW!,T"HL(3XLQ.JQ/:&CE:0.KAW6e
M"@*O0"!D@F 0%O*3JK[V93G&NF%)7*&E=$26@X@*3],\D!V[@L3KR!X9ZH&Nd
M$BE&C>=(CCP&LSD&"GNJJ_(I%>:GG<>?7IFJ2P?HSFU](H6A.-E2YX!8G@9(c
MU<;<)+? F.84.I@ $Y@KZ",+E-DD "T2P%]9&L/EOSZC+7(;DDO6G%'<)('Xb
MBRPPB 1&23@\8;E4_"HBXFG(<E#1QS%#"%2;,G "!,,9$!LJ$1I]I8A@!(C a
M$ #+;J14U([;X2\&$87U'71+_'+CXW"7?D:$M'R)N;'>$=BGE$T+$7D"3ADJz
MM^6I;%9^IYN#DBC@)%2GQ_SE%J()4*R1#,N6!<DVF'$':H&+8EEXO"9GL9:Cy
M\CU.Q+6Y+<,QDN=S:#(^70UZY,!"37LWFB?S,9(RNP$HXXDNE9.!J[!TCBB9x
M6!X%JW).E$\-\$'?ERNX-_#CBX$QG8P>P[AI,:^6?(S=0TE[5UT9R#1CA,,Uw
M7THT;I:+U*<-!&N,$+*Q5Z"KQ5CAE!+<(T4-R=^XA@B!:9VE S00$@LUF2&4v
M]%V(M*3G.HY'\L ]D@)7G!E//$??@AS@$7M'3["M+K6ANXM98!'JP3XO$H_Uu
M-)Q'WREI?%7<^JMBX3130TJDH]]A#F3EO6,V'5M_L,])N%>.WV[<,\K9$JB#t
M2O0)ZS%K&$R^A7^;QH),;>+>R*9[>2\JXTEU\.3 '-CG4%?SL;4=KEFB[@X"s
MPC(J761VFU-:D4%4C %"CVT%L2]/2AZ":4 KIF5HJYC-@OE,E^E2P4'@F"96r
MLVS67002_]Q)_,,,*6N^B6&HV#3=#>?A*OQ6NBF*FE8+['H7U)_=#H(AML3Fq
M+" WD^\P6;X#=)UR2E;VJ%7.D--J$80*5.J(EG<Q]6MSU&%:4M-ID<51%37Jp
M,(JJ.;)I69[H-J7H/7,6+,2%P&DO042,R)PN'$0 R6U%Y$NJ2^K>5:EW^!]So
M:BEJI%"K:LUK=WK-@MCGH2<D)9VULWC6SO)9!9M8?9N4!K1^=JD\*84KD4$1n
M158V##EN^4I@&5P)7G26SHZHZQP)CK$4F(]SW<5723%= =_L'%:#7=7/C%DPm
M-.=-L:0=1O.2)W,A1K-I^"-JC7')S,D,>>&B@&\8JW?J/KMG9AGTPN,IA@?Zl
M,9?-QQMC'W=L.M7)\*ZQ9KX&M_8^9!BKHV%Q1KZ^S_E=%\OIC!*N,[FI 3>@k
M^;"W? U^]C7;JLG^>CP[[(#=3]%,P189!WO )>PTXZD9=H(R7HYY,F^FW!*5j
MR^RR=9E:L1E]:T@-CB>L8,;2_L(4FB9.G:HYRJ3^U5]@>[ ,M!V5T3;[$-8Ei
MBZ&-Z?3AML_T,E2'STVT\BO1'+69U6P-8,49,QB[XRPK=H@;4,[%23C#GW;-h
MD64V=S2NM/CKT(!THR38#:25M (N\Z@ -*)JJ>^.9LPKR+%=6AK%44* 2(;8g
M_K@9:6*@.;0I#@]ISG$!]M*!0<UB3;;RC:G,UQ+58>\:+*GS#<@J-6 @96?/f
MO9@U-^<VLIE[XHAN&7%MH2Q]/;.I ;\*/SP]K?6I>-$CS?E:Z]EM?0&WMLI!e
MQ;;[4N/N7Z:['3+O[D>(%G)[A?16 Y3$#=#%9$=$2MH6R#'=Y!EX)B=RORR8d
MGV%DSV5W@)<$!DA[!:#)>LX2%G8/=W*_$6,)/:#82 )')/!P8RZ4_;VKUA!:c
ML*QE0(/!!D&1!+X # @M4J )? &W,@3Z(#RYWPV+WUAP")[!S0WAZ. ?' J(b
M%A%.PEGC Q/@68D-- C#Z9A(&@#_:0K&@"O=:"(I.B!C$0M-"T_DK^',ZS83a
M&K 1 F(-H 5Q*.'$P)="X73!=^KO;1$C3: 11P&\KK*]A?UG";45^@.%RDH4z
M?L*08 -20&E0"MH)AQ/P(YYTC46U52Q^9^SU)GDI:CD0[/E :[P'OEH#5N_Ly
M9@''%0<<."3P\'R6? Q_^ X/'(,/YPDNOE<X!M?@7H&#?X$8 ,)I>*HPX? !x
MBU=PS7C)7;@FY^0R/(2/\%1APXG@U<SA.YQ X(HF/L&%N!W_MT5\-Z*?)%YUw
MF/@/=^)0G$),\?L7&JXX_CY'K)&2\^_+Y\5W(QC_X6*<_)F_NG#&,V$:9W]Kv
M7"FX<38>QWWF -?EB'R(OT4\GG[TN+88SD;<]?QQ%!#(96X7 ):25E8<@<<Au
M,:G,,]&MBE>!BV>8,"\J7V4I?<W< [[C&U #F$ T)^,94%NF/VM^ K/Y-H\!t
MW9PZCP068 -$PO#^Y_>4F[*1X66_C_FU43!<7-+Z;QHR8""S75I!:Z@.KJ%2s
MZ@1@>"=?Y4. V8%7H*AD<XL-A!;NUZF6AI6N[4[Y2Z_AU4&3Q_ 9#M,[F2&Gr
MXT?X."QR_N9W&C@D]YN2/*XI\U$>&TLY;%A#1/ 2#8=COIDLN:_!Y!^R(G@Jq
M5YZT!GCRB.5>V8>7=/UMRS\<$8\81GR7HYDE'M>:.+]YX@%"F-\)8F[%0_DQp
MU^)379OI1@\8QA?#&*^$"9V:2P0TWM#OSAMOXX^]F\O5;W[(YT0B'^>U-(]7o
M&^O$QT>N'_= [-RQISD?J/<D0A/,+#?]G;O&\ M^YOD?A0FDYIZ#' JES\]2n
:/^\I9&*P?YZ!7M /.F)G0PJ=L0,[A_[&NSG&m
 l
end