From 48eebb71280aa333d5fb6b166738de1e81723630 Mon Sep 17 00:00:00 2001 From: thomasabishop Date: Fri, 10 Feb 2023 07:37:15 +0000 Subject: [PATCH] Autosave: 2023-02-10 07:37:15 --- .../NodeJS/REST_APIs/4_DELETE.md | 0 Programming_Languages/Shell/Awk.md | 98 ++++++++++++++++-- Untitled.canvas | 1 + _img/awk-outline.png | Bin 0 -> 23543 bytes 4 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 Programming_Languages/NodeJS/REST_APIs/4_DELETE.md create mode 100644 Untitled.canvas create mode 100644 _img/awk-outline.png diff --git a/Programming_Languages/NodeJS/REST_APIs/4_DELETE.md b/Programming_Languages/NodeJS/REST_APIs/4_DELETE.md new file mode 100644 index 0000000..e69de29 diff --git a/Programming_Languages/Shell/Awk.md b/Programming_Languages/Shell/Awk.md index 5452e75..046eb4e 100644 --- a/Programming_Languages/Shell/Awk.md +++ b/Programming_Languages/Shell/Awk.md @@ -26,7 +26,33 @@ We can also obviously pipe to it. ## Syntactic structure -An `awk` program consists in a sequence of pattern-action statements and optional functional definitions. `awk` is line-oriented. +`awk` is a line-oriented language. + +An `awk` program consists in a sequence of **pattern: action** statements and optional functional definitions. + +For most of the examples we will use this list as the input: + +``` +cloud +existence +ministerial +falcon +town +sky +top +bookworm +bookcase +war +Peter 89 +Lucia 95 +Thomas 76 +Marta 67 +Joe 92 +Alex 78 +Sophia 90 +Alfred 65 +Kate 46 +``` ### Patterns and actions @@ -38,16 +64,18 @@ pattern {action} A **pattern** is what you want to match against. It can be a literal string or a regex. The **action** is what process you want to execute against the lines in the input that match the pattern. -The following script prints each line of input that contains the word "error": +The following script prints the line that matches `Joe`: ```bash -/error/ {print} file.tx +awk '/Joe/ {print}' list.txt ``` -`/error/` is the patttern and `{print}` is the action. +`/Joe/` is the patttern and `{print}` is the action. ### Lines, records, fields +![](/_img/awk-outline.png) + When `awk` receives a file it divides the lines into **records**. Each line `awk` receives is broken up into a sequence of **fields**. @@ -56,18 +84,66 @@ The fields are accessed by special variables: - `$1` reads the first field, `$2` reads the second field and so on. -- The variable `$0` refers to the whole recordk +- The variable `$0` refers to the whole record -### Patterns and actions +So, in the picture `cloud existence ministerial` corresponse to `$1` `$2` `$3` -### Variables +## Basic examples -Variables are denoted with a leading `$`. The fields of input are denoted sequentially with `$1, $2, $3...` - -This script prints the first and third fields of each line of input: +**_Match a pattern_** ```bash -{ print $1, $2 } +awk '/book/ { print }' list.txt +# bookworm +# bookcase ``` +**_Print all words that are longer that five characters_** + +```bash +awk 'length($1) > 5 { print $0 }' list.txt +``` + +For the first field of every line (we only have one field per line), if it is greater than 5 characters print it. The "every line" part is provided for via the all fields variable - `$0`. + +We actually don't need to include the `{ print $0 }` action, as this is the default behaviour. We could have just put `length($1) > 5 list.txt` + +**_Print all words that do not have three characters_** + +```bash +awk '!(length($1) == 3)' list.txt +``` + +Here we negate by prepending the pattern with `!` and wrapping it in parentheses. + +**_Return words that are either three characters or four characters in length_** + +``` +awk '(length($1) == 3) || (length($1) == 4)' list.txt +``` + +Here we use the logical OR to match against more than one pattern. Notice that whenever we use a Boolean operator such as NOT or OR, we wrap our pattern in parentheses. + +**_Match and string-interpolate the output_** + +```bash +awk 'length($1) > 0 {print $1, "has", length($1), "chars"}' list.txt + +# storeroom has 9 chars +# tree has 4 chars +# cup has 3 chars +``` + +**_Match against a numerical property_** + +```bash +awk '$2 >= 90 { print $0 }' scores.txt + +# Lucia 95 +# Joe 92 +# Sophia 90 +``` + +This returns the records where there is a secondary numerical field that is greater than 90. + https://zetcode.com/lang/awk/ diff --git a/Untitled.canvas b/Untitled.canvas new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/Untitled.canvas @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/_img/awk-outline.png b/_img/awk-outline.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff7848ececb79bc26172bbca334b322a0d8f8c5 GIT binary patch literal 23543 zcmeFZ2UJtr*Ds34qo{x$3nCyOih>}ZROu=zhTdB!(xpZS9RgNVq=qJ4snUDsiOK;a zlqkKUw9rDNBq5NHyW;uZ@B79b<9=h@_wIP_zVW^cGO~BF_S$RBHP@WK`I~d|MqgKh z;~38|78Vu`$b-9vEG&OwSy=u!bL24iW|ixc75F&%_<;qSh2?k~^L?Nb_R$f1$?bd3 z+}8-^>>FU`zS zRInddHsm~|f8=W3$OMiUt0mFc#eodb^D(rks54*9n99P1RpYGJD8b|!Hb~?FFt#V+ zR`(j&zyZsX=%?@5nFkj|4l+-Lo=Gv!9{ktoe@WxNl;J1d;C+9rYf7zlX(7RE~UPVOcYI5@t&BAcTK6lm7a8Xgw z)qty@dF7a!msekDYK7xiwbO#c%TuQkJ?}@b^QGCfMHK3bBsQM`jYiiv-?q0Xy67(U zrbE{aMNZxxbGH8)_kmm0{%&J8Q(eXTGRA6NI;9^yZRUA+m$aH~*Y+xuuS2$bpEA3GnwhPiV&1<&Z z%yQxXEK7qlPHJY6gUuC-N#_(xad7gbuF=Tk9yibK8gWmj^3t}^cu(#dBCboe+Q=ST z%dczqUMlZlJK_cFJtng35rXaed^2oX36Y1|jays12U)=k(@)>#zARsxb5THGRG5`q zq~l;>vTI_Thejzvs^1q~?jD~o8W~Shy9UEbrd-3($g>e;uv<40$gW)nno)&CbyD;d zzy89wFHf*S5N`;y z-@IoNn{2FR`hcJUX-9HE1;A)L%8xl?o&_HH{ma z`l@Xfm6fSP>*xeIea@MzF1?{{NI@^2r=jdo+@_hTh+;#F?})F1!=^ov1*n!y zHzTj0QmGW$hv4Uf^|RmXEy)kuG}s@QSnC{1nxfcNm8pnF_qt}a3JskQMtGe~272Sc zo)xrP{g4} zD=I7s>5DzEzU|a9g^j|x)uQU-T74n~ZjLj9$CvAM_hfO<5!!dSi}0Ut8&!Pe2$2f?@ubCb=NrxAES>+K@C zcO8eCkVJ)`Mdc`|-1>4X=KP@HGpu6i&DwV>@rV#kWSOxEG@&>iQ8W7&Qw%KIFWyJ- z^I96jQz&KKzxb8C8s*v!AOHG+zG8?;hLA_vza40&ZB2|zx7bYy)LW&WfqjBL3#N$?Ae-; zS;F((?fnMUwee(CL@?v)!piQT$-)!siC{#=;#6c&u^1xG%)%@^c`AwtRG#=<7RlA< zFfq%oDi%%R%*VVC6%!k65T8ly}K{nE2Wn7b8v5zI*{r}!d$Sp5OYa3(U+!+LD%y~oab``w|W z%J)OtW#W#jpH&3vhHPvftY`|%`mGo(Jz}D!z=1!VwjZe9ySL&V!YJsdE2=2#i?fMB zxdCH=V34@Z3{fQWK5(60HF&L$v)9$bO_b_wCL^~Hv(T!x zo~dWze9y@JsOXB@JqPIiFGr&AY(-d0+;GR@DdRyCcL#W}z*dJA=)v3!Ol7UOy;} zQm%-p_Bj%wb;^SFlZI()eJiJohdA-4-0vlszHT9pI&1jKrd4S8HJdEl#dMcCLr5goJ?hi_|w(pe@%=EgfQ_1Batn zn-i881$=RL+DU) zgsM(aS@{DeCqdBkm6oSx`!(qIG)%8YkKc(in|1CZ;w>w0#`oAGYb$Mr(;Q+ zS4;EJWE8o!{1G;io6V5gnY`U>_yELZl{fxM^c+71308AgbdvU>z3@q?jM$C56T|;a zo|ROl0|$QCl<9{ZY$^`vh+9lgXQd4fPgdn9n2Fn%BH!$d6rsb~LuuA!3XexnGW8|} zw$_F-m`jf=D{J35>9h|T*W&wxMd3pX(#)zt=_5vcs2+*N}eL^XvxD*cTt_(c56+a$OTV(Q?6#6gxPHedxh+#-j@8a-EiQVy^{UnJjgZv=b$ zeafFs(AO56Y&Ch6Ig?H-pPXHq$sdZuOn(Da&0G4Ymko8~@5<(MD`u~~eThz|rHefS znP~L=pW2Hjm{T~(+>I=^PTgkOPZpv7FP$RuiYE{0hm{dMAQMZ&Own96d!*x5zG}1% zqK(nJN3ahjB*b0mYT`^eYF0E}0RHZW&gsOBCVNA31CanumT&IuEB1!g>!P6j;1TSS zvAKCX8qY2gzzu%tJ>W-KhfI{tL>IHRjXc-y#jBEXkQ+~cw_U#|}Kz*@L0^r=n8Gg@XN zeNqg4vT5_eQqDc^*w5d*U`zW_R8(GWL-bs)p9#wxY4@M-te>99b-{XjCYDU;kkTf< zA?h0Go~$enw}eFw4nvF_jPUry#l_nC`jjdjxho4za#jhjEc72NPvlKa*8jKwk!W7q zv>?V7;K!zZP`ertRWb5kgE*1ds5W@O-He8u$;g~Yp zM;&CTEIOH3Wnf0=$4$XEp_5J z%cp{l+!Ur1 zA?-bTQh@}VIx=)VSD=?hWos(UmRWXCSRTk;uU;E6v+d1`6`&Wml@}Fty;7rnSZgMt z$Gj#y2gb+KQf#y0Cx{Iy@>9NWODMG2L(Ts0*R;)Iv5}j73n_H_Xs1}U{lLDPaG!cY zxx4LUcN<=f^I>2Hv#&i`Nv5gNF1lW5YBFti+}-Hf*_mG%A-m8eNUsWM43~vG5x%6} zxK`c0HTza_F)u+ib9Z;wDvZk6xE_G%_U`0Qe{)*6pswz6%Kn;~PbXhMsdrSC4R0#} zFTR|njb!SdM@{e7N&g7~wJ!jZ-b$X7&ffX^2DeJE_E|}rj6Hz{HJ}-0&Yzzha$lQB zM;Diu_pu&Vy2g4w@D^&qf5O3OEH!v$kU7Abz>V4PKoC-o8Xv)m6eXzAi?q{Z zin^;kQQWD__wy5Bwqd>-?Ts59>6+t<<;}WZ>(SKS?bVSA_*kV~o6nNqD@P21(rbp^ z9HLR*2y2czBefOWeU7W{{OBWI(unC1R-?X&%D%3;g~v$-g@_Sq=VBCyEiji~KR#!6 zN3e4vpC4DgPDJ2BHhW?8ko8u|w8UOdwwl`8v*OtIx1U$9zOZiQz+Q>Uj>~h<{V=3n zJz zrn+RrGqt_~z3bLBL3CB43>JjyTt_qIAG|OVoJSo_5B~8<+00<6LcN_KUde?7j7LOQakt`?T=4 z2G>`Z72*{g?;GB*)fc*>E`U|tTg$xt{IFkRJip8%ee#$KQK*YC>1S5&ITJXiL!A>~ zyc1H``1^Ft40;c}+=Nq}+g@v!i@AFCZ6kFN>ccolDQs!*e@NA-=AIB2vXR? zD~M$fh%36v7cs5tP0FM}BkC*{Iu6WfA(I&D0(S7C#2$HZ{6X+E4mvBFD#Tn2E?pH_ zN%W3=SjZHy`qB3L=FY-Q)>a_G#UlsxyrJ6TwqvoSdAQf)-j@?x33jW%AD4 z)icL}R?A_%tZF+?+4&S@@L5|!p^LV<`>!rtJHYbL=z>VDV~h$p0fNNP79{=s}fvPYPx;NtrrtlTP4UkrH$7y26Aj%5u7w|HLHf}8oC+g)hJWHuX{7u zCokR4%g>ihz@;JaSs@aTPO2*HR~z+vY}nw9>iO4g@a259)oNlz7-{vq|I&w|l9FzS zFhUWZ&1miO%T`#<8yp(Sud4Dcqu2T__g}Mal7Up)Q#a+U;TlKk^^o&TtL5FX;hO_} zew3N;@O^SUX5qzLEG{=zHSNxaZ$ULvfLr92wt)a1YQdmd0lw%f5q_z4xx~aBvs{o4 z|NN56Um{)6&n;|YE4#3`Sd@q$hBR|L{@1FKemp<1(2UQ{78-M}P=POfc(wT96+bpM zoR%Qe1)bR)KCj?yj~aLTn`e)_J#Jo9NN>4plK`pSTW`k0!uLW{!&kTz)u~{6r2&F- ztz}D>I*`3z+o7tmTtX(3X+Lt_`j8WAHlGVvC2H^^=rcdELiTN)`!Z5-VdTUpZs{w{ zy6@tIvqCp@__zRIb-uDyDC9rx-5GUWK?<_DYHK^e&0bmy>}-bLaAHO%)@5s38kbl) z)oROoi1hbqJ>LjNF_n$^gdo~RXMzwhm{8Dg#?8%5%I?dKP?vSUOl!x3x@-oG%hk&XtUMb3BHq+#MS_f83Hh; zL5w|y0%Y@Tw*(ICEG^3|;FA>v@F8n;;jt#x;dBlKa>LwK^J<0U^6SLu?IF$R=;+4z zey!$f={M$*l(%|nAjt1ZYn2_UtyJ;EoW-nQpQJd4&tGC#h+`O9K76btXbUOi2fP-n zS(rY_o4zUA*e@y3>=7MbqPE|qx7j|RD>?RhN+@V|xe)&4P4>zuWSQ^CR7I>Rq8mDG zSS@#e<$VS)g@5-c5htnC)Ve?IfV0qpLZOg}Des!_fW}-x>HA2phjr6(ug(KE0AV`DU`+m*)K>b$Fle`zX3te9E z`F{l_JxhqXby|<9mtuZhnFq9x=L3H{o$@j&rY4#WO`tWAuLQz`x|7AB4%E`I8l-Oz zysl}Qc2?5>e$|)jxSvFbr*5g?3Pg?4!E^=?I2_IoI*?7Sudk<6e_1ahGyt%*)Di=X zb*0VtVU{Nxy}2ogcY(RV?0x;_-to(r&0FpE#PXx@!$jHoB11$jRgh$rb8D8BLg`AaK zSH0%y=?dxh<|r>``oy7@tN%8+F5oNcYg>lp7xXPGQn6U9ME5by{1f_M!OnvPyPJ(h zAbq2hAGx|tUGN+(-#jw95?fzZyYgZ@|JYeKHyc>JlQ^OL1OoUOnzCzup6v9;hNhL3 z6)#-CVoxfyOD{Z4T34;L=7i+_Ml7)JrTu4HBDc_6QyBr%^)*|%N(-Jagu6t`kC33n zF_*0pTY3}x*@mI0i7oxoORxK8r0x334{p*IqU-SZYX=n}_0tNsEm+cQ5e|ck1k=SCx}62AL;RwjWzUmF{FD zCl8azAD1+l2&AYmD@{w1ZgCbZ#~5m;a@c~|D#@$uem@}{yuE}(nPJhEcvQ#^RK%qh znxjKa^RTM=`A0uUbSxCAQN8yUY*iCB<~o@)#^@Ti!F@oefQC%}@yPDbUNdL83H=%v9W(UtwPQ47cQu8&`BC z2~r{+uQ%cyn+Yf_cX#*lR7sYlf;WGq zguia8ZRU=G`*gqO`iP?*2-dtZ;YHR#LnhSNY=*KVhUQ~|*8tHtNk{)abVsiA0cDnJV@_Lm+PqQrkQXL6OiNq~%PM zebu{kuO;P`v1sZ^$SEgiG{OMt8nYR`@=(CqqFR zvKb#6n%B)?iex``{Q^FmqD1|ELK3TsOeMzr_gVm@GHwad;NV^X&;>H8-s#JWqt?SZ z@2(3r6Q?&`|3nxSmRAwCxojRFK}+*8tICUzU$42={BfV5JlU5e-pXd}}!|L33`Q z`QY(W!1s1H9Xz3YAwf91vE#_6>1`9(_F}z$d0M>?fP`a4k`+EN07FbPmx`S^My27^ zT*3h9A*Tc&fMa>fN^yp4kPmZX3he*Nq3u%`nL%*8^Pa&3{_CaKp4UJ5F4cpOtXY{s ztL>vR1EHp-5rOd1BEpUp6q*2{ud&9Ks;aA7i@mG;i{kau$lMr3Q4S6gbyyw~UsBO{ zMN&IlFt;q4KWx9m$}u#LRVH-;rrB?URXI@Ck>jmRUXhP#>yA?FfBcOL=k2Q zoAg;NqyBoOmT~e@1il3pt~6pBj>rmKDFW&wyhp^?PS@d7AxIUWOHD#do>zIURYw)K`xHieH|=*y1Uw6^EWCB_&z! zM_XE2O1bo{e!jzWu0h-JQGCr>#}$8lVuC99=|BhP-n7h!-QDw{zdnz_aWU~B!015n zxwR!BK^;-blu7tl5Iz&$b3+59n;m!ABptu(Y$&XJ%r&&OP6GQFK*(n{6qBpl+x7Z= zX(7dhBljD}r%qLLWs!#thVL4IP#XF4AnQC^VVLTr`%zzOT?eEBzr8;nyd>z(*VSwY zV-hX58bQdM3Wc?bD@Bb93Q)fqj0F{D`T(F2U@_C*p9Tt7gaW1z0VxYE*(#SqO64pC zA=8`5_48^K4LMtTZL!M8t44k6)xERrTAQSba1{VnTs{!HO{Q3%ls-6?o?1{p>rW5UINE$r)5Q+18@0th3ZWsWbk2`kdVjC7b`+wf@NhYugRG2f%OE9OV% zVpgkrCBwWeK<;X*DmF}Jt}}Wy<9w*e3AN1!VYGzomY`R^p`VNB$88XlP(adW=q{n8K{TNWIU#=u12=oOQ3f; z6&4Z`Mih%n<-;ccCb0sTWKd7CQ3%}faSQ;4QM^iW!1kxg!)ySdRYhCh<&^?A3=fU- z+r|rLeJ#}6)s9hETv`Km*7@7}&la_h?D#{MK3Mq;Nh%3EU+t^MDM=0#=;1(2f&AGP z;l#A9`w_f8Z5$ZfyfiMb&7VP^z%KwCEDI!J$6OgHCI-h@2P|OrSFsu7cFE*j86~hY z;M8qMc2{03;#vrR<`E|Zl9>^FJC|(_Az(6IX?>@SM}90f;M^3I3P8s?xj|2bzPky4 z_qWR;tI5LMdBv#+BB)Kob*)T@D#XlJX62TX3fn)KfzfcP2~n1R_RRVXaf zWOr|L3Z&FC1}1>3%e1I*Ug%R|2xF)O*Z^(3o7;3K0WF%8wSN|Cv6XDE)p{jlmKoXr z)-XdaZ1x?~AfI_l2qKSR=2uE8`YwTZ%}7_Faq{vXEVm$>$d-*v7T!AVxseRKbN)}l z^Ub<^0WGA}G`^fkcGpkHBJ6`K8G2gB*hKp&83$JLby-H^(uCy-7Ty=+HO7Uxuv=Al z>R8C#$Q_TsFBhlyc+WtG-JvX>I*6%-*`fhQx9?D0*qCK$PokgvKULKAy9nk|KjvLW zLUKy;F_xve*BC1+7!yHNv+N7%8lmp*_- z{dDE7{(U#EQZ27iv46F5I(L%U{;ocAGAxjP(xY+zb^8AgX&{SzxIW$Ym_Z-~ITp&F zg*&c1@9G&_DE|XYUoPmG)bM)V95Or@+F0^KK!N1(n}Y{6O;O=%5m4m4w^-{#B_Sg= zT`{@c)`!3)9&&#=(Hv5&la%GlCQT}vV3}gSD+o?WrK&Ln`k$-S-%v>lJy3_i^v$>f zdqhxD72(u{yc|Tsh4;yt*(Tr%lgJ!tg_-2`&|e1yma5m@2xs-U7G~S@`^#~G$lJD$ zx?+YDVq$ok;N^TNGmvj*;bjGtL1xz0nOm5>OkkPNa0_*Hb@B`h)3Rqx>@&kD2!q&4 zpIeOC*gWBV6jI4&_V2#9wen_SUn^xF79k_!*q;}hpObS@Cp!AFCy^PY){WSt3sL)1 z(23p-AQ!p=uKkpJTmOC+0oXtYvM?)HbY`bRUMWRwb1ByX<>9*66I7Q+5Vx!q0fCz) zQbt}jX?yhdRqEiXXdYQn$R?9;vDp8@CYhLf9{lt~z8xxgwdl@=I90?7Qb^1+k$jSw zv42A9dM%|{oRi}+<_`Ra>f=#6g&&^|R!^ZO3YwY}Yn*X?0MssyfFXj6L`p+{IWr3q zy7cu8x4f4X2ymqUjjIg4qfU`VFh3tO{4Xa<;s8=r2APq&sOjL6o>XaJ`I%6yFa)6v znE1;|7(m+1rICtpGC}^Xo}x z1K#jopNZYE66l)%u?_I-5t>$Cgs!H~Xk)_YO&Q%EUY$qM$y4&SRIJ$+eu!Vq`ahxT zTa|12Mcb+5j)Fmur(^L*1CHM0-o1M+4~7BK0%7yjSe5-i5aLWXtwOgxp9s64{_1#d zBR*6%o0^iKrRuYUVC5U+M(U)?iOT~h4$@3E_dPLy|IK*EgtWDiVK)HfghNnt2$Qf+ zPYzJW8}S9Um@uGM7Uk&0H0|vDI~`HnnX!6liDC5Jg-JNB>!@&;s8;f|WfTEH9ut0k zm;+0v%w&fU=`-7_Gm-*(OBw?pH$~y|)%U{C$pDSyURJ<0!tsj$Drq5qbH|f-)pVg$ zA2J36ZK>8MPe7SCFtW0UP5bb=`T$H@#F`kGF3Reel;-SY1s&?nu?O;9%^qXbeK-PvK>d7=YhmrG%L1!fgGj9MZt$o#PK6;U?b6rdq86eFW{_Yl zto`-0o~lKEQ|$jpIG;SF^6S$7TjakoQc3L;2v>$| zmLtd(?tA|e8gyN_E^B)`G(}=L@NZPpZnQKN?02CqqzQkQ_0Yfcvx%8V9-o+KwpI<_ ze^v{q(d9r|MWX+75WWwGD?R(7b$XxHM>eaQdv^n(cn7^+%Ko^c1!Wz;AGQ-Ok-KV| zCL3akbo}w@sryub`sy-OBG7Yt9DBjTv$$CCS?!R0N#8q0z%OO)KaSz?i4o7eXdPHz04Q!|rmG{4^QD1c(Q%)42!zsBOw!dlfN-Se@bUAB zd2=uS0`!BV^-pla%9tL5`xZ=Ei(Adh3OSE0DaVG>X!s!NLW+`lHOaMolM{lBjEoH5 zG3_vsm6i1ivzeGQXL4@DE{7D}gy}5eTS@dgp`r@d*VjMWq}35@tQFN}{6?mDYY9m(M{Q)pZiIZREr_b|UkfAtoh|$J$bk(z zOuGFI+yc-sfu8At+-i1rKp5^b7cHL;(nHKF2dKYpMNMt{l`?CvHMR8bTbP)c1%%mD z*|+noiir--T;84B!Ucr!D|va;Pk@wS!vs%(4)KUzN2?rFv3lorpjcX0CuuVy6FiRd-Vn zMMnqOLhyujzc_ljsWkn%-5viKM7>ZKlZ8qd4{_)aMW8`iD8M4%$5U3v&3S1fGqVw= zAh6O-fpQ*8mD=ajRQ1$IzR3CI!Ypk0=_`&)l`-ERNqW5aa1o3UdNzS-WO{fDWs%mnO@+s}PKa;ntt&jC&K2zH3IwI`mEHXehktCJmbPLI#*=H*Ri zhK{mi%w}P(b`6bKB?twr zfK1MOyasSvW1tLWHB|iykU-+w_fgfBRrdGLjORqWnC-sLE}4*iI!3J=ZVi%^?OcqT zg&97ZmKsT!2y)_D)%b&2p&*a}`d!!1M`ZE@1=S{&3`8BtxCcp7;2A%WG-R+)L zPA8o5R;l*DVAvj^#BX)D$o!h_RtXaxvpn=Ug1tVsj$s@Co^>@>KtV?KOOR*6LB|KQ2E*y_NHz3{wj?J*$nyR zX;$Z88J6oV2&bi+;;3|zhhte--0pz(2~f-2Q;E+)I2XKnqH|07cL5lvmHQ`%2JYxz zPk8-%`P{!(1hTOF_aGZQ0fxLNt-|7Q09|)SG|@Tu%rEH8@B$5{yjeb#-qDYELujCD z$NoNNd02BvMBNE*Bho%6t#V8|FBkrAEpO>ZV8<1mgMY6S3k!@VjmoT;2CsjfFarnw zD&GS~|Efp?NB@fX{}+b)zok2&d(Ocuf$;MdqZ+K7DSg}5Sy?uRhZ+~KK-m( zA!n>8a~b3)n6H-nlZn0dhjL5tWq#5sz{W4WFzfA0<^LV2g2!{N4ZE-}hb${O2cP@r z0_dOrZ%rSnJb`ivKJt4Qw~ED_4`zub@40jOMaF5%cE7*AUdVau5C=PZ&-V4oH%G9j$K|WV zer>y{{J;4d7P#eV1c#4xK*6i0I(PNu*w~LBFK#XKEO>Q*dG)7^!Rg@wE3Zf3XVz#)8~w+<@V`a5{zWwW+ryRMF8>Fq{{M-igGBahv-}#a zHpzobXmEWT?)kWsJcMU2nphu5^C`iWs|>Uqd?KGTq+c<==~SJD@4C)DW<4bu;9vA> zyT)f1Sja%;QWkLE<`#mmUI`dkmep`=UV8S8-sW|ig6AKRJiI;_;bXRRqd=Q4N%hv- zoZcoS$_aYS&dTC>DHcflSuGtdSgz_n4l(>J zzFdkD+qP_UuTjOt9#=MHek$Iq11WrxQ%l{dJJ zmotm3TZX>ndc-IxZuJ$bOF=YKkMgAlnJuB6-dNvfoR`lTm#=b6=wy8u8h>cot?;Yq znPafX9SN;kQZMGCgiwM|oBo^`rZ$LGHfG1GIVQppnW#Ej`CZ>#G4F)RD7rROS(@5ER@WJbYV;v#7U=}lzjrRN;V{+t(Gun&vK^c(84%6;eVO;#lgImM z55wqH5KA;ghx^S77wGcPh_RPvf{AV6Xv~CG#LqEUfFCAReS7nz{e7W}_i_yzmBmvi zue|mtOk?!U^9XjavdyqNQD!zb_N^DhmOzW=7c1qNBBMs-6cx5?_!7sB3be~416Bf_ zQ(oEN$g=mP8XZ{Wlo&j`5w0%;ULS3rM&l=63Sfh!CzFp z?$R!77e~n)?X9zY!=;Re>WXbL1!aZL-1k%;o}F1`4q}Qq2&XrhDzOY@+B;#Pggle> zx~7J`VCw<1+$$xzC0e}3zFHqf;0TT^4)3<(9{w?srvy9SRd4Sd-!Oig1f5V8OchER zDKqPQ$yKu254(!qGvu@l4RRL4(rzc8LGOH$v7UL?=gxGsu-kt+!AE1hm#M@G;4u0d zqY}-w*8Yr!5qK!4Q}Sm%rOGiX{FG1BRjsv}6ukF3no-v9B{zY0_}7d8LOMcL0zAR! z!Gj4o$mtaN3G{cpIo`3yAcB1e%8f(uyF5-PUw$1~E&lSP{2Az}gw&}&Fn_Rjxz#!f z6;igGhTm25$f^8!y{5ok%U)`B;HIipb=oxxo#d#GlqT)g4AuC>psdb?m~w8OE}<8H zI;C~I@2P7YDa>I8Of`I*PH_EPlM=oh=%L`(;*m1lF%v63yR`*_D`WN7`|}2>i3vh< zw;vL%rt3$nMr;k_lK7pxFBO3H(PZ6Kzr%F}wSwOm>_#rb@6y6`YA!B_0#rTU)d)+M%3jL;l3kqik_h9mjXLGH`wpxv0qv1DW=L4B(?nmo!Nb#Z z&rG*3Y09poq4?uxwc|xQlRFg*j;hNyWW$>w&RFBdUei4cs$^0X>6ltqfMgZov=$C4 z11iGn!Ti4f=i=k#90NwND%VRln|>9nI*%JKeyj!e=L~^*lp6LVVauF2v#z@Bd=9OA z=E2sZ>XMe)D^fMWAL-GWSKbOPA28Su6J`aF~q;}k1Og|5$cmp z#&)l-nz@pAIMiq-I2a_s#{GK-e*4br-2e>T=svAgm$SisFX~5cpUX;&0DX&3{lv-v7ZTbsL>`XG8U*6-tDUa6aIAGUN0&8QP7F&J^0 z;%O4&YA|)YeOFeXPZaUUZSt68bLa4nGW8V(;mIUzJ}fN0?2;Qz^Z9IZ`yYEfQALA- zSM!fUt}-6kWO4;`bAOaD*5N}MwsEaG7PMB3yymX9k0@0%s>;m4o=-B}|Jl-1v0~6D zo+mJPUrHn2so;J&mupp`f?V!C@2*LJX<0u}kF~hRO|QaWwQ#~Dc#JnH@3?mHz80x^ z<&L4G!#pDP+G`QSBhiNJ_a259x1hCCxfHSL$0eW8AXRAGdsSEyc?_pqC`-I)tjl;J zRJ4HYHl`E}Xv8S}G%uT`OkveF24CP@giaMxe;qAW+nUo{!&F3l4Dfp>pFILLtO-t5 z&6FWt|B`ZHVrQq4e%d6FJ7T48=iOpi!>#y3TVl4&`uZFBL(@h_na=`U@AlS`?L42N za9u`dOGy;*WYNM8nHOYAc=X^3q}P6iNHXONmoj*vAiD=J{)F%IzeydV^!Zf|k1QXFn<$rd)5 z)AN1#XyI*3QZf+HcbYr&%!HugdKK?mBF_L#K;~71sIa{AEv`or?aMWkvHkgbXIFrPz=W%Xri88BPgyB}K#YGV72-*%5fG*JEj*3W z<~iDL$jbNerMz_oAv;w6O)L2vBgf82vh!$7)ZIJK85*1T4vrYjiv-3aRt#Md@SRKa zw;U&!y5HvIXY>_YUPfE(ydVAW=Lgq6VI5PS2D`EHYZ2^-qJ2ktc7)!?4sA2pE0FQ4 zO?Bm-3VM4~)3v_`?{VErQWVOQa=qmLs@^Ssz0^`R1FE*HYWMx#N!f6hEPExL^U3$P zG-Qd91rUYb%7H*UJ0EoQY_LC4pQ; zkt3Dot*9BvFINTqDpS4Mr(bDUJzG^_21=(-ZoMp+Gx6q*NW%oZK{e6~j)~wLw|>rh4WjCT}B=uhpnRw z%i|kC8rWBo`4KgFi$^eETKB8wW4nnj=cIgX=&$_l1_!k}9L}_Bk9uu?|GMLYb2rK! zDXZiCLv3-KwnZxnH;#uF%xn5*Un;~U58yxU+=0+BJZwk6{w`ij^!TM%ZXAgEILmgg zv8^1KYhZmNul)+^edlVlB>^*B9V1jLwG}3Dd#i6rc(EIYj;Wvyd+`|WZ#;|om^do` zAfiWQOyXPFMcsWz>qeY*?cWficXzt6V2gWZ>vd95MP?^h{A= zZFBnquj?bV(nYbwpn~XK9725;QB>7_*hW6EGp?y(?P!andceY9_`s9JvPZ_gdsVkY zQ9=dVf>$}Fj1ZR%e=g_jmJ^MBcI8a^?1Vt~Hh5CGVMlKG>gi6IZ3p&UZM8Dok8e5b z#ce!?kryFJz#6_3rzFfRZdvXdsNIJZIJh zH?A|fe!1&N z>j0gb@q}HkK*7fk?w#&F6-ngjf3M~#3J>k5DQhV&jbUrL!%O0_6)7UT<;yM6!X_Pt z39$2plhvm+8)l1hg3%LD1!XH+(>*iAh3(*MdARnDubupSYwwiO=Kj3dSpa^NH$f$53$t@ zj5kuVqI9U_)%pC-O6%J;X}>FAYR=ai!xK;YYuG;JmLvH@ayoV9pD@P$l9OZ%d{f`` zBEn4k#q_LKs#v#^V%!HU*U27g%B|r`f3SSag8C16+ZC>5ZJ3R`CH!S#4!OqkSAxYYtDh&TBC>aqsPKdZ4H z>ckisf4?{V{yjx)PnbWXz6{OFsyqQuNLxB#Pr@XuthBsaI4sLyQb&C3*0|$iZG{mRLxKG9FJ+a+xZrdKbJ5vNp#zu|Cv&LgoNE?VTpx|NReGdVGY~ z;fX3g`F7q_7SQZ&Lm#LA3~~Ikz{-ELbvKMiEauVZ6JKgVPbg2U^pujLh~`7ob3Yk3 zl13(;I@9fttcUl6Nmc{$c1N}&`nxYLtZ(Ti=(H+vi>PSxt#RNYC6g1wYkfZcIxLJA z34rOgoBSL?zG-b03rL>uSTNHKwTAFCxqsz-#%(xRZ<(KWOW!oGVAEI&H%cbixbMWb zU@MZu&J#j38MaCVHo8+n&#G@#l*hqW0j8nEt@C@{+_M$a9hiKVjw>Os;X|^eG7T5M zwzYPe7#JigF5TkxCc2cu+ZRs9+%|kzYRr6Y_#rA+gZqjjj~%De=k#!SeS^h1k^a*A zCBrp@^2tk@Y2HKJsUx@>i8ng`NKHJMLJHQ{{&+Ip$y~JQvR(pXp)23g!d$j!M5d6+ zW&Kgg>l9lS&TdCae?cn>9aVJCQPcNrJj7$?KHIA~DkzS__mWSf? zzxJd>64x?g6n0+ya!pLA^Ul5j5mmPSST2YWDjYEgvK|}QyM{u@{6#xdZnhAzN=!Em zymphbeDg;EIb-xL`qNhd^LuA|%tBKxXL-^w)J*nnL*G5mP6;Dh`CS+3g!q$u)C``g zk3HJ={bAXKFw4b{ZLNrbJI|yTzSO^^VA)k)YH%eDEA8GkllLpS1z1k~mPzs@k@Q^J zhvC341^N+(oc2X!8NK7E?}whkb$j^>jO43uqsS$>bl?4qIb2t93vsG}8zaPhRNXI| zU5=bxx-`4=NdN4_jg>OEU;gC5fg1DYsid;^W3q2n1R?FRm-Y0WJx3$QwGDtU~;|mv%{f zOF8x}j$X4XTubM4I+Fup+lT&h;Vp1u*Nm`-VF0DIJwv?_#jcc<%Du`(Q%`+2lnAQHOkpbWpo>;^{ zixrB``={96Hos@#m&AoGj_5UB+5GlPI(?z3X84R4R_@i8(}y^-c+#C86|`n^yL{aJ z^nfQ7o2sB#cJ~3}diamCQ^7um>XIvR%4_9>j8pCXQo=txgSq=qC? zLxS3$i8blI`m8psuyGsxzGt0CQI;F{d{0JnL$5VYgIQ?j40cMN!R7kh_dUlThF{Je z{Kaawf2`&i6j67-OI(Z?BkLsK+fgv1;3GTFUh)x{CE8MI%WmvF_uAm;BGF`;GOiLM z{K@<9`2{mH|FxUz<{uY=p9=(xCb`EV&Suyvo{M>f(KqUUKf+OOX;}%1t&4nNO5yQ{Fq{Q>cqe9|NuAtJI)%l%(Dhu{_8Y$Iw?H^Ee;_meErHk{cwX2D`pAP8<`& zYlId(VZ1ZL{W2?6USXzcZ&GySVF~JJiHf1Q8?#qJU#!Y4N%~eD$%~O3CQfY~JMlr> zjy~cNa`}94D)&c~#BkQS)qYFn86%hRtK~yjp@|canq3~}A3OT12JD=b%XsEA&b?-g z3kjdN5xi}ixAc>Pt+h@xky+<0xfikqRi$-3XvN8sREd<0c;e)t$=pz2P~t0|=6Vn{ z!65pRo~`=0{USt2I&Nk}4YGWe&kHBDL*~jx3vvP){;2Lp52JJrL5nc&+lby}$#VX) zj&d3j{srZkOhz0wmqTo|?{tBkW@ns0 z(*uSwhoFr81E><^A6x2Z!fD0(CxAr>uiLLRG{&HkV!4R;i!H~MPAQ+c5DKVSQPf?< zYuM<>a7D95f8^_to|i$5hTmR_PrK9v$1D~$H6IxG)1+4>3?g*uA5o)6a4?y3t}8t} zpBB|!#ZPxWiW#E!t9ntTx2j>0E2PfmDVxkHHH+GK%l(0cX@=0=J7BlcwH`N%#2w{& zDhkafayIx@xuB;cAg~!t@I=i}Qr@KdEp9Nd9=V7pGrt*txc{2xFqLECK79Jh1nG=&VV7=fk`duB3l_c7uWugD+(=&XqG=`vawV zMfZDru(lrj89{sFC-H}z0?){B46l9X$0Qxu-F?kW&pnoT zR}w&R@V@m+N=%z6%|| ztbKlSutT)rNN(K_<51Sk zMdu$hN-wVd>WL5O*?xieln1~b_t7h=rW<2F!AdSb~0z4;zQ8&+C8u%GfG#Z{%G+qo0x*<0E5Bogtob_V~6aI zJI^*%63>t9%HFLmIL@94O>wTM=n08nUGT{+{=kpQZMWtYS}(7`MU6<26Ag9imk|I* z0(7*^4>&i~XYe7n>XGKrS(omUKN^)%zLS(fC~hOAX_BrKyo65gZtZ^OUvC6Z)n^!q z#wT5m=!LkoS2w2O)rz!Mg}1oLa&ajD-6g|;{e#7dlfIib9(IaT>{#(b4KZ?ZZ_a!_ zf!SVNB`)ywlea0Sc6?Pzv-hum{{|m_<>SA!c%J(xw(|-qaBR7jlqYp|#u#fIJ;sdy zvuw^~8WM$KSyiC=i}DGRxBf4jFR=!KrOd8ePSzbMf*PA5SFiOZW*gS`0pCbnbn(Xe z$K9@5;UL_oWIu^Q8Y;f+x}D=HTLdNa$y3gPM$O;)N0#+%Dn=aV`6W;*-l~e8hnigZ ziwOP9qSP0*HzFrN-c`ALmlGdUJf*h`;kxpy@Bboy)6<+>=$jh^v-Zr|CJmT&d;C@{ zJ@MCTPPhoas+}0*fzfeEs!ls3nh|NkA$N}yV0PjP?KL{rfqvU4cClGtdL4gbekK=C zTsXFKsKjeE;pVpoMuNkyzO1Sq71LhSKhK*8X$W448WYZO=ZUk!6ThM3`KcWFU2v}~ zdoU3D?i5ii7uq5ILFL3faLHLC4R2fep!C}7*#M1N%EeGBWy>!DnDNSu*O>tZHTFLz z0Etk*0r@`Hrz#iL^0Ev8=*d|LnHM!*nb`9ZQZK4~YKtIB!^UFYEh?Uq19Ims(geSc z_bNz{+ogufK1g$smm)jt{<8Kv>H>R z=$oE(+ZAls8`T{qQdKAS8uvM5WOYYrfG2;%%!|6H@}(xa-_;?O-*)l3@x+Q8u=W(| zLqbZLov70W!qeGl2s>RLVZreRj8G)2%7He0ce-epJ(xa+>CV3zD?SwFjGS*S5LFzD zc|P;F&wT{iWXZRDg!c_&nS;)}4y$tXyW?i}9kXx`cQn`fLha=&$mf#71?juB$4Xrw6f{J)d zeU{L1HZ^%EQO%3$Pw*F%oixv*3%0b{1@{P1*gvR9V;(qC6xGs{)%@*^|x44&>%bNVzr$`N>)hI)Iy6 zkg})xQkY?Fe6?Ypyj{IGzm08^U^?(-Mf$eDI{UX59fmytj(CCtsE@NEH2;qC%L5YB>(^b literal 0 HcmV?d00001