home *** CD-ROM | disk | FTP | other *** search
Wrap
/* * awk3 -- Builtin functions and various utility procedures * * $Log: awk3.c,v $ * Revision 1.40 89/03/31 13:17:20 david * GNU license; be careful about types in sprintf calls * * Revision 1.39 89/03/29 14:20:07 david * delinting and code movement * change redirect() to return struct redirect * * * Revision 1.38 89/03/22 22:10:20 david * a cleaner way to handle assignment to $n where n > 0 * * Revision 1.37 89/03/21 10:54:21 david * cleanup and fix of handling of precision in format string of printf call * * Revision 1.36 89/03/15 22:01:51 david * ENVIRON fix from hack * relegated -Ft to strict compatibility * getline error return fix * printf %c fix (only print 1 char of a string) * tolower & toupper added * /dev/fd/N etc special files added * * Revision 1.35 89/03/15 21:34:05 david * try to free more memory * * Revision 1.34 88/12/13 22:28:10 david * temporarily #ifdef out flush_io in redirect(); adjust atan2() for * force_number as a macro * * Revision 1.32 88/12/01 15:03:21 david * renamed hack_print_node to do_print (at last!) * moved force_string() up out of print_simple for simplicity * * Revision 1.31 88/11/30 15:17:27 david * free previous value in set_fs * * Revision 1.30 88/11/29 16:24:47 david * fix bug in previous change * * Revision 1.29 88/11/29 15:14:52 david * dynamically manage open files/pipes to allow an arbitrary number of open files * (i.e. when out of file descriptors, close the least recently used file, * saving the current offset; if it is reused, reopen and seek to saved offset) * * Revision 1.28 88/11/28 20:12:53 david * correct previous error in cleanup of do_substr * * Revision 1.27 88/11/23 21:42:13 david * Arnold: change ENV to ENVIRON nad a further bug fix for -Ft * .. * * Revision 1.26 88/11/22 13:50:33 david * Arnold: added ENV array and bug fix to -Ft * * Revision 1.25 88/11/15 10:24:08 david * Arnold: cleanup of comments, #include's and obsolete code * * Revision 1.24 88/11/14 21:57:03 david * Arnold: init. FILENAME to "-" and cleanup in do_substr() * * Revision 1.23 88/11/01 12:17:45 david * cleanu and code movement; changes to reflect change to parse_fields() * * Revision 1.22 88/10/19 21:58:43 david * replace malloc and realloc with error checking versions * * Revision 1.21 88/10/17 20:55:31 david * SYSV --> USG * * Revision 1.20 88/10/13 21:59:55 david * purge FAST and cleanup error messages * * Revision 1.19 88/10/06 21:54:28 david * cleaned up I/O handling * * Revision 1.18 88/10/06 15:49:01 david * changes from Arnold: be careful about flushing I/O; warn about error on close; * return seed from srand * * Revision 1.17 88/09/19 20:39:11 david * minor cleanup * * Revision 1.16 88/08/09 14:55:16 david * getline now gets next file properly * stupid bug in do_split() fixed * substr() now works if second arg. is negative (truncated to 0) * * Revision 1.15 88/06/13 18:07:12 david * delete -R option * cleanup of redirection code [from Arnold] * * Revision 1.14 88/06/07 23:41:00 david * some paranoid typecasting plus one bug fix: * in do_getline(), use stdin if input_file is NULL and ther is no redirection * * Revision 1.13 88/06/06 21:40:49 david * oops! got a little overenthusiastic on that last merge * * Revision 1.12 88/06/06 11:27:57 david * get rid of some obsolete code * merge parsing of fields for record input and split() * * Revision 1.11 88/06/05 21:00:35 david * flush I/O buffers before calling system (fix from Arnold) * * Revision 1.10 88/06/05 20:59:26 david * local vars. now come off a stack * * Revision 1.9 88/06/01 22:08:24 david * in split(), ensure that if second arg. is a local var. that the value is * looked up * * Revision 1.8 88/05/31 09:30:16 david * Arnold's portability fixes to last change in random() stuff * * Revision 1.7 88/05/30 09:53:49 david * clean up some fatal() calls * de-lint the random number code * * Revision 1.6 88/05/27 11:06:21 david * input_file wasn't getting properly reset after getline * * Revision 1.5 88/05/26 22:49:55 david * fixed error message for redirection * * Revision 1.4 88/05/18 18:20:02 david * fixed case where RS==""; record was including a trailing newline * * Revision 1.3 88/04/13 17:39:26 david * fixed bug in handling of NR and FNR * * Revision 1.2 88/04/12 16:04:02 david * fixed bug: NF at end of record generated one less field than it should have * * Revision 1.1 88/04/08 15:15:07 david * Initial revision * Revision 1.7 88/04/08 15:08:48 david bug fix for file * descriptor handlin * * Revision 1.6 88/04/08 14:48:36 david changes from Arnold Robbins * * Revision 1.5 88/03/28 14:13:54 david *** empty log message *** * * Revision 1.4 88/03/23 22:17:41 david mostly delinting -- a couple of bug * fixes * * Revision 1.3 88/03/18 21:00:13 david Baseline -- hoefully all the * functionality of the new awk added. Just debugging and tuning to do. * * Revision 1.2 87/11/19 14:42:31 david expanded functionality for getline * broke out get_a_record() from inrec() so that the former can be used from * do_getline add system() builtin and skeletons for many other new builtins * * Revision 1.1 87/10/27 15:23:33 david Initial revision * */ /* * Copyright (C) 1986, 1988, 1989 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Progamming Language. * * GAWK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 1, or (at your option) * any later version. * * GAWK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GAWK; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "awk.h" extern int parse_fields(); extern void assoc_clear(); extern NODE *node(); #ifdef USG extern long lrand48(); extern void srand48(); #else extern void srandom(); extern char *initstate(); extern char *setstate(); extern long random(); #endif static void set_element(); static void get_one(); static void get_two(); static int get_three(); static int a_get_three(); static void close_one(); static int close_fp(); static NODE *spc_var(); NODE *do_sprintf(); /* These nodes store all the special variables AWK uses */ NODE *FS_node, *NF_node, *RS_node, *NR_node; NODE *FILENAME_node, *OFS_node, *ORS_node, *OFMT_node; NODE *FNR_node, *RLENGTH_node, *RSTART_node, *SUBSEP_node; NODE *ENVIRON_node, *IGNORECASE_node; NODE *ARGC_node, *ARGV_node; /* * Set all the special variables to their initial values. */ void init_vars() { /*** APPEND AFTER 221 IN x:awk3.c ***/ #ifdef AMIGA char **environ = NULL; #else /*** APPEND AFTER 221 IN x:awk3.c ***/ extern char **environ; /*** APPEND AFTER 222 IN x:awk3.c ***/ #endif /*** APPEND AFTER 222 IN x:awk3.c ***/ char *var, *val; NODE **aptr; int i; FS_node = spc_var("FS", make_string(" ", 1)); NF_node = spc_var("NF", make_number(-1.0)); RS_node = spc_var("RS", make_string("\n", 1)); NR_node = spc_var("NR", make_number(0.0)); FNR_node = spc_var("FNR", make_number(0.0)); FILENAME_node = spc_var("FILENAME", make_string("-", 1)); OFS_node = spc_var("OFS", make_string(" ", 1)); ORS_node = spc_var("ORS", make_string("\n", 1)); OFMT_node = spc_var("OFMT", make_string("%.6g", 4)); RLENGTH_node = spc_var("RLENGTH", make_number(0.0)); RSTART_node = spc_var("RSTART", make_number(0.0)); SUBSEP_node = spc_var("SUBSEP", make_string("\034", 1)); IGNORECASE_node = spc_var("IGNORECASE", make_number(0.0)); ENVIRON_node = spc_var("ENVIRON", Nnull_string); for (i = 0; environ[i]; i++) { static char nullstr[] = ""; var = environ[i]; val = index(var, '='); if (val) *val++ = '\0'; else val = nullstr; aptr = assoc_lookup(ENVIRON_node, tmp_string(var, strlen (var))); *aptr = make_string(val, strlen (val)); /* restore '=' so that system() gets a valid environment */ if (val != nullstr) *--val = '='; } } /* * OFMT is special because we don't dare use force_string on it for fear of * infinite loops. Thus, if it isn't a string, we return the default "%.6g" * This may or may not be the right thing to do, but its the easiest */ /* This routine isn't used! It should be. */ #ifdef notdef char * get_ofmt() { register NODE *tmp; tmp = OFMT_node->var_value; if ((tmp->type != Node_string && tmp->type != Node_str_num) || tmp->stlen == 0) return "%.6g"; return tmp->stptr; } #endif char * get_fs() { register NODE *tmp; tmp = force_string(FS_node->var_value); if (tmp->stlen == 0) return 0; return tmp->stptr; } void set_fs(str) char *str; { register NODE **tmp; tmp = get_lhs(FS_node, 0); /* * Only if in full compatibility mode check for the stupid special * case so -F\t works as documented in awk even though the shell * hands us -Ft. Bleah! */ if (strict && str[0] == 't' && str[1] == '\0') str[0] = '\t'; *tmp = make_string(str, 1); do_deref(); } /* Builtin functions */ NODE * do_exp(tree) NODE *tree; { NODE *tmp; double exp(); get_one(tree, &tmp); return tmp_number((AWKNUM)exp((double)force_number(tmp))); } NODE * do_index(tree) NODE *tree; { NODE *s1, *s2; register char *p1, *p2; register int l1, l2; get_two(tree, &s1, &s2); p1 = s1->stptr; p2 = s2->stptr; l1 = s1->stlen; l2 = s2->stlen; while (l1) { if (STREQN(p1, p2, l2)) return tmp_number((AWKNUM) (1 + s1->stlen - l1)); l1--; p1++; } return tmp_number((AWKNUM) 0.0); } NODE * do_int(tree) NODE *tree; { NODE *tmp; double floor(); get_one(tree, &tmp); return tmp_number((AWKNUM)floor((double)force_number(tmp))); } NODE * do_length(tree) NODE *tree; { NODE *tmp; get_one(tree, &tmp); return tmp_number((AWKNUM) (force_string(tmp)->stlen)); } NODE * do_log(tree) NODE *tree; { NODE *tmp; double log(); get_one(tree, &tmp); return tmp_number((AWKNUM)log((double)force_number(tmp))); } void do_printf(tree) NODE *tree; { register FILE *fp = stdout; int errflg = 0; /* not used, sigh */ if (tree->rnode) fp = redirect(tree->rnode, &errflg)->fp; if (fp) print_simple(do_sprintf(tree->lnode), fp); } static void set_element(num, s, len, n) int num; char *s; int len; NODE *n; { *assoc_lookup(n, tmp_number((AWKNUM) (num))) = make_string(s, len); } NODE * do_split(tree) NODE *tree; { NODE *t1, *t2, *t3; register char *splitc; char *s; NODE *n; if (a_get_three(tree, &t1, &t2, &t3) < 3) splitc = get_fs(); else splitc = force_string(t3)->stptr; n = t2; if (t2->type == Node_param_list) n = stack_ptr[t2->param_cnt]; if (n->type != Node_var && n->type != Node_var_array) fatal("second argument of split is not a variable"); assoc_clear(n); tree = force_string(t1); s = tree->stptr; return tmp_number((AWKNUM) parse_fields(HUGE, &s, tree->stlen, splitc, set_element, n)); } /* * Note that the output buffer cannot be static because sprintf may get * called recursively by force_string. Hence the wasteful alloca calls */ /* %e and %f formats are not properly implemented. Someone should fix them */ NODE * do_sprintf(tree) NODE *tree; { #define bchunk(s,l) if(l) {\ if((l)>ofre) {\ char *tmp;\ tmp=(char *)alloca(osiz*2);\ bcopy(obuf,tmp,olen);\ obuf=tmp;\ ofre+=osiz;\ osiz*=2;\ }\ bcopy(s,obuf+olen,(l));\ olen+=(l);\ ofre-=(l);\ } /* Is there space for something L big in the buffer? */ #define chksize(l) if((l)>ofre) {\ char *tmp;\ tmp=(char *)alloca(osiz*2);\ bcopy(obuf,tmp,olen);\ obuf=tmp;\ ofre+=osiz;\ osiz*=2;\ } /* * Get the next arg to be formatted. If we've run out of args, * return "" (Null string) */ #define parse_next_arg() {\ if(!carg) arg= Nnull_string;\ else {\ get_one(carg,&arg);\ carg=carg->rnode;\ }\ } char *obuf; int osiz, ofre, olen; static char chbuf[] = "0123456789abcdef"; static char sp[] = " "; char *s0, *s1; int n0; NODE *sfmt, *arg; register NODE *carg; long fw, prec, lj, alt, big; long *cur; long val; unsigned long uval; int sgn; int base; char cpbuf[30]; /* if we have numbers bigger than 30 */ char *cend = &cpbuf[30];/* chars, we lose, but seems unlikely */ char *cp; char *fill; double tmpval; char *pr_str; extern char *gcvt(); obuf = (char *) alloca(120); osiz = 120ticsrnen =a los voiddo_spi El compatibility modepodeps) */ #defility\ t1); s g=carg Ae sp(s0ptr; ist) NO p2 = s_el0ptr; NO p2 *s; el0-- > rhile (l1) { (n->'%/░lca calls *l╡Hmeturn tmûn = U=I╛- > rhile (l1) { (n->'%p /* return 0; ri(cha nd =0); } *obul; r Eility mspret3)-ty ms , &s, tree->stlen, splitc, set_elemevalemeofrec, set_ *gcn->'xterr *) allocU pomspreo_int ) {s╚aueP w, pr!l0phksize(l) if((l)>ofre) {\ char *tmp;heck f f(mber([ f7dne perr c *) allocU pomspreo_inc *) allocU pomspreoErea f7,tmr6osiz*=2;\ \ \tL┘eufe, &tmp); return tmp_number((AWKNUM)log((double)force_n sp( sll_rU pomspreo n0; R;\ \4,}7p); reublespli- sl░lcp); returnrint(); e perr irg to be formatted. If we(urnrint();r * pomnf we(urn e ormattr retur; eashould h osiz Tre) {\ ftiomn sp( sll_rU pomspreo n los{s╚auAep[] = " "; char *s0o})force_n_numbu2atisu.òu->stlec, ) {\ Y arg}bbufe(urn e ormattr retur; eashould h en{\ bosizo2force_strinB retur; thaxterr *freo_isp( har *tm ifelse {\ get_one(carg,&arg);\ carg=carg->rnodG} /*tc, u;z*=2;\ \ \t=gram_xter\ *Og->rnodwa) {*b3.copyRre) {(osio n l *)al rn l *gram_xter\ *Og->rnodwa) {*b3.copyRre) {(osio n}\ f7dne perr c9osio{(osi am_xter\ *Og->rnodwa) {*b3.copyRre) {4l vmp=(c ╚ fi g() reuodG} o n0; R = o} rernoe orma ofre o} aps{*b3.auhity e) {o} {*b3.aeasho≤2tertaf(c ╚ fwformattïontb.v9e(us char *s0e, &tmp); return tmp_number(v9e(us charb(osihe plUpf=tmp'cop╞6d. IIc:Fstrip(s-s{*b3.auhity e) {o} {*b3.aeasho≤2tertaf(c ╚ fwforma if (a_ge.GetO+ set_ *re ) {*b3.r * formats are note/vntb.v9e(us char *s0e, &tmp); rg,&a o} rn l (us cRcsis{s, &the buf9 4re(us char *s0e, &t:gcchar *swftmp_numbeΣNUar z b╚ttere(:o_intuf9 4re(use bc,tmr6*fre1&cpbufe bcne⌠rg->rterneosi am_xtcfcne⌠rg->rterneosc{*b3tc,C if (a_ge.Getk╬r\ 5rgtfpoms ftirR R = o} rernoe ormal G_b.v9o61 e ormal emop╞6) {\ n-Gtp;hC*b3urntloe+=osiz;\Fcopjz Tre) {\ ftiomn sp am# b((l)>ofnumber((=(c ╚ fi g() reuodG} o n0; R ²im\(l)> b.vcopja:gccharab(osib3urr chbuf[] = "012345678ôc ╚ fi g{ (n->'%e) {e'%e)ps0ha9osio{(oact Iiomn sp am# b((l5rgtfpGetrz;\Fcopjz Tre) {\ ftiomn sp am# b((l)>ofnumber((=(c arg to be f=E *sfmdef"; static char sp[] = " "; char *s0, *s1; int nae:tc, sfmdef"errrlyp 9sp a baasternod(a_grnod chasam# b(plf"; st(veems f∙ne⌠rg->rternp = p)forc /DreCy╞6) ucaktoe o} rn l (us cRcsis{s,aog lhs = tò st(veems fn; Ae os0op(scab(om"L+=osii ; osiz = {*b3tdtp_nugrnoEargC+=oxer_stec, 3tsam# b(plf"; st(veems f∙ne⌠rg->"Isg{ (n->'%e) {e'%e)pj o3ething L big in the b in hinC+cous sdo eate/vntbf(a)_3n; tRcsis{s,aog lhs = tò st(c3ethin Ae(TO *sctcfe⌠rg->"G refi nod oxeg#A o n0; mber(vme f=E *sfmdef"; U) i·terr *har *s0e, &t:gcchar *swftmpd1 1"; z = {∞ olR(oaalrpn1&caS Asdeps) */ #hE'7(l)>oe olnodr * rhile (li am_xter\ *Og->rnodwa) {*b3.copyRre) {4l vmp=(c ╚ fi4s-m mber(vmesam arg}ftiomn dwaTg L_nu #hE'7(l)>mGe(phar *s0e, &tmp); rg,"eof aus fnEelC( w,do(3ps) */ #hE'7(l)>ol)>iof a,yxter\ icio */ #hE'7(l)>ol)cpbufe , &tdxer_stec, 3tsam# b(plf"; st(veems f∙ne⌠rg->"Isg{ (n-.an# b(plf"; sFirhil4xtern ; ) al:,ifar rn rin t1); pjz s"Isgcne⌠.v9o61 e RhE'7tò OMQσ se; s g=RhE'eN61 ep-n; o=ca charparrneosie*n sp( slintrg->rdxer_stec, 3t! chasasa1l)>olaseGet the Ksc ¢d->"G rr2sovetum_xPnt o long uva[ o} aprexpS ar rn rin t1);:gct║e(us π sp(rM╕scab(o; pjz s"Is0e,pjz s"h²im\t th∞i we( var 0Ttuef";π sp╖wm_xosi *sctcfe⌠ar *IRapnC+cmveemtf; int ovetum_xPv9e(╔ a) st(veems f∙ne⌠rg->rt1vbufe , &tdxer_stec, 3tsam# b(urn e Err2swaTg ar rnYGtong uveÄRf Errrg}ftiomn dwa4²im\f";dFGeatehar chb e2{*b3-teree:tms f&havs-s fUQ3-te+:gccchb\(lNtlen, splitc, set_elemevaleme refi nod oxeg#A o n0; wen, sod oxeg#A o n0; mber(vme f=E *sfmdef"; U b(plf"+:gcef"; staticeg#AUrmalN {\ktp_nugrnoEe5'lo p3ò OMQtcne# 9 4re note/vntb.v9e(us dwa)vt(); obuf = (char *) alloca(120); osiz = 120ticg0ticmon7tò OMQσ %r chbb iieI1); sxer_stec, A o n0; wen, sod oxeg#A o n0; mber(vme f=RC=tn * formats are note/ thswen, sod(ï0; mbe·te!g->rno(vmeng L bRapnCE a rno(vmpen, sod the Ks:saN {\ktp_nui am_xter\ *Og->rnFf";πoe/vnt sl░lcp);no(RdwaTg g->r\e(u:4t f=R 1"rosioo; pì*scth+:4t f=R 1"RC=δe->stlenrymbernB rnlrn : 0.tehar chb e2{*b3-C=topyRre) {4lahN {\tum_xPnt o lon% o n0;Pnt F"eof anI chrgtfps0 Errrg}ftiF"e9 Car 0Ttuef";⌐r * r b╚ttere(:o_ind ; ) al:,ifar rn rin t1); pjz s"Isgcne⌠.v9o61 e RhE'7tò 2{*b3-C=e) {dxerlng L bokEargC+oe/v((l5rgtfpGetu)>oe Csplitc, set_elemevalemrRdwaTl:,rgC+oe/v(Ye {dxerlng L beh\ktpseGn, sodeg#Ag L bRapnCE a rno(vmpen, sod the Ks:saN {\kts"rgC+=t(v*n Rcch.cov!n dRo("eood(ï->"o e RhEgf∙neer(vN Ks /fnumber((=(c ╚ fi g() reuo/vnt s²star(v,((=(c a=├mpd1 1"; a {\tum=R 1"RC=δee2{1"RC=δ lhs =f, ste0t char *s0, *s1; int2, 3,Ff╚ fi g{ o l2{1"RC=δ fi g{ o loaeuo/vnt s²star(vl╚ figo} e Ks:hinCar sp(rM╕scab(o; pjd-ÿ,peσoae[ s"vitc,: & & b3.r * formats are note/vntb.v97tò 2{*b3F"e9#aTgfpsk, &ar *s0,F{*b(no; π 1e[ r_sn+rf8enIRC=δ lhs =f, ste0t )aurtlNtee0t charG:Ff╚psk,ode/bfAstar(vl╚ figoszo≤ef fic#i fnEIRapnC+cmveemtf; rt╔e,rEIRapnC+h\ktpseGnε{\kp-n; o=mocha0t c{dxgi amt o lon% o n0;Pnt F"eof anI chrgtfps0 Errrg}fRpb(no; π 1e²st=t(vaTg² anRapnsteote/ naurtlNtee0t charG:F┌/e2{1"RC=δ lhWsam#+UMoC ts"foeO╠3 ep═δ kts"8# b1{ (aaaaaoo(vmy(l5b3-C╔Re'd chrgtfps0 Er beh\ktpseGn, sodeg#AgNL(v9e(us charb(osiheciyarp "; char *s0, *s1; r rn charG:F┌/e2{1"pssp am#c18n, sg;πolt rtpseGnodeA o "e)ëiDtpsh, *stb.v9=((=arp lemevSo charG:NtehA-charG:F┌/e2{1"RC=δ lhWsam#+0t co L bRapmeems f∙n0apmeems ehaEateam#+0t co L ie*n sp( slintrg->rc(vl╚:F┌); pjz s"IsgnC+ntrg->=f, ste0t1); lp lb(pl;r beh\$(sp( ae[\ar(2kEar⌠rg-nn :c,t co L bRap2{1"RC=δ lhWsam#+0t co 1Nirhil4xeuodGe⌠ar *Ico 1Nirhil#hE'7(l)te0tf╚ fi :*7orar *IRapnC+Mb24r o lon% o ndGe⌠b⌐r * D'lo *Ico b⌐r9s(:,ifL bRap2{uf ?c╓A*s11l:,rgC+n7)te0tf╚ fi :*7orar *IRo:F┌sieAi note/vw1"RC=δ lhWAifL bRat; πfvp┬eRap2{1IcoUNe rtp rtp1"p2egcharGa û{\ "RC RC=δ fiegp1rG:n¿ae/vF insp( L 3n-.ar\=f,/vFo nh\=fV₧uvF insp( Lfnumm#A o n0; mber(vme f=ar pl;vta kts"ci;tare+1ficvTfi g( nC+clNtlco 1 cRcr=((\har'vnte/vF gC+δ fi oeatehar chb e2{*b3-teree:tms rb(osiheciyarusod tvl╚ figo} e Ks:hinCarms dF#e) {rc(vl╚vnt e0tfktsdF#tpse+clN+ *I charG:F┌/e+clN+ *I chahrgtficvTfi g( nC+clNtlcNL bRms rb(on-1:lrpn1&crar charGa nodwa) {Nirtp_nugrnoEargC+=oxer_stec, 3t *IRaòsgcne⌠.v9o61 e RhE'7l#h; pjz s"I0tf, so rb(o,1oGa nta:4t f= n, soo(vmyn_4dxer;dFGsom;⌐r pUI%cnarg(aDçsi *sctcf5rciyarusod, soo(vmvp┬e8I%c+)n"oupjzv:Tc(b⌐r9 gC+nY0 vmvx*⌠b⌐r * I0tfF in0 c"eo0ate/p O s terëts""e Krn : soo(vmyn_4dxer;j: 0.tehar char *sae/vF ievF ievFoÑsoo(vmynLliyarusr CE a rl=7(lhil4,f*ae;n_4dsp(r%c+ chb Bt* I0tfF 3ivF gC+δlF#e)?c╓i{1"lcR>Üte Krnte0tA Θ(Orn : soo(vmyn_4dxer;j: 0.teha CE lp Oe'd 3 p3solNtl#Ag L bRapaDçsi,f*ckAue) {Puta;πoe/vNloae(b⌐r9 ,sn : soop1t1); pjz0ap 4nA:7,>Öare+0vF gg L bRa I0tfF 3ivF gC+δlF#e)?c╓i{1"lcR>Üte Krnte0tA Θ(Orn : Gya û{\ "Rs11l3 *s1;rí"lcpRC=δ+FGso pU;pRC=n :"lcR& 8;pRC=n ╜ *scttttttttttttediv9e(us 1;rí"eo0ate/p O s te ╜ *sctvme f=:er;dFG so rb(o,SNu+:gvvp┬eRap2{1eoR2{*b3-tereep$s"I0tf, sgtfpaN { : Gya insp( C=δbts"cd, so* I gg "eo0ate/pm(11"RC=δ ,Rap2{1In :┬eRap2e1/vFo yiT=δ ,Rap2{(vmrí"urt;j: 0.tehar paC=nvme f=:er;dFG sF gCrΓeemF 3upaN o rftf, sls1; 7F ievhar dFG sF gCrΓeemF 3up3 mb fieri :*7orar *IRo:F┌sieAi note/vwer;dFGoe ;uta;:F┌/e2{1"RC=δ lhWs+n7paCA Θ(OrtlND{(vmkts,f*ckAue)te Krs =f,E l fi oeatepeσ fu=f,E S!ÿvF o r{Puta9(us dwa)vt(); obuf = ≤vme o=th "eo=th s²svF o r{Puta ktuvTf, sls1;Goe ;utu= ≤vme o=th "eo=th s²Gya û{\ ,"eoC+clNtg"are =th "enehaND{(r'v%&autahnC+clNt1n_4dxerrpGetu)>oe Csplitc, set_elemesoo(vmyn╞Tefs0 E*s1lae;n_4dsp(r%c+ c=th "e & & bF 3up3 mb+ c=tbC+cl3s/oraek9plitc E* L bRa I0sUûE0EenebC+cl3s/oplitcT=δnA>oe CspF 3upaN o rftfp ;uta;:F┌/cT=δnote/nNtg"; pauRmabRaoo=thrrrg}o *Ico b1c*Goern bRaRmab e2{*bte0t/,&ar *s0, fi oen'AAAAvvvvⁿùB8Auufffffffffvvvvvvvvvv8CCCCCCCCCuffffffffffAAAAAAAAAuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvfAAAAAAAAA33333333333333333333333[[[[[[[[[ufffffffffffffffffffffffffffffffv[}\>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]% =O888888888ffffffffffffAAAAAAAAAueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefuuuuuuuuupeeeeeeeeeeeeeeeeeeeeeeeee33vRCCCCCCCCCCCCCCCCCCCCfuuuuuuuuueeeeeeeeeeeeeeeeeeeeeeepppppppppeeeeeeeeeeffffffffffffffffpAAAAAAAAAueeeeeeeeeeeeeeeeeeeeeeeO9+BNgC=b3vvvvvvvvvppppppppppuuuuuuuuufeeeeeeeeeeeeeeeeeeeeeeeeeARRRRRRRRRRRRppppppppppppppppppuuuuuuuuueeeeeeeeeeeeeeeeeeeeeeefffffffffee333333333333333333333NNNNNNNNNNNN8bggggggggggggggggggvAAAAAAAAAAAAAAAAfpppppppppueeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffuuuuuuuuuReeeeeeeeeeeeeeeeeeeeeeeeeppU5O""""""""""""""""""""""""""""""GC>Y[}%\\\\\\\\\\\\\\\\\\\\\9++++++++++++3bNv8BBBBBBBBBBBBBBBBBBBffffffffffffffffffuuuuuuuuueeeeeeeeeeeeeeeeeeeeeeeRgggggggggeeccccccccccccccccccppppppppppppppppAfffffffffueeeeeeeeeeeeeeeeeeeeeeebbbbbbbbbbbbbbbbbbbbbRRRRRRRRRRRR3ddddddddddNvvvvvvvvvA=cuuuuuuuuupeeeeeeeeeeeeeeeeeeeeeeeeefffffffffffgggggggggcuuuuuuuuueeeeeeeeeeeeeeeeeeeeeeepppppppppeeCU5O"ymbhhhhhhhhhhhhhhhhhG9_38wwwwwwwwwwwwwwwwwwwwwRAAAAAAAAAAAAdNNNNNNNNNNlllllllllcffffffffffffffffpgvvvvvvvvvueeeeeeeeeeeeeeeeeeeeeeeccccccccccccccccccpluuuuuuuuufeeeeeeeeeeeeeeeeeeeeeeeee=++++++++++++++++++++++++++bhhhhhhhhhhh,3mmmmmmmmmmmmmmmmmmmmmRAAAAAAAAAAAAdNgccccccccccpppppppppluuuuuuuuueeeeeeeeeeeeeeeeeeeeeeefffffffffeeeeeeeeeeevvvvvvvvvlccccccccccccccccfpppppppppueeeeeeeeeeeeeeeeeeeeeee*******************************************************************************?5.VW6ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëïσ!!!!!!!!!!!!!!!!!!!!!!!Sê|||||||||||||||||||||||||||||||||||||||||||||||||∞ÿ╞j>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Y[CUB}O"h:99999999999999999yGmmmmmmmmmmmmmmmmmmmmmmmmmm]\_w=bbbbbbbbbbbb,3333333333333333333333333333333333333333RlNAAAAAAAAAfvduuuuuuuuuceeeeeeeeeeeeeeeeeeeeeeeeeppnllllllllllfguuuuuuuuu eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeec eemmmmmmmmmmmm:h+++++++++++++++++++++b,3vvvvvvvvvvvRNniiiiiiiiiipgAllllllllllllllllcfffffffff eeeeeeeeeeeeeeeeuuniiiiiiiiiipdlccccccccc eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef eeOS5.8w*CUT;"9h0000000000000000000yyyyyyyyyyyyyyyyyG,,,,,,,,,,,,:mRRRRRRRRRRRRRRRRRRRRRb+_u3vigggggggggggpnlllllllllllllllllllllllllfdNNNNNNNNN eeeeeeeeeeeeeeeecciupnllllllllllfffffffff eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeA ee:hb,,,,,,,,,,,,0gRRRRRRRRRRRRRRRRRRRRRmc=3udvniiiiiiiiiippppppppppppppppAAAAAAAAAAAlllllllll eeeeeeeeeeeeeeeeffucniiiiiiiiiipNNNNNNNNN