[comp.lang.c] C DATABASE

jamesd@lakesys.UUCP (James Dicke) (12/03/88)

Since there were so many requests sent to me about B-TREE databases
wanted after I had made the request myself - I will post the only
one I received which was written for MS C 5.0 so it need a few 
changes to work under XENIX.  I have been making changes myself,
but I'm not too sure of them so this is the original source I
recieved.  If someone does make if work error free under XENIX
I would love to have another copy sent back to me!

  __________________________________________________________________________
 |  overlord@abyss.UUCP  |  {backbone,uunet}!marque!lakesys!abyss!overlord  |
%|-----------------------+--------------------------------------------------|
%| "God is omnipotent, omniscient, omnibenevolent- it says so right here on |
%| the label."  God is a trademark of AT&T Bell Labs.  ** Space for rent ** |
%|__________________________________________________________________________|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

----cut----here----
table
 !"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 bplus.shr.Z
M'YV01N2\:0.BSITV8^:0B1'"H)TP>$*@"2/GH1PR(=*T"9-QHXLD4X:X&/*Dz
M20@U;]"X80/B2ADR()R\L0-B!@P0,F#HF)%#1XP<('[BP*% 2IDQ9=+8>:D#y
MA)@\(-B$65-F3IXY+JI4&0(%!(HY&].PD>&B1@H%"=+ #!(D1HT8-V;LJ'E3x
M)LVA.'7R]%D#Q) I5+RZ)'/6*%*E3)U"3;C011NQ=US<23-GC(N7=>:J!<$Vw
M!HP9-G#,'<R";LR9(/#^U$&CIXR^">D4/9IT*9FF9@021!)$BI7>1%SP]@W<v
M11$B512#F /GS1LV+A)*IFP9\^B7I6V>OHLCZ T=-63LC.$7\.S#MIL^!3&Qu
M(D4R+MI;A&^])7;3=E-WCQ$#?,\8,H!0A'F&U9;8>AJ%\5%((Y7D50UEO: 5t
M5RU (9 :1]'Q@AQEL-%"#"[ \ (,,;0@ PXMX'##66FM%00,,G@6PW5D9%<7s
M:JKU1T-_,- @H'E$A$%'&4V1AA^.^^G(HX\#4J% 0 ,U91!""C'D$$02431?r
M1PJ")!)))J&D$DLH*)&2&R!(X0((3)1A1QINE'%6$U7-$<899;20Q&T@\# 4q
M?S;%8,..+K %HXQ )+C@ER7YH  5;S0E%556S7%2&&U4188"4]0A!H9CT-&4p
M44T- 0(105 1A!!!3%$$FTD((45O6;04A!-4'!>" DZ4<<<<9PA4!QQS-#7&o
M0'"X0(:088@1QAQ5L7!L&\E*Y<89T4F+K MSO%&''$AA=4<8;@RY:1)NM& 4n
M'&SDT0*D3?$00VM 3%K555EM!86C3\AQ!KEIZ"%D&F^XT91,=(#01AUCH*& m
M DB4P>$)<X 0QG+M^4I1&2 (T0(=''+,1AIBR$%1'FN"D$3"9+Q1E1LG)#S1l
M4E&],<8:<)[A5!T)TS$1'12#X,8;LK4'$QUO6$P&? ^/$ ((+X@!YPMS.#P"k
M"%2@01D(6U]<=8<L4=0P8BD;U<9,').;A\\Y.U6&&6]P" +;%8\<9VD^EX%Fj
M'6[ $<;-"ER=1L+KV?GFM5PG#"?2%H-@AEAINW%T'G"T+4+5CD,N0LJ0@H"Vi
M''?(,3C'9>!!&1TY!YXY&]'.33G'EZ.Q.L<MC+$Y""!DX2T(8Y!K,1O=.E[&h
M2W-K7?&SR]%![K(7<=TWSR"\&8;J?%=-46EQ*T<'Y99CSL/CK(M06ADN8)MRg
M$F84WS6X6M.\];3LEC%D:7EXJ_ID;+ $+<=Y._X<&V^8#.(R-0<[X<EB/4,#f
MZ22G@\ E( $B*(+D/)>^K^7/8NPCFPA4-X2"#:E<Q<*=&-A5!ZR,P2DDQ$K+e
M3CA"-I0P/D+#5%6B$[TAS8$.T5'=%4P&!S@0;SUB6DFB-N(Y- UF.Z;ASTYPd
MH ,9 $4H1(%"JI#0@ZC!20<O**$<K&BP+,YABPP3 PCF4KKFR"%A4J0"$A20c
MAO39,&$M2%\+7WC"%EQ,!"380PSZ( (0A* '(!!![?HXE[RA20&X.PH:DF8]b
M.11)+"P96L(^UX+0C0X$I3M=V\#',2Z(8(XF]*0".@2M43:,D>UI2A'P +*_a
MH0YQG@1E=#P) BZ@0 8T@ $.9L"[]KA28G/@PEF@!9/+O< +6'C!"_KH UF>z
MD <\.$$1G$"$+SS!"%]PY@D4D$P5>/.;X RG.,=)SG*:\YS>? $W7Z "W+GSy
MG?",ISSG2<]ZVA,$*E!G-^_9,2@PH0I3F)WSR)!)Q,%!(,'"% A:  (K )-@x
M: (1>>R9SW6VDY\8S:A&Y5G1?6[TG4$(9",U)K>#OB&A;>CC1]_947:N]*4Pw
MC6=++QK3FJYTIC'M(!SR(+HSH"%A*!A""H*2 Q4I)Z8XM:E2-9K4ER*!;T.2v
M@\4F&(0"VBP-0JI*39NZTAO H 9UN0((M  G,RRO0VPB%\=@RM6/=M ]^:-,u
M:?I5AC,4#'<YB(MV;JI/E\(4!6"=P5!O0(.^,/0&,<"!#9:*N[8R]K$R[2LZt
M)TO9RE)6G]SDY@C@- 87$K1/-R0#P>+C*"QLU@V=K<-GOS>&<D$'#:4];6I7s
M.UK8:I:SGN48#RK%A>WY$"NPO:=?"<JZ(:FO;G#B&-RD2H5OB2%IIL*G/F6;r
M6]!>A0LW%!)I;XO:ZNX69#G;KFEQJUK8R1(-&\1"9CVZD3$(9 ZE.98;L@O"q
MTBQ+>:[[;6,Q:UJ"/BY.N'-"%9C !"D4(;KO1,&'F'"6_KXMN;@S@H&+\ 4Ap
M,.$)0UB".Q4L@P9KUK\0%A"NOA $(D@!!7 0 PO>8 8S#-4K*)@F%:20!16Do
M  4H:!A%;(SC%*>@!3[0&WBK,M054-#%#1X!B $L8BI\80I)T$(14"PG>-Y0n
M#JQS0X_E!&2JY*'(00&!D0/4SCD$K PL1H&!N?*$*21YR6L50A6,0(0D2($*m
M64"!&EZ<8(2D <B]:U@9MJ"&+B@K#6?\\H<?S&0Y&X$WU&3"E/<,3Q3X&=!_l
M4R"A#3T1R;'NS8R.\YPMC.$EZ)G/&[ZT#P*MZ4([1@R@_J^HC4"2*N#JU/&Tk
M]!C^O.I,#]K5QX)JK$,\!"'@VIXHWC60FS.'34='# "\V;"93))CUS/9O&:Vj
MLX_58FC1P</JQ<)+_8J[5.4*5TEX@A- T(0D#$$*;;YF8 !:!"D$=+_<''<[i
MFY &][ZA6V9(F(ZO1;S^90HA.W5G1_4=%9*93 Y0$=8K.0:GXG',5!"Z";[%h
MO5*7P@]R<N"< OV7OP"VK;T"D6Z^.][.A=W0;04AIO^DRF]_ SQA&5<YQS_Jg
MTN59' 11J$._U^ 7WB$+Y"EC*7]=JN10*ZP,"(>*/0]^-IIUU**X(VAG-[:<f
M@7#L# !T%DLL@E5H:U7GW$P"%KY A $A6.%PV/4.TKYV1QNAWN\4 QVR68<6e
M2VSN6%![A>=\=RFPU,\@ *0)],YWO\L!\*3.\#Q5 &V;K>$+<  9Y"\L>8XRd
M9V/9C/8: +^X>K*Z#)@'6>)!  /2E\OTOOX"G :W^M9SL_3T9,[(]FYF/7 ,c
MD&H7PI.E.(0BN#YA])R6&+[0^[4"$@7!'WX0BO^"#@.>FW9XPV;\5IDPL$1Bb
M I$#"A97&@!>*P6 S_[VG]4[EG H#&20O1E08/XSQ+<]^"S-XM"/?>W#A/OMa
M!P*6-"3R-W[E4GX%8W^]1!'YYSS?=GRX X#>QSOOMW=ME&/X9V,0" (2R!)Oz
MX$-N4( Z)E4:V'_KUWTLT5G_AGH7N'_IYW\<R'X3."SWA7J5=S,HH'Z$\8(Gy
M&("SMW>GEX/^QW]8@'L=F#F2\P5!N&90T&9$:(0R&$F^HH2^)H1J080Z&(,Hx
M6#/P1X6"IF8'UH1NQH/_%X4@@"= 6(5,Z(1DJ(4!R"%#MA2A9WD&2 >EL89Cw
M>'NOYX83>%!N\@5"!G%U^(1[>(1QPDJ 6"Z"Z()ZB'Q'>"P[E8@@DP<QABLTv
MUH R=HDE6(2%:(;=%X+0M@:#N(%'*!4W)(F"J(.$Z(AF.("HEQO#@P)I$H9Mu
M5AJ1IV&;B(=\R!)H^ 6P6 96N(.-&(%F^%_Q=X.BF(FUH@+Z]WJ;F(5'6'4Ot
M$4!:=HL-2'X.B(4P&(UH,RPH8(W,Z(#-^( F6(9;""=S,(<X"(ZEH8S76"[:s
MV(,32%SJ*(KLF(VDZ(GL,CAUV(Z6N(S^.&/+&(_FZ(/S]06LLQ1LT(]-IHFKr
M2(SG.%\28X%X4(D"V8""UW8A@4\/N8M(&']I4)'N&(X9Z7;O2(Z<R(I;J'S)q
M%8I@R&93,(X$Z9$<PBY_@WJ!2(DC.9,'M3BA9X^<AXM$N%Y^Q4DJ\P)/,',=p
M4R'_%%!G0P9UP#H;5XX>"7YQHV?EUV"X4WIJ 'BX4W]1X94@L <KASO9A3HGo
M-(+XU ; L@4ST 6KMP<1) 7P9G@,-02WX@1/$!A/  73] )#<&&N @)&D 22n
M)CYE:5-S69<M@02&^2H&5F))X 1'0)B/B9@[IYCUQIA7X)B2UA)2D 14,)F5m
M69B'V0=B&8&B4R[S)P)<@"8@4 (5PU"&$3<PX01UT 9B(#&QR09D\)KBHS!Ml
M66A9F9J89#IT@ (Q0(2XTP=0TTY628+\195'^'X@.7_9=4:E(09]5QIN$#K?k
MMG)@F9UT()9J27E])Y:E]YUG))9DF9E@"7[&"7ZK1YX+%17[(XIQQVLAR4FEj
M09ZEX2I%L 1/5@14P)SNU$9>09\] $@P,%0,*C3@>9_6B6U UI^0LYW=*:%Gi
MA*!;F3XH0)]_Q'H0*@?AIYS_J3P=*I;.Z5+6*7]H%V[0V(JB0X 7V&EDP#HIh
M2A%VN#-FX)W@J94.R![+PSIB.9XJ6IXK=Y[<:0;J^7KLJ:0<]Y[O%)\F.I\Fg
M6I])>I_ ,SRBB*,ZFCP\&J!%,* %>J#&J: AFJ4-2J*8Q*8<"D<"6*/ "*9Ef
MH*$_&J<>RC4@*J(.6J(G*@,[NJ(KUZ+MY(HP>G7A5GJ/6($%: 9N(*3G":GNe
MF9BX!P)P:)QPN'H?J#<H *DL\ 1?( 5$< 52P >B^FY%D"JH^@4S9FM#T*I"d
M,)FTP@)3\ 5)8*JB601[JJ:;VB=N&ITH  ,L  ,,IJGR\RUH@@)PB*"&2H%Ec
M("2).ITIZ9&=&H(7"*F2FH&4NG)4FJ![F*F)N:F =*V?Z@:A.JJE>JJB.JM.b
M0"N]"J*;R@-! :A72:S&NJ=PJ*Q>T:PL^IR> X+3NE[4:88J""T%:*="6GIVa
M6JF9>8$'6Z=%6F7T^J")9*)7*:CY^J]^%;$#&V[#. 9:YX$""R<$59%N($.Ez
M43EX8%_#LJT,J (IFREB69(;J0(L^Z0L,RP.^T[[N7HYFYC[>:%X8)3E6K+Sy
M-[-R8IQ#ZP-0N8^]8UR ]+3(VH47:*PL@($QFP(F@&(A"60"030I4!I?<69Ix
M=HM@UGQIEI$@L00I\+9I"J(A<'JRYP:#(Z3O]*WQ](->J$ HL*?O1+<_N'HSw
MDIC-F9B/(P>GZ&5>BP?ZFJQRL*PJLW9/H&'."K#76K<G&Z,A.[*\ T (:[*Ev
MT[A":K.F@K,AV;/@JCC&B:@7R+)$ZY^LQP19>YY<V[A@ZQS?Q@*&>VUJ.W]Hu
M*V;+8;;SQ[93X+9PB[C9,WZUIQG *F!-,'A&, 6:L0(K@+<)"J*.!FE$(&GCt
M-U1M"KL^@*&?UKNXH[?RI*:.5F=WEF=I\+;F"T_H6T^N"[QSQKW>^[Z\FYDKs
MY6BW^+TN4#)'L;\UI;4D.%0FX+]!^;T$'%._^XU!F;S\2T_K:V=X]KW-&[_Or
MU <:W#&CML#O&\ <<D* )& $MF;&>;B9Z;&O^[7C6[20\[ATH*RR*'B5"P*7q
MZW&@RX*24SJ<6ZTB>Q0LL1%4H;FCJ[0K&Y(N"P<P2X)*6[-KIY&G&[0<5WI4p
MZZU"NVM F[I9S)\P+)6 Y%[1:H%)*T-[VK1/.S)1^WL@<,69B<9XX (K0;A,o
MJVQ.&\<MMGHF7& '5L>\EI!HY:#&66T6"T@?,LC&5LBSZ\>Y2S0B?!2UQP2,n
M[ -ABT.[.4&"W,6-C$-P<!,E/&!\/ 2M2Z<%V+3D>Z>S6[L9>+OB6\ECV\&5m
M]L#!:V0/;+S(&Z]>,;>Q]X/8>[[QR[=!"+CN)+AVFS" 5+@3S,&9F;B+6P:4l
MR+(RS*\U3+F6R[$M-Q4\O+F*BG6\XVM'F93+U4]-.958,*-;2(-958]_B\4/k
M"Z+(F'I2-:)=V[2NW,NX4\'MFV.QEWER +Y!8<T% 0<U6(\_;,X&.3A]"XQ"j
MBKX<<@:GPYNXUY7**U5ZUKP@H ;/6P71ZVC4>]'6:\][<,]SQKX73&F9/,'Ni
MY&BU=FLFS7HI_$X*7&JG]L@D'!.@C,*]J\S-";# [,W;7*U':(P)S:Q"JHN/h
MQ\[OU- /+541;9SA7-&"?-$9O=%SUM%J\-&].[_9BV,QG6$S+< D#$C]# (Fg
M8 )>L;VWTKV3!KZ 9,I?+"?V[$XAW<V"!L^K)]$H#4_[&KE>L9PO[9P@H-/Nf
MM-?+^B$YW$Y"?7H_S*AF&"=W,-0+/:YUM=1#RC5INGKZ7-?\++S+&9LV3=73e
M&[=G/=(6[+YO.Z>C4X!H'6E3IK^PW+\?+-,A#-8-_%@&S)%DW=6FYMIY[<#$d
M"\&E)L$P?;]IG;_^[-:<9)SX?,'OF\&92=A>\;X [=@)7=#;:(8 U(5!V,\Kc
M9]2JBSMTN]F 1-W!7+77R:QD:[L)'-M>'=X@,[;#ZWMG&\&'S87QI]@_;= 3b
MV(O;7=2T&%!'/:66"J*)785C7;%QG=WW;>![^L[BG=OL;6KNW<\ S=\^3:WZa
M[7[R(SIN8H.BAY68NK"OA]>XX]U(G;U>@=%M^J#FZ^"JIW@62LFZNZ>DM%86z
M_H44GIC%AFN Y.)R &1@#=!PR.%RB(P_[%< = =1T>$L809\$RH053$L)LX y
M1<Z,O85^: >H2(DLYF(K5WI=_MT?ZA5=WB=_:KY:[4YE;LC(3$_5UK2 S ;^x
M'.;F*]CN5./FN^;+T3N@R :BV.6 2]@H .@ G>5;OMBO9XBELW<Y.>@M)N*3w
MU&)BSJ=DGL=M:MAY;NDN;;AXCM)I/N:.GC[TZN- KC>$\=IEO@* )&-/%F53v
MQNHE=F(^OF*/+LR!;;AO;L=Q/N>2;KC0'>KU?8B,KHA0\=-7'H"0F =;C@)(u
M4QJY,1!".I)((Y8C^>QM(.:E1[.)F2FKQ^I0)F6?JAM[>G!CL%/,_@;.KANEt
MD2GUG>R';NR)[HE\_I,H$*E?#J63KM0W!-&OU^7E]RQ2"D]Z;GO\:XK&O%!Ms
M_DYWH#52&>K BB9Q/=<&SZF]WMM')F:K/F+?_NHC%NLH,.N ;NMVCCNY_L=,r
M[L\&G\*_;O#U_8D_B>@)4XH O^R1S;^"ON?D0N^DWDRF/E3U;?#O3JU^%1;Eq
M$@85-S(O-^6_.% ^C(P5$Z/'/H&(^HOHS8&PUMW_C:EB"8XI)N8IMFR>3)@3p
M5F%!R;1B .0C#+1V3 9X[*2)6;\Q?LJE(0?IO<I6_Y^_C;9GO/9MOWH!OM,No
M-?4A\\.Z>(2]2/4U_TZZB*ES+Z7CJO:\QO8N4/'OI*:8ZD>??,('AL-9C3LOn
M>H%T[Q7JK9WQC6;S-XLPB<.V'H%\/_GI(]8!#T\CW^GQ)%6 Q$E9=@8^XQ7(m
M'</(.L-\3=05+C^^./@_[5=X$B<FPQ)"X$]5;N1Q[CA/CCH%\_2*&O5-;K+Jl
M[$,K"^@K-Y(^I+/XU!R4/Y:2[=#[SM2)_F_>N>C,-O?RP[3_MGJ'G)C"SFS.k
MG=3R0\=OS_ <(XOW;_Z-.M$#STJ=Y !I\8M<)0]P02UPC.VB,EW&F;TRBX=Lj
M'B"L,S$?CP#RL_;'2IC-C_$!7D:XI2]YM?]XP)FS>)\.GOBJ_;?BA@K^&V_Ni
M[]^\-'DBP*;"#'0G(\]GS3\8V %E8/P*@!6#!PZ[281B_HTP&WDE#\CL.J#Eh
M S,3SM)SS.;W23-_5:@ EE S<OGMNFTA:=0R[H"623'8H\5X)R'%]<2 ^*-Sg
M50S?G3C<0>[,W04\,6#PR$Q >_(&48R*N7A&)E+5MGF28A:*#W ;$X2A.+P\f
M* *?%1>D1M9-'@VQ;@0'[& 8S%/VCN.4P3-8_M:3F&N#.JGC8< XF.J$QARDe
M@YH0#MY!0+<'^>#9XWF!4 X"-&DT+!)A09I Z&C[W4'N)P=7SB3\?O]H_)4!d
M2NCV!-S#>CW-QS@UGVZG\5P=E1EWC- 1^KOFLZ?<7:.K@V"0%/J0,W8*+QE,c
M4'6E#Z#%0BR(X;1@ *)'R,@1UD))&)3&GQF\=Y&N%_JR7Y@PXH1Q C 9S\ELb
M/(M$8C;A**QUQND0>D%QZ.^$QM(26M70U"T4& C0P*'H.7(7A=D,#HB"0,34a
M&7D! G'*B2X\8.5>3Q#K+)E#<>T=Q@7-5H[I&G]<S!?Z+"W6UD)BWM& +XZLz
MQ3A7ALB&E3\S5H/L";A$^I?P6)_)4TCYSYTL/,B1 2U/ ?0!G0SSV33-)U2Ry
M6@+<<&F@PZDSZQ7C=MUV0HD_#B@^J!N8!'W $F1S?TVR 3_)9<.J615T*<QLx
M(SHSF,<[/!?0XX@AJ71%,9.$NO" F -+2F,.^+$MYA83DX];/?/,CK%$'9?(w
M7J(DTV16D<GEQ ]%?V9>HQLJ/N $QI-/MQ,;'@J /T&PR=1#60<560#0.XP?v
M4"W@ 7XV5$;4'ELS<:WV(46E& Z9(IP[>:4!,AY!'2<33Z-"\F<[SQI*P> Wu
MN:R)5^0XS^HLCL7C=U'0D#]D)2N+0[P);U$Q E%2M'[\I?1<1"F$B#@B*NN(t
M' ?\[4*/N!9O%A5;AXHOZRD-,L A"LA<+(EU\;F-QB+WX5QCAR@-.\X\RKEXs
M%51:HZX[>8F'S0T5^,,=Z\3JV7F=;#YUJ>W8'2-C'9QU?L$]WL0.\;8N%-OCr
M9ZW+_WD%^M@?A>)G/# (L+<-N:1('NF0:7R/KS$U+HW^N/H"9%.$CUA1@S%(q
M^]CCH"+8RXJ92=@MNZJXZW!9>_R0KS$^.@43B0I/W03[="VC@X6TUX4A YEBp
MY"<I4)[HQF>V:SJD//EU1> )J!TCN<%>6PMH 3"20-Y _1>'/!P=4H_HT=BHo
M1Q%83U1DHV.1)\](.J?&^/_ 9(QL4[&QYZ'(P/6!E%VCHX7_L3)ZR"W))3$5n
MY.**U R'3;=%]P6\#%E<CAQ(./9)9T9EDICCPH47"6=-1X[S$=NBF%M\(]([m
M=C&Z^/N(G)7$05C2+VC)'KD>F9:@_)("4@F&2='V(K>DC,1T$RQ21D;\2/#>l
M">V#)ZJ2&#H9CP<@S22!S(P'4O,,N 6Y(>VC9[QI$++SY4@4^-HF)&G\<!=Rk
M0,HY#5D?"PB3Y(\D4C+22CEY&8G=W\*5FU%76KPQJ2 ?8Z\L( X26 J5-8GBj
M2B6G9&L(#Z2UL3>@(U\;CU26,I+%44"Y]MK>25@<E$12NM7+P78GO4*27))3i
M4O8Y22BY)0,FMX0<7L%6RKE3Z=>.8I7<?IPR2T;)3IG3$I,SM)9P,A3VQ)L!h
MS]!CJ R,K[%._KK:>,/JFZ'SD[QQ*TFD,^(/E9QQU"J+(VF C.%1$6.>/MH]g
M]&=EH3(Y@0[#$J+41.'O9RZC18D=5Q?NF AL($_%PO>7#2W507J!<_)<&B>Df
M^?IP7I\316ER@KP G""\'A@>JI-JBFK*R*5I!'N7"F!CBE(_EI(;J<$N)A%$e
M97'2)VY (I4TZZ25.3.RLM6!NW_8V_2AE@&05!/O^9X.F35A0@L ),&P8F:Fd
MS\,A")KBT6WU;@H%LW$'=<H=)6*<EW(- )F7"5]@6=SDF!N0:GY">E(X[Y/Hc
M%(9^HW$B([0'R0#)X0L9?PMU@I[562/O(XVTAJ;3^ZA#=X(YZQ'86SUY8GSEb
MRK_G3DHG(*&:\\E 9DO;MQQ29^9DG6. 5)+-BD&O1&?OVH8?;M9QO^E)X_:Ca
MFIJ>(. /6D^VV=O Y^&4C/.0;](3[$F'>B<R8@';\VG./X9R.C78CEN8@"1Xz
M:D8$:3]E(O[TD N3?NI.<HD[X%[O"U/N4_1 SU(X3VZ;C6F>LU/T"$[3!]PRy
M3"$$6+J']F1!1>@\TE&<RYF8!-+YS.B8"\\FMMM#:8!41@5@)2\7(^YX:FF x
MCG$-8-4$@L#:D316H @P@8Z6!K :!9QKU::&WM BD$-WZ'UJ;H DB-K0+X!#w
M=6A 82@QE*$TS'E)\HR-$&6B1-2)'E%_MN.N:!,UHE#T/DU1>Y(#WPDF_ K.v
MLQZ5AKS(:US9!)UOP:U#)E#+ SU7S^N,11W2@-HQN0=!5:<";28CC('>$P<Zu
M5.;HS7BCP(N^34EZIKM<0%!$G&F4=@:YMMDFEYU%<DB\3R\V4LX)W]0G']2Dt
MC@QWQD.].64\J3PA9"]QD7+*P9AKX)@<DW/6BX!B$N]YD,+AK+M3U89BXD:>s
M=I"B'[RSF1$)6IP1V5.1:"%TQ!W2$8JQ';9X'<U?9G)'=VY\$$VCB0:F)BO]r
M6>!Q/J'-H)F9AN5BU& 72&$BQA_IYC[F$E1U^_*=>#MC^#DOS]P4IW;3578Iq
M6"9.62D\06<$*!QVR OD%4JGD5FGX,X$#(_39@*;Y^YA/F<F--)+*AH+/VBFp
M%*BFM)[4P-$#R\KHG9NG/[1>RHYC%C!YYSY*3E@2HJ[1B%I/:&;^[*CN1#T^o
M290*ZM0C"U6H\B1(SI.&RN0FYDA]EO%DHK)4'+@OC66%Q)014U-.S'@J,)-9n
M_T.8RLE%HH&A(M1"4J'D0$J,1,U&/&D;]>17;"?H:"(14X1XSYQ?0#%&4P4Fm
MT$<0X">='&JA?O.E9GJDIEI,GV-4-4;1KH1R4]S1*)MIZ3%&)Q3Y5"DF]PCAl
M7^PK<=HQ+AHG:/I"O87D^(Y0-3R^$\@8R8Q3]!-K+'#3928RR2LKQJ\DBNJ2k
M ZU20!+GIJ1/S9STAZ_&Q7U*X+1?.*2%)@#0Q<NAH@!KXMXB@0FCK'VDH:)3j
MP2F(6G/R$98QUA(I-T'&B=1@KY*>[%9IB0$!)*!3GORSM^52)O?1*-[N+*IZi
MK5_*HDWEH9X56_V3GDNH.4=#&5<3Y5RMC5(,)"I69UKY7H^X$H\'CZT^5995h
M&L9HN;23"6.HN$U!E#%G97&5D_ TFM%&Z@K0M.MNI%;*T7/11WRY7M.BT-2%g
MRC2\.LHU.*3.*Y5</>K5F$;5J;@KI^O^DZTQ+HWUFZRR6EFK=*V-1B (&":Kf
M^L;TY_#48^)RJD:WE4F1"JSCJF\#%F4"6(MH%FU&.MNNB;6[ LUI6E=-(GDUe
MF@[6G;BC:>KY(FN$=:LMJUZ1RF9E="+1FX2;&K-6FM,PV3VA!:6+G,V14'(_d
M:"8C_R46\+ 'S\NJ6 L;7P%:M+FQ_Y5@ ;'LJOU*ARMQL3IV&7W71IE8\VJ1c
M_:L-J580V2;K)JVE0-69,@S":C_&]6=SK K=5+(5C0T+-995(N0\\:;T1*;"b
M5\Q&/D:8>&MKP=/2OC>4RD]# '6]LZM'11+:YU@D.2UL!;.8[<J,@09(/KR,a
MSHR 7V:UFEJOX$<^[<B\"6)2 '7+6KO_5N,*JZ1/]J:.V4E;WX2:FPT57+7Yz
MC3/B(C\X1EF=?E$.ZM%8(=;&.D2S); 2]E"24._*8ZOC%/.Q\XNP[EG4)X9Py
M!V1,89?J:)8?)I<&UJU">JZ@+@086SSP9K/M:8.O- S$BE@F0&+AR4;]9X9+x
M37G+R.A#D.M["Y>8%<UUL#@70]L:IPR8D+:>2%I^^3!+XPH8JAIR#N!4DC=Ew
MSR3"0ZD652=VRX%K.WMK5.QDG3'SA3(C64]/FND!MGX6RMI7RFAR/>90):KNv
M),Y53?48,%TJ9V6W ;,F206DL.P$JI'TN4ONW<[ '$A999'LB'@=[+-"3&4Iu
M,>DDQ.T0ZDS*WMR B4]!JY&T?!-SM9(UL[8QW:EOK9TM$*:ZE)G),<9%Q> 0t
M4 DIP(2*HT#2@$])& O'GDS<*\M('5E0O*PK-YW^6(TB=2UNINR[G(S"4E%Xs
M<D;9Z":#;P!2EBE2P8L[,FP<6PD_I@7L5(5'RJA>; RD,]+D;MSA1F=*6V93r
M(/ LE5)>#_9HBMN4F7"J=_&J,(Q26^=ER#V:F*UTTBOE@U 'Y]C-I/#R#RK>q
M>F+YGNZ^_+<L*4ZXI/1X+I^BR36 P@BEC;PC"S^5V/"EN/FV*_;;P :PF"T!p
MDK%J%OL9'=W4DOS<P)V@_BWUG=N>F3A%HI#-A9C$..DB59FF]E B:3Y]%;[^o
MIS"P%/HAR>@[\%8!MDK>R7]-7]6L-D]RZVI%2SEU1:5"JKKGTD4Z/"&X[)9#n
M 2YS!#7T@LZS:PWMF<<9"%(#P$R&W><W#LA=Z2D_1>=\T[P&=@$JQYNY9;=Cm
MRL&TE5"!50;E/0FU7<[+^4J)"FT[E<$A#Z7&RE$Z+6MNU%26!5)X+D^46GB1l
MY0K(E*KR6?Y?33?A4*HA)3J\=0,3SWK2A*]D4%6-*+4JX,U1.@^-KJG%,3&8k
MGT'?KAE)_RCN-#)BV/<F1H.*T)@AY<6P5W@-%U1_BDF8(4R-KEN1S&[?DNH"j
M]F=*S,-2D=/6TNPI)PMMX7R675>=26$0E88YL$"D96V8CM;(H4*O;G#OY9GSi
M\@.37P#3/YR>"@:2@O>,_N"Y^8@%J4:I@U>X-#PH5YQ1$'$'WKP:V.Q&Q3<,h
M22.H)I:-@E?PQ2);#'JO\.AEO23-?34I%V-/[<EJ4VOC9QG'7HWR)'FNX&VMg
M._7V7M2U*5Q:#MJ8*IB$V 6TN9$TA.Y-^CD%@V-PP5-\3_8N>(.Y1- ':\Q8f
M3**.<1QF8RX8!9CA5(PVNJ"6H<?$J@\G5%QLBP7B^;S'!#D3WXS?F3\+\?#$e
MQ<M-&0-@?^9:[TD"+IC7N S8)*+;Z/;QXM7&973V8=1XXE*DD>/0#3'(!*,)d
MUA%PV/%"G:D@RE\60W"WBD&&S:63-'AP4MY._%$_,4R5M#Q8'\O<R5B)0Y_Ac
M,, X]YU P4]I+8\RH7.7(*KERD=H"2ZSL"[^K?.RQE%E_QAE\6O'O94&=PO3b
MDRZ,@ZP7%/Z6&A>EZKEJ202E\#)>/57XM5WADJN%F?!X!*UG.2V_MGN<-\LPa
M21V!:)@/%^0) H>98?B$I ?5#LM>W(&'%;+FK)U[^'9>8H$\./\PE<RW_/6Uz
M1>1H/)'YW[QLN9+UGI /0\P\6:4B3D>VM!&CLNM+?"FQ8';,T)<3TV$<K)-#y
M<3M)OOQCY)CBO-N.4W'E=(/SV#'_)]B\B6DQ1JG)H6\6KUYX\H@3LB]>R+43x
M&Q9.7"R,@='G'6"Y./5"9-*6SV!O,ZXGS]A[>6>7FU$0,,&,P/7I I<_C(*-w
M]Z4V3B0CV9Z4Y&_L.W+2.&8<YA@IH&, LXYYL]ZEO*PR;WJ\6'Q<E7!RW2A!v
M61[#8'H<A"GO8(8)Y6H]8Y1(K$]QL8>\R.@9<:IG>,M/\C-.BKD;%R0KSLN\u
M7WLM0,/-H<@5TB2-/'0_-!&<A@<V;3)8LJR?@BKS1<)GS,0N3P%]7XTP/ W+t
MQLD@TB&M:W6%%E,F@O"T_@K3%FM,2^U5M9,;V45#G!C%!3Z##%  TZ2:7)-Ls
MDD)RB")!)12A*?"; M(V')O=2!M+H^ DC5C2I<> */G2&"-,AQGY C*>PP(Rr
M&:&"-VT$J+";% 9E,#.(P]K5DD_2ID6)@GHC."&7[)*% F# P!VH(\_$F8"!q
M0J) W  BN7.G)$X[DD'M3&@)W_ ;-X-XC&#9$3H24.G;%8]#=43$]/$Y!E#;p
M$#2 (U4?ZJH 1^1(EUXA"^6.Y)$]TD=&E""Q'6/$XAR21)*I&\DCN2"2Q',Lo
MA1_GBHZ3)@G4")--NQ 58C/>]#R%T\9:0+ 2//U*=(:T?B$KA);8$ES2&GS$n
M"/HEBDN8* "98TR0B3)A)K($5T,3:4)-K DVB=<V8YM@@2H] V; 5_ ,:P1Dm
M">SE?$_4R*OP&%X5!$ !>',$9D43(-CP)*1XC!E3IE0&-2D"@8<R6:;/U 2>l
M '*0-!"[GAB!)V!X3,7"?@(-.P@T@290;Z9 R-XH3^%EQY.G4BYXD\^I*MUBk
MUV25.:!F]R7"'F==(WH DX$1IGH'AW!R^0,J$!0S<P;B!$QX2E%)N62/(:#!j
M3 I*R12*2]<FC3A!/"Z&6;DAXZ/%])NDF.@0BLD@".%L(J:.WG9?O#;DP KWi
MC"E5.>^3Y"I&V[:3Q^(B5 S&T:<_*TQP%L1$@]V5B^$G'X(+:;N#8Y% CX;Vh
M'LBQQ4$T'.C?+,2[4G'Z1]O68)Q$Y'",NSW";%/%X'._(WCTZ;\1+F1.Q8$6g
M<: ."!FLP@8$]T7@=Y@D<=OLF3,NFH?/$8[ 9',CF@P!45S >L$H68-C_.PJf
M9R%.RMEF-V\ *DFEK0&XB<==Z1]FY6R4D+"JP28#<8$*)>2'?(S!YWWL2HU"e
M P3!YTR$XR$T<M-NDBI3+GLC;>#*2O2&F:E^NK;?R ZNDZSA!M^8NVAB([@!d
MJ&"US[:4<R/&([^0#PTV!;P.!4D<%<,,C+%OH56X#O3^'R;G6C20<(-1&(H5c
MH AE1RKEOMWG98Z'W*#; >0E_&Y^PE", ,(<AB/C,9B+(M(NE ,1:#.>0ZJLb
M!]$R!XC.YT$*(]PB<X8+8E:A'/RFWP6C!8RP;V%F:$;P6-908??0 :F470#'a
M8K[A%.?MEH'4O;LW!04GX5ACY)R-ES/"A$P+S]XPH7![']7MP3G&#8D;Q*/Bz
M3(_%K-B6,>PF>D_G;$SI</:U$P;IKA,YW)XP%"*P:#>L<>G@&"1ME)P[(,*Oy
M>,$>.<,[H/1OA3*^W8;>F!NTFGB4D+;1/VK.>V$Q"8-J*]>CPSH45VEP*(HKx
MVM* $%$:1GE?0 %M)D ( ?EQ,3@$ZW@6<J(TY!R?DS<TF!"(&]8")C07.?!<w
MBDX'H18@IZ$\E+L"(F" YAZ_E8-UP(0W\"DR!.9&F%N#=8!+G^$[<H +H $:v
MYBG8$.>QY*[%[@MG></*?IQ.CA4(.,WL'^@(9# ,M'H\$L@"6>8 ?&MD;SD0u
M-,Z T/DLX6R-YQX?HK,C"='@&(S[(K0-2_YO,'G1 >7O&TW,\@D2=(:.7_#=t
MAMR>('2&*%&(5,6 %LMZ CDVX2$D&/C>_AD"2&)PC&0-)S381"?F(>*8B]JQs
MZ'-.YEB4.,GE<_N.H:'D=E/;I-MIO UD"M&255IX& @X-GMIM(WLX7W;AN^8r
MB&35F9T/V5 ^*\;0J!D$1ZK$B=)],ARW".B.\J./H/,>1A&-TJBV&,\\"?G)q
M['%FO^]8[.%HM9M=D)\>5;;C4)<J1?U::+ .GC*F0(=;?GYZ:,CP.G &/KJ0p
M".ER@X8?BV6=QM'$28\H(4*#S0R.L9L>>=X>82N\XASVH. "0(2:I2=,P-U,o
MD\&4UF;1$0 ),R95I!LGD,?!L]P.*%N#AH,7[K3"D<<=&2D":&/TD47>!E(&n
M%'CEW'B>*! V  =BSAG:?[1G#=!T-+$>'-KAT!E\XRFUD:0($R#1<3S@M1P+m
M,(#2_DZ0@*W)%8:GL[>**8!ADD"J&!#W))%O[%<QF=I.QJY,)SME/^S>]B3;l
MNWM_[_ ]OLOW^4[?X_MEYX-F6Z'XG!62FX3,P'C>28-H*!"I0MNQ=L58>$ECk
M3W\D6W[:8\[;B$H0W6<W^/?1)E$P4!$J1,6HK >:W=9OME71V38$HM.3E<$Uj
MG#K1X$">0HVM2SB>/9;>S:G=Y"/ !'%]%U4*.3V9YV7\#)F,FBU6&XX*)QYJi
MS'WSCZ21O9=2PA[<<T-T>!\-!KBW1C@C*%'E,=@MQ+'PY,> C^%"X\33GJTQh
M!X2.\C [2BEO(!H-QK7) -Q.$Y/MROQW-.%#Y( *_^@<H\A/.?%^5]*Q7X "g
MR6%YB,A!#N<=/'0?.>.<>(AWJ"W-N3EM3^!Q0X,E/XDQ@>R$5%H>+X"HGP[1f
MP=I[-W6?)\';3J*_5I+6%7@4!P$DX#5@>1(P R $[J@"PO3 +Y(8!!6B.STAe
M]7W!TPL@2 )SH,7KN1@TG.C0::,WY76&UXY*+7Q:9 H>K\&07K?^\R)C9R>,d
M;O$M]/.Q("AX8^3,\W4Y!OI[T4.KM-CG7 PW8+YY4_J&%DC; E,+J73H4P:Jc
M!R9:F]5;' T6ZF,]S03BRU[(-(Z-GNMWAAV7&^2%H.#O==\WC9[=T!G&7BF1b
MBZ'QY*".D#D>SP5Z/)?=5^U-E+SW.4X.^)6!JBT0XBX=./.ZXUL$2F21,&B\a
MR4CK4ZY^:/QDA^R7D@9+V+2]Q%N,'C+"L(JYB/"+-Z2 EWE$&8C.5^_R/21Nz
M''O^/NR51UKO&@]!+#0+UJ'!1 MD;^&"FL/;;*KRX5V^5@EG), SP'R,8A0Vy
M/6\2^5*EA-P)CC'G&WSA,'64?.1X_##0 C18IS_GD>+2;Q2E+U4\?,YV^CQ[x
M,<\3KP)68H)8(2MNP*ST,); !-2*S'XKAAOIS17# P+R2K^& 3*;"EA;.+!(w
MXD13 "R?8; 4EA: 6!2+VL\=WD*J"/N#K^G?0]@7W@T^Y6</M;$<^#J>N"%1v
M3H.)?")%,\+9HG/?T;;%9P\!SYL.??'XZW? 6_@FMZ'!U'=4<MRKG^L0<C8Pu
M+5["U.<G;#^L<H:FO[,5!C8S\;'=1)$+U*%5%IZ0Z!9W78,%=-&"./J'>(<?t
M/*/VYW>VA.7[!\XW(]VZZ-L,:^_S+;W IB< A309^7$VF7+'$Z@"AB>].VR7s
M'='K2:87[R:<5((NG"P#7?(6M1D=10\Z,C<,?TL!Y@9MP6_4G,PPL?P</M4$r
M,N5P;D>!YZ8<>!D:C.&FNAUS@%P$&,@Y>$=#TE#6 709H-XV G)[^8/9)S%(q
M>5D%3'!EY QG7J9WMUT9ZYQ'I_S)%_3%Q7?[,77"E=P QHV <,:^US\H$/ 'p
M;V*4G!?'WSV!/OP<&&#>!A,\#AW"T0#2K7[CPNO!.!1YKEU2EP=04@E@6L7Mo
M86W]1AO#+- /NP/H)N<!&%-._S RE PGP^6W5$ !6Q].P$U,=_U?=7?=X1W:n
MW13 W0T!WEVN<&^8=@F;:4+>76SGG<+&L#EL&DQ]YP@^@I!@?7??R1/RQ;*6m
MT&$JWL+$43%\*F. '="CN FAPG"VFM !S!CC4 E.)% @LV#V,1+@1: 6-VP$l
M.(0<^$YD>O+%5)?6[29T "'WR!%N+-T$,3A(<0H<AX!:1'&8VROH?9P98A7Yk
MA@.&"@P<=/<ZY%DB!Y>GSC&#' (8J#PH@#[#X&-M]7S%PN7G6[P$;\,"M,[!j
M,A/7XL,U/&3TA$L!EC0'BP-OPC@(.TP/'B"S;131#UNA3_ 3YJ"F]7BD@^W$i
M.JA]U&Q2!>, O4$.\Z!&H1"!?.E#%&B;*!WUDEKR3G@96X 0M004 5E %S 7h
MN!.!3^)V7'B!T<,8MU9$%A55GG5]+%Z97AC00S!::5W*E[U).2M!JR?V'06;g
MC<\!$78!SUP56 ..'*29RC<$^AQ$SS7HM&D/B-QII\$0>C.$+.A.A!1DQ]#'f
M];D1S^!'E-H),1O#%)@]1"L-0\"B-X!37-WL4->=<R,'$DA02!5+8)<F.R@He
MP5\U6#X!A)&<$3AR;(.<7QL8P"V#$E_*X([H>;W-1^3 C1P%0PN7"R8-=]LWd
MZ-?=>R.=,9BTD8"*@8AT$OIQ#%&Y9Q3B#A$#OJ<,8@KQP\:'4B0/GD+\5A6Vc
M'\ #.E:R<'4BT@315&6%75[)D G&=#"?!K-*0(:LPP0'RU 7Y44@<5ZD%U,'b
MK[?.4%'N6)[E*N%B'U$,04",A!J%2W&MQ(,"!69(/+PK+-L4\!$0 >*&HJ)1a
M9"X3$0H@ A"' \)QB 4$)R: T@)?2%6+(4:(V)@LX!A2U[DU#^&,F: 2@ !3z
M@ HG.RB'M1C(8#F%*"Z JQ5(3 'MAAH! B@!3P 2X 2( ,=8MC)H$4J%5G4Hy
M0VA<EED\T9.P)LYAD(!??(=B%5JF\I4 ODEP4FG!A)N6X!5<910#(BGH' X!x
M ]^)!U8AB&$>2.=EX(?96'8(4]"!!\0,< =>?M8=KL '4A.<@1_8W7UW@R %w
MT^ 9@A:;>2?_Z7\J6R,8">Z(/*(C. G&$T5 IE'RY8(=@A'G*<!T<4+%L#70v
M=-5694#I&7^77X!%;3&'7%V]H[(D5DO,4+)XG2=/##T1 '(,?L/NH[3L2SV6u
M6R1/0 '_8%O'."!U1DE2:';L2U8,SW)/W 0,Q5.G8:TQ7N#Q,,C9>)#%.T$>t
M,!0@G))S)W)8'5QV2 14!>Y%&I!Y0!1-01;']6V&FPM:QQ#)<S('XW"M[$L^s
MQP_"NN%-]9GI@/HA#FSB"<?/+7<_!%0P)BY>+5U-LC'T>49).!,:HFZJFWD5r
MK7!_.D/VX*I="R(>/Y'I&25P83/H)I)[(8G*5P1R<ZX>/V$20BUKGF1XMJ4,q
M?!RR^,<Y,SE>H.B\275$ Z:X)\($! 4(0BL6$;J6E<>;/"T6W<_A 2Z%K$<,p
MMR^!"+A#ID<E1HH/()I V/1YXR+)I&$D57 B *=<0'-2#@A"/'1Y8T#IAK2Uo
M"^>#O1@<9HA (#_1IUTK]T%]AK%(%02$ ?'IT7 V21[0M4T0_0-M!R<B?#H?n
ME#BPG84"A^="Q&0S1\R5R%ZU,2\+;\A/<(DRQ$4H3WR),8B8*$.0B=Z6>*4Rm
MOA-H8CL8$"8-H:)4\BM.?(M7G @'S(SS!)V8Y9&,SJ*S!2W^#DD.G]@GX@Y_l
M(M(80!"-**'1>!48BHBBZ+ H%@R-8J;W,1HQ75V[J!-6BDF#&)-58(J^8#&Sk
M*?H>\YZO !SRBJ,B%?BWF8HRA/*'-.Q+?HCS]'.TBMG#JSC%Q8H=WZSXUJ$Vj
MW5K B"D*%&[ADA@W>A_6"5202=P0U^$OB !^$#[@QK O+6UUFL0($U1Y:$+_i
ML-$9)>]#!6+\I8LC!R>Q+_6*<L/.F%@)BZ&&6I@V'(91"T1!-XY_S&(?AR<"h
M<ER'M+C,48MVW+4X.6ID8!_B<%=4>7D#7-<*-7+]0[PXY=P$V0.ZZ"CN2ULCg
MF^@UOHOBHD<H+_8U0\6AID#L2YSCY^8YRH ,@[\([*$,=)7 :)3P.<F:3;<Ef
M;H^I$9H0G3P=!40=F-I1!A'CQ&@%@HGCW\5H,3P79X3&^".J0-,61L3"5(G0e
MC,GH!,:,CM*9F":Z@SAC5M@F8G!*(=7H)"J*:%76".CM,%RC0"$IWA6=1;22d
MM16+]X3-F+*D(-Z,&]?V31 12Y_''!P%I"+^=K*(B"\%B<@QT  G8A[H3J2(c
MV!UGP")N=R^B(!C>S8B/28V(L=V(BV".R-[UB$1D$=G>[8_T1.9&5RD.%0,2b
MQS50"SK?]/<#8A)"8L[(V/&,&$7$ A_@#D] \#@96%E](4@G#:)QJJ,#(C%\a
MD-EA&P> Z6EA )\F,OP;=AS%B!,JD B3@E<^8I'\A$G1YGUQ DT,>,S]C^SBz
M6<4008\<I#T1+VI?216E,Q N;Q==]U@G_(N+P0[#-&R,ZU/_F/V(=5H6DJ4Ey
M'F=RU2Y43]2, *'C9CJV@<^@,@(S+E/64>IB0-J,CIL5V1$J>6^B#"E/'(H/x
MY-5H,(".]R(F"15<D&@"M" V*!!]WD2$/2),X-S((<8=;H\CKU?8<2"MEE(7w
M/H)CQU;!>$_ @E6ADV=8U0C1(S*)2'8V6P-A(S_R>QA%6<<0N86;&[. MRV$v
M7QW=P!'&BY3!Z(@TP%V&WH-8[H , 2,T26\A6]3D6&CB)0SVF^1@G+T3Q:/Tu
M*'B$6"/63-1-WDG?I _A NB#)=Z^=+^ECO7D5A<I(DR[G@(X*#Z+5\$_Z4X,t
MA!H11]@UL 'CPE7@/]QOI:$L.:0 2B<@MJ5)"I"@$+<%-,(3H*2:F#2,DDRAs
M#Y%GG9(*5LZR2H:2:R(=J3,RD+'DOD1+)HJVI 3Y1LZ.9YW7Z$NR#UJ%1%DZr
M#)-223%Y+W:4QZ3J9AGJDYA$ZC:!6(IRP+X4+(PQ[F"G,46><?!DQ:%0>AG'q
MG#A9Y]F+DZ,YR2'N1-5D<:15L@1<I8X'5@:$8N59.1:UDXL76;E,*I3Z8#28p
MP'F-H%N?-@3.C8O7"0A-BF.5VQPY44HEF",+Q[_Q*,C>OE15?GK"'34243J6o
M/LSXZ$'P>G$?1G%12HW784KI)^$/+(%BR5&^'&CEOK0K0G "A,XP+N9XWN3;n
M6#.L,?B2:BCWT55YTGV235J5B>1!N16E<>E#I^A*%(3N1#ZI\O635MQR-E#Nm
M6_=)0(E,&I12W' Y=Q67ZN,]*4TN%<KEDJ@A7I,LI)"E)'$<# 7N(%T"ER9"l
M]5A=*BO$@^LW0; 8R*7*M+E8CV:<!ED5^DE;PU>95>"5Y$)\B33FB<0B9]G5k
M(4PMG3S)S_B7\EP/(VM,DOYE/.%"@@ U0 RIP="0*R(1T"+^@8$@>.>,\9"?j
M27GW0VIL..)Z1T\8D21FC]BSF912(D848V62W!5+64\D4Y_D 7DSOI(9'+GXi
M#=Z4BU>9^%(J;#)F*^E3<@P[HP-)5$:0N.1VA"])/X+DX+8T.'5J(^=$CNU+h
M3N6 R3K\D71;VY#R^95]'@>X>+&3;%XS"170<B.'0FB[*8@EW>(%6$*((4>Yg
ML30<F6%1S? &K %[&R-!,RDH]9DX-JI!F0&<GX0XSHJ*HZ?H S:6%,>/64\^f
M=3G)OI1.YIECT>)X\45[(UV3R5@>#VG:%JDR8)?[DGUV:&X->B8;D#@Z:XPCe
MH]DRA6.32$.)*D::DB6E,UH"F+7CM;@@V6VI8V&X>/4/ZV)GV2ZF )OE A%Jd
M<GF.9 $!26**D69IL$VJE_A6Y/(2S 6T'^A &7 ,SV5!:;'PE>P90LE@OG\Sc
ME259;147J >.%4!FAS F/1%3(I TIE+H#-J4IF2.24#JE YFC]E3/I9 )E!)b
M])F4\,10:342F8[BM'EM/5M))IK@?6D5G!.<F#D*F%IAD>DG\6V;F[45V5UTa
M[V1A1S=ZF?7DJ8D@1HO7(J.Y+SUV54%S(#FT#6)F@M@L50PN1^XHNIEQ!2?^z
M=G NE&CF^;!OO@^PG'TA<$J-_M!+T.<AB/O2&'B^.6ZJ7<X@=& .G%.M^<')y
M#9+$Y"@[<EB<4[3GY"5%N]_68'?I=9_CI/ES%)H]8R/9+SZ2WZ.\:2[XFGE2x
M<+E>"IMDP$Y5;'Z1R.;:05#R6]1EL.FT'7-0W!3I=NU+-D.U5SF4BD?GH^G\w
MR0%403)XDM%,X0R', 3&;(N7\.%5E9188<=(;=U+:)'CXF*.>..F*EENLI+Gv
M9F>), 69[.8[X6Y"D(QBD<EW)I7U9N1F9K!S/X<PN7@9)>P@3RDSZ6:3C1O0u
MZY5\5J3FACUZC2O=8N [&!(PQV%I IX.=R,T9ZDM7F/=ZY9FQIN/YR[Y/-Y)t
M\*)'>$K>,$E52;DTTHQUH T@8?8V%&9V=T.ZB( @C+A#%H(]I(>9"(:8.F*)s
M*7WZB-!F^B)M#DFDR]\Y3^B8.Z5,N38>GNHFSRA45HV,)]989 Y)2*8/Q^9)r
M;I1GE E5@HD]YE_7/ZQJE:>@Z7BVBZ^CFT PE!!')NB&>AJ68&/#\7(LDH%Fq
M3W7765FQYU>85LX\]*;ZZ77">?O2(1EU+B=X)\=8%E%;I2><I7W*$]GF/+%Mp
MSI@TI0"'8V(4W.?@J7E^GS\E++ENCI^U)+R9Z96>Z6=:1TB.',).I<E8[IN!o
M)KJ9,@0!0!U<)W#^C?11V]#!:92X PPZ@Z*<&L%.Y_0A?;#EY\=KBA8@GP]:n
M7/1N 0:?Y"<5EG%> 'H"XID!IYD!3U:<W:*]N7-BE QGTCA)8A2]0I8%%5"*m
M:MK&5[K-#A?=WKBZ>1\I0QHJ%GV!B]<1VA%JDQ-H]2@PPH/X9<7@A]AZVV4]l
M 6:FF\BDE^45I)=A:.M)[O6878,[9X/"<_6G#NIX-J$&Q?CGAM8)50'9& ^Vk
MER><'%HNL&[M@FZ)4;"&GP6A-JW%![ A/T'TS(8:16V(3.5"XQ8_\1%9AQMHj
M/>$;@B"5J.$IE?AG&$6L69&( -:A0X8'4(?6X2:Y4;@43*))\882H,N!*(HZi
MT&W%SCVX4=2>^E@R:J%-6A38J+5&::.K5]-%K@ ?U$R &%.%;&M7F.E6IH Ph
M@5J))FP-!J;J 8PNH^U$Q:B)YGY1"4SP62E_SJA]I$%9HR^% I2!]H?@Z&ZIg
MPJQ>+HK!IYMPF]Y'2/FY[3!6(9K 250,\^@] 4B.+OXA 7&,*3,-)DQ9!]X f
MPR<]47S:D!8F#IE\ZI ;)O/982*"0"3*Q@@.D=-G3"K?(9%&$Z#DTCTS*R6Ve
MV4GNF.[$!RI*AI_?)L<0;I*@@:>9:()ZGZXDXLF"#IF-9[QYD\:@@R3N^7-Dd
M.?MG:,E/V&> )@H:XW$&/:C3"80*=8C#$)I_:CE^DAZ*7^IT+\$2RK]U<6EIc
M]W<]CII0Z#@IA<H/5*C")BA=H;X# -J&]J,%Q/L9AZ9N<^A@6''@;HH+UR=[b
MK@D6PA]2EN*>7.@>:E7^FHKD@/?I70Q4*7'$$1ZB$:CTJ(AR&$-%9 F-9IYMa
M720*3AJ,G>?G24YJI15H):EW8D3S5KV5DR:>[Y=+&6,2GC,E4$I*@IO_"$[)z
M3 F>,*6YF4"BF]UF4+EX+9Y%I>/99FF74.E=L50*&L$D9WAY$I/90_]P62:3y
MR<6^IU=^F7)D.:D\&*!2H.0YN?62'6<\"7+.D[/G$VA<XI-"0L-@/S*72LG"x
M)SN0DU;6;.EI2J!5%;V8='J="6-V:D9&+K#0CQFYL9)<GOP 96Z>?]U!."GBw
MH*CI,WF>)@SYI/U8OUV3\ZE J75"EUUG;9F:8GK[%LDF_Y%L?@&D\=EI;(E<v
M=M@$P)$KG[,8;:F!5I;W%_IIHLC#EF>5RA.J':47_MF6R9_;=U4T?Z-:)CA5u
M+ :=QNFWU.UY=9O"$)6@#O'#O^,O:*=N6Z$'<'ZB^Y[7!O#08F_#X[!KR'OZt
MF_*3,B !(=RREAHUB4SI6OE;-I4_PTU'W'$, P>>4 +.#?Y>]B#><1W&W2/7s
M6 :HZF<3:$\$ >]H5LAVN0W%WV!Y04263YT<9VMR.#+=F"HBD9H"X<C!=@F6r
M*E__T#M869%E$(HXD O%)G ECA6J_,/@@X_N?KU#D=<_W*F,0[#P-$H%1RI_q
M^7JN3S[@1F Z+ SAFZI9=]U=B.JJFH)EBZ8.2_AS-!^"F\"(U)EBAZC%D-$=p
M$,/0:0K(S9UX*#UAN9F3$^DQ)^5I!+E)-P.J#0Y0P91S,9P]=RI2QVS.$VTJo
M<><22FV#W";Q"D8E88 IRD^8"L^'$  U" B<S5#13GPCX^HM@4\(""^&D='9n
M>!-> 1(@1H$;]$25)S>8"EN#YMCMH6_I@Y.9E5J1MDBB^I9VI,#G 4$42'<Hm
MXAYH?):DR&>&&2/.$P!@\\F2@IA!I(@Y3\BD&"M\1Y.*$ ?1,%1Q:'.MPZN0l
MKXX<!9C)P*OB3<XJFN".E)FDT]K0.O@<\NK(JHY!!,@J07"GNJJQ(&Q:9)JJk
M-2M'Z+&RF@NF<B 14H3*7X!JQQ6B?B(,8,P5F4;.SQH4P @^ LAZ/ "MU:ERj
M$'UL/+FB/*'X6:O;'-<!K/ZG .%%ES3("%&KRYKC :N2ZI!Q$YIQ*"MV:1MNi
M#4"!D2&=CD4;'!H@I_I_:$ )H7\(C"5K'>@GU:TJ'W^0/NJJC-X!,93.5!5#h
M3J 8;'-@2:YZK**JY=M"RJ^"FH#J%,GG,'EDZF=9M:IQ21[--.7@K"" CT 9g
M>*OW!+C:UY (/L+6I+BZJ^;JZ3HOC*NY1+F*3[03)N)B!DCD (5%L7(#7&DFf
MY1/8/_2MAFLNM#7$KE(K5*> &!RS!^3J<GI[9D#:6KF*@%@H=?H3<JYWZN>:e
M%-Q=H:NH24_8 #< "S #X "C7)$)<3('!<.V.%L*?)TKN0BZ\A*28V]3ZK$ d
M.$ .L%CX'*V!#-"]VDDG))2CD* ,V:'62+-"KC?K]9J"/8517M6Z'GA16901c
M11>N3W%HSY T"+ X!.X RB5Q@\,2IXY!'7$#5!!VLJ%O(Y :P>D,!L?_FJP&b
ML'97"K:DJI.@*IZ0,H2H9Z'8""WT>:#K:7JGD@%YP,RR80V&R .'0,7!DW0Ga
M/;&\3JX+9X")I&J%V>$3B/65J"@A0]0R:!7)6I$'EM".$P36]\P5>O >>\#7z
MH3)7JZO3S8RI"PC!<::^!0%"\7IG]C9YX9>Y'(P,V"M!D5#<%P<J,RD'+!?Zy
M&U)PM](3F5XE<\#Y#K^A*_E1.J1Q7 :+OZH%0H:(1+7^A.M!0*F"VIA-H;>Ux
M@[8Q-2RF4 8V!\]!K4K7Z&9K9-;&P2HEQ29P:(K)L"%#UAI/O*#[Z@%GBF6Ew
MD"Q+\!0&K>L!]"*]!!1CK'!5;9D50ZIC2B[B '*AD'AP^+%&#I?WVV2Q4H9"v
M961T!\7KT:,WZ#ZR0_!P+ H$IVI/!Q7@ !K&E'/+3FF7[')QTPD:R4/<4 =*u
M1%FATU-K1JXO)S:+;KZH\80(R'7\AF;&PL &* ]Q G'4PD5S% &>(*J&KFA@t
M'>#\0059(-*Z42:0+BS'H,IR--NLUF>"I0_/[!JJ/2Y$[0<MIJ]*KJ)L)1NHs
MPAQ:Q_M!3%RI6:K$4!KLLU7-4%A"$ YI0\* VR4,9 %=A28L>LN/IWE".F_Ir
M@U%RQX%+EVMOTZ>5$1E"&ZH1F!3NPQ\:RDXY(J22J"2B%@ZMTAA/ &KZF9\*q
M>OJG6T- ^\<2%.7"' NQ'@5A0)'7+7 [)DN_T<!]<"!E&XEQ8K!36G<$R!X@p
MU)M*B]1JJB/'"Q=0/ %MWL" .$P!5\&00!#HL$)'=Y0XZ!],I- &<8!34.09o
M(46*LQ=$'OMC5@Q]FA;I-BP7D8-A:*+>%2E? 9NRA'C9854AIJQP&N3((-'^n
M'.)=RM?(-7:98UH87GX4#V8.$)+.$R-I'XAA*I\IZ3A#(SJ?+:EZ%WUFK!GKm
MQAIS#'3]QB47< 0-8"WJ\!CH 6V#J?#+)7/ Q"<WS*55-$ I5Q9DM?1$QI$^l
MP@2W'):Q/ 0-NUPO-P38MJ$<2K>T@@!8*B&GI8HIDD/CM@1H,&:-X5'@M0WVk
M'"![IN5X<(.J&3R(=U6#[O>WX9'RA+>YI Z!7UTF*]MR<NC>5Z?$K9OTA'(Gj
MI:YY=1UG ?HE;-YENC#$A7)+@:?ISRZ%&DP39\.!:IN;R[!/=K$'! UKPV*&i
MX*/*T-9V;FBIY&#V@70J*LJGB>:UR()B>SDF;CJJ@-M+' 4X ZZHP1@!V0-!h
M=W/X!9XF4D(1?2!I7?2J>CI_IRK>--):<<+5!/&XXDW/'MOJ>Z0,)"YSX5Q g
M%[9(@Q>]P@\:;O6F$?*LD"N+JQ$$#,DBXW#CHHVP9C.'; U#"^Q,12T(!#1#f
MFP?'D@MRK&D[?2P!>LD5(&D0 4< RX8K!!2=G8%1>$P3Q0?_YUJ&CIBHSG"Te
MB73#H/,75;!N!YY(1QB*;QT"'+"^G86 X^<W_U4YM!WI:D]< 8B&SS#1I@%Kd
M@%100DQP,$40P 9X;XD;^6=D&(@7PQ0P#4I\D5'QAE* LQM%8CJ*ZF=( -W6c
MU^05-@"]BOQ!%:4!HAM7*!1*P'\(Z;X4F9ZI "D\!\^%/&B05EYVG>A@F9ILb
MXY^4IS-(E2J#$- $*&Q%T:[+&0AUW4*ZX!+, :P#5*"<%!5F@6D+3R"Z9P0:a
M$#0\%V^FRN<UH+/,@S[Z-M"Y^AFS!RY(;3(<G! ']C9LU_$P0=R FZY'=Z5"z
M%4&#K>L<L &YKO1:,?A^K9MRI2QB"L(N H@49!X'GD9HM#UX@R$/N.D2#]>My
M7-?;N%GC7E%8?<83\9_&9K!1.0$%O%$%C"9.P(#0OR)R=Z>I@"1J%1DGS!'Hx
MB57Z*3,'*MBS+Q12I6P!%"[ $R $* %#A8(CJFF$MI\(R-4*;U^ 5[4*/@<Xw
M0P1+'MYUC1YJ>''\N^3?8N?(U:FSA:BF-:BGY5/^<-%^?!S#(J'D;($I*L@[v
MSMRZ?L[@H+E968=>@*NX[7X8+C"GS"E_<@#?X+A]C*6?W'#$DGSD),5GO"D4u
M%)[#%RKXGO-$2#$%^"7))[^EE^0*GAUP(/^U&^]&O&$$! :R;4D !3PF]L;'t
MRS&8N :=J? &/AP1QVB8)!*!;40P*.])L[W-9#?*W0007_8PV2UT,$%#=S,\s
M=!YM#')&]!O<*MTSX5ZP40<FR#- &)+=;0MAA@CK$A-[XL%J1$<$*+@M:U)!r
M#]$V%*]<AW-'/$"<H0+ 2/)4/])HN^!PZJPC8AWH&5RV\D1F>WQNMB@I(>C9q
M2JPV(L7JD@J1(R9I2]J:ME3'-S;R"JDOAUXJ%4H5HR_N&_I*%:8OT2$2:# Ap
M!<J!,]ZT3>^^9V' O*8"7"D[?(P?':XI!J!^,PQ:Y<G"$UE#4/LWI!Q- $ 1o
M&*B__0H&2S,HJ@-!SS=M+KE1A<8U<[R^\>EM^[_]')!O2Q;H*2X5Z(EI F^,n
M)W *C *OP"IP"ZSL\A,/)G]P!_)K5UJ69J]Q::OH"F%*K'K9VI@&J.D,9AJ$m
M01^UH=\:M>:F;1#86BK!-=%I D$*XDOD:5F;@M>G/09D6J"&DA7!RD*UMD',l
M:B\'N8:[,FH<@Z,&J?4)^-H8,*D):Y<:L<8#*\%8<+C61WQJ?T/;.>OM/J4:k
MXM!\H&II@*KV7K)JR]JMJ#/PO@J K.9&T&H+A:VVBLH.=D0@L:OQ$4+1KT9(j
M"&L@P*66!,MIKJX_-TDL:Y4$G<)I'GM&"1:,!EAKI<0DO*FM$JT$E -+J*(Oi
MQ"?<1XQK-D .P$N<:U!P,#%,$ _M6C*Q3(1/YT6?$$W8P%O:>:&O<3.Y,$,!h
M[Z:]U& #1T)6/^BL#_C#-!VRQO083\0 BT8SG&SR6^\$XN=@-,.*:*Z17D;#g
M$,;06BO $YZ!-<P,0Q@4[?3R3ARLXS" @< 64?<&.@QG3"["Q\:3M.(2W#" f
M<;42'Z^"5\#+O@H,Q0.S?]PG#TS]T;IV&.O%-^A?&*_D5ILQ$AK$X2!<R'!0e
MKAILO(OOU:F;"T=AC<XUYB!IQI/"$WX%:!IGU@R$G/JSN=2#"@= "EBE/D46d
M>;H1OQ,=<9KX$8.A]00PZA"Z$Q"A-VP1SA-^A7TRY7"(?M(]D7<!-LK(0OPZc
M',0.,<LA7_HP'.*6JU?%Q!?Q25QNB1 CS$K,$2=$[&<;ZTK2$Q4I8^%7D'4Vb
M%D+X&_&3@X^1XY)5-GF'J2,5L\0719O)-\R=!Y$["D\ H^9@?D2/1B NL>,&a
M#Y+$6+%)?*?!$YS3%G /3Q]%P$WL5TBF(^#<JC@J(L^=15P%=0QE3T$\%#?$z
MF^Y#7.]QCGE?TK!1Y%T8<6 EZ<S%MV6RJ/0@&B_'TB,6;QS\XU)<A+(!9_%4y
M7(3.M.D#4A?G/#V3AS4*V-@R0K$/011'QD9Q'SNEB9"1FYWFS5)$H0A%VA23x
MQ>Z$T;<]I,8 2Y)G52HH92KQP%3HQ>G6T32QI,9^A2MIIV04P&AT;'1 %<BQw
M7_'#0G<:@58QYPJ#<A=(R+]8(\GE.;1+L1M%0!-PB]3&X& %L>EZ*[@#R^8>v
MET.!BS>S!7PVJRP(8!$NQH*'W5%OP,>W,3%L&F<4U7&Z(-0B=4O;D)D]O,7#u
ML79\RJ!;]E?.Q>1TQQ=%]/.QWJF7,71<(6<=8Z@GR0\6H7QAB Q@*B@:1VQLt
MN,"%:(Y3#,,-,\C(CMD23YY6L7^:%W<PVK'1T6W$/R391='P"8/ID+<Q!VL-s
MQ-U!Q!!*7W1QQ; ?K\-:U']\'N/'GH_N@APGQW:L=\B.8L=ZL2V3=8Q7L[&Wr
M-1*FF"2+WL U.E L0*,DDT @@-)%6I$T2@\)H-0\5HGG29E,0)[)G<O>"1K?q
MH= ' =DFFT4,**'$)J/)GDL&.I) G:CDZ;(G4ULWZ24%D(!7;-&AS)KNAYE0p
MHD0H*UB.<MBP9C(N@S*C?+-4RIVQ61<I:R*3<J,,*%-;]R:!E2G_R77RHYR$o
M1).*,D:B)X^$-#"65J_UPF+A#@RF;6H^<)GF*YQIVQ$1C H#%V]:L:8$DP=,n
ML)T&"[=U4K Z]J=M$E?PKQP?&&J#<!?<"O,2+4"C]J@M%)&:6'@&&Q)I,"8Am
M+,MIGK"GUC?$P3<O'2P0V,%G!AZL!U.BK5J-\JHI$+%:'LP%UVJZX0Q11^AJl
M>@0C[*L-$L$:ZBD)?\N;6B6<Y5W"$D,F?$DHFIM$M$:,_H>S!!)\K0',JL2Vk
MYDJT#9Y$,7H$UQ(H &*QN]YIZ)HLO*[1PG/ ,6$+,Q,6LRY,KVEIV(3%K*^Qj
M$Y9%R^PR5Q:219\('1J';X=2X5C\GH\%3I$ %T?T5L2+,000%8/52T5:!8E#i
MHIHT-&N4J2::S\$F1[)ON!((P0HBMTMT3')NZ7T[SE#&!&#W=^\&O4E'28QUh
M9'HIG]C8M1*.Z8-UR"SU1R\KQ;CX-7X?H<[!C.ZK9UY(P2&^C[I'&^F\(:A.g
MXO!@K8*:$H.525EN'+YAVU?7_J$RQ YZSBIN/L54JHFRH9"DQ7#@U2@?A-N,f
M54F @NBWP&QT"&[D(T<59![#2\2;,F1\\VQLIP4F#6/51@<A8QT*7$>GUE*Je
M_ZX;T#7CS$TS30$[0Q8SQ<ML.]_.XP2U@HKJ%J%%;1%;Y'N\<RN(+=@6XT5Wd
MT1HZR^B%FL40R\<&,D;A4C2&G][OJB!RB$O&=WJ*S2]JB<&CM&P!@L)-C!9'c
M!0!/O4Q1Z,5J25BT/7?/,R-8=">+SS<R_Z*6J$HQ@%L2 WC/VF%&]'+$2KSRb
M6/P^HV4R@/Q,/^,.+@6T(%]8G T2KRP3XQ^[QO:P!<0(_[-JK*@RJSXQ^8Q_a
MG"6#QENR$:>C'">'Q10;+FH);!MW)&^#A@W00 /0[02SH3RP!!ZTT?%9',GPz
MA%HR)+ .C%\ZQCW3 /_SVK4VVWG?L=>\'I<8)L: 0+VH6;FATC(14<=8E7]Jy
M.NH<-")+H;0D-_R$2W&W89X]I@[-0QL8?F $ DP4#%-R][6.=J>FXP:US($@x
M$VDP,I-$+&&T*@*!C$A2H!C=AJ A,^"U8,"$(XQ(.0.#.#:JDAI-G8R"2HNBw
M_(S (&A('FU&4R7"CA\]A+0AQIYU:$<+;%G(M1)&"RDNA>\:.B),,[,+@"H$v
M!GLF_-%GG@[8 R\:92I_=UO>I3Y/F5RD%WEL,II6UD0Z HK-16>'S& )7$LTu
MPG3[F"L+,P&A+ @)XL-5MP+@ARG74,1@]"["J'-8C&I&R*@,,1&U5^A'CQR1t
M:J6D\39&W@Y>[D0K#<;X#R"(+\TPWQ>U]!UP2Q?3(S(J;0;B%T;)/*JF.-._s
MA\H5&@5)%6)K4@6D+&">I<B+@M/ B9&4220G[E4\44:]R2>+-"U+ ]/?J##-r
MU1'3*J/'48$@TRPT#C0[X\3M1* (-?IQI.4I]JPHTF^;BD9&OVVP*, 2L?R7q
MIK3/\4Y?SXA+Q&(E9@J<1#-$03:'&6E2P-71.,B)2W2B[3"F]"\%+:71C'1!p
MO32DC4I.K,0Z/]$($Z#X4B-UA:>4R3%@QHG)D+5GJ27;\PP@ SC)Y57?B&<Io
M0&9 ?K)1/QAA"M9"'I8I!$J6ADU_S_F)XT9_MFU&B4NV ADSY-1+)D^H6N;.n
M\- >.C,ZD^)2,+@ VK,9\U*Z%($H^/QR*"TDAQDZ%O-.ZJ&0$*)XF65ULSOYm
MW,E*RU1-0MO/[5#A3/*8A(/#,8@V)M,[K3IW4-S58_67D47+$^3&#M@F6=4(l
M9T =3XC5#.7M\T(O)."T7VU,^T8&*N5F;S(+6756K*9@UFBF4+1@_&10&:\4k
M?XQ:J$Q(/1&A2UT1J@&PC%7_YF_JPV3%*YA&80:X(OI8F]?LL@ /C'!=,(PMj
M,0 +T%E?A#W'2QTK\=9'DG156X>(V]*(IDP'2HM#:V+7E0%$Q_HH#!.KFH-^i
MM:Q,PS!6K]2=>M&_W<4G/%L:K4/=VL2L)56!^%.WBB4N!9P !T /W^YJXNN1h
MD/!R[RM&MK7)&M)@ IIJR33ZHI8TC%O?%H #P !$M3O!1K/7[2.>X")=&5D&g
MA.TP(D;='#$[5"#8>,(64+?")8#$"5"EG0#"D'IH[A 0+ "'[4D]*VRT\*RBf
MT=%H643=7,,$&UVL%,3RU)-5M[2<&"YI3CGM'+XFKTG?]W(X 7$C/-$4@(CFe
M2XNM7U,99K7KG%9G"BR 6V#K6#X4MJ=B7#O9 $]?'3ZY*<8T%:<XE,TF8/@,d
M5_/6,I6/+0*8<!TED<WMO!-'-I.D9.<,3+9>;3ZK+%)V1V5F!P$*(A, 89 'c
M;79']6:[T5>V"P _>Z^L&7Z773N'>/;%R29 & %"GPW+_-EG0)Q]5JM*@HI-b
MP"29V4, !%U/.-H4$*0M:;O."70>P +D!)?V**A=^WQM<SS!:=L3GG:@34&/a
MVJ7VH2T"D!6]70>Q0AO9@82;+3^TT9%VH.U!Y[@L@%E@9YO:SJ'B!T.SS:IVz
MKNUG[]KK=:#]0FMD;'.4+5AT5&BT;1([P10N1=>U35\,F>)=.U?#$V9V.STEy
MW5Y:&723P@@VSPJ,K6BCUQ5B'@V*S:*)TC25D%9)C0,8FBJ6'K3'\S9RY,V/x
M'(Y=5,-7+&4 [:4X;OT#AQ@K^97[WI %MJ36_AE2K52#T^/#PDV>DBEFBJN w
MIN1Q6[78]3TK*#>,=4(!7LG['?PH%52C1E%> XO '\'U%8VN%-<J-W*M7,L0v
M'?4-%&Z[ :_)/2&;Q"9S0!^15Y_5<S:4'6@_V7^9:B)KU]SVA&P2G 3:\//Ju
MHZ94V5^0RBUH\\\8=@M53\S<-G?.O7.[SI3VZD-U%]W7X<V-<Q_=3G>H#3\Yt
MW:^VKZTHYKA:-['MFC#-](1L IQ<W2[ LQU#QPF^ECP%]JK=VW5WO3#>)S1Us
M^& RX=%Q(WK=1\L0,G8[<03L/[Z#C7TEKP="1M]L4%"6H]_@+#Y[TNV$!-'6r
M33QP=9N)>K:9</57]]1!<<@1@^53>TI#-\WM!EC>O(G2LFH[V+LV8QT"!=S7q
M#%7P7PX+;5XW8V45%QFP9)UP, YBM8R5 "0F..!BW7M+0+"WGV=:[I7SQ9  p
M?QQP_I4&2SIGEZZ$G5L5)FMH;16G58,HQW</-CSDTYG";"T4>5DN$."=*0AEo
M$9569F;+!!PA"MO.!II:J;C]I W>W YZ'4@3WBUU&R-RMY$_!SP8*V6EL5(Wn
M?1'WU+3HGO5-6Z'\X?9-U@C1([6,5%MCU^5"'@U155GT8^DM05"B5J3[O4LQm
MHXO.F-T-;0:%]']8> N@N2-=28/^AT+L5B90^-NQZ24R/#@U=S*!)5N/U D2l
M4C60&N O^,E"6Y>C##@=X( /5&;6Z6 =QBBO:/T-/0NL,ZM9J8D"$!\(1KW"k
M(-!M0-7I-"$?+8,[E)A$X6S, (8[,-327.PTA;-+_$N/K7:_)K^<_L8GA!0Hj
M0*(=$Y@QI8$1X!68< ?01.L5V*'P#=>I9]\0\$T4X!4T=-_&ZMU"-^&K!]) i
M>TL,*  :\H4057/ "%85YAA-^#C=P2RJ',,)$ 2< $V!NMT?7=LZ5?T\5FU[h
M<2/CT'\C3(@U)0C+@0 G@!$ B:?7>70Q78FKQF!5XJT@\A/0-2,.BCL!H_C\g
M/7Z;XN_'Z*$:0XPC]U=L@E<<_O<B_HF? $S *-Z!$Q"4>"V>/K<3N#C^;>JJf
M2F>'>0Q[6%DG0!0PBC_46;AGK1I[V3L@1&I*J\AY34AV5#4\(0 57M_ <8I*e
MK,P+I\P,\QA@*VMJ8MJRC#@$P0#&$'RF5LSI>+"\!LMIQ+('T01SS%!PZ#P%d
MN^/#;K-L,4/+D-S+H3$'"-5R&'PMUPY]@L6\+5=JW;(HW!30X[+TQ0P'AVH;c
MKKELJMW!@7 >?#70G^WR0H0X ,*"<$%.+WN"M!H-D0CC$?ERKP9(.,+]<J46b
M":O!M_*Q9@DK:P5SLX8P0VM2B2>!DM\0#?,H\3#?XZ.PQ&P*>VLBP$^.0US,a
MXQKN^@H_P1FPNL:NA<SNVBWL RCE-,2\=HY_ 5CY&+ RR\X;A14@"%(!(X%)z
MCO2^SGP%-[,S>[N=<V2(J*5\_B^TTOSMA5KIF0<X7Q3A,*KYP1&J#ZR0*+LLy
MM0DUUW%OHKPPP>GL4:">AG&T2&HZ"Z<OZZQ$QINTH]Q@[#G'284:5QGTCOLUx
MMD@;3)R^XV&Z-"HJN[-K*!:F%Z'Y=R%:O 'B16GNVI(/Q'-I+E_XSNO%+2I#w
M)-?UL@S D];71G3X*1RO%UE('W=#+-6V-63=#[*>@)QECA1PYK6B['F*-4I/v
MC.@=@+/@&A&!U5?'X W/#([*:-EMR@)N9GO=@00+,'P[UD9:Z9V8@DND7V[]u
M.,()5J4%_DX(XFB %HX;\>8PB#]F[ 'G\MEPSEH>C16'UH&9QW!?83+-G*>,t
MSOE%LH(G)MCG=/Z-_S^)LDA5+]_@ME'X+6MSY^+#=W[&?.%NP'CN[D(%YCF=s
MAIYW$FX DIV9L.?N^4&*!03A#!98DD(1Z*;:.1L>#U:T*.E-((H 30 VLP#Jr
MUCIU,-&ACSO8S)@L KP1( (^'5+3YH4V/3VZ[.BT&EG@HRLM@HJ2%9Z_Z -@q
M0:$SY.6C _E7N>5^=;D.8($G)LSH/_=SK.8^IC9C$J_F^IB*SNZXZ!:B"&!Tp
M2PM@N@D@IL,UQ?=8E9>'@'UY->F?^F<P5&,U0]$KX; DPS7X4+VU/!&/,D\Go
M>E[#'!#;>'4@\1O\$T5 B5 "R !D@/B@+^4U*Z;VS7V7 ?&TE>%C%^HBP*%>n
M!10!,D +L*@WZBS HSY/1.I"V:1N?2A.6'H)/0INZ>&QG;3#MI?9@]I6-<_Hm
M<*A+EJ:OZ1/Z@VYU0SGCMYJ^FM=)9G:3;CJ BI];AMML =DW.IG>FLSA[MR)l
MK#Y6D4 MFL!^[.>VB<1@I9O>'OH[X9LG)S_ZGK*M9Z,RQ*D>T3G1)V?7P>U k
ML>THZWDG\'HNV<PM$PB*Y;JI"\@):HHKXY #W 05!U4H.W 2R'JV[D[4Z8!$j
M3J"GQU#TRKT^L//I\DO\\J>O'H'Z/#&H']J8NJ:>J'OJC+JCOOJ4RM[H 3Z;i
MKSX/.X$8L0<!B'JG_JE;[#<0QEZ F^IU=TJE=C/K/P<@QR2Z?M Z<&J<4^NRh
MY[6NGKL3WWJW;ISD[$BZ,OI7CU6)N5,0!RM_ =^Z7G'X9^?WTSA6,>9$AZD;g
MI2=P*%F]GC3<ZU9US%XZ].M["L">%PSLP(K!7KU<+R7W/+&P Q(-^U=]J3?6f
MI4&F#K)OZHHZJ"ZJE[>7\LFNL6<*E?H[T;%;B!][R.ZIN^VK#ZE.D(;K*;O0e
M_:*S[$$[S"ZG Z=&>YWJ.!_GVV*U[DA@[3O[/O*;Z^R)"<\.N!?? 9][6JOGd
MYYMYXZZ<(^TK.^M9N$^%5KM.S<WIY\@Y?RXQ0.Y;N!<TGU/NW10U\KKW[&UZc
M5"M23M2F;DIM$JO)X#K=[E&O(&-R2"VNJS#F^*R,373EZW@/#)"W3+RR/.ZXb
M^>1O1% ND<]I^KBQ#)6SD6ZDGU8%!^0#P:#6E1/DB)H300-0R];R&,P#=.4/a
M^57H*D',WGOT;I&/RQCYD#RG;.3I<D>^+A]P(?FQ1Y+GP=/[!'[ 61!A0P:Qz
)%/AN%S7BIP  y
 x
end

daveb@gonzo.UUCP (Dave Brower) (12/06/88)

Save yourself 30 minutes of work.  Here are brute force patchable difs
to the posted SHAREWARE programs for UNIX.  It does seem to run the
vtest program OK on my 7300 at home.  (I gave up on the names.c program,
since it seemed to use MSC specific i/o, and I didn't want to figure it
out.)

Adding locking to this code is likely to be more complicated than people
think, unless they take the sleazy way out.  That is, you need to do
whole-file locks.  Otherwise, you will nedd to take into account index
rotation, splitting and the like, and this is enought of a pain that you
don't want to do it unless you absolutely need the conccurrency.

Speaking of concurrency, locking should be done external to the
provided routines.  When someone is doing a scan on a file, you don't
want the data moving underneath, so you need to hold a read lock the
whole time.  That means you need to do something like:

	lock( file, SHARABLE_LOCK );
	open...()
	while( get a record )
		...;
	close...()
	unlock( file );

Ditto writing, where you need to get an EXCLUSIVE lock on the whole file.

Anyway, good luck.

-dB

*** orig/bplus.c	Mon Dec  5 20:08:36 1988
--- bplus.c	Mon Dec  5 20:28:27 1988
***************
*** 17,22
  
  #include <stdio.h>
  #include <fcntl.h>
  #include <io.h>
  #include <sys\types.h>            /*  delete this line for Turbo C  */
  #include <sys\stat.h>

--- 17,23 -----
  
  #include <stdio.h>
  #include <fcntl.h>
+ # ifdef MSC
  #include <io.h>
  # else
  # define SEEK_SET	0
***************
*** 18,25
  #include <stdio.h>
  #include <fcntl.h>
  #include <io.h>
! #include <sys\types.h>            /*  delete this line for Turbo C  */
! #include <sys\stat.h>
  #include <string.h>
  #include "bplus.h"
  

--- 19,30 -----
  #include <fcntl.h>
  # ifdef MSC
  #include <io.h>
! # else
! # define SEEK_SET	0
! # define O_BINARY	0
! # endif
! #include <sys/types.h>            /*  delete this line for Turbo C  */
! #include <sys/stat.h>
  #include <string.h>
  #include "bplus.h"
  
***************
*** 23,29
  #include <string.h>
  #include "bplus.h"
  
- 
  /*  macros, constants, data types  */
  
  #define  NULLREC      (-1L)

--- 28,33 -----
  #include <string.h>
  #include "bplus.h"
  
  /*  macros, constants, data types  */
  
  #define  NULLREC      (-1L)
***************
*** 60,97
  int          split_size = IXB_SPACE;
  int          comb_size  = (IXB_SPACE/2);
  
! void pascal error(int, long);
! void pascal read_if(long, char *, int);
! void pascal write_if(int, long, char *, int);
! int  pascal creat_if(char *);
! int  pascal open_if(char *);
! void pascal close_if(int);
! void pascal update_block(void);
! void pascal init_cache(void);
! int  pascal find_cache(RECPOS);
! int  pascal new_cache(void);
! void pascal load_cache(RECPOS);
! void pascal get_cache(RECPOS);
! void pascal retrieve_block(int, RECPOS);
! int  pascal prev_entry(int);
! int  pascal next_entry(int);
! int  pascal copy_entry(ENTRY *, ENTRY *);
! int  pascal scan_blk(int);
! int  pascal last_entry(void);
! int  pascal write_free( RECPOS, BLOCK *);
! RECPOS pascal get_free(void);
! int  pascal find_block(ENTRY *, int *);
! void pascal movedown(BLOCK *, int, int);
! void pascal moveup(BLOCK *, int, int);
! void pascal ins_block(BLOCK *, ENTRY *, int);
! void pascal del_block(BLOCK *, int);
! int  pascal split(int, ENTRY *, ENTRY *);
! void pascal ins_level(int, ENTRY *);
! int  pascal insert_ix(ENTRY *, IX_DESC *);
! int  pascal find_ix(ENTRY *, IX_DESC *, int);
! int  pascal combineblk(RECPOS, int);
! void pascal replace_entry(ENTRY *);
! void print_blk(BLOCK *);
  
  
  /*  file I/O for B-PLUS module  */

--- 64,101 -----
  int          split_size = IXB_SPACE;
  int          comb_size  = (IXB_SPACE/2);
  
! void pascal error P((int, long));
! void pascal read_if P((long, char *, int));
! void pascal write_if P((int, long, char *, int));
! int  pascal creat_if P((char *));
! int  pascal open_if P((char *));
! void pascal close_if P((int));
! void pascal update_block P((void));
! void pascal init_cache P((void));
! int  pascal find_cache P((RECPOS));
! int  pascal new_cache P((void));
! void pascal load_cache P((RECPOS));
! void pascal get_cache P((RECPOS));
! void pascal retrieve_block P((int, RECPOS));
! int  pascal prev_entry P((int));
! int  pascal next_entry P((int));
! int  pascal copy_entry P((ENTRY *, ENTRY *));
! int  pascal scan_blk P((int));
! int  pascal last_entry P((void));
! int  pascal write_free P(( RECPOS, BLOCK *));
! RECPOS pascal get_free P((void));
! int  pascal find_block P((ENTRY *, int *));
! void pascal movedown P((BLOCK *, int, int));
! void pascal moveup P((BLOCK *, int, int));
! void pascal ins_block P((BLOCK *, ENTRY *, int));
! void pascal del_block P((BLOCK *, int));
! int  pascal split P((int, ENTRY *, ENTRY *));
! void pascal ins_level P((int, ENTRY *));
! int  pascal insert_ix P((ENTRY *, IX_DESC *));
! int  pascal find_ix P((ENTRY *, IX_DESC *, int));
! int  pascal combineblk P((RECPOS, int));
! void pascal replace_entry P((ENTRY *));
! void print_blk P((BLOCK *));
  
  # ifdef unix
  RECPOS filelength( fd )
***************
*** 93,98
  void pascal replace_entry(ENTRY *);
  void print_blk(BLOCK *);
  
  
  /*  file I/O for B-PLUS module  */
  

--- 97,111 -----
  void pascal replace_entry P((ENTRY *));
  void print_blk P((BLOCK *));
  
+ # ifdef unix
+ RECPOS filelength( fd )
+   int fd;
+   {
+     struct stat sb;
+     fstat( fd, &sb );
+     return( sb.st_size );
+   }
+ # endif
  
  
  /*  file I/O for B-PLUS module  */
***************
*** 94,99
  void print_blk(BLOCK *);
  
  
  /*  file I/O for B-PLUS module  */
  
  void pascal error(j, l)

--- 107,113 -----
    }
  # endif
  
+ 
  /*  file I/O for B-PLUS module  */
  
  void pascal error(j, l)
***************
*** 392,398
           pci->dx.ff = rt;
        }
      else
!       r = filelength (pci->ixfile);
      return (r);
    } /* get_free */
  

--- 406,412 -----
           pci->dx.ff = rt;
        }
      else
!       r = filelength(pci->ixfile);
      return (r);
    } /* get_free */
  
***************
*** 948,951
      insert_ix(pe, pci);
    } /* replace_entry */
  
! \032

--- 962,965 -----
      insert_ix(pe, pci);
    } /* replace_entry */
  
! 

*** orig/bplus.h	Mon Dec  5 20:08:36 1988
--- bplus.h	Mon Dec  5 20:13:39 1988
***************
*** 1,6
  
  /*  bplus.h - data structures and constants  */
  
  
  #define IX_OK       1
  #define IX_FAIL     0

--- 1,11 -----
  
  /*  bplus.h - data structures and constants  */
  
+ # ifdef _STDC_
+ # define	P(x)	x
+ # else
+ # define	P(x)	()
+ # endif
  
  # ifdef unix
  # define pascal
***************
*** 2,7
  /*  bplus.h - data structures and constants  */
  
  
  #define IX_OK       1
  #define IX_FAIL     0
  #define EOIX       (-2)

--- 7,17 -----
  # define	P(x)	()
  # endif
  
+ # ifdef unix
+ # define pascal
+ # define cdecl
+ # endif
+ 
  #define IX_OK       1
  #define IX_FAIL     0
  #define EOIX       (-2)
***************
*** 55,71
       IX_DISK  dx;
    }  IX_DESC;
  
! int cdecl open_index(char *,IX_DESC *, int);
! int cdecl close_index(IX_DESC *);
! int cdecl make_index(char *,IX_DESC *, int);
! int cdecl first_key(IX_DESC *);
! int cdecl last_key(IX_DESC *);
! int cdecl next_key(ENTRY *, IX_DESC *);
! int cdecl prev_key(ENTRY *, IX_DESC *);
! int cdecl find_key(ENTRY *, IX_DESC *);
! int cdecl add_key(ENTRY *, IX_DESC *);
! int cdecl locate_key(ENTRY *, IX_DESC *);
! int cdecl delete_key(ENTRY *, IX_DESC *);
! int cdecl find_exact(ENTRY *, IX_DESC *);
! 
! \032

--- 65,79 -----
       IX_DISK  dx;
    }  IX_DESC;
  
! int cdecl open_index P((char *,IX_DESC *, int));
! int cdecl close_index P((IX_DESC *));
! int cdecl make_index P((char *,IX_DESC *, int));
! int cdecl first_key P((IX_DESC *));
! int cdecl last_key P((IX_DESC *));
! int cdecl next_key P((ENTRY *, IX_DESC *));
! int cdecl prev_key P((ENTRY *, IX_DESC *));
! int cdecl find_key P((ENTRY *, IX_DESC *));
! int cdecl add_key P((ENTRY *, IX_DESC *));
! int cdecl locate_key P((ENTRY *, IX_DESC *));
! int cdecl delete_key P((ENTRY *, IX_DESC *));
! int cdecl find_exact P((ENTRY *, IX_DESC *));

*** orig/vtest.c	Mon Dec  5 20:08:37 1988
--- vtest.c	Mon Dec  5 20:17:25 1988
***************
*** 7,12
  #include "bplus.h"
  #include <stdio.h>
  #include <time.h>
  #include <conio.h>
  
  IX_DESC name1, name2;        /* index file variables */

--- 7,13 -----
  #include "bplus.h"
  #include <stdio.h>
  #include <time.h>
+ #ifdef MSC
  #include <conio.h>
  #endif
  
***************
*** 8,13
  #include <stdio.h>
  #include <time.h>
  #include <conio.h>
  
  IX_DESC name1, name2;        /* index file variables */
  

--- 9,15 -----
  #include <time.h>
  #ifdef MSC
  #include <conio.h>
+ #endif
  
  IX_DESC name1, name2;        /* index file variables */
  
***************
*** 100,103
      close_index(&name1);
      close_index(&name2);
    }
! \032

--- 102,106 -----
      close_index(&name1);
      close_index(&name2);
    }
! 
! 

-- 
If life was like the movies, the music would match the picture.

{sun,mtxinu,hoptoad}!rtech!gonzo!daveb		daveb@gonzo.uucp

seg@smsdpg.uu.net (Scott Garfinkle) (12/08/88)

From article <478@gonzo.UUCP>, by daveb@gonzo.UUCP (Dave Brower):
> Save yourself 30 minutes of work.


Save yourself even more work and buy C-tree.  Ok, so you pay $300, but
you get source that runs on just about anything (e.g. Mac, MS-DOS, VMS, Unix,
Xenix) and includes a database server package.  They even have add-on
packages for database dictionary, report generation, etc.

C-tree is made by Faircom (314) 445-6833.  "I have no financial interest.  I
just like the product."
		Scott E. Garfinkle
		SMS Data Products Group, Inc.
		uunet!smsdpg!seg (smsdpg!seg@uunet.uu.net)

		Standard disclaimer

davidsen@steinmetz.ge.com (William E. Davidsen Jr) (12/10/88)

In article <161@lakesys.UUCP> jamesd@lakesys.UUCP (James Dicke) writes:
| Since there were so many requests sent to me about B-TREE databases
| wanted after I had made the request myself - I will post the only
| one I received which was written for MS C 5.0 so it need a few 
| changes to work under XENIX.

It took quite a few to get it running under Xenix, and a few more for
SunOS and Ultrix. Here are the patches I used, two routines which didn't
work correctly in Xenix, and several test programs with a makefile.

The utest3 program builds a case insensitive index for the last word on
a line, while utest4 looks it up. If the input file has the result of
find, you can have a easy was to look up the location of any file, case
free. I hope that will be useful.

#!/bin/sh
# shar:	Shell Archiver  (v1.24)
#
#	Run the following text with /bin/sh to create:
#	  bplus.diff
#	  filelen.c
#	  memmove.c
#	  utest.c
#	  utest1.c
#	  utest2.c
#	  utest3.c
#	  utest4.c
#	  makefile
#
echo "x - extracting bplus.diff (Text)"
sed 's/^X//' << 'SHAR_EOF' > bplus.diff &&
X*** bplus.h.orig
X--- bplus.h
X**************
X*** 2,7
X  /*  bplus.h - data structures and constants  */
X  
X  
X  #define IX_OK       1
X  #define IX_FAIL     0
X  #define EOIX       (-2)
X--- 2,31 -----
X  /*  bplus.h - data structures and constants  */
X  
X  
X+ /* the next two lines delete the 'pascal' and 'cdecl' keywords
X+    to make the source compile on an ANSI compiler.
X+ */
X+ #ifndef	MSC		/* not Microsoft C */
X+ #define cdecl
X+ #define pascal
X+ #endif			/* MSC */
X+ 
X+ /* the following checks are to define things frequently not in
X+    UNIX compilers, since they are recent ANSI additions.
X+ */
X+ #ifndef SEEK_SET
X+ #define SEEK_SET	0
X+ #endif
X+ #ifndef O_BINARY
X+ #define O_BINARY	0
X+ #endif
X+ 
X+ #if	defined(ANSI_C) | defined(MSC) | defined(M_XENIX)
X+ #define Param(x) x
X+ #else
X+ #define Param(x) ()
X+ #endif	/* ANSI or PCC style decls */
X+ 
X  #define IX_OK       1
X  #define IX_FAIL     0
X  #define EOIX       (-2)
X**************
X*** 55,71
X       IX_DISK  dx;
X    }  IX_DESC;
X  
X! int cdecl open_index(char *,IX_DESC *, int);
X! int cdecl close_index(IX_DESC *);
X! int cdecl make_index(char *,IX_DESC *, int);
X! int cdecl first_key(IX_DESC *);
X! int cdecl last_key(IX_DESC *);
X! int cdecl next_key(ENTRY *, IX_DESC *);
X! int cdecl prev_key(ENTRY *, IX_DESC *);
X! int cdecl find_key(ENTRY *, IX_DESC *);
X! int cdecl add_key(ENTRY *, IX_DESC *);
X! int cdecl locate_key(ENTRY *, IX_DESC *);
X! int cdecl delete_key(ENTRY *, IX_DESC *);
X! int cdecl find_exact(ENTRY *, IX_DESC *);
X  
X  \032
X--- 79,89 -----
X       IX_DISK  dx;
X    }  IX_DESC;
X  
X! /* a few system procedure types here */
X! extern long filelength(), lseek(), tell();
X! extern char *mktemp();
X! extern int read(), write(), open(), close();
X! extern void exit(), memcpy();
X  
X  /* ================ external interface ================ */
X  int cdecl open_index Param((char *,IX_DESC *, int));
X**************
X*** 68,71
X  int cdecl delete_key(ENTRY *, IX_DESC *);
X  int cdecl find_exact(ENTRY *, IX_DESC *);
X  
X! \032
X--- 85,100 -----
X  extern int read(), write(), open(), close();
X  extern void exit(), memcpy();
X  
X! /* ================ external interface ================ */
X! int cdecl open_index Param((char *,IX_DESC *, int));
X! int cdecl close_index Param((IX_DESC *));
X! int cdecl make_index Param((char *,IX_DESC *, int));
X! int cdecl first_key Param((IX_DESC *));
X! int cdecl last_key Param((IX_DESC *));
X! int cdecl next_key Param((ENTRY *, IX_DESC *));
X! int cdecl prev_key Param((ENTRY *, IX_DESC *));
X! int cdecl find_key Param((ENTRY *, IX_DESC *));
X! int cdecl add_key Param((ENTRY *, IX_DESC *));
X! int cdecl locate_key Param((ENTRY *, IX_DESC *));
X! int cdecl delete_key Param((ENTRY *, IX_DESC *));
X! int cdecl find_exact Param((ENTRY *, IX_DESC *));
X*** bplus.c.orig
X--- bplus.c
X**************
X*** 17,22
X  
X  #include <stdio.h>
X  #include <fcntl.h>
X  #include <io.h>
X  #include <sys\types.h>            /*  delete this line for Turbo C  */
X  #include <sys\stat.h>
X--- 17,23 -----
X  
X  #include <stdio.h>
X  #include <fcntl.h>
X+ #ifdef	MSC
X  #include <io.h>
X  #endif
X  #include <sys/types.h>            /*  delete this line for Turbo C  */
X**************
X*** 18,25
X  #include <stdio.h>
X  #include <fcntl.h>
X  #include <io.h>
X! #include <sys\types.h>            /*  delete this line for Turbo C  */
X! #include <sys\stat.h>
X  #include <string.h>
X  #include "bplus.h"
X  
X--- 19,27 -----
X  #include <fcntl.h>
X  #ifdef	MSC
X  #include <io.h>
X! #endif
X! #include <sys/types.h>            /*  delete this line for Turbo C  */
X! #include <sys/stat.h>
X  #include <string.h>
X  #include "bplus.h"
X  
X**************
X*** 46,52
X                      /* must be used for Microsoft 5.0 */
X                      /* and the Quick C compiler.      */
X  
X! /* #define memcpy            memmove */
X  
X  /*  declare some global variables  */
X  
X--- 48,56 -----
X                      /* must be used for Microsoft 5.0 */
X                      /* and the Quick C compiler.      */
X  
X! #if	1
X! #define memcpy            memmove
X! #endif	/* if not needed */
X  
X  /*  declare some global variables  */
X  
X**************
X*** 60,97
X  int          split_size = IXB_SPACE;
X  int          comb_size  = (IXB_SPACE/2);
X  
X! void pascal error(int, long);
X! void pascal read_if(long, char *, int);
X! void pascal write_if(int, long, char *, int);
X! int  pascal creat_if(char *);
X! int  pascal open_if(char *);
X! void pascal close_if(int);
X! void pascal update_block(void);
X! void pascal init_cache(void);
X! int  pascal find_cache(RECPOS);
X! int  pascal new_cache(void);
X! void pascal load_cache(RECPOS);
X! void pascal get_cache(RECPOS);
X! void pascal retrieve_block(int, RECPOS);
X! int  pascal prev_entry(int);
X! int  pascal next_entry(int);
X! int  pascal copy_entry(ENTRY *, ENTRY *);
X! int  pascal scan_blk(int);
X! int  pascal last_entry(void);
X! int  pascal write_free( RECPOS, BLOCK *);
X! RECPOS pascal get_free(void);
X! int  pascal find_block(ENTRY *, int *);
X! void pascal movedown(BLOCK *, int, int);
X! void pascal moveup(BLOCK *, int, int);
X! void pascal ins_block(BLOCK *, ENTRY *, int);
X! void pascal del_block(BLOCK *, int);
X! int  pascal split(int, ENTRY *, ENTRY *);
X! void pascal ins_level(int, ENTRY *);
X! int  pascal insert_ix(ENTRY *, IX_DESC *);
X! int  pascal find_ix(ENTRY *, IX_DESC *, int);
X! int  pascal combineblk(RECPOS, int);
X! void pascal replace_entry(ENTRY *);
X! void print_blk(BLOCK *);
X  
X  
X  /*  file I/O for B-PLUS module  */
X--- 64,102 -----
X  int          split_size = IXB_SPACE;
X  int          comb_size  = (IXB_SPACE/2);
X  
X! /* ================ internal procedures ================ */
X! static void pascal error Param((int, long));
X! static void pascal read_if Param((RECPOS, char *, int));
X! static void pascal write_if Param((int, RECPOS, char *, int));
X! static int  pascal creat_if Param((char *));
X! static int  pascal open_if Param((char *));
X! static void pascal close_if Param((int));
X! static void pascal update_block Param((void));
X! static void pascal init_cache Param((void));
X! static int  pascal find_cache Param((RECPOS));
X! static int  pascal new_cache Param((void));
X! static void pascal load_cache Param((RECPOS));
X! static void pascal get_cache Param((RECPOS));
X! static void pascal retrieve_block Param((int, RECPOS));
X! static int  pascal prev_entry Param((int));
X! static int  pascal next_entry Param((int));
X! static void pascal copy_entry Param((ENTRY *, ENTRY *));
X! static int  pascal scan_blk Param((int));
X! static int  pascal last_entry Param((void));
X! static void pascal write_free Param(( RECPOS, BLOCK *));
X! static RECPOS pascal get_free Param((void));
X! static int  pascal find_block Param((ENTRY *, int *));
X! static void pascal movedown Param((BLOCK *, int, int));
X! static void pascal moveup Param((BLOCK *, int, int));
X! static void pascal ins_block Param((BLOCK *, ENTRY *, int));
X! static void pascal del_block Param((BLOCK *, int));
X! static void pascal split Param((int, ENTRY *, ENTRY *));
X! static void pascal ins_level Param((int, ENTRY *));
X! static int  pascal insert_ix Param((ENTRY *, IX_DESC *));
X! static int  pascal find_ix Param((ENTRY *, IX_DESC *, int));
X! static int  pascal combineblk Param((RECPOS, int));
X! static void pascal replace_entry Param((ENTRY *));
X! static void print_blk Param((BLOCK *));
X  
X  
X  /*  file I/O for B-PLUS module  */
X**************
X*** 96,102
X  
X  /*  file I/O for B-PLUS module  */
X  
X! void pascal error(j, l)
X    int j;
X    long l;
X    {
X--- 101,108 -----
X  
X  /*  file I/O for B-PLUS module  */
X  
X! static void pascal 
X! error(j, l)
X    int j;
X    long l;
X    {
X**************
X*** 103,109
X      static char *msg[3] = {"ERROR - CANNOT OPEN/CLOSE FILE",
X                             "ERROR WHILE READING FILE",
X                             "ERROR WHILE WRITING FILE"};
X!     printf("\n  %s - Record Number %ld\n", msg[j], l);
X      exit(1);
X    } /* error */
X  
X--- 109,115 -----
X      static char *msg[3] = {"ERROR - CANNOT OPEN/CLOSE FILE",
X                             "ERROR WHILE READING FILE",
X                             "ERROR WHILE WRITING FILE"};
X!     (void) printf("\n  %s - Record Number %ld\n", msg[j], l);
X      exit(1);
X    } /* error */
X  
X**************
X*** 108,115
X    } /* error */
X  
X  
X! void pascal read_if(start, buf, nwrt)
X!   long start;
X    char *buf;
X    int nwrt;
X    {
X--- 114,122 -----
X    } /* error */
X  
X  
X! static void pascal 
X! read_if(start, buf, nwrt)
X!   RECPOS start;
X    char *buf;
X    int nwrt;
X    {
X**************
X*** 120,126
X    } /* read_if */
X  
X  
X! void pascal write_if(handle, start, buf, nwrt)
X    int handle;
X    long start;
X    char *buf;
X--- 127,134 -----
X    } /* read_if */
X  
X  
X! static void pascal 
X! write_if(handle, start, buf, nwrt)
X    int handle;
X    RECPOS start;
X    char *buf;
X**************
X*** 122,128
X  
X  void pascal write_if(handle, start, buf, nwrt)
X    int handle;
X!   long start;
X    char *buf;
X    int nwrt;
X    {
X--- 130,136 -----
X  static void pascal 
X  write_if(handle, start, buf, nwrt)
X    int handle;
X!   RECPOS start;
X    char *buf;
X    int nwrt;
X    {
X**************
X*** 133,139
X    } /* write_if */
X  
X  
X! int pascal creat_if(fn)
X    char *fn;
X    {
X      int   ret;
X--- 141,148 -----
X    } /* write_if */
X  
X  
X! static int pascal 
X! creat_if(fn)
X    char *fn;
X    {
X      int   ret;
X**************
X*** 137,143
X    char *fn;
X    {
X      int   ret;
X!     ret = open(fn,O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE);
X      if (ret  < 0) error(0,0L);
X      return (ret);
X    } /* creat_if */
X--- 146,152 -----
X    char *fn;
X    {
X      int   ret;
X!     ret = open(fn,O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IREAD|S_IWRITE);
X      if (ret  < 0) error(0,0L);
X      return (ret);
X    } /* creat_if */
X**************
X*** 143,149
X    } /* creat_if */
X  
X  
X! int pascal open_if(fn)
X    char *fn;
X    {
X      int  ret;
X--- 152,159 -----
X    } /* creat_if */
X  
X  
X! static int pascal 
X! open_if(fn)
X    char *fn;
X    {
X      int  ret;
X**************
X*** 153,159
X    } /* open_if */
X  
X  
X! void pascal close_if(handle)
X    int handle;
X    {
X      if(close(handle) < 0)  error(2,0L);
X--- 163,170 -----
X    } /* open_if */
X  
X  
X! static void pascal 
X! close_if(handle)
X    int handle;
X    {
X      if(close(handle) < 0)  error(2,0L);
X**************
X*** 160,166
X    } /*  close_if */
X  
X  
X! int cdecl open_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X--- 171,178 -----
X    } /*  close_if */
X  
X  
X! int cdecl 
X! open_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X**************
X*** 179,185
X    } /* open_index */
X  
X  
X! int cdecl close_index(pix)
X    IX_DESC *pix;
X    {
X      int i;
X--- 191,198 -----
X    } /* open_index */
X  
X  
X! int cdecl 
X! close_index(pix)
X    IX_DESC *pix;
X    {
X      int i;
X**************
X*** 193,199
X                write_if(BUFHANDLE(i),
X                         BUFBLOCK(i).brec,
X                         (char *) &BUFBLOCK(i),
X!                        sizeof(BLOCK));
X                BUFDIRTY(i) = 0;
X              }
X            BUFBLOCK(i).brec = NULLREC;
X--- 206,212 -----
X                write_if(BUFHANDLE(i),
X                         BUFBLOCK(i).brec,
X                         (char *) &BUFBLOCK(i),
X!                        (int) sizeof(BLOCK));
X                BUFDIRTY(i) = 0;
X              }
X            BUFBLOCK(i).brec = NULLREC;
X**************
X*** 203,209
X    } /* close_index */
X  
X  
X! int cdecl make_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X--- 216,223 -----
X    } /* close_index */
X  
X  
X! int cdecl 
X! make_index(name, pix, dup)
X    char *name;
X    IX_DESC *pix;
X    int dup;
X**************
X*** 233,239
X  
X  /*  cache I/O for BPLUS  */
X  
X! void pascal update_block()
X    {
X      if (block_ptr != &(pci->root))
X         BUFDIRTY(cache_ptr) = 1;
X--- 247,254 -----
X  
X  /*  cache I/O for BPLUS  */
X  
X! static void pascal 
X! update_block()
X    {
X      if (block_ptr != &(pci->root))
X         BUFDIRTY(cache_ptr) = 1;
X**************
X*** 240,246
X    } /* update_block */
X  
X  
X! void pascal init_cache()
X    {
X      register int  j;
X      for (j = 0; j < NUM_BUFS; j++)
X--- 255,262 -----
X    } /* update_block */
X  
X  
X! static void pascal 
X! init_cache()
X    {
X      register int  j;
X      for (j = 0; j < NUM_BUFS; j++)
X**************
X*** 251,257
X    } /* init_cache */
X  
X  
X! int pascal find_cache(r)
X    RECPOS r;
X    {
X      register int  j;
X--- 267,274 -----
X    } /* init_cache */
X  
X  
X! static int pascal 
X! find_cache(r)
X    RECPOS r;
X    {
X      register int  j;
X**************
X*** 265,271
X    } /* find_cache */
X  
X  
X! int pascal new_cache()
X    {
X      register int  i;
X      i = (cache_ptr + 1) % NUM_BUFS;
X--- 282,289 -----
X    } /* find_cache */
X  
X  
X! static int pascal 
X! new_cache()
X    {
X      register int  i;
X      i = (cache_ptr + 1) % NUM_BUFS;
X**************
X*** 279,285
X    } /* new_cache */
X  
X  
X! void pascal load_cache(r)
X    RECPOS r;
X    {
X      cache_ptr = new_cache();
X--- 297,304 -----
X    } /* new_cache */
X  
X  
X! static void pascal 
X! load_cache(r)
X    RECPOS r;
X    {
X      cache_ptr = new_cache();
X**************
X*** 287,293
X    } /* load_cache */
X  
X  
X! void pascal get_cache(r)
X    RECPOS r;
X    {
X      if (find_cache(r) < 0)
X--- 306,313 -----
X    } /* load_cache */
X  
X  
X! static void pascal 
X! get_cache(r)
X    RECPOS r;
X    {
X      if (find_cache(r) < 0)
X**************
X*** 296,302
X    } /* get_cache */
X  
X  
X! void pascal retrieve_block(j, r)
X    int j;
X    RECPOS r;
X    {
X--- 316,323 -----
X    } /* get_cache */
X  
X  
X! static void pascal 
X! retrieve_block(j, r)
X    int j;
X    RECPOS r;
X    {
X**************
X*** 309,315
X  
X  /*  low level functions of BPLUS  */
X  
X! int pascal prev_entry(off)
X    int off;
X    {
X       if (off <= 0)
X--- 330,337 -----
X  
X  /*  low level functions of BPLUS  */
X  
X! static int pascal 
X! prev_entry(off)
X    int off;
X    {
X       if (off <= 0)
X**************
X*** 323,329
X    } /* prev_entry */
X  
X  
X! int pascal next_entry(off)
X    int off;
X    {
X       if (off == -1)
X--- 345,352 -----
X    } /* prev_entry */
X  
X  
X! static int pascal 
X! next_entry(off)
X    int off;
X    {
X       if (off == -1)
X**************
X*** 338,344
X    } /* next_entry */
X  
X  
X! int pascal copy_entry(to, from)
X    ENTRY *to;
X    ENTRY *from;
X    {
X--- 361,368 -----
X    } /* next_entry */
X  
X  
X! static void pascal 
X! copy_entry(to, from)
X    ENTRY *to;
X    ENTRY *from;
X    {
X**************
X*** 344,350
X    {
X      int me;
X      me = ENT_SIZE(from);
X!     memcpy(to, from, me);
X    } /* copy_entry */
X  
X  
X--- 368,374 -----
X    {
X      int me;
X      me = ENT_SIZE(from);
X!     (void) memcpy(to, from, me);
X    } /* copy_entry */
X  
X  
X**************
X*** 348,354
X    } /* copy_entry */
X  
X  
X! int pascal scan_blk(n)
X    int n;
X    {
X       register int off, last;
X--- 372,379 -----
X    } /* copy_entry */
X  
X  
X! static int pascal 
X! scan_blk(n)
X    int n;
X    {
X       register int off, last;
X**************
X*** 363,369
X    } /* scan_blk */
X  
X  
X! int pascal last_entry()
X    {
X       return( scan_blk(block_ptr->bend) );
X    } /* last_entry */
X--- 388,395 -----
X    } /* scan_blk */
X  
X  
X! static int pascal 
X! last_entry()
X    {
X       return( scan_blk(block_ptr->bend) );
X    } /* last_entry */
X**************
X*** 371,377
X  
X  /*  maintain list of free index blocks  */
X  
X! int pascal write_free(r, pb)
X    RECPOS r;
X    BLOCK *pb;
X    {
X--- 397,404 -----
X  
X  /*  maintain list of free index blocks  */
X  
X! static void pascal 
X! write_free(r, pb)
X    RECPOS r;
X    BLOCK *pb;
X    {
X**************
X*** 377,383
X    {
X      pb->p0 = FREE_BLOCK;
X      pb->brec = pci->dx.ff;
X!     write_if(pci->ixfile, r, (char *) pb, sizeof(BLOCK));
X      pci->dx.ff = r;
X    } /* write_free */
X  
X--- 404,410 -----
X    {
X      pb->p0 = FREE_BLOCK;
X      pb->brec = pci->dx.ff;
X!     write_if(pci->ixfile, r, (char *) (char *) pb, sizeof(BLOCK));
X      pci->dx.ff = r;
X    } /* write_free */
X  
X**************
X*** 382,388
X    } /* write_free */
X  
X  
X! RECPOS pascal get_free()
X    {
X      RECPOS  r, rt;
X  
X--- 409,416 -----
X    } /* write_free */
X  
X  
X! static RECPOS pascal 
X! get_free()
X    {
X      RECPOS  r, rt;
X  
X**************
X*** 388,394
X  
X      r = pci->dx.ff;
X      if ( r != NULLREC )
X!       {  read_if(r, (char *)&rt, sizeof( RECPOS ));
X           pci->dx.ff = rt;
X        }
X      else
X--- 416,422 -----
X  
X      r = pci->dx.ff;
X      if ( r != NULLREC )
X!       {  read_if(r, (char *)&rt, (int) sizeof( RECPOS ));
X           pci->dx.ff = rt;
X        }
X      else
X**************
X*** 399,405
X  
X  /*  general BPLUS block level functions  */
X  
X! int pascal find_block(pe, poff)
X    ENTRY *pe;
X    int *poff;
X    {
X--- 427,434 -----
X  
X  /*  general BPLUS block level functions  */
X  
X! static int pascal 
X! find_block(pe, poff)
X    ENTRY *pe;
X    int *poff;
X    {
X**************
X*** 425,431
X    } /* find_block */
X  
X  
X! void pascal movedown(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X--- 454,461 -----
X    } /* find_block */
X  
X  
X! static void pascal 
X! movedown(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X**************
X*** 436,442
X    } /* movedown */
X  
X  
X! void pascal moveup(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X--- 466,473 -----
X    } /* movedown */
X  
X  
X! static void pascal 
X! moveup(pb, off, n)
X    BLOCK *pb;
X    int off;
X    int n;
X**************
X*** 447,453
X    } /* moveup */
X  
X  
X! void pascal ins_block(pb, pe, off)
X    BLOCK *pb;
X    ENTRY *pe;
X    int off;
X--- 478,485 -----
X    } /* moveup */
X  
X  
X! static void pascal 
X! ins_block(pb, pe, off)
X    BLOCK *pb;
X    ENTRY *pe;
X    int off;
X**************
X*** 460,466
X    } /* ins_block */
X  
X  
X! void pascal del_block(pb, off)
X    BLOCK *pb;
X    int off;
X    {
X--- 492,499 -----
X    } /* ins_block */
X  
X  
X! static void pascal 
X! del_block(pb, off)
X    BLOCK *pb;
X    int off;
X    {
X**************
X*** 473,479
X  
X  /*  position at start/end of index  */
X  
X! int cdecl first_key(pix)
X    IX_DESC *pix;
X    {
X      pci = pix;
X--- 506,513 -----
X  
X  /*  position at start/end of index  */
X  
X! int cdecl 
X! first_key(pix)
X    IX_DESC *pix;
X    {
X      pci = pix;
X**************
X*** 490,496
X    } /* first_key */
X  
X  
X! int cdecl last_key(pix)
X    IX_DESC *pix;
X    {
X      long  ads;
X--- 524,531 -----
X    } /* first_key */
X  
X  
X! int cdecl 
X! last_key(pix)
X    IX_DESC *pix;
X    {
X      long  ads;
X**************
X*** 510,516
X  
X  /*  get next, previous entries  */
X  
X! int cdecl next_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 545,552 -----
X  
X  /*  get next, previous entries  */
X  
X! int cdecl 
X! next_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 544,550
X    } /* next_key */
X  
X  
X! int cdecl prev_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 580,587 -----
X    } /* next_key */
X  
X  
X! int cdecl 
X! prev_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 582,588
X  
X  /*  insert new entries into tree  */
X  
X! int pascal split(l, pe, e)
X    int l;
X    ENTRY *pe;
X    ENTRY *e;
X--- 619,626 -----
X  
X  /*  insert new entries into tree  */
X  
X! static void pascal 
X! split(l, pe, e)
X    int l;
X    ENTRY *pe;
X    ENTRY *e;
X**************
X*** 622,628
X    } /* split */
X  
X  
X! void pascal ins_level(l, e)
X    int l;
X    ENTRY *e;
X    {
X--- 660,667 -----
X    } /* split */
X  
X  
X! static void pascal 
X! ins_level(l, e)
X    int l;
X    ENTRY *e;
X    {
X**************
X*** 647,653
X    } /* ins_level */
X  
X  
X! int pascal insert_ix(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 686,693 -----
X    } /* ins_level */
X  
X  
X! static int pascal 
X! insert_ix(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 691,697
X  
X  /*  BPLUS find and add key functions  */
X  
X! int pascal find_ix(pe, pix, find)
X    ENTRY *pe;
X    IX_DESC *pix;
X    int find;
X--- 731,738 -----
X  
X  /*  BPLUS find and add key functions  */
X  
X! static int pascal 
X! find_ix(pe, pix, find)
X    ENTRY *pe;
X    IX_DESC *pix;
X    int find;
X**************
X*** 717,723
X     } /* find_ix */
X  
X  
X! int cdecl find_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 758,765 -----
X     } /* find_ix */
X  
X  
X! int cdecl 
X! find_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 728,734
X    } /* find_key */
X  
X  
X! int cdecl add_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 770,777 -----
X    } /* find_key */
X  
X  
X! int cdecl 
X! add_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 740,746
X    } /* add_key */
X  
X  
X! int cdecl locate_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 783,790 -----
X    } /* add_key */
X  
X  
X! int cdecl 
X! locate_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 753,759
X    } /* locate_key */
X  
X  
X! int cdecl find_exact(pe, pix)
X    ENTRY *pe;
X    IX_DESC * pix;
X    {
X--- 797,804 -----
X    } /* locate_key */
X  
X  
X! int cdecl 
X! find_exact(pe, pix)
X    ENTRY *pe;
X    IX_DESC * pix;
X    {
X**************
X*** 778,784
X  
X  /* BPLUS delete key functions */
X  
X! int cdecl delete_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X--- 823,830 -----
X  
X  /* BPLUS delete key functions */
X  
X! int cdecl 
X! delete_key(pe, pix)
X    ENTRY *pe;
X    IX_DESC *pix;
X    {
X**************
X*** 831,837
X    } /* delete_key */
X  
X  
X! int pascal combineblk(ads, size)
X    RECPOS ads;
X    int size;
X    {
X--- 877,884 -----
X    } /* delete_key */
X  
X  
X! static int pascal 
X! combineblk(ads, size)
X    RECPOS ads;
X    int size;
X    {
X**************
X*** 938,944
X    } /* combineblk */
X  
X  
X! void pascal replace_entry(pe)
X    ENTRY *pe;
X    {
X      retrieve_block(pci->level, CB(pci->level));
X--- 985,992 -----
X    } /* combineblk */
X  
X  
X! static void pascal 
X! replace_entry(pe)
X    ENTRY *pe;
X    {
X      retrieve_block(pci->level, CB(pci->level));
X**************
X*** 947,951
X      prev_entry(CO(pci->level));
X      insert_ix(pe, pci);
X    } /* replace_entry */
X- 
X- \032
X--- 995,997 -----
X      prev_entry(CO(pci->level));
X      insert_ix(pe, pci);
X    } /* replace_entry */
SHAR_EOF
chmod 0644 bplus.diff || echo "restore of bplus.diff fails"
echo "x - extracting filelen.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > filelen.c &&
X/*****************************************************************
X |  filelength - returns the length of a file
X ****************************************************************/
X
Xlong  filelength (fd)
X    int  fd;
X{
X#if	0		/* original version */
X    long  orig, last, lseek();
X
X    orig = lseek (fd, 0L, 1);		/* seek to the current position */
X    last = lseek (fd, 0L, 2);		/* seek to the end */
X    lseek (fd, orig, 0);		/* reset the pointer */
X
X    return last;
X#else			/* new network version */
X#include <fcntl.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X    struct stat sb;
X    fstat(fd, &sb);
X    return sb.st_size;
X#endif
X}
SHAR_EOF
chmod 0644 filelen.c || echo "restore of filelen.c fails"
echo "x - extracting memmove.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > memmove.c &&
X/*****************************************************************
X |  memmove - move in memory with attention to order and overlap
X |----------------------------------------------------------------
X |  Arguments:
X |   1) destination: char *
X |   2) source: char *
X |   3) length: int
X |  Returns: none
X ****************************************************************/
X
Xvoid memmove (to, from, length)
X    char *to, *from;
X    int  length;
X{
X    register char *TO, *FROM;
X
X    if (to < from) {
X    /* move left to right */
X	TO = to;
X	FROM = from;
X	while (length--)
X	    *(TO++) = *(FROM++);
X    }
X    else {
X    /* move right to left */
X	TO = to + length - 1;
X	FROM = from + length - 1;
X	while (length--)
X	    *(TO--) = *(FROM--);
X    }
X}
SHAR_EOF
chmod 0644 memmove.c || echo "restore of memmove.c fails"
echo "x - extracting utest.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X   The keys are printed in order after the data has been read.
X*/
X
X#include <stdio.h>
X#include "bplus.h"
X
Xmain() {
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[80];
X  int stat;
X
X  if (make_index("names.idx", ixptr, 0) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (fgets(line, 80, stdin) != NULL) {
X    line[strlen(line)-1] = 0;
X    strcpy(wk.key, line);
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key\n", stat);
X      exit(0);
X    }
X  }
X
X  /* dump the file */
X  first_key(ixptr);
X  while (next_key(ep, ixptr) == IX_OK) {
X    printf("%s\n", wk.key);
X  }
X  close_index(ixptr);
X}
SHAR_EOF
chmod 0644 utest.c || echo "restore of utest.c fails"
echo "x - extracting utest1.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest1.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X
X   The key value is the last non-blank data in the input record. This
X   works well using the output of "ls -l" as input.
X
X   After the index has been built, the keys are read in order, the
X   record position is used to access the complete data record, and
X   the data record is displayed.
X*/
X
X#include <stdio.h>
X#include "bplus.h"
X
X#define DUPflag		1		/* allow dups */
X#define LineSize	180		/* input max line */
Xmain(argc, argv)
X  int argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[LineSize];
X  FILE *infile, *fopen();
X  long filepos, ftell();
X  int stat, pos, rcount = 0;
X
X  if (argc < 2) {
X    printf("Missing filename\n");
X    exit(1);
X  }
X
X  if ((infile = fopen(argv[1], "r")) == NULL) {
X    printf("Can't open input file %s\n", argv[1]);
X    exit(1);
X  }
X  
X  if (make_index("names.idx", ixptr, DUPflag) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (filepos = ftell(infile), fgets(line, LineSize, infile) != NULL) {
X    rcount++;
X    pos = strlen(line) - 1;
X    line[pos] = 0;
X    while (pos && line[pos-1] != ' ') pos--;
X    strcpy(wk.key, &line[pos]);
X    wk.recptr = filepos;
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key at record %d\n", stat, rcount);
X      exit(0);
X    }
X  }
X
X  /* dump the file */
X  first_key(ixptr);
X  while (next_key(ep, ixptr) == IX_OK) {
X    fseek(infile, wk.recptr, 0);
X    fgets(line, LineSize, infile);
X    printf("%s", line);
X  }
X  
X  close_index(ixptr);
X  fclose(infile);
X}
SHAR_EOF
chmod 0644 utest1.c || echo "restore of utest1.c fails"
echo "x - extracting utest2.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest2.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X
X   The key value is the last non-blank data in the input record. This
X   works well using the output of "ls -l" as input. Keys are stored
X   without regard to case.
X
X   After the index has been built, the keys are read in order, the
X   record position is used to access the complete data record, and
X   the data record is displayed.
X*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include "bplus.h"
X
X#define DUPflag		1		/* allow dups */
X#define LineSize	180		/* input max line */
Xmain(argc, argv)
X  int argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[LineSize];
X  FILE *infile, *fopen();
X  long filepos, ftell();
X  int stat, pos, rcount = 0, wkch, wkpos;
X
X  if (argc < 2) {
X    printf("Missing filename\n");
X    exit(1);
X  }
X
X  if ((infile = fopen(argv[1], "r")) == NULL) {
X    printf("Can't open input file %s\n", argv[1]);
X    exit(1);
X  }
X  
X  if (make_index("names.idx", ixptr, DUPflag) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (filepos = ftell(infile), fgets(line, LineSize, infile) != NULL) {
X    rcount++;
X    pos = strlen(line) - 1;
X    line[pos] = 0;
X    while (pos && line[pos-1] != ' ' && line[pos-1] != '/') pos--;
X    
X    /* this forces the sort key into lower case */
X    for (wkpos=pos; wkch = line[wkpos]; wkpos++) {
X      if (isupper(wkch)) line[wkpos] = tolower(wkch);
X    }
X
X    strcpy(wk.key, &line[pos]);
X    wk.recptr = filepos;
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key at record %d\n", stat, rcount);
X      exit(0);
X    }
X  }
X
X  /* dump the file */
X  first_key(ixptr);
X  while (next_key(ep, ixptr) == IX_OK) {
X    fseek(infile, wk.recptr, 0);
X    fgets(line, LineSize, infile);
X    printf("%s", line);
X  }
X  
X  close_index(ixptr);
X  fclose(infile);
X}
SHAR_EOF
chmod 0644 utest2.c || echo "restore of utest2.c fails"
echo "x - extracting utest3.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest3.c &&
X/* UNIX test, pipe the output of "find" into this and get a sorted list
X
X   The key value is the last non-blank data in the input record. This
X   works well using the output of "ls -l" as input. Keys are stored
X   without regard to case.
X*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include "bplus.h"
X
X#define DUPflag		1		/* allow dups */
X#define LineSize	180		/* input max line */
Xmain(argc, argv)
X  int argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char line[LineSize];
X  FILE *infile, *fopen();
X  long filepos, ftell();
X  int stat, pos, rcount = 0, wkch, wkpos;
X
X  if (argc < 2) {
X    printf("Missing filename\n");
X    exit(1);
X  }
X
X  if ((infile = fopen(argv[1], "r")) == NULL) {
X    printf("Can't open input file %s\n", argv[1]);
X    exit(1);
X  }
X  
X  if (make_index("names.idx", ixptr, DUPflag) != IX_OK) {
X     perror("Make index");
X     exit(1);
X  }
X  
X  while (filepos = ftell(infile), fgets(line, LineSize, infile) != NULL) {
X    rcount++;
X    pos = strlen(line) - 1;
X    line[pos] = 0;
X    while (pos && line[pos-1] != ' ' && line[pos-1] != '/') pos--;
X    
X    /* this forces the sort key into lower case */
X    for (wkpos=pos; wkch = line[wkpos]; wkpos++) {
X      if (isupper(wkch)) line[wkpos] = tolower(wkch);
X    }
X
X    strcpy(wk.key, &line[pos]);
X    wk.recptr = filepos;
X    if ((stat = add_key(ep, ixptr)) != IX_OK) {
X      printf("Status %d from add_key at record %d\n", stat, rcount);
X      exit(0);
X    }
X  }
X
X  close_index(ixptr);
X  fclose(infile);
X}
SHAR_EOF
chmod 0644 utest3.c || echo "restore of utest3.c fails"
echo "x - extracting utest4.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utest4.c &&
X/* UNIX B+tree test, read a database created by the utest3 program and
X   display records matching given keys
X*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include "bplus.h"
X
X#define DUPflag		1	/* allow dups */
X#define LineSize	180	/* input max line */
X
Xmain (argc, argv)
X  int  argc;
X  char *argv[];
X{
X  ENTRY wk, *ep = &wk;
X  IX_DESC pix, *ixptr = &pix;
X  char  line[LineSize], MyKey[MAXKEY];
X  char *fgets();
X  FILE *infile, *fopen ();
X  long  filepos, ftell ();
X  int  stat, pos, rcount = 0, wkch, wkpos;
X
X  if (argc < 2) {
X    printf ("Missing filename\n");
X    exit (1);
X  }
X
X  if ((infile = fopen (argv[1], "r")) == NULL) {
X    printf ("Can't open input file %s\n", argv[1]);
X    exit (1);
X  }
X
X  if (open_index ("names.idx", ixptr, DUPflag) != IX_OK) {
X    perror ("Open index");
X    exit (1);
X  }
X
X /* dump the file */
X  for (;;) {
X    printf ("Filename: ");
X    if (fgets (MyKey, MAXKEY, stdin) == NULL) break;
X    MyKey[pos = strlen (MyKey) - 1] = 0;
X    if (pos == 0) break;
X    for (pos = 0; wkch = MyKey[pos]; pos++) {
X      if (isupper (wkch))
X	MyKey[pos] = tolower (wkch);
X    }
X    /* insure readable output if input is from a pipe */
X    if (!isatty(0)) printf("%s\n", MyKey);
X
X  /* get the first matching key */
X    strcpy (wk.key, MyKey);
X    if (find_key (ep, ixptr) == IX_OK) {
X    /* at least one matching key */
X      fseek (infile, wk.recptr, 0);
X      fgets (line, LineSize, infile);
X      printf ("%s", line);
X
X    /* now look for more duplicates */
X      while (next_key (ep, ixptr) == IX_OK && strcmp (wk.key, MyKey) == 0) {
X      /* display all duplicate keys */
X	fseek (infile, wk.recptr, 0);
X	fgets (line, LineSize, infile);
X	printf ("%s", line);
X      }
X    }
X  }
X
X  close_index (ixptr);
X  fclose (infile);
X}
SHAR_EOF
chmod 0644 utest4.c || echo "restore of utest4.c fails"
echo "x - extracting makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > makefile &&
X# makefile for UNIX bplus test
X
XLIB		= bplus.o filelen.o memmove.o
XTESTS		= utest utest1 utest2 utest3 utest4
XTESTOBJ		= utest.o utest1.o utest2.o utest3.o utest4.o
XCFLAGS		= -O
X
Xall: $(TESTS)
X
X$(TESTS): bplus.a $$@.o
X	cc -o $@ $@.o bplus.a
X
Xbplus.o:	bplus.h
X$(TESTOBJ):	bplus.h
X
Xbplus.a: $(LIB)
X	ar rv bplus.a $?
X	ranlib bplus.a
SHAR_EOF
chmod 0644 makefile || echo "restore of makefile fails"
exit 0

-- 
	bill davidsen		(wedu@ge-crd.arpa)
  {uunet | philabs}!steinmetz!crdos1!davidsen
"Stupidity, like virtue, is its own reward" -me

rfarris@serene.UUCP (Rick Farris) (12/12/88)

I've noticed quite a few source postings in regular newsgroups
recently.  Usually they say something like "This just can't wait for
<insert name of moderator> to get it up."

Is that a good excuse to post source to a discussion group?
-- 
Rick Farris   RF Engineering  POB M  Del Mar, CA  92014   voice (619) 259-6793
rfarris@serene.cts.com     ...!uunet!serene!rfarris       serene.UUCP 259-7757

mcdonald@uxe.cso.uiuc.edu (12/12/88)

>I've noticed quite a few source postings in regular newsgroups
>recently.  Usually they say something like "This just can't wait for
><insert name of moderator> to get it up."

>Is that a good excuse to post source to a discussion group?

Yes. Absolutely. 

debra@alice.UUCP (Paul De Bra) (12/12/88)

In article <201@serene.UUCP> rfarris@serene.cts.com (Rick Farris) writes:
>
>I've noticed quite a few source postings in regular newsgroups
>recently.  Usually they say something like "This just can't wait for
><insert name of moderator> to get it up."
>
>Is that a good excuse to post source to a discussion group?

The normal procedure would be to post a message in the discussion group
stating that you posted some source to the appropriate source group and
that everyone can read it there.

Unfortunately for some groups that message should say "I submitted it to
<insert name of moderator> and you will be able to read it there in about
4 months." Clearly the link with the discussion will be gone by then.

So I would consider posting sources in discussion groups justified if the
appropriate source groups have a very long delay.

Paul.
-- 
------------------------------------------------------
|debra@research.att.com   | uunet!research!debra     |
------------------------------------------------------

rfarris@serene.UUCP (Rick Farris) (12/13/88)

In article <8524@alice.UUCP> debra@alice.UUCP () writes:
`
`The normal procedure would be to post a message in the discussion group
`stating that you posted some source to the appropriate source group and
`that everyone can read it there.
`
`Unfortunately for some groups that message should say "I submitted it to
`<insert name of moderator> and you will be able to read it there in about
`4 months." Clearly the link with the discussion will be gone by then.
`
`So I would consider posting sources in discussion groups justified if the
`appropriate source groups have a very long delay.
`

I'm new to the net, and I'm really just learning the ropes, but I
thought that the reason for having moderators on the source groups
was so that some sort of weeding could take place, so that you could
be assured that what was posted was of *some* worth.

It seems to me that uncontrolled posting short-circuits this process.
Shouldn't uncontrolled source posting go to an un-moderated source
group like alt.sources?  Isn't that what alt.sources is for?

Then there could be a pointer in the appropriate news group
mentioning that the source had been posted.

But what do I know?
:-)
-- 
Rick Farris   RF Engineering  POB M  Del Mar, CA  92014   voice (619) 259-6793
rfarris@serene.cts.com     ...!uunet!serene!rfarris       serene.UUCP 259-7757

john@uw-nsr.UUCP (John Sambrook) (12/16/88)

In article <225800100@uxe.cso.uiuc.edu> mcdonald@uxe.cso.uiuc.edu writes:
>
>>I've noticed quite a few source postings in regular newsgroups
>>recently.  Usually they say something like "This just can't wait for
>><insert name of moderator> to get it up."
>
>>Is that a good excuse to post source to a discussion group?
>
>Yes. Absolutely. 

Don't forget that postings to regular newsgroups may not be archived.
One nice feature of source newsgroups is that you at least have some
idea of where to start your search for latest version of the software
you want.

There is a lot to be said for order, and for the services provided
by the source newsgroup moderators.  Let's not circumvent their efforts.

-- 
John Sambrook                        Internet: john@nsr.bioeng.washington.edu
University of Washington RC-05           UUCP: uw-nsr!john
Seattle, Washington  98195               Dial: (206) 548-4386

root@radar.UUCP (root) (12/17/88)

In article <205@serene.UUCP> rfarris@serene.cts.com (Rick Farris) writes:
>I'm new to the net, and I'm really just learning the ropes, but I
>thought that the reason for having moderators on the source groups
>was so that some sort of weeding could take place, so that you could
>be assured that what was posted was of *some* worth.
>
>It seems to me that uncontrolled posting short-circuits this process.

There are too many moderated groups. Some moderated groups have been shut down
because for one reason or another the moderator is no longer around (eg comp.unix).
The net has always encouraged circumventing authority when it was necessary.