From ad3dbec5b557fe0c42d3fdff6ff5c6be3817239b Mon Sep 17 00:00:00 2001 From: Harley Turan Date: Mon, 14 Oct 2024 12:43:58 +0100 Subject: [PATCH 1/3] Create guide for PDF rendering using workers --- .../browser-rendering/pdf-generation.png | Bin 0 -> 105543 bytes .../docs/browser-rendering/how-to/index.mdx | 12 + .../how-to/pdf-generation.mdx | 267 ++++++++++++++++++ 3 files changed, 279 insertions(+) create mode 100644 src/assets/images/browser-rendering/pdf-generation.png create mode 100644 src/content/docs/browser-rendering/how-to/index.mdx create mode 100644 src/content/docs/browser-rendering/how-to/pdf-generation.mdx diff --git a/src/assets/images/browser-rendering/pdf-generation.png b/src/assets/images/browser-rendering/pdf-generation.png new file mode 100644 index 0000000000000000000000000000000000000000..2adf28bf529ce48f90168fa51ceee0e4c8279808 GIT binary patch literal 105543 zcmeFZWmr^e8#XMWppq&INQtSCcp?as9e7cLMyd-_=A!i6i; z7cN{{xq<^6L4rAuz%MLk6&cA3g}s!^z#orIwVs(NC|qCyUSGL@6=Hee(&;I{&mG|B z!UgPftP9w{Z>-Z}=@47_MfjWt(=~So{xv!pnjM!sSmw5R4t;+`{+5x&fXq3bf>s8jP_X3nJ zq4{wUXvBsYtggzP-E+=&ara#ne;s$-?$nq&O){)ko_l##v*GFutc#bf5YtM$y6|6L z(1tXY3wAz`{J)&?$6F7sT@mTO{y#qM)rEk`ix-KU1|L5CpPvYP9PatYon4%B+x@G* zo;%9lqxjrW&K>1ED$b+gyw092pQlaEc~qQ7#d%bmN5%gg^_;_$|AGk5)8~2mJWrqJ z>GM2&o}sVK(e^poJ}->th4H*Fo)^aR!gyX7{|k2d%Qenx#d)nbuNCLD;;)48UtXN! zigR3XUMtRP#d)pxe_Jc`o#NC!oNdR}?{PTJ+=m|shm`9eryq5_p~hn$T5%)EO^s0|yg_~{NCrJ$`x2+DR138UQZ{8UlFW0@PSxBa5Y49j29+;kQqQl*|ZkFuW zrubwYk)=9i7tZkW9@D8VXC>@yGsDV_PjVT59)Bf~ba?}`2`}DYud=L|&0-Ss)>|&blfv3PpH(ryaIf}If>mYWZd{B|1EzD1>n@4r=n#h*-ph{73D8bcVm{h@l(ack#H$1#csU6s_#Y+zq8?0m`^kn^Avb9Dth_7WIWGu+13!ZRCBc> zO%T>e>@|?re!R_Ms^0w-eA{Hb*j}l0){E=gYvB|K$I&@R-J1|<&(bV8?R>=D6t*SW zCYKgiQleda;8|f-|F=us9{u0!-geRb^{^ZamlcI)Q4Z*!IHeA`Dj)>Ov9lRvlO6_LkrpV2#1hd4QHMcRpxsvRrk%@J3=?Jf?9CSg| z;79M>W^?ar>AKa(?<5( zotFcAL)(*mp{-A5u}+Zk!y^T}h4d(Bxm)hx8nNGgB+fhg9&Lk zJ(c1GbnzcNP--^x5UiP$#Gs?i6N1{Q{j->s(p`KZQx4XayWS^b~@LlYJMq6&~Scrkr%f=8=`hnAHV!}3o2?OD`Xn8}W_)fE=+Y*Y7wZ7M%VvW_ymjwb^IBOSwON8^ z7RQv!;4L$T_`*Z-ICHY?fjotIS&Bg=abJOhuP4nALw~AVV&T^G++Qy9P=(GNCyl!_5ms}ef*vBh2eF>%{i24nx=rk% z%pHS$^{?Jce(GW~6OJAm_%MHK*VTW(Dnm(p_w^j799xOS=&rl)Jw%MT-xfT+-?=0v zv6KlH984(J*TnInaW3I@yBTjdf(cJBSm*@2vO6e`aCO~+#oaz}_FkvX5w1O>FrE(Yj;;>8Z$ z6_I$OMw_rr5-)_oy>3xNGF&FFkPPiT$k5u?;YzUXo7&so z76n(w)IQu>0=?XZX`5p*KCMRsdHBwcxI0H{`pzf*x#PsSZ^`n2-}Y`rVx{i*10s#DB84O5 zM2zyuqiW^mkwHzA&M1G0M?R}NAcVNhxZyZizyA(PnX-_f9>vKUVTFU3} z?bL8`VYW5*X-vK3WpvWK3 z{p_>mKsgWxS%W&~GpT}O{&Kem$NXjh^H1~l(_NB%bjh)H-4&u;mSrsqqS9f~S`EXU zmt$4KAu$;?v{sf{*73RV;3}mH4R)pR<;~Ou6XewpKGveVCX^H7a*)_v=WdEXpXmzL8-KB%JXTd3+FEYP%1$ox>MEg37 zrG9>AN<6bsjW3xDN{>}*7?L!V_|^|+XUO}Cul$tyUbI9|Bb7Vh)i^^}sj^A*iM8&H zFWPj5LLdp5H8~>lOVljf#hYsW;5&}uLdZ=8di?C;h^&A!Ija1@i=3d_o@@91DoXu= zmuA#p+34lsm&S40S^hoY)Unse`hn8O3*jv0*wPh3BwFVWrdti4Cvu!=(oQj;`)B$>_|5HTJ{?LRY?E0+coFsUK~(cGQvtT5@R$X=B9 z;DhFz979XIGq$lMCHCld<7W8jQu3}B9k*N&`c>Adb#38DfiTK_yHa^w=v_mb5(6Vd z6Iks|>J^)KqhRu;8=>rpLiO?dZfi0|hoS5ted0(F79BDNT_8a;y9_GCd7?gzZVzi3 z2L0G4Cq++W~bdAcq#v!vRrYaeMf@~Luf(Co7A z(T?`#&2Z`y1G4QMYoo%Ng)6(a%!rqt$77isFK63lnzWCKS`L`Qhaph>%`i$TvqZ-> z4&+){klk*#zD;xaU}ay+I~rdev3ib~c@D>>`=8DGHa=^@Yf?%aHacP$<>R#kFwCF3 zT=bjnr}^FSaxvs^ZuE0H$kdsjK~8oR)f>1T4qzX@srKm|O1|SN-oOs#-{v=N=_(5L z=v!PL;q4ZO)f;WpEauntVURG)`znxJ+z6%!EKRQ1b0R_HuENulj6Rjnpw56#q>&y9ldd-=g5HjUqO(wWAMT|RN zrh*@<<+ki+v>b5Kls=CeT;X5qHS)P;XCg0r`=yYI@a%s5@d^dJEot+Ld78T;YMf=t zw=WRBm7!=EOA6jIC^tXssZ3IzH#hY;*@wUbLa2#O6YYQcQSVKEEmsT5dW@rybR<>f zL_Hi)wqj!2{nmH;m;ytA_FU$Lw~`t@#G(9>d&swxtw|i>0PC=GAlR6|j zP4SvP5@`zWt)scZUcco;rhaAUtNawH4lU~CNm}p;rr27`;@c6kJHIc@PGbge-iG~g z>iDQdplfsKt+JXh8gaU0_iv`~*Zz9fp)N_nO~p+8p1NCO?#i=w`( z!XxT}-;5G54@yOfB&^Neyzh5o#^#E)CDe2ADj4RA%%4&}lA(6i*+I$OLL1ocuM*@% z*gux0-;h}r${N~KSVpn>itUW5!aMUYR5P2CZ?6|=oV2x;Zo3!Sr?oZ)V9ftaxJb|}c7bc24p(lvG|KZtRx#yKc_KkS6f%YPw!5p3Zk~7JH=kav? zE<1turn^aLp)khVRLgb#QHO7ZS;KbQ#OF;eYYi%D+!8i{&AFH8q@Zt2Qjr1=^}J8~ zB`F209=7uL(bOV>i!F?l1({puaTEDG%-Ctb_^G;-GJp)*}~aB68Qs-};9j@#S%4TE}i1_-=nIp1!!7 zsW`Y$f8bS_-Lk1*9Uh4|il6PX;Qg9a;f3~H4{Ck!X25aXR4W&D|4hP6(FA(T6a>^- z@UMdbwLpVI^HICuIybe+u(-pEv>DG$iXDeht2)u<_>x(!q6{CIfzoZ%&y`wBCELO$!O6rU#~qPT^Ap0m@9wAJCD~W#I%Ne2Xi>%qYo&7p zdE-CmxHB2yyWGVNPU!{3u7>xm5!S86iJ0RTzbm^_zkl#Omz;j4%u$6-nU3vQ=_a&J zEyb#Wrch09{BGrPGpBLhL3>#B7dd%HR%D9Xl=$S<=EQqg8QT1X(Yx32cgEuG?5~}y zCMMwp$XA)@dnp__YDAu*SP}h0UBrBxp+?NR1$GiM@B=|LD&^Sgfg~>_Age`S^;qP( z8UBt(;Z{}o^8noNdYXAsVFo|@&OXBiszBO1V6zdKI4{mQX~ix|q+49y&*z_#D&N z#D%*^lGOvlOwUGPvpM$jSRVumU&9vMW*xYNr`npWLdhaFuM~32y;X<}yb@eIXpblo za*-eiz}>c;VXZ>?s`o#l`_9*PEc8-%HjE_6W^dQSv-MNrb$XoJHd|e3F@%-}HJwBn76+gmx#V&G*&g?2 zI9V(PWYZCH*fu3cMNNByN{0AhH5-lq!^E61?p1WyOG)DLuBf)dR#T43Mt;lXog%o-i|< z5`sVtEg?$xy#P8Kq81X|#aWw6ISd?x!aH-tD@=h+L>hVx9yZJVexNaSDHQ1-*uDWo ztX$%4sX1s~&;G+FqsNVn@D2a^_t7QHloMz8nq0Wof!F@Zk9_}j#z~hhDs=?+f_**Q ziw>=jFTYw;r7`L=Xh_oOLmhz`G<+XG71J(q(%qkUk?3~3KXj`_s_KpF2uw%>Jy#Yp z{Km7kS3f3>KjR}J19c}02O*C!aPrdb$SkmAk;nWU}qh~=hQ)9qL7zA9faUInGPB4vrHY_yQ-#L zyE7N$nMAjToZ)XXz$sjya&f}+)_{duxa_30J>2fqdBt`pd$(gLGU1Jk0Xl^=N71AF z#=xw=YZQ*f8`1C5V$FGNiI%`>gKi^jmgdQZ^%0#Xr1}nC!>yKRXdRl{7`S8H7I%65 z)1o^7zX2)-TyRZD%dZ9t9+H<&#(3LIvU=+`=A`%dlw0fEPy^qbRP#;uIy=%C@J{*G zZ-IFiiDvL`#2L7l9T}-laQ6xrYq_WJ4hG-`c^9vbB&o$bGwtT;>TV6#?raPsn^rBA zkFmBk@SchUfa*;uYG2fHu@N1abU6Wev_|6PI(R#v)rEz^>1hn@$J4oY}3vrQfpZpCav3;M> zFT^4rt_cYozddOhGpB~IEYYTBf0|*rCPUR=zid6Yh)pC)%~rQ_oVB@LbKU&L)5}yX zVxEisMNe_4J{k7aPc1xTAt=#N)kp@>D~`cb-j_wM>1)k=ak?EftciS7eO&6Cc$w-G zBzhkei!1tx#&DdPkA;pQVG)l_0=QB;&5a1*l~=^ruVf$Y zPx6+sx9$!h*J29yrx0QmxBFE(i(H?@o5pRV>FLZZXNSb*<}R1%Ru!tZvzEEQhyy9c z>3MhlgVDV=y#?|SUAB3z31`A+5tELtTubSbd-GwiiV?F#%P&Sp`=e*=?+onmTuMgh z=lu-bAqEbY(a?l>In__*)XL2f>Oj~k>jNjY)BebnbhUf^ox+dB@uwWr> zV&Xhgn$}mTAIe0iCfb8{Y2I@`__Wx*F7T8ZHekw4AI+01;@wVJ+Ue&UVyU$sT>+?qJ4nh4IO0r8@oPB0jX>*lUn z^L4M%PRX;qwK350;ed3;u}V&ZS1L$_YTMbPZH=P>2hxK4aE;8{ZV9hr-lnrpzd;lg zw2~faTa|0u_GZV+YRYctBz^$QZ`>AvH(>+TeCu!Ask#=(ukZd`K~7yHZrh#B)v&AY z$Ajh_A=@(;zu)unC2AL_chUUM#?}eX1VnX*Ip380^@t)Rtcm3^*_ViulZ}ax-9FKW zN3nLxhXT$LOg((a{G2rt11n-~oXg!pt1KO}atRqSV9jxx1HnbgGJa(0J_8|H8&-y^ zf2CO+h*eL>9m?0X1FQuhh1hRHLuP5%*6|g;)i*v0N&SEyygXt4&S7M^{S!@M4Hd43 zf7yDLI)Kz($X6qwxOqDiG21_6W}7R8*Yx-0Td@xE*v0v~MRw(R)2tef(BfO^nHQ1| zQ5)r}X!Su%`-?v$fN;_S-BQ2BQUz=xsFOp(xO**dw_Bf(iR7Pl4q(;*7XBT}r4nisgW=RMA|R2^+iS zxF0g*xe@B{U1pI&T1EX6N?b2h%kL+VUrO_KMznnAw?+f`Ng?}%<716sUI0RvMfUef z*Z-g}FRGqyVvgEzq^-;3M=;~S`Dd+AbQW81R8!X8Tx2+tn-s1mlUt5H&rrs+jN~_%|XkNW^V6=n= z;110CES#W*O8CgN8fT5|;?>@XH`k>?-uUZ#+U>+k?`5jA?u&V6dd(~rhmjNMT*H6J zPE&Ltl}c4F2{T)y_|=QMnYk zZ~f{9HHgta!VfEAg4C0pZbxB6j9|W9smEx(FulFYFd6vu%4`%H_;9t zkRw{7P-Lzz(389Kv1GxuzD-AE3y@n+3VV`(26Y}=F* zR<#YYf9Y;$5s(<(ci07M=7;&Hx}qZes#X5OhVJNgElP^W5^oc+I`CR~< znJe#)Dp0=f+GDbZU|j-bkCVeQM#^W>O`}4@PF!pQaI@1q{mOQJI9A=>P%jH~_IpNN zxjz<>t$5UmIzWSt=AxCFsgabomDFSW>UKxeJ+;X(%q-$usGzt!Hw3^u#GA$@%Cc#{1@>o!4^{H z?j2q5ntin+vq{8`Mvf_ID#e0#Rw$%U!p{?C!Y<;u8y0ibjUfa~QN49k{VYX$^V8S| zSMb<44418k%}2QKRtt7#9fsgY4Jue{7~t4DyTd>UT{%8pE#k&anc%wFehPb?yPt~+ zf8*{WWKLn)-JRDoD7yAlXuDdH3Mc^ZGvKS?}Z0V=M71+kQid z227X6GE=Ma8`D)l;XEwE%h7+???ON?EA3XgGt9r>{!eDoEP%{~7*;Hwse?1GI?uGL zVsFHz>@ir&8pxUR=sUStJRQr3_s7mb2CzBkvaX!N6TLX^^$HES5ejag{n;yq1JFYt z2=hsPzns&+UB=#ggksA!K^g_%Rwgmz+HURy2`t}k)dsgDDuEj+K`mUl9f0eoe4G}i zr|P=CZF|Vd2TNxHKPT4?xHDlpxD$r$$oGK;W3x+)`YSBgyQrL!72Yu)vWss5ZbMHR4F={t<<62DN( zis=oQoedYgJMw4voso&p&$9{w^&j>`il-7o$pvezG<9)8XUh+p4LovkBQj&xsIrpm zYI9L)(zz*|4o2@2E(Gdz&0DMv#syH?kx23$(2nejc2&VQRS`K-aUS-lG2qP@X1)Poj@)Ptwn z1V=;Vn~qs;@^dh=jhjV$P`Z{eiJ86K`G;afAsENBtwq%cmOe$h?APJ7F3UG&oDJ=* z9vd=&gQZ2hOB%Yr&H5FvUsd%Jb@bl4Hr&P9g1ip<+9&HiDR^(vYeH0^E(5WApXSFN z2*d{vrKfC}Uc_7jU8LG}%i>PlDyEzXoEf$l((qw&YCH@#oJ&4c?-v`YoYM34>vt6X zG9fKkVkD`yqz%iKtiPxBb$&oO7B7pVa_(+HQ|$r3-KiXp?~Q@mzE!h>QCwjjIbOvD z0C74@SzU~B!fvY2L>F*O9pWo27EQk8mN}hZ8cpw52g$M3RXVxX`Po0Fn7!;a=Vk`N zf`R?l150zheH+~v_TLLU{IS5Zk+D*BWXu4xTEh#qI?TjzB2O~~V!XXGy9%qtwD-qv zb#aB=IWaKe3-%A9DFSJemG5}L51KBxnZED(ZPFL14xh&MgRF#I*8V2VscZp|)kXQW zJur$NakBSqhssD-Dfm$HDiu9qy519@v2QS6a*?k>TeKTqD+!--nnSr^YwrCeJqPP0 z6ZY2vs6%unJI6-p*oH$comP6q#j* z6@aUXI2jiDd60ngDJX|R=>`Nh(w-NRq+-w7E;PY4`)K5a3b>(yK%kwsYj*mDsg>N8 z6iZ#(3Uf#oJ6bLtm?ALeSsnPURYx|l)zOgoRia1W6%eRRWf7=>CpUciSjbAa47#*# zXe{n=vR~DNqzQWlef{X2<#IHxhDikFk=>KtD#KI8Ji$=OtiC;`d}exHWsIPs4)d)& zYTrlMLFC{KcT+^&8tE}RBDz>BO})9$o09SrT;|SdQkL6Puces>-KTC~Xj#`$(J21$ zitkcFxl5`SQpIyB+~=V5;oq@sa-ZpEUkKU|f0mkwd!VpT_36mRNHDCEN6zS39JGLidFVlNr!!LVFE@N8v3Lt; ztvokDu|Hd@?+hP!`_)%p*je9KVEstkReo?_<_XH-t(!&bn2V4J<$EOrzdS6fYFSUQHYM3N46c;yQ}+XWkM**}dbbyL12CU3Iv6w0 zd$&1-5PwPyaownq1m-tUNS!X9nU2M%5SLXxB`$Dkw*Z-8!py+sE_UH`t~w(a%+Fh` zw2;ESR+Q3xMjO79XZIB7?yKgA#{Cgn-%l`vh$&ZvQ^wpnRsUXUG4w^o+!Oz}v9}Fs z2LAMEpdnbTK$q<16Ytox(yVndfqrB7<-7=AA zw1puj2f`WA?Nz4IuT3t)OtYX8DQ@GI+>j8ZVRd_l#~MeKm&89ALL~8eY1kUJ!nR;Z zY*z~k>Zl-S^byWP5RsTX*wWCzUUVYd&bU4{VyG98L(_YvkjEm4a-n9iF#zp=+a#=e?w z0#j|G9BtO)1MS}w9#PCgViWhL6BdItS@9g^IJ1Key_IG23Pm2AHvF=N6Z>T!5yrA8 zsC+yJCosq0v>eKVGjTY+v@hlE$jGsedWkS@fprc9<%Q10kg6`!Nuf^F@z4d zCEzIghJ9rFjy1`#H2t73{UDa4b5G3XxOGis73^7`Tk+ftQ1euk;jLhCXLmB>MnA{i za$QpvsC(5`Sz00WOOD5&ht?e6>)a)$ma8fP$a|o3qi#4}$=k^do!Bq;+)6ji zT}cwyj^66bv*(!?*Nh*>G=&yg9aCdBD~iv52M7(&kMGEjxp^Re`_j}NZSxd{?uoVp zrBn(XP`BhB&8Y13qui-hC+y>L#JZ~Z83sqS1ZW;}4i~KM{BuwMFBi~W?&anbvlR-<09WAhIO^-jJl{(=z(sIrx9bUF z6U{hbpNgy0Qyi^OF&cV>OyJb8AuhahJj@eFw!~393|I67c0|!HT+gci2g!$wr=e`<#_=ecQv~-hBS)39fy#o^wxviJy2$me)?>`);|S>cYE= z6Ghf1hcZTOZ8`(WtG@Q#RT;SpyeNZtc0RXij zN}Hj94gjXe?(^@Ab=4Mnp*2{m_iJXQh!rNr&3JQs%ye7XIjpNa-R zwn#$kkxp}F+O1qB0T|QvD!#??DJr(j5nom4)q!24=3C30W2ij9v1D-pxU4ssnunI7 zcI}{OR}<5X5^t|*Pe9ey%cP>|Cu$pZe`9GqEC8#h;lM2BN0c1P9iUlNiAjt3QCG|( z!BpY;ieqHEy;;eMPt-RDIv-0#tbzPNBx^`3VV=f zt|ct}RxII!ZJFgDqN4;zL#J)Usif@LElgp{i`P1XcPKC!xZA^=%g09g?@QwN1Y zPO+769H)Phcevnbn#f`F(qsB_J98Pufhg|<8s;M2(XW|!mH^8Iq|N^rO&0}Jb2-B# zF^V6+07M;^`n0A|dN+|PEWV@2PV+I5iY>L!uw*v8<0-C!cwi z4O1uZ_!1+CD4`;?aIt@v+)dsA4o@tupQVm?sr+;tvt9sk_-Rkun@<&b^m0G@gJW@p zWZNtD$Z_ARV*lota$uQVa3Zd+68K@)B}Ldo0o%}1LEHY@2v<4+)qlNpMLOJWLU(?< zXIM?gA>c@L%yn^iu+3u!VA+YT1v=#n0a8shw@^=UUGMPRlae9>x7L02qnxnAO3Z=q zX43erO6bexVziev17bLdJg!O$kfL^2DGHuUn)q2KY}+@Uj(v$j`z$p+^j{`5NYyUP zq&n3cqr>X6!ocrEkiU7k}-*e*PWXQzb z@Ph`|DDFht-vLV^OOL)q;(`z*3igNjcr(IHH4SJq zj(@N>%dwmH=?si-I%eQ=vkwsdbi+$R1wdFUdav@Hp`<1*sc>IyIZaYGVs%R0Cz#|Y zQ*Mp+kJHL}sy7=vCCVBRYV}Lbc>#>0y7E};AU9CNxUyXkam->S<{IaP&lN6^DWW&d zXt!s>M&f#=4sWrD!WB=MlrF^Q6zAJG(yGhA{PGzz`V<8Fe7c^0DrpF6CLGJlt&KDE z6h$q6Dm&%RM)bVPwzS~MF_us}{bpXxUwjhexW->WdH)q(%rCF{zRup=ij~U zPbf#A$4cqCwrm8T#P^7`RBsx^*igiJ%ExyMxH<`TV%pkw%RT~0*}Mp~qk@I+=udAZ z5^q<#+_ck0z#^_+woZ?(R$2l?DrTP1tAFs|W2Wt_+#P@s7b(VfaO^?$Smp|W269`?yUmHnWRIOOBY*%8c1Al%YB{}IX$(^mPa!F+ zKW=l_GP)mJ1aK|n3dxNAX&^VdSjboQ(^Y8(RwWd%5i{q701-9y@sG0Efaax*dYkZX z)5|na1dD80RL>S7r4T{4uPBLnSv&O{Pq~dT>iI15s;eHi2W<1h?vVEi?0+}wlb|FM z0T-7`tR%c!Jn93pD;~U?djk1L4wDy0MS6#T4hmAW>3W-r{pb!~%o0HG0&!VYuTbl- z$ZLAsM1qLK@cYDsMJCpKRsiC48gS|s~gf}wFEI2Ag1{+Ky1PxCdn zVlpa$v2T~fRYx6ru8O?gEi@(q^B5VEh&sf)Q!_69>{BgAM?eu(wF zl~D4190~?z)-D?p!(1T3>hgnG$CM4sj}E4rxUL~cQ^PxX93;|;o$&$}V%qtSy?>u= zj5#6=L%93UGN(*I?%S6ylzseWz=u99(@C9s6Dd`MiH>alGsmaqCjmsn|L7CpVJk-OObW# zT(rYu1!Ui)4sgRrdvR}HWKHk5HHrD-r!jfm6hbVY$Q|Wt` zwHBGrBFL$=*(*`CA7V-Jr$KBKj`d!>t#h=3|#>ZtLc2zWqi3 zj81HvaDvqFx`hC6{JzlOdNo+YBUaAQFV`&rlomal?AQ5`uJO2r>Lu)-k8hDHeFK~dw}}b28Q6o;aL^bCr_WU+&3&pjPK99HVG;oVR1vJ*fn znVaGeo2IZ6qSL$v;H}!%OCxf+(*XG1EQOdNKGoLDaNRBGD`#kBkd6?0i76gqT&-G( z;f;rZF;TXHrlIY8x$LI{0yeH*jpu^2RET}%OA|ay1Wer?$_bT#dX5gKPkwpmE%M_E ze>4(dHW&^e+BQIMZ$(>qvCYDA@Gx$&hu_|Jg^+E1lD)|&k8h6NZz4t?uS1DsMC0_1 zzg!Q_+3h;pJU9beJ!+DQ_RlQNC%jK1pV<1k>Zov^nI)JmB!(&_Z#^3>vDGi~@iFSp zj3tQ+d77!y)$Z2%aK3BM4m`zIj~-}-4~bLVo_S%btCH-5{tZu&s5uRktsh7@!wWQG zT4>}zZ(3o6j=*No{opaPBwhnIuKl$!(UviWR9{qO@eiC;#>j_#VXi0heeJ3v|hOp(sQlTfq_Ja`X1A%t4;5N_{Vg;jYTV+Ltv;{ z2h_gN_bEu_Ltr-wXq)^U7M}a0*AvIsk1Bp6=J*<;F0*MNtA%3VrHZ30@YfDz!tyK? zu$bJJQs;TzKTPlELHC_G28V}Zixy|_Q}*cn2@uc zoiGrcmOg{Xu`U)|Ysn;^QMqMbf23%%{NDXqnms901zlbISPC*De{~8I2|~UqU1cJ= zT+a~x<#}AbU0#=lYfPSvoZTzi_u*0@jox%3w*&HlHj%D_{wl8tsGXa*agREY6K8@9 zk;^7mY3ka+q*0`iL~beVWp1b)Sj%I+k>cH(vYGD+ne^Tm^Tr@2bg8u$#l6#bX^#@> zd)NG1Ixa^r1&@ zszwj9@R6iSY{pI|7vx&S-OJn~!p1$oE2=vRj=se{;qHytP^f&QWuW!h1pT_zXgAiD z&Q9Fv;QMEzxwl3}Yw=}L*^0wY!tMJ~6N?>wlor4E5moE}A23;sUJvpVw;4_6@EQHk z6z{S+Qt{RHc3r7TZ)R4D7ZL&{728)b6v_JTzIoWURagac>ptSS58d7%3WA-WmBOE3 zX7SS4Chyscd<@{%CXaln%)`S&g7y*NUOd|Bp7f+Eyi0O(ZYGwKzu`Es|FcxcOCD!= zsu&Xw`Nia)+Z!a(TQA?EE*Gf5IfG<=e|z~76!T3fI1RPdYkW<~cV@!@et9-h5H@sE zHLHh^fAX-h?WLn`Vzp~qjz*^i%QV56GI;4qxh$40Yk8*;#PUqjb1FKgjl9U-ZRjFD zYCBOWTCgr2@z7)F-QnDcjMza!Tbb>6`9mAhyUXbxTPS|{M}dG>ErB;11%B4mKb-A* zR3rKX+5Flh?|nw(NBZF4m6ZsYG`pQedq3p;j>>y@6u=A=w0R}Y!0FMfx&0a4JMfr| z?=Ib=PJY_v`OCF{Hza~D8TdG=f6d7eW&F*#JyL8zPgN;j??~kk(T4%Iy*xqgUrjsd zzJEvDTk03Dzof`WyFG0p)Nm#({eFVU;}=j=YkRoK{6R?xd#mQ7lwheH^o5e zIej)ltJ2DGX^sxT!8Lsi{T@Ar4YQS7BmCfo?K1u|c@bEOX|;gpKHrbjwZouK;53*cIk=4Yk?Smi^Bp|T@W|$$wq3rW zmeTvA@aMjtKT+O;qQ-3vk*|dtWYQ62UXzVL1Qt8^efur5-3M$9+1L_CA7{WDkTjO4 zLT^MNoK*a%s6R*5byo22tG9dwczP-Z$QdT*_iJ=MP}bBWjb+nyl)q%$o_uq>Qq=8H zS7PFL+p7D<`yd}yy!`gKVYi1pl%wry$BG0lsCT}mMl^_v!%Yxqi-o7A*2FOa0*>RgnPN=AfwMd z2JKxvzh5K>h4h};jR@Rxfa*2iQ5Zhr{pz29Bh255=lB2Nhz&sCJ;%O2Z}>DHUi-;T zakQg%kiGAT92_X$LTmX|zur{3<;C{GR!I3y;TeGOhyOe%X+)V^4xFW$ZI2LwE)#1$ z6&QQ2u6_%8yZ{LiO~B-g8Geca(GDU~5{xa?Sqx~w-l$d$6O64tjW?RI+gc@M^p4%Th z`fVg{{d?c`b7=xbm}$4u_ai{5KX>^2`)vSs`BcP$@AI{PJmN2A07jduw}5MVwHx&P zW90kyGs}S4Fi(>5<-Z;Od3%2tA$=d1URi*Qix&UqnPb2VEm7g?#s4+j>GwLFOG8T_ z&VM^Iz5614Fu_&*I+useB#D1BbkEJ-$5cIel7F8&12eYri@1c8SFA@0i9&C)6NKJo z#gmI=A*yrRRMgck?DRc3V1E-qCA`37_U+6!!vaI%l8fr?sZM`RWtDXTVwg2Uyf?hR zmWO`@eZ6Rp4uymOGw9nDy;&Lufix#~*Tz%_hh7%4XEf@{_>0hI>5a5$6c{MR-Az}o^LjR12N{wU@wE+dedWF zfuE$P^i)-EWHef0Y~DHWK1OPqpvc=*Fmd>F=b{rk?R7eY)Yr2bC1ML#!16j%A67a3 z=D8p42ShX6Ma{&4yHqt>etrkxspH;a>aUbUX6pWZSp(ja2z+`=TxII;s{;qH08#e6 z>A~CoIh31I142a+S8??3AN{wxlc2=|?z@!Z+RJ};`!lBt0)G8rFyJQNnPdO@>EB-i zS^}1^*JS@QR1^UxoO79e^AFX*-*2Xr78o(&WzgdMvXXy43%K3~RjhZof>Z)V|1+L{ zHDx(h0O9&XRVnpiT^*pDAXp!d!4!orC^Rhm_~tptX80&H_8(yhxV+j$TPp(tFIx3y zL4Q7M5Amp~>dlcNn3hL@_q;i(-g0oEzu4cO+e(9{K%zZ@3iukwlcrai2HPjV3n^Fw zNJ?E@ecUQkW1}$u+i0S49e1%iIMDfiZ-RiofuE<$kMZZv2QLY!YtnF<6ZWJv_#)rr zx&cw1wQL1ggGYbb-*?(rf&J6x8;0N$JUTR0%cEbC;?eB~7%=VPgwo#ct0f^D(3>I@ zbiFy`wn2#Ib6CIfQ!xPp6-fo#b$Fatno7E6A9XnY`&oq<$Z?>W9`g2`>Td z$W`;?A9-7M`0e&uh46^~{4Rj&;UhysXu)@;&B1MmBtBUa!Hc=%G+u~}TR3~-ES&Q( z2vIK=d+CDrzl8lC=2X54_#cxI$^P#yt@c5}M^Z@4l*UkoW+FO!oQUzB%>$8nKa0#a zha~m0PXpZE8Dso>4W4nlO)Z+_P_(@sQlmt|VFLI@Z*9 zrd7rEO#Ugf-Q;rn$BT}_p+FkpW6YwIm3_A;ok)qtH;1sNG^CaWI~LHH>hZ8LqBCTmpbp3U~} z9N^lMAee0;`zviHWLNE?kvDI05ROsm3)uB3kLJ=nlYDTG{+=_VA9VcM4eeU@O$`Tf zkHc#?&zxlSp5HBGf&YtZ1Eob3kkjxy>8ki+AsH{vG&D+u;4{?|5;*{}5kMVPV6;-M z4F?q1BB(q)a3p`QI2z%vs&ya+m2mrV^R4cs7Rb`RrpyECsozw5 zk$Z%j$W`}SHwb4m?w{4R|LND4u8_z9Ii=*@@E?jC6Gd9FZCH_g8iz-JLPBVPAXaNj z;Pb^W8^v3lsgG$HOYxuG(4JYj6XVh{%qfjeqw`FEfb`$um+S6}lc_NLHyl4N^=sPu zGvP>3pXLk4p_Vhd?f)ezfz!F}0{Ma-n-2fqu6On_A7p@h;YrEM`9JeT*lFthE^+0T z4Ho~F|K^?pW}=o+=>E4i&psF}J>dFWT*OWPy4YtQ%##F2z3tC$a{pOD8*S(E(DxaX!k>;C^jf1i8he+#ZZJ?T8a|Fp!}Y<8yS2>AbRu2hcsDDdXj{tHM( z7LEZx*HG-X9$aj;UR&(foK+0ynw3>mZEbBWEJpo1xbp-?0&vu*8V&F>^i^XfMj~9dK)?og$p6lW>x9p?b zR!0~Bz;si{ZHZXOWli~Tj1#>!%IWEP1?YE+u27`Vevp2l6s64JkDl2=)n7K+jxsgc zT_~{375q(JL1F!RnlJ4K^?=~u;9_57mr>V-Fqo@1kd_^EN&e{DLGKj#UjVUR_hQ3st+j{A^tK*rjOZg>Gf*Ei$ zM9&tt-z4feYXJ3VF(6n41iatUf)E{xhr9hp@f^g__*T&n=skEk-7}U42R{JBCwWoQ z_@!i2Sbu?TRX^A;t-r_+7ATH9xaxa+K&Wna_g0djuPO0ce{_~Y8kJd3Dg_{2eg1Uh zp%hu-z5crwkq5&e!|VlD^E5yteD-6vD;b~R=vLXWqb5`DQBVpvq~CJ{9#+53?W+0S z3VE+cnZJPZ^ecyv1nlMnbAl_Nz9sc2KJ_!uPQndn)J)7-9!vg=3JJx_GYYA!x>dJR zlcDvd)}v7(k3g)RzwtE8L}yM^fhZ3cm7>h%-}0weSx3(W&+RW7>uVLi*iI8?+?-MP z0tI<9yu0En1-^Ivvtd*`F^uSri`mj}Ui)>(u>@`CMdoOVqDXO02KhA3`<|uV_P3=- zZU&fLZBe)9yQll6zWU|xH%Mq+lN@^i>$8FJoQvUL-Ip)*eOkr6LuiJFshX$f+}poC zHxB`NT*XR8a;yE6=79R2@Lw70v`v3O?0N=y1`J$lNqTsyLQUec_hhJ{Mf=SAMwuvg z-hV1LQ5FrMMpDInjw~W=`i-7VY_%H;Uhmu<>>LdlqYu$GKwhDu>0~W7S>D;2sN0a! z;P)t*{A`gX@#FGLr$C<=LNcBkaa8;Q9+eUG{XJCgIaAm>JGs~fEsrU0SYU?+!Fto% z>&;E^_pZa6@OlXXanrOvxv8Bs_YtrJpZW~C&h!E%Pie(?Yi%bEnxZpS`R$lcVM-s{ zk~SQ91CNh`@t^3Tl}GaRX=YZ@xYPvO&qf@LWvJvIlZi9#t!dZf(Xkkmiuhnc#MvF{A7$bRUcZ;-Xn^EQkoRcPH%nXq8)7 zYHRR3U^GOf)Ou`}HmxEMsE1=wMiTKJtqky;F2=b9_opcD=4{M7UaN_vx~o3-QK!Rh zI3%v1&+u?y-Kf1c#nc)cPkWvmSy-hKV2+ z!-mq|7Tx4ckpG9Tua1i{Yv12xK?GC~2?Z$ykuCvg6cLdY=~4mdt|4b<=~fVs?rxAS zrMpwQn_=jl-x=3Y-uL@{e*f)``aI`3=Z@>X?l@f*a2$szJB!-_OEH#R3%;{Scs)#} z$Du>tg0eA=T|cN*4F)hQcyPNlS&pRiIMYKo)|_gt>+BehgjAcucXL?79G5gki6X_ zsJinPf)DT4rd=ZP4DZ0kdIU+q)=Y8+8l@^wPl-lF3g!x!92CzMNwMKtKqgJVJvXl8 zb%zh?FcxKJd?l|yon{Ixr_b@dfe$!)>KF6%Ee1KS*$sS=Gd+mYT7aH5TxcVD_?YKG zf$KT>H2!@rd`UtAb5_&U0e-r@s9$JAR2WF~f^N*SOT!=kfKA{wVtTA{#o?eT!BsTf ztRUy>+7u`Io1x<&*`N8{33%dIH@2|D4`?D<~ z=Sr&OhLVuOs;P}DuY#Jt(5VRebo3zSRO;|bO6>Ru2^nGYc!NVj#7j2Pwbm)5K1eOq zYCW~1*6Et*VWHJKVZR4w$iIe_is#Dc|9&+JswenjppG{Fyk4a~ihDguwSRGuFe8)Y z+z(s8e&d=BviYz9A9^MwiM>c>xJjb)=G-fAc2}pereID=fyq2I4DdE|E~_0nc)-04 zzQnSP{w-0ZC^uyy`0R3z4NRG#z-oSJdl9*-^LDX)D7OgdxNe&XK8u%7Bd{=pE*=Pk)Ko=K?aS~8AMhs| zJU*P@NCfkt#;#^aD+~@3L9;#o!oJ}Fy1yOOQMBVpEbnSe`K70E>NyahdOsTq|?>!#zSX1DqE~KgjMTl1Z&&r!ceWN(r8W9gN=z2rj73<0*$Gu^F5H{Qo`WM%9>g7>60f%%g{4J zlp0FgS%v=CfHY zxgzXpiiJ@kNjLjc~epUSbwZ6tuj}o}kmF5yaaIcqOW903_iJq>0>0 zlZ_`vF`hg2yTd;y&eoe^4ZzKNgUhu@0QEyQS7A*BJ?`cue(D2FSHGBRUnpS&Zi6#N zwSsXVJG8N}Ww)Dxyj#S=^fs^k>x{fSR^HSDwAl>=(1VPj`f{U_Xvftr{&J_+DTuoH z4D@c>b^Fv`5BY3}YGd+g!%nx^n5<$0JwuN=qs!O@k@f!+7!8CEFoZ{&*u$q3UkD!! zikxZf(CVB@H%}HD1QX~0<6p~BOCezIrIbB#SNer&BrR=@8-wXsQ7+>2rK4hJE=j5B z7+LK>Al#eVWLOC|*zJoo%v}lz z@Z`G*o%4J+NeF(W{igMi3Y{~w`A$u}iA8PVwt9uNUC7_;0-c}v(m&9u7CqBn(U5744Mlra2CMCw<*L>K9rYP z>);)0C5PL@3cF)}V}1CaR-Uo*6xXj`m)v<`E#|tGvpqO4ASPz5%hMqt-FUi0A##oC zycPSYQixz*h{S|2b?wwn8n4IkE-9(@18!@bj*4!5dgqrGb!P9aBrCU>49vj zwKChkhC|*3*pVh)rTdrd2(H{=6M3(SmZKUCAGLXee0#D^o$#y-6mbHu4pW1Lo3q^K z^UmT_)4Zm&IN|xo`irJMj(mygNYV(gpnS2GxTvTCe#xhwLnl5s9et$7kL~X2f!ybu zdSTLC?dCT1Pkq<7mo+pI(cg#+`!LrIwpeH>8a<+Ns1VN)0#gUg?0T&Uie6+Y!nY%7 zJDWzjc(th94yNm_BYG^tgPWwny#+$2JuRF&a`kbzqMGOj=b0WD%Sb6dIXY%@(+F4f zn>4J(5nj#ez{@6UIAxNPE>&SKYlE8d+~L+X!b&*9Dv zg;|RDKer&E3G?MCn-0tH_3M}9NR*l!!{Ek-&I_LMxgGzG9S`+*VFM5RYNQa&)X~WW zK2pGRs+yaey~}5g*I_DD@Yuopao<3BS4O3&xPZeN(eq$o0a|C11x^HY{Sa;2t<7-< zDgDPNG*vZyYP1v|BRj>$hjc+Q|&6IiQmzDxPY^%S-RvVsM#QPm#?U7Q#dN#7I|= zdXXA#`TT4RO=m19P*;(gE-ENqrf$EygvqvrS|X@?Mb0zvy`iU_A|4~vC*O-`DeeYA zyT|U=(+eLY%C|#ri&WRVs+}%zb|_zWI1DSou}dfLIUP;si;LsD?{Zot^3nFg6}iYx z+=5 z!)v)dBG>-(c2^Khp8d`E0|yUw{k6^{u13t^zU1d5HQL1J+=}{BpzKl)O)k;YAe#sR zMFU7j^fW>3St=9IO22Yet(^$m6sOC>nTF);KdIGG(4_ z?|qufx9?4KJ=LT8DD|o(g&M6P6Tnfm3t@c!9X5+n^J1VHWQBJe;P~;!%fa4EtaXpS zn2fNJ79MW&2~{soT6Br$(BoOpCehId*Q~XAi7FD}ySXk?)lc$4?g^3?CAIpCYStrz z;1`cKCMuW)XdD1GcUiHRBL7a$%kA&lIPE{8<6u{q&0_4jzkhu;qOSdU|3FGMt6Xzp zR>nD#gue5^pvUTfK}7PZ^p^@i60zG1$0W5_x6zS$v1;*?UKSoyBq=3n;{6LE{sGg( z)8s?+Zy!<}i{2J7w`D!$c)vIHBV^?~XmEF10EP^?;(7;5mKQ;tXTAN^JvfZxmCUV& zfnO&bkQ~e!rAd#%NDGG@h)SQWC^V7<=d6`#=#cZ1}_GgKezFiB47bmSY3D=C1fF8#)= z=%gLol`-{hGu12uT37qFUVJ%~#Z7%ND_g(|kL@;8eI$H02^1t0#B}kNx=xmiY11Te z^eR?6uBO_(?Mq5cFVEtvV{PKWvl93O(yGc2K5PG6ZSHfh*z7yT6ql~zrOp*iUt1%H z2<<+-88PlQ&%(Q0N$z~Oi3j@r+wG_r>5ihJLPa)@Pn|D_wvYq&!}_((sVzOeLXkUp z1yJP0{ce3kLtuUd>lZVP6X=EiIKKWlWb63&?NC-kJLS@cZw8(=-INLkkNs|by&o*3 z6ku$v)B5OOW-M1$Rgjj29YxVi?Gcnf6gEbYcfp?NNo8L?Dz|exX zOIk~vv82N}YAOeh*($dudb3q}idy<6{+P?63Krr>tr%L!a$zV{D?jVUp}9EkM3cL% zRUoLT4o)~i!&DIOJj@jJzClrcWTpG^`*SIkIB&W_x%aPhrU^*c)a{F;Tt+Z3N?Ozq z)Kh<-4CTYkVZ+={5(F_0&k?hzSZC+al!x*>$&=9hxKR(nuDVBTa;74Pg)d7ErIFl? z&jL;8b;df?ixkc>(+xaaPuGfXO8X|OR&F#Eyq!-=DzldH?DR}($oLr~x5k3?O&2MWs9U>E6om)<8AG|gBa!Qtg9CX3IWyn@JG`c!CI7n$V^kucUp~uZ_ z`R1|qoO1^1TIe0I}>+}x36R)e)7|BD?GmK6(iy7N}Epe<8#Vp_7PrTP( z%Bc{y7%;{br&pr+SLo!Q1EJGz96{9+p~JB;l8me@T&pJcmx5l`DPq>mb9L$%8f#K1 z7H?%_3YE`&3rX#0D62icKd(@m*lUe<6&2aWNr!*x>A0y<%Fx0Akr$4eh~qa?=7R(o z?RtTsGE172av=KQ2b9FU;KX?QPMf7}yq58ID_@u%cYA78+TMr&w|`jGTKWC7b06fu zx{mMiDqL0u42wMir83bnT$yW>w#ri6N+I@Z>+21}xnt7?HMFrkFH*t6hq6b! z@?FoJbKgVZ0lj$1*D!)b__!PC<903gR$ZU3jFic#J*D^*+UQ>XvSVw~x&56jB-zT@ zuUO)S$k}W2X_1{3#frdlTMVevOGKI4XUK6Aaaruhs%quWx~&XNSXTRH)a4jMG{F($ z7At?9Be7oj-dCE{t=C2=|T=8e8+foIX&H=xQDnT(|q_2_Zoyy*fk%bAzI459LLM!;dK{Tc6E>B9!^>o^9n+|<|Zg3Bj* zT+YTo$a$-|?0wgFP<2KsdsM@A^)8_gZ-$PWV@qOiB$BUGdYt*$=jt2?fv)TO?%l{2 zg5@jqHe&e;bxPxOxaIUG{?YuWja95#jyfbiE%$)_za%o><}YUxPz zvqpE5Tzh#2#b+Y_Djlo=v;CBJy#WL9AB9(HgyoQ@i{{0atpLerdrvLxEQ7F0vzcYZ z7Q_9@^=qVB5bejvYOA*|LLLq9sD-8QwE!+6w9)e>$ZIWjWj-InB~>kT(N`_DcQtn! z15tHvs?>5(^Ej89u?W5|wiRBWeus(&$bztDtC+g%45@g4*(KDVzUPxr_!1_8%9Ti= z(=p3q{aaCrGHLCsYL$Yf->XwIIGPq>j!u6$hm1!+S;KgePA)NPqQzL>zZl(Ol@1rq z+e=oov&*YeRZ)ppKf;1q!;Y3MpM~6IpH14W7blG&JvrEP-N9g}tvOC3r=?7>G?5Vp zX{+e$t%LQE^bJJwf_L>@JQCKnXLC;;Rc-X+w1w_-?LKv=e@x}NvFi6y5CXKcWue_S z!YeJW-{z^M4mwlINejqKF?SlG-^LBIh=!ei%z>AcRBKhjuKO0g@%n-C2|-Ew#XfwR zR}+PW~DOb<>p>5j%V0{{`KzF=`{(25BlnG z;!n%uJXNOID;6ZNy`Aj9v@teTbLUGui{M^J`Z4{`B z$M^&79)QJotUi;ZXLLAh`C7%H(~j4y1ltijzj9q0>n0`YUtt64YhNXWq}&`Q@%aRUq!8#VgJ(-wOSsHU~zBrhHm7@{23z zyi?=k1qSy!pg`fz9B6BmsM3@Gwc91hyBhP7nsvI?t)W>_OZli4Xmq-r7MS2f;r?{Y!bsoJ36Iu3~PhIX^Y)wzcM}F?VvI9ns;Yn(7R4@g% z46YXYQ64C%Xp!u!DcD{^htk9hpfvoRw^I7$W7ec*O*UuPZxFvx8!Q(maP^ZqwJ_|w zGFpe2waWCV5ARSBEkDLz^_;uT4eg=2i{-o4n4neD%u?`2iGKpDY~Yccm-W z{HhgvB7S0mURsz-S`1I7KkI*wAyQX=BZ_pJ%}1`q&K4t2+AQ^pl0=n5Z``QRblwc3 zfsY5@UGtCcB1PpQcA1Q3$%=|( z^aKnFeLZo6PE53ZDxiQ~tIi45?c8Gv7X^h7swGY`g;^$rPW%q6NMr26Vx`U9lCNth z_UB|jTHQ28Ha&4YKiZZ*LjNMF$v?sqkg@v0-N}EsIJI{s%Wc+3a{~}gk z@7C|r3SX8wP$v8r3=r`i4mG zt*f&)V*YtLOWxg|FcJ^}g!tB6uQ4t~f~Y+kyJZLhUr1MW{`Gj|hKLsc`H>wS?qXS1 znI}y7<$JvnA{v=rL+Cne#&&aPDQ#PI=e~V6rK4=bfi&!+0;#<_Jsv{N#@4$A#s?b) z4O90lYB*Ncn4U)Sm|5#m%cIeaI&ervi=X~$Y+9~nf=Yhe>@;$ps$OGi&x@dpF~eiN zc|>#hiUQp=J+6}iJtNs$_?$Zi1+Lwt>OPA4o0ZqQK69ip@V~7;PLv3_7Iv7NXKn#8 zZr_`*O&%R*Zd9_(tKBJ@*waZs1F0oYIcXRaS9Hlfq4HY9czY{-EPLzY=}DL;`|GzJ zXxh4o?@JoU>b%j}N!j&hQjT?lUDFz?km3n}0ZUJu~Ii84#whcs{hS>4vPRv&cw z99;wV(ElsoRCU7bxz*iZpKVdfcp>`g*@rMCiMfy+1Or?UrBSu5f6Fnm$=TlZjtQz>eqYr|e$}Z+^(aV-^^2hMtAG60yT2tXa%3 zVkVX4Qn6S81KlR~tD~U4Ta#~VqC^0NjBGeiY>%c>n`fjylZe@>=CL z8r@OAGg%_gv{2a4=ch%GH;0|&x+95ttGL3t;?D?PlzJVAeUb3fIke#2 zr9+iOZ?DR^9%U2@lW5FnOkXGf+T5loPuUeEAs=qR3U#}28oX}YaCE~ErXP&N<=R5T zjU+3kZ{$GamBQ+v))OGP^57P}7d{o?bK3kxw!HTBLDPU!5ZK*-L&nVlDQXj;E3_*j4su=Xh!z9b9=4rYX9-4k#cG( zjP;RahbH%|Ec?hO<`J~*OPi>!kjJ2)CGy(o$@&92Uu=;MJyRJR*Q|XMca6z9MN=M~lnx-2fiLFJD{%%ybNX!uBO{;O7FO*gh3x^d@|X)wo^R)s8d-NXmi zA0KugBmUnX29A~sX1Bgm)%7%`bneOSgNY!$CVytC5$UMUnH;hvCH9kE?9gv>Uz+^2 zw^F&muvX%1e|0#DuQGOJM9a^DH~?ST&tJy;r!_&DQo38Jb#7v9Yv#UwTmX(ffNHRS zJYX4}7lR$S)p&#yYb~|iF*C8tLSH)Pt?n;I#eQT`Ak;*Gc|Y~^cC^QGM9s&G_(*v9 z+V_87CfbHMY%%(}s8SPK7tyMHyG*@a(L>Xg9pb zd!V1|PH5***n{NpxMks0k?O?j@7ZivPd+A4D*EvC|>p(mn1CO67KYT+F`f z(T5LEw166=ftoL-BZ0StA6+BoDL36D&7MVNtXnAKU*)X58sUO_dcJK5ip}hx%Aes5 z%@>?9T1J0V?o(C&-dN42*tfcqo7f-hWrTPYKrZ1`V<-B0sMBn5y{4XEaO zr=$|@RP+g)k2g4<@rd(WlDWppg*m*Zhg*~FoGpH1D}aBf-@DT^xsw|(C`FL0!>a`yr>#(2HFjR^`$M5oHse8kudwyJS&`|jA$u=!#u z818@~s#+0YA~NeZ=3=M)r~*h^5&K%qM;762IXQ+c9=uy@b&qXVdM}X04peXK!wzBF zNV2Ys!>KCFtF*LYHc)r=ca}IqRq?>M9s~0PCFuoB=-=tGL))mneQDhY&Q&>DT z8YC8AVpeupc{S=0%Z&M8C=D>kc)DT8!4WUg zA(InT=3;GlC}T)r)F&1$p?+-+Z8Zlg|E_meufqt4zw~}qoD?jq(?hC&vSR#nhpT-?KEC4zn zrop*s(j1V<;WXGPt&981k0gUv3U)`uTvDiq6<-0nqdT%Cg!mrkTDV-|T6kJg(>7m2 zkxl$b@D2qkODCF!p)AytT`4Bg<|C;Ay1x8{S_pLNG}UVeR&=z4`sq3dZ7WNC~Plo99z zZ02tT*p6djqqO98{NKd*Sr)P;Z=bDZVIx6ec-bujU+_r2`mn`32*^7!^CUApK2R}T z*5Ex42p~QS7%0C-VE(KlxVoU0a8%c|s3x&>$@mU_61B0BDl$drB94aB=Z{IXgVNH{ zqR8q{U7iWbSW!{YCUz^$vAVEh-cH|qm;LE`a8E9y3k}LiGAWWCwi8nTOZWza!&%h` z_V+Iu;~28u{4}@bSZB(g#xp}7Us7>3oV&s8f!_H z!>Yr^iWm#*Fmt2*mqkrOpW1Hu^IXTL&sNv3FdObPdEdDGR?I&<|0~*pRO37pY#k41 zL&tF_WdXuEPHzfsGEt2ny1Ow}RVP*W2o=@A)(8xhAo3Kq)ZCMAKQesN8OH z`_h{dnwSMgKO=ZRX%}l(O~s#RAX7vn5BZRqrh4g^UgvzxR7{@_5`g<+^9tWJ=#I%9 z6{Pzi%c-RD5P2sXq4)Hb^WTY;6d>Cxx^j))ZaXcyU;n-sn?0lM52C1=D-k;7^cT?E zPAGRf=VG&g+gJ<`O4HOMA`V z(?S1rKwq0MZ&2_PLJ<*As(5g-_uX{a_}Wn;Z4~QY}t>-aL^m zd`@4u8M!>YQ%V2hZ_jLEse zzVz|F&COg`Wl-mavEuj5GvEH2z9>TXa>Jrf+rJy}#~&y${@0!j(e(}wla!sW^UmSv zR0>5!M`xQ@KL0_JiQhCVnR}w3iNz8tDkkQdqp3|XU0>%g=_NhOW9mdZ00E-V_9*VB z3jG25U!T)BRxE=UL9RnvCJ%*0|8?HB>IvNQsgnYeg|~3@9u^oc_P;3mv-K3w-!ZPc zoHxRGr@1e=MR&Y(L%EJj*u_v&U^h$J`j*E}Yb$Stu|LE^J%6c2D}e{AUxXRDlrKUK zTEH`9{-z43ln@hpv}fqEdw9KVcQ<(8l(Nm4BA@P%UN**$K5jyJK>LauIJ(yfc^bR~ zpw0RND^kQ_Yh!e0Wq2ZZamo(AxkdP7mNj^OR)R9{;NXC@g^%iucv03fUZi%+vL*Pp zKhzoG4=iJuCFF87I3<>Bym^4gsefId>nZ*M$GPm{1OPNB@e8=iCwS$?T>|$I4JQ%H zH^>n<_FizDkh4AG@NuZNvsr$<`|j;69D)oZ*ohPLUiKYYEh5{^Vq<&}Frrw{C$0ZM(ikW1guDMY9W{Gq2#Rsi7EMT`Y*m zx?{~DVu}=~VLXrBE9qEHhKl&Rx9Ee`RWqrfT(r6<(_Jfi0(%!1{HG*h%;M~XZQ1dv zevgnAaRylsn0(#hfzag|&q~mI(8a=nnDO$S*Me(mSmNfJPJdj5d)q8``hm_@;+SBs zUs8?|x=k)qmtQi6nWdVLo6B-BYoikoq2pF!{G3nsEnUXyhKrT?(AGxS<4_4Bag&mJfAAdQhfv8jit}AHT7vx)U*Yp~iC2)-$3ZDa+ ztQpn#p_o6m;{^Z<<=4>C4wlfG`!&Mi)XCI!ZgpY_DvYqrpCMoB+B%v)S&+QdUAGa3 zI@y=By}ciHMLz16d%OC!+9^JRdEzZKqpCn-`0XlvYKTPk5*sA=OFdqykd^l*XIAj> zSWG#kcCk8LeD1qHpLIu(?WC6X*IU67uKfBRu!PL7$-zQ*4s)kJ4{Sg`AFM3kk0D3c zpv)kxf@mNWLODTDk!}l*gV(zc+bq9aOD%3EF?>-Ps9ND-HG!CPW)$d?)pLMXVkdv7 zchA*`58^WDu}|{ujxD-}u>EBnHPsUe?6O!X1^`0)^&`Q2v-_7iWdjhvM7o zc{TiQr)9#KD+xrSC%`IvrNdlXuhN;DY=^GL)VsIGrw|&H8xQqAwDtdoFx{zbE6({M zb+p)Eny#m!HyW7H+TISVn&JBl3#vsBw*p_aq=FqG>X~{d3 zg)Gi_tBJ|jCNp%oC;pb}=|ROH!xTDXBly3^9rm>$Sdb*x!j(~luTE$T-*tQVXxn>A zg?Rdz%ju{fu;8HAcWvFKcIat#F3ApLl2~Awe1w(Fo|MiP+1n8Od_IyZc8f`JfATwQh}qS%zURtKFKDpj@7)@YSD9Q=f_o` zpCl6!YZIk~31m5>DF$e#*4aelXSq{IDu{yEUeNfnbGX;utL-Yl^6x`KX|G@~c(xAGO zq^hHX%f5gAzVk7IS&GqeK59*M|IPVHV61x6Olm|~%Qts#E-vjt7pwP$zhKzwDsY0v z@o(pUZ7?-BK^B%=tHa548=Hd!{mgp=@3Pi)q|E`69a&4&w` z<0IeDiq`$7lB_z2k)tQ*SpcQ%dGW5Bzcy7Zfy}R7U85&VP2n)?VK0b>nUtBc8VB

dU%?aSmZQ!VwfCl`u=gGXu?+MZ?5=xa4>ZeV5T~XEiTQPvA*|#mFj#F zJ{=uu3VqZCpj=aKS@pWa^foTaw!HQb1)cCr_k#0i-!{4DttdH+1KD`4rFDV4Rt=o@ z{8yM5X>3jlC6qBLDvI^wBCPgfCEu@)w|9A+C3 z>ls3fp@N~Oii*2*&sTEQNmZ-fJ1P;Fz9^ll?9IA@jZYc0tOMaI<^U;iu9rU_48(FW%l8=vn004~iMUFMi(>7dd`L2d=$_sS}{;1Rp&bTz1MxCnvXw zty}PCV%I$xyv=KFYbC(&WRJ_ByE)Cf^z4OPH04F#h}%MnY;A9uMf_)ILyT`EqI`u(7yB?XSmadR0Q*i6TwZ?Ur$)U`0L6ZlM_|bMgk}jYFfzk8}%pY_TL*n za}+t)7$XIke~!EXLNoSmws-cvg&=&*J&Y;BmfPb1EtF9JUCW0KnD<`V)%)8E13gRh zV`ci^^DU-t^YS1&$m+~g<4`dWBNm`a!q=_1dE&b4E<)IVD`&YN?jRwqOD5d21pZ=r zMZY0UVhS=bgw6F{IuKNJ+H(i|e_uyqxigqKTC!f^LhB4;PM3|fg{jp10OVm0*^L)` zUP@;V@BxZr;5E1F+?tY9GN{zA;6;ToR*%&dXF4N`5dh=s^TZ7)3$%8=qW<^X5)Oc0 z9-N9H{{>n=f6>*ANoQ)_3hjpqp4gT>OmA;sN5|S2bz@HnA1umT+ zL>bjX%+1ZsLi6+Hl$9A@Lv!|^$Dc_fcSA{qAa)%1v8q|crP{8@ZB6O zW1IHGo^Kv~PeUIO^$4g0!Tnsw3}ePk82LzEhTli?(d`!#5kypacFbBu)S$}cQV5r@ zgj)Q>C-UC|cwlE&H^$?EyS{mUr$z_jmPZtcI*)aX`w~meP43Oj#aa>si4QRIqByvl zgSwzr3z-Ayx-H$4k)3Ll=Z)>e{#?FvSJCpTj0K**)=AF$^9P_XcdsruHo1e2q1!yB zFK&EF{XuzViuO)la7B5_ROAX<9E zfbb^lEWbd5Gw^(4W$GSJY%tm*Xlt@+WMkqEDg@qn$j;c3O?g+uiZgh@nlO;&TFp+SR*ALIA|2g*^agi>-B>WKPm%hqfXbNa>gw}As4FP8{)U~~L{~L}Etb#5 zNPZsFy4iaO7a+)8?q1}9`bH>IYt8C5S!>{>tcit$$>zli6@R&vz>9u3G3xZ{CAn#T z{(v%r)Rr4Z2tx~to=thseHJ}F@vliC1{bTCntQwD<+Ak8{e=zd#?6tfU7QAuy4`Ww zCCe-trR@DIMZbeBty|mVN+V}qE+sS*USP-=MEem{JbHV&uLzMRGpa#hX8{;MzWSs& z*FM_Um6lzrS>w#dXz;r3%QvDEJ+jBuCcyGowXm}tKk^Ok&q!df8aU3VI?O+Q#59SIOqle;Zk?+5L&AVsZZ@3!_y^7!S6%vkOFCU;&V$mktd zc77CzZgap|XQq;4cUG8GmbK;;bRHGd#?^z`xPPI-zk&kmz>P6$KlH=i-=Aa?cutS{ z2+>6x>1h7Uosc!X=eYR%IE!D(u1=J{Kh}sFX%7YSaGFcF^0UHb$#jw~L^y;l}` z*rxwVDK=$Xj76t3BdgiA;#&%nB8yJtwspGWFAi@87jx%SM?r=CMfzoTECNf5u_)=a z&trkEaQ@&(R{D}@9!TGg(D0qCI$Yv$@Qsjrv!9j9y}yYBhDRJAf_Ch@UuEY1Q+z)h zrdmWtMQ6Vy3qbWab2G3z4|7*g9D*=D3<$HfFl-jgH`*^Y2xo&49#(?@neZ^;q(}x9wrZI{OJApl4PS zL~b@5{JQy;`Y(VN?@;5SQ%$JdIlypa6MXDk%I8dU69se<^e}ikW0i_(i?&u)`g9SU z#cX;M%GG29s?~=0!C;l72VF_fIOI=-XdpwQ!Q4)H& z*eow2b}vG_9JLbWO1pLCIc@*x$;On=hV2W!P4E}^=!cV`9-e&5;?g`eR3zPT7RT?( zFB`W9lS|bx*a3k4Ybs{=5`^u@X1TiwAT3Q}$kctyCqVYRn}O|NJJOER(FEZ@+&~2S z%FKj0;Fw;Y5lQ~;jukb-1uduIaP1mvp(7z>q1OE~NmK}}+Y%HMInvq6(pa-j8L+ez zKC#4x*ulxsDz0{kB~4uZ3IF{F)Lx)B;eR2yIn0y2u2XxwQ^xMsPf=fJsgJ=s{bjA4 z>~-&$H$GJ$e8NfvOP@BZ`l_bQ{@!gNCq3={8q+v`l1~3GM_+$QhP)s+&8A}FNU${Y zMzP{9oa0Y9A8f#r{$4`;2r}9x2HM2B)@Ofi9M;yc9;n08Cn6NKPT<428aY}u%npt^ z%(DRFYj3dR|BCJF*eq`w4dPrAJ!)2el-Byud~o~2 zc_5I<|7ImEM^8yf6Djie05~!>Nhp6NC9KJRNdi7~Jaxbr8^{n!-*|-3%`$iw@Qe9M z1X{#s`z{4-xl!`oxFC7VDmV(Ad9yK9)AAZ+yF|OONZ2ZAK%qnQxI*>z91|kY!j%`q z5Y>VhtHYQb;jGMZ%XbcpOWdzr>FF)H6>wyfJ&J-r+iff0i+LJJ!GMBpUkKMgC8lkLg6_n#F>0tF?3^0FGBL zR{TrBqMq4w3+R@h#>d|w6hW&fHQW=M;Twt^xbsRBQ*b?7<{`eYdK_#pow(O9KRBq6`!)m!@cCF)?V&qZkQ8$Id(8(t0sjyZ)bGu=}k(0TiV(aI}O$aw|m!7U*`Mu)ZEo! zZ*`!GkvYy~E%NAG8ZhQq;Qy0G~Dg{9xG_axTSU|>aw+~)6JZQqUbZ| zU>D~nO)Vk^ib`Ay#Rk!HQpmHRqfn9aXo&u4P}ZH1aqJKh<-3m|4?&WIOy~T2neOR9 ztc6I^uGG~W?UD^bxN^6~>M#M53UgkJhaQ?E&baxfempm4pV#l<3ZRz-MFAD+K5sH{ zK3H_TO;G_ok9K%g=jJMPfsGi}6M?6PSd^FpRhz%i)X>;s`LRWdL?Ay>g6MY0@rAoW zwfF{Fzraa#oaioAf{~nQvXMl*ljWRCU9rS=cE{&a{ea*>MI4B=Agw~(maWkW6Ng7U zagGh98>4+3jyoQ_an6=TFmPdFOU`y1UeTn%RxU0mV1N`EkjLWt5{&4{v3lBtZ zciw7kZ&g|s4ZA~8(PBMQel;0e?U$OYhuX5upQcb33$B(;7|>Jk1WV%n!L)BE zX!GEpx->so6j37NJYO<$(7d&9uyoJ;WtWhJV=nM3b9ng5xj8{$MLYIpt>}DL!uD70 z-y-+7C@Ut)Hku>9J0xXhGLRl?Gq%}gF2jK#OF1=$o-IT9o9U*@J9i%2pFIQJh{=Uu zrsim|12jCb=?5*#i(@P2*W$KHDnb^2(I65SN-tNl8oLI89BuanvEcNZ;eZ}Of)P!j z`~4Q7>1BWZbrNCw!L0425XcAyG)M$Js|k3~!Cn_{Kj5}&T zUMv^Bxrk8>3D{iAPS-(%46kByoE}j4fZVLKdDYy|f*Z)N++#8SG08v_fpz8jU4ptJ z-{8i0WKUi88q_(MLf~dJ<@bIoDJAR&^OPJessXn@PE3_kk^L1i;(V}j6YwF=)IVEg zCa0#-MMY~Q0q(m(&Vq#k>#or^u}aR~*@f^aDn9F+c75-8h<|L_w}cVr9*B69<9a+!_BA2hnG*r<4KBSxicn#KU(waH+YP zm{?2GUk}^Gx?r(d(kB@w=veP?wJKf2PiXZX!hBMpxM#a#VEQo zPD}USAGjZ&xRW3{kpX>?0Sn}o$cG8~VEns}Un>!=mPLyklh@q>@vx6VvKQzaXv>{P z_$(j_3=Iu4vJfOT?3wx}GL>bTT&Fi4^x!x4>9+Wf*|q7yM=J!}c156B^OcejEfirB z+I3Vn8@%uXPdZ%g7cSuFq%_z{{bLfc7#r_;;OQUp5gsvsZ#gVdz%cFp0X6r^`1MRP zHxs{KTdnnJ-B8BY;2Q!gc_z|$OCiz8PMG~l8K~^|VV-kA(iLv!;m#CGn>XT%wCF25 zMOlDN%}5>NQT`#D@>nP`Sd!++&NoZ-*B@L&tJ#kKE}s{hU#JbgNQiVBINsMEa=2*C zxp9XR{Ji*ueKrvPvqYeeZQX#a(V)5@NR@4rD^ERqas0&U8_eB1sbpWX>qCmOTzXj< zl#AosUiIYq>4?8-f0754wt)K;r70>4=$3&95p-JzSr=q+HqyCpX9WwZn}^%(OyjXt zeYqxUw#(7>N62EB3ftq->T1Z^;40*xf>d{J%s5l5#z zZiSkY>t*$rPV^)1PQEP;smMr~59m&m_Yo@@hFwhXL$)nbn1VN?%_$D6wEc}w%NSz4 z6(kci)IHewE8q}8W4&u~%1V-WF?Y3Yy-=}tT1{1%2fRQ1VZNM#vY_Cv$n06OhCzP_p|u;V{eGlxJ}bl z*CvjEcy8q8K%JI?2r?f+K=yM-Fs)euJYK%_(DjGFd@z9RX`G5^g3rbGADH`RZ#ZV- zc3dp$>ZCJ{`D{AOq4R^mV6k9UJg`O~XPrltM3D>qh<&Gy%g zXzGv0L8-(2$$^T|77;LDws19(rD^N=*F{VbaO zN{;qhF1hpWvlLbKEqM!w$YKMjaIsXoPZ!P~E>5?dIO^BMaaQL)w&fZGQ-+0`H!Xyc zWLF=(dZo9$!$fhonk7_Xo5F-h5x+VRde0-X?fi2}0-XgDuj_J9)f^ayV$LF?vDKWl zonWFEPC}8=gdJvy>csGMsIxJnOSy->g;=x;MQV*@@>>3@M8dEtc!kK;*;I|yTw~h~ zUE;DVPK?e!$Pu^2d5Y;bo3E4a#qOm;FUk-vi&AWDY-~O{5%4g<_9`X)@h=+k-IC@T znserAg}TQU+$ZFav++&e#Js03!k00p?tLIpsi`Ha|5DD#@a%;MX3yLU|7!5zpEigGW=^I>_&g?$9K@nw+Z|fH3@liyTEmHdh=##a^T?Q(qBjpjUFsMuuf>7JiQ&*@z3uY)^+6;pfK zqIVS`+wTLJpfPzXyUy_^^FjYqFpzC40=pvF-{n&Kx z=ipr;N$N?~Cw)&oT5{cpb|bK!`I-o#dxrT|6-x7-DObN6c`>=nEZxxgs?5yt5t+)N z1~!*DgSlYjLVn2km+^MaVdK?D=i7M_J6*fR8YjrJvlu}~MgZ8pTS@7V3mU%B3^VPp z>~NmG3ED;lpz7&c_@K~Zy2?bWB^;+J1mADKO#7}UUP|^*N|{-YATpf#{N%tj`Rc5f z<46mjyqr2thjvie=Q&V1*3yx`@d8)b@6_V`R2QfiY7CVV8nBXT332NMrs*gM$ySFP zc2L>a?iX67m%dF7J#|3R2hnQy@?Cu$Dq4x#7RB8$r(=HlT+N%?p_^G8TR-;CSTx4c zCM{@7V!AvOZvt03Qm}BoVSeI90tR7xl#BC`V%;gUrRRLZn~6HQKgDuy6aiV8mC!}j zx~ojg!t}^JPlqj}mEVkIuFUxD^H0wVt`4-3{53ug!=?(Nk9SGiy>4T_B!(|S(j$2K zPm(*vQZ6vauL=;x6E^U3tS_u)p>3fL8sX>N7RqLS${2C)D;r@*k+S)KB8G78To4+E zmq3557{qb_euZ6zUwK$=8(O^2PXY~F!f;ZU?z$Ygmo;0Qr|WEvI=xxyyi=iCde;7Y z)f6bkYcElNf9FH%4)73DhZCB2aN6#HE)mMVun*|_#9<&zX)2<_tGu1My`=j*Sh`dp zN*(eC%P;fH2|~3GcT&;CHmG>;lUM@q*#Nr<6M{Splf+@g2A5Xp#X$T?j}?f@@9#?m z$4S!EbF1{UE<$L*1Sy!{)fD8^lv7959Ix=P6o<=EuV9L12_LH_JMYCh)fuVCA!pPq z@DKV#tL+Vdsyu2ZH~P&v5W!B8o)Lcne&J_i2MULYUWjxaAGNqK9yhy*36{^!5+20l z=K&gl=1O`VlVRpyjj7!rz{nno zb43Z6EQwF=UO}x)j~a0nMB=n8KLX2haV@W6fb8udp&E^*%8=0Gt-zTeBI^G81XMX{b# zmK^NVjgWm;yX$IWWeYh0fD)+lJnii>+yza@)hL~m?fA)|VSwXs@{ZSsCn5$!Jz6h! zix^k;s`g^Xk6gdQ26n%}S|?^`#x_iYCmMn)zvUv#hDeejZi;C@*3hRh3eakvtb|GU zc2!vZDsp)%2 z^nEGpHF`f^02>NRVv9buu;=XMfN*RkD(YA4ru|H}72n}}uB$+d%kJQI|8Nxv;PEsL zp1UB8-5u<&FGrQqrN~BWDZJ*D+Ou+9Z+|mn_9LqY=sN0=_Oj*3fZ-Uyz3~_a;%@*r z_*hyR^j#E`WVlPSF)qRV?JK^WKET-Hd^F!oG2NX^2w1-|b|A~`8#CfF!s)cGXp@g%f+h1Eg*b|1Wo%-`SGmg`MR>M+2RdQoJpQ?WkX`_QO0 zt%bYf8#xY3d{z7YTfDd=t4$aj_sel#@aC$fg!kB~{fH|tf;LB|p?vP|DS2J8zGzP~ zIcg+*b{`hhMtK}oEa>;7T`6s@(g-wI>jI!|#pET+?ucbm;_xpV`9}T9_BQW9=bgh;zNOc0Lgue^M=R23P6^aM~&w%XR2F zc|A7*dvH4pq{bFVAL~M=UcX!8v|LJt+st;Sn8vbzlN1_)40z}2e62n_zw5hB)Ul9T zl|y%dxZ6W5XJZzPzKT*an|8%JQ^xwqz1E}q+bSg-i{4%40h~+8Q(_t)RsfQo-KJd@ z`%TlDu>pf#@AFNh7XX>`Z)%!9i}N0PYMu|`0hL0FFHGknjCC0_5&%XPi-x)9$*#FT zHtRUOExoftsQG=OC+Ju0NOt`xT*rxvQD|VR)h^#+c>TGlv^qCOPs4_(()dt>n!`Sg z@aTma0yeU!XKc9qDjmLDG#@2f)tcGjKt8|DXnv-?;adR`(AI3%-TFWZy~m5@!+PFh+@a-du-7Y8>hnm;H_?0mVq!PwQ=snC7P{s+-@hm^-sIm-_k*zlD<6FW1R&j6i_E)*Kn$UPuB29=_;>>wP@mS z<@4k!u_X|nk==6Zh!F(vj-5A{Wc2c4wE5lx^X<+X!9e>|f=u;?W9~qrk<5HT;zuK$ zB%bz~@c^(<2k~Z(^fbYf-9qz~IM0W(1aO+B^^H~FXf0OK<^>fx>wZCOLzVj! zG$J4aumeBbz(h&g?4RTqCiytTnqttEV^POR36uEkQGFL6qfH6-H4Jh8U{{u(KcShF zot@nk>G~8IG?GePc1zgtjtd?B*-95W_$0#EHrAbC0vb(*+~C9g5>Oe!auqmN(4)a( z{M%~uG9Am;1%@XkmQwD0#ZR=?3iA^?Z?kYcg`Kv&T=J#1}F%yVCx! z`(>hCHB+A|j@h3KiLa0NfKyv@PQ(YW2vxXH=1!&d>%h+n8aX9@t$<)_N@55LIBiM6<#rVi9bQTf?J1F`~e zqzoU$W8Xle3rH|u_g8&++>PS~f3(~aCZeRIGy*=VZ#^sc-<18!3;}?F953-XhI~() z`XA;v^4dV2sT}|~HkpqAB$*FDG1D*1?%N8ta0wb4lF*Yu{`$cAgQW~cyLlMtFXNIi zTKPPMPIxE4|8*Q7xoR%)=h0#Y~KBOsKtapEhhs^D4(V9m81NH zO8`I>@~dF@;0Pew^)A1y&G9OW^j;Wo=-9dTkjP@@c?#EfIkJdF&_-@xQuSfKRA}7|Kpng7xpqhD30*Am~8xRv#El7$|yz$SAK<*cyNC8zX)>! z$7lqb%ABmynP+!_iRNf``Guzb>;63_u+zhyZ*}A;(@^L#)h#n|{RQ|af@b_3xALpB`sN1^zn z=_&3V@C~3le>Ob?^=ILDcEY$=)&jUCir+5rPsDmSd8!V^mOYQ zPUVc)Pc;9gu!KB!*Br8snI6CYhO&3{d;h?1+z1Eb)U)f*szVG8evIaWE6VXXuPJAh zTZyO40qhLs_rw&Dzph|2PHY60U4AA?kHsADc6`o628I3wTx{2senqfgYPDoD4D2vJ z@{D&5g4PY6Gb5NQu|$|UBwv)LI$1{T>j0IL>=fq-(EjVruMRzDKDhQRG)ia7PCkl< ze4)>(l_L-cFY0?3ul=@6JGdR#q0@2lyT3g2#8o2>2=w}M1WU%EsyHtX{v ze!2-K{}v8dBx~op#=nW=@ub~W^0Y61CvXcG0(KNmgH-kgqENdTt?=Kbh8dWeibIz_ zjU?_YK1`sDlPvMDJsOPj&r(WJt`iw)nd_-@GS5$zJVd?P3Tznj*GVGlc(HNaRDj?C zwA+tB2$?nOi5V&7?=!3zs`*6YrC+yJMrt)r6S6&U!&KUUS3W5DR)0d2ar7k0J-y_*amVr z8XTOQhLQa}>A~YbKxy==N@&IvHu2igTst1;ud2*UW(=sF_k+P;KIEGdK<&at*yidr zjE8(5P2I`fOuG#zK@tvf#XsrKIM^9EKw8-*^`Ml$bFc zD@fp6KY;l%p4Ip#Yv37q#c6Rhb$q1M&XB?ifFRKxTZH*mXwO!=7XSwyC|}`QFTp#Z zl_`e-;?o>SJb1FuzdR`D16DLPz&I9?Z=Q%a$V3OE!Ue;fk4DSEf!KrXa`r&x+sCsB zQ1XC?u!8sVZ*KCjOmouZIk)r`_&MRg$s9-@SuzG{sYMR(78!qyc$lOCSH!T*+x+;w zUj*lJnkbHrP6D{tw3N;o_ABq$+>;sH0>}j)SyoPIOMGNu_@DO0db)KG7eLXHI{;L5 z04cI+m^qq*@$~nFImeDJ%#U9aK0!m?At?6MRRy(&&aK# z1&k0idhf6-VGgy10)KmZe!_=T_r!_yY`&&otKn>S=Z}7XnF7FpA5H*>;5e=UL!vNH zKps0N>*Li`6*T^svdv1pG4Y zw3nWVO&MoAcGP11f$~-<)k`lZfPkBYXSitW<5xWjb`zAH+=71>_J4VUyT<*7(da$Nkkv=JTAx2ZQw1SgkS?TPI! z`2@T~nC|5NTMH*^%F6TrP*&RmlESWC*vg-eL-%g`D8K(Bt8|*Fy`}4W` zu08$zV1Q0^@>TEMG49&=2(>Y10uUUrMgDMzK0z&4 zhvakMy_2v1w~FVs!gD-atwf;vqnXDk_1ICiuB1ILpj8-No?h3n#|4lNLCkhoGTjzeoNXz`B`Jyybt= z!XH>RzbwuekteS7)3MEGdlhgj1R)zv6Ar{b8?jdf7RER^3gAQkw~hi-!7OlkK$cGF zJ64^LFj{yBSoyZz+m10o*bfJY}g68p_r3DO?*^$|ZWZhFJvgHh9Z+HwJ@|78KScm*)5?JV^OKY51xT*%@PSeU zJv72A-xz}!D94BtFnvV;d`Si10EkBbdKhi`Tnu2Z>a`9$e`wh{8?Xn;iKI%D46Lx$ z)A`xYPo6*<7cam2wZkX#3Y6~y2Z{mpWTscd8kQ#0c_3TnMMXtV0M%J^4{kRz6g2*J zvab*IJV~LylGSB%k)+ZE>sQnX9EdduoJ4oyp{vP7fFIGRTy*09+*ZKpjyD4we;m|F z%eV){QxwjnKjHSD67c(0_Iv|)FxO>LkB`y#lUV#MDE~p3`mM2_zkdBbAlEPXh)%@y z=U2Zs3~afa|CYf2{3Pxr@PGJ7(-X(-mo@yo2Mhw%ME}vkv6%hxqxd+e;)|U4AHF)- znm-;yzI%fH*K={)3x*fKZmO}rdE&(VFM9wKgZ_3~_n#%E2GH>rQjkA+)W47M=dUX` zjotj?PyF`61>Amp5dHr5q5WZ4ufLw||Lx5`u9`v~PWa|Hj)Q`q-TBY1{6}T;e}4V< zum3B0f1G8Je?{+jd;OG~e?{*XCHBj9{#Wb$_a6FJ>;3os!F}@ohQWQY$b^4<7QnG= z{A+yw%isCe_#O+#FWMAvX#O?6|E)a!HNO8E-*Z4l;@^|yc@0pLUnqQ{d&5x4{rn0E|5gAcKC=(e<9t2L?qWj1 zZLaI0-*oal<31#$ZCvUOWs3W70TI=^*kWl^(1fzUqK;gt7ncpX-J2|J*^P}Zi~M!! z%zys5z4F@b4kmJAS>(3GDLmrt6#Xav)wMtU z`@h}&F-`w>&8}y`<=e0S!aH~S_3OqmhpJ|8>cD4G`HUw{QsW!MUhupeR7^Bh?J}Sr;ZeJ|W)gS#8kvnr(co?qkF=HT`b>_$J z@x&v&u`?KM`z_x%Y2@oG@!h89lD9$%ZsA{Mkizq(axU{b9A5}2S1x{LsLlh{0(#i! z|5pPGcY78-?tPKT>0zo*5NfA8v=T>%qfmCf*e}4#3Fi&=B9Hbk6qE5nrzdM9cN_3v zi5AhN95ZhQ-)WtBbH=DO>MlQAmU31*T~R`PZDKo4;vv!Tc5d|fOOVRoUFf?zxNcwP z_Iv~l{cI#l!OH?RYC?Mq>#u2WfV4&&{g))-8u2#gd&BU3!x{sHSugIpb6B-w6B`G} zwSZ1~eYt<()ER?=U9{moHrSvyqqn=j`C7Urm|oc@qB@cjWLW2;Qea;9Oda8xyuaEI zTTn*|Z6Ss7AHhb%nyreHd(xh3!*X?Gi;B%dl#9)#26!J@q25#vZn#53oITBT*446i zCFJINWb6G7xO(2JWvWWR28}@9wa(Q^(44t*et)xHw_rFY+n~88B7dR4!YD>_z@Sm` zZ;j(=PS`mi3VWw6gcBu^{HxoW{b;?>Z;k@#nX?e9ZUPfwwtbz$_1Gh)Lgzq{^edfx zmcSWy!SS`Iustf*ZaA7u*E&VO8Y7EveYD10ZR5M_G0>$gM#Oft$e>cyeA%A8@?dM2 z*VBS1S^e5f?0Uv2zTOPg^O2lW982-WG1tz8d`u$oS7A~MdKL-`Z4QNpM#?2muv%!; zQ<)i?nZ(ODks9j4his*tm!=MtLqEcQ<%x2T6VC)7z#NYB~so?rWx2$mWwC^G(# zc)b%!EA0^`FX>Km_le)n4x^w)dQbyL3dPj}WdX(!id?C>HG(+g``!rS*E9@vn3B)#iPPvuWdkEw(an zk8AzSdU<0l7CqiVfBHl&VSmY=D`06|yMoi@KB3ipn&IK2j;6F#2QUcW(p0M$sK*fetk(lpTDvbu6k$K4ZJ2a3Vx7#Lfnj|s*K-JnrQZIgk3io~Ru zKX1k!Qk6-azB;r#q#?9t@C7;r$$pXlrU-4vz0+&WmYuzJo^R!|A;(>0|9++m`a2ved^9=Vvh>91xw^c{9ME4g)gkGy=qphXIt4U0q*u9uuShq zImK3=Cc7J$3*1N-MnJX9)xmN_DJ?Oq?mLE@QuVc|mMQ1AVHMfd(>zq-f z)#1KG!YSsabXxI8w7~{Tc62#Ay6&6V7oCi(zjCRj<@s+c*{KQ4R!0wvu;0>_?m){# z5#}hYy7Zzx!>Kz%gf)PT(;I!sW>@bVJ6UwIr#~(! z`+^l>=@j|)_ygzh{BlEdz)*l(C`PHqeQ*dU5Z?eWtFf)5vh4IBCeFaXlck$QqSg&0B8mAVGsg14o z?^#$!>@CvJ^J`B~kG!HDeC54#4MDsc-A!|4gBygZc=u@VJnOBkT}WTpH-Cy=?wkgw zY3@b}eoj9l6vJ-QR<#}@=>~OL`zT2P$u^n4NIOY~`LUGGa7)Q#iHKJ-PdwUPVB>`k zldLsoVs3)F41TxV&7-GPKi}I-_qZLv3ILoua)=p;P08?f1Jx3C#2_ET?OihnZmR-TQm80dJog&u}eYvG3#G?iCH;mqVxi zrQ}`_8fs1$iyGb#?K)f4cEdBP-Zws#T9jV)eYG~yl1oSHGLd@A=Ov|+G6d4q6Uziv zXSLTh$uKV<_&aUngq3@S+&4~NJFFtv0!s`Efzyi}(`YCI1!c}wt(3GzKcwq(v+2Ci z7P#f6no~0E2;O>{8!>=VW*%8-I4XzAJNPNGWERO=71|N^~j zQ5{E<+j2+{Ye2-u6F+fft(Kd*nIznS@FL&2p>9Wu;YN^nY!LT*!Dxjnn~5GlssR^b zP>llN`LMy=Pai>tov*C+xa7SDP0K+bU4)SdhHI|~Ex6S|@u|M_Ug{NyA zLU;dmQvbpm#D!+VU++`n^i&mj%gqFj`N7h?Mr( zH6BZeiKy9&5-*==lwNiGaOEICU=-uNP|`3|wz0`A{2-goFeY2VG-PQ#=dtE_l>Ncf zqv=BKDAjdl4z z&wzvEPgJ~GGtBmu%J#1HcNxEXoqO*glNE$HL1+*37*rm@+xha8pbme}2#Q-U`XZd{ z3>Z~Uq(ngV#XT4{pl4?~5SLSaL#L1dm`cPY_~)o1HLtkWMU!j05q336iu-H!jdwI7 zc|kE2iZ2hT4F>uLw>rvKbt@?JCA zkaqJ!q3+*C^*S*SfciAp=rRBBQf%+#xz;rg@W7igL4$8zkp{_bYw_VP5|?ZTTwf!v zv0)zS>U!8A%Q%1e?vQOoL*2|5Qj(TE*H)f|qPX)ZuX$Oh9rl9y<4LxtE3rX~-6@7^ zN!v3=D70FFCA_Urr*f!1zjlJzccq@fNhFZq%GiC0mT>g5WyFL=#QrFKffEY87H_As z2*<>PbsHEQ^Yr~AtY9mO zh4TK%zcSKYIh^F0yuOH=%M28>^10yKBM#i$MB^P{kH7aw-- z%`f-)=L?F!+Q(!%m)QNMve%Oe-I^A}+RLs}2CVqL- zex+a6W2dj_lc7*hmf`iyNa3x_)q0EJQF8aY&&IVrB&ZA+a-&`C(v^%QC!VxFySp-m zsX7WHpmuJCSEQS6IK_!q3-Vi=xT@d0-L)QMHxVnnMxl9|-XlD8GO-;&^JC8`Y~!7w zx_Cb-MgQMU+qm`rYbd(rCn4m1m?ImqLU5CrXk%;%3@3Z{z&l zlGpZBi}QJcoFHXx)(+Brqx<_-DUNJWO-tn$H0AA<$3gNb z!plwy)db$M;71pa#yX28LM%l#mc_$-`!4-VxMfldlHI87GrHgE6AOGuEQ3Eg8a$Gpl4UDU!QwMQ z*{mFR``ws!R0q_Rk{c_)&yb?A1psSnoBh-5N}&5ev!su zT5wc0)&6A}@P6p4bVe7%x|UJ0rmf-VZ#g7GiQ)>)?^8|PaM2fIx$-0lb^(sPJ+*r? z&CxDeM~;+L>&_Gx8~w1kwhqi;*~5&dGQ_;p&@%TZr*;_Qeh=-+UvuzfC8LsP)CEa$ z-Z|nht~ONWa5=csx7e*gv#3#P%oBB*&8Ggn?&3)5yo089WG5sv+Hpv7*D)o2VZV&+i>Hayn-R;w*g{yRxhtmY@=nUy`2~LrMwsw~B*xCxlB6M)xOyF6{5)TXnTX^|> zF=M+2GBgRofN`#Y{Ot$XGJevLeas5~vg99;p=XhB=UL z{LoSVjVi#2`+18a;NGPcPld|86j8w>6`=wTTq-UCx?5>SKstq=q;vNH9q$}paqrG| zZ>rngw<==&>|qPb5b8h@$js&po@TmBc(UkOx7b?@xs^MJ`x-?(1If9XI;Zas6TJel7ZFY_R5$$6>?9LXKeY9`2ssd(0m7Y!GcoP%0)@M|AotO*N{w`Aj`7%qLXK4wLCgcb zl1yf`oGh)r34yL>!^%>*mGXiILAe9?GvF(g({H6BD%^$lXJ5bgOQX|;b8ImrIN%b~ zox1Ng(?UaCI&cy1W6h5pG3$vY%!*3gw>!!l9Btn`U#Q1Z1UoK!It~{*G(%1y3%*Xz zRnBFD1q@gYCnvBUE`gPwHf>OaNIaEWL3{j2znyNh(xL zcrN)M57`Kb;et>?(WrD;%qtxV?hIoVQrea3zG2UD>jTI=^Rb${fr3lzq>#!4WBA*S z6ym{s!KSGleZoak@=m3Ra9uZMjK_no->!CKY7`f2lx#;;S4B*`J91MRIZA1n6jUxC ziv3&PG57;UF{D1R{cp$g2EKjNqOQk58+Uf-y7j26Fkk2(_lRq5#k_L&eC8&BiP$8qpx+`eF zod~j2S^e@f##)0ijgo=>KgZ-h&W6WVxwzuPcie^I)0Vp(#MFg4jWBS}A{Bbp!m;=Wl+ zq`7l=$a?*U#irJNn{{)sAuGF`^02KZbZsV(yx}a<#3G3MLx0d>4lEKGEE^Kyzf_p5 zt9cbug^5YfXNPvH>3W1eTB(Lrwm~@y4xd2#LOTT9s@+?bh&3>$M=X%l6%zrxJqIRk z2YRjC2oRh!XYx$^#=JAaK`8pu+yY!j-x9GTx-$_djMuN3Z5A5hN$}2J?;(YMoGUNvoC)#3RJ=($O^ z)@e@N+@?UG!>nu8D;5ms$*PC;nwuIX7l4!COXC(=w%i_@mWC_0q@};AjjKNG5q^|1 z1+p$)qWa1r>@akH(4(qyB(P8IU~g)8_2}rJ_hnujO}xG6;2};j*-h6t5@kElhP6?k zXK44+{_D={fx^q@Qo%Wt73%fax&x~+8MHY0=f=M?RdLrZ0PYEJ1b(?6F6ewon&%%p zn$aulNf7J5tH>AYke-WQ=4^VE!WTXh3UAcR71C$cYmJ?;Umafeflk#1N|L97m^CeI zQbU)991KK^56kzcK`yR=I6` zaEQ;;CWLCB7s_sOq)})lpY@Fbe^*(n*R0i#wKys+;F+}%gb#=Ip@@p!q4x28U9%T@ z#55b{E?-yEGP2Z0Zbr!^uoTpLa5MIiyus`fdBq}=YlsDLK_Xc;IF?^UqS3a7)z?Df=gxAea3Y)y;M zv%+lba52Yl^2x!38~#T**|Z(}SdK26PR_9oN6Jf(i!#}7YH!t=YgIX*+re8)d(?C- z#Me?aAPy!}=oJroo@RqKsBQuyTs~U=!xY8>7>;O^cagY+wv*veCeT2hkNOqs-&Ep$KDH{31s=i zK5KR4SdO_`4kpJg5kJwZJTxWtdG+R!&mP)-u*CaOLeM_|2jg`Hr3=^y?I%A{7}X3f z_a?L<0#08|$*q+e3jIY1j&?dc{92H$fl*_pEF!LPnP$RH6ARXn*~bxo?O3!8a>Z^E z6xhz)+i@SU-uVtCo|<`wZb2Sk;EwXzK#D1S&QIE0TH};s8E|#?E&I3{qER+J%_1@{ zTH%0jMzqIGP#3r9euM3Bo7!$!z$G*FSDIi2_f(~T(0*O=+l14uENsN{p!*rbd&QfY z-nDYF_O;=ov~FqLR-aZbsN$~%%AiWRw>==e63-#qG<+Dp-(id><-Gq z`krVQb*qA5D2wj&r^w#f?bY33(6gr6oG;Bz>qRqXvN_n3?cp6o_pM@<;36$a^AG77 zk)*e#wc&G>sxr%{Lx$2aY;;PKdJ}T&lMpeAPB*|sDU4;eX5d|gqX#vt;qLH(q{5Ut zEC;O-0Xg!p^3x?eyHVa@a)T}{p)<#G$hQ_3WehL7Hj>%rLD>y@n7v{{dWGc!M%P_; zzblY)Piya()`0W(vZYxCTE;uSeTn_pO3psRQ%l{(#rmwAM)vLKXgMVf1+td9pc|v5OFB9 z@Cdmhx8Q2o+{;;&bFIXt`@AIWKCXE#KhMdQFL!s(xs*g_*|~^0O_$QFN@WMt zmoH*_d~J7B;JZvD#Jo$yBgN36xsKvKfz9V^I z7U@PLF#y<1oJsWylZK3jJXm@gAjzZsg8CW-H<&+lcvB`yw+v6aoiUp2>XPaJ)GU24#R|HdK&v04knM15$B)xe|_6&3M(MX{@ z$>^4tGz^`@fc;4Az7Y{MG^N)?r5%LiHI8Nq6tMQSLKk<-oEF%0in1Mgci!{s(A_3O zIe9(mN?{&n8$?IMw$OqYAoJxE!7U)f*`9j@y^Albz`Df7L)`~;GrJ|w8}ppkX5Qp5 z!~$x3PUlgNDB<%on?#qj+P92|AQ&pX0-xGroOfrvLwG_R2TJnFVceQbhdAumTv4`x zytR`~r^O+BHOO7KnQik7MhezWJu2y@6IXlYUaE3c@y)EE(YZ}I?^T=NvrHA(zUqNI zMoXPekkmGml?CEi zrvru7#$GU6yT#>%_G-%s)9AGCJ<-fceztoXxN){)1E12Q1!Cd$@&exqt6hpAWxB>a zGwz}$snbkBUYCMeOnlX>T1L!Otmj-TSW*Ch!sGts>QOE?r{v1Jt`FCUb}-ugP0?_j z=#{^k%l(JE>I~ITK`YhI!V8bwA|w%Unh2)nkJ%>T~3(7s{1s zyUJEn1O)E^SZ!n647I;MA)*r5Ye(14rd^|nab;+TwMDSaifB5UWwt9%Jcd$ToVTr2 zCY`P=Pm1E+5wLV|^$l9vELRP&kc;Ve)b6yMQ|2*)FQGs_V7J}s{ei?wt47JL!p>{< zpa^?dN7;jpx59_p9?72c{99Yx#wI>-A*S+6bR$cGchbPG<1Cowi{{v;Z+L4w*euZ3 z2)|@p_%c3zEl%B9L^me~z13Vxmol0^J+*$b#CFPzcl!gbtn*!6SmVAO&}BX)EiNuw0H9@8yExZnrVt+L1uT zI`XRuUgN<^2oL!Jo5PYl6N=`0vzSLjU*{dWIM)`}*~)!C5~Z(vL=HzE65XT=4XK*5 zbs#3G4|(*DhJ6e`*3ZVD8^-=XVeb%{V9Q~wcSiG}{9rzvC;X$!3*xd$d|Nl{)Doq` z_RX27I*hqO_^e| zB8&7YOoPuN0H8Tf#l=aJNY}L{Vr^8dJ@0(XvQDvB{DF>zKJgYFPl& zF%hr35iL4wW+PCai|D<`VwdjjEswJHs6S}3jU};<5@Q)qG^xDyjeUsRvO1)Qd0%_D zh(op+5;F&!S@upX>jljeY|c4B{FRgD<8pS>vD7UA5;_MQlEYoVgh=QgwGOoU;6EuQ zaUis?){V35@2uNm_09$LS`cQm_ROUyhuDdRtDVDMNpb76V3zann%y#b#A!B*@$Aq( z%u=@-g(Lb?W1OXmX2`jb|c{+6sZb9iLNUD%6_8iUSo5GC2lQzVDK3FHTIBj03!k2QEIJJEhdh zT}N(NJ4|WvwYA;bu4DN+KMM7oGN`4*^IFqRdOI5ny0E`3p_17t*hOIGVs0D>-m9R^ zTOdoTP$-+#Xl#%*YI33E9WS+FXj4B%BV);jZ`6@0S!r;fe~xr}LjDN__p8ioSO`$; zZy7}z64A6os1XPrn%C`f5~i!*R@rhUG_ZxF%Er=8R6(!nx^ij8G^pu0u^XCo)fd4d z&Zulmt?gQ5@O1qZq1-RcrXrLJP~8sVfjsaqs_kQCzv}Aq_goKoO*(Y|+-y56`lBCP zgZo0cnoanyV}D;ggbM6}&?zonpYJ_Hd*@YpXhCX6>u(=)!bv?Ro=fd|$E4~hgVMPaYj$uW58W8VfUS7Uy-q1bTKfc2K zp*%anrFhdRt_6sAVr)1mxXdq88r8@S1*0Fz5zEWs;Ss0ELZ?XOoqDU2==Z8FcOWr) z??&4{csQc3f5k}Abx?z=M%0GEy&LcyqQp!x6M6?UWVYX3Lad z2&BSE;%})cIzIrCe+E6X=Zljng$(>RWgdO22AImd-4LPm=?Laz5N1PO8iK?V+I0#6 zj^v|2NRdVLt8WbmYIU6ETYoGrEs*^J<}a1C{)Ori=rFBIU!TQl(@lZz>Pp4k!g!gFKeh@K&;97JXm(P!N6Pi&AkFgKr6uJw z|HE+*GC{AhzG7wZZanp28DZDDmS$t5V#pGE8+C|rx#O(Buu7(0G-spTx5kHxRZ@_J zij?yU9`d*PXrf~whrg||&?y8YEt%&O0b zQ^P+`CV9G6y2QjrSsY}ArVSN?ZGGlH33znQ>=2Tw)0bEBsuNC{zR3=1>%;3Wj~F`L z|JwL0q;MQlY|EX-o#7#KuM7`bE3?n-gvH;jXldMnXo4(c$X6X{!J^QxGXZzxc8HHl#P&YA@|%r5JdS6N^4>k1e7Rbf9nY&Opi z_bErIESIm|O30(Xd(;x?3S&(zHqY?kSi0k~6-6xp;eAjH+seu9@PgyGrjulYSR<1|!SwC;$;@F^*Lig1WOlIx`M4q~QKYzt1GOPPop#&KriRbOSt z5zflesr6fF(i*goZpB#2@JHu@#zOl?Sou_)Y`ecl6d9-IH97iyJsbX3I}jelGAq@x zs2Ep!{|kb!tP*znujuI%Nh-+D0DBLP`r}RQ@>=u$1}Ix&I)=gh%L7_#@)WlZYk>9{ zZYR?ec|oJSF6%*@eBlwNXXLG7tuJ=*3d?t&HKT8*Oelp2P;yClN3NZ{TG9f2wXNv{ zAgyZ(v8ODr48~7y*$$;Q)CqwkN-y=#ELAqL@bq4F>IBFTBX{zv+hW3_D2^5pjBnAw zGBLu-?xndyzARLyt3vAPJ+fQ@o(u5d5!0*%@)A5P9wHEUDn zoj@J_;2*u6%Xb;K6HW8oSAv}MTkbJ`LkTaVN7c*#;OYjxX(V0qU2n2;#5mw z4|(SvoD)r#TcXSk=65K4VOe%)Te_9utIwjCg)1oG*jPESGM(+3SxSkwMndM03sV2zl1fEbs5$+}!VW)^XmX+?ku1 z+U25&w(ah^YIxsyn3q(!G(rv2G+pgAZi|{+FQJWMFm-JN&Um~DHIFtNpET_=WkYOe zd%O+9+b%YOY7L? zqBbtg7JvjeZmE&h|1k{Yb7>+ZyJ+O{gYP-avykbqriO*dCU(C}qB6Bk@*?942eO>W zRAjLh&2kZHEjw7Y~ZcTyQof)py^qJB;*ckm4V5~W6t>BRf`>eEOCLL81;Q6o-oFCaG0>$!ze zW~ic%5b&tjOT~EDFSGY&?{V_-)66QT##)w)0QP6B44`To^xdG@pXB;Qkd zvO&g5FixwlkL{*jWcZw-gl>0wVS|aIzf;M~!T70zauHN)*dy$duCS$@r@<*-sP#ad zp0H}4Aamm44!&9;WiM9U2JdB;n$QH6ydWfip@nDWmN4)RV+ZXmP4dLQgy}ASm1#N0 zS7na~*L7}*7W`hU_7-)?{>d<}(M`!7?dL+3zI)EW9TU@3Rrb2;09Ll_2%RoeDKi^< z*uK56%NAYKtE$O25g2<1K4R_sa>_Qt5XuA}aV}7&;ai4MkMwTqc)gF#cb>P}X$z3( z0brB^{mQag*TKa#A(QeHnRP7JbwfxuC4nHII+PY>1`dl&u6`Sb8kM;l?%m|sp5pdr zneDKDuX^Fa{E9_I@T(zrmhiUM;c?YoOrgvXTI5ThZge3e}TiqES$%0}!F$al7F{WO(*x$?KZKEX1ojC}}`k^>~8 zEK002kYO1c)YNbGz>JfNzwnZu1LVPOr=CG$T+r`%=9F7ney3@A zWK@EH0?ffVjaXB5bjK|G9bdb-ZTCxW{Xn66y!cLunY3t%5c%iT05Tq8}_d&VjroYHC{bYFg_HttElg7=>GX$)I%tVONl z+w3&<1J${$cM-w>mZX&T;cSH|s6UTUx1SO6DE#;=fNIh9yys0)<(tdyU4u=7jKae% z3waLFv9_Kx7xpV$-xY_bHj-%!&2H@K?OJqxudfLGl(IxMSER?43}BXzrYcf)IOLg8 zGNu#tvMGx%bZ`RnDGfa*RyIA%#GZJFAf3`;NZLCGocn9(;q^j(>yDgBPhO7Ad6z}b z?dr-WvuGNCBb+%tEEl+m85YZJ+YHm8@r(V#oT>gztKK7v|idyK7&c^ElY>+nC zlpJS#LIC3v4HzG1UDdFsb_Yjje=JI?o|&jEo*g+Lt`k zwl>6}6>|S@_7oxk8aIQiB-HJPTm0a{09BEMsc5=33$#q2NH7a&sZ#uim)C*!;7pgd z#`EsCQqxq#Uj;7r6L0|tT0?Mo^LrwX8)|z1)kz9Sfkj)AqJtpI|6hCW9ZzK+|BqKH zmD_0GMzoD2BO^PcvNzeu-g`SFMI|FMdy_b19phLfn?u&Y;T&bfacqw5`##kDx$nE~ z@9*>X_oqL4aGm3Nuh;e3&*wG6W_lZX%<+v?ByNL)wO3+h40lWIj#-QZ`G9E3J6PU& z)70T_?pfm4*8Cle^k?k{0f_HNJcBtB7Q~0z5IIX;n3kwt!I@vVk!K$#aQ;Inrzmr` zOK^#W0R!Sn61skyAT=Zc#GhnYBQPZ#sMzE;F$s-D&HcJxZO^ktPh8TlhMH0x!@ zy+MXdY-DAFR{SUz$p1n>4#8n8rDv7+v;b_LTm&rRSTw3cTxPm2FAML1gu z{9B_9o_F`}&?mN&3b~D>crU2g7SvBTyu38uN_8mj*0ddo&B(_zNKz2H3`WObstQWs zt-$5Jb9H99=7N8dd(LeM!dkTYITL9X}2wglT52d!2;kUDaZm`ltYaERjb z`S|z?nphTO&>nO<$hu#Ea1BP#w+fckiS(I^B`UF&3`It;;yaQG2VV(GlXJ~(#khfY zefryTg3OG|?&-`zb&dFTY-w;aG;+3?#p02SNS?32y-Jo6OL!5BAct*(Y>`C8r1eOP z(Aic&F3>F*|wrqe?5M{@=r;d7B8q4-OjeVsb3$PW5 zu*|P%9aKi^_JNpreB_FJ_~{E|CF(+O+Y4th zm##_crEKR(4y=w9!seh+GHP$4Ds!#8U}_Y`j+@2Gk3bqU7w-5_nVbv#R4j4oxOBv( z>mTOyB8=fxQf{S!y`CzTJIoTgZ}S|L;ERa970)gsM@7kqWd4;R`b{f6BI}woP^`J$ zduc^3$qcL3GSwvz$MWv!R^vJewC=94W8Bjy>rFXnHS?Fw@ljujfICMv)9tOj9Z$1tJPl^oSeQN?_Qr=)miH4 z_A{(ITDG)Oxa^|1?~e{aT=bpGj`Ee&wL9wjJtZrCy(5SJCX?UnKAAXy2wN-xDL7Nq z7pq~3fxi2D7&qWyND@2@hx7r3y|O~ilkEBwk&7p%H#pr5U;$RNheG3vBd23|CZgUu zV`ty$2+c2DZ6#WGM@du>MsH!mPL$++w<2*^DsLK+)z1L4)TH-Yc^7Qj{367^#pN)$ zeTh{?vzF%R1%qAN8YndmdP%Lzz5z8eBwma>Ny^oUjOBTs70Wj6)LouJJ`l^Dm*k*V z`ox?@pxw#ad}m{&h7RveNRC;k;h@`2=&^Gv=UYo%?L}-C-G{oAsuxpm-KND2RKcZLPi( z&8BZ)l}!&5*JZWJl*5N*zq(R@Q^#}A2KYg@C{=HF38IkOc!f@iXty})h|00Di7DIpPz`i& z{>IuU8Tky0LdPwYk&oP2E7gf{3ac0X)Q{3zQV{ssv}QUNC%!J++_OG9%!l7Do+`Q< zkY9KW;=ceOfc#aoR#VF+ZZY}&5+P)vjvXRu#X9dJ=9c*4g3*wU2H^*1dZr$Dh#qje-P8fKK!0({ldX}Y71tlKHOQK zZ4N;T0pBvmt0k+{=EvbzHVP%+Vb<)xPk6U!Bp9+>k&F!RVnVH&V^y~y&G$T}V?OrP zqummAzrspCSbLUa9l>3?n9x(+y)e}lRp6c}pJ1*N1$}(0`~%F1*O`sJ{Ju?o{Aym&aBSz1e)N7r7EF%gOZ}|g1|H_+MZ%UDg@RwwK zlo7I30cyaxYpG49WL2l3h67|o(7FLvNud=0y1teqx0|(>%YKJ3)ivpvE5=pC1bUVj z5z#9fjWz@|5A+?<&=*s<2TVcxl?(XOFv}>m5oFQkNn0Qr@gF#8K<_ErpG4#)h&PQJ zBGH|6p9laE9XOkvQos#RM~*)Gbn7M#&C`c^YVP}d(K9T2sj)cZEL&Z}QO6JyhUx zL2=6m%zh{$e&>S2_F}6RrW$58JC|Ln@g4IA^mZq)OLKNi_eMAO(8o{DLHNAcqrZcUnSFMlPH%u{o_Se6?`duP7aKoynzc%r7?k)efk1RMdB2|^( z=n~*bDmLkP&QRqnx7_RWo&8qnPIC9c6Q(R?N-CuecHL;)`JBXibLW&g3cNh9)zp)O zVvQUQ1iC1_2Q`*Ts~zeC{gs+&iqOxgxvU9=Flhsb+l3Nmi?=ISiRmv%KE^lR5BJQ% zEbXXQ#S$~I>GqPxqRa)48)$!`cJ`*bpP7frOl||9l1MGVo)6H$=%f(KWETl*Y>Xkw znsp7vspg+endicpC#+(03kO#a#C|Jj^s{23Z^%JOB5zCB4YO(JK|DvMmqqS3sw>F1 zC#bh&S7Us(7EBkd3OXWRQMe^n6@7OPjpydD3~_;9HEk3z{kHk1GYt%Da&xvf>~t;) zeR&HbQPGwfPr@7GHFW>nq-XP(VH~uBw$@r&#z%`0!r;RwGF3}7*h)YJi^ie3t-ET0 ze}i>iv0gCuAO#O`_-Il%<{V<~rO&%mryYMewCJ|gbhgscitT_#z;fU*`tPPy@+)Oy zIuNW3xkwi#+O&lkgb*>S?NQO$p3JDl<{x^Y_(TK?n_!Fgem?Zk84h8^J_iFmh|UxTjlPt+s^-;0MY;yPd>S zJdfLW)q+5Hi;_f3$Z8}NdQCr~w)jbVc&bhfGFOvzu#1~t(i#^RVmWeICSSRE^UMS& zfmps4K4C6{Y3IWTwO#JIS+r>*C{zDxVpAOD%#VwtG4UGjb^SK%Uh3eVcuHC&9xb}F zvuUgUhNH?*^?fnaR-}Dx;H1|BzN*`6Jfpe9uKmbClqw-!{PZJUgb7c(R`0v~=kT6V zqs>Xr+wPHK{k5heqjf_IbpVV(CF;u&>O{=7K8a+g-KDKW(Bs63%feL%SlNm4kBw}f zG5KJ>pTdG=T1~t8gz> zd#CHs%nut#X9oJ)Okgka*Pi3KLN=@(v6pft`0guLJLaF=i((+J%=xnEM@Br0Yv-y) zVolzUn9)y9r;;GJ5pyO~KZ{zG`QeP~o`OAJ9~7Iu980egalsDq^9!!7?*wepELFu2 z>Jf7ylI}^f!m1I@id6e)!?5chZ73yNIJ1urWq}fbYQZ*j}L4ow<<+@=*Lg9La_BMHu zta)=+lH34Idr<mt9&RJ#N+L1FHjHz6@RRlq9U0`kI2pbtt9 zif;V0(FQ-m>7xgNI^mE0BNQ&ZJD<#KE()+wifocunevS=Wlty!FgE%?xSE zE2Pj=DoK9oQ{y6^VB|_Wys9K}>y=D9rX+>&I5!P9|u0h8Ap7m5n35d!<@M zKW@5>;&NE`3~OF$9CpR4c_w!m*oB4bsaOjivH0MBT#_+M;l9@;%q|BwfkN$0HsAk@cgDsN5y`T0vq`iLAlMU31bxyH4XIbkpE!i4%#wl}ps$Hub$VSqWe)Yc0PGXD@g3Yq>by=8P(vC{Dw6 zBt{ikrlVUUhrd^Gf$efI-exZW{0?t7xD?J(wT-x+X=R8;V!YU0(M#{_wFD?b8;)f( z4SD9n`uaYRuh3isY#cHL&z2d2l+nr zQ*0{5O$oQnJ*?=#a*bv3j0gF?MrYFNoRhf`BkFahoi3|~L1bjkg+q6$5Req~{` zdT-E{1w$vNs#b!gtcM+EhVV1BDTUtKbD0v+p?psLf(~n6bd5mw)XDYP01nD&n}O77 zw1Wh@A@$fa3YVH=EK$oJji~V1Uf~0n$6aCu;5gmket4BR20^{ec1mytX%N6LqFsqj zBd6V}V8=wIR6R^^+@Wk})|D633l>>?G|JsBJGq&=M7biU%Z%J&={EU3yQVCFANrvy zT!Q2puO#6=R};lPe+_K9Rb+?3EosSp$E1!^1FvX*2fYt~RD5;p6Y_n;aE4>wig3#k~Qzd*Nb{;Wn z2=3;$SRirw~aAmOij`HG1}1SHo$`Ps^poBo+7M+-4)V)gM3~&!H~UjId%rU z)6~BTZ;Z+%kI$b>?#%K5}@7q0NDa(zgK-Hy4h9E-hJ^BsejvDkImr_qiC0a zWXnulC zSe+d0TBO~xM!T|^OVZrqT0xPwu9DftU2*p$ch|9VD>}>(n=iub*v*BKHJhx4-c{RY z(?0AUUq1V~+bTxPmpEGAquQER-y8JtaY1(6Ts!;xR24&r1$>G!gU0M6ol~mGuwLC zlF#DQaZf?q*ZvJ`aL7ADQ|WiqwkA6^%Q5sP|^Z&p2?+_V8K_27!`R=H2P$vkU z@#&N*po*~U%Pm60O`q?kS^7#qngC}KD@M+LNx#PO5+A!NC%qt2^=0O*$->AYYr_>G zKIfP8sA_KSD4`95))5SEJ)!y?i&lWl|h3i|+W4 zRI+J+>k{Rky4`isf&`d>2R_oHQOHhn;dv0Io{us((7= zax;r`XFMXV!}1Y65CJ12T1-8w6q`fUvqF&x%+Y z=UU&uJ$p*C1vmq4ja51-+`73?q+~c=E1@9e`JI`xwwHl{Or$bA-eE(s8WYWH{gjA2 zQ?_7;SWw;|d^Ol^)L9r(Zwk0a;1^cq=8en_J(;Z`3j*8)(Xj@8n>2p3mBwjaNh^G} zR50cMZdx{>U6XS;(4jkNJXThfK*a-2Q8d$Yjdt%k&k=*D5eLHVz z_vxu50wf(AziX-(p9LKj7Io;Te#ogVaicbxsYfGh`C-m zGeO)ooIsnD~ThZ=&Jl9;j*yKTiw*Ha_;e=kg_oinBcqoxYxdt8I^DXmu9XsYi{L zsr8%VY)MOxYfo)iyO5CyHK}H-NXpwiSATNNCyTpZ#gBx+eI)9cK@0Z@Jd0^r?&gIV z)AMK20Lj!?Rq1isIqPuURIj9(ZJWp9wtq^3epHuppLj5<2_cL4&{-Kq#B(pq{fG!p zDPe~42bn2U%cWV`NW>cr+YLcgY6nSLAIk|W{wm#M2uZe2fV{njnzTHinvd&Y|K&pE%RUSTLJ^ViAd)-EYi|h>LoeNGF4?}kTrJ>d%A@{&$xJY;am{ZH)P29EZ zM2|0g`Ku<$y2f)~Y@+)`A@kF6;f&V+S5GmgVNGNLis8DJ3sP5$z^e9`T&-k$0$_uK z0lxKS9mFT8du8rTfUBLT$qbJQ`JHgScc%C}u6~+QH$Xzx9R65$J=o#;$g=+XVvv7m zts@_z^>jO{>JkQ}d_;y|AHE3*^)6D;e8={uU)buzh+H;;6TEH6DY(3~rNmW=-*yo) zG&CBGu-q5Wg!|f~KFiI_UuGAwir5)QL|f+q_E6zBp-**}8}cPP%w2{?K81JyZWBlra`}Mb{ z#jW4A0-C#YuIcL z+P*k|hHo5*EIi+RyPf2!lBY%&=d?8o23d>NaE(S{&fA<Y6N#TN>q%7H2V%0p46boX4#WgCC~c&>kYNH|kZzsyb?I zW1aUn1-;f!X^tJGZ*#rASeFik4Jy01%o_SBJ0w5RhGA6Lo469(m*-e&NqplB~vg+KhBQq?oxWPjQ!sX~c9&p>-_I*5?KOkBPi)$S{gV4?E?J zzfXIHaT>3QR0ApAn`yw*XC6}9j!Ra~cvbN-MddH?Ztf(8zBnfL@yKL?qt=+?eZI8H zv)tKrx83LJmho$y600GVk?R}6&3)@>ha4vm3MV`ql(Zz*;ERO}lQc=fLOWx3Ob6)F zxAox7dY-cra9H%Sz4rZa25P+@Kxy2OUCrIr+|Lu%8M@E5_mwiwk#-jm#ff(9&<{0$ z+#%|@W8<~4W02d+P2CAphWf;mFXc9;mr4!APBb4Y(Z+&6Sz~7dn?EL1-7%Q@HD(9j znuv3ugq-kH3c-3Ahuw-|PYmVwTzhu=cuOP_{T0h{$-O$cWAGYIt?Fjj5|Mx4iCEEI zZh9Y0Psa!HS43!OQTVYf=A;th00Op;*XphV$*yYamrK`d;Op-nvPwe~{QhT!AvG7vTt=l2m?{QV$IfK)0OnX~q$%tpzn9lp$9mAl+ z@vmRMd3@aZS{X|3e#`kR(|A>LzAQd^Xq$^41quf#zSZ|Zl%f+JPw0Kv_<)fsukgl( z%7fhhY##5t^J+1>Q9vw;t`(>;ML1?|Y}u^XXsV;ZdfCLHzM9O`4v#}Nc#uqa50EY{ z7fDn~KAsDxS$dp1{?1mM>{cJhLT)E)rZ>hj$a9Y{g-gx(Ip3H!4B@{^Hv7Rgmy5$} zebeRk$CF3iQm9_#wZ=kQ1JU7`(jZQ|jzrs)ei7-d9MtaBE!Dqb>cY>mX!oa5bw>q# z%$mF>o=G3+wQbX5+l7X+6yOPT4V5d?x2m_2U&|(vtOEiHb9|UsBkS4j<;@CRXu@b< zSM3|~v-h>~Nfw?)@zEuDPng1&Gb`|@({AE5Zu%*1dlpA;g^=(B5{yE(%lMm$JAQK7#* zsnK&YHV{bN&J@v_LI8RD0RIF}dt_-|5r|^+;K1>mb4gzkLDpDKS*0PCWL{vtaI^+{ z44){HWlJM(D|%CW?NJb}G_d3yGS9U`V05hCcC#|Za6FD36Ye=zE#eJ*S-1n_u8`fJ zWqQS+e}pNcs#}1Anbd2-fM%sRXCax0jgFB*Ho##%6XZhb^jw$mx_&mY*@}6-xIx$( z&NQ?vzig8f)A?(d5W1TJ@xHJ{BzODNvHFO@6$l@+HA*_u3Mq_aGBc$0dt|Q zdOkP%w4XxbVdjbYRx(QLwmxW{vJ7X=Y^VU}{DbafJvG;8L zk9eh!>6|__h3`ed(dJnU(S5dW;3wOKe6Z%pn=DKWIC*I-53+`7K*)!Cq%A_L)WV{L zcf$Nhf_LfDu+{5^(mzBfW~S)}{*C(-=qCNEW%AC)lV&8(%)3nmM{mkUEMOGQ(8JaJ zD2rF74CJZ9<7}(l)nV=g==si5Nv^rZ=LLCeliOu?)blp#rydtb&wNyZYVpKtOk&7T z)Kg;0>bxREB)xrf(<06rZ4a;20k&VmP0iBTVC8%pYxChk^LO^QZhc_U)PJ@*pKMqW z;#k47~ppJqg&&}z~-oJF7Z;tczq6mmdlwbw7qk0|1cg@H1Xl;kqIEqhDf^*+60e5b>?g8Bmgw2Wr) zT2}wUyAf5VC^mS^+2z8jo?J~`Zsxu|?7a#U%`&9#Vt~^Tx=%JTdHL%hLaW6(p4-FK z?cF2ch=gGL_@qGERm}adMLn*#MmbNGPV_E7rvWy%&)i$${VO$~5;8S_op@+ZuQeY= z(s4@A@}0x_n()aIgZdAO_M$%J0oVPR=;QWk&x*N(t~K?5z@U9F#~z|%|36==lQ*`_ zV|pwrqiq)e_lTGtq`Zbb>5rqYa_*D{=D(pnUNw!{VoyjEADkKb6s>T4zkzZ;yLvHH z`bi3v@=4CU{K?<$3i_a)*G|e~byWsg>p#$Dx;IHAhaO{8h?zxIg1(Dqv=g8BuF(9r z$vzq0lPii;$MzF-f2SW$zD)v%PMI|;$C&sZ)l{X+C(w7JBNgs>8N`$Y^IFRf=Bqt*x$nAuJT>HktaC8HqZiwj z*s0CwMCljGZFfKeZ1XI$@ z4hu7!Ltbfd`HOH6Ab0*GFrYQqKVtp+Ht(I?MN(e??v&`u)1^*Y`qG&624uS%M6*1W zP`23duta1l;MjslDgaoyd2eC%o{$vPjse!%I7}+PFvFh)KZrYiNR}cP=-J~`ihoE9 zVS(pTYk?v-%Zmj(py}H?^y4}9m}_HkB4#ndtNi!$JVzmzF+h*0HCvrlx;F~^Np_{OfCN zOu9Xh`A}K4RgtrM43B4`Y>a>eqkQbmIr0ma;&`nWp*7%ixZFkzm5c5*tAmC5VBoq|~p6#o?=#bH-C>-Ugj@rJ7=!`kES4 zS(9PTG3&fnXSI?^+KnUi;*U07^EaeC0Bql?H(*IYf2ZpA{X}^&qTDWoRNMc5#P-Ke zEJtGnN4p3RPvwGdye!hk74j4f=*o8nWsIkvopu=F3^-10a{WlX>Z7iRsRlONFR3pH z!twW$znBXs$e%@~p8sY0&c)v;d9OA`F!1oXGIf#N$2wMP&kFQIsOcNMfej!k)$pU7 z?m;V&*?aJPch=6lnSb0;@tp5&?yhkkMpE<8(mw@#Puia| z5@?iSgeUK77LGA#mUsl^>TL%S_->VpOq{c;RG|Ge)}>HIv$*!vi=k@1N=ZJ~RI(7u z(9xdokVxss>l?p3^q>KULj9G)KlIEmd-&tik+aOBt(X2{!2YND`1^(tr0xWPPxt}z zt9=%*pCa%d<2(UOwL~>1`TyhNe@=)(8T5^XDxTZ7&ifKhh^c@7Qw^wSc%OCnuaE!n zcNf#amoKF-|0+elo0vDKn{6?U{h}}bIoth}-+2JOEH19}$A3@sZ!_5fYGF;TX&mH3Pn{sY96|T*%TNCO=J@#|pZxd={`>9lKi|BnbjOV%W$5Q` z|9lVY-)`zlO~Fw4^7+3`mzf81}^Yy?0OX^CNOM{&TpW%e!-q zg5fSR-!Cun`}z6L`HUQUMr`}|(l68b_qeG~<}ZqupZ@pdUzX2)QONBq$-hVWWmObl z*wZaRKWFjF=RfD;cKGYZxQD-t^6%yQGG7#Wp=k5(%fC#cmgEFE`m^|d4)=3;cMpFR zd**QE=PZ6+{zWMC?zqh}QvH8!@`336ZU+xU?|1TgAbP*sl>@E!8&!Fr^?s+w|DQCt z-*diN96Cg2E_GK-^}ns*f${x~#Xc~;2gdin@B5w7I0!j@w<`xB$1h diff --git a/src/content/docs/browser-rendering/how-to/pdf-generation.mdx b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx new file mode 100644 index 000000000000000..4099e7644834be5 --- /dev/null +++ b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx @@ -0,0 +1,267 @@ +--- +pcx_content_type: how-to +title: Generate PDFs Using HTML and CSS +sidebar: + order: 1 +--- + +import { Aside } from "~/components"; + +As seen in the [Getting Started guide](https://developers.cloudflare.com/browser-rendering/get-started/screenshots/), Browser Rendering can be used to generate screenshots for any given URL. Alongside screenshots, we can also generate full PDF documents for a given webpage, and can also provide the webpage markup and style ourselves. + +## Prerequisites + +1. Use the `create-cloudflare` CLI to generate a new Hello World Cloudflare Worker script: + +```sh +npm create cloudflare@latest -- browser-worker +``` + +2. Install `@cloudflare/puppeteer`, allowing us to control the Browser Rendering instance: + +```sh +npm install @cloudflare/puppeteer --save-dev +``` + +3. Add our Browser Rendering binding to our new `wrangler.toml` configuration: + +```yaml +browser = { binding = "BROWSER" } +``` + +4. Replace the contents of `src/index.ts` (or `src/index.js` for JavaScript projects) with the following skeleton script: + +```ts +import puppeteer from "@cloudflare/puppeteer"; + +const generateDocument = (name: string) => {}; + +export default { + async fetch(request, env) { + const { searchParams } = new URL(request.url); + let name = searchParams.get("name"); + + if (!name) { + return new Response("Please provide a name using the ?name= parameter"); + } + + const browser = await puppeteer.launch(env.BROWSER); + const page = await browser.newPage(); + + // Step 1: Define HTML and CSS + const document = generateDocument(name); + + // Step 2: Send HTML and CSS to our browser + await page.setContent(document); + + // Step 3: Generate and return PDF + + return new Response(); + }, +}; +``` + +## Step One: Define HTML and CSS + +Rather than using Browser Rendering to navigate to a user-provided URL, here we’re going to generate a webpage manually and then provide that webpage to the Browser Rendering instance, allowing us to render any design we please. + +

+ +For this example, we’re going to take in user-provided content (via a `?name=` parameter), and have that name output in the final PDF document. + +To start, let’s fill out our `generateDocument` function with the following: + +```ts +const generateDocument = (name: string) => { + return ` + + + + + + + + +
+ This is to certify that + ${name} + has rendered a PDF using Cloudflare Workers +
+ + +`; +}; +``` + +This example HTML document should render a beige background imitating a certificate showing that the user-provided name has successfully rendered a PDF using Cloudflare Workers. + + + +## Step Two: Load HTML and CSS Into Browser + +Now that we have our fully-styled HTML document, we can take the contents and send it to our browser instance. We can create an empty page to store this document as follows: + +```ts +const browser = await puppeteer.launch(env.BROWSER); +const page = await browser.newPage(); +``` + +The [`page.setContent()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.setcontent.md) function can then be used to set the page’s HTML contents from a string, so we pass in our created document directly like so: + +```ts +await page.setContent(document); +``` + +## Step Three: Generate and Return PDF + +With our Browser Rendering instance now rendering our provided HTML and CSS, we can use the [`page.pdf()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.pdf.md) command to generate a PDF file and return it to the client. + +```ts +let pdf = page.pdf({ printBackground: true }); +``` + +The `page.pdf()` call supports a [number of options](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.pdfoptions.md), including setting the dimensions of the generated PDF to a specific paper size, setting specific margins, and allowing fully-transparent backgrounds. For now, we’re only overriding the `printBackground` option to allow our `body` background styles to show up. + +Now that we have our PDF data, it’s just a matter of returning it to the client in the `Response` with an `application/pdf` content type: + +```ts +return new Response(pdf, { + headers: { + "content-type": "application/pdf", + }, +}); +``` + +## Conclusion + +The full Worker script now looks as follows: + +```ts +import puppeteer from "@cloudflare/puppeteer"; + +const generateDocument = (name: string) => { + return ` + + + + + + + + +
+ This is to certify that + ${name} + has rendered a PDF using Cloudflare Workers +
+ + +`; +}; + +export default { + async fetch(request, env) { + const { searchParams } = new URL(request.url); + let name = searchParams.get("name"); + + if (!name) { + return new Response("Please provide a name using the ?name= parameter"); + } + + const browser = await puppeteer.launch(env.BROWSER); + const page = await browser.newPage(); + + // Step 1: Define HTML and CSS + const document = generateDocument(name); + + // // Step 2: Send HTML and CSS to our browser + await page.setContent(document); + + // // Step 3: Generate and return PDF + const pdf = await page.pdf({ printBackground: true }); + + return new Response(pdf, { + headers: { + "content-type": "application/pdf", + }, + }); + }, +}; +``` + +We can run this script to test it using Wrangler’s `--remote` flag: + +```sh +npx wrangler@latest dev --remote +``` + +With our script now running, we can pass in a `?name` parameter to the local URL (such as `http://localhost:8787/?name=Harley`) and we should see the following: + +![A screenshot of a generated PDF, with the author’s name shown in a mock certificate.](~/assets/images/browser-rendering/pdf-generation.png). + +--- + +Dynamically generating PDF documents solves a number of common use-cases, from invoicing customers to archiving documents to creating dynamic certificates (as seen in our simple example here). From 59543daa387c3e0af29767575145112a56533934 Mon Sep 17 00:00:00 2001 From: Jun Lee Date: Mon, 14 Oct 2024 16:12:51 +0100 Subject: [PATCH 2/3] Apply suggestions from code review part 1 Co-authored-by: hyperlint-ai[bot] <154288675+hyperlint-ai[bot]@users.noreply.github.com> --- .../how-to/pdf-generation.mdx | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/content/docs/browser-rendering/how-to/pdf-generation.mdx b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx index 4099e7644834be5..6e78f9677475283 100644 --- a/src/content/docs/browser-rendering/how-to/pdf-generation.mdx +++ b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx @@ -7,7 +7,7 @@ sidebar: import { Aside } from "~/components"; -As seen in the [Getting Started guide](https://developers.cloudflare.com/browser-rendering/get-started/screenshots/), Browser Rendering can be used to generate screenshots for any given URL. Alongside screenshots, we can also generate full PDF documents for a given webpage, and can also provide the webpage markup and style ourselves. +As seen in the [Getting Started guide](/browser-rendering/get-started/screenshots/), Browser Rendering can be used to generate screenshots for any given URL. Alongside screenshots, we can also generate full PDF documents for a given webpage, and can also provide the webpage markup and style ourselves. ## Prerequisites @@ -17,13 +17,13 @@ As seen in the [Getting Started guide](https://developers.cloudflare.com/browser npm create cloudflare@latest -- browser-worker ``` -2. Install `@cloudflare/puppeteer`, allowing us to control the Browser Rendering instance: +2. Install `@cloudflare/puppeteer`, which allows you to control the Browser Rendering instance: ```sh npm install @cloudflare/puppeteer --save-dev ``` -3. Add our Browser Rendering binding to our new `wrangler.toml` configuration: +3. Add our Browser Rendering binding to your new `wrangler.toml` configuration: ```yaml browser = { binding = "BROWSER" } @@ -61,20 +61,20 @@ export default { }; ``` -## Step One: Define HTML and CSS +## 1. Define HTML and CSS -Rather than using Browser Rendering to navigate to a user-provided URL, here we’re going to generate a webpage manually and then provide that webpage to the Browser Rendering instance, allowing us to render any design we please. +Rather than using Browser Rendering to navigate to a user-provided URL, manually generate a webpage, then provide that webpage to the Browser Rendering instance. This allows you to render any design you want. - +::: -For this example, we’re going to take in user-provided content (via a `?name=` parameter), and have that name output in the final PDF document. +For this example, we're going to take in user-provided content (via a '?name=' parameter), and have that name output in the final PDF document. -To start, let’s fill out our `generateDocument` function with the following: +To start, let's fill out our 'generateDocument' function with the following: ```ts const generateDocument = (name: string) => { @@ -127,40 +127,40 @@ const generateDocument = (name: string) => { This example HTML document should render a beige background imitating a certificate showing that the user-provided name has successfully rendered a PDF using Cloudflare Workers. - + yourself using tools like [D1](/d1/) or + [Workers KV](/kv/). +::: -## Step Two: Load HTML and CSS Into Browser +## 2. Load HTML and CSS Into Browser -Now that we have our fully-styled HTML document, we can take the contents and send it to our browser instance. We can create an empty page to store this document as follows: +Now that you have your fully styled HTML document, you can take the contents and send it to your browser instance. Create an empty page to store this document as follows: ```ts const browser = await puppeteer.launch(env.BROWSER); const page = await browser.newPage(); ``` -The [`page.setContent()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.setcontent.md) function can then be used to set the page’s HTML contents from a string, so we pass in our created document directly like so: +The [`page.setContent()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.setcontent.md) function can then be used to set the page's HTML contents from a string, so we pass in our created document directly like so: ```ts await page.setContent(document); ``` -## Step Three: Generate and Return PDF +## 3. Generate and Return PDF -With our Browser Rendering instance now rendering our provided HTML and CSS, we can use the [`page.pdf()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.pdf.md) command to generate a PDF file and return it to the client. +With your Browser Rendering instance now rendering our provided HTML and CSS, you can use the [`page.pdf()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.pdf.md) command to generate a PDF file and return it to the client. ```ts let pdf = page.pdf({ printBackground: true }); ``` -The `page.pdf()` call supports a [number of options](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.pdfoptions.md), including setting the dimensions of the generated PDF to a specific paper size, setting specific margins, and allowing fully-transparent backgrounds. For now, we’re only overriding the `printBackground` option to allow our `body` background styles to show up. +The `page.pdf()` call supports a [number of options](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.pdfoptions.md), including setting the dimensions of the generated PDF to a specific paper size, setting specific margins, and allowing fully-transparent backgrounds. For now, you are only overriding the `printBackground` option to allow your `body` background styles to show up. -Now that we have our PDF data, it’s just a matter of returning it to the client in the `Response` with an `application/pdf` content type: +Now that you have your PDF data, return it to the client in the `Response` with an `application/pdf` content type: ```ts return new Response(pdf, { @@ -252,16 +252,16 @@ export default { }; ``` -We can run this script to test it using Wrangler’s `--remote` flag: +You can run this script to test it using Wrangler’s `--remote` flag: ```sh npx wrangler@latest dev --remote ``` -With our script now running, we can pass in a `?name` parameter to the local URL (such as `http://localhost:8787/?name=Harley`) and we should see the following: +With your script now running, you can pass in a `?name` parameter to the local URL (such as `http://localhost:8787/?name=Harley`) and should see the following: -![A screenshot of a generated PDF, with the author’s name shown in a mock certificate.](~/assets/images/browser-rendering/pdf-generation.png). +![A screenshot of a generated PDF, with the author's name shown in a mock certificate.](~/assets/images/browser-rendering/pdf-generation.png). --- -Dynamically generating PDF documents solves a number of common use-cases, from invoicing customers to archiving documents to creating dynamic certificates (as seen in our simple example here). +Dynamically generating PDF documents solves a number of common use-cases, from invoicing customers to archiving documents to creating dynamic certificates (as seen in the simple example here). From ee0c4489676fb041fdc2ce72b338b953b3078750 Mon Sep 17 00:00:00 2001 From: Jun Lee Date: Mon, 14 Oct 2024 16:15:32 +0100 Subject: [PATCH 3/3] Apply suggestions from code review Changing our -> your. --- .../docs/browser-rendering/how-to/pdf-generation.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/content/docs/browser-rendering/how-to/pdf-generation.mdx b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx index 6e78f9677475283..ac7a32ce047579d 100644 --- a/src/content/docs/browser-rendering/how-to/pdf-generation.mdx +++ b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx @@ -7,7 +7,7 @@ sidebar: import { Aside } from "~/components"; -As seen in the [Getting Started guide](/browser-rendering/get-started/screenshots/), Browser Rendering can be used to generate screenshots for any given URL. Alongside screenshots, we can also generate full PDF documents for a given webpage, and can also provide the webpage markup and style ourselves. +As seen in the [Getting Started guide](/browser-rendering/get-started/screenshots/), Browser Rendering can be used to generate screenshots for any given URL. Alongside screenshots, you can also generate full PDF documents for a given webpage, and can also provide the webpage markup and style ourselves. ## Prerequisites @@ -23,7 +23,7 @@ npm create cloudflare@latest -- browser-worker npm install @cloudflare/puppeteer --save-dev ``` -3. Add our Browser Rendering binding to your new `wrangler.toml` configuration: +3. Add your Browser Rendering binding to your new `wrangler.toml` configuration: ```yaml browser = { binding = "BROWSER" } @@ -74,7 +74,7 @@ you'd like. For now we're using string interpolation, but this method is For this example, we're going to take in user-provided content (via a '?name=' parameter), and have that name output in the final PDF document. -To start, let's fill out our 'generateDocument' function with the following: +To start, let's fill out your 'generateDocument' function with the following: ```ts const generateDocument = (name: string) => { @@ -144,7 +144,7 @@ const browser = await puppeteer.launch(env.BROWSER); const page = await browser.newPage(); ``` -The [`page.setContent()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.setcontent.md) function can then be used to set the page's HTML contents from a string, so we pass in our created document directly like so: +The [`page.setContent()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.setcontent.md) function can then be used to set the page's HTML contents from a string, so you can pass in your created document directly like so: ```ts await page.setContent(document); @@ -152,7 +152,7 @@ await page.setContent(document); ## 3. Generate and Return PDF -With your Browser Rendering instance now rendering our provided HTML and CSS, you can use the [`page.pdf()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.pdf.md) command to generate a PDF file and return it to the client. +With your Browser Rendering instance now rendering your provided HTML and CSS, you can use the [`page.pdf()`](https://github.com/cloudflare/puppeteer/blob/main/docs/api/puppeteer.page.pdf.md) command to generate a PDF file and return it to the client. ```ts let pdf = page.pdf({ printBackground: true });