From 3bb2bbd68419ce4e777a89bf43ea7e5781dd787f Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 1 Jul 2008 01:57:36 +0000 Subject: [PATCH] awk: fix a case with multiple -f options. simplify -f file reading. function old new delta parse_expr 833 841 +8 qrealloc 33 36 +3 next_input_file 203 198 -5 afopen 22 - -22 ftello 41 - -41 ftell 41 - -41 __GI_ftell 41 - -41 awk_main 1002 944 -58 ------------------------------------------------------------------------------ (add/remove: 0/4 grow/shrink: 2/2 up/down: 11/-208) Total: -197 bytes text data bss dec hex filename 804232 610 6804 811646 c627e busybox_old 804120 610 6804 811534 c620e busybox_unstripped --- editors/awk.c | 48 +++++++++++++++++---------------------- testsuite/awk.tests | 7 ++++++ testsuite/awk_t1.tar.bz2 | Bin 0 -> 15955 bytes 3 files changed, 28 insertions(+), 27 deletions(-) create mode 100644 testsuite/awk_t1.tar.bz2 diff --git a/editors/awk.c b/editors/awk.c index fef3246b8..cc5dc84b5 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -681,11 +681,6 @@ static ALWAYS_INLINE int isalnum_(int c) return (isalnum(c) || c == '_'); } -static FILE *afopen(const char *path, const char *mode) -{ - return (*path == '-' && *(path+1) == '\0') ? stdin : xfopen(path, mode); -} - /* -------- working with variables (set/get/copy/etc) -------- */ static xhash *iamarray(var *v) @@ -2740,7 +2735,7 @@ static rstream *next_input_file(void) ind = getvar_s(incvar(intvar[ARGIND])); fname = getvar_s(findvar(iamarray(intvar[ARGV]), ind)); if (fname && *fname && !is_assignment(fname)) - F = afopen(fname, "r"); + F = xfopen_stdin(fname); } } while (!F); @@ -2757,8 +2752,9 @@ int awk_main(int argc, char **argv) { unsigned opt; char *opt_F, *opt_W; - llist_t *opt_v = NULL; - int i, j, flen; + llist_t *list_v = NULL; + llist_t *list_f = NULL; + int i, j; var *v; var tv; char **envp; @@ -2816,35 +2812,33 @@ int awk_main(int argc, char **argv) *s1 = '='; } } - opt_complementary = "v::"; - opt = getopt32(argv, "F:v:f:W:", &opt_F, &opt_v, &g_progname, &opt_W); + opt_complementary = "v::f::"; /* -v and -f can occur multiple times */ + opt = getopt32(argv, "F:v:f:W:", &opt_F, &list_v, &list_f, &opt_W); argv += optind; argc -= optind; if (opt & 0x1) setvar_s(intvar[FS], opt_F); // -F - while (opt_v) { /* -v */ - if (!is_assignment(llist_pop(&opt_v))) + while (list_v) { /* -v */ + if (!is_assignment(llist_pop(&list_v))) bb_show_usage(); } - if (opt & 0x4) { // -f - char *s = s; /* die, gcc, die */ - FILE *from_file = afopen(g_progname, "r"); - /* one byte is reserved for some trick in next_token */ - if (fseek(from_file, 0, SEEK_END) == 0) { - flen = ftell(from_file); - s = xmalloc(flen + 4); - fseek(from_file, 0, SEEK_SET); - i = 1 + fread(s + 1, 1, flen, from_file); - } else { + if (list_f) { /* -f */ + do { + char *s = NULL; + FILE *from_file; + + g_progname = llist_pop(&list_f); + from_file = xfopen_stdin(g_progname); + /* one byte is reserved for some trick in next_token */ for (i = j = 1; j > 0; i += j) { s = xrealloc(s, i + 4096); j = fread(s + i, 1, 4094, from_file); } - } - s[i] = '\0'; - fclose(from_file); - parse_program(s + 1); - free(s); + s[i] = '\0'; + fclose(from_file); + parse_program(s + 1); + free(s); + } while (list_f); } else { // no -f: take program from 1st parameter if (!argc) bb_show_usage(); diff --git a/testsuite/awk.tests b/testsuite/awk.tests index 91657418d..f69da2cc9 100755 --- a/testsuite/awk.tests +++ b/testsuite/awk.tests @@ -17,4 +17,11 @@ testing "awk -F case 5" "awk -F '[#]' '{ print NF }'" "4\n" "" "#abc##zz\n" testing "awk -F case 6" "awk -F '[#]' '{ print NF }'" "4\n" "" "z#abc##zz\n" testing "awk -F case 7" "awk -F '[#]' '{ print NF }'" "5\n" "" "z##abc##zz\n" +tar xjf awk_t1.tar.bz2 +testing "awk 'gcc build bug'" \ + "awk -f awk_t1_opt-functions.awk -f awk_t1_opth-gen.awk >*@0QUhk@tFQbsD9q!|meY>-S#Y?;0 z=hS_>=D^|TJ-++9JKpO1=H;mS<-U3MzVEI+`P}=3YFhhrZ?FKMH{Na?zPGzNyU%;? zc=-DEYv|kV2RW%7%X;^;*TG4F-S!dVl}`1W6zSXn-Kmr8LboO*V;`CZ44IMAOnV+DD*(XaS=^ zAt4EqKur>4dVx~t!B_UMP6A?)S4O3Ks_YwW;{HI#QVjWAZiV2FUCTdcaXo@JRDu$?-q6%mz zrdk4~Ng;$EnJ(Y{Y}urH)ua<&-j9XYfe+{B~3e5ANi9MmhgYpDkO&( z!UTT0q!P+mj^D}5C>b%dK?#mWnY-Mhd{HtNkVQVU^BQ>nhYlChm>2mM{POmjFL5y#lciq=KNZU? z+oP_s%+I`n+S~E%dk=iBnL4=J>w2d*l%{jM(|^{kV246BSq-D(7hzq*qFKQc!p&Vz z`do6O1*UmfXLgBpNY0#;#FvP*NZM{;V;bE^C1>`P%QSW!9%M8ZtFj-;xQiRdZ8kfr zQj|mIyvsHsNhWkz&bGcU12nKn)qFQwbIDJZ{pk19S4mDCU-rJ z?siY_r@ls;G0YyP(K)@q>xRkbkD1s$5OuS|DWJ;hW%l-Gc!Uii(Sa;yc?V)9h($V; znt9V5t&SM%zr?&3^zNR+hnC8>Z!hhKfBvnjsR-ftYTeRq%j zZ`Ay(0`W1X?Yr+8E^D85NytN^IDcAm)gJic@0i2EUk)ykX-(YQ~S@IN79dwzrYO#*`I zC<-uBGT|dM?m6vWu>9n92W~(2!gnb;zc&9V7cFSF^FF=&L>fiEBoZJjiAfD(hTQA& zJq}zwJ085r&ncP1^CoBQ{9WeAl!}~f4{|@x?MIj9`Oa=lX3B_9;ZDDT?T|%-PuXD> z*iG^(5AFFOq|8k8L#8T%326Z_SfxkuAne15LvK&hr%2s-6<(iFu7sv$(W&oErS5Kq z&qM2m_K0G>1kPjS3{w&d!g4!2XUJM$xm11JTl*oGoup9q{ZMmud8m0=xALl1zSX)_ z=<2eCMTPiomCEf~ht=fla{ynt8wh?2BQYY9oZ*$0^yJ5OzM?z9@_fPEsz9F#w~%hm6fU}`|Xm0@w2v|_7M2`GJh$XF*0jJNHs zHtM40VnYty5oLWV8k@ICvX&%FoMPtK{qL`oxAah+sD%% zugxE2tnDKb>~JS1zQ=chZMNNL=4ib-Z`g?5xFdf~iLHLW8Gj45zd6Hh^CSHGJ3BtR z`j6M}@8;gvCUkI32p^E8X*f5(R?gzQCRdsHV(&`}`rWOAB3w!4=S9YLUwJ7f(EVPc zOsHZY$cA_;NIf!fG~E4I^>#}-9*vT0SeutwT(X{$dO~s{_&8fyn{(b*b^J5d77%3x z@#KFST}a69C264L#P-asX=dleWx?zd0>ahd7Ng4d@8%)d6eHrN(|*X7Q*Gv6ue`F1 zRaZiBcs>qM2Is$_&S|(){{ky2#}J2X(#e1-e~^d7h~Sskt?T^jnShz`hELNcru3 z$}l_YzZ_0;B_`Ltcf;#>#j3@cD0UVLxCAD;A4=jmr$>=2ES+B5iQH9_Y3Pe{p9_pI z;n|s{$k`(9np*|<&+Y2*3>B${!R`IM5@W3^2d1ew=A*(3nn*^8@~BVu!&kih%EYKh zNKVgwvUyIjptob4UZIrY#k`*>M9}ywYtKmLefeZYF$~4Cw!*SHoLwJv#^Qg1vJlxk zb*p+2=c0R4nV!2$t4Rp7lwkV#DDuUkC8YudIrVQ+}w+N)trxGC5CVv!#I-{)l`NPHF6r_ioN)wlbBR;Vo~~ zVL>jw>zhLd;k>{`8cdRFra>vhu%B08auYJ8VNMGcj4QRD~&66Ma|5O<8&KnA*9Q`<}h9?1;)f3KS;NEW$-+>)>Oqc6}4xI%hDgZ^HBU zVyoDvM}GxT;#=P8O>J?}CnoZN;B%6Jcx=<4`X5t|%50%7ZB}LqTy~n$nuvVu@7INC zSxMiG)T1^POz*omU!!*u`1sP94+i@84B%Gvz7Pgp3i-6O*v|I zR_dE8TJ#Zu#94yb5Z*f{eDcJWITEz2;=2MNLeAHu-Idxynm&`ihYaOQjd56Ua}ul3 zWks@Otw~}&9R!?Q?oP5=b;M}TXz`CutWVPSwT73z^&DJ%?$~V}a9-L|cN)A(%5QHa zXJx+$E@h10WwqRw#YG91dpmccF^Gr6KTm_h+Oz7>)cXDx0h5if)3_+QNORjZ!F8** z*=|ywD>?W(s(z>+eu%l(6LXzWBth(=bnd9gv**k+U*P{^j&=0oC-xK9uh50RLf3~p zJfI0$HAGgC6*l;Qn8ZSMcv0@LyCEfO*;2!~G$#n;q4>@rSwrA1 zpW`;vtzS3}NvvCYKK;B@?!FwKhH(R|Z+DMbzG7p}JZi>P$sW)Y>t2KC`z7JG=C*6eJ7k*0u*s4VX`jWNuuyV> z7EQ}5X4O;-IG5c}sJ?hr4W3jKZ6GAtLH{gEJHM&D95#LQgwNCQFZt|`y1JmSGQRjn z_k3ve>tW#m#;9|f$K-sfl_=fCpO@YDW1dZ*Y;^2(_&WqJCO{@>q@tN9+I-d`3L+(@ zB0hva^oQtyph_vKT5Z>2VvpFWnD7%RJ0t!)U(!v{#U9vPobi6!tvnfL6nU zWlINi2@)!Yr|RlCnp5Q_HA5dXyBdVyh0_YXUc`M>u(0)_ek5jwE~=%n)8Ou0RK1Sj zt{!*xe;n*mQ;!|Ke*QCA@soXtDd+WKM4|q%k#m?Mc%Rewb=L+~D{k3ccc^#GW=4p$ zH%|&hcG5OY*R|gdev+;azdevip3l7#i_}~OcvBu$WyJe}qOxkc+L+@FrTn)0*?*0P zC1?Eo|Ate=xw7Yz&n>$@O**1C*hfr-$Bl&;R?>flUWI>re;*G&%=`M+JG^qP%DS=o z=@ljad-wX@p7V*|^c~p!gNptFWn!J)pS<}X=kUkM?&sk1RO9x}I-Z(7<+#q1dgtQm zvzLeA(F>b~p|x9-vf>71zEhw4InPhMocx=z!_d7rY}Qjuy3;j~6L0ihJe<=(#sm)!K-(Kfg1{o<+xu@XIL0es6Z(mGJGB(fw=jRLvOg zBzrM1BeB{cdG+becx~PcW{y5R9MPP^mW#t~*h*A)?5bF1%;Nfdu>ChGLts z*OaC~H2kd|)W<7SsO~N)DUDilj&#R|%Xhot9~TGpSiDAz9##sEoE|U8u#e|&`aX4k zx)Ff0FU@D`xS~IzKe`>|!2UXIV3Bk=#?;?uyRU@)&x7>Kf4?{27u>IgBb2EZO8ME5 z_=aqfn*xN049fs4z%0Qw{8PiHUfs8;Z4Ma!hI%RaciWaI8Roi@5{+dX<4|D^DwKM! z*@x52RAEFTqcYq}wqG-JG3IP{uV()~KL2p$r}wXs4fZlDpVl6=Pn+-Vef1zvqQ)sq(*+V!4G|GVL=gllEI{X=)(|ba$G~I6hqY z@-&~y<4@kW^Jeh0;}`b9s4@#`->byXvxFq< zYNj|ymc2Giour(jvqW7=Y&A7ZFp~^=20hH?H0D=%8*XNe$+E~BwKR~QO*$sVX_=Ne z>w?nTtgFT}r%-UjF4b@d`ip|>M`Z#U@$@kK&Thek+bO3vF8Yf0+s0u-ml8LO_}6q^ z2Q}=+HSO=54T~2*$EOtQBq7rj8eN1TULh8{drKgN%o1Hh-@l&?y*{z7c)w(V=7 z@MIji3tBF)!oUm@bOy}E*xH>APkeLmt673h$UCN55PL*9|++*5tpftIM= zCSU|#|FQJj#hAaAc6RhPd5mwv zkyQ8PC&;B8{&~~XaW3V8eMggp{zBI8S3Km&vBU&?%qb}*#|+O>9pUrv;#JQU_Hg2v zc(8}WXR9btw}lx=xM0453 zUnv!GNVimuqy^Qc*-(!pevNYV=({YEOTVQy&^k&HxH!^{4sczhiN^)ceyq-9Kn&=AaXrRLLI93-ZD*1sN+=#&zM-JaJdt_Gw18syO41mRnJY@_5y=k|mB-hGhsor4 zhqKh~bh@?i{vV+GM-cm7CCGj#eDz8d5~Z>;7c3{!GX3l4ndmIt=(a__!q@isHe>^N z7<8C;P;J8RtLFR-;v4Qmkso}UCH4!W^^P@AAH!xc`){?To4e{f5I?8kh!9Z7r9O7{ z{J#0;a!v4g*ub$7Z3))Fe6(v1hSsz`hLl|*!#jdhC?tEZvPeyHbMZTy#riyQZrCJ# z_Vh|{{X^orE*94y4nYK{ZL8 zk7<%;2bw01*7}wb{-zxH3iQ1p>PLE$uiU+gdB$lOph}hd(F8cx828MEO1|DGArh5G zmZ$iEi#L{XhT+(t9W-d0iaW$!iJd)bUM1!7l*aF|noB{f5inX#+$JK07Uv32Tb+{% zyPqa`2+!@mtN4++^9Av+ zCXqzI`oklRPO^-T@E(hoNvu{tY1anyBCtM+)^yFx!b!@KFKCzKaU%PpL_>>V1_uXl z9#5-EUMD}Q(M=CLaH%1T)9!YQOc+fIn8iYUm5~s2L5sG)$;def18oxzti}^!TGd0> zmMzJ^49OHjnY#{il>{Lv@8q3r51+#)A5%j^CfEYtutdd#xVXt8)LUIB?lu1Pp+1r)Y!BfM5iY_ru zL^)zEjICnOtht&#L`+5I>d+6+$2|^$VrEZkfy!`HPe)@Ckdi|fqFSz&5{7|!;Pb8vhS9poaR5K{&d z=7w`W8SB%ix-FCJbB-Lt%*o}lAk$<_jFFKwYp6QUL$phxT(rF+q!+K5&fOK4AT@x{ z&51kS#SC0RJ`yDwPTwa17lt(CBJEKiQ&h@Osz=CUjxuSrn~gSf54C}*SuwWG{rtK@ zF(nz_$2t>eE39tmt!Rl2u8$5G_wdJHTbgfCMAYD-*sAEmgcp(z9xJA9nVASMTxq00 zDm*o){au*PS)SJ>k%-e5GU?teRtd~8fdZ#Qq7%voTv3;yt9ya7k|ETHnr)}4%yRO` z#@13+h*~ruWSa?b;`}Fl*}8sG!Odr@0Y>YwG@#&kBm0wrYPVBO2milE-LZ^~dwU2x z$l){z+#Q9{yO)u@C~i{l9f}&CY17kzMgz~>EKdkC3+$o9yrB*(i^u@F#^Z7pByLPT z-|73Grw2D?arw~^GZ2d%c7$;X5}+9+2vJKFVI!`_1E{1S*)xtCPoW_D%Jhy9VhtM9 z_%d`tOD&O^?ukSVI7io6_@@pR;k;_fZNubXrfDtN(O98aQDF6ae`eWAgQP^Meto}5 zanC%$S}~B2_vT?AnTz3>HIYK-n-8O!*g2fal<93(*bCw8B`hxp-W!nK&Ur_Il+gkD zuif)qPDpOsx5@7M^vqt{2IP~z*0+~-6=Z`s>=?QWUQGBTus9mv(81rM!gthiaO84j zD5VB+VH17u;*vDrJo|SL)kQ3*ws{=74Zf#I6r@oAfJ7V}phATEt%?NsVIKpun@%UF z@;v<;8!Ki64%u8QBMiZ#D9jTj2`IvXk_^a$9ULqW1E}!ffZ-K0gKstlNtt_$HyruK zd5mp&G>m$YN!oyUwU0Ff^_o~~MpbMm#YqPuIIuX7!Z{z2?TDh0JMm2<%Z~f%iIwgS z_~J2OdH~)NY`fTa`tf;n>2S>B6{?E)(~x=cdfIhSk%Z$DhGu0b21SK|p(mVCX4re7ishVCqm(uBGzUH?B&rs|~ip0o)HwS&k@62CS6Kj;Q<2MmMX^EMGxF`a zjPzatZ-OM^Ba7Rle-lNhB0DTNvx3>Bj*9mvuXV1{cb7}(0S5GN?CH=BF7V+F;pih- zGzc?U#tUM9OfdinyVNvqNF9f5jokEx7jZ5m%9*K%nI(!G&X47D++AeMma!pFwpjOP zg@9o#RJLC0-rE#x>TZ-ThS3BZc&(-zBg596_*ihVVuOYl)KN#Ik~u`knT)dtW1ewy zrOVwy#y2?Qo6e>%Vs5jp*)y(R8q!mlHP2Jg#~BpiC7;iBH8KwQQeltEWme5-gC|eU zYG;OHZ`U*$DFo)>g29_MB+Rl^0Zd@cpFA%90sgUhtrP|8G#cn)x{i>gV66p_V2Cr%kpNLPPy&hGs%Mv4up_kS7^AZ--D^fn*j@z+mgeV*JtmZUS*azZX0|z3OX+M?RIu%#$2v5 zLB=1BI_Hw+2+rqlS80gCF#B?rW*IkbcY~+N+~BVK^%ii0E-w+YQ_{+0R4=qy!%EDI zD+t3QJIJ#0GYqbMDTA3~b3&6CMVF@`Wv!EF9%TvBp?=o<91~h1tJ662zdRXyYB1HHb89|Kvto{F;d<#hdhHOZUb`IPNY__F&6l>5q*NOaJ@Stt zF__~}`ou+;vy}x*tr&d>sWwJhBz}~!L$uKm+*;ZmlaI}4g9yIKsboS-rI`H|M$Xh) zTIH7lc8*-c^G%Aaw6x0XI!9q!@bZEAtaew$7`|4_H&nK>lGt>-($QO-Z7!%yVK5om z4eh|_^)%<*_%Z^{Zo(P*!V>jq0tWy~m40xs&boa*0|}>mRrfojfF-cc0M<&`V6fXN zO>09FWLrtBTnmMJCB^pi*O7*!f`o1E%6rUHZsJiVPbrpP27X#+q7|5c&7q&Ba}u$C zK^U?1r*T5QlbTBeMN)~Tnqt16Ab*};wZ2XuQClkJ*m#F==>wBbT4^0r@Yu&!gm%Y- zJLveL=(3+W35? zs;gS1C7qsjk(io(lioEtW#GtqF;;N(yNWZNWQQp?x?=0`43C6hzl}cvX-q@DOdF|@ z3CiY6P$v+Pl?%eL88YV_GqM3DK{#hJE1YwKseA@}F+}&WYcn%LkwWAt(@LB(ThEX{ z#K>~EHMqRZ9trJ(xfdID?_GlJ9mz6~sfP=VV2K-q(FEX)DGd+W$&{}inUypk^BYg) z2p(Za&sBVU_{~;|_SJ>Uz1X1pmKDQV8q-c!%UCQu^?Kd@8lyU_=6hZ|QOPqM-U2Y| zhw3?lf*eU&f3rr9F=(wnI)4@7wB>f|j&nSDc+W40eZj|)=@grk z@vETcXD%ur%5X=!bT1jLYarHxB)c7YGuD9#sNgu#gy2iEgvN(<1Oo@Lat=bf5myQi zOXeZ!K}=9hM9>=S8waR;4gUNM2fw!klMIk};@5y~M#>ZA4#U1B>MTvgL5s&}rYYFZ z5Lc!`h+-S!z~^Hy=lS}MZgQ$IBr@YbZ-i#nrivtnhvkDL+FXdd3nB<~L6DThkqj1L zj{Ig`E_l**?Q;Kk&jbZqK69lG9XR9z)p5D1h#I{38rngC=e`Ch8mcdljIZM6(MDQq!)=ZKG|h2k~xpmxWXu z7+k4*%PT#?8uXLet>qfr4kt6Eyax3%1h%!#EKMn-kuWfAgz%G6)6HW@HylTt0Q*Rg zfa*XjhK4a9niFWlV+A(0G-B*DG_<7!3EoE{C843z4nTpKh#d{nN<>Hk95nLUm@xIW zOGcYU!L1RLIH67zZ39s@2B3>xCPNA!14ahyE(TfPoKV*FLbL}()`0u-swPQ`h=6R6 zJkhuhmyrV(vDwX;h-8)}{1W`)N#mK04ou|WPyS=1VRe`xkTEo*BsrbILK-Iyohu;> zUzdm;k|cx(BvCV%IHTPm< z1M7up0u+b^3EpprXhCy?AcKHmfjhh|4G%dHWQ9`07^d(kVied+viIy?gQTO~BuI>7 zCG;qWzMZkQ$J5Tk16tN%!F@3h5tw9;YFNtUvGr5A(fnzkh$|iI8DfH|XphHC4AeobB(OW37k+}qGo&G6G&PMKcUBG1!=k?+>LwTGcscv8 zM^$_a!&f(3Lr+&$);S(-_p{Nlt$|{O_9inMd$6als+lKnQ@rQi@q#r#XE{Vn3%M84 zXohx;WAv0>M^m~+y}Xc!C<-W~m4XthsnY1jn!)GuA5QL?>KyFXqXL?86;U8)8bLgw zcikJKae>w+cK!8`Cj|~95|mzzclmn;a?S88Q$GpEN=h?;(b3aDGeJTOQHdJjkzmn$ zW;=jkhl8GX5ZXHm1V>=>ArFRUnIk|``4kZ%1ZlhIOJbeoOElXO^IkZe@m*kP#(oWD z%-&hdG#TCGyudlGPi)R@+gSC9`B%1QFMT}eeoD#ocQ>qmOSglLDMp!nw?|$0gE{AH z&BvYIPEN48jyG_F&!Src@Rd;*C-iUlou5>Ye9zG;wnJy4gN>d3l_}o@Lkn;4y zFgioG;!cAw&G*E;WEX+lT{;={48g(zj5VA#BwS@VkZ9oYJK%CL-W90rF1?&23hQ<7 z7Hnom4B{&3tD~rq%~Nj%SO#ELzyt847>tq(Cf?!_?c5N?NYe{=4J*L}Hf4NVk@Dw% zm4eJ^w2+_O6na!CfY|GEpcfcJjux98+G{#$OAoz0NX6zRL=7O0$@cy~HC>G_CDbq@TWFfa zLr-IDsR+n$uv@SS?Vt#5Kcdtm!bIsCqk@eo4sEhwvnHh%919R(EhB6jVrwpZ_F*_C z%(A&_!w^){Lr7yJCYV9JMGTR(NTaeEagCVEV;U~A?~NL54VriFRuX9K0} z+quEc`_*!OgA(OX4(9;G_Eo@VG}#BV$GUsQ`{|4EM~|i-D(}%WyBgbsr(J84 zrO=Uz^;W->nXP3S^F_#H6?iJzk`Kf)W;R_F6t)&Q<$+;^22GIQF+?5528YybCP7*4 zoeLGBK1uuwoWY1MJy);LIlGZ~q=t98dr*xuP!#008Y zCn2I_pTyMQcZs{$TZ~5uE``YlK?79ZM5kn%O?YCE!o2B@!DF%SGp$3J>b9+A;`005LTP;G^jHaqBs8ENT?VgxiP0)l3) z-2PfF2rbOR5Mri=#KEwuHH&@=^G}x3Arp1QLo$xdY&`Y=KBfhR9QWFm8N^`kBS>gP z+)qZzJTG}OFlqpuZX^j4Q4uf!m{y3!+kldCq0Pcz%r2{z(h;GzVAD)%QdR~wQCF;P zuqs&MB*Yk*h*Yx_G87A~R#A*LhH}m* zWkeG)Db_|arihKEkri$*kc%W{;TWI4@%xK{*yB;PqYY;CL@d+%*?2o4yqsicIS~7m z4H_lX#?9DOYw>KzVPFVQJTWamcaUoR!AGAI9b{H~cgE2mjNhz0$&ERtIU|gX#*#G( z4T9T5djyfH$sj1?h)xiUP)!tO>~c|+!vYB~R7~&wNl<7YnWs&sfMRX|I<~;vH<+9x zFq#y}D0#~eAVCaLQb@_sKLukPRT>Xn-TU5HRG~&B3JvAL zGRQImB%#1EaVht}WF)r8;#eDa^XKDpVe=GhLQ?u_d1h(@<;ylm!eBH32)~A&W|B z4W*5|i6sIOHnQ6!9JaMw9BINQ90pq*As}0UL(L5VRsl>PR3-+rLM-HLGvFE7Ag~d? z69*N+#M&u>qJ{{HJFdrmQ08xl9AO*ZG6n@V4xl*!tHDSu&B<()Hmi~3b)Pq#ZF2ua z=@O#Q2G9*MJ2ND_ta>w-&K}6BL*u3S2-;BES0ij33XP`>578Rk6q~$+x)S?o5EX>b z4C98=eu3e%QE6}o640auhM*qv;CMzrSpp+NjSa^$GZ-SBMHxEn?9dZ|m&!C{l3pRj zKT-&LAiNGUxfhRXq|=Al9B0Gt8D3pJQXR&Twt>I1GJy03wg%`aOT)i&68E#QFf;Gr zfH;hZD#au;VmTmq?sCM*3QrusXbSBH0W5&7UrvRN?e_#GE)K^ z3}>l^I&w!)==xh@mZhEIer-NSaAU8BosAuNk~9$%nA2&n#zrOX$z(p@!+n-e2S^Y+ z4k4KV-_fY{tooWhh4cbvgLiTt0+L8_$ksaA4WeN;c11Jxj%+R^6~a*?$Gt%W?#snnrI`|C=IFH8e@?QuAsaR(u6Umk_StMdeh1nRSF~z zfHGS6?IV~)_YXtwj_VI$C90ZQkELSvX$6fGOEQ+XFhTpaW8O9dV8#)yoDyGKX{9OP z@*mR+>BEdh9rX6z)WMS{{9=ZrT*2Ie=y*F~Fk?3@D-qNb)S&GAVYPN($B{5it^0sEy4UP(a~qX|fHp8IWZa zMMXBTp!G)ufS^bX3F=Y}=WY;Yu&@lw#)zb~<1~-js-1+sv^>Fh zvdt6ME^y_{>^=h{&QHYZp2EbCn)tch2ee5@93d!jD0+}#MOutlnhK6)@@dks!_Y&g zNrVLnBTSJ;e;hPB*btSzX|$CFG6w`DIlKx=*d7zE618^>A!v^olXp*Jd&f=EEO&4= zo)QP!w?WzwmFu1?TRJVyFOqqWPhk~V53zPL6CrF{4bt<&&=d{<;s!QI6Ao1xX!_C0 z9J{d(A$2KmXvwzjZPcqKtEJeb>V~kVW7KM09;@)6HrS32a%UmU4M-6Txyp`~xE)^u zya+}CgvAnq8a^(d-#_4kgfP|^ng z4k$!OH&@fkk@Dcrm*W@F2Us?cPSH6C#8gj}gngXCDh8OS+bjTv0oIHVfmDCQG@WgM z@NlX={iW0Z@Iw>WF!dPws2p?~Tb7V=mA@}f!Q|gtROhGG*jMVwV{?h+nYo3I7HY?y z&xNdbTblOk8ia2WK;`_n#r};%9Je~cNuXP&=~NE;%${m-xYhHQXv3WH&e;9VVBRQ6 zp&C%SMo4y;-J9j@G@#j-l3UZ)*S=ev+Pq$*$BX0Ewb-m{t60wvl&FIIOQR0)-eY&4 zx6icr<#cJY99_IrwWFkgU3*@0bn^$vNt@IXEA{bkQ>+if$r1{hGSiHY2AW&U9F@ba z2KmUI&gLm5S=pM0HcA~y^4WE7REz3KNebc_=dnYFK$aujV=!EVr*q?>G zyWSvPvUjec?1O+7s+7kT!p(B6h|1Ch8YuosT2-7t*QZ>`ClJH0PfRzL%zB|OXXaKF zE%wae*z}n)j4m+ng-FV&yui_n;KxXbuy1>PA%{5C`cv!Kb=EmHEA`5Fv%6SImfzR9 z%C;@6psmI^!~`Tl420x(ZO*O|c4qdQ;y)4+N&}KIOJix}l#La+L6zoN7A88aYKf;d z`cr34-VE&T@$GBDPG_hrG8SVX;Hu0?}7uEQR|kU;Wt%o&I%$USh?pdDeWg zQI|~;k{L1!h$i~LJ}b) z=>E~0kvz!{0vh$koft)u(Cl%!bhEdJu*gJ0Ls~^hh~sV32{@bEVOwg$jLhWLy8gi? zX6Qnyf>$$znP#kf<2T>|CnL9>>&J5r{V~&y6%$Q88?M2c@vxV!W?*;GxN6)@z+|YZ zLa2ahnF4)Mw}?<7>=KNP$Rz|iQhleQu{8!9jpSXO8Q8vNDPo}-yCG76Iq@9CYriGz zoYKP$opBdh6yVu!2w+tuRTU-2KPI9I3OgKc4sVhNUT~qiNt+wNMIA=8YgjTAnXP==0fY@ZgW?<+Z^jRxAGtI9tz6pG!1x7Ig zgYtT<;I9gWMuyA{vYEtXK32o5!H7^idbhzgtmt<7^>GONWyb0Xb_%$4IQe55eIXG} zlxOVg2K5;zW^8Bjmz)?sMmLx?5Qk@0nGtYnG+d8F%-%?wo5Nv5 zVJS(|pqPhqGL~OUTD)N=?8XmbX*}9hc@KJ5Or=tJkbpNNbrvBx!YE9o*6rUnSeOfwVKVa*_(-ak{OJ%SxAPe z)dK4wk3`Fvi7y`CLFTDPeT$R8VjGQ30-Vc%8XVs9wDo_xG`4WlhApP@k?mOY+PLYAySQtKQ>tNE*L()F3q$9;TgI8<(S7>3%CP7$el|>ytb;7!qp7YsDl-VE z*kdkZ_>&>TE@I#G7>c!aCYtHMm9JQ z6l!YMBpVwhl|x}z#)h%B5yN#09J!nzP0p~yNcF@Wu3Y#7^-Muy~r9D|S}fe9Lo z5v@`M1lZFUMi^w~HZe3s$=5e?Z7EFvwNk|0dwnC&c<|%acmYjN1r#)dL>UOcIP)+! zG;c3ADT$x1CoUxxfkja+MvglR7jrG@!?jc+S5WeE# z@G*yS5j2+@>$I>4z%-JB6h~*@v^Q$$^|lP&o?$v>t}-E^ z7v~GJe+rfeX7}^RNDBiqH?Rx2kU1A1gQTt3oCT;?#VuyWT0**iMF#}EsQXVeHrraO zx*vFZniJ^aVQ`=|!RH%vi*rvpR;M5rqK1wE^>v)*y>O^_@>(`X0*oBoBwr zagxyco|F|OCozoQ-36JkDfOXEDbKk*spUBU z^NInh7XldV>F#>5*C~Op>L)}^7Q3`^FfE+TGi4!!A#v4A{7Hl!UZ{K|(Zf%HisGeM zqu>|g_6|YwiZs+XYHv{Wp)rb=cLiD44+p{kSx~PV+1Kdc5Dk z&j}ohzOO&VF4rytv1P z@^TWOk}bE-%szGzx!hD54P;w)n>Trv0MR-SE`u?NheJzIcMO&AgL0=J=03Qa4xYoD zIt;jTDz~GnJwIE(^{xdBkbwTbt$NuTcBs6W=9Y6y^ Bm(>6O literal 0 HcmV?d00001