From 1c37ec82c6afb72d56346e998d0f432c33685d6c Mon Sep 17 00:00:00 2001 From: Hwang Taehwan <107744534+stakbucks@users.noreply.github.com> Date: Sun, 3 Nov 2024 19:13:30 +0900 Subject: [PATCH] feat(demo): demo app for advertisement (#79) * chore(demo): init demo * feat(demo): main page * feat(demo): kakao login * feat(server-utils): server utils package * feat(ui): add header, layout component * feat(demo): bottles page * feat(bottle, demo): scroll restoration * fix(bottle): disable image drag * chore(utils): utils package --- apps/bottle/next.config.mjs | 3 + .../src/components/common/avatar/index.tsx | 15 +- apps/demo/.eslintrc.cjs | 9 + apps/demo/.gitignore | 36 ++++ apps/demo/README.md | 36 ++++ apps/demo/next.config.mjs | 26 +++ apps/demo/package.json | 48 +++++ .../demo/src/app/bottle/[id]/BottleDetail.tsx | 43 ++++ apps/demo/src/app/bottle/[id]/HeaderArea.tsx | 16 ++ apps/demo/src/app/bottle/[id]/layout.tsx | 11 + apps/demo/src/app/bottle/[id]/page.tsx | 16 ++ apps/demo/src/app/bottles/Bottles.tsx | 50 +++++ apps/demo/src/app/bottles/HeaderArea.tsx | 7 + apps/demo/src/app/bottles/layout.tsx | 13 ++ apps/demo/src/app/bottles/page.tsx | 22 ++ apps/demo/src/app/favicon.ico | Bin 0 -> 25931 bytes apps/demo/src/app/globals.css | 194 ++++++++++++++++++ apps/demo/src/app/kakao/route.ts | 22 ++ apps/demo/src/app/kakao/utils.ts | 49 +++++ apps/demo/src/app/layout.css.ts | 24 +++ apps/demo/src/app/layout.tsx | 30 +++ apps/demo/src/app/page.tsx | 42 ++++ apps/demo/src/assets/images/basket.webp | Bin 0 -> 51276 bytes apps/demo/src/assets/images/coconut.webp | Bin 0 -> 25594 bytes .../src/assets/images/login-background.webp | Bin 0 -> 341058 bytes apps/demo/src/assets/images/no-bottle.webp | Bin 0 -> 35864 bytes apps/demo/src/assets/images/telescope.webp | Bin 0 -> 35864 bytes .../common/avatar/avatarStyle.css.ts | 43 ++++ .../src/components/common/avatar/index.tsx | 42 ++++ .../common/bottle-card/IntroductionBox.tsx | 25 +++ .../components/common/bottle-card/TimeTag.tsx | 39 ++++ .../bottle-card/UserInformationArea.tsx | 53 +++++ .../common/bottle-card/bottleCardstyle.css.ts | 54 +++++ .../components/common/bottle-card/index.tsx | 19 ++ .../src/components/common/fallback/Image.tsx | 5 + .../components/common/fallback/Subtitle.tsx | 10 + .../src/components/common/fallback/Title.tsx | 10 + .../common/fallback/fallbackStyle.css.ts | 9 + .../src/components/common/fallback/index.tsx | 24 +++ .../common/overlay-client-patch/index.tsx | 8 + .../common/selected-profile/index.tsx | 65 ++++++ .../selectedProfileStyle.css.ts | 21 ++ .../user-information/BasicInformationArea.tsx | 31 +++ .../user-information/IntroductionCard.tsx | 38 ++++ .../user-information/SelectedProfile.tsx | 23 +++ .../common/user-information/index.tsx | 20 ++ .../userInformationStyle.css.ts | 95 +++++++++ .../src/components/kakao-button/index.tsx | 27 +++ .../components/kakao-button/kakao-logo.svg | 5 + .../kakao-button/kakaoButtonStyle.css.ts | 25 +++ apps/demo/src/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes apps/demo/src/fonts/GeistVF.woff | Bin 0 -> 66268 bytes apps/demo/src/fonts/index.ts | 3 + .../laundry-gothic-otf/LaundryGothicOTF.woff | Bin 0 -> 357484 bytes .../src/fonts/laundry-gothic-otf/index.ts | 6 + apps/demo/src/fonts/roboto/index.ts | 7 + .../WantedSansStdVariable.woff2 | Bin 0 -> 82648 bytes apps/demo/src/fonts/wanted-sans-std/index.ts | 6 + apps/demo/src/models/bottle.ts | 34 +++ apps/demo/src/models/introduction.ts | 4 + apps/demo/src/models/profile/MBTI.ts | 6 + apps/demo/src/models/profile/alcohol.ts | 10 + apps/demo/src/models/profile/index.ts | 35 ++++ apps/demo/src/models/profile/interests.ts | 53 +++++ apps/demo/src/models/profile/job.ts | 2 + apps/demo/src/models/profile/keywords.ts | 24 +++ apps/demo/src/models/profile/religion.ts | 2 + apps/demo/src/models/profile/smoking.ts | 10 + apps/demo/src/models/user.ts | 28 +++ apps/demo/src/server/auth.ts | 25 +++ apps/demo/src/server/clientSideTokens.ts | 6 + apps/demo/src/server/index.ts | 3 + apps/demo/src/server/log.ts | 5 + apps/demo/src/server/serverSideTokens.ts | 14 ++ apps/demo/src/server/types.ts | 8 + apps/demo/src/server/utils.ts | 55 +++++ apps/demo/tsconfig.json | 30 +++ apps/demo/vitest.config.mjs | 17 ++ packages/ui/src/components/asset/Asset.tsx | 34 ++- .../components/asset/icons/bottle-logo.svg | 10 + .../components/asset/icons/icon_letter.svg | 48 +++++ .../src/components/asset/icons/kakao-logo.svg | 5 + .../src/components/header/headerStyle.css.ts | 19 ++ packages/ui/src/components/header/index.tsx | 21 ++ packages/ui/src/components/index.ts | 6 +- packages/ui/src/components/layout/index.tsx | 56 +++++ .../src/components/layout/layoutStyle.css.ts | 56 +++++ packages/ui/src/index.ts | 4 + packages/utils/.eslintrc.js | 10 + packages/utils/.gitignore | 42 ++++ packages/utils/package.json | 32 +++ packages/utils/src/index.ts | 2 + packages/utils/src/server/auth.ts | 25 +++ packages/utils/src/server/clientSideTokens.ts | 6 + packages/utils/src/server/index.ts | 3 + packages/utils/src/server/log.ts | 5 + packages/utils/src/server/serverSideTokens.ts | 14 ++ packages/utils/src/server/types.ts | 8 + packages/utils/src/server/utils.ts | 55 +++++ packages/utils/src/user-agent/index.tsx | 49 +++++ packages/utils/tsconfig.json | 8 + packages/utils/tsconfig.lint.json | 6 + pnpm-lock.yaml | 154 +++++++++++++- turbo.json | 3 +- 104 files changed, 2459 insertions(+), 18 deletions(-) create mode 100644 apps/demo/.eslintrc.cjs create mode 100644 apps/demo/.gitignore create mode 100644 apps/demo/README.md create mode 100644 apps/demo/next.config.mjs create mode 100644 apps/demo/package.json create mode 100644 apps/demo/src/app/bottle/[id]/BottleDetail.tsx create mode 100644 apps/demo/src/app/bottle/[id]/HeaderArea.tsx create mode 100644 apps/demo/src/app/bottle/[id]/layout.tsx create mode 100644 apps/demo/src/app/bottle/[id]/page.tsx create mode 100644 apps/demo/src/app/bottles/Bottles.tsx create mode 100644 apps/demo/src/app/bottles/HeaderArea.tsx create mode 100644 apps/demo/src/app/bottles/layout.tsx create mode 100644 apps/demo/src/app/bottles/page.tsx create mode 100644 apps/demo/src/app/favicon.ico create mode 100644 apps/demo/src/app/globals.css create mode 100644 apps/demo/src/app/kakao/route.ts create mode 100644 apps/demo/src/app/kakao/utils.ts create mode 100644 apps/demo/src/app/layout.css.ts create mode 100644 apps/demo/src/app/layout.tsx create mode 100644 apps/demo/src/app/page.tsx create mode 100644 apps/demo/src/assets/images/basket.webp create mode 100644 apps/demo/src/assets/images/coconut.webp create mode 100644 apps/demo/src/assets/images/login-background.webp create mode 100644 apps/demo/src/assets/images/no-bottle.webp create mode 100644 apps/demo/src/assets/images/telescope.webp create mode 100644 apps/demo/src/components/common/avatar/avatarStyle.css.ts create mode 100644 apps/demo/src/components/common/avatar/index.tsx create mode 100644 apps/demo/src/components/common/bottle-card/IntroductionBox.tsx create mode 100644 apps/demo/src/components/common/bottle-card/TimeTag.tsx create mode 100644 apps/demo/src/components/common/bottle-card/UserInformationArea.tsx create mode 100644 apps/demo/src/components/common/bottle-card/bottleCardstyle.css.ts create mode 100644 apps/demo/src/components/common/bottle-card/index.tsx create mode 100644 apps/demo/src/components/common/fallback/Image.tsx create mode 100644 apps/demo/src/components/common/fallback/Subtitle.tsx create mode 100644 apps/demo/src/components/common/fallback/Title.tsx create mode 100644 apps/demo/src/components/common/fallback/fallbackStyle.css.ts create mode 100644 apps/demo/src/components/common/fallback/index.tsx create mode 100644 apps/demo/src/components/common/overlay-client-patch/index.tsx create mode 100644 apps/demo/src/components/common/selected-profile/index.tsx create mode 100644 apps/demo/src/components/common/selected-profile/selectedProfileStyle.css.ts create mode 100644 apps/demo/src/components/common/user-information/BasicInformationArea.tsx create mode 100644 apps/demo/src/components/common/user-information/IntroductionCard.tsx create mode 100644 apps/demo/src/components/common/user-information/SelectedProfile.tsx create mode 100644 apps/demo/src/components/common/user-information/index.tsx create mode 100644 apps/demo/src/components/common/user-information/userInformationStyle.css.ts create mode 100644 apps/demo/src/components/kakao-button/index.tsx create mode 100644 apps/demo/src/components/kakao-button/kakao-logo.svg create mode 100644 apps/demo/src/components/kakao-button/kakaoButtonStyle.css.ts create mode 100644 apps/demo/src/fonts/GeistMonoVF.woff create mode 100644 apps/demo/src/fonts/GeistVF.woff create mode 100644 apps/demo/src/fonts/index.ts create mode 100644 apps/demo/src/fonts/laundry-gothic-otf/LaundryGothicOTF.woff create mode 100644 apps/demo/src/fonts/laundry-gothic-otf/index.ts create mode 100644 apps/demo/src/fonts/roboto/index.ts create mode 100644 apps/demo/src/fonts/wanted-sans-std/WantedSansStdVariable.woff2 create mode 100644 apps/demo/src/fonts/wanted-sans-std/index.ts create mode 100644 apps/demo/src/models/bottle.ts create mode 100644 apps/demo/src/models/introduction.ts create mode 100644 apps/demo/src/models/profile/MBTI.ts create mode 100644 apps/demo/src/models/profile/alcohol.ts create mode 100644 apps/demo/src/models/profile/index.ts create mode 100644 apps/demo/src/models/profile/interests.ts create mode 100644 apps/demo/src/models/profile/job.ts create mode 100644 apps/demo/src/models/profile/keywords.ts create mode 100644 apps/demo/src/models/profile/religion.ts create mode 100644 apps/demo/src/models/profile/smoking.ts create mode 100644 apps/demo/src/models/user.ts create mode 100644 apps/demo/src/server/auth.ts create mode 100644 apps/demo/src/server/clientSideTokens.ts create mode 100644 apps/demo/src/server/index.ts create mode 100644 apps/demo/src/server/log.ts create mode 100644 apps/demo/src/server/serverSideTokens.ts create mode 100644 apps/demo/src/server/types.ts create mode 100644 apps/demo/src/server/utils.ts create mode 100644 apps/demo/tsconfig.json create mode 100644 apps/demo/vitest.config.mjs create mode 100644 packages/ui/src/components/asset/icons/bottle-logo.svg create mode 100644 packages/ui/src/components/asset/icons/icon_letter.svg create mode 100644 packages/ui/src/components/asset/icons/kakao-logo.svg create mode 100644 packages/ui/src/components/header/headerStyle.css.ts create mode 100644 packages/ui/src/components/header/index.tsx create mode 100644 packages/ui/src/components/layout/index.tsx create mode 100644 packages/ui/src/components/layout/layoutStyle.css.ts create mode 100644 packages/utils/.eslintrc.js create mode 100644 packages/utils/.gitignore create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/src/server/auth.ts create mode 100644 packages/utils/src/server/clientSideTokens.ts create mode 100644 packages/utils/src/server/index.ts create mode 100644 packages/utils/src/server/log.ts create mode 100644 packages/utils/src/server/serverSideTokens.ts create mode 100644 packages/utils/src/server/types.ts create mode 100644 packages/utils/src/server/utils.ts create mode 100644 packages/utils/src/user-agent/index.tsx create mode 100644 packages/utils/tsconfig.json create mode 100644 packages/utils/tsconfig.lint.json diff --git a/apps/bottle/next.config.mjs b/apps/bottle/next.config.mjs index a1ffa0c..9facc97 100644 --- a/apps/bottle/next.config.mjs +++ b/apps/bottle/next.config.mjs @@ -3,6 +3,9 @@ const withVanillaExtract = createVanillaExtractPlugin(); /** @type {import('next').NextConfig} */ const nextConfig = { + experimental: { + scrollRestoration: true, + }, images: { remotePatterns: [ { diff --git a/apps/bottle/src/components/common/avatar/index.tsx b/apps/bottle/src/components/common/avatar/index.tsx index 6dcdadd..d6539aa 100644 --- a/apps/bottle/src/components/common/avatar/index.tsx +++ b/apps/bottle/src/components/common/avatar/index.tsx @@ -16,7 +16,20 @@ export function Avatar({ size: _size, blur, ...props }: AvatarProps) { return (
dAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJw b z_^v8bbg` SAn{I*4bH$u(RZ6*x UhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=p C^ S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk( $?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU ^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvh CL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c 70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397* _cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111a H}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*I cmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU &68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-= A= yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v #ix45EVrcEhr>!NMhprl $InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~ &^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7< 4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}sc Zlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+ 9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2 `1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M =hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S( O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/apps/demo/src/app/globals.css b/apps/demo/src/app/globals.css new file mode 100644 index 0000000..77ff07b --- /dev/null +++ b/apps/demo/src/app/globals.css @@ -0,0 +1,194 @@ +:root { + --background: #ffffff; + --foreground: #171717; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +html, +body { + max-width: 100vw; + overflow: hidden; + overscroll-behavior: none; +} + +body { + color: var(--foreground); + background: var(--background); +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; + user-select: none; +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +button { + outline: 'none'; + border: 'none'; +} +input, +select, +textarea, +button, +a, +label { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +button { + border: 'none'; + background: 'none'; +} +input { + background-color: transparent; + font-size: '16px'; +} +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type='number'] { + -moz-appearance: textfield; +} diff --git a/apps/demo/src/app/kakao/route.ts b/apps/demo/src/app/kakao/route.ts new file mode 100644 index 0000000..604bb9c --- /dev/null +++ b/apps/demo/src/app/kakao/route.ts @@ -0,0 +1,22 @@ +import { getTokenFromKakako, login } from './utils'; + +const isDev = process.env.NEXT_PUBLIC_MODE === 'DEVELOPMENT'; + +export async function GET(request: Request) { + const url = new URL(request.url); + const code = url.searchParams.get('code') ?? ''; + + const accessToken = await getTokenFromKakako(code); + + const loginData = await login(accessToken); + + const headers = new Headers(); + headers.append('Set-Cookie', `accessToken=${loginData.accessToken}`); + headers.append('Set-Cookie', `refreshToken=${loginData.refreshToken}`); + headers.set('Location', isDev ? 'http://localhost:3000/bottles' : 'https://demo.bottles.asia/bottles'); + + return new Response(null, { + status: 303, + headers, + }); +} diff --git a/apps/demo/src/app/kakao/utils.ts b/apps/demo/src/app/kakao/utils.ts new file mode 100644 index 0000000..eefd33e --- /dev/null +++ b/apps/demo/src/app/kakao/utils.ts @@ -0,0 +1,49 @@ +const isDev = process.env.NEXT_PUBLIC_MODE === 'DEVELOPMENT'; + +type Detail = 'grant_type' | 'client_id' | 'redirect_uri' | 'code'; + +export const getTokenFromKakako = async (code: string) => { + const details: Record = { + grant_type: 'authorization_code', + client_id: `${process.env.NEXT_PUBLIC_KAKAO_CLIENT_ID}`, + redirect_uri: `${isDev ? 'http://localhost:3000/kakao' : 'https://demo.bottles.asia/'}`, + code, + }; + const body = (Object.keys(details) as Detail[]) + .reduce((acc, key) => `${acc}${key}=${details[key]}&`, '') + .slice(0, -1); + + const response = await fetch(`https://kauth.kakao.com/oauth/token`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body, + }); + + const data = await response.json(); + const accessToken = data.access_token; + + return accessToken; +}; + +interface LoginResponse { + accessToken: string; + hasCompleteIntroduction: boolean; + hasCompleteUserProfile: boolean; + isSignUp: boolean; + refreshToken: string; +} + +export const login = async (code: string): Promise => { + const loginResponse = await fetch('https://api.bottles.asia/api/v1/auth/kakao', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ code }), + }); + const loginData = await loginResponse.json(); + + return loginData; +}; diff --git a/apps/demo/src/app/layout.css.ts b/apps/demo/src/app/layout.css.ts new file mode 100644 index 0000000..f54f0b8 --- /dev/null +++ b/apps/demo/src/app/layout.css.ts @@ -0,0 +1,24 @@ +import { colors, spacings } from '@bottlesteam/ui'; +import { style } from '@vanilla-extract/css'; + +export const layoutStyle = style({ + width: '100%', + minWidth: '360px', + '@media': { + 'screen and (min-width: 900px)': { + width: '360px', + }, + }, + height: '100vh', + backgroundColor: colors.neutral50, + margin: '0 auto', + position: 'relative', +}); + +export const errorImageContainer = style({ + width: '100%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: spacings.xl, +}); diff --git a/apps/demo/src/app/layout.tsx b/apps/demo/src/app/layout.tsx new file mode 100644 index 0000000..98190b1 --- /dev/null +++ b/apps/demo/src/app/layout.tsx @@ -0,0 +1,30 @@ +import type { Metadata, Viewport } from 'next'; +import './globals.css'; +import { wantedSansStd } from '../fonts'; +import { layoutStyle } from './layout.css'; +import '@bottlesteam/ui/styles'; + +export const viewport: Viewport = { + width: 'device-width', + initialScale: 1, + maximumScale: 1, + viewportFit: 'cover', +}; +export const metadata: Metadata = { + title: '보틀', + description: '천생연분을 찾으세요', +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/apps/demo/src/app/page.tsx b/apps/demo/src/app/page.tsx new file mode 100644 index 0000000..fbc6ad0 --- /dev/null +++ b/apps/demo/src/app/page.tsx @@ -0,0 +1,42 @@ +'use client'; + +import LoginBackground from '@/assets/images/login-background.webp'; +import { KakaoButton } from '@/components/kakao-button'; +import { Asset, Paragraph, spacings } from '@bottlesteam/ui'; +import Image from 'next/image'; + +const CLIENT_ID = process.env.NEXT_PUBLIC_KAKAO_CLIENT_ID; +const REDIRECT_URI = `${process.env.NEXT_PUBLIC_MODE === 'DEVELOPMENT' ? 'http://localhost:3000' : 'https://demo.bottles.asia'}/kakao`; +const kakaoLoginUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code`; + +export default function Home() { + return ( +++ ); +} diff --git a/apps/demo/src/assets/images/basket.webp b/apps/demo/src/assets/images/basket.webp new file mode 100644 index 0000000000000000000000000000000000000000..5b037c0f240679ac8c3a65aa140f2f061f4a53f7 GIT binary patch literal 51276 zcmV)QK(xP7Nk&FQ$N&IWMM6+kP&il$0000G0002z0|4g(06|PpNCbia009|?ZQDo^ zoM${wrvHL>C$qs_0TKP50Q}hiTEUJ80L{MACol%gKGB2EC1xK)oP3B_FW`Py0f4!r z_nXM5I{~>_Yn@0}g-A|a-d{o$$jR6%am)=>O>H0$skkBKLdFe%o9qdZ>SgF34Aqp` z!+ +++ + {'진심을 담은 보틀로\n서로를 밀도있게 알아가요'} + +{ + window.location.href = kakaoLoginUrl; + }} + /> + o;l00un3TT{80x)VXQB7Vw z0R43U&gu-eYf~+GQ`b9mtf?gdd9%DINl60o`b%_qr$_4WO_w}Qm4uT3_*C-ex{)Nw zQD#nAcVJ0V^8#GW|39?KU#p`V5itQ1!0EPaRg)x1Ywi0))!ogRnKHAOnVFfn>L)Pv zn4!hY%nZrQ%*^Zz7GWy#-Lo6tr)s7mpXi8G?L@=`c)M*|jU?IH=3HBn$(Y>S%{>^C zGdPl|7!ETtGya16W0;xmEv`DuP>_s)?jCO7X4-3gh^V}j;kLJQAtENgqix%68g1J) zw*aT>&i8%(2at2lIfu$F7d8R|l0X^d9o7-t*4|5ZYl?^o@NC<*YTJ?|wbsYn=ZPqo zG8i*6yL&KxXJna~nIoJTjG0YEMc=!7&CwHAJQ-?I%E?5;1X%O;|Lp(S|Fi#R|IhxP z{XhGE_W$hv+5fZuXaCRspZ!1kfA;_E|Jnbu|7ZWtkLCX^G^rx!T$ZIYzzBn8z*6kl zoE2nVj7ScOKvO81xLTt#7;KD>b?;$-?84v-&JgC5w$QT@42VEPU3ed)dDTdmNfVjY z+x@lm(PlfnQveV^0CKU?rcNeI7$5)x2mk~Cst7j^8$T?{T56&x5+$n-I)n97qkOMW z{O@hr#9y!1r?{xP!3dfT5lPnQ4c0fuquSKt1Ca=-+;87)4q?(XgH?gZG;enXqeDl# zey;eSRbBdY|F}EU6I!K*N#0&tUtb#y@>yZ{pw_ZI`%nHZ3bRYEXmUfQ_0HP3-|aSR zqWIu9T^v67+hdUAjWjfsp`?x8csS^H@?z!<_e~nA^Yh2&eGsR4uW8~!Bw2efS{rs+ z*?gh6{~Fb&``yMrMoCdCLlYHA>z(0XIO;ZJZ>fg+x9+QO=li=;l+~@Fi3zi2cd$O} zwVFCp!~LH~)#+jD@3&D}HmV{*=Kb;3p+T!=^QGY+Ni;O^J~;aKlbKaN=+>_sX=I#F zyx~A }@snJz0DN&k^^ z&27cOm|3Tv=a}qU^&;JT;?ZPRaez+x<3k&qOwB44Zta<~`?ov}+O=M-)1GYm>VzAe zJGZ>)aR6u988q8>_6n;)&2+(ydeylrJtfWjkTStHD zrEyvX;NbGdvO9{Em6D$L*pGaC-Ie{=zVf5lj$*Zy{Ll;E{~f1mWj;2p{MhsA4J)r? zgDXGqLl;{t>$NZa&`YVuYRsg2{`-F9nVyvKY7hO~i#3ncnMq^oqd)g;N3ybA_UP|^ zcY#$~I%hupn?HY2q(qlK_Uk{OSj}sX{qQe7nV03 YDyr3@#VKmVgO ztoVbo=hLzq^F!bIYdx&u_Wqz}UV5a(5*uCf%yVZ_tl;fvUIgCx#sBXA{e$*3H8zht zbFoIO++}90M_!2eegFA?{yT2_IvQQ~i5HKiSh3sb31(b)_(Jf*pZ9P5tnbZhXpM)S zez-xb+H<-+C4(Ju 2DQpYnUl zWzrlr1S@qrrS-U308=Pk`Yt&Aj{o}q&80- |q|I*sif$WrCqw!8=2o_Js*Wf_c2dwp>AnGVKw+F489>-z3UwjSANJC?qT zwLw2Ith_xn5%-3Md(O`Bhc{}aFZPa)Q)1Qaj1dSnc;CR kVqe3Ot?N=RIWRM; x3wFLhl>DLb*AV}%wdhGN;Ir_)sd z>W^K0G$|$3Hab|f6RQ#yZTCL)9@P5-mmR&bDdnSN+)P$31`@Vq6`4Kv;C@@a_1M{@ zWF(!UPOQ=fiZDr8qfmO9>jGxIqZ@gtNLp)3tX3;4#dd0i0G)lB>jE&(hiQq3M^1OJ zYL_U)07Hvl@Am!bJpgN4M_Vil)p{+#iY>bZ$*|CcU1K=+-PD)heE^Wu^O8_L=sB$1 zrLa&<0c<3!)^{cEeQO;|>nsJeHdU}{ON&!0wjxU~lx}?&FL8!d2Y^{3r5|S9+++3X zNwA8BfGHUPN4+0&>ardOE&I6jwG=D3ViE#cx=JdIYOD8PPMqZaT6?YO%00Js3asK& zXr-kNlA?B@9pI(SoZN)mACO6AWuEF!C$@q)Z6z=PT^#L7fp!;W>dTmEcN6Zr)G{mW z5S2HviW`zzV=PRaP%UDXVZirj&){Ijqj;|%>6B$1c})CDMyDcZF|Hmhkpr_xX =`ZioVI(?W~hTAbgg>_mnCHBhN8y`qg>8QG!`(_RTiL~ zw8YYLq%bpp41ldTF+4ysDc@9&35_#aP>dFvIt!+T5EBv#opuYfjb%oyR4QRT2uN+p zat)~uk;Et$3LsR)AdI+dgr*n`KnD>=D7FAONoaVW%Ur-RP4Piuw1J$5qO%}Y?4}q3 zft~@IMXglbYgUJJI3A4UYh7oh8Or^LMjD xnK*Fu8|5O>(tgfAgFV*vP^e8b{OZ%c>$&BSQF9= zP;)^AMX2s^04hv2RKr7-bnc`Sqk~O@u|@#}qS!I0Wdv3M1OWnplt6|ymbA$!9uEr8 zx+}%xVNPQWDwkET0v1`Q7$RU5l=HL&=txa~@W9z#Z?gQ-zX}yby38)LMn)Q>&5i|7 zY!q5Kv*=KOaCyWB2a`s^k_*Y;b%)VjgzkW1XozI$Ie;xTMkqinSjb2%ImP4Q!JKm? z7nAu3jWq@6-li=xan+i{t~Lx>AR-{=1?)snIw5ieg=tZ4skdi?(MBnqRw&YzkkL^Z zKoFp)f@p!lgc96Gat#2t1D01v?zfUg8#8J&7(ozN00zv`s3Is8x~;Yn%MPV-C5x=a z(u&May}($PF&4Wwpcp_*R@b;{E1;2B1&S?FCTT@;Es$@urK}RIQ;hkR7N$i_Ytz(; z4Yi SU?b^I)gQfE9%^$ zj6y^3PSSXzMF$BjQsN?rjiPu44antmq<{?djH}8bDWRBbonyRf3j 86mn&tbz#|rhPV_X4hGsd)}E1AS_Mo9PyrN+P*4%6tf?-q46@EfQZAw9 zaMT#@QUwH~Y+<*-Bt h
{(NYb;lsBz ZRbE$JD22>Nx7#K49H$5&)j~l~jF?o4DOU`i``VS@ zAoWjR#cu|j%JmkDW<~rXxpYxiI%T1^$s}w=*07dX zp J?nV*CB=$Ife=@Pi39G9L2A^H;wZG?T#Cv4n*h z=;J5JI7UBFV8w3>EmRRGsBp8%olt2?YoN4XLYJi49xIW@uzwd3+o=7(4pw|ybUA9v zR@~jl(`98c(tf^Eh&UVOw>J! Sa!oILJVyoA}X0Z(@mGeM**l#l4bOMRaZWC z-G{U!KDUjRp?jHC*6JQ-8EM58+88ZmjGg_g$|Ko5?}=f!ADv>=mqK`q(hO$Kw0d&e zLwTB|l@hd5Wg4d|FsHlCT9HSyK4$zvt~`m=PZ)MGQ@Fr(7lq5%S-7ZnX$M3k&dA<( zcl&fZ`?QD0ld}JI+=8cn7y A~Os{Y3ZJQs#44BPUI1#=9m~_6{DvX0l>B)p+|zI z!Er*=g{6W{!bP<;bO2Y@(DJB?dKVi`A %z6iHQR0>w}|BQ 9LJw%F4G{1F<5RhSD5|;obN?R~CmIdoJE*$~e z76F73)yD^2QgR8N9cTzZYg-GYiLek+p=MFgHWNXRt&x(OV}(cB#Q&{`M`R!0wlI)5 zZmXk0D~lusrUi3y84$308c^#<1Ro=qkEfm};_$--0)dM7BMXVGIARnEGg(`-0*aKi zGJAK3JkISg85qJ{zG-0qCmB}(tue_+1Y#HAZcId=6cyucC^O};&UYC@Y+PI-6eK1M zEtptnLDGVi_C~>=oSFn_8$qIvm8r`XKgfldh60@7q%{Z>1tX24gy{k!P+N&oL0cYk z70yNU(7AjA;UF`fg0!^igeV21^jJVGGF4iv5iI(6L2V`MAP?rtZ~#)%g6WXZCY+1u zUW-v$%QPY*D-{m+`Q~*&yrKT&n+S^1p`t)+TowT`>yD#KOWFx)9BfB#1n+Am+BL)) zP8?f=1wz3vM9~#VNM+r6Ktb!w%I=cYf(1a_=hK3SG1Q)T+X4eROp7hDf&wVBkAMj7 zaRCew5hL$=!!a5d!`1^+ga@roA-Vu-5l%UX&mlc*!w^s$1ZzK4Y$3Tg(cpjpg26*X zq}CFI0$7fgr3ED50f4e?L|mbBX&V7jN+W1OJ;RQxv38YKtW^=|0r36@b9ya_C&-yr z5h5Vel(hs=L^cO1SUMI#8-d&i4utAMta(D?>U9K35fbCYT5RX&a q5(h)Nd}@dxq!%U@C{!v1L@FIjiZnvS zsz8<=;lN1e%|PscQ1{KAff4h$_w=SINMp(}BruP~;4Uo(QEN9G8h3KeU*GiHl791vb{ z;|I+K-1E0JfS{pmK(%%~iRZlX${lfm(Xm|wQI*#7%CREItFZcWY eIKS<4Z0i7RAtf=j8U-KeLTEu3!DMb$aqZLn9f| zUp$h_t3NzLELZDaH4cyCqswR}oyK;=%N|G(&ujhdWwhh))I6fGxe@UW4K1P}>n-Q8 z&JA =(?BG^K?k9{DrzCX1nmJS#Xdf!j|iYPTL z2%UX+4}2h~b^J1l<^5?aXy1z|u#Gr0qaZE!vGYK gp!eNZ)A*GRityLjdq)dvfg^0YWkE+OXzl~`Vc>y}9AWgzM~fIxpcPAC*&KpG zG!~G1f)6A6)YT+*u{F}L*X})lp(C^#n;90N8CP4?s`udG9(iHJ*wq;!?AxJGFbjmx zfJ{2tGO1>hT(j&`k7bc788pM*-W#L w6C|Zq@qBfY+TF z4J%fV1`BCwLMA|6wW9ap;U=GWGLKrUuP=gKyU!>Ti=>sLP)TVagH3AD)?6`ceCjY` z7TW6?=nA`<2<;hyB?M3y9e`pfit&miA9=13v!uO-K)-jZLBOSe8p>1}(5OXL5rSMb zjK2LCBUZAOsD!xgE{&~1i=fa#as(+YZ8%S%fVpP! %Gag{@cXn1v{({aY*c{` zg32T#rZimCD~7=nL&mGdxCn2(_ib$#WmLc*MKL-81j`6Gn1YyVmRvm~(TeSXhPUT| zr7D1-a# %f+XV#>1RDYhnrqg) z++wVfwIs0h`9e->v52+}Rk>UOkqW7hf=CGz^oq$7Ly1-C#w4Vb=b;m;)1pBE6_X2y zFcFZznv}MJV3R9`laJS8RqgOHp!K;=Gb|H9(jp?y_pA%)N(rqE1qG@!dLKIGK{Q_M zFizPxq~WaZ=c;aL3#5P|6bgtS;%YICDXl4ILLo1&*zz#s>9LDc?Jh$3-sgreO$Cq& z<)Vs^Xf3sZ1 ?6F#$nqC^n_IY1Sr7BQ_2tH3pL0kwTxFr=Udd58{ zp2-7kKi6iIdL5kyvAxf;F`AM{oUfKhjZiQJg47ZXAT1XK5TxjP)U%87VCDH^E=qlz z&;Zu^+)ZMF+7wX`D4_Cug;t>@hy{euvruXDJt@zZ2Ylpw9;1A1B7FCGE)x*I6oi5X z0b0-^6%eJgK^hDo=R!eB-c`ZcOY)HGFZ3iracaS9-|q_s>tF@&Zjg#56fvTJs8FS~ z0vQ11JODMmSb1T2*nHxci%}$@YoBMC0n&=t^4xm|1ynAppeSH8Agmft1eNET7bw1% zJoK%LwHPIh0js l7LIj&uQtTQOyp&=Ui(oCbH%TjUJ!{VlBa~^FD&2WuEYND{v+k|D zk2*Z01&BgSsIkN#bVOKfE))R-P((+oM<{Yl`S=47N*JcN?~58*0?@t7ChvKaJ75!W zSztz>6dOAlv@zr~80BJHq|_;p(iZ4d!NyY(pCCc1y-m=H7TYgmZR%`XEOQ;`R3H>g zYA8wzIofHunGuQ_p|lmt#DG?=Yx;aAK8Z61DE7w1*ao`K1*jM3=@X1qT5V`mi(-gG z!~t>~&`~=TC{P^i%Bp}|-A5jXPY@zV7o@1AyTAgL*_pizD>b518GxipX{bVr03OgL z4z$!IL5W_t!u=OrbfO?c_tJtaw9B@JmdtuPy=rQP(qL>0O+{#@F_^GtnhFeqBBjV$ zpj_$nW9`^P#~^jDqWs9+wyAnr!C875rcf4(0TThuNJNIQ4HU7J4j?6zsO5S;`e1AV zU5M&d`8qsLsE0Cr4iq* u XbsM283ABtew^XSi0-60OZO)_-JfmkYXE3m#((7Y7Mdt(iYQnMhF)ZMA|AE zOfzfJ*7wa-pAGc@RzJjt_mPnQ--i=B2YU`uyN4KqMWT}$NA%s!pOB}kCki*C0s)7#lQ z$D32j>htoH#ycBREwUg4>twC;0BKp<=`s;S9}PU;k4qA!TG>T4!CA6vnP&)oX&=i? zrXV!{idd9^wiK4>!I&kF?a?cdi9t%YP>{uop@$Ue1@`5b_O;2*O+cj>8o)NlB1N`` zDUWad$y!u`gejm4*bTPHR or~^r?shae+$Rh5B_1lv$POb=wy-IS3Fj z9TTXMY9&S<_2$Q#@raZ_1ysUQyo(e%tkcDg)WM-fimfsQ2yGjVBkH48fBYDu5r|N2 zx7{TQ9d84L9WHabt0%Q!M2P^CP>J4%Jo3rr(=Hxm5~{FUlv+1-gbwM01vwLJ2TIgd zQ6Mo#R381-^X*t9g9p-J1@{)PHKlAoT9Y*MfqdO56buB4$`P$R{`n)P;t)rVedv?T zV5MLiEMil-DfsnkLain!*j+(XkBG=CU~=SH7lD``{phDIv?N#oZ4*%jp{TZ}PO=F< zQcBwmC?qSM^Geu!wjF zFe|b;akIu!qP9a4AX!o6RkHPDH|C_Hi{J9X7*IkOvOp{f!>YT li9he}`TPFl4_lEIS~3b$S_8*T3eac(I-7Ol9up|9qR&^8So78&`B(p~ zf6k{4aQrbZD66%qN!FqufVIdjM`mLzuc+0 oAHHS$N zp{c;ooyCkvd1Y0nPcXiiPyLyH)8F_fd}LL{ (HV&^ zANa%n+Q0G7`t%JVn5z6(x3pqbI7>xIfm4m~yu8x3&m^(s`1;@Y_x)vGe}90O!d}!m zbPXgc!PGE;RAzdhvgB2_b-Ec>)@S~LzvHj|!#}iuT41Gt)_}W+$}EId)1f;qgISAL z-gLbaQ}Wgy|F`{3fAYtdh^5d1W2XR@c91$uaFW{7u$IbN%U2)QUyms3bAQ?2_7{Bd zDI$PKM5SZkT_{L}#(LKtEF|lYS75d_qlw4Y{+hq`kNRLZuNpkB6yYV%YP48ph8v?R zS-cXnby#A_(?9-i`%6E65S0iWuu8NzbRpGX1~S}va3mgUg;(Up$t;pQ{WJdhKk d5?-OR zwQdxt{kebBkAJFwgmYE2LuEj?l1kg9W*tjjsgv${1d+ztU-y+8(Ey@i1;mIIVQ6Hs z5|_t{ykfVv7(LiMG5Xwr6iOjLRB6+s48+i6t*rCNtG0BHO5~u+hA9Fla$eDvY-zy( z=02ZS@aC~JZdlS6M_eqPR|8rRppGzmrO(!zaU 80ObI&LGfMBStPKPN)EOGJ=rKCZh#A8;4U-C7DIT zMXiLA1+Flaf*{a3EwMtnV>1&1u&JW7)CeqQh%;+hGKOdzP9g>KhBMqvFc}2TA;!`O zQo?oxL1deGobZE9CxF2W=7*@D0K2WLwty|S0Y$7eVgv`roA3Z(07atKgbGpGE&?^; zG7Krbbw&sbauWj}0CBfcq@f^636j= 0AQc27Dk!KFC6gotK{U5qY|uB}Hb7J%cbPZpC_3`oWu-V>oz=(;L1t@t zWU#lss)P#RakrQ%MpU7o)Rbin3CkIVOg4IP!4`kIFcl?;dlJNpsvu%YgO=VUNkI^9 zxE>ka`udG%ITsc{eGb%eF(7s%L>WSQBSwYwhkXP^X(<)~D@dUUo|SNJMNLZ(=#E`X zn9qGG2*h&;s7PbMluHOHkV0=|h}JlX2>ry5d(sOn4oIW|YDJzWWJ{n6&@x10y&e%h z`NzIhd#0r6x#heK7X<=VvstJmC_^?kI? PMC-K&pTUUI0-+rKY0RE?k P^c6UK&eh{o*Y7y zB6}MW2|n=U4-0})9n^AJz?2s)Ox8T{22qY=d$Se=`t%R`{1Yy>6;hWVPz35ZVyhzD zJYD6r$>v5q3i!D%JP|Y&z-o(hDo8;Piy+|5aRa_Sk&oIj;PkPtyrlru6jJ1J0VY}j zB-C&mPr_@J>2MGMreFN<0z7LfP?U-SjUs>$X^!K-*DKiDWbiW|`Q!lzHUqRX6j4+R zPy~zS$ieHEy)761zWDX`fkh*T1d0|ZX+f1UvyNl&`X#%YN$8soe(^&J!ZeY{S}Ib` zMGGLT97p7J%=&sG@X6CJequ=(B1)mP1KI+D)B^Fz6P4F8Yr}Tf XWx&AoEO1jK#)SgP|eMuytXO*F@xUd`45G2(I||hAXK1g zB5?C0yw1tax`aHrbomLFTZ<}%HVP>yQrG(qd9Bl0N79hjx^l#}inc{01yT)(B9JFH z;WbaTH$omyo^PogK;smu5duBO;*%%g_0QU{74Y)&4 ;*GRKrJJ88P7ux^?EyYNIa`EQrjq+M)ve654`Qr~em_&-e9$^J0vYtL!k=ILQ zxW+Jd?CQFL3R1u$YpG!KzW3imUN>d0gCM_Cv>jofDhx!SX7mKrl7uLwDj4GI-9;TR z!ic*GGjo6;bwoMUJcHci?IaNbLXfH?2=6J58Br;pPg@`f5(ZHKM#7koD67(x0dBs_ z1TX*)LI5+0Iud18Wr(}8(}EcYD4}LXQ|BRw-$ja#lOez@cK7QP7y*DF3{W8~ZnfA} z1kgvvG{D)Not&T;0LWcx0ELLxrL(!zM5!mNDX(9kfp#dOFEK0T8=d^otx(X;T14;L> z%>eesu-BxLoat3EBSQQ3Zj%6rdz(;+7`@#-*Ji@R(pWlS%pjAQrx+<@XBN#SL_x0& z479MeoUn#_i;$#Ci0Itjt&%WP)^=QbRt1Jobk@ERa|)paYbyv6MDe;HsN40|;RrLp zi~ DC~c^1#uU%M0+fL*0umoiaNqx{cLW9y03;z|^LC%H3P>R14jGie z!YD;5fzg(WO)Hk-m|7_f)H1D%Bo9Twuy*H9_6P_8kRpi9-5XHsp1p*E1&|7~Tu8^R zLEBm(r(}4(REi^MK?{>jqYuIqVcl;3fhP `jI@xpeB&>9H$dlz*xUt@(Wy3FvjeOutpY`837u3&N+{ =EsM11}V3o!=6p3Ha_P--hofTl>PjoULAB?IMLswHv-4PkxvFZW<( zqzDnATP#9HNXSWA8G&e#f(>KWWTcSEP%CZ)%DGY- MCV78*bXP(~ci zL(446d8 RM`^2$ZV`t}1{w-d3t5quTX_J6 zkiK~B)r2IY6|1dH)deV_MG9!K?XqnsSW1%-+;J?$b;C=R2dP1gt>Lz2h}X9C3%e`b zv;qiX63`L_gp46B?NG;VN->K+ m69QO*_CS?+f6a^`%Err^1Td20z$q>$E z{39OG`?4Eu+ oy!g$fDKmg#l!63kkknj(7JK6&h;^KPfPOTbwP zt`+T&6{h99#wZR$8A9bc8$(%s=`vz?+0H$@=e~r7VXtEfvkr V(v7QNA>=S-JExEdoL1soC7K1Y#>Zxe;nLkM z8Y;PRRHeygX}EJiBVfB3q^3EQBm?CtD z7}rckdaW#w@#=mYqg$bc+*cNQaBkT_D+*KugoG)`Y9JKbYXn6Y&pxVg% ?R_4dy59D*-cs)$+WqkQUpltOlfy0Ax!D?8qq9> z$+s WVONz2@eQgWYQ3}E@Ed_>zd`p5$Y#F` $XuiX7Dd8Vq*h=90~w()rA6;W>$tejUX$>Ze=DMTms@LB%W9Q1Hf@+1 z(@_gl8X(i@1lvOI#lSI>`!rvKFP=CP)hzo!HV$4V#Wu7?6d;mT9i7P(5V}>2otIXI z!*Y-9_PzwK?3p5}VLM40*wkPVlt>4SilBl(ng*r{GKIc0v*+Mm-B==ck1iv!K^Tvm z`vSMnguw!9yFe(`78!(r%6Tg iUV|5>u}xaDX%jt`CJ6;?bC}e|LK+ptt+oq9EHAf{CwoNh zuWj!pp^F!(u?+!NS`C<}#+B$wq6ko+Du5Lf6zRN_sW({VKHZ!!bTwYsMSNGhAht9D z#$@SQ31CYqw9^d(P#C1=yu`76Lb>Pu_9Ao@ueDu-gY9EoEMUO`Qjk)ujuZ+h5T<}& zaUJhft5NQ~%m|kI=8YPo9JHlN=>=K^3QC(=OglDi)G}J6;95R!QiS4E42JvP6t}kP z&nAp@KeDBC3Z+<-K??{CW9MeOkI7_TXjP6puUj_RHwNTkQc^E$*Jr1Q|D|mioC*RH z2ivq(nubZKGDUQ)=P?sOM4n&omq{ GKS(>zCdtw zmFE_e`!?7v`Qrj*!l7*`1&hT3U1OnIumv$Imnz0`xuD$tHd|S*mp#h_KwGCRj?H9j z<-D=AP^q|<7vyNUT;)Mhb-A@&`E8<%*g^+p%w(gpn6(kArMBzH1tJ$~!$U2yh3)Fj zP+lx_?0A=UWtxs4tst!Bh4VpzJlMDvwre~uF`U;jWjkp>nnJngO)j)$$%7tJ1Ix|R z#&W}RhthTcaVVnAIx8gdu)E~OcDYB?N)hL!Ol1lcD1yK`c<^<(vR$ Xp_;a?4H9;x3N>;YZ(xenb)n3>x5T#(1w;ow8N;ya-1ncdj z6x5z?trruNfvGwztrvM74@zOZg$E9-vdVse2MzIRBG;tXHq2u{R-HWiB|O1^w1_c{ z^J#6tAi#j<$(;@J1OuAID;u`tKzGib6$Ag(?F1HFc!B}lkXB4EApg$iY?vp&e vc)IGyew?&=BT~=jE>=q$jzd9sL(cP|MGJ=j|^csP`vLJO3>YYsKbc#B^@{ zbA)w{UIfpzFJ+;v_EF+Fvww-uo_{OT`O7zh8$N7U&hnqR;AWS5mh<|T5#Apih~X^% zn+tG }+D_;$~=GK4C5$K1%6o%8-pP7U@{CllA z&EzXh1pDx>9jE!~Z5QtPKV^(&|I3FN?(pw>M)QqV8wmKxpA4HRzOpVMZ}?rsW$fDD zbP)3C{(;SWrR{+#&4KhkG6~``iejKl`y_F>kz`1wZx2 zl*3HFbV!09eR#`Y{2#uZA^a!5HSEP+`Er*Lz;2ym$%UO^n}~t4hZ`lA{;9qo3N9N* z$}P!>ae_E#cP=Gm7CC&V&PagSgY7cQ)`>0=3ky3{V#yzGARgM}vMa45#~zW0fW60i zWfg9mXdxzAd#j{kos%QRgJs;4p168%S9s49I0*xn0jn zAwnmQ5^i(4+mRB8pwe&PIG5X5qXa_DK7;GD>5Yz*J{B_AYv%!fr_m^VEO!q*+^5a0 zE#(d&wBN#o`ia(A?lAj=oQO>(&7{;}!o7hTE$%F`5{Fn6eh*i=_sR{jypg{u;7pmW zZ=_|7bnA#iOwA8(N=f6`*&I<-y2nT5jQq(V;|ko`BRNYL$;nd=u{Al;OG+5ykwbK4 z^T `7@N$s8gs4 }BU KLdl5PS-O< zM7HIkumhdpo(xZ>C=C&pb*Trsdl~_TB~o$N7{un~BC~^ ayoYx8>w9leH?lAS`LQW27ce{#S z1m#`!IRerP$VKHv hFjCe_we)FDOWbS}K)`<-B-7(u)1= z%e}e18~rhcJo+shzKS*<%R29KP<%0{RB45PoYx=-Dk7EM-R&=TdZ#=^e{9hwy%sJH zrhEEysGr==3MkKO8d1a|?_q1e0?f?ZZ8vR`o99OT@xoiQx9BKQ%^&Yv6sVTrOS` z0kk;LDj)@=S}uyrzT3ME*-%L?Reua&>Zl>Of33-p!(Dfu0)ZNyF9L{Q(Q>Y50*X}T z_H?>qT&LJ&q?JBx{Bc9MEo%Y`)V#I1p7B0)F6R}53l8Uvr793xL@w@qciK*+w%g>& zP4BP&`gb1ual-yz|Lq_NTyVZ@Y^}-tNRVDqdRA+xR0VlKEvVhMdruWAO*6iav|oPs zJm1|fIsVu{zy2S-@umeIG_!o`P>uH=1m*dH1gjueE_(sdGSBXYGfY@aDZzgE?%TW1 z?zzcOD55DVd z$2RPjFFF2;-s1KD`tm46DUoh?xF`1+P!K>!p`f)WB7>Y4*mrkjNO3vVSyDIeAAa}c zTYzSf*!SC`|01W?{?lKs*NAeW?N9jVMtZ-YJXb1E5$ae3M2eK#yD7UCp_xY3X PviCmwxlvtEek`uPl@6N1`^Lp`E()r( zf>o^Tv%6*i7(<6SG%B~ZY1-vUo0Hpi7tB`f{o%J?oZ~8`*FXEYdR zeWXB9pahGYD`4Mwr-!FOWMEu|p77b-?P;2bFvlsq30~}@i`;i%=ExPvZvU4rWDP-S zQup5Yn`@nMc3&tIqzI^7?yA+D`O(`cQnfi|65TC1J?lOV*{A!C-dXfxMPW`isj6Cd zIC2Hj>!0~IH9^VJ_FlPN-^xGudiRVaAd00nh*g@s@7~!MhMRO2^ llRGOQJq5-b-*p55M_JVmGr!ocL1nP)%RNoG44od (I7|HkwqU{) Y~|j wDOC60dvnpPCjj^XP&%j6=>#mmS?D3i#Y)|Gcel5zj$z2jwHtu$XLol4jo391 zJ3fc5b-P(xAtmbx#i-(u2^_p6g2IdhR|FbPfBVb~rBPeleDkI(mTDyUzfqaa-R%^P z5fC##BIja*`*cTHvvkVIHR$ZUd;8AGMiA18tjg@2cA1i)DGBQgWxIeEGEcmBYE*g_ zrsBXAfMoW^um4(5Dy6FpPMm%0v5i3^ON9Ji%V>Zpd|`$2D!7|QqtO5u?_mZ&q5Jct zDx3hIQnIb!z3(sY3kua+vLRc0_}Xo&dt+JU7Pnw(pZ8`$oDKK>`ak>OyZD AC?~+JNG!6DP%eH@woOeRzNQwO{-8 zg1 OxbWy0%ylLSVi^Y64n-mX7vffESX=&w&6X2S4fwhCh#Z7RALfei? zKAtp1670Tz{nx&GR)6zl+Vk7Lb{=>vnbi85k3O)T5rBXo 1ij-~I3hKdkzjE9#&>4Jjrd2ovLf`^;zl>+fAJip6ZQztDo_XY=`Nw%n%&2(sE;u|$NBsammV z+C|zz>0&~~imNzoSzVc#l-sye?(^NZZx;Mb6Se1u{~VX#&`Iu`044xH;x~Td*MH;h zeAUnI?C#7Kv*~m?UoO=X1kJ%S6_Cho3z0mf)45aG%$;h>E*azQS5o)VXyx{}lUo%> zR+Z)X;g^d3rpU -dFWEEhL*HP2#w@65!p_ zc2_`B=s+=;fW}1BfZ+zcHBJlZ+FH4F=Tgm*N2G#QAe2%%bknPm!Zxr$D6)!u|HiXj zs=w(lvQAHNT9n=LN`QMWt(OBJAOuOF7+gYvY}yp7U`uR64bxzoVpf#KYHgv=Fd>JO z+ Tr>{kf$88=uP{Cjp8xk_ItFVK8JniyAvopvL54Y<9fLGg@v(FkV3DQX}cK z-8Fn|*jrsEmV`^YhAj7f_uX$iU-sD+e4LD`i!jNHs+M<4@N(VF>JT9u)Cz;q#NgD3 z<}1+NHbJBvPPJ5*SjRr3CEf(aRb5!u%vsr12CM o-`sQi@hCZ)#5)q+-Fo+3+6vf>w2B3(RqRrB}wVhNzR=FzJ62`#RW>ZQU zR)J;)6PWA*SRzwK2<5r=%lo_ISj*$k$H3?|KO9a~FP5KQf~)JI*AZZ;Ml&%ul41g~ zVAx7A;5K-(iOdzn()wkgI+?ShIcFI$r%*-8Y3-m8i>2&CrPb?UtfN3xC_H%qS= zkt&iPNNP>Dw*stvnvcZHi_qv`o`iX4Obxnz6)D=ZY7+KUx>(a^db5$%Ab^Tw>ds~h z11*Uyl&~EmV!@_co0TaAv`W@-tgN+^dSyrtd9si4R*T!41=xF09LiuO4k`p7W(4ov zh5}{;)UKpXZ?2)rv^2Dov`Rstx-_iMi!GOu09Dqnp|wTYv9{!%O- PfwwRhIS&*WDIGSC%BWTjSOiEx}b)OH5!)h$`sT#ut zT#+WG32W~`u%${OtBr+*ct;&%XVq>>EK}2N7diTW|E|yegfD#RLr=)VGAnkkz5cbJ z!qpdV7Xo~KscQ)+=2;kN6g7B~YD>LxU1Uif%?3SvF7DO~*-&>4r5S(p0=D+)GhrZr zpn^f0W-Fn(jYUd{#UYilSKGz^@$bL=sn2}wt6%@xmp*nRFH)pfd{-&}RNjYKF}r>3 z)mL7B>%DirbiEMZ^>$~_gqYIAsTv*CKrNA)g%TBDwL&4+jd!$77O!SlHM@W@8{M-! z104awhO!+BEwpjnG$jl>4X7=E?qQX2{q}$A=iD7nKm748eEKV&{|O&eEuw%5C}INy zfEWmXgn$Mvuf6%^8}HnB_tx%yp v-# +9~YP7+3CLIWY9Mr>Pfb>o(bjZX-3k)#_9=xkf OmI@%}0@Ml`akmjB1_I{Q zQ0l*vw4Ff`2buy $GNe z4_mrrb)l)VeVL#Pq-~s_t)-PHyRvd*jni8a)+sbYhH7;t)SvTD{+@Z01G8>NU{E7z zaP)9Mvz->HF`Cp0FCVbAm9q<5I$1$ML8x~LUU3&K_7t#9Kvqn=5U+DdC(D^-(1x}( z+Gd#V|KmU7oi{p)#hUX1C7>_`WueovJ=hds(gKm`#if3C?3DF}(Qsq7YQY71vGIbs zbeknAbQ_>W7Uq0$-CSo|S7|jfRa?@r_J900{$Stausi*>a|WRxL1JW*SeD9=m~4?; zbk&flUvFq_m)=Uzuyj+Ba7{X4wi4t*M56^#8OcM`4YrkLgci_Zt&{EV|A&6b-J2ZP zw &{>|$}X^%G>qM4b{4zEn|6qFiL$aqq^mI5 zakDe`P&xK6I#NR2lg0d-|Jirm=& BD$^u@s4xLCspn?$$1o8#AU|B-R}! zI|D~3h2 zr9$nJi&=(o0lIqWux+F-pt(b{cgA+xz0dB1i%MqNMu#nZx4r#xLW{Euv@Qs({h-?N zEC1$Sc|LXc`350E5mh>Xk2O$4*v( mY&;&O!7e5g zT?(y?4GW_mICkgBrd5dxgly|m<~;w;AAah YcW8s5Pdr1NsiYc4a)c=nq}yl$`%Sfl_+koYhM@9+43 z{jL4f;pcr8whtAUPisk@+%FQ=T{2AjEVAqMgZm=8IlUF1n75I}_vTevUimmL?&-Ua zxqGwP;jqtD%7l5|ZC)+x8GZB0)O4Pi3+wE~QgV0R{>1bD{^6$%yLqxMX(NFNlf>&| zd=*#|dfTZk_k(--ZO`6xdds0BcTu6`c EGcZW6i&_iF8 z-UaS;I-$JBeJXR^oL%Fv+-44&>?`F`w$C@6FYfFP;}C9jn==Z{w(ezr=I{JJ`>BJs zPUWl-DVP|rz8*5y(ZfED-LrD3qOYq$<~>i(jnAYUq0YX~?ogMR^_~=Q-_0nYcmgRg zsB+0(uSf2?S($0N_g)w~#UA8W|JVQgQ-|%bDaBIZjdV($Z8M>}#@Yspmd!Pt+pM@| z%OHl`tY%~`?wM{1oE6wbGFiFx*=xaGGF>NghHmw^P1mjJ$YQpKx B%cl-Z`XkWjoq0*SL);8WidLvg536}-a;NfSq;+p;1vKr8 z+Oo`6vb3GtmS9@tOba6!SzlKaMz_xZm5kzg@U~`Uf8qcAw_54Y$!Ya)B85xPVmW{y zX++#kn`E!EH%Ps4NlbCF+ptP `pz)va@VlY^@yNaV$;p zdj9WUDjjy`Xx&h#shQCtSE6>e!lg&R-g@B19eUOzm8f(DUsfp0)26%e>|3{{&}t_J za7sWRZ*w77Mp_%G-NVC&4ovDV{O|u!r2~t-u?b8-u~Ng(q+5jP8fp=+;RUluY0H`_ zW~*&Vus}@8uqOlC7E8lI*1B{9&4k@8H2@)QDe|>lN$CFU5B}fP4%<1JI3Y-~oLC`U zG@IT;Hvo59+#7EdkcA4uuGQ|^X6BAWG<#Rp42yf)TNs=?W|y0oG- nbfJ?f>@b_debwSNk_rS-I52A& zFx|**xp0+fy3o5IxJ(O+_UN+D7Qw}q(2T2> 6T1+X0F^+u)d+N!|s+ zX>OT>5D|I>R;W@cdp_N%c3^MNq!@u3+Z%UdKv)ISt3gahS 2WYSj+hKAU@kk%cA2 zm??~;OUtx9;G Evw6rMp6|L+AX0iT^D!v z>Xs0&iXygr-LTZkbWd^Y`J~!md;Jt XACv_~fh |*VpB}T)fu$P=9TT92>j<{cMp6+c zE`_!jF%%{&(Vz~AbIBV1Q>6e`1$A*rb>lfivreR7SNYMUtfK4U#^l)3uG&%T9dabJ zp#ZTWw4^FFB^PfBwbvg31wjNnQaf$rrkFBl0&^&uI0vlYqHE1W0ck@~wB{kT!ObiV ztq*mp9X9K !Mm (g3c|j(3;iSok&ihF}O(s*3$OYKxs1}HCg3KJ9_j1QBrAyrfY<)J_8{(UPvn) z(CKCZDyy)xuGI1)L$i4@)JDrTaZ_}*f^80sY@C#tt)u`_SfnHrPI_WVmL9v iaLYlks+N30 Xv8j=pj;&nPTTLXYl18$OPLZ81{PKt?}0&yG~bz5I-u!a{vIt= zYB$ q7=TS! lo}L>G^&Y#55ezXh z+~Z2FS8h+kvMrsV?HVej1>7=Rt~oKPWy#yV(qaDR{^Dpk$|YFH5;XR#?l$OUHQY n;%NNxy5|B(A%#q4<)YNsvOcePl|li5*Q`ICRXXs_U;6p%vr8SHNox9N zSQ;DXXfZjeqZr9SaVaxj-H#<6Y`&;aj?iwIWq3+=bU)Z*c*X{{^nw(z+sIOzMG;4X zIhRbXTcxA#-}c8?%z!NkDBAlH;xw7WjosC;nN%H_GpRbwlUQcg@l0@>7Hr5oxMkQ0 z>uT5 gVc5MH^@2$@UN}x5? zl?|nF)kklz#Og@GlNYyQGY7=Q7EX`bz;?0(e8Er*)A!k8gxS$_HK-z8+a?s|8dZpa zVyxjtQR(P+AOHE+j#!YcE_PPA`$~ox24*A`y}hNNWS9HBwt2iv(&@e5F3#C4tg=m5 zGEKl~UY@?*Q=ly@xeHG%n>oEst$RsPabid$m+eXi&;9eiO}4$p%o=vKOWafEa^H^_ zFsznLmjt#S1JsXUlCe%-uT#WKl95p|g*!Jrk9pU(&prgy1+d7`!wtoqb9P7QA%&;& z)=aMXN=KjH{-=WLiF6rLIvIjlA$dIr8%Rksj9r|)VN>GSaNR(X^ntre*Got@EW;A+ zoSQfEG0m=FiosiUspU@hy>Dk6oij;9;nHNWSLxvW6MydK7IqPs_!ydAHihQJ=^3sw zo QV~=sps;w~jGLLa-<^VI* z4DV{CqhEgIPozr<#$q=}DYIwl4rQlbt~N}H0g1bZyuHGc6~t;^-y7)eWMR7>V(`jC z*mN#B)=+#6w4u3Vu$z&o0*d2u2_{Ty`}>s+zWvER|5IAiHda<;l_|{f9C>+Suq)C^ zx)%wzC#3h#0U^6A*}kT1B%?@5ObHOY4A5e?-Mn%sC1n$K$HGH^Bysc}bzaj-$Ib8i z1K8V`+Kp;#*>UGa-nCH2LQ6NakwDdBYwX+(ByF25Wh2vmsV}?jtN?AUO&TL46k4gU zeWC5yh|p}QMlT|DcXM9p;Jcss3*Q5Ty^y _v``GGF>JEah#5j$ra8>xVWN}!h&+b!T13k>AQzi*EZPFy z9Yw*pX1x<5;YkBb)#zk8t#t6^r~mxVQugdqY%p5!IXfUkg*dRXm0{ (Wt=*#Car5ai*=_;g*pPJ04VL{Evt0g{E^?OAT+rt*GUHg zW6G>ex+)Z_F1I01(0sQJOSYm$HlRUSNmC*7Y`>^<@a=E^ 9S+An>`m7 zC#3bXE}1q0!Wvy^91}RmT@+_Xq^{e`N(ayH{KK!^1qg@{@8UCc3 m5zS*Gk@$COmC73 zsy&-aCbV5JP{6o+y<&_KFVVOyk);)iq6$QueO^1;AhT6S9|JUtYYN_Up{O{sr5R8d zyg7nwEZ?mBpr!Hg7mr76`Lm=JE9Kyj4{T7P8hT->R7Ocy#RaJ65_qN~$ePXiow zYDU;K6%>$5FsZ{#=W3g9GrcJZuk&yHo&CSvE}7JO~r>pqfx;E$H-uOWYzxAk}s) zrm&K=grz`jtQ1Lw-YL^iVL2@nrcmM{*qGkzbT>3KPHC!X)$je)|M1&S9jfgX#RxzM zgCzoM5hi8H8mX~st1d{sa-UZ^so9MLMk44}uEm%Mk73%d(nS%V055K28%h?aHmD{* zO+UW-cmF{@b6}RO3mpw41PN#a(5Y?_!Y-jeE20ExlyTEWR-27rTPYwKz}L;y%{weY z8wd&tr_IGkJMM;Tq>G{@GT-|T{>uAP#{%Pw@CtZuDgq;PmI6yEH3~My1}%$7^Bmkz zTd>k9)clBQTTY3EHCAx47WJ!afw LXhSpL7tZmY2AhveT7Sc2zi$tMFiMJGLVBNXH_Qp(a z80%yk7g?+__izsn0TpD~_1K^Kd;h^d|J0$gP74AW#7ICyInePUHj OM~qt^=T)R8@4r!30SPkpp ;CFwK?*-jg<)GJtMtMKvs2Y Hj I>viVwFJr*Zzy`WjfdIQ)|=uiS*P2RuCk;q=DOmp zNv0~g8TkIU|LQ;QXAaxzbP2*6=?gGzmsvNMURom*8LBKhJ6l%9WxZ?etw=;$MTT~U zzMVaE14S4is9lxC#pbr5X Aj$Xs)xUK=b71M(H4+p+Db!|PY;u9Y;c6)q zLER?wo_PkEE3g@~w)JjkdaSiU9qQUCqt7y}RKczzxpI4+)32e(Hk&|OCh!yg_}~4( zrw*NWnyO|5L{ypY&OEv$slK*`mMUbihTdb-cABW*y`3^#Uvy2o4Y{^SE!iDlfoO%P zQJ1syWWW_@zPbrES_%02=KuHi_A>`&S-VC6W{ClA#dL#&n`c9*rxe$#aiJTDw1kvP zShWBp(2x@LbYJn5GH8-bivbna-8wBc-2@dPYj$&3gZ!4i@*n=jrw)I!(E(iovjS2K z wIl{gCO{>v?~J2~cG0 z4CY=M)cn-{`yci*2lm^C1Y+hy1en(sI%j9MP)M8+Vy2@scF8Vi4;NP{p%@;gz7J|d zlkSTp2oK{nqDC*A;|8Z6*R#2MPTjP1?gd6V0e|Y>`%k`n>d^U-8mWahn9#j5Ydei! z18h;)EViBN^f>{0=LV|T+$}WdN?Pb4Ep33knTgq0y6$3qCl7S#GwgNV>#!6aZK|Y^ z^G*Lh|E$VkJDXiG5zq*=v6dErhOJ4 +MHx^>F8Ac3U2B)+}^jX@<)dq8(4+ z+NN3x(JGR_CQn}bo-D;qNsnx)nEEsS>R-Rgfx`NkXX=nZ^y9v|K4Pk}FzK?5z8M3T zY`(lUZI) Ry<`o=csjlbPLfd!*is z>{?#6H?5S-GUtq<&%`ViBH3(y^8fpHv}2jH;Ngw%XkXoLOvwXH!@>4hwzqqD;N88) zyslYu^2I~F*ORNmp5-35UpTp5>1%y+eAi^Vld1t85~JI70CM+PFLt@9HIFdJ&-~qg zS3B&^W=jNgQt-KlxGBxh*b;Pt&Svky*S(Y7#_ZxI8|v)c$i)niN{6` qq{il z9iQQhY`;YLD13C?k{ld&+N2lC0QrgkZ$mn;Tki-#sOT}A?rj`9wzToILIWW_XX4xe zNSUr+dJR8%h2!n9yw9em@#4Yl0e7a!W5Fih?E9mA&uwoG+2^>lhHYYxq51j0GSCj2 zj2ci_Vd(?juv2n#m+` !hrL4w*%lsgdFX~(x36~+U%qH|&q+C! zCwS)8#P?>yH{XRwri@mZ%ZL+aJDkip>A+6fkOZViDYyIK*gTvUcU=>=+=Ul%UoV$s zKH9S+sZZ+Ynqk8$+ulR<;9h&4y@aICuoWX+>NY`y!474!*HBGUXA4UDix)lZ@cW}o z&4E(Rg&_;JlQv4l2{e)qmi8L&tac+PEQMW_+oX}ua3^d?qXm3QCzQ?TvT?5W)%P5> zB)x;XlSorh2VQS;PCBqV972u2W_El%i@5BiVH@j3n>@SJ9h~bksmBGo(1sm>+Ke9^ zvzKNOX0qK3nWT_jIA(0y)9c69&1N@HCM~eFJF)a;ucaMo$DMOD?%a$IsoXKsuEWBW zPWMtpwb%7*r-yDfA-y{(1go^|d(9Szmr6q}aaW*pcU|voj$EH{y>n8-?g9)LSh{dG z5|7(QG6EtWTeA%U7#1N~qcxZ?*FB|@W!nzduUm(uxWoklv#(8ulU9I>fdrbgyQ981 z&peaq4C%h}l|%(m!PeVGLprdmci ?g?j@< z@`-g<=|Js=j|meLDcsPMqA4}N;%miqN{m8SEh&O(sJ$zj!g1|eK)X%ZR W(m5p2PSZjFI>ut8F7IZ-}x`}a3 zN;~E~Kr>y-M3N{>yUbiditcrWHp SIgWala)0Hya!4cWG$X>*dt)!bx!*!Tp z#9X5qV(CKJihzthnO8f|`;LJE-)jc2Do$GMNDgq^y}96>u0(VJQAs)MBGO%wsk64g z-9n(-QDRHG=rnmcH;?f_Q@(0I(YW23xJ2A@Co3NEk*leYb=d{fEz`QqAuU_+L}5}% z*Jx`=Hb_H)wsD~DJ8|6&tx|37>d;1lmX=N2UKXuYp;iFn7Qmaw)<=_S2af*ez-X&m zO#x%?1Z$ RhE|(o~I6yem{dUJIf6B|8zZ(+xN+G_ehe zG{Zf6 s|i)bZ8Sho`_@jyqy8 oT-MVyMP>vG4T_~3K9*jsDu8Yq5yEyC)d1tu7g_D# zqd)$Nq^lN@ZHkC)A#|61&>|KJ3K&~Vbf#p)CPu46+h|ExO`#wJ3)RZu24^%|xhQ^J zrBVf9Wam5T)edxi?e_`x9#CQ(iFC2XF5@ygh7Ro*XK5v26%2= zmffAUR}Kp+PN=&mZG<&YrDt*7u4j=p(!x?AU2(T@^vSH+fsOzCuYwBILTuM10d0$f zTDE6lcA*=C&_cE2S{oa{d)y$P5Ue&Sl!hf)akJC9L)x^#H1c&s$pVlDbuVpHJlw~B z{ 5p+XBLfqMB@djv-_acnN(U;uN#xXlhNHL90*WL_}U~5(lxi6o9k0F$# z%b1unDHy5&2Aukkt9Ia@{TF@#vUod1AxcT1o2%52JF(_`Nn)5tqb6x_dTD7>;yOmC zumqL6YuXYv(5B6$WTd4Lz*S?}t!YW40LVYOUh(+hFa9OVX5UV530(juy$GyVtBr^q zxK(IrODiLslKOQQ?rwyI2@@q@L26pB&)FRUCnEH!V~e&0rr#-qDh7M#QpIEc`G4)F zA>18GwUsIaI){svD4i%{H$g_A#(*a_HPXkc2qtO7)RqJcsu+@@QF+KJ(X{L?;3T-$ z(@cyagHN=p9sJ-A|M8L=!h#Ti0Jj;b4rb*&dy%bEr$tn^8s~MfKsw3X0Bqc^Alyo` zO$7!JP`RtE!YMewn$43 zn++M0z8)d=qJRN~7I5u0gk0O;X|#2dMly3~xpfW{R1lE$@2FKf_(y;G58SEVs|^n7 zHO 3cc4!Z* sH zNOQV5xU4%PNEeIbWQ}<>X%aYh)9In}(tCgb3$0PN*?#x3AFL;jY(jw(DHIu};?2yc zVrKdAXQkrt-GBCH>J(Za7MHMAH$hRFM6!zmvpFzAJBgC)>~7~;(jg$XQ;KRaCEHXQ zgFBXk)4k@EwhNeuHJucm1~CHC{Y1aoaewg3e^#t}X)MavjS!atUt+j|odsPk?y@a~ zy>)D!U{eYzy`#BXm0|TgK)hC}lH;^a|KAl Ex`sKdeXTpW<=}?UgyUpUtdcv0H< X-9z7}TdCKUORNr@Q&D5MeQ;Kt7;)sFicfBv_V zxn+}3B87y*$!wU{7yIhWWubF#TNYa8HFv?+IpX^I2%TNF-Jrl4HZsM=uHFpv3B>|+ zT1BJm8{>VenGvK3Os)RhX0?O&`Ojx5>RkhO?Pd%2o^;kub14(fn#^>&JyY5l%-y|g z%2^#=Cog<9Y(bQ=WMP| e;JHadG$9o(=J|FIS@)PBHI$4owzzd ^mKW0raNoBa4YT|*@p8fFPh1K zuN^ukIUuzT?-OlDCvKYQZ8pgzkCa^6&1sh|R@sDxDEC{gNw?gOKk=78cd+{fLl!eP zt21{emxsAA$0@e=F7u+Y*i&C_=Xt28St74Etao3oA-QI`D-7^#ZExhfcYWQd8Q|$h zHf0lxZJ ^CpF5_XcuQy-Pp2k!I?aHA!->O3;AT%6B9ZMJ8rTBv z%--CljmKR=B%mndl}3iDFQI9@bK*)TBV-#$d+B-~SdoU|C;r@@@lyxy{NOXvT|2$G z5tA%|^lsZ{6TaJ>v)-Oa3nms?yh!`ZmcwbWGPeS&uBPN}*6hYm`;PX0bA=K&*#;BY z0j=@MdKLontN-=y`>A8!e&Q*v<(fTvtc*RC7^R0cf##&8Sd _J z6lX0!+feE)!=83ZXiEVtSeg_ud6z4tX2196fB)x>KHHxXAVJWX?$NeN(ml8{_I8Rb zGD%oiV}xCjJG1kwW}hhNg?2S(M^2h&5qrFvO;fu@zv_0_npmc34Hx1p=Xd=V&ZiFc z-Is2p05{8MvQ|Qm9%w2jE4vm@D1m{J-ky+hwqkJM2-PxZVz3ss;}rMxoPAaBazmG< zD7i4t#l81lcSBlk;b;DHzu>2i-aY+9VQ@BK!`>9K+%D@v8)BMdrfW-y?Xi`RaPEn? zrz4dShHcs;;OlYrzBZ5hOmn|Vu9n##4&6{qj*YJD+MxO7kNnwu>frY64_gvDbK0G8 zWk$+!62W$DiUN%|7E5rDGz_m6+d8A^>Xu$pgDi_1@(e0oedZFxmZ5P?dQE|w3neVj z-Jki-{i2^b=Jw_zAX5#jn`05svvD17ayB*ArBJA$sZ?Lgj=pm*3Rn=5UQ9F#y_`$V zvl+%aU8$CBf-zd`kZhl~gy#xPW!Z23#GlHi4(?80IH0V6(Nd=64ziob2zF?^WTp$P zNmr_mvU8iK?lhp(RxNI(nC1=hY;f&XumzGdEnTD${b+JK4@B+~CcpPD{j{GtPVap3 z{RFMDu`S2YeO+a<1WsFEOHvS1mzm7n+1WEuOee6E(n|!h6K7+1?HX=xmcflF7H&(s zq`Tns%!WcBO49!9pZr7l)WPXvpNZNt?CFG44#mFc(uT+&6S ZQi3e3^!1S8CY)4K zT*y{qBTKfgnyJ;=;xv?KOZi%Ay!%A&X C;2Yo;nV5DrMWZ@!GZG>L(BH$9G3qSJ*e(7@u z@9@c}>166I$ySHSC3Q!7b;oua#8wrQ*G)F_gxxHX8XIC03N^t6yqn9_`dCKFYIalO zqF_&wnuDx&OAUPUd;UN^cbwk2c}oLR(&i=^P{>V3bm0=Jfne5=7+}XSc}}KjiDtt( zRUNQN2}-@EH>?p%Ypu+Pkg(Fd%XwjiBrXljZ~J2(pF6nCr$gH!pi@iSg3C%25kNp_ zG^tkFEay%n%wey{*RtALhE Y)o;j7uyra6R;yQJ9ILV?7PXju;HY-h8zD2VBXg=H+xiF7Ze zPzuQFcl{ndclO!wNd!?ekq%~3C(V+?qG4DpC@Z65!mJohc2O(P3dI&1(L#-=wPJNk zX%Jl`mVBI~R#dij*F=BYAD+)0ocPF-2;fj$fw5_sYT9DQm?#KRI+h1*+=1+FVv{8x znrvYk@#+wl4Y~mX7Fm>?G_5luHD+yK3$W|Y{gL0|=Z?9(`J{zdVp_NZ6?Y(RNq}x4 zEz0f`pIp)nTQdAer4T7l#E`g5nq1DxtbnjODX_JxNkT2+(xAn3k)Qbezse`icb GVR6|lEN8Tgr=r}JWq!OkjIh$Gss(V%NFmZrs? zC1Yt>ftUoN!j@#aZlK%B{>< xxZ7RO@u(%2J88i6xWFm_motvNQm@ zP1-2s>suiZrqjr_(I;sGurpOk>{qEkLrG~7sdky4{)4~OPaeA;`e1~X)k&BR4TC5i z`D#j=C@>_6HPrR79^uxgvF@rc5H*mk)tv>^i|LMdS4c8ps{%WB3-WbA+WfxXlTRM~ zk*6QGMd+q(AnDj7Mpnu~H_(z40@D&_!|6iiOhZBHWRneGckG7Q(D2o@4G66 J{)u!0-5j-~Z&nv)iXnDnNoQS}nw#olb^!3nGv%B_&$*n;> c%|1ZSd=8!q5D{U;gaTXK#J1B!(?$pv=OBY*=Q7TLH(_ z09;6Mo36>M!HgE&Oj{(ibZ+VFG&q+K3Ts$TGEq!5Lg)%yW9ydg_WZuzolhQ^r^6Zv z0ODwN&3nvaeM6JF4WO|YniX5Y(jLxkrf<2WhR`~~j=is0u?I8mf`ujR=13F}iF*YK zob6t~R;B#*-}CzJlZP&v9TJ4m>@D8pMmfQg&4Xyz_9iWoWfNqC>EM!XQB!D%t)a{5 z(8zUeY-kC)N!E=?C?F|7rzxR`w1-u~_kU{m>^V*PiO>LoefXdxO^wXGt)S^@jopGh z+&SwMSDv$u_cpKqO1~!2Vc5GfyG@A{;5eevVx*N^x gPEcF z7~+G- 11XPY3D_NbIfy4ruI-P aaPEdpk;x;BFNu_^ivHloW!aJ+})uGta1v%MD92%va@FCo@=(YjX- zv?o$ZERch`tE_EJQ*EBv3uROE%qI}+x~3E72ubJh P;pVG;Kk()tdD zo8)YFB`|Ca! 8(2$m>QiIi;a+}pDQWcTn4d&4&Q3}UlEj{sYs?s?NV zogK_aX?&WJ>(F9aK5DN|`s$<(47-)u&glX>q!V_?e9UrH>j;XWEzn5}P1Dyq&o|Gy z_N=)&7UO3SOj@~`niM$uW$rmVnZkZtI`=v$TB6RK>E!*f{U+z}X1Ul BPOYm|isXv-9?lyvZhN-v4w_FP%c9dTvN7d3cZa(lowtQXG#TEVg|f)y zF&%n)9#kf4DQ9Sb9xpr2$MpIB_mZH?hyX&0k?bxR8m_rAja;wg8IdL9rx5I9brDi` zOdZMGc4^l8*s@P!J+fh&lWneh)IQVGPEMQMgtuwKnbqp|cedH%b|y?JfJ&({2DXOe zb{=5ez}xI>d**Y #`8bE=N$atK{57KTljT0icFQkJI~D{ca<&dZyZ zG)~emu^2fI=Yn>wQa~3s)oHn?d=9lqXGqjq85(zSroQY|pr*L%a=V_j3;Vh_w67w? zMJNt#-Ml_-AWZ_)u03nOQlOwhRa(oME|44A!V-Jm{TzZ>awv18PT4%|>g+S+;_k66 zrVY?A7nhBB=b4A|&dtT8mmk^A>zq?Zq(>?OhDL}`5GqK9;s&gwp-Gom`ZxZKfAmQN zv!e}No90Qa*-d(KF;2T=;u1~_W_Cl<^ek(d4UGdzn-WPb0lvwuFbIMT&_;(q3uTs4 z*8;QKS%lIb{_p=!-+dODc3XtvHOYK8JKp2_1+m^lxr()qaHG7G-Pu=Zbc1_qY-V0V z>Ckp&HhZwwSXtGy3K*?W+0_MnUHc?pfx7?a|Iy#&vuH8tWOPyh$(w!kG7DRC3KS~D zqNToILz6-`>rgF)^Ad|; }b zGq%hwD;r2oiqF6KKmNOXBDLM#@A;?}N=J4|NoYW0D8e!+F)YFJSV#<9Cdm+M917gw zB^Il0s;MA@Kz9*Brieg;F%ZD}H~vTepZ!dNefMX6uGW-N!p_pt1cG#x0#rf2#1wX{ z;3;Ot;X*@c)sGX9!x?A<+b)q>M8v9W?RFZ2S$^aX|M&lkAMmNvZvTnjIjse#*;WWE zL1Gn93qp;oU8ey^&N+a_X81aJ4Y0T@!% l`F4?nZv?|MK7a+k7&e z{Oq6lDP_~SjHPUuduXvptg)e8h1J}!fjCTJVQXfD%-28%Q&5WicQT
l-I!$kI zLt|q$Dio1q0g}dMGGg~Df$}4_s1*UZx Ee)BnbhKq5>pUkrE45fgO?7V4DF1#c0-AK@n_eE%dv; z^MCpu|Ns8k@>%uQ{_^jfGE1yTFU~d)BUCVRqKDAg5yCWujS3LH))J_Su+vl;C)kv; zV?}{-xq!U?!T;y~_<#N@51&`x`S_pofeL9Q(>PUWBj$XWB& @WER6tM&KnxE*`|aMt za#5%W1;kEjs8%ejE>{G#$i*t2f!h4+Z_k7&><_;7M;@S-Dxg6Nkr>)oCP*SU)*@&% z05#J_hjz)(%$lQJjVnY)0i#l}NILlSAD -~4{lU^4rIKj|wL2G!V7stOQWB&oIBB~{l{0l|`3 z04YmGQ(LfEJ&Y WR0P8L<(53 zp=_j`Rav?;!ZcI?ETZh+^V9$TU-!dcV*8_?__L0^8e$`jqC;KL08490EnN%^Vud20 z0HcaMCgVELk~OvwB{gbq|KQL0zkb^+-ngB&|I!ajgDoi7A^|8!oz_huIvFk0T4My& zMjajXX0Zx%wJH~-!0qq )I1VM*AX-34#m+Z=&j0?4PLVf*zwz}yCSn*+ z(W0SH41qK)3Y}3~7cG``vx?%XR3uQx% =BNHhWEv?2Bxqt;fQ4DrT|=Wsv_;TH+b+xLhrjRF{TKh=w|Qgv_IrQU$3Ov0 zkxZp63Il1$sF08+Eu+%{6%=~qr4=K?+g;Epf1rV=Y07lz>R@zWaNA&j0p{D{nxb{@{nd^uF{A&V&Ngl3^sv zbr685A_(>F`@iEC{luU4d*#jOzWv)j@RbiJ0@yS4Ols8}N6f6jb41ub`i)=rvwp^} zZ+OhTV_;<6)-7DIZFFoW9ou%t>DadIbZn=ij&0kvZQC8x?Q_2K9KG-N )*)&=Vsp8TO~iQ-=CiS zUVTWk0s#=rk;xTnC{)MU&3@a}z(Ij?_02m9_FbynIB}Y5kT@7g3{pX~kO&;ji=3s! z=pOXUEXEYetqDAHe-QDRA2Ycmrn#s$^_kO1>w9nnMQcR}Y-w>F eb8X$;F5XR@cD+U=*?RnncW}t-L0)X2kWp3$V?cZ=qRM{;JM?Q zZhEho-M{y(;0Dn*uu4%Np(kKq1ko1;pVsaESRa30WaFS?IGDOU!BI+cq5xQ5UN7DB zKG*a*?xqF`gsZUaEnoYvwZ+OJ62a>ND-SK8F6dg>-cW=NbCmNBX%jeb>fAfNFfT zKJIMRZFlw2!lpTC+Mpn_YHDkI^{(T%4Fz5USAq3FGvM@R&WFI8-xKiSKVAR=*+JD5 zIf-z^0RSdF&} k8S@K^@W%-Ucu*j$|X14D_)u$O DA}o(;t4)cEI0#e0lGp9~QsAE!vGR4gkYgdV2Z0#x`I> z1ks48U+B2l5=H`o? Ah0*?u*XpE!x`JmcTg=z|1%zO z+c+)w)AxX~v3cM+ IsWPiB*le+BMW-Od#AS6vJ}TX{KF;%xx(xHa7Kw@3A>bl|GpM`U5cL&J_BWL+hk@` zJQ{4Mvwjbn(KMBxN!A~I{N^MlW6CaI+DL}K$N5TB11crkE^98=JPMyDr|~?tew}{W zO*NuT|3{GioX^j%UviRS9m%Xxvw`EPigFJ{%hj|eJE(=tEmZ<9*@C-qLjFgfx%Hl_ z;ThU%#|5krVi)>?+gzB-;L*Mv)PIBIl04%lS(sRs#AzIII5sm(@F4c{L0}#p)cgZ2 zNX3le4EgTE@S(DFK19bdwhSk@QmwJv!ad_!wRTP+ST)?G24;{U=h zMFt+}z}MW}O*n8btJM>J>-SWDIN(^?dKnS!fNF} vHRzNw$u K{rW4Qv~XPd?$Fiy7Y zNMsS#fvQRqr*-s`!l0=uRUX~rR3GNRI*20Z;+SLMzTa&TP!CG{oB)J(ki*y>VBB zkknd#VZeQdqkW{#_mhjvoPrPILyh- xx^MO^GO0za~&s}E^9Y*r7k-j7YS@9R7R$xojf$&;li0M%cX=X zg>osS)fAO9T7UjnULlIYEQpkU<(#L~WmIOVZw^}Z{751}W?o{gng&5%q;;9Xx^)EO zoRfD_c}Q;JhNIV5`BFu}b#K3VxUuOKKK@GIpTG7v7-XI%NsSTP@r0KH5w$&A4*ItV z{;la7Lx%r7zb0zHNtI6)^v-IOOM@QH35;V6_MZ85>ame1JzXZ`Dh@p9xA`qungc)m z!5&H62L%=x8pGVRBM9jnhvp(b&T1rzNZ0YXA!yYcc4q(F{vVd#|CKwN_c8mT#5PmP zMw7QMQj+4WCwnj9ej&`-!1Da`4GI(=8YQgzj=@zsAD2yv+!m$yy8SzT#1%q G%ibdU?ca_R| zE??~Qx6_|AA-4U7{iTgEIu)-uHUspCgzM9gcn$yYRVpbRQsPq-;;vp|B;#tmk=M?H z_{xbDk;=)~4lF9$C0o*8<|VW3pMXX43?egX4hBw)UkoqTgQ_k^GP+Orl>=vkTkR`q z^jH2Ol*?DL(u|jY`V`olYIaAihxs>Q#z!~Wb6tBO?Ih8`Bt%jy3kpe2;H*zo@=Bg} zDtE*NkgkV1i!fX;c4C_&%XR{L&l#C%tI>PFN#edz^nQr0rn6UGwI_ R+*uiSp<2Po-)MW~u$xx)y+Y3Umvr|gcLwl_+bQa#j zh7&01R92;o92lR?Nw ?9bfXe>5QJ=W!fzeGx@_W)2rakIfnZbe~uv(5`_IO0ZH$)W(57R7*s(U zNmsJTYJ3a7lY`<1%@?wOg4d;dk9|xH-R*KPNL>R``PWI`QKnxLZ 9(LNUG4zg2LaygMNXY!7O@p;{QdVysQ*8_khh6SC{O@3E*v$Y!d^ 2KmldW^L;XwaAxMZD?v5nn- TeOWE_dVCfY3`$2){)Q$7eyB(H|QXh{}1ec z*b9l$Gw}-hO$OmX#^Q?e?Dgi(23I3!IYqBxZR&t|15J0IWJfwP+VZO 0isbAvJjEU{kP#xbx;2i+}(%lVYeUpoM&FN}Xs9d&i#hmrMO$T3WIb-Ru z6+~oaevfNE3pUB|H5Pe&7D-ttr5}gDa}4%NB>Sj)G4!MPHa_<01hc0I8(%(FZC@>& zBjQ#CEB;HU+D$v5TC%vDDc~|FNvL0z3BO=xrvX<&;)mb*_%meg;7t~2=+2m$(TGsy zVWP>tMW|ldIy4!_>hG&i^b~ raKmYko?kdDDh$e@NJuZ}A!VO+K1-?KQM2{a^=nGn{m z2;Xd?+Z1q>*u4E+k~ZH(#>X*310BT!8@d~nn?jy=cg4q!NOg|dT|%_NRFh6)_jd~T zOItM}XPv2dKU&efg4BxHcvAd?iAMwd%y_8GS@!*@iqzz lYX z7*CD+7fJrf2i?DX!M3xUf7pH`mYR6En!=8Fney$^@%X0lFAChetp^ECg4ak*ho5L* zAT|E6dz+6I$zGzfn@)4rGInYrEH_7cpns`WpeN+a;tOMDhTbO)!W- rv0Yq* zt-tR<9Q?Ov{-fmaA{cC~*{frb?nT$EK3*yn&Q&@O_ogZt5`!b@BJ(jcQQ#iCpVRe; z%=zf7XjpP@k+_Cbc98T|ddYelZTTN3#1PIoY&;aK>5H3eP9G|m)H;nIJt6Z($KKAN zT1r>9FmHmFwc!R+&63+azp02%#}w%;`RV?jr`f6dV7)IFI+ 7IQ;CSJ{ z?BJIUWdIvh0($_LZzcS5kM{li-;~*3V;9gC=P|82PKv?lt2C{xGGG3ISNUGrg<*)X z$Jo5+;dMk+H{WdF^EFQc@E6bgOE~^5ChIpm+2XGn6F$VV^RW1Q>eM@;&RgF%xky%i z@`bQa;UkDYA#5%GS@ASP`d_ueKkD5}6tm_5RaRsVBz0puzJoMd9dv*lY~P$1OMp6) z@t!I+l+j0)by6L5 T`il{^l0$B@;wzq zOP62J8UmG;0RE323g7k>lXrKz@BdVV|537YJ>pXS(4X#OtPIT$l84#G3Vz@#_{!Fm zU~%PmZg=TS-BkGFJTa=_f@Wfp_J5Y0e-B7D^iYhkGba&Cgvfvfd-%C_s7KYIX5gaR zi-$4atFhkDL)@m|JMh{|-P->V`#+KJS3yhw)gDD02zg$L+m3ZE3O-dU2Z{B<_YF2l z`3h0@K8 S@74WDxwFn7#9%6{5$S{5#*V5JwETAF&|AFjXKyl? JF8-Cf9Gx&ina^M!2!H-jmeFgonr^xFtNEo0S0DxecyZDd?yPgw=8TP1s6 z4I3IKLLWl}df=Vk#^HV|_n1KKadd}wbV7zR?HwyC45)_~Dj>r9MICzJd`0ak)JPZC z8*I2<^?O-DP-pYdMxoM#&hpf)afs*-M-xE+05XJ3%;wJjjut&bh|fO!R9q$gYlFaQ z<=uiKjB9a6e0PpbOum{bU?KRt=0KnPCcn8cglmAi!hjOQf6OUehY4%Np^MW&D=vn< z!{s+&*prc-Srw$m01R@|&Pps?kMd#8eAAcJdK$G^i;v?)C5ftqi|