From 1607c77ee52cdfd300e46bcb94eb5a7dab3dba69 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 24 Jul 2026 12:26:24 -0400 Subject: [PATCH] M10.8: desktop CI lane (.forgejo/workflows/desktop.yml) + app-icon source Separate workflow (not ci.yml) so the ~20-40min Rust/AppImage build only runs on desktop/** changes, not every backend/frontend push. Builds on the ci-tauri:1.97 image: frontend build -> `cargo tauri icon app-icon.png` (from a committed 1024px source PNG, sidestepping SVG-input questions) -> cargo fmt --check -> clippy -D warnings -> cargo test -> `cargo tauri build` (deb + AppImage). APPIMAGE_EXTRACT_AND_RUN=1 for FUSE-less CI containers. Verifies the M10.2 scaffold end-to-end and is the foundation for the integrated-AppImage work (task 2013). Also updates ci-requirements.md with the desktop lane. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01FRgehjoz7Yv8LkUfADxACm --- .forgejo/workflows/desktop.yml | 68 +++++++++++++++++++++++++++++++++ ci-requirements.md | 19 +++++++++ desktop/src-tauri/app-icon.png | Bin 0 -> 33933 bytes 3 files changed, 87 insertions(+) create mode 100644 .forgejo/workflows/desktop.yml create mode 100644 desktop/src-tauri/app-icon.png diff --git a/.forgejo/workflows/desktop.yml b/.forgejo/workflows/desktop.yml new file mode 100644 index 0000000..0c6d9f6 --- /dev/null +++ b/.forgejo/workflows/desktop.yml @@ -0,0 +1,68 @@ +# Tauri desktop (Linux) build — SEPARATE from ci.yml on purpose: this is a heavy +# Rust + AppImage build (~20-40 min) that should NOT run on backend/frontend-only +# pushes. Scoped to desktop/** (+ this file). Produces the .deb and .AppImage. +# +# Toolchain comes from the ci-tauri image (Rust + Node + WebKitGTK 4.1 + tauri-cli); +# runs-on is just a registered scheduling label (Label Model B), not a per-purpose +# runner. The frontend is built here because tauri's generate_context! embeds it. +name: Desktop (Tauri) + +on: + push: + branches: [dev, main] + tags: ["v*"] + paths: + - "desktop/**" + - ".forgejo/workflows/desktop.yml" + workflow_dispatch: + +concurrency: + group: desktop-${{ github.ref }} + cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/') }} + +permissions: + contents: read + +jobs: + build: + name: Tauri desktop (Linux) + if: github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') + runs-on: python-ci + container: + image: git.fabledsword.com/bvandeusen/ci-tauri:1.97 + env: + # AppImage tooling (linuxdeploy) FUSE-mounts itself by default; CI containers + # have no /dev/fuse, so tell it to extract-and-run instead. Without this the + # AppImage bundle step fails with a FUSE error. + APPIMAGE_EXTRACT_AND_RUN: "1" + steps: + - uses: actions/checkout@v6 + + # tauri's generate_context! embeds the built frontend at compile time, so the + # frontend must exist before any cargo compile (clippy/test/build), not just + # at bundle time. + - name: Build the shared frontend + run: npm ci && npm run build + working-directory: frontend + + # Generate the platform icon set from the committed 1024px source PNG. + - name: Generate app icons + run: cargo tauri icon app-icon.png + working-directory: desktop/src-tauri + + - name: Rust format check + run: cargo fmt --check + working-directory: desktop/src-tauri + + - name: Clippy + run: cargo clippy --all-targets -- -D warnings + working-directory: desktop/src-tauri + + - name: Test + run: cargo test + working-directory: desktop/src-tauri + + # Frontend already built above; skip the beforeBuildCommand rebuild. + - name: Tauri build (deb + AppImage) + run: cargo tauri build --config '{"build":{"beforeBuildCommand":""}}' + working-directory: desktop/src-tauri diff --git a/ci-requirements.md b/ci-requirements.md index cdc4a94..641d06d 100644 --- a/ci-requirements.md +++ b/ci-requirements.md @@ -45,3 +45,22 @@ entirely on `ci-python:3.14`. (family rule 46). - The production runtime `Dockerfile` tracks python:3.12 so test results stay representative of the deployed image. + +## Desktop (Tauri) lane — separate workflow + +The Tauri desktop client (`desktop/`) builds in its own workflow, +`.forgejo/workflows/desktop.yml`, NOT in `ci.yml` — it's a heavy Rust + AppImage +build (~20–40 min) that should only run on `desktop/**` changes, not on every +backend/frontend push. + +- **Image:** `git.fabledsword.com/bvandeusen/ci-tauri:1.97` (Rust + Node + + WebKitGTK 4.1 + Tauri v2 Linux deps + `tauri-cli`). Selected via + `container.image`; `runs-on: python-ci` is only a scheduling label. +- **Steps:** build the shared frontend (embedded by `generate_context!`) → + `cargo tauri icon app-icon.png` (platform icon set from the committed 1024px + source) → `cargo fmt --check` → `cargo clippy -D warnings` → `cargo test` → + `cargo tauri build` (produces `.deb` + `.AppImage`). +- **`APPIMAGE_EXTRACT_AND_RUN=1`** is set: AppImage tooling FUSE-mounts by default + and CI containers have no `/dev/fuse`. +- No Postgres lane (unchanged): the desktop app's local store + sync behavior is + verified on the operator's machine, not in CI. diff --git a/desktop/src-tauri/app-icon.png b/desktop/src-tauri/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d62b0a8d178413b447b5a9a0159f922e8fb7e2ad GIT binary patch literal 33933 zcmZ5|2UJu^&~5`FDk_Tt29m;}B3Y7TRFY)L85ShxoSAW56+wo@07w=jCy|_S1rZR2 zARu7?hn$9-nVHuYcmMyrcRZeP?(OQX{;KM$>M%an)>J-o>hdW7z?u6h3OWEBga14R zP8^3HC{~`w@Z-3(nz8~QBY)EBvtI#l1>9G-qZg30ggY6ZX=r|(G+tf4JvLvM7xz2s z75Q^_e}8zaxAUCGL;B{%k2lgYTq5w{9q7lr{8jI636nkV{B6s0iAG78f-2&-`!!Mz z{=Dk&vCL zeN7Lvwl#`e#WV{$UqzLhM;XO=7euN!d%G36zAqC~E{IAB@@|*mZdqR#&t&QFQdp6( zoT-}^V5*O?e*2CFIB~bCyua;>CHoibTXN&|G=;qO zA-S`pIDPr~9VgxEu+3(CYb^A4bMIE8o)wy5g_}4E2kO0wj-b|Pc1hI77=BgV5>Xu& z4SG{=5&np;rW~y%w0-~`dzRs>a#yWxgp^k^Ys}>KXt-33cSA<;%7l2YzR-i3MC}BC z9{wt>jQu+GRL%P1;`;0LmYB)(Bz(HlJ9hd+&h!U0(E#v<=Z62#rKaL;WsSjaC#}bE z;w@vh*ml!B&^5n-?ikFt$EUzh$Muh+@j)S7o{m#hygET43Y&2RW&rqXZ|Q_cc#SgA zr$*b6)D4?mLr3UFQ*@?!lOON>4$_vRaAhQXTU${+XC@DGi~yG2P@y@Ymq-cH3R&;d zr#dU`$EoZILketjmf2^GJ&6tU_}( zCtkQZ#-Eqj^y6phzsk;20KVm~8qNmW(e!zh5fg1SNkb~?#V zOlM3;Vywz-S~QrB`I5;Sh~LOh_C@B=*u;5b3DH!>m^`nr4F-Vr)5cv|9a5RMiLwhR zLs^eU%_qe3;<$IO(egwvH#mNl7h%S#OQbNzkX;o_%xkm&5Y#HZUdOMq?~$OwZodD$ z-v5%m>N)UXZk;CG*=O?0O1M&(#rpuasj6PHV<7E#Lkef;@0UC21f(kPPdAf_F>!?7 zwm5**gDGeB9`PFMxmsOLi`Sf??g|AWn*eDLFOS(Q#f~F+a2nJM4`kq{@ zMW{#I+QXt_AgR=5(A69_B2G$om`TMjM2o%#;Dew}^MyqEl@8st6h^Hf)YseI{Kvqz z;jd?y+1aCJ@;Q3dIIVN99s_7a-Fk_Md(|=H)l1K5WMgz5+F;dBg7}!9iDIWk66R^V zHH%+_cbtZf_4*BGC>KYgR87K)DXIA}jWiuw1VGb>);UjH;_lT_#LOxxME|6OR@60T zFsj#CjgGSnoj9K^Y<1?Ojiml;>eA4chCpt z!7AS~zXH>ef}X99Nqt!5X6mPqnTGW+#2CERwS;=I?bfSC&jKHRhclGGdTQU7IV1nz zI>$Oz>3#oGNM(}uA}%^91-TnGkHoo*_}kBuv|~Zq7bQQ}AhY())DC(%26|lP0Tqm} zcsm8NL@!cQCX9`TNsIS^_Pq@8)6!SP@q-+_{&56ah~ZbS5MG_Sz@Z9as@OJkhn$$7 z=2UUnNn;H30;@|DAZ^BL|KRJIT1QIVig0G_KltCk_onWx$8lmccthSp3V=RnqhAx3 zs2M8@8A-ujPVTw}=B%#EiF!OJl?vnLsF&ubQQe^dz+qmBl4N~Te5}mtU`*f*;WX_% z(EUi0FdFcOaDscdihy@DJM`(1D``9$_3x0V6!l701l@Nq=9Rv_mMcF5ro#u76fEaS zkicD?Ih6M&pX-LYOROYFK~Fxt0ehqH!hHD}^;kedB21h^>@|T7!Y_o$dW~{zBT%9K zwqVfBl=?h+0t}CKV?H@w<|bx`hbYcB!2VblX(cjKEyK1NqTdis%xZ$}EKR}>pF5hJ zl{4Y&+_(z>q>0J)_J5NbAx}|R3gGDNv_QAr`uJI1X7d!%J%u`1j(s&`nmNh361`Gi zYQKz^Z9iAmdQCVjd>uG&ewGp^skHC8##n#wu>_DGN8)rzEz^eV0jOo=bPcFeQyVi) zrC8z`COp9INT*Tdh-fjdpskm#2LzE@g&Lq6UwIHcR<*{+Jv-h(&vS(81h0~Jb1~mY zDS4-kFU|KPF!|oy^{7>Zqn?K&#i&LA&P{j|8*{nX$Zu=R^o7wPJt&J0@!ov#f{qjt zvD+U$$Ag2gqm2_(=-n;7cGfH3&xZJp&Xu2~kf*(bEC0E`66LRmQB&KY2EYo_F#K&T zk8xzj(*AeT#~_V*YO!KFdJ{v|j5tgPcQ``4N!oGdHM!&C8kf7u;HZ$DUdK7WAm&4y z$c!r5B>e|CZ#Y9LR<|>b7q$M$G|EH5FOjxQqW5c2RI!s!OEw<~`V}U2viG~gs7Rgn z>Q?_qm#Tkukse?WEc3Ry$Jraqfe%(Kg9g^t+z*&~&Td*kT(!{p!}BCy8d@!i!m4*3 zHmC?y{cweGP!@hKW`ifzRc`fNFKh03iYAV>+6vxFZMu!g9OM_C&}g^ouMpYQo^Is# z3Ddo}82#irFgo^G+%>?(CU33LyE)@Rh7820A_l+FX;&bLx{!N~=dxi|GdsS0+ron-?$Soq?Tny&SJDTWNAW zN|o1>Rlo=Ew20koyq^)3!kNRLo75XRFG7h96bqWna;+XZ zlvi*`SSf~GY10L2MI8QXC_O^E39?3D~ilz?>s!@LDO`48YV7(um0{@ z@AvE}{U@NQKWNKVZR(Muvz!SRg`4R#fFPCs%J9c59xak>M8JYNNf!1L$+esy`6i`t zJ)!DwqL^1d0xw+A^;mUH~$Kj;Y&j{3y{ho?f$GXcJ@P z=;`TD9~z<8$b0(xC~nm5SF#?O%wx)K#(|WU=d6ir{V&YwXRwGvq;0t-M|?SRPwKb; z4=%=l3*3JEZjnY{S+#SK!@2`6cMfXP)$>IuLhJ1Kho7f7cjYP32bZe=LwqEy^m+ zl@c9%dii2q*4y=R`jT~vNeGO5u*q2X=FgwWi4Cu|I zpaV-q6gTemCkU)wZu-eg)4(Iz_lz@rJOp+>r;^Rly2Cfp&^WwXSjZqMR^$A+UqYNT z&?N`EZe@0TAJFwOe+PBbDX)T}>1&ZjbfolFTXmM=YuRo$%#hSo_OtwyJu5>^m`vrnw@%MDLUWCNdol!rQ>)pFs{S zS=*uQ&%qhToji|CG|RbJFbA%$AS?r_;+`pI989*lS54IAJi^d{b=SBpKP}DBE6UQp z)OQe);9qu2+RqPJ=G;&J?CS&m_J04WHTuvI6A*NyLwABsv#yfCnZ{z1drCBmbHK`H z@XN2n0T~LIm`3b=>M?)p{`~Af$^4hEMUUbXHCOm?$h%>sE{U*^y=@|yPf}a?IJhT% zTDGt!yfG?#tTz;@msY4gr4-h+ew{Uk|K-XJ)(haYxml6 z_0y2JBvq7g6oOvFny9FvssY3U(Go^)z4p6TTZUH)&FLG6D$f(q}dcH`7roSTaLRmGR|$B{K!Gr6(Y5Axk_5J zFDk~`_?N4weePt@GAjusyY?szFPxBX2<+=s(q#Xz3xhc=Z8}ORCp(6VHi+-nxU|AOUsycn3)v_UVlWV%N=4{F4OfPgZfZ>|v_r=R_<77u_zz4~O zv6m(llvgYd!W)#D502d0fr{vuw?;y&>hOS%8N4XC9BBGJz~u<1rqkwPz5eUs8H(jo z5JFZet#91RF4JgAIBHkg+sjeeyrI2gP8uURmkW*dQ<>*+g+IjMyMPl>4r1golM$sz z$7;pxxx9DcN=Rt{`2}<-Vgfej@_t%IF!kvugQxyy%u>8+BshYOoD|GV=n1#J;i*_@ zZ@TK0U8B-i)7KdSns*o-@{>o zKhe~d%q-xdL>de?vN$Sj1TA%%wbjM=O_9});vakuD7s%9UO!5HJ_#%(9RA|@lY|yV zI;f6Yh@*mZsSn~^R*$6ZA(=*IbSZEg@QwVeTB33=bFskiW1Tb6IKkBqxk~$RJ^E$=nLclNi4rHj@%nqBze4g& zkaan#()19%(B>rSN`z$_FoJthG%1jRpPxfY68Za43|gjMTO=*MpxQ{B6-nMl)N5ZW z62}kwD*Mx}i(GBO>>mOIYXVpGWAG*azIeLHnvr-sETqTO{M(nKy4Zc?harbG&bk8D z@_=tw_1_GCDW62&=5HV_k+=#MRpArZ~T8b?8c*WICml zSKi{_5m8T2)YRy1#7V(t4y_ZmQ4Fa(YwdTSfCH6or&3Kw%d73sKdv$xuPO#+(DxG> zkK#PZ*wATap)hdS6tdQ27Ei`dU7*mo7?c98H)icNJUdcDRtKIqS^eQZli2CBGmcOi zU^7$Y=5t_d`jf9q+0Ui!rVi;kBqZo8Dwy!=ydxFlz8;8o?jG~eWCZgy_AAR^=8&l+ z)4nuvv)+a==$^GX8FeIea|l!!3?-yVF1jL4AUOXz}C4AuNwmj%qC+ zDhLTpnRlpRhndfuLhwyuaXG>oXzzhn%${ruGoz^29)>HX2PzYVpM)<|*6JO*GYF~i;`WYwA8lN1uF0fll(aB2tJa=hk@ z=lS$01aCF0(HsS|)tJjA3DMPm_V%qen85q5wCf2-xaQ=)W-jgs49nY@@yZvtz}G=V ze}(-9Z^zTfh#7WuS5Q}Kn54nQ`H|fh;XedNP)D5enBno~#N(+SCn)6G_Y_Ns2=z4` zI*Q;GX)hxNyUy{Nd=$eH7J{J)s7I9Oo{~=}W_o8koDghkC0ocmKjhK*4=cs(XXg-d zup(uC-%6)Gc~n~{VOC_aEf9y@;3YTBm+yzrfQ;6&ay%SeQnO)4&*$rUY?SlFw>sUy z-!IpZJmJ7yYLuV-_AoQ=z18M!%su)NFHKgY>zN0#4V&K|ZNbf=q_|V)pOepi@s51{ z{ruJ-Fu-!84r!H=?ElgIvwuo3wS3kk(!Di;=T%J%vc-M&uiPDh^Mz?@qv zvG-Rgv9XV30%^?NKk1VG`A8lNPBn3drr);*C z2FqKG#7c$cVd|BWi16P7QD%*9lg3nNX^G53#2}LLgoXOUB?@^?WJHj5{{4&%_A(Gj zh@vq=)*GNK_4^B&T%cl%d;!To$=uyG1svAIyCR5suitnTB$65j zU6U!SIfz%m(Tm|BSPJ8m7-aUMjSNN3;1wHCi^K;TQeY*&XbG0 zMr#hJFJ6wa(?JjdtOfZo17cnY4QGCX-{#c&ha2g+^^iC6*PX=%#k~BGr~#73nvSj+ z^csxFm+ntG5#>=V^L4$fNFPk!6OPfr$@BD< z^*s14BKI~+#E($HmPZ-%t(xy|i?Miy+_1L3W$ks#+9zaxoOd~Lj)0k4er{ARjjv;* z&o@*!UDR1(8;a><=HS2h)pL!SzCO$bvcqhv1Sos^yp5p}$L84)$02(#&0tw2+>(62 zaV^_!$5)evV&^Z4XVK#ajqig=_9p&@%>z;NaW0*nEiLqhvNv08={mB>EWm-?@!_l$ zKkg)$_!Jtd)hsvq60b`h4abHE;iqJ1cXVPm70rC_W3pxW@s5UKlj$0^a6eUA1Wvsy zM_?=l@9vkmI~PS?xkB8=gz(fj*fe`rOa~AuSfcBi#wbA<2h#HIg#r?ps24#d?r=AF z89EE>W3x^Hi%qyOj4}~6;1j?x!yFB*(oN}h5Y(I+mP5~8E7X$PHg_Uah8`QFgE0(o z7v`_e@o@(Tu`z7Yk(2P|sAPN=$`y+vy$$M}may15WYG#tnxp{Q5fJ=SReO>2?kE%| zX|1BmVt0IelI`tezue!Gmkdu*0;>|p8CLY6r0wv^hRQHnvatTK!}aLtzG9|hfaw{O zXZrMWlHQ$c$t}CvrX-U1w63>5Jm9CW*Wo{E2_<%!LKNsH*Px}T{g#Uu+{5fSF=s9< z2pd=P;hAmC$si2Vm+%9%p+j@s=$LwOz;oq&F6#TJE8tea1c+RfK8ZtiNK zO-Y$FwCH)k6}qwQ0MfQ0c7j@jA948XF!7c+LfLLAT|YA=X;p5j%A-3G&Q})k^^FPL z%J;hsgQC2o*`5o8c(y)fSsrZ)^xhRX6N&wC)OdL6?lQx@jHg}=$rqmo?755JQDN$k z@x1$GW{Uw3edFD{au}^tw^+=ld7)QN7|*xj)J)>++0-2i^&X6)Z@p7`&5NWodQ@nAGPz}YmR(E8FOS|mSVOqR#RfDL z?Dm`lrK5YOzEq>bIK6u7l2cZC@F-*nYGK6`NfvJ`rDxy$E17I?f?{kH^JU(i5`23B z4Q7{9v${e=*{_Y?l-+&K&`1u$QUNoVGI7cNh|`m^T5Fzir%mC=S_tchLqVvT#~z0f1ni{G%0ntWXEIP0w&kBkuzWvyGZ`P zLtqo*UCyg1eRm2uVp#8^hr3<^MQRq@gI9~)4!gI)Iw{b>8?WGF&nZIqct9$9R5E^W zJQ2UEebm#c=~*y3xkD;=x7qlZMTUNDn>=mE3U;r_F;ZONXz*zD*^^72#>%B=HnRN& zAagZ2Hj+}5)J4xIW#^{MyOaE3$mu~=)DD(%(^!kHH2&Q$FS#juo4@_fYUY@HYIaDh6qFlYwlTW^U1IoIVVC~`9C4(oB`n*E9EsyhI*BYH|%R&ll% z63&6|Z)WM_%^?NkBs=@RAy8zR*Q$YI@lqDoKP8ePV3!k-QfYYS6 zh1eLeAn5*duI0>1 z$PB)dpF2jmT8_JU59A=LfO3!7ut@2yr6MY&AlWEnZ|a6QM)Z{^0v^#?cu)=e6UlTXY0=E5{62iM3nq642SDH0}1T=U&uHYjV6=C z?Zv7FM!~;*#GYXaOtN)5een`lxP$nfi-jdLR~{dPLG)fSIO>fQ9;HfBrqBd>x zZMpQ?d>;V^Q5l>BTZ7{5WAZXb2#yi*PNgBw=|;?+fXrYD5Q)I+YWA^TQ($K+hqm)1 zSornCv!sP>XRAv2GX1|#q)9!<^r{zn?m{p5S4`CUzU90{_s!TXW$E=ld+VVYIH4H~ z#2fM{ClVVrJ}z~_^GcW*(I$bzZ#sL;(-ft*JYoHqa{-zCdKnMje*E_9)=O|)MW{)k zSs6DzJqkLHWAu-6oKj5tu8GRL>2+M$S)TbxCycp-8wDD!X^CHMicN zDUQ63QpTuN#3Jnx{RYDD2giW#TKmdY0Y#2DobH1i^Ped1`|}nby4lEc;jV^=O^_Gm zJHi4!{B?cAf7GOHesNoW*Xk?&N~zJ@3QPL6zdEFkC{JFYZhBgxruMXA_Pmoq-OuqM zA`KcTJ2>$84ez>%dB5jUoocE5FO<#asww3mpkPPxdPC5YpK}b(hKh$vk#H;HsO0g8 z7Ukg_+qG$Lk!ne_7V`rXua_JzSgJ8-^)An!`gWjYUM;w4Au#@sx^$jS9W*dE8$IAfwr~J*s>oki~^ws znAC$i?@ohnuMw#mncYs|M2L_?&skkkyD+&RPZbrf+n+E<74Q+55$P@=tGhojPJX? z4Q3%>&6f49?Qr5V&*AK5+9ndh#Sd%kU`RgoDJlvK!Bo~+-xMnrjs=32kiZ1B&axKs z)2Oet&x%i$3v`u)Jb#y5m`S9UBmQYucNi$ak=~<66Tco<)E>#xh&DyPdi$8*lwNaBtJ}0!&(KaD5n0Lld33J4_HJ zSEB0pS`LadghZ@!un&h`hO-|Qh14vO)!7=jG@)-cjpjfT2M!VC4p69nY$f=EjWBd! zw_1Et@AtS|URO2b#LpW}2YeFU^Eu%mR!gT;U}?@;Ea(OVFWiK69Of*0^lrPkuxav` z@0FHRqIm?0Xj1=-xc*G}a8=mbWk|3znHY)1mbh*G=@09O1O%fT$w@g$v0Bu|w7bG# z>Y`2vX*f;~eQ%(}jtc15B~m4M;AWqd`x*vV! z(#PIBdqJ;{J^~=E9`c|S(>9A<(AdpwmUUiWC5E)ScfFMplOkwVm>$HGF^MFr<$G}0 z(%b$ir9Yh*`%8Z;B9IFqkT=0<?SpZb%UJ_OlpfMlzet0vx%px9rwm)BxG1qh zZu2}W4MtOr2TUvtuNuN?M>?1;+q#xa<($6kVx&7Gda_?QFNG0!_#q%iw&gM$M8Ce2 z@|r`e$hpz~teb^p(W$f`gMMKu(4`Isv@cmvsV;@$UYlDABlF7`qsAIDM)|F804)r& zR?{VQP5lcU(|^{Idn&{VQ%P*9IVo?UAKw;+GftY;sm{GSJ+){sJGT;5p}$qXkGvmx zl(FpZLkXB3!vP5Pc~;zk<=z&{X_d8|)cIhWEhX$JXhIU#MA%uj$oTjhr9tMUx2zp4 z59D5Qh4ziBoqY9bepC1uAgI9(c4}4Ju%Eo{eGCkpeO>H6rcDSQ^3EBh#(?fTXdw@Q zXBcI5^;j5>?uyMHxso?-$8Kq%w7B#bS^7(lfd&nvkFV9k5}JzGPX7cx=JxXX11m|Q zItAJhVpP@oZj$?p)|*Qh{SNN}qk+Ku{%JMu0*ePT2a=*f|Fzm3AfT$>-A1K(v)>!K ziJrHo1<+q6$~gU%Uqr=Sdf_ySYU%9?{jGne;-j|jJ^h{sGNwQtj-35Q`T!O7iFI9a z)cwQ3-*B0bhKG{n{+kNTb4G9f$Z;cDme*~te_CMd+o5>v;l+#J^@z!$NXvw+a_T?Y zlNY_^>mM>UnbVjZKLMb^PRlUlRvq59{DcwTFZzQ>&Vp$)c00~7cP_SlboK8-rrtHC*_o#pZdFTc5QTGzAB93=|h(r%^kG zp)2~-3Mc;!IBjJ_&)g*fir7Vx`*7;Y;QAO1xN#rWR?9D5D6%l$?DNyo!ffStl;KqK zgkV{Fo>C9n5X1uu&?p$g!$aO5Mz@1~N%cRoSLTI&)V=#*6E5@2$?Q)GdDlJ0V`viz z2{zA7g|`*8wcakbi`7R8b1p~baiss{boK@2g5zZnakNV5-&--8+uh6Zr8f^-4^tCm zVjheQWa?)*idm;G#aH3F<0xi3UWfVnPG2<2SUMyfA5f3hIN5KOGjj}le}ZW9!_;F3 zHCe-ed%{#xSWxR6L-Sf8a$I2bcBzF`0HL`Y| z&`m>XL0I#o^}#Ti3-}e|{apSsINM>j>-`s9jdZWw$emFV{jZ6`D_!nwcJ4ku)qZM! zKeD~k#=e(7g`W5O1Rl`c29@+F3sr7UCbAp7$|%lOA6d?+l(Hr+c8W~gEU z;e^_LR_lkq+S+`A2yhr!6L)*&(c-pQcn3){TkT(GrJpjlNBvB>H_eYZhJNxp)N+zV zl1)g+*lvdmcL_UU860aeco$RII?m;_$2h_JYT3~8-4DEq{5*7fHWt4{!+4LHB0Qeo zG^0doa=;EUSR_-d5B1(w81i9Dtl#QSh8Q=9v@S5(e%bim{6DQe`;j}!Q6%~53MqXg z;3cR*@?AKG*4tkG%|8O(R^%s>8P%Zww&e+#8|UPu=lz}wk3f9jMg?Ham>ME)&=U0g zYhLc$T#}uF8A1|P4rq+Wuc)ucHzgbL3H14~7FY;{vdf>m-pYZYL;Q9o8EK}yz0~*^ zpKM0$F-QSZZTBSzZCU-~J^Ifu4LGXpa~g~gEj^qKlz5k;Ig~V&Mhi~?^w}$La?5W< ziQ^w-l|SC8yCGIAVCd*M_{my>s;Le^W#Fk2r{;^-#*cQklnTuC-_M)meW_`L(Q}Uz z!b64jL%g6+f5k~)4--^Nj?BKi_|c!@wKFrAflQ9B&`&;)lhw1^X{@|%O>~MQ^Hn%~ z%Wsc7M_|*;=7CFcWLLq#)YhMzOcXGr{@Xcl9A3nQ`4?Rwa*N5+B}aWkMn+a< zpHW^x%m3|fX$ju_rcjaoANFu|8W89T(@HCysoGA%3Bco~0shZYu}XaB*| z6Ucf-caV1&V^fS zw-c;G($zRIh;$%R=#*ZNDj4XGzoP8?Mc@}}|eFK!2vjS|RNzD(r8 zydW{i30bq(Kp7P>l|NQ~>bdMR*0>a9*Q$?5mn{sz41X;xcjlp}I7J#OByxwq{|$RZ zZ$GjrZf0wmK$$aRC#p=5){meXcz}5=bs+cQnzE(V+lsfJu2o_7fuFpoI+LK-(Q@ogK{d$+#eoA153!vvdX%j7S-eWTsk zL#52hNRd{KjAE=yt(KpkJmsYPcDt4~O^>l@>~o(t6M$FU;RwE~M$OF%Z~I3R-q5QZ zM2K{<@XjZO`EjXhX8ms?J@bN!S*z-8@nXX+T#=ajjh&@!mYe>6Z~-GW%CpW)s0G~-2;xae`N`k)Hd!Q=T|1t7xvt2@YhwQZ z4x-3Jx_%{k$Kd{T7M@t+`tsU;6TL)ALVU_+(CviuFaZ<&HkKVGyJS5`!EqF6ZxEol zl?j-O%rIojHyW)SA&{v4QZwTmh?7uM4pA}lSKMFh3*3?T74{~P$oyfdLX!P| zVJ}8&zZEfm090>FFnNYlsq_I4B}74`p;Gc$7yrDM`oN#nj`ea5=q{(U#d^7fd?MD&gQ3h4%LG8@-txkcPO5- zFiKu~2Z67bp|A&G=M7yO&EMrbT0Z{<^dEw7uU1UKPyA}(Eu zye+1ewVaZ|vS=9RnCO*fKh|e{?O4uC(3Sx_rBZ~W3L!E7yr}E3_#s0<^1@qK-W3sL zp0QAYG?vDFpxxZI7M^jvy$pv-w)q@rJDgRwFl5Mhg-g#n%%=_lhj89#;GEgq?QJB> zbF2>Mr4YZA+YT4a99sCp^N?`3DQe_nlg)9KT|oB~uK$gVRn)De8fGJ5nF}y?g>7Ae zyG4-qta_IJH{j(=l>G-c&2GF)I5;>9X&IdW6X1s&O${ZMn`H;%H;nc*7ISCr=0;wj zW6= zx*22BCfvqnLi|LrbjRan#et>y{y?93maB=O=ykCI?(?VhQ=crrayt?N)|4Kfq*_8& zdHYE-w`R4IAZK3@7+PHm@~{e9LvSV#532`DQaXesa#I3Js0>7GYs*g=Er;5R^it30Lk*8ZKaTVo8q#}rYxcj07t`sCaVmPP z9V&K~#aDqE4R1yRt2-Kuyq-mVKKaS!@$=>&GY={3Nd@rN9x#i4Nc*?2&oenH>|?SV z@4-|*tA143+fxIkmvFw+^%E|zvZtyGtpDg_Ct)x4I#D?I?3>yf=Z|(~KUke*jgF7! zEj>VuMTFa`MTlrHn-0jy_^amJw9Uhw2D}I_&~nT=DGM{oV9(52!;qh>Kx+FTctnLj zap&J$|H-^ux;4Vq;6YO2ub8(ZB_+g@mY}u>9`d#1>EqjnkGx#_F0~s_sH2_&s|M)R z@&3P}Uid?Q7davmg6Xa2?O^-v=F2>8fb~ zdJloff>nlINYcPg``>ggmi+(6y^kQA!A9QF5Q-*yKIta9_H5PZ-_U!o{tNeJR$d4>^8X2c#a0I~PFYXyh}p&>p5adKum*ba4!e%JrebT(jKP1a04x*u_DtlX_Xn!d zAiy+ofslg%uTKKF1p>EClGi2+Om@iwC^gT6v2A|)DtPoMKn@UwdpGvdagSSdLR|fi z$}7)#Mcd)yX{C@r<4YlnG=>y@li%J}Fx$)779h)ch~QnxrSzz+Trsi|VHVjn>F7u- z$?UYm8nL=oO?M#cGDoryU8GS-f$%>JpxqPxj7MU`d^Kr3_RMnqZfd;xnlh><+`cX= zf0Bv(Mr$kyKUBON;eTj5xw$i3lqX@Z&X0b%;|#hb5G2~Z8a0=^yY=`--zyv9f`ch? zHo0o5b4WUXr&!S#QAxJ7T2w6liMz^Llvr4~x#(a}O~+rL-@X7@ntVeR0}?~tf{dZc z!5JE;mqcQ=uJq1@8oaQj%Q*F#3$bHRM|$M~v*&Wr_F+nXbw%~WgQqgjhP_9D1FP%4 z^LbF1He4Q@p66n)Bvv`TtP!VQUjoMSuUQPz_Kr}9>a_3Zc8K8~xn z8V*==R!2E^M2#RMC`jYFoeu|xhj-0CCvE*aYHPes7dRHtD<3tnAqQ=bn{rbQC zLitI z6j|J*sK(wZ{tqTQc?#+~BFBC|ZfBJ7`|(l6 zE&CUqkq)EjH>r`_`!7g#KljEJYu!=Q_1Z`@CT!=X`S1cAxXd-D%%x z!YrYUDs_k<;#4x;f*Sn}^4!Js-?zE)KfXW6>nQl)Pb3Ju3Dy}_9Xps-o!_Zhk&(ic zUnu@24Q~rxMXDyp{(WA*CH1~LwOXAvCjQkOWPzHxbN+mc;6+?*tkU6bp4ZOK_af;m zEwznm+>o#bmQtP%(*9E;qSm0q!MEqVJ6L;uIFs#-`IR@QH&U*QO-=Ua!EsJFXKiOO z1s5%!59TH7a)msq%d?G`-Oo4!)7Fu~$d9{5yCv6f_th5BzXM*bl5MnJ%Ud_R5B`2?DFCFKhok6CE3@b0@!!d~Y^7WxsVJP8 zY(%>6kiWmYY>eWPf2)xy=D{X^YNSHBU_5E67rah_EbvUFcBk=BEpFBlzbIV3A;9Ag z{;oMSF~&H(!VbQqS_%T`rhN_i#LBF<(&}$ngzBgA$@QW1a#b9@JiDLBXQZE&e6w3( z>JgRbEU$El{E-INy)?*HPeMPr-hMjfO~}u6a#&(Zo-ddCLuR8AvB>8J+D4*WWE`ep>yXSfvfnlq!<*LaSj!&(~1 zTZz5jnyzbx$BWh`k&VM7wX^UIs)IzH?cNQ1xI1TVfn%3 zKMuOW`xpCOANTi}60%p?c+DmL*>Piep^K|?!`rUw#UpIksg`<+(G5^mJhS)ZSQ;Vr zni+B28OtkqUgIyNN!aeZL0O_*F1X?2cRFNS_Xc6hHvg5`W%Nr}xs~N6*VE^pDxG28;VPA1WL-SWqh z#6o7dZSY2DN<{D#a~N_Lf&2kXK+&aSb;{mJnW#7rC0yJFtw*(lkK?#Q(S?i}a|#of{q7^Qe@$+cy^ zE1T)OTqUk^;|nFM?3Wec4v}Km)=djMn0S&qU7XHq-7+;VZ4}=)Z$QCoE+Z%gx{(_OuGZ5v z;VCI1r7tekD*9+dWDUr)s5%<^`it%a3)}WK$-KPl?mi&*U+c8ntIlohK7*-p`PJ7Q z3O}@uw%1%2Cp&H<{;3>Wpz1Gp15Co@RQGX%!sxkq4dMI4HYVOHJq_4RM`Y%~>dqu| zZt!|j{mZ)#F6q61KW3GMx<+c95u`Q-Vc zMr@M9rNWQxqY)-tK*f?;P|yx^*TBj1xpY1aUzX}Mt2Kf*rWpBbP!#fx<-NhWqr#9{ z6S!|ai4dYXIyQFr;}^AZmD1ZS$Lz=zMXj@@#4XSV6$ZF{!RvQX0tZ`od4j3j&!%}` z*|EqxX}|H{yThf#N~OB(&u@Oj<|O<%T;akV;2yD)qtBp~bfb$(<&Tl=@U28796Vv@ zJ3MgQAysxM;pO--0RyIz_;eoDzYPppf;TqB4e_yxJ-2iWC`N1lv1d)whv^6Y?nnbt zWdi$}?lom~_n3aNJ5f3^yP+gQ?pWF=!6c!jl$4P{mT{(Tsd!q{1{u-TwD~ynCBFL* z$3Jz7NGmct(FJX@RwMpObyyG)1b@6% zNcnYST^e3dfhTy~91-`h1Fovx%STKtlhCDAeCftsqwj+ajnkL*V$t@EnddH841~yq zMg%+GwNLmh?V@f(HYMo34F9u%-_UpXjNiJQGhNax66q0d?-~o=3E_@JNoA)uS9jk1 zIEdnn?2{ccGo^&Wq$Qt0%a5w^$GdMP%)x8+t{Lo=c=nOAI&-H3(a8 z?TfsM$6%yqzTF@n%c~T?Cl%YSwR=lSk0i+e`%75yDRjC z!R8F;L_%}w|Kfg?r_S>Wk6x0oDVFyKv|f*hqhec1$9w7h1qA%#`-g-)u$kJUQXK}@ zt3`nC@6h+HTk@v!6!OV${^Dx;?7LQOEWKBTsUlT)X)UR&%t+Bx96OwA_d*#&1oQVl zO5_=^E6KRtSx%8d2f5?b|6~Sh#ajZdZRFMl{pW^B=FiV0>Q+9rD+zRNcE%QN%3V#* zeve>ZRJGHqPw`sn3WXIs<3(T7SJyTu(x}{*bH{pVlH!V=2araj@RQ?RFQ0IV6kESE zmA;C9Eqv2+rTs=GeoPIX?Fepz?j-2S8cy>IKIcdAf*(&NKaeyWi*M=ETnS%v)4-ie zz^xFz;^(vdo4Fdf$0PhbS2|N-uAzCpBv~&}q)EU4PSAF@9BAxKz8lL(6Z6J-tFc&8 zdz~z>lH0tnm1}x0->8urZ@W_Kt|ni7t$xEkQ;Ih2VsM1e3G@uC4;}7y47?vXkh51} zdv#60v0&)8HGJt!Rg&XeEE*MNpV@d=&wI^J>03ey+&a4W7&yoxGu37BsC4l~5{&BP zLgL5Udu6I-o{#%gE-wyNDkL2~#Z)cruZIjEndiFhjW1UqTXZTz(>{#Q|JtB1T^X#2 zwOMbz(UP}hk1cMd9oK)Zzt}E(HKV+6gkkOFjsfB?#1Ty$9zqK~Mg85y#|8y_g9cZC zAL1Vh`{!cEn0TUEB5a(T#g*#jWLPub{?%hapiPb7qu^2dO}10Zi28%iR#W^j`3+bf zh{U{E9P-@PH>_F#?Qu!^^C(Kiyn7O~NYWCIgGuWO zH{gVuJ`U&d2b4c5$1Dr+r3b6lgboUXx^s2yW7lOO&P1HsjYdgDUTBcQ1v21X(GXyb z74hEMg)&V7t{f8NODG#2>c{$|dY%#=O=;=VS_xNE^I4ZXJ(D+XyH?i6bk(ug9tnpJR_3IprC}bND2&!h$0AxfJh8dLx<#0Gd?OHsZxTZbW3+A-H3GR z(9KXo&fGot{_eeh!u@dP3!JlS?bUnjz1PuM9#79uzu9~fY6rAae?_)_q9J?%Q%Aat z>9HE`JtK~OaYW{lMTHMPvc)%DDjmO69rEME6!P2wQu#i2g1NxOGsc=JowzPnf*%^G z7Q>0L=QZjfG~dThHY4epJs;OgAv`VJ$Y!MdLGkM?=;?5&tnsm=y(eU33PkKi zr0Y6nnj0oD#e(mb(84L{+}uwuIX)Vq)H{_|Ct$sJ6YHr{9!1d(c6HRBE=w?EPh0w^ zsF9Z+-?K^c$WKj9lcPZINW4sxpWxVuLPeTEC3*E06}s&qNhAo;*YM(f4zsU(=|?t|E!gr-Pr$Z&Cq;}F^3 z`*_rihj@g*q|Y$Wzag8(M6MIlXkvI68ps*H&(4N_)6qq1E#*GtPdauNlOsf0$?U?q z2>K;TvNEA`HEFC&m_i|1*~I-(grU!FHVBGUTrA_a>Re_bY|K3RcpuNx^S~F}0X8h1 z4XCJ%qfk!!d?{xt-2Bs#e+{Sk`bP=CIJODdjivWPZ`)9-Ap}Eqg&=3TZtv4akcz5TvtNpfsQZB zxMpbEbdJumL&UkAr>7q_CB3#rO!`ngp{lEj|>=frox-V zB!&<&H=l%Kj*_<|mkQ8Vc0N}lzA@*5sPeqmKqS_{_KbT=M;3mZdk}@w&wX$-M+cLw zv22d0^Du=^Xnq1t;a#9tlvAGbB8#qdl@Q{hS`0;7h|*l>X+&F99XPGo@`-=#1*_wH zA3vi&@bfa>z}&H|*Gk2&9Q6TP9j9M9Bcyl|h4X6Qk)-z$hBV&r;J zn~1llD+w)B^V?0FEe`cY*?irqe_bsbXZpSFkk_8F?~HBqN~POUDct`BB5vGt_8@D= z(&w{IvpVZh5mJ$CH;GQ?n8)9Tvhz40+>x@yd`&YXPxght^eeWHndFh9pBctehGS=VdrKjp%# zcZFYuSsV`#eEaMjkyufL9&pMVe#g5RPm->`#}$cRbQ9|NwAuz1-TvN$TNY4C$|>k- z61b-xVf`zY*fZv2ifE3?gY)c@R`$6_3TzpBJA`KuN1=|7>&vFbBybK{ab8;}U714x zwqyE(k34Jp&RP(q2^?Ak?04}+rF5XxSEoO7o&KMN{~Krs%UxPfE+=w%`jE`;$Ysk6@{SrP8k zsTX+YE8wFKqr$TA>_VM>3`-32A^If0+XN>K?~U>|0iF-OQGWOjEcrir>X;X}E5=y& z#6`FGY`GrKM*^>IwSw*VE>#Jg_Tlj5EPVMJ6${oyH#bv!44oEkGD7Zs2~f%CSVFVa zim2z1xAXj`*KhWp4tqXnlq;GLf_R5dK_BD`vTA_?WmED^GRRsduUaH9J(9`N6)HFz&7r}cm3^!_}rOJc-MRJI)V zLAGF92Xt@-+wX)JVy`iMog*}CB7G60OR1~q? zr$Rgj>}yOIDcimsH}gw{==ZAMWNVKor4>fHD7lT55tK|93c1r6iGAVY{kXBse!;&Z zkKL=9H%li#24<( z1!%Po$#I9~SJ#Zzz5DMK&~%MVQ!j!=k@~Sd>)tG#m8viyG;rbeUkoC>w~e;w;mu{H zS~2N~P_d{U=>2CvNz>w(Zed&B-9x#J79xm@=94Ux^nDaQaf!W)u2PCUthBn~opHuI z+Q7+)5tK!)m>!yMl=;oze-1IBureD(Udvx|5IhfGlJ?PE0%xIqaH8Ep?~Vrt(cQjr zqN9iyk9~h&eKmNv(&YF0rP-~xI2b+meU$`h;mmkB+usEq zzymQMuK4?PwM}FF6jfHd7L*Tn%FGH(P@gap?k5(JwAnEA)^eMktNl@;Sf#x6)*!!+ zo6>cSpj1D^O-w8OnPyKfY71~uH&I}F+uU)>05(LrhAS&GbL^PV9j~$Z?dTP(9{a6k z-4I5z{-q^}=KN88T#3>)QuN(K`W$}Yn0WEN*Zx=K*yDlMK7Wz|+FCmj41<5gC)`QN z0e6Gedkoay(_y?fKDkks7K2TFboE@g)iYu-%XXyVV!X=cMul#UegZdJ0^JB=oiq>S zJ^|sioI6qX^Y>s&c|pcMo99rdog^!6yArCJT;ZNG+X}ZvZ^gkbm)*7-uSO|0ibV~5wHH}9k*Z@Q0YW@F?usS-#2 zfv{;#ZT5wGM}#7xY;Eq!hvQ92^vg!1>?>#bU&iMeQQhp4cfWj>{l68f9$m?suPa9- z^RC+oXYQ>EP^8P%u+qrcILmI2jTM2hV0CqT*85xZhQ#7=-D~pT(jcTdJ*vmqee97+ z!n>@_eDs{h_nT}=9%(d??$lKa29gdmmUF7b@@5e0`IU*@mk5pAb=HsT)up95;=O;= z6A3hk`20xR)jE3;$1=h%HSUV55j@{Z8?GjKj|$d%pjqMqp|C)hVi+p6m@lrG$Z>4b3m>(#L4MqvI z8~@T~PyN0!$cCT8B{O-PPf1g8D*QDBJ+xZ}x1hcA zE;8vaDM{>XZBPHtOs43t)EZyz8bR_ZkMmUqSE6^PX7SxoETPzKKAQ8d3N1E@{x*>k>8>s_EF z3j7mN8q*9O$9>qOA`RBuVDr)WivUIc;`uPTS`c&ZbqA*CPZ+5TlXnqGLWW_Q?ds6z zShp8qw39mapC;Lvl&Y8BupN`mn7FjlZ@QECvOn%uo@Q-jgc6eiC`l^BOh0;dgu0LI zrkbwIt98Jl-uUoj+cQQhwN8$V?8M3uMDO#P5Y|_2X+22oP^4j4WhF@RI3eOllPExe z@+rMI=9Xr6rfY3ND8CtT{6_tZ#d!*-_unYPgr<%u}qR z29$pOzQc_*L%}`MZRtB4wR?lLk_YNF|MVvafRuLvFCv?kyT$fVHt~BBXnkk9gf@ig z^oL_k!6PHFCoiskGu{sPeI&-d_V0Cy3)etChAbY8fOfsO?La}0&(88TKv%Scj!Bta z%|j=kUyfv0fQ-$bXYKrUeYxwMpBW1MFyVJn>LavKh`%U_k>51$GFA zVxI;FJda@vpNAo9GcKYqVqepTOhZ0K4>I7BL$`O>1I`L-`&d!9;OEq0jznKMncqJm zR2|}6dc^kAUCeYF0~7Rv?c*X^CQDBX-)oANM)@?WxhBd5an*l5?hz^~KcZ%9YrV2F zEK`elA{HX~u;(Y7R`zP>x$eclY1*P2*pG-8gdZJ8HZ;xMjF6GappCyIzC@eEQX8V& zm>r)xldx;{7)ll~Df3V8t` z*}MqK*9!7Qtv35R)%{7oBP{*^X4G$|dt04I*MKLxb`5ko(+di!?!R9X-V%-6Yxj$C zNO&xi4EB2;tjZ#@?jyBm3YQ1EH4`*~^J|M(iwMH|el$@on0;Gs$Afd5#8naDaNHe& zHxihyX3H@Y??3<0V{NCnbsd>U4;E&K=+I?aKaV8NmYwF~(7@20_Vl5VHU{9F)}pGr)WS z*Br8=g{0AmGnnr4HK#dcdA1NeInCAyVMFe7<(QikTVQMiJ(am|)o@ie|LP zar`9pp(>Anbe3sl8(Z4{By`{zRAqS>5~X`|lg1zr302mKZAJljOs%pSKo)+-zEj8>y%tQ! zFHK*%vm1T84q_;Puc*KCu6Ecv3r^vyWb@DYF@j*13UR+kVK=mV;|&){*f8GVJ{)o6 zfV|?GSRYKGcop;A%%_{O0o4fku8twxe*a5(A~4<Mg{B`6#1`M_%{2MAM;6>0bK zUU$<0#0)kgh55_)+i|;|$D=lG6Pg@yyS`S{WZ4`Bve_FCRKXL>U3h|AjZm6Ps@;Xm zeIM!v_aNweM`&KZ#%iAX6*H9KwKi8mG9T4;{RZ%vUhdsP%XCWGT#yz2@YaQAU!0a|8_zE>l2q=hPoGqr4cgAAwJ*u(a5P zs|4u~&+iR%>2B{XUf`je7A2s(sC_}W{QTlv6-Vi6@1yg>m7KW2svYX^*I zw3e^)M6R?yP30~ll1-hu83pg$JHMhlFGxDwJ7`yJu#cc~#^)Eg_cwS6UM)fD^94=6 zwktOXg%q~BD9$eu0#&x%6Fs$ODo-o_UL$Ysj|_jMS^-{oh9x*zP!+X!6>c$NMMH7V z>W(L;c8==A+4i~a8@ePEWg;Uu{`-q9knVkm z2v2!iU{}(rq7Gr-e{1IwMzG=9IWBa!$~|=!SQ5p_J>Vjw{l4eENN@E#E%SfQ0-&y@ zYAwe#egD0-GjZYkU2p}c*ffHHi@MCJCjND}cJ_}X-y0zF$UmTOt{Z9ng|5l9ufqpz zFZSLlpSAW9$AY|j@~T|u{z7y%C=j>%Njh&g!6i%C4^F&UZF2tiLfrnB#D`CwA6|I5 zQ7QlpAZ9zd^nsTewMk)VJ7(u)?r>Rr`G4^3#sTovxxe4Gzj-Q>5<%_nd#?PIn$Sas9W^U%OvA zXn($%`~GHe#>@8WfBroIz_QFPT}8Bfjn~KMp0Yt0Xkkal^q|fF`vLv8O=3WsUzOYE zQ)b{Pk+S580#*}KC2;=7TA9AU`p`1#-w@WcY`{WbYuhSDR3Td8&6k2N0KvPT%>fFW zP~bo_2qu-PQUq5;|I#jRfhl$)}{W>FqlX%jAx9O{L{6&RwH9>5+^A5RqL4v z895XYHUP!L(V86%AWO%|__D7O{JUw{8Yx{|XGAb+HK#K9ilvVNrtfk&&*A-RsEXxn zYo!5_Tp6_>z*nOnXh!?}-|Jd$i=0p%^zMnr^Gw&Uh7?x7Wmk}PNAjJK>6L4LoOCJN zW6LPiqkP@Q$l}&LqlbR*4=r?pJ=+&CuDEG(c-P1Do>keTL2$NRVPpeY|4c%@b9$7_ zebcmkcV&8EG|@*2EX)aL;c3xt;O@84Lz?x=B4(eS7|Ro8{3+SfBofaD^^7OrS(s@l zpl==Y?{aTBCbY1B^1O9A{O$iEj;@P)4cQ*=eOlPkj@a89_d30Udg>hj*$t$L4nQ4T z@%$W*y(J>B%53^HjLMeTlJDwr~q&YF;YweIiN!$5sEnmK`&IpOsmvZ8s_caOf# zl`xZROZEEJEjbgQ62Q@o^BrMSknMU(@>_Yb8X*q>==4%*<0V>V=?@onb?N7!qKxr+ ze=bCA;$>$KRL^ywdcMVNx=Cjn$j+Z>Cna?T^{jU6oez2oywXw>92xwG-uZb|w2TPO zvL%a%y(KDF#tmS63Sb;|O<=`eKdc|?MhLc=l&yhoeT}{B)Ihf>pj-dyBTKYt^b>1t zA@6`qj0JV`{4N0WfieUIwcb6PbDS{=e^VA{LX-}DLjW4YND>U)1cvqnLl{-QyFHE29SbLSYsOdXhsLK#WLVKp!QT6`QJU?gdMZE;plKov_A)V8@+#n5uc#pR+oLgw4_AZ~O zoCF{tIUP=7-lUV280`o$T|Dp&p=)|oNUMTkwSI40AArUQK&y-aJ4?UP3FzBK^gK@v zN&SmxmH5w|)}^N|B@yJfmP6~y4;N{fhMK)HRE zgx3!M&tA}wVf@A;ks3Qm?2}=HTW!*%(Vq+u#A*QxfHrg8>fevh)kO3?mij$?aX>*C0H|+!p}*U)bqS{A zeQ~^xK78E)huGk5p5Fv~LtgO)b%b^n8EUMOUMsNn$jF5{85#r!Xt0;FPdj;#yV&Rb zCnym3rGAE*!Ax;EM_$zohsQlWS|ub|$X$5aNg7nDcB$S;)tr)A)1ex5Olg|`2e73soi3L=h?%6w^^1-&kI4?%uXxy8?q#L_G!tdeHrE)o`h!e*q zlr6o=&MY$RWCCy#4rYHVYU*G7sM8(e26Ov+vLND)#}Db4{7Kq0Fmev+34ZBC{S+v+ zM*?6QG>c9f*Nn(Io#Cgn&VId&>U?l!KINoN}CopV4rYvctt@}iD; z2N;8OXp$BG(f%23>B}hJKftF&A00Yv0Uwu(C@;m55Zoj0M2_#xgD~9QI6<$Dqt0J5UOgCfC5nKMU`=FTPM~N93|AZuPJ@*%1Ssn} zn=!iahdlM1nS^l*`Iu3!G~HGW zm=|D1S{(gm9amn$=)ev!y9Lm!*xP_z^cGeF%Xii|{>f;(P(}w9ZIKVQx5dpn>VfP5 zyW!Ydi$2<+(7ocQE=D^l@in>cLkGoefoakDJ>b*WW~Z0&JnF*5Gr$6M9`Nh36xgUT zE=wrpj9n`5acT^S)7{qMEVa43cV|MAnhPJsH7DY2)d>H^k){?nY;6wTLMg3?-od?e z;(!;p!Re(nNtaLE2Kq$a1Z+Ezof)17RN&09IM96m|DXTQq2LU3@KgdEWd{nimIE3d z8MY>q>HR7Y5pXXMWJJ94wCry&$fON^i928ymrTb*@>^&$<L+mx!G;?NPD51(4hDxD|nJOM(1Qc+wxLf zas^LNaF}9Frl~Fv8SoRxd480CAD*o#aT+{X#PVn7xCWzE2IgUn~#(kBTtUpyBtuvax}KWO_qgLf`&J%)O1PY$L-{D)&JML-LA z1)Emd3N&g~jnp81(uJaKjsS65jY7Wkx}y_#gQafWdVVwyUF|T@;1ncJB1P-{Ybgu{ z`hXg!x>!a7-dJE|0;`CHRPun|0UAM&IDeqfgrARu6K>G&ojon7(w@jvN1>pB#| zmVND>9AAZ8l0g-0hRM3KNi z7eS1y$ zL_+>H({lBs@mGbm8JkQCK;IAEM$@Oj*$yELMPFlD|Aukq7o;%dV z&pyM8p*sU{bYMgcFOVn4dacSQib5V`So8JT5E-6kMWq{cN8d^OmsjZQDva$MnSUEj z_mL@`7$4~>q%VgV(u2T3->CigjQ*4s|JONr(0u^~TVxx&r%Hz=_g(qsZcF&dLP z=vE>rhN3>4moI>u!p7Detb8EsL7T~Ao%O=YzI9Z;{TJFe^Kwmq0R~*rQCQA(=bDFK z9aSPpNa}AVkK*Zkpx+-TO{C_CrOBEC~=gK{F;3I5#mXbSzbLJ`AmsjGtm(W^#8In$WI=35Q*79{)>#LDe-~j~xf%?~PLE z3QShF@tuhsSwz*<=26`D?LmWk@v~EK%`or|TiKqxnfr%0@{$HJpw~IN%`q5K`M+7M zO;&6(xzIrYwh#<|tRZm@)Xzvh@@xrRq&{8q%it9hE-z+0JWB#Nt#so*MBmS0 zbvz-T#|tr+`G5{qM(BJv;|x>wczg4sxAhDL^|o@|0N>&N zT&k~*Ow#_l@D6SvU01~hO6-c%PbOV2`;?O`>daL*ERk4&PNu}(V;sm2nOi4g(j;tF zBufe{K6(x?`qW`e)7Sr{{qX_Ns~7t(MpC_8rdIFV#)FfgE58dxPS&&zxJYX zqtPD>d?rCRcX$-*e`w|$E$Es=mh~vTyDJ)SR`}! zq~_$a0i%r=CZ}bOI*VgIh~sMvAx=|<eCV$=njox`|86z6H@s(schL49R zPdW~|8`zAW!t%D{mh%Nl+E?e1<-{yc9-sYs6BD|wzi%c2ydwiuX zYwjd>LkE!JL{}+)@=`>OJO5QsRGce=6A%s6uX2>hk8YCe*vhb}v0BUL2yF=_lmMPe zJe{}x0`LugpjC%9bSVJy-3nRlSe;J>(@edsXegL4Q%9=&SYK=siM*)mCDcT2bu~h! z&|XE#V}z7i?)nKzB>j*@YfycY9oPYdMzOZb{_c;jf8vLD;OCficRxNG0u#VGx^{=Z z>sSkM1>hUp@t9(QJ=QEGvvu=#Twd2c4QEmcg}m#JtS)q99j_T#BNHd+5#xHC z>&oVo();k6;2PJe+*S?D(doqLs^^*LFFEY&6R?XCgibsm?Jgv%M*OWapdoXbRiu`h zz+9=utyD5zT5`&{dbUFU*Xw;o{Kq^hzWktzH_agRg-OX(1V`cJr)6Zb;JcW{dxtw} z7e+`$pZ{$nZXizh84*%0&XJa4N2cESm!9#np$U~nP3vD%l=Udod7h|ra*#s*BFVsA zA)1?%nh){JpiTAiV?AHqmyvQI`+mQ#74A6>X>_P{7q%uhDjR@?(%)G3A9IGzW{#0H z3SHr?{AWo0-8PKoY3QBhIh~wNzLCJd|FD0tgy5aa5Q_GgX=nI(I)(${Q8DB%i0ObbTTxz@hA&LGIZ0&)i!3ThXuYZ)-sx;=WmUA`PW(aEPa! zOvl#RsYEC~OyGI7K+Ho;D(Kxrh~a@Be}~}=h**Ooc&$bLOiZD<_N9~dl~7`DiP6YD zx>4x_RoLB6vm+x0=b|tYG3uJs(7Uy`j;UBP$44jR>4g{iBUKi4cS|jvs$Panf$2oX zBP2K&(@(|~Sf8w|bvG1Y3g#LprjUP0R?9_J;N;Qp#}lS0&S8V$b1Yi~kqoLinZQ&H ziSXsU_Xn3D$$TMjvj;g*u9`mytQ4l7&^^X2{Y<%~1Ucj+5^U zT}qSl8Q8Q!#$JLgKP>~k4mPbMiFIG|h2`edD>B>#9T;RAjwSv)0IQy7dq$U-186ti zZ&foyE^q&DHfj!*|L{b*VwB@i_(Gr>^{)tI+@Qq%=zrHycLiO|?Q#dSwz!C{c3S#x z7WtlW;He)Z_dH&ybSIz!8N&Yp_wfR#aQgv#M52<3|1h0Duv+V|+>8%8+jMzI487k` z=pV^H1*#aWZ2CX0l5nmokKiT=umf+5^D7GFg5&+zw61vqeqTii7j*(FS!>;tjdYL@PB54ke%xt8yAv2l< zi{4g-jLFiE)TY7pQf{a`!8WP~eB4zF!wjn`JLU!&BeBA^^=3p^Rmcku#UX1#x;Ui9kYqUKF6@#(H|j6= z0Ow7q$-bHm&b<6o{1le8)Ib_lxAb-e*J@IS_de+-)l*vfAYO96RjX|IyPwrzI@Et_ zww%FDD=T7ptJTW^jMXj}SS6jce};=xk_ipJ6Np-u61o|O2$X@>WFvqElfNjTh+Lm? zW3TdvCguau2s*RZcvz}UH6|DNBiELCfX)!E1;V>BF161bMl#T(5LVgm@>3bFwCkGZ z3}m7utb<{C<#msAhSo%p@ocZQo*Y+OpTfe(?wg?$0Z6W^H^ANp6*z2t4VXa#-9ge6 z3pGVOk4^2XwR1%>a_lgAr7g1e$6OMJHWm6(=`flusT|q6Go9Mz7 zy-N6`)jpRxG%0(FikCwDB!~K*`;FlqwZP?)zdZWUZ2wCYW6s|5CEwz+6!LMl6;_jf zG;)1}IN*lsWIxJ+9{6F1)a3;Ropig0d<9gA-Ibv)4!+dJMR0QT`24Su3%W5Ct+ew` z80ml>x?OL_&2KPK;ye;o=wC!5R|gScLNbGg~?&RDSo*u<4rAh^EJvPqwg*5syS zFb#>2x|F>a@U`fNGvAkC5z9}dITKvVPbbn!zZJ_q3d^(YtB&6~nn_V?OllUFBB1wu zu3o?XcD{XmCgD(;ur*$o@bE=p?}_h=eQMg5kus)f5N(iD6fSxedy08gwM;P$`N)c| zaRoAG!dO1 zEi0hNJ`$E{vydC7w>0W!X#C@k!#R1Q9X4)KthCI-h~f}ay^lBvZNb?g$&sgkp&4qXy)8`&d9 z-kBjLrug=v$yI(MBvEq&?mN_VwrQVv8Mx14FFN?FZ!&6W$=)1Ny7zZJn4+=5p9Yx% z+=i%IO~I!U-v$xHr&iMZuIsUY>y}``0TM=ivYC0Ec>xLc-zP#mB0d>nVsZ?ayHAOn zEYjqK8a6=mWgq9f?BPz@+Ml1jFNNJMK{u?9>f5#2XKVlT^7Sbug zW$3{JDUZ9WZE=O#_@(Ujk{7B_crFu1ShcZ_yY5DdD{gTOC1XW_|cs?5$g`jC2)l86KIrd29FK{?0r+hd0dCApwI<0-rCS zugT4JnoE$_=f0uk*G+cW5=}clZ+ASzQ;HcVV9v2oZv~!83{qWD%YSb|`f6JCIO}X2 zS(nTI47hR3^|94EGwrzFI;p|vr8@Ks>vZ@cKWlSOE=rDz7xs7lxEFi#G6%{Eg!el4 z{J#JA3T0ePu30Q?-PU>}u{lZ}k)i9xYNR4z$Ti+w#F_aLH3*+cPyH&q`w?-~Qg4AA zf`HBjyu(l>Lm5UUG}_f;uXZil?82VWOVfRJGE!}Tv-{9mauo8|swck~(V0`rEH^;SZ}KWi<2%2~Z{pwh zsxERI7|*1rNxi#r==UZi(w$ zr~NI$YB+hG^`zP2M^&=B$n?TDYWVAzPVTc1KQl(~t}As=S+V}~N2L9lL~BkMNfFcwm;D8El7%VNrkB3lH?&?(pk+G~0nq$CcuiH} zM%K1rg`I=tmlU%kawcT(eVO7Elxb;8_;B3P70K>ru!~esfSp@?V-~}g@m0!CHORh_ zPhWd0Kvk@i{|#B8pF~dcnn8gj?Q&jw0hK`Fb~Kf|LBfc z-{XSAm%7{cI4%>o%Fe?tu$?WxatY#jjPlSH$}P3|qEvBV%_B0 z6GZ>M`DW3B(A=M#V!TM&=i?RyV(tArWmcjR5(bWcn6$Qp%HaIqocPSI*@w^#CDPV5?&F6iaF4D`CbEO&AC6=!Di9E{8y fhx5?QGbD)Pp0Rgrx1}hUAM{A^$^E>0M*sa^Zm3eW literal 0 HcmV?d00001