From 9a82a556f9c0215331a4984473d6380600a2a9b6 Mon Sep 17 00:00:00 2001 From: Nulo Date: Wed, 13 Nov 2024 09:49:35 -0300 Subject: [PATCH] WIP: coto-crawlee --- coto-crawlee/.dockerignore | 8 +++ coto-crawlee/.gitignore | 6 ++ coto-crawlee/Dockerfile | 51 +++++++++++++++ coto-crawlee/README.md | 9 +++ coto-crawlee/bun.lockb | Bin 0 -> 122241 bytes coto-crawlee/package.json | 25 ++++++++ coto-crawlee/src/main.ts | 123 +++++++++++++++++++++++++++++++++++++ coto-crawlee/tsconfig.json | 12 ++++ 8 files changed, 234 insertions(+) create mode 100644 coto-crawlee/.dockerignore create mode 100644 coto-crawlee/.gitignore create mode 100644 coto-crawlee/Dockerfile create mode 100644 coto-crawlee/README.md create mode 100755 coto-crawlee/bun.lockb create mode 100644 coto-crawlee/package.json create mode 100644 coto-crawlee/src/main.ts create mode 100644 coto-crawlee/tsconfig.json diff --git a/coto-crawlee/.dockerignore b/coto-crawlee/.dockerignore new file mode 100644 index 0000000..2710668 --- /dev/null +++ b/coto-crawlee/.dockerignore @@ -0,0 +1,8 @@ +# configurations +.idea + +# crawlee storage folder +storage + +# installed files +node_modules diff --git a/coto-crawlee/.gitignore b/coto-crawlee/.gitignore new file mode 100644 index 0000000..e0996e6 --- /dev/null +++ b/coto-crawlee/.gitignore @@ -0,0 +1,6 @@ +# This file tells Git which files shouldn't be added to source control + +.idea +dist +node_modules +storage diff --git a/coto-crawlee/Dockerfile b/coto-crawlee/Dockerfile new file mode 100644 index 0000000..1fe6784 --- /dev/null +++ b/coto-crawlee/Dockerfile @@ -0,0 +1,51 @@ +# Specify the base Docker image. You can read more about +# the available images at https://crawlee.dev/docs/guides/docker-images +# You can also use any other image from Docker Hub. +FROM apify/actor-node-playwright-chrome:20 AS builder + +# Copy just package.json and package-lock.json +# to speed up the build using Docker layer cache. +COPY --chown=myuser package*.json ./ + +# Install all dependencies. Don't audit to speed up the installation. +RUN npm install --include=dev --audit=false + +# Next, copy the source files using the user set +# in the base image. +COPY --chown=myuser . ./ + +# Install all dependencies and build the project. +# Don't audit to speed up the installation. +RUN npm run build + +# Create final image +FROM apify/actor-node-playwright-chrome:20 + +# Copy only built JS files from builder image +COPY --from=builder --chown=myuser /home/myuser/dist ./dist + +# Copy just package.json and package-lock.json +# to speed up the build using Docker layer cache. +COPY --chown=myuser package*.json ./ + +# Install NPM packages, skip optional and development dependencies to +# keep the image small. Avoid logging too much and print the dependency +# tree for debugging +RUN npm --quiet set progress=false \ + && npm install --omit=dev --omit=optional \ + && echo "Installed NPM packages:" \ + && (npm list --omit=dev --all || true) \ + && echo "Node.js version:" \ + && node --version \ + && echo "NPM version:" \ + && npm --version + +# Next, copy the remaining files and directories with the source code. +# Since we do this after NPM install, quick build will be really fast +# for most source file changes. +COPY --chown=myuser . ./ + + +# Run the image. If you know you won't need headful browsers, +# you can remove the XVFB start script for a micro perf gain. +CMD ./start_xvfb_and_run_cmd.sh && npm run start:prod --silent diff --git a/coto-crawlee/README.md b/coto-crawlee/README.md new file mode 100644 index 0000000..6a404f0 --- /dev/null +++ b/coto-crawlee/README.md @@ -0,0 +1,9 @@ +# Getting started with Crawlee + +This example uses `PlaywrightCrawler` to recursively crawl https://crawlee.dev using the browser automation library [Playwright](https://playwright.dev). + +You can find more examples and documentation at the following links: + +- [Step-by-step tutorial](https://crawlee.dev/docs/introduction) for Crawlee +- `PlaywrightCrawler` [API documentation](https://crawlee.dev/api/playwright-crawler/class/PlaywrightCrawler) +- Other [examples](https://crawlee.dev/docs/examples/playwright-crawler) diff --git a/coto-crawlee/bun.lockb b/coto-crawlee/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..ae88d9d3c2b473ef9a486686f3a553a87c91f2cc GIT binary patch literal 122241 zcmeFac{r8b+XlSJOy)wSkRg(>gvgYkj0t7RJY~u}hKNFjBoYxRMU+A+lA%FFWk^vd z4aQRD@U7L}>v`|@cRX)x_5JgG$8R0a?c8fP&+A&(8t!%9n z^>+TAG~g0<_p(3eZsyH%x^r)dm$ixSE z+o2gM4GHnm1TE#Sy(FL&4yS|%9M#Vp?jMXKmX6Gs#juGU&AOR#vG8~Q?CC|?cA;{dV(35Q~K$zDDorZeX0K#$ye{XlkAV(ixZ+BNepzG)2OeI;OyXIF4vs(Kxn(LRkKv<2V3<5B=x>2zBbg;9+%~y`UF39O93F z;KTZ703q)!Azud&_V+44*ngy(O(-{Ahu1&o7#slgIzb-BR}COA9k~r4>{mUQRM5{W z0NDX@gK{{}5`hkkV<12{?h4%aJerTkfpN$OZGY-2@ZkN71m#e#7386R^#Gw=S4T%j zxh=9dCorj?uCJeupVvVd9PfI(pY|?}jy|qlIDbzES9@0+j*JiQr?;(-uOk?6u-07t zTpfLfKzleZ>i|Og#r*iVyaIV>$HB|P-_Oi!Mj5<4FkU|w zWD#f&^}_%{eHB@Jy_+u}fqufx0@?{A^xFaCVSM%w%Kdy~x59X+f;_ap6(B7@Fy4-k z66E1-?*ita7@^!V(AU=66|@2Q^`PB6um^d=0HGh90M`I)0SMz&A&(zd8U?(6w!Xoh z_6J@4>Onp9qngkT^vBmP*xeD?(FXm2aec3d_eXp?KJR_dS=_i|MKl>njN3o3YYvGof`9MS`8nMB~^UCCkW{0;SE&5eN7#2 z7p+4WTnAwI9cTypE2M$H-*5u_H+$WLc4&WW0eRT20U+!T@-sveKaU;*g#O+p)L$o{ zPmtTs8R6w)`_nH*ZG3-80mA-HYvKJF0SNU`Tu?kk@9yVo?+#i3i+1im&EiUS+0zO z_C-HmJAWr9M;{!{To2#RU|Sz&*nts{hx4x&AiSTo1Ed3J@9ydkrYR1^C0J^kC$xyh z3B~O{;{xV^zYm!CU_1NSFF#-WzK6~`bVhjn6o7EPI|9#K-5qeV#`t+P1ds)kKLf}L z@E)POn2=8g2+u1=0I~q|1_;-uB|z9-6CkXYCgeE*f?H4|IiY-V51#i1AZ*_P5b|#k z^7#NEKN%nkzz~3NJvtHU4GHzz33*X~%%C2`>}UKA#}6c=rW)6jITTr6uvxf#E9D5= z(eYz%Qq`7+?RUCC#=Gs~!^NY(It z|H$P@QauaPxDJlV+YKK|`Nv#>Nq1B~8?d^w^}xuQ80SWVnxbUo&pLx6bn7{2j|fUT zD=6!C`2NsNd*e;g@Z^$k-38-^`>!a8d1baS96qL-VK{OAlKG=BOW)(#OE(KQg#B=D zSk$u!I#9*l)Z5;^^nOIq*7mWqKDEqA`;hxNdEvn#M<*nB++NXbZQil#_@fM&nF~Hu zk^vDxQ#y}bj-3W6Wi|%O&7i{J}C5bx_ZB{&q1NG>ax(M6VK{fKIq6_9O4nMV;IF1Kue3*jX#F7YClza+y4FO7BLkQb_eygUwVo1uxI#H!kJ9U%lI(r3G!S+t~ zMhAB*3o)rXSQ*S$-eMY`u$SNqV%#a51!;YuEko0Tqo;{QJ5x8{t;MjpE>r|b-tWe@3V z7Y{Rve0?+F%l4(JOJDQSNb-Oz$ralM*W@iXq7A9}gU$sON1g4@m=t}pz`!xKc}u3* zHpx{d{8HU*Gya*6#bSD-4rQlPCCpCC)TzU+Io#Y)#?cKxl_MrK`el`0I~LR=9e8MTtW&l-)FOy(qQJ9-XVRiD4Z zA15g=`>jCAcABAdAyFnwZ`AWNNzJrtLL_d)8$}*CU3mS>t4#>oz>YkqLyW@BeXce1wQ zVzC0Ze8kk0m0{wdZ?mYxCFQygNA1E781Qc3ukT8z&+A&46{*VqRL2yR%v>#}rooQe zkwTKRE&az!8J=d&1p@_2omDw;8J$0&BEDq(J(7|<^Hd|B zrfc!M3P+vThpp=OcC$9n^ze(g7e{@pOzm>slHu4P)S6T(K}n_)ek*DF6DE$P4EFYI zT^B^(B>3xW+@;_&@bXMWjQSx3<17W9k{b6JD{|MUU^0$22|B(SGp&GEwc-4g`6A5P zuXo!zzb$>wb!T`3i|qL60X3sG?RA3}91eu%>v|bWvy}*iNQK44YSx9u$+&wbp8*>b z=M@QqK+)VS&&rlqgAQ|U$m`F3deu?7K)g0S#OKCiwVuKUiR_v6COtf@wBxcV&kXA- zke!WI7al2E+VGrrldE_*7qUD$Yu9&xg-W({vDKncbM_tm2Uq%a6-K^VVJzqEtOqWc z8a>gsWxV;YTVOlo(crjPG_Fx*Vr&;HteiTcm}+TKO|xxg%cs(~Rt4>=l{0!vc3bw; zrZc`lUt}W2s)A)cQ`7dfy^E66U2FL=>3q4#VtAX$&IWt?R^e|x`V#f|9L)`^-24Lq zb=3UT<|Ns#HD_|YHK(T!Z_5iJc@ZCan0@~fc{jtswhbMlTU4Wt2YmNVXkcJb@u9oN zqAjM*8o+h1*a>%X~NcSXnzz-K8w4`pWa~dVst}@7vp~9r`@3qN-DGr+n(*a(ysG8cjybh zAxqp`QN!9(`{{h+{94jCv5?10ZqK0;e!^~*dw%_)i+#8NVGft#g!8dSR?j$GFu8E$ z%oB5a(va1a@%)VbC@v@-X}vDDSMPh>j5|_W^hnd^!DpSqfoiizeKUpP11FeBGRmwp z1ZXp|hnx2a&~n(5>t8wZoI$Aeh9O&_pNHf2_QfVqz1Fs#jd4%L$oHuV-P@Wk)1{wV zI45`K`3Jiq-U~ zeV@@o*D-GEGS}kH7M9wzO3v*LVR3F7*o9+kJMyFrQCu`8NhXJC{p!#-p}75LTq3pB zbG@pd4$Kvd+$46?(T+}sH8W{=RV_O2tfAL2w|D7Q;E~a^{S=bU&nTdz9!UAEYO8Kb z<@u90L#UXP#cq+DYI!sr$s2aTB<=oCY7q;Y)=Zk>sDRsvtYgwl;idz(_t+gHD{(o% zq!9G+wBO|U9n*L0*8ZSo;ANe5x5;1bO08BEWfqYkNqBeu*?C6pMv>13#hR{GK0Ac7 z^DiHE8>bR{{yN%8Q|k1q`>xg7i)1N0KGfsJwS+#Cs;p+y_)J9DMv`LhWinEAR;N$M(sA!*YNR zZG-2H75h&I9089$f6VU&d~me?*?$~I!F~{v5I+tObpFDA zFW`#U)#lcrUTA2QSdko)9 z{yrhTAK*j#Fb|0<-M^XuAH3@MhyQ!a_!h`M6L{$b#}CH;Pxfy;z=!uQsEWoAe*RrT z_TvE`t=~Vfe*?TcGbi*Pt^qiP#3W>YH886G7yUm4_~4b_Kl2C1fS82r_X55q!9EBD z4opX)65>mN7f*-}=g&&*2Le8rbCEE1OyC0Vx`;~1{#Al~$cOe(`R_zfJL=Uq9C(HN zbN)fjO8c(`_%eVGxxf{o6S5xy_~4cF&;G+QI0uPIh+hr(Du9m`{YvNG9N@$C1NESW z05Qfv8)Sbgc-ai^ACL>~qeLgf_W*qGRm4yG(D#-4e--fI_@VJ%>HHf3e7OHWf52CS zL?`6GFt}lYuSg={xS=v)L{M9Iz*iyIhdeZnztcec62M32A7Z&s8}Y{hADus8*-GQL z9=t@~jqxAp66^m#z=!uQIDRm#bo|Q!Ujt)*GhXJmKaro)fUid2gRPwCGZ^A;1Dn?0 z+`no7AMT&1|G#yd&;Z$I0tXKC{D#Vi(Lim@0bd2!hvN<}V*Nn;dw>u92h^WwrF?Sm zB?p|pkPPQ9(uMh7CDcv{@ZtQ0ZBZY7#Y1(7?*;hq{sZ%n4~{cLCB!cTd{s>USGs?H z0DL%qpwT~Bzx?1!BuNZ^rT4ErfUgGlujUclDZp0&d^GM9KUIGJ1Mw#SAD+L6 z^&2T8{zh0iAAgmQ{eHm5KEJHgJ`X1jXGpLQxhv&+ z0zSNd!DmO9R?2?@_;CHAey@~I&V|Dn06w%0HCD>s3;1Rj`^XQd_p5~BUkv#0`TI}r zU*7;<3-HmoccuRC0uL?FKJsU!{F8tWQ6#+`l3BPv*}Xz=!)E>_4${2Q>X>{}SQFuU}&QhFqAC z{{eu%m0%y1t#tfL03SX-K+TohLy-N?1p9FRBi1&wh4`D+$R{6Ot;0AKbm_|E`;8{osZp*`exwqZT8PtA|R zIT7p=!$WNl-wW`!13t1%>>NV;YQWb3e3&Pe3w=QRMZi}Ee0cwX@h3JRzM=p=e$e)x z@O=Rv`A@8E*bdpR0(`iCW6R*@-zCIn-|)ZRzY^OA#J2`~IDXI`Tmvu;#3aP81bh|3 z_(9vK{C66t-8A59VEDh|p?bvE5X6rk^qttgLk+|a1AH`p|Ac=Z@ZtRv>OnrS8p!?v z!GB_T(07;+UqjT{qy%06ttlPyisH{-f66xkd=+3Ht~;oK zbbsdrYL^Q5aQtBYPu71w;O_!_H1;c9|FUBL^Zf(VSn2&I4DeM5{YQQJUEg6nYI_&( z;r{=p^N$p~e1v>B_V8M%|H^<5pZ^gb`bJDb{(AyGeE$vO4sF9ZKukjXJirJ4{TzSj z11kTW25Q#=$guyEfUuH2AU>5i{`|g@y$||^_&R_O=PxXS_K8i1pAPu&{0;5H3-*JU zg!qpEUz5P61w>+fKzswRdG7^$lqbeEY=hbt06u(vh2#Dw_U8d#8}Omuf6{+*@bXlJ zz=u9T4Pp}VKa0Re`IW}+)qmJu>Hf10EIzn@q5c!&J8XmebpU)AKUfAeP&v&1Dxr2I zfUg4hFm8V`exra7*WaJ=MWp^`{-ZVgE5A`4^4}8hHU7f>b-*_y#1Cp;41sTgexHzi z60rHH{e^vXz=!9LKaF1s;A;Us9D8`7`{3_-fc)5faNk3HYE3k+40nXE)du*>A+y|C9Mo1~%`%ng6jZ>&jNg~h5d2=n*ks0-+vlERyq9n0nU5q(@NLh9>9n5pV)KP zfA&8H@ZtMAXdA@@wfPmIws#5s!?u62f6oIxe1DJZ)BVaQrViPc0M5GrKAQIkF-`yV zBjRTOJ{&(Ze~2AN#2)~Bc>hIwRQ|6nzMzHzr0eoV|9Z4X5DB#2W<4^gGfDg}) zC~hmgf3O4N8W=wE?{|p&w*-7R|6u!-^a1ft0Y2P6XbAk3-anoJKKSpC*DozN{6hbc z?_%Qy+e`3cF@y7rkKEELUiJgatucU(S zKg$2kZ&Z)kM*%*Z|1b|PWJJ=k}M#3a=20)Y>GCpLCaAMu9)AG`vI zgk>=C;o-MG5uacEf7UM~q4M7epmvsk54NyK*dDHZcKCsag!qMk5BE<<`IGhg8t_#B zAKHeRtH4D}LiUw3a5z)ICzgk_5kC#^;rb)?-1eXRXMhiGf&V-|5IYBu{nb11e6;VZ zl&=H$D!@LBAB+LgMSlKYh}s?RF2aAai7i9+*Y3vKM?5$Wh)IaA5BTW(3wbN$M*=?h3NRA#kPj=de+Tfv z7Wi}gC;$=p^*asJjvKsugyWBFqjF;Twiy0O_E2Q!8sNkA3+E3kLw*oze;n}9{DGX6 z#$QMe|NH~(!!^88`}Tm3p5M?KfPVZgq5kIpK79WT{*3LXeN;{?{|DfMB@l^Xw^IK# z_5bJm4Q;|c5R;IfiGZ&P?8CDQw7pXMt$+{L4;8`aO8Lux591HVZY2r%FK_U_-=8Bt zey4@_u7D5cALPL@xCV(yh<_gN;rvIOmD+y`_^|&_ZzX#Ovd;l-{*b?twF`Ykd}F|e z`#Xyc?YkRuHQbumjHaogKLP`gzU2${m=dZ`#@|Q5Z@5+RS5Rs z99-%6=K;Pp;1fIVQU8$rZ-5WJf{29WY~UhR2k~k4;`jeQflZ}NBcT>u~4g8tb5n}Gi}@tX&HjlZz33?AP9CjPO2|2O@A{+IUGnc@Hb?N8^A z3*i5a|2F~uuf`AX|0e!w`~GhHV*&qf>^}wkzlqpFbV{D}etu{htK< zzv;iS`QO=(1^mBR|IL68Ucvv2AF=li7;Bi|y$)XRUP1*fn6StQ^6cP(C;~2cZxsU< zOc2Sy1@7HH@B6XVbD@Kka}s)z3r>LY^9-Jw#|%osfqJ z`(Q!HL!<$hBOwnF`r%B-V-fb(jZpq8g!T>++ChYR9)vs=p`JIP93pJzL&*OdLS0`% zJAZ(5;EDnlOb}uH5pcnC%W*2QxOc3Fk9)KB;Ai{C{04~`6Be-DtH-z>^e%9g<+8HC{ zi9x784lalj1pERJCWx^7E6jj|McBXZ;DR^dI$ zIYjs|mXQAyLfvDa9Ypx=@IXoe_yPS$BIJ`{AxQs*ke5nmcaqQ!A}l{eC{HJpLxdks zgCDRylTZ#3emq0KECQZ|g&;wM@y!Pa<9P`n^zRCx9*eNPj8Oh>2&=9U>LJ39*TE0C z-_{Vyu?X$d5!&4+)I)?H>j`;?uw4@&k40GYfKUz*etbyCV-fP33H471*g|OcZwRYe z!4GPHU4(Z3hA_@AK|RD*0AW-3@5R6b5q|6iKVbbELjEl*1PLPi*iXO#LODd}?|TA% zB$PvhA3qWDScLk+gmQ>*Jiik1|AtWiJE(^^Ludz)0puy5*#CjBDJ7vEBIN)4XT}H! z>uCw~5aD@2fRO+HI)bkJ_nZe};0P`_q|V@i35#$(xcw~sHNtsvkkAey)bk+Zu?Y3N z3FQ!ByMH_1!6vXA>i+kfhhP8yJ?G)~r~jVw;OfAi_u%^Y?>P^@kNo$XhhHDq^BtTg zF#q3k-v2)L!TZjC&v|fm;Lm$-ANl|9Id6$!33l-R%>?vFaClv;G+Ew^Shr}A<+Tfu z#p*-v_HMs*;@z&7jIE33U%2wsrn6kQvutf6WV1zXi`R(szS~WHp?7?1ckZ~|zH>`i z^CgaJ=Lov+eFL1MD3Lu7O;qKPA{lsbi`UcKD|ZbWl>%v$v_RC3j~NLY7Lp#Vp}A_2 zYMEE1Cqg1BNqL>SGA+)vpkMUumY2)sUi}RsKn(c{&tNE##XTS9qlmoMpIPHR>ij8C zvw4_W%z-S}rl9PFkdb>;Aie&c{uow4;Z;u^E>Pn6FK{vsD^{L_%3dRz}efx4O}>#%qU9 z(7sW1DNMP1@k8ECiJX zV{YJuh;M?ot}Wf?ua!Ni?G;~ek)|-@>gol<4QGQI_z$H|(pJH}5XAw$OF)T?`|a2y zZ@$m6eUMzpAeZsuh2$wc&XZ-n->Y8@mbC;WYz^I?<{f$?m*1B(>#A*+L0>(4e=2Y0 z_PNJi?cOa*iWpt^tcDU<*)K49^e{gj7DSs;5hRLLD84t1(;~xuTzvz4~`iR@; zzzmD~#QoFUA=^G^uBwk}x!9$cz#CpUvR?6;s?J7?E)^05NEXh1)uwQXm--lkZbz{D z=$$Z*)umQ?`|em8e0Zf{xnq>Wbd9G-@SPT=g2V1s0c#A+DP7xzw#~hNOZQoQ=rxHH zMi)L4qeSMX%zA0P?Q+kp1NJ6~40qm68;~;{zGW@5{=QcY?K<~IF=8!29W^8B_sL{G zRejJcKcDX{$HXJpFuztwYd~Li3Zo0((V#?DPC^=f*7k8;yoJ^3XLFTfkG6BiG>K&; zn$umrva?0~=-G@PJz_jx9U}9561CSGoMv6MEXh30Xi2)5@Z{m@o)C;Ke0PWv*#!l; z(-YK3XNONejZJy9(T$UQTBZD;h)uKh|VE*PNzN%%}W1Tx*I+6BGN`;N6 z>rXGv+q2&d;AA<(xkhlvdPZ_r=2KC6>7%yn^}*g4UHI+`C9;6q(VT&tzS|Emo^p{7 zq)+O0?Z_Q!&T-lrE_G1;*^Rb~x7ck|n?HIsyF5&v3mcW?@fG&?@~!p|9rLSb##E7S z7+v`83?;H1b@rr96OIz;>$gyK@6)0tk(h{O8L4DVIH|+hd90|W>O-B=iNngpyt=pN z+&_p-%Bovd@hCKrw)b5aXSuTpzC%On0=_dqiLA=NOS`Yde?gimg#3`K8t?3>o1RaF zRZ5a2!+a!#HnvS1oTG~Bf3&#WJ)Y9p+hEpXd}h#t>u#*%mcpO}$Kh2NT}C7dkgSuL z_e}hmD^%VmSSc>=lpF4H64JdfQRQ3d!phxGk>VjT_5O=o)&0i)a+TZH9p4&8*W`3R zr}3|sD192Jdm`QsqsxTVJrUid^Dgp>s*6)-c1hle_;pc9Q533z+qjA-ZK-HvHDn7( z!Vi9Vc{_P2jBek=Xrx3`QQe_?dFrz%l1MP>cVmRIY$ zS$vM%D)K(}^^pp{)8}owdvfF8J1sPBtXN$)-zn$jYq6Ri?%W{Xk(pLC%D6E|vUTa3 z0bk*v-dA25vZiPJtos&w^u$cv7cWLk*xtSYQ1IV&DsN}soOY^f~hJ>$4S`C!XFj!iX|MeE4c%**6vJmt`SUzoKN z+f=5c?C=2p?h=3Bgzs!oA`9%awo+ymuC!J-pYfSTLq@N%{^U}y{inQg<)K}sxi0kv zrbX8^$d0a>?oJHsbCrDPV<Z=L$pSye!^s)^N(Wc-o}j*7Dql$H>E!^K?SJKdcMhj?H|) z#sR+jLW%6V@RIeS{f6#}#_8SbhS)askaetEb@GCnJ)h2$JR&uzzA9z_b1183{C{pP##G%@~iAW?v1H(6ZB)kdE1B^KIfuhHt^J*E{Y7(8+6 z$1+#GV_@aep{YDd!NM4y-lZ?>n_BwMe%kRujngSGiX}E@fhFoYFZ?&|(R^5k)xB)t zCBv5CVOH?0ajj_K9&M5j8&fGse^{~IZ!}~wt!(34U=sP@HN-6N>g4E|UXFSSndnLJ zTWK=-#|EDqX}peqXO15?POR?L^6gwPBIkly*mf|GAKWxb;cx0R*uY)?e(hu1#D%t3 zeZ%WkrBBR=UDe!>o{+fFwD3|-ndP<38OL89Nn6(}tcCHH3#)sre6zx($z9s_M#%@& zEzjif%Z^XYyGHGfT*`FG<@tK#;}<@64GpJ*Uy7SrzPGKBqKj?PE4t*CT<1c~lu2Fn>u)4xGXQFn^SSSgOzO0CNeK~S%=xk2q;%e2g z9=`*Z9?X3oWf)j`YxpR?fin51P-kaK{l#AO5XOiP%sun$DRN4OFuJ^0-L(0B3O7m? z!y_a0_Cs^#mMJy&ot_{1=(S=0u<+&pkJeMi<3*e%JDYWwEF%xte~7w0NNYZ6bv28n zW035kM@$q(cRg13;oVpM4o%6|-4VkPt#z_FEPD8yZ43TgH-0|wVRicx0?x8LFN==Nje4$Xdojj% zldMthnti6hEcIFx4`*s((%gK*9QIe#Y!r^Q9zG)DD-w`Q|Iu*k?IKsx^RwL37=QV( zx)C8M(=pQ1N|7;a_jo(iW-Mtl^VFyf`sqG5%TiE$;FMInwp&z5iTkORP4A+&o$>;Q zD;@v()kRlLTjfY(!{9r3G;RV|-FvR9n8riXKeF65jpl!6yhHrilVh~(=gxGDO|a}2 ziwe*yZB*X0_W`%1$%&@68`e*bR+?~pR1sQcbGGnGPW9S_(cOU6)t52wG!CM~t(EfM zexseN?TC{)M?=Sp-D5ZO?Z40%Z_hf@y71j3Qb*hJ$5mGe*H0$*GR~Y#kSOCymL5IU zPv?Ts6~yY+drvzU6wV3MFAXz4pL)acd}={=vrBV)`j16ilgQh8_eVFQ_VZbCa~qXz zt`yJM@@jIVi()3pdhkA#O??U{2S!&2tNXp0-+-zk?#hdg=hSZ+9Mp@565&cdd_#tj z*7?+KD;AoWty*vEMb2LyJG&3pKl`33>8(vhK52kWgo9x{JMEqVjIJY$z>gH@44zJtEEV|3zyKEq`eV_0L@5)_gTOIwZHj>60-xF=(FzwYU zSl)}{e(%}3u-mw-QS`W;_?k=VpZ46^`rLaPMt37t*I}!&`&@OaY|~u4S_!#Q_Epx% z$V??A#tJ1pM_aGKwp!gDt|-&A=k&D$+@%810&3eQuX+2oah{gQ;cLB=0ly1G{)%FC zuT5>Mw(hgD7~7Za-N4k)zL0;^*pB7qB*{&A9d~sqUMHi3r$=rxDpD}23?>WL9dkFR zVA|rSaHPUe{E~4Hdo4y+467S7{#72~#-Y~HBVubn=Yx{=(xI&ng8%bwG2N1Tu8 z4z9lHqQTa7{6l`~-uyP-%VKE<&qt=9tLL(6?9IHFK>~)^pXIklEv3kQgs-?BvRz0T%&r)z7JAQm*;V3hN?>)5oYmSw z#kanvcj@~Bem&-GMn|`VDGHho?cA-F?_+d&`r0SOj2Ek_1wV^SHx)~=+s-bqlbrix zNtKkd+#z~Q8ap2(vARPqh5hY|kH=gbdi>HQ&DL#CD_y}AHo9oa`H>ET{nwoN*G(qh zXbfnII^y~y_pNe#=aJ~P16#x2=Gq4ezey9d!uTtN)wQ-i9a>e+9W^yj-?w*OI(i_9 zH{|7kiTFzjlc%zoE#8Xv_9z=SJ))z8Z#_vB!r`Fj5s|p-h(2$lul%ywjy)9v`>U6)iY>65#l1SQ`ca^__k*qLk`H{i zbeN?=#pCelY>hOQ^9ey1T^X$I56ZB4A9}N!jtk?t9c;TA_a+{36J?I&IuoTk3Jw@uS*)(V%X7Imf+lwllHVnb zv3}ow;YZ^tp2aCCReAKwvaHawFb=UriJae+4d>K9`$}{ z+lJBIg4NC58aMLZk2H4j#NM@h9UE2EhA!QGOu76uxLnc1{Y5ivrDI&{?q%s6MXH91 z#v^pA8@7qeRdhRV;x>%RBOA|#{{kOcZ(FgtO79HmyYHIa9vObK`hAU2z`|is=fqN9 z&hBUPYK3FuQmO|@4@CXQY?68wDYr^^y2A0?LR6~a9*O|vrbYUapWo3VT{*0-YX0>& ztrPs>7g=5f+|}|8FQOOm&Q3Ph`FNg;%Yoi(U0B)M!5h*YM%EMGdczgXBMja->OM6c z-*S7dWp?e=eWnda z7w6}Zo+&BMmWi0MeB^Oh9s7Pq5v!ZjK5yf(@GRw6!m_4b{x0=3X%0%;K8`aDvc6yD z-rF3X704g{usv^=xKX-cJ6qG%8_Z939de*9;E%m*&vi6U8WUgew*vnpvO1;6;QiOF z7+nq|Nv;xJf5KchcKVCoi7Y3{3pL*?c}+#RX&;+hwW@Yj>>W*KPv?4(F|g)BPcTE9 zUGs-W;ndjY0HuFa!Sh8!n_KjaN8fPVHHUAy*R{=EcVS4Gi1l*W%y#rr+O2~Q7!CJic+@ky}n@L z0DfolpF~EZ$yhSY5$-zvLsDq3sIgAOSDuq+zG=nBxvHeCSHPWm6LGO?A>Y-5Lhr+E z-rJsi2j7>=nGOy;F+Tg*IK1vO{&zI+^GxL*Rp4(GW#zL0f5kP2E`6h2+EsbUBKuQu zlh|_Ejiv&os`xWjaiJcGqMk3=Y*zEXjZrAld0*4KC|0V>A$!zeRpPs?SY1`D?u}ue z8p>lLv3`L(c0wCAbiH`8fxIv`;;>|r{mnMX+)bNiJidauswZ>NArMFpK&g9Th zHorLq>5P_)$^Jtf&E2C{1wyE9OetQh8>}2RGb_anakH5uyc0FwIaqT{flgDkc)`%#7 zVcV-H6`mXPCM@1Ek}ju4(?ahViBoGC^M=9QJ-54_@MCo~vAP;0KVG}3__1@z*72Hq zM;Ut`b$r;fByR1ro!ofFeN*wp=8@z#L8T$9Pmz9Rv#}z3i4*Z{J)Yn%R zEA7weRb?1l8MpqlFt7kp-#V*q&y(CvpoK+#Jq3zTaw;!vto*7$s z=~4MOOO-vZSL0x%?M+P-2+h8AMb0wT%5XX1;l2L2gMsOz(&HFi9jtEXNoL+&U0c0X zPj4m(tP_;JNnuZB{+;`wjm=z2V%;09nb8oge$K2A!=;~p0=j84cX@zzH0a>h;26fW9u%wR zrNs9{0(QF$daxxYBbEhmh z?k&HH8>l`WW-!1{H1m3Eb9FUrk9y}Z^f)9_Jn#EHkIpCCvF~XO zu)6PbS@TJno<8`^^71aLJily!@wcND;rOf@9_!?n#>()ui()b1@X{^7b z-%)vL_I3*;j_bs?S9YDgX2DKjt^E-Xf~W%AkHr_tH1;?*Z?KyUUS-BGO!k(VRs8-g z^F0{dJy_k1dEJ~FvNwZE}NgT(f*KonUP07 z)6g)5Dor)&Zh(!jljct6;FFoUcQCrfSY20-xyNY=$ z>j{=17fn$~W7oCZ`McI?MA3Ucn|oX%JYje=IF*H;_uel1gzf@rjP72nZkz6DfpK#B z+h2kuII`Z5C8zcYxk`8ECiIM-J`%oktn`4z)_H@#0a^3P*@tO6YZL~ao-T`ys9#*w zO7>1psula5zyzynm+Z|R!|Fo$$kX78{mxl$+4VFDJcqtm_Z`sNEu1-6P~WqDgZqYC z*2;@}m)9z8yLus=V`JNw>x`Lfr;CqCOP<8|3;sOnpG3BP!mxG=odrv~8mGeZ=+bVL z)Kr^%XW3I}Tf5mE!!OQeW|(!`K6&3tZ*SK7!@l^^7cv(Ujv(gt+xLoEFIOI4#^{>; zqYCcx1#7fY{2~}Lrl~qVTCnc6xSThdeS}(zqFqsAo!zugr%1;)mPR8ZBwYSq+Bo(BaPt=a4y6g{Iw%DembtXayImJYET;B$I?-FN1@YOlcM;EIH; zYvMDp&xPR6U;asCsfO3LTTQ66wYGB`WW}fNDWcplz+)8KlTfhzvgO^s} zr;c%I9lD?Y;C{yx-!>Yqn`hoKhsV12ox?t7S^T34;!7X4`0}|h{Y9=6TUMc^yHjhQ z9hZ&a+MrlBWR0tQuec+8D&EZ?sa%SgqC&v&)%t{Pib%&zK`%Z9fA5T7q3isCiGw9p z_glDIzQMs)Z*dvS?+Z>y_k8Hr-e#Tix!&!0XRy~eMbE<>B3cSxZ_?hJI82#sHcHuY zyn3S=X|#NLp+oKZ`#9{rV};f2^59%=VmUTw+B{RUTf@1UolEU}gw-3v>zXQ#@5#&d z$}Q#Un8z?OUrvA0-=_OY^8l3%--ycjs4zicxi?p9R51QpV|C~AeI6#-iB{e{lhs?# z-lEaO$B<^!$;)$XPKGbhY$o3>_`XXcdDER84+^=LLY5dE!!Hg`+V$KKRrg*7OT5YcF1IV*;=vZ z3ZrFGA9J3rJ|7Ud+c|LRR;MSkuz3$hI7QXFk{J7a44n?~EgE;8*PSLMHB4OB)Qnd45bGiJGF8zvvjc(@0$esy?Jqx`8)7fNd=;bXfYl9M z=#O;U$n?E=*X(RO$5U}d(b)1-IiEL*S5C@(y`InRskto5+tsQb8D>#+@9v(ZXMP_u zeeb`U<2mxVhn=3j6r<~i)zuujQD>Df-5$5QHeTx+cU=D$!3=U*g@KZ(&x-Vkr?iHa zPD~wEFpk&l6*b-bcqlZqYRr!>T~J1!R-T<8I0>x9*HSnz$K?K$wk{$AMJ7B8Ey z%dMLgWZrEqy%#kUVkkgYI%@wzKjos=4D-GHG?v#G0~2-6(r_)(eW^5F&c6NVu?a>O z{r)hNCriIJqFdq4!;*MfX7o^>bo?uqr=<@L+RM|-+;~s*Ao_l!Hv3prQH;iV>Y1>j zEc*{_S986RTv(4jWXc(zs(Q?b(RIQ4>)&!EMzOnNvqE}+rD@(}u>lV$)-`_7t4F@P z{h+w@X~L=U^LGS_$sdSm(~dXWT&>yI`E*mD=Zy61wf&z=sE4ud*Ilu?3bRcM%Kj1| z678dr##)|FA8fumwq^U_uY+%*g?aO;i){40wN5fyao!P8egB-b;zZxakGvvhonyl? zY&Tnw>cPJaK=Ta!-t^Bnuy8fp4PZzPSvazlciO<`*Cb~?Kdmz z{_BoJ0g_#LU&BMyUf7kPu)xvQn$&jZdPPwAXSGdylp86OA8M^m9Pzv0_PFMX;V17^ ziixkYnqImp>Guw*>CNNhCB<$vVEpyK>T+{;E#9C|5?y>Qfg{a1(k~-dC$iHo?a5WA zjeHWd60CQ{hN|CYP#g^p#6P0$45~>f+i`H~tbUm@U!on%OFR!sy z&*|NnD8e0Mn=<3Pcy^myRIjDbz3&hFs<(A*?QC z?U;Pl@Z~Aq95ec>yWjd%ej7Y{OEZ2q!;(bS*h9kw$@`Mqw}q2Qd8wv51W; zQzug5lMUDtmz(zlHffixd7!tb_r$y+wm7{=TJw0j_a?vcVN&ggZ$eXFJ{Ae_ zVs!nGC_u80a{a@$9p^6+!IqgcH2X~S)jT1 z(Yl0yn+$@7?%mG3lE~wt6>zSS5&L@;{#ae!dz+;l#06~lBBky3zZc>q)#)j3V>pzU zIo@-ktjCFWTfI*0;K*SGFi_8b*})vY^@D-*d= zHP`uGgXS`gOW%f1+C$;ODj(gmu8CEYEh_ZRxIZF^4O(lwc{Z)d!tgD-MOf#l`gOQQ z*Q&QxgOfs-I0RyKlg7J>_pg6(M2_cW=KA4|tKEI{bJB{h6~I-{VV3>8iS&OMYq%pBa-3=*BeiyQX16s_oz#>n%^9MaNwM$Vez?w z-G{hdd$I5e^<>iM5_&xM|lcPS&BpkT3mhe3$h_zZ8Mz(n{AKMw@h7 zjl3Ruu08(BN6uzdqcfxXp*uA#sXTgIUNqTiw@y`JbVISa)5{K=Y7jXP4V0am&aKW*rAN}|B)ah9pCms8)Tj;hZuU?QF3pkdtiN$epU=X7l zhSlZXA{NCQS{CQ-P^hp@{&F~Tg<|dbnaVJ!?-iV?F0H&pY_1fa&E9-TRcNDm@5P?? zRN!H}_wjjLaw3C<3*(p;MmHR*n@hvQWdB)M(`8O^f3HUb5ES0Y- zy(;TA_uG3U!%~|YolY_ol~G81QpzmZ+4XJNN%q`UsWm(p-NRVj(?ugmPDy#xU15)- zw%^Ox8g|KvyY>d1-2wkoEW5WoQhhY+62aKF5ck=gbhje;Sm|&K_C6Ge)txI$YP*}RbDtuwz^ebtmiEf9ay{I#^5Gmm ziVsw$6tg~Gjj)eOUd=|UjqOiIPJ+6*FHf|1e z)s5P?<}TyogQu4`jx7$13#LpRkULX2ZG1&*DnjhOJ9D@0N!@FlrMs;>^+a@we#ktG zR0yBy--(Iu5v=a!czL7UPZ&C~or?y(R%LW5mnd3p{n4zZnaVI`b+_Fv(L_U5cx!Qw zUdM(7G5@=Ro7CxI$2yWi?k(N2TRX_(hS812>QdzxMqWM#^&Gb7$Al=49;qk{GP6g{bA> z4YuJ!4ATou&y|ZC)B5Au#gng5AMs7eIJxlcrlnQawXeT_q^s=z`Iz@7 zF;R}iDz!A6+Hs7(N3pu1BJ@;&B8T+4w@Du=pWt8G!7|IyauQ+DBpBUTtS)POUa~D~&DJ|wIh&tfFL^9C z_H?Vzz3Hl$vDu+Yz0!+kw-${ZS>JNRZCln(fxyq-jI+r5+6zU`Yb&Xhd+1&{kI{|8 z>eeKL8Y=Cba#84x*c5YTx5A9dorzV~BnD4eXzUH7T%gN2B&x^afeRPNsa{G4qajv}64jUSNhVnxPU&hr2abf4fajb5qv=b#ymX6z*!QN0; z1=ZC)Hy6jwA8pv9cR-o?y3WmQue}DhoXHjB5%XJjSBZml>C@>)rPuntjtKkU?7rri zv19y=$Lextbf2T3G^CjdWu1-Su<+eOe`w6eeqBI%cUHukCpH4fyP~hyFB+7e8(cSU zv5>E=KrME#x53W0`^7#@Tv+1{jBWx}m-E7R$HUtn(8xTj4IAIZbD(R}%P#3pu4T*L zeoWsN5A6)EXI^)qVdtRmt_S{=YVFyZH*}@n`w}K}mb9JRoLv=r?n}h#T6I6He0@1S9a-gd)9HW7WQvc?J;kuJ(H9#VL@rI zCWdv>RqXc+C$PG2V$Kz?3;HHXe zI4+mduZlad^pvXw*}5I1f_!|`M~}*5g-q3 z)Z+8OpS9ci`ON~u83YpKVk|B)Y+^nAV35fT_wDlmlEM?Zw`W4jzBzoNY_%-PO%UcT zIU8iu_eER)`+Sjt)os6Gf7#EZwo;m=Y3c@9gq8Hon$mPN4Z2SaE~E3OC$9MY zZfBZr>v*Fqx~Jf4%uPp?t2=kR-1EuDMzMeoGapj1x{-F7g0EthKJUnB4%p=KT2Fbf zcI##h$^j+)9Xg4qh|s{XKRr;)hv;#K__PcrS}Ya}Q}f zL-V?{vfUmfsr*(qoU!-gG^}n$cBskDwVqpcdR%%S!P1qQK*`S}k$FJAqMT<{EeiwM8$T&)vE8G1q+{23WBk^&b=4{RgkPztbJrM@N%)j3azD6sY>L$~;ij1= zMmHU++Y)Nn;wIqe_r+1F{YqsmlXT9&#+h2GJGVFrm5+Ar&&sSFym<43;G(H<()o*m z$%nq(kCnd|KI^5i`;pp!GTS6Z_cT^lA^E0;s>#QGJLL^^ie(|dtO7s8v8t-fz=(TTw@jxDc$}; ze_Z)N-OGc;(%;>WkGy@A^`z!{RKU}sLFQPMkIZ(x>)sv+&0Lt|NlCaPL#gl4)nJ~* z;m0|Hoxhn_UByKu@;4lvUk(}{^*zbtW=dnwdj4#~g^S;fHjpc+EJm8C7?oCUGVgp5 zkjpN$`!IE8;jld~sRJFE>5-lMj%@sxIGp)^*n1Ors=D|8`$}(6z>Weelar^B+EdzPe|t`+)y%050!Jx9ck2? zm!2&@)KY&pZuj1|g1k953NN=*-16F2{j^LV64m@zZ?_|zij)%{6U7pIe`Z>rZ_DQ=da2}gX!v^mwF{58`p>B-#rF|yD--Ckm%I-~7Dx2CI3|8R4jzSg_-;qdl-x^-tYDr>3N8J`ag zo+RRbhtW;M>N?#Ull3zn4o z9a%}wy)?6W=rOv!#7&GnpVo#Csl=kBLB8M-me3wa@s(Z$i^uJ(q?_qTh zccyBVYO0QxKdWdb-LT8CJE~PpvhUL8_DMS4dc~&O=JeCgNtNwcw#|MRpA)xV4JF*C-i2^(f1`st%wePVA@nyr#juhOifjX(2A7)&@@W`=|=#eLsB#9wxSM=oE+{L)6Ak1vPM zHMU^CA9WwAdpk5Yx9QS%_46_fjyd`J8Bd(y{Oud|!EWZ%ZfT0o5?{m}#qCuq#S=_} z^XK&}3R@a#7(8)p8}m|h)e6pPXr9KzArq_Hx`}-2qsw)f{4DJ0Uw6FZ4}2i;nQTw} zi8r?Hcizyd9)CI3My2*NX8UhNa#UGBB;a4v8>x*&2VIJ8*Rw~@6!FZrYL+ZtR!XRG_5@(+$k;!jy2Z-TUJ zyE_Evc)utw^{RAk;38_PaOZ8Y+eRH%K6QgBDwBiH2P zZ|&2f>R#==FcHUip{q-0G`4&`E1O=EAvFg(uFk>g@|`&{e3j_5<-HKgA@iw>06*hSAN#>Spa4p5pAdape#*lS6ab zLdH4~<9b@=d;1;-zp%)2HOw&JsNF&AxL4Sp+tueqZX12;?BixlQQEU=jt}KK4vb}B zbn~&gsvozV+PRB#FgiJck>5cr^z@12zG0t39w*RB)(Ly}wQnww9ol?CEzIzggw|>6 zwyE8%zE^R5?RFa{L|#=}#y!I5KE&#VWktK^MtJ(C5;ZYcYV6)p{?wGR)qcHJq*c!L z=lgG}-VG-bjAI>o%+C`takcMY`0LA8cW5*bQ}}#QXdWpLIE2wH!0IXbaQ$+k$@5U%q2P-tA zLK;e*VRQ?zy3(6zbrk2WzYE_gV6#Q+DrsY_9x27abI+J=mljEowGC_WXelOtS8g9{ z%`t5&a`{X;@+^Z}(uAsA-lTT+N-H@=7cQs&wUE|*9We0ac=_n{`&@1QzI=P*E03us zdZ%v7D_MLqVKRyl*XiC_B;trf>=oX!aLU{&bq}wv5UtN> z4J2bvRN?4sY^0XPjpjAgisULr|oCvtwn`cD|s(=vHENwevTee5mSWRH!Svmscpjt4A)u zs6^-L(|fPaawg8KH-1y6YWI@kD_O{_$wjUu(^P?ny5I9tY& zPSozMk&`KxwDy&z3r4(r?T;Q*Z0x_c(VW!V=ey3js4FCW;qr7{G*tyQM}IvQ+Q51p z<8L)q_s~%uVm@YS8?pChdu|JsZLRHjQa*IJus!VML%Ep}#f#QQ{n$vjURVurog>GPTImxLD+!pNi5~1qH@ch3;b|NjjM1&Z>e7kvT;seu^qyAi z_Fc1}-Fvfo?l4g)FS>XS)2H=`UrM>gDja|H$Cm|W($J5rTXq((Qp~odd-q-|8C+V;bY_@BLP3O!|Dk8T}QS+~R1Q;5wt2b+bDewD+vn?b;D=n1M9p ze3!?p#EmNEQ&(kd%PnaFmL9piBlX7kTZh%P_}zB*S<4p9zT_-^SHtW1TMKk5 zZyYd5Hpnw`ulmN(pVBE@dRE$wg5%qR*P0QQ)l)Y+9{cLIq>K8=V6QLgvAS}@Pi0RF zt8Qh!f3T)z^TPDo-M7h3JS|qY=RT%-==MVv?iLY~Q$8H#_XT~KN4BlYF-iL|cahxd z>|}OET4!B*3&!6DtnLxoW5Uf^LFI<&vgErTeIHDWsPz(5RoNV_zEQW^dOG{o;Qfa^ zGDT-!FsN-k(fe(56C?Fy4j~e`p~qVJ6i-$6VRRd@y4E2-kI;>tPpS+zaEmC^cRg(H zF($@JI^~!%{z~|OP%pREc)%w&wnvw{c%Ka`tI7!)6uzoqt-C3HWZ%2DwGrAF-6pK= zWE|Ia*WEo|NPG_YkTWc`sDvDQQs$sd?Xw@WnbV$UsBk%rvX^ryRscoYM6H43=W!vp($U3wOH1Dr7`zWce^1 zaD8n=%rw_-Sub2vBYWmfAamiH$gPo-BgtNJ6e`cQ*orzhd8_h2FP2X&O1{lqwA6?F zUfV0Iu6*&ajm%u`;?Ea};A5PN!ItCX3Cclh{;;l(q(OsPT?Oh!5+sXfyi zu1oxe)yFyI4fjj7ev;AomW7=sc#YM)AGVACcd4h6Lrkvv#}ZF_Bk|Y0xBI7Bf4pg) z;rM)+-PJ*piz@2mlS)seA_`@PO*c+^n#^U&PjFMu+`a606g%(Pg4Nwh`@`w(J*qw$ zBmGIDLzAC_B3TA@P7f^(?;ug9q}KkxRPR8}w-A-@TTnCpBG;)p{0m!AJl}=GTR2<> zf9H6zVB-4*tE&{7N7TC8LjU!V^w^`>1Ja{WH@0`Ocx<2r#BBNh$-?LI-$Fe1izpYr^l2X^1 zD@w-}@+7ZK#KyO=$0u`T_q|IQymDCkjQX`|tJ?u?_FYF4t!tg7!rlqVi+{c2%zBlS z#r(-P2Q2|T2kbm;8&>x~g^}%VQ4;#lGJj@qlV4FgKRL5e=ZL)7k@%{5&$FP!(@gd` zo1N|m+R_v~|lf=9CvkC9p ziqURPG*Fo+rg!H?hPMv z=aF{oebe_?T|GbDBL(zvm3Jc3Hab4JR$;0&#ogW)IWzeomi!)0_I4s&U*J-MlAqv) zJDch^eo_*Azbn6mJ|wTaFr0r|=63A&&pu#vpBCC>v+vg>%e|K4uUCC0bKQAvzTynW z37P^MirY5?ir=g6T{j$IL~cdr_mj?mEiyXzTEf_~y{Gr8&r4-~cfk7Fi`C`7r(g8p zK0M}$BURQtp{&=f{e*!1HF8t0E6)x;xrOr=8F!kTJL0i7y7z}OS=4}d!*KLLRuPwT z=^Tc2?vDfBVB*_{)xB~e@ySt6Ro=^^u71rDts-WE(?$E$?S70{a%Kuuv1oklYc#A(JPk{W?t0txgymZgrpSZXsr!D#fMzTGcd;xSYMGN|rJc_m$aI z3QpI)ZZ~&uF-0gSZpfuj`Dc1OaYl(*lTh-m_=a6gE{r$#m4uZW7eq>OCHckZ^^QK0 ziaRd*se-J7HPJ~6>+eUbE>+{R?UfTcLS8d-He+A=wFiZAqw4AwQ~OPtl@%6qIbX{a zl^m4(GRxsV>2Nfdso1GF^wFKsfO7H-!)x*NjW!s6KVfwra8-okyxn_vQf)XQrNUHy zH<6Zkhe*$8?4pn&F|L>Ds}GQnO#>^N!= zt2^F#=(m1?t@UP)_7}`Ihxh)}5x=r9V4l>>$JDV|fWk;&adGxZ^yMmj=Xy)8%l0f& zTYr2Lt90SXWXX&0o8`vd-yFi~x}A5_7Ehh5IRC&mA(F4^SUs+yh*EA=)ZV}}eJ*Dv z&~bWNhD(janMrM5Qe0p3D6uXvZ-jX9`9p^SD8H&DVE?}RGgkLpwJb%TeY?<5X|cG? z-6nZZy|@>t&IfuT~amNET6eQ+o0D)wuNsg(41F zdXatm;Y*So$x@=Uzo6oKV>w6Xhr{~oWM4!$(3A^Gb-0>uHpI5KuUOp*52l3ZE#;^3 zVx&lI!o!Fftpf@TO+P2dZJn;72rw|oFd3u0)SmTpd%6@^dccvM1LP_@bti-(iX1f( z(su98#>8O+t9x@d7j;AbTmKLi2Ad@6-TG8<|L==M0g;)H`o8b(sZMFHw-$ZMGjfs7V-chK4XgWV zN80C+@;pI$V~*b$?THblRg7~gJL)yOg*xr7iEP;@v#+#!%<}=Ok14rZ?i&`R9g)vO zDIARkN_B_j>CCRHV06c@x?=pD%`YNkso5)uzP#EimKyBxoaSMa@IkgyPW~4QMj|&; zMzttWjC4$fmJG*#;L>Z}NLuFkUc!w2Bt_d{^K-)(-Epk0<(bX9ID0bpoTQAg-P=8; z?w9#^q~c`3$;34@#Z4=Xy&U&`wEH<9QlON zoxtj54(OO2d81=7BXs7luD_xo74tv?Ya%oMaKYi*FG*YTOg1&jC}{2Q=JBZC=J7jD zU0jc`;`CS9q2H-*ti|?FZpP?NVs(R3KYk(}*n3`Rny(M53{;)0HznxUV|2e`bxSmUtjkrn?bGJg zeSvz9xq#!tQ({mt?g5hoblvRSsGJmyNi}?J}}9XO_kJNe*EW^*YY zI@TS@yVu3efnT@z#FG=nhp2V881;m@ZglgP?lCsKN}T9Uj+XaO#l6qTlPW&I^^ql2hU4zlew8%FmhR`>46O`oXux2^I%*=IJU)zrN`7;r3Sn$@Oe_LACIgFDrx z1nm~n1<{3>u^97=wzR%=+_>;&`R^sXHdUpZ_G#$1Bv$&fd8{su`mMq4LK3?NT<3U> zs#FvwTdvEww{Y*}mk0^o#vejN=Cp@tdfcbVjdz{5`0N%}N%XMrX68b2;^wy%YK!-p zYB0JBSlz+$8$WIzdJz|}S5SM7L89SBNvpe6nRCy+a4Sc$cQV_8yruAzI(tx74YO?t7;vYI{9Ze#*;s(Z^XED zso9Y-5f$Fq&Q~tax2uTp394gG<@}GYTfVE>_*q@a zctBk>#;n+#j`&Lv-uuXS4M+7k}Oq&&s+ls;{~9n(^z88_iShA{bprjDIbp zN%yAooZ=9=^V!=@yATNt9DvhRz3?*VtLgEoAqJba{b zV^KIC)fnkEn{+jsb7Gz$Z-iR*ls!%O6+J7Wo?~=>^bo&I5%&{}zhqe5n8(M|Il~Xy zDqCKO(*H=a!!t|i-7l)jvga4nof@}(KH8FaVv*(c6U+T}dPzfri93%yB@g+1P+%}- z$KuDqv>O^2-E~-9`Lvg@w@CN&u}oUG*LOKjxm&(!yXL8~)4`J1&F{f|Rc>wd+Qo+K zV{K6$ON_w;AS8_Z1(q3#&n^;lgKkLqW_0$-%_-6x-X9w)U>9iSZb zHfsxgXTRlR!HG_q1v09qbMj%bH%--*)(8C*@q6(8Ny@#!qf9-&O$UmeVCN^%J;{}Y z)Ytfy$mNOyjHwm&g7e2NUsE5Uwm$tqX-Awy7$0%nxd^$5bK8z4j+<>c#}QD@{<^HU zo|l=pvw9#zLG|_SfD;oKe<`rKyhL4HB#d88-))r z$M!o^SlyZN(L|0cOV^)9-K6_Y)ouzdKEeAn$$7t)7ZZ)&?Q)ld#b|#phdJke!~WeZHC8utpW);| zgUd0d6J;dZ9ix}X;$CF#psys-)9;Obg`3}{^y7*$>n*2_bip>e6T^4eTrTqH-4nQ; zq#ZT#ApI95_Bx9OtNS3~%{}b~x307u@cpQJZhN>+e#^h6ZX~DKBG7vLerloJ_@Ntq zNt3ZOdwr@7$@GVODgA8WbggvZteJze#m}?YzZ>6()s0=Ku|K^VzQJa!c$sqQwVXFQ zN5EIvEZYnw=Vq}lFR!vRQStEC8Fl8Ki)X$f(Nm*wmdv-oP>`|I>%vV=%0%q_d0MP4 zt&cdzgiaqrXx!Yhj{9-~IEwDPusrYGozXTF3}*MD#Aga+#8M@U0vil;j`eFd)dxy% zZL@s+;Q4!-;13FA*zqqNRu`9f%tH6`_Yd^?1sAAx-u^sr@$8guc^S#~nem*`XujJD zr;^@Ykt4|!xpzsUl~1%VR=U~u`@}2OCzk~5J|0Uv3R)}U2Q*e&SxCRN7Bn*`&2gnm zMt#b@-?`tcp8sB}$urIoV}3jLq#1{H`YkVx(b-o2QoTO*)ODA3S zGXyVV^LG~xA0lN{K(1tf)^-GhIZt_y3eqi}sOUI;SR3cK0X7Uk0r1M$SV$n|8kseyiMfb>}ZhxtNwW$25E$ zChvBvH)@EW>l!Rhb~QEZr)AjHKfvD`v`yufWVSt5e^Xfa!qK-G-q`sl6zi3RwCI>4 zuXB~ROgu5Cyzw?8IYyTWt81h+DR24< zMwc0@`{w$K=3#bfivv7Cd|HKvIu+MPwD=X24$pKK6t#*G(^FG)zgh6B;dmG2a}bxt z8h+q6)j5(Qnz@VLIBw6@&|v3b&^?Ehg;YZS0kO?O+8GbeBTjq5rN2bmS!&B@)D}L| zc^?~OpH>krcPiSF?|t$2^6Nbe;iXOyo#Vw}5si&jb812-&I<@&{AI=JCVICY{lag| zE2J%+6^fhkYMOaxYo+0T^nN}!ms9!$a_5>ODd|EKH&_)fs5>>OS#laspiSkC)URZTKN2t3kNz=Hru(t9*GJxVXkeQN z=lzc4>B0k>_Zj=i?aMxWZ9*ntQjTe_a?hw{6%x( zD+_6Ty0h{T4PkE@R-*00>yDMZ=l(!WufU&adXQ`??zo>fr&Mlu?D@rlNab!>xyS&; z(Gz4RPZOk9&RQrq2O2uOg!$+cD1Wx{RM10-iFon{lFJ5DyQ>2 zq$HH(66>x)=8W*-%j<55ty5mi4ylYVxRJ;y?MoiPg2D%n~s!nrN@`V!V*mM|oV7 zFXQ~i0+RL}2RP3Nni9*#FuEoVh1GPG35VQ|36HxSo&G$j;=^o%F{w(O;S4eM{D!_G zzp{|#e=64A^;m1OHkGBChr`PN$6~9o4`=8%6&9PYaHnta(B7Mu60Ur_N=3A*UcN?! zb2o86|C=`xo665=*alNLVDGnZV|DfQJeFE-wUo)JseHTRvye%zvSH%ol`d zS1$VRn_+xq@XOdIac0YDWdZJmqr1r^$9!1VSJ5z7#_l*kkB95VVNk7l)B9`fk_CLP}P1sl{l1FD@_VTj#jh=Of<6L=PB9)smWw9_x2+ z_S)U#l<=!2Z2EZ1tC$q}*TBFOqlm*F!#;8R27s@<#sCNA{%#8teN9tCP`F zD<<@|@BLa+DCFHmdESM{_e!;CgyuI zRVx^uj}dC4(YtPal=9XHuNn8=g-MIh!;ym_=5IoCzt;{j$9z1zY2TGV!K{FNnP&sU zlzs*s9v?5;qx2r{@3O8aR@ZRruAO51WDh)Od=s}lew4zvlaDj*OtVxv zOxbTsQsy`NK47fBYx}WtzoTB(XO{HR*mqsal5A;4V@T9Lpg5rK@~kYR`VzkMA1^#} z<2f$%GeM!v@{+=)?^&<%BB`3JPPcdOV8mVjkgLQilxNQ_s`6U&OQY-^o*qW2pK)^U zx}9v?dX}#PNb$PjSly-f-De#0{e75e+=a!?pQ$kQZ=Rjk!t2vZibXHijRju8m4_~t z`}g*n6IU`FkC?r|9?NdH`P}OR?CZ1ok6I-cWOKa^CC#V~Ykqsa&G+@MdcMIAU0!%y z9631zKoYBaHOGv1G^Op@ufysNn|o(Tau^=nnb$R}Ib<=$8quB}_2b(oz5Ss|Z#O-7 zr=fCnDOXJPY302;X2Q7<8rp5F3SaTMr1*v`h1I=aBwxRCcS>(FyB_c7kvWsufh+XR zaoX$V--I%RD(}*=oCRxntZtc7MWI$PhtbphArGJ2 zKlMY#!}=HLsWh8}Gb&L!2O>U&O7~wXt(=b8CO%kZX5lCx;N%olU+Pxzj$cDCH@(&f zuN#E_O)dqj?w6xSV+}1-Gy6#?@ADk6B;q;q(^|J^?n_2iM3t$D2wz+Z>C)lx^t;NZ zb#8vBP^{Sfx}roRNbcL#=btZU+nou=>n=anQW2}`lzViTgx`%VUcq(q!SYZE>(lpy zUDtD4lPkWvksC%el&R;h5)@A_^Kwjj>@Gc3`J)lX`bhFaVdY(#9phc^bKeY zk->=qlsH_FrK7!wg9qCB?+f~z53mvQIpm(m&i_>E-*x`~um#2HH3|MVvHulQv@K&D z{&&g$we9~8u~<9C|Fsc7dF9~Y;w%O0PtZ6~JN{q0$JN!5FRmWKp6=GxI1+jsj^_WM zFROdGW?75CS_IZ2uoi)}2rNecowqz4tvu1tw|U3^*>mWB_c}qbayEB%vA4qEE(ouk zEE z+d5i%;&A(RFJI69cRcPjpVlI<7J;=0{GW;d%-Z9Zl{I>U`c6*|U;OqKo&WcJC(^U_ zu<){Xw89PR;&4>|A3aCm1G4tN|7{V#+(P-^w$HU4twmrh0&5Xii@;h0)*`SLfwc&% zMPMxgYY|wBz*+>>BCr;LwFs<5U@Zb`5m<}BS_IZ2uoi)}2&_e5Edpy1Sc||~1lA(3 z7J;=0tVLig0&5Xii@;h0)*`SLfwc&%MPMxgYY|wBz*+>>BCr;LwFs<5U@Zb`5m<}B zS_IZ2uoi)}2&_e5Edu`yBS1@d;_PL@6JjY9J=`rt?43P4%^e*@99=9=+SofPd z^o)4)5*|Z}OD1eve)c~OhyG4q3qT8cHajYZw6xI%SkUv&Q4x4tDGvQk30jtaM*@di z53fm30a(y;$B`L5YnhC&4Lvg)ZKD9v;RV`^p7)LXKu428c#WQYjkdwx@#8K7XhF|` zhJUyXKs12-M9*+WpQ8rskr5X3JY)0{o-c{ZBy2;^B1SLa*)=%y>|?Zl^c-Qd4LuY4 z4uBR^BWN2Pa1B8FLbZdo!6PeiH_!`M(6e{Z%ThwsWh*ZmC>6aV#Fe0iR;erWDRj)p zXXHPMYay^6Hj)DrXbta?e<&X4_>m9j_|Wkn|B=7QKjhCQ0G`W(+YF%kpn~!n0BV2+ z*a*-9bO8G8flUAduo++km;h#g1z-i(fGxmQfF0NdZ~&YD7eEQb!$F|m1xN%?J|zJt zhpqszz+UiUAFv-#1JnTxKoigc4gx5b4gv7!2OK=E0e2WU0_Xzy2`J6!->=0pq{~-~@JOzy+9v_j3Sxp8q_s0Q>@e1L(I+mjG1pL;x{> z+6ZbB=ywI~1J{77z)tv>C?Ez%029C%a2bdIB7rCX{buek@CC2{EPHJ}Uj!+;*356}Vh0Q!BwN#Hxc4^+XnYM>c-1-t>?0mXj;uzmqN z1u6j4zRQ3oKpb!#kOa+fARb5n5&_h{lYqOxJs<@T1a1K%z$jn`*aJ2|H}D>~1bUZ& zFd!U2zkh&!gC-Ab`9K-)1b7UD0Ox@7Kqznl2m=NI1}L)`K)(RZvm*UMtv~qbEDyP4Dc2B0q<*oav%%H26BJ`pb#hlZo}tdfvdnZAO^PO0l7dr zyuSh5gx8(Q@IP3rP@{$AKlP7_@DY^9+hENOkiu(JiUfeF$NSp}>zBY*0L22urVx+@ z(0&VmYyiaz)jJtLI5jSzJ{27^$_eB@>WfegpyNizk2Fy~zy`1aEWkQor93UXCI^rP z>U+`q70r$Cng-YaPyv(xH9!ZT&ocu|03(32 z0WM%Wzz6UG0sz{d5P-Ie0y_zy_ec-f(Hb2`5Pn+I2LV(c8h|>m57-N!eW?Klfc*d!fa*gPKy|JOm;=WFGe95E z0}ca7O9#*e4go0M==~AE6gUPL0fqqDrvZRIcN8!IjDZt?C13@h&pQCNfDK>|*b&wz zVI2T?1MYwq-~)I9E`S^03^)NOHfWnGfIf>}dk|PDi)=^>ZAaTy)@ZvQ;7eHh!}<&m z2%G{|K8N;?wxew;nx_fd!eD&?I0u9Pp}=_{9JmZb08v0Ja0Nhha0|Erpl#QHtH5<2 z4!8**TRcDkpwHh2P>v)4C`YyeTL3md8bI}!4x|C8fH*(~+yPMANrLq~AepdEf%RR& zYqWi3Kd4TTZU(TTjdWJpANpJ*fP4}G(C3jqC|{9J!2s4TDR{r4y>blb^DEjbK4-zU z6`#?*R?6hU_8eeE6RU^ff%cE;ZwJ5+AV2=A|ESCZ0M+S3ARj<^ln0>WKsx9>+Rut# zX#d5)ioJ+nU-1LQ9OOrq7(h9Q za`_QZ3X}jVaYySic#l4JfnckE^-3PCtdT}NPz#`#)B!7+&G5Pfcm=!$-TX!x9?_ezibO9^2Pw;wW`+IoZ19Sr)fqtM5=mkCi0|XXeJrDc@=71?+ z9QXlD0;9lZU2P+4S~0cHW@CnflfPLk^Z5&+qk zfJNXp@C!h8v_=|4@EVPQNdYo|7q+c~H5wCB0JOkHfQqoDhV=#jjg`^(%?>`#3~TgT zjGN&#@(GP=(D-H(u;L>VyvF*x5*OqPHs_$k0&6w^#c9QVR(Ow%6^bu6Y~utt z04_iQkO$-dSwIFrzmFpYNCFaoI3Nay0y_Z_Ko}4L1OWkH2fz<(2lxP9fCsoi7_aaJ z!y8yA6^+HEO}%8{I$Zi+*LGt6_v`Qt@VSj}y7MmUaGBqn&rVKcCMqH(BD&n-sK64l z^H>C5(Jnc#h>MEAfB$+0-UfAs8!vgE#YK4sB^8CNh)2i~Z}DT5_#2%u-G)+$SayK+ePB10dgGRF=M$DZCpeCK3~o zlok<#vyz9kx3#mUM``p~rt@QAA4rMBMI=N}KjrD+Xm0^))jRJq?=qFm!G6S-eM2KP zING4rV7hY37=w6XA_);OF{GwOu{R1&5^fR{XJCBv^{OV^U7Myd?6+ zg2vOdpk{FI*52>&+7N>kuQLdi8&|72RqeCp|5!@FLI-8GjDFf8Ns-U<$5Ia#dax8+ zY1U`DaeD6`3%W+x1eWJX?F)1KC3pW=#=rutCg^0+po4Oo1IZr?x*ml7IOyQ!@-bCT zha!f5)f`kfJ`Yyv^pC{_RVpm^zY`xcHn`9Vu@)5(mxXFrz2;V)&3*jPHXg3$?U(TN zBOxLQBMV_idnbEO+_b6A<=-9+0)J}GfZ&_%N8K~~C`utZW>S#XP}|4Bf^yU*=UMf8 zEBRuu5HiFbEGXmcPI{|uyQtrdw?J!vtO5(l9p|5Na|ay`vw=lYL>eXB>KPIQWl$dY zPOI13g(V6@8Bs`52u&oxA~BodULxv!=1)Z9!Gh{%gLK1gjqtkbcn|QI_y8;nVDaNW zKfaUQ;T^#@DL8|H1=Wwz9<`74TxwAS3!Di5N&N_r;9GuB><3q(s>bx~1P`Pnar?o7 zGLcqAfxK$UXylJ&^_pAx#UPg(uQr|z(?Z81DI$)lVfFp|lMJCCUG~jZUP-&vN-eWKid>Z=0QE$5rW6-)nT2}yy(M9#1U^+Xq7jq+eb!Q8xFT$=*# zffQ;Bw+WvpVSdr``t{-`f(K%<|N4z4o$=)KV|AxY@MZ8Zu=cPtcQm)M{^eNp`=GJ! zaj>B1Kwi_si5j&Mk8ric!c?A9_%itD{MS0ACE5a?MKS(sCW?tb?yR065W4@;Q$R$; z#leMt&t9cn9C9KskXl`B_1szcJt28_3$tC!Sw8saz)1tt2)~k``rx*Y?5U3RU_p5R zj;+2Q8xLV?Ur%>))4)tAqthF>P;{0Pp&9~#VzG^Qz)W{+%oQwh%WBO8%QJd~>El{g z8o>hROthcXd!%+KgLXE8DbZ)0uUAp~8?Hj=oG$nnC zOuYc*D1=i4dWxR}%c+B-&T;F1_WUVB233u+>x+7rbYNOh!g3kp96iAzWUa4 z3>I|GD&OV*NcxZnIap9cA$#?}g8IbU2kgE_Ts>GoC<9*G5iFL+N?Wv<&P9U-G8DD? zK(H`DnJdQ~(p^)AAl55q+N)sM2A2C0-m|Uh>~wfFl%oIom8!pF)vDu=)pKX{JTQhN z04IWW62)FOYc!w2dmttvA%(LB3(5nw6F*|k88hnOk4F?`$m(YqHzW`Doa~*fg{>@bRWDK|f7hfsqj91XK1cta*U%twccFtv z9+ceY8;)ps-h}r6KR#H+H#kz%hoGBVnpGKXvVGnkpbX)RaRLq#)xxh14dVSrUWS2% z(EG1$`LFvSU9JTprsKad3f-cHf+tX^jIKGDM*U6sOoFxLf9?ztcLz-t&_ z0oKUP=)^lmT4A(3$`{n8gqh7cwzs}ar zbGfq;Ss*m9|J1@? zvKQisBKnsRz6=~GsQvZ4jUTQ5Wt=FrJSP9kIFXPCe;Fr2=Z5z4PsWLV83jPl(2(md z$3wVcdCs_;i44vg#3hpFtWm6&J^0J<5Mtm1r!sT~+{p4xMCyj2ER=x}EQ;G@u+V}f z_;%m*?*bndz(Ob!4;DJGBr;ID(_9EeS4ODkg+e)CL1$WOx5&M$A1}{=g)l~{B$PQp ze}VVG75{T!A)JF(scrC}1e!=S6F|EY156TeEGQD6yeTjK{|C@EE`gI9vP-cW+ zk(m8zl1r3}BeLsK6H^NoHR@UX~pAa1iF5g5Sbk0J@BMCD$U_tGa zfAYh)2h&6eSWx!{zNvr(5;$l{(oI_}>nkn33_eFsTKjpUR zWgjJlMnZ5j$m{1|LH%{RwrcuFRKFzNH+&)at;-oAN)q82<7mEo6^ge&5&V8u=7j#t z)yT6i*Bph5V$E0GTV>Giz)X!CI3w7CNw)t!tGknIu_m3vjT|!@>{^<@J%zcl6C4W{l#G6mPM&wzigm ztB`a0UW0`K#zR1Qur zN3g&c8jX<#p$r<3PqtJlI`y~fW4tX|vy#Do9GWgt3#^$njPOE6uH@~u8s z>9N%jMUCL^V3iDkSpPLc@cSu+BSrnFs7Fh+-l9H?(jXK6 z2OhY3IO5RqHpR$tig^^xSD{gjgappj%h}J;#mahzl0~=-4Vfuk4PQSW`Ih&SC~bKt zzuMLlUj{}maPRituRaJph3)p`Rx&xkTX9!Hy7`Zq7g*3)=5GEH<$`~^CSDESPFJ5l z;M=jBJ4O{_Wbq%q@#EF-M;ZVY)F&G1wjMP7UJs+&l{}ynSk40x5?&MD48Z`fpxTy@ z!+F401w9}Jr5??UtUh{Q@oKW@cwRvn)W`R*dGGoa?3xM|bOr>=Uq^QMk+*>0@_wv; zXUT7sJ2MSsP|pW>ZDnoYWefX>48ckEvo_R#MRIu{zq$uD1T|WkvE=*&Iy4SJ=X&T_ zUBQCdf>NKhpyuQG3wSkrn{)86a7J}1=f_gg_c8(YgQ^q~9ydo&i#13mQcERz0%h>E z4Ogxx0I;MKR<{*(L_r>)QwgNofACsKc)9oAnXXhhblxHm)SwQ~j{Y)MhCKMsbL$Rn zUe@S>TZB@T$av}j38+axPl4L$s#kg&MV2#BWgjzccQjEXlz}=$F06i~_y2gF9BOX$ ztG3nWkyam*uYMU2({D`fH;3mU(nh(a~+g9T+`cfqNsmNt2G4u;%C(OG?l zY4!Uha-ar7`JmxSy5K1KM>3#>dJ0g3fB4?=-|v_FHP-m^&j(OLnaIiBW%MwqAGKgY zzw?!FJhIn*bxN=|uo1kLfxEtcF9W+**}1G1lGR~zGUKcuz6^dwMw?(+I3&Mbog@Ky zjYdz<8dq0a-SSUz^sgg)eB4%_gIxVC+&{^x)$8=%XQ`p{!Y`}W>3@j9|J1qY)#J8$ zJ6(NVdG!|je}0bmKSXrZnXG@(^Q|7Yf09-Iq(@4Eei8LZ8`bMhQ1?`3{J8@ACq2^Y z*}Gaq#s7W|#*gD2?VV3r!$3)e@#@k(rA~Cu75Y&)b>mjQTfTY=UOl3#-z!+n>;H6j zdG+($>h0&>$I2_?>whv+zj~WnJv#q$`?u928VF~>O^|P-x@WdIZ_s;#@BLwV9lpu( zpGNrj$xdbAMYE}(^5emp9O6hVz%ty|OFw)X*)5k+@N;f{d0ueAqc z70aug8#tdD9smnr#!Q+}#&On^%s$wU6fE#nDKwMy*ZaZvIj%iW1|5%^yxuK&_Uxxn zh7i%iV4+7xD)8Zwm--I)cGJr2@#-@RtIrl$ff}kGI+hpLnP1DcgBsjLKvn014hEL> zr0RjCk&2CAfeRUQE^#J!aNW9puzm zvGaJaG`}&+9xR01A%XjCG~mH&DTX6PJyYu$h?I6AIXKU`OM(shIh+2@n?>jL{@Ks! zG5G7%JO27~b+3J$94+l&-p>17c_3Hu-Q}xleE;^>Yg&B1{rfd7R40DREXf}%S8 zFZZe;uPNo1W6j`unvEx^FCONIQ5jJCCmHhBwt&BKbvJ6j2Rx#DPs>}gnw zbUpBD_%ee~2DL^5-9~M5+QQmDWhMxg1E)46TbT8y|0x6CSaY#7_q6WdR$PDH??Ncv zg0G*ye3y-Icg$6I`JQ;Np&(OQk*N)oL05X<_3CE~KXZ3m)P$l&1~O%W#?W0JxF?Uk z=&<_t5A2=YyzJer-QQjeIL&O-CXt|7TFX>|x9W;XhNw>;1d^|c*uzZK(K|RG)p_?AQ6B6*PJ$%MPE!dfR2%9^5*sIRWoR&@U zB?1efeu{T5w}q`-{oIulT#vv)$hS(cpxn{k`TQmbxBZ}`De-@C~BBLO<&hYJiVv(J78;EvzjM03?*8t*(|vdT${#!T>&H2L z`t<43r%#{meftOI{`%SP2AfqBb6=xG?49$LZYZxl=ZeEhfrkEm%a;72v*lxhXJ06> zQZnn2#2-;2x@zn81H}_>+m4qF+LY>F+L9N({w=FN9=uhkwhp)xUu0Im!G`{G?E6=*% zz!SFahc=O3DEKEzWG%VtvK#Ka_{Sf9K)IuOXQ~d-b{0Fz>bZY>?#ur9OJDz0vC^!J zPMP(#WUaZ@ZVgxFzHr%@Pk37M(Ju!^MjHygd6A)D?hUtIfBV5gEJ!Om8~5k?z=-so zaO}j7|IxEg8hHvHp+rXTBd_|%4e$Hnpz z$gIEeFYcRLJ?CjFlt7ulY}}uXVWy6pVw<9O#Dh*dqTiM}jpeKFUAg7N%kKGt_D7}a zjNdX;KX~zV-~808uM)ml?(}>4kg%+|SD$y|p|@?@B4^0<{3ja6)ox}>y^p@;!ZV-n z-Vc5c7@3Vw(8`w@qt39r;eB^+J^R+by@V3-bvAZri2*<5x?wjz|IT0766Vk1XlW@g zxb1WCg@621QbPtU3_sbvsOn5CGXC!gzDK;%F%&qU<-xHa?@Zl{FKXB{t zGr-6U#^!By+9S3YbEls3rp8zPY+m>#`T%SjME+7Tbq1>*y%X9*dM{YMv-R3PJbV_| zB$gX=_fjGn_M`0^|MiaTw?0)$3(09x&~XADQmF3*)WA~cBS2new$pKVYHb3(^qG;YBnB)sjIWj?G5Z5c=6g}|LYUXA66#VF!#h)7#V%alPb5U&wUheb~MA7o==Hr<=Y>7$$JlexBEF? zatS4J%5&-S?|k0VPv7>JzGTV5ocgn$?Y{I2`*L4$jFP7S^P$sr-SXuJo0t2Nw^Op6 zl3g!)|DjJjX6p&Q{?z%` z?|Dr3+rH#}3v2^Z2dLJoyn{GN45I^PTq$AHL=Vk9^vfyn&MKl)U*-H?17ncHU86@@`6GeCD_P z{_lMAmP;3X$&Hi~H;XoigvP z=EaWRI6BOWUZeBMVbSg_KmUx~{&L@bce!s^HWkxnetzwWYbfFk1nv>;-sl?P zT(dvyXZDic0sLA^>(ZRWOD`W7t`G8ZXOE}`{c0BN!En%NtgjXA<(1*ea5yN>+qtvI zm)k^yt?%d!x`)dh{bG5iue37@5*Zet1Q86EkNFx|vtQ&9T-EdkQ}vn2{GS&z5xB7y z>V!y}0W}dcmNkIeuM9OJizlrgs0vxG+ucFG7^;(?BbrCD zPBF3~)#)#DW$WmA#$wyE7^D9S<&ML2gWi1?Gkv_UQwBf#)Zenf3CvCkg!0Q>= z9@%sya8z;MKv$oc8chi}a}y9K^8ruO^g1R1=DuYfB&i%{w`o@{r>6QBkwcI~N&_j0 z44%FA2rB!9jIaaTo8Vq3cff{8Mh)9b#oX-vcJ11=d*7aYxc%FsGUqBV+N#4`F8aMp zRwFJiblan@EIe6334w~`XdptD)$q0!BmI~T0BO?;5KlX3gLbpu?05P_$-PBLCp*%N zuMKLSP-)jiA_80O<$$a{Rd!NKTa7UQ*U~Dt9Js_M+BAL(8B>OVt}yu{eRUE%Vju;}USzE6>zvY{D;~2;)J1%> zT*G3w0ITMUw?n$^Uc1{EHdln6Y$-2?*kgI4o5{sDF8pLAhRT5D&1UN&Jd~?Y7+?J( z?P?Lm>;tq}u4YuEI>w+STTBuS0=MZwnU7liL!+W&jl?O~n6C}+jG9B)Dj(p`bg;rH z#ZEn&$_QT^dE2O)cl*UU&9Z^VCRpWe^HS01Essp?L;7mOA!`K0xEzOsb=rCzA7d}; z%8Wx$Cl!qKj6fRndZUU6j2#m6t+tF@UB_0a9^CYNDOVau(@J|Owr>0C0UN7s8K&xd zO&Jv)k8c(A;cv|Z^iA0t4&bDq8An@h`8s_D&GERAQE(=)onMv@10UY(%Fcc+L z^U`{R{ID8`!X#A4xj~$W>WVY4)h9-;wP<)*XD3_K9fxBK6tKM(e6RF8xiPU!tLu3% z)H9U)ltnXT6#-GWs4$FThsL=uu{wdoFI7qj4v3j>xD^i+?i&n*Atf#`DX&=jC3yt_zk0!~+%m#s09&GzzP5T_Tns&*lEj+HxjyQWlnoK#kReim@DJ zsLHmumpCsg1J*}`xUd>%!XzqHPHq^ZZew6E4H~jdFj&oB z^g$Q0^VmLrtS0S@<)DitC?+lr)$MD*t54D4bT|&DH@&4zx$&(=UP=eqlLKJv7t*%C z@qN6VkT-yaN$p?KaQAEm+$Xe?N!7Okd^ppoj6Hqz^(GwlI% z-=dGw3zTzA0P4QsR=UyYPKv!VI4SB}r{Q{rS3VIfAw_N&K~YQ7b#cuxImBnx!7111 z40;i4VKtD2N!4Gefpa1Ou=~#BY&->tkOCv3N{pni9ik7E=(nPItZ_uUmC2cV(QM${ zZ7i}Nbl8@S20mS2db6!-<>|v z2v*>94s_Z_V)MXB7eu>n5tp>t!5eHMkGn zESGcK3T~Z8$`D;&+CwTad5`58E`rFUtkr{`7wX0RFR^>`K&#qTa?n>~guc`0+v0*QMWDD^V) zlI(7KL}6Z;(7j7+Ul~>dOPG`$>bc47l-nTz?Y=Vrt+eqJNzS=}XsQwCg8Lgq(O5Un z{6*;+uPelj=fNh~cgAHpAOIXe%Ioz5nu|UxOnF3BY`7Sh?AJ`z$#?^f5OFW3I)M6s zz6D_H7n-*^49W8&*cwLRM5rEw^*~fhtCf`6XxVdZVC@(Ewg+%kMybaW+`?j^DcZWe z6r@%fy_Q%vV*lW^&dOd}A_!N8-HzEq&zlQPS&(D)t#oU^sj@9LmD9@9h%kg&Sym}d z&82B=2%q%f7rWQDO{1yO`%44pG0Xx}y*mO_^{H!SN(LmVnI$DT2N3qf2z-!3^XbSvTZ02GIWth zQ9eEoz%ri2Qf)VXoOSkA^#s z<~p_X`a?_*j5&;D@dlnPh*7W+!b68Uh{B|wEHU`14FRscVHsV};nLSySY6Gjs%+;u z3dP4u%vc0#tsa6r$k-YzKW83;q#3shZ>1iJbJE`4gvV@U#1cAzxvr80XM6Cegy zm{clLzJCiK+c*!do4VaNQBz9O9iap3zIE@V?JmlZAvWbe4wm{cH`7>6(2eEL8Efb- z@`N|OnO3G}_YpCuR}_>rNEHNiMu;ardC;TpW`jh3RT(XuE7QcJ6VaHylEa|E2y)hB z&_w!SgSj;B5AZOF9U_;@;rX8%L>5)CK88o;o2^ zjVL-o|DsN0g?D)7kvuhB+JmgolIXg!#O*hnVHFFi3A!K&tI~7UHwd&(c!@4Gh;oS# zkr;V|t=Y^>k%fWIL`IrvpI9 z^a9nBDWP%X8Z?G<(P_3j__`Xz5UWdoy2dpCsT_mEHW1@g4fYx|GHn^}Dt8+^31Hh` z4T%UuSS`d26nN7o?_sxq50id*nW=rX*E~7aF_hY?PY44d5{Vi^8t`-#^bunwdaEGfp_0QyRCe6*zb2R z6^s5*;!-1>n5YZRi9Fbe)>+syzdIQu>WHlF7=W+(3`mSnr;wa7A2o zaj9VosR!=*ON;3fIX3`y7b^@i??VQ|5b39b*DESO>u&&ShfuR)c+A+{zgQDX>mGqvSs(;eCf6e9LG+@^WM%k2 znW+x4l%8D^TWPHn$FAKB8ApnEsYb)4Y=1>jY+3aE5M(A4NjAIY>7Rt`PO?RiOz>(Z zSD`%d1GN0i*8A}>lBUP=X2KKObPx7`~@REZXa^A^Mtc`8OJmw`Y{ zK@?^wo>b4LsvD(B^!u0^Vr!EgcBjd};=VnkjecvT&nm`hf^IBFS*}ZFiztzGyb;Ec z5*dJcMNrl=6k|#sRS#4FU40^%>9aPk?6uuW^JnIDxP*kdB|~5(WJZ>cnWjBTU*E6; zu=>=|NSS%T!~--)(OG+p8eSaDmfA<uhBc@q zw0am2S&6MOCE#xcOj0dCrD1|%vZRE=z5@oR{estNmB$?+dG8A-`vsKUU7M%7Z~_lk z96`a~z%Z1D%=*1Xc&9h-;!og4X`~a*-W*nyLF~Q*^bs7c zWkB7xZVhyO#(#m0$Dy|R;3IhI6@^DNNU!I_c{2mM%oAncF(1H7O@ z?h$0OjY|<{wBB@3-BfZ%QqB`fOiwOLm_3YWb2$^|l0M$+NN1;2r`>7U+VRxdS|=v6W5Wx94sptH&XXUtSjv*yNDsJhzz8qG$w+Z8*HZ5pOkhk|L@2y9vt*NHKh0_tXx z+OTtA2$P5l|FvC$i20ljK}fY%w~T1Ap25JU=UesEBhb|+)TXyuUOFtN zjHvik6C(gSA-5tFnOgOVV5?_%j1e66@kxN~7h;^|pScLJB&W^Qr`irl?PeYi1&Q^mE7CwcLpzuhd^Jp~romCC1srz&DnWcR#7y{Fg3G6nA~DzF zsBu*ICmbmK&3GX}v;;jg zX?Cg{NXRV`x$sBWqy)~}9j`pGt`BF$?xRoCrKyQLonTDQb-8X|_?S{zQmqkOj0zkU&nJgi@K?JVaDvI^1{1hij^|)cA zZ9PZSmk2@P6Y$yI{c7Rb6RLLb7-0-gDUqtf@~Eg+yI~T+tR6p%fL6~CN-s*iyDl+E z_JykmT!(pQ+>7K`Q$cstPA5+!8x9#YS^*YzP=hE(bfQy{gPdVjr2TF z6*k&Ov%#RbZ;#L6<+y&kMeIv=THchJM}xdpqgW&G1>nidu-+06AS{;JN>H)N4Qq15 zKRQ~Y#^nT%Ca>LCn0G{*Ebfr?mM1E9+koH>I8yv;oMzE$Dl*1 zc}!5c7iRHPP;au!Rc=_b9QE)(ggNkZVSbFOCa>0IlLcTzEF96UG7{px0~whehtS}V zNMci1RAw9+O&up5$2YLJ@8iS~j0aeP)F$y%y{a&6re9u|Ajv0=lOiL|2nR^q_oi^D z@H;G;+7uo;wHzj!-V`pKx(<`3Hif6s3=UP5u_ x.trim().length > 0) + .map((x) => { + const [ip, port, username, password] = x.split(":"); + return `http://${username}:${password}@${ip}:${port}`; + }); +console.log(proxyUrls); +// const scrapoxyConfig = { +// username: "asdf", +// password: "asdf", +// proxyUrl: "partido-obrero:8888", +// apiUrl: "partido-obrero:8890", +// }; + +const proxyConf = new ProxyConfiguration({ + proxyUrls: proxyUrls, // proxyUrls: Array(100).fill( + // `http://${scrapoxyConfig.username}:${scrapoxyConfig.password}@${scrapoxyConfig.proxyUrl}/` + // // "http://asdfasdf-rotate:asdfasdf@p.webshare.io" + // ), +}); + +const router = createCheerioRouter(); +router.addHandler("DETAIL", async ({ request, parseWithCheerio, pushData }) => { + const $ = await parseWithCheerio(); + + const name = $("h1.product_page").text().trim(); + await pushData({ name, url: request.loadedUrl }, "products"); +}); +router.addHandler( + "CATEGORY", + async ({ request, enqueueLinks, log, pushData, parseWithCheerio }) => { + // const title = await page.title(); + // log.info(`Title of ${request.loadedUrl} is '${title}'`); + const $ = await parseWithCheerio(); + + await enqueueLinks({ + selector: 'a[href^="/sitios/cdigi/producto"]', + label: "DETAIL", + }); + + const productsEls = $("ul#products").children("li"); + + for (const el of productsEls) { + const title = $(el) + .find(".atg_store_productTitle .descrip_full") + .text() + .trim(); + const href = $(el).find('a[href^="/sitios/cdigi/producto"]'); + await pushData({ title, url: href.attr("href") }, "product-list"); + } + // Save results as JSON to ./storage/datasets/default + + // Extract links from the current page + // and add them to the crawling queue. + await enqueueLinks({ + selector: "[title=Siguiente]", + label: "CATEGORY", + }); + } +); +router.addDefaultHandler(async ({ enqueueLinks }) => { + await enqueueLinks({ + urls: ["https://www.cotodigital3.com.ar/sitios/cdigi/browse"], + label: "CATEGORY", + }); +}); + +// PlaywrightCrawler crawls the web using a headless +// browser controlled by the Playwright library. +const crawler = new CheerioCrawler({ + proxyConfiguration: proxyConf, + ignoreSslErrors: true, + + useSessionPool: true, + sessionPoolOptions: { + blockedStatusCodes: [401, 403, 429, 500], + }, + minConcurrency: 10, + maxConcurrency: 50, + maxRequestRetries: 50, + requestHandlerTimeoutSecs: 30, + requestHandler: router, + // async errorHandler({ request, response, log }) { + // if (!response || !("statusCode" in response)) { + // log.error("Response has no statusCode", { response }); + // return; + // } + // if (response.statusCode === 557) { + // log.warning("No proxy available, waiting"); + // await new Promise((resolve) => setTimeout(resolve, 30 * 1000)); + // return; + // } + // const proxyName = response.headers["x-scrapoxy-proxyname"]; + // log.warning(`Resetting proxy`, { proxyName, headers: response.headers }); + // const res = await fetch( + // `http://${scrapoxyConfig.apiUrl}/api/scraper/project/proxies/remove`, + // { + // method: "POST", + // body: JSON.stringify([{ id: proxyName, force: false }]), + // headers: { + // Authorization: `Basic ${btoa(`${scrapoxyConfig.username}:${scrapoxyConfig.password}`)}`, + // "Content-Type": "application/json", + // }, + // } + // ); + // if (!res.ok) + // log.error(`status code ${res.status}`, { json: await res.json() }); + // }, +}); + +await crawler.run(["https://www.cotodigital3.com.ar/"]); diff --git a/coto-crawlee/tsconfig.json b/coto-crawlee/tsconfig.json new file mode 100644 index 0000000..cc141ac --- /dev/null +++ b/coto-crawlee/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@apify/tsconfig", + "compilerOptions": { + "module": "NodeNext", + "moduleResolution": "NodeNext", + "target": "ES2022", + "outDir": "dist", + "noUnusedLocals": false, + "lib": ["DOM"] + }, + "include": ["./src/**/*"] +}