From 2782b317296a4e0e77d1424b34eb282f8864b16a Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Tue, 1 Aug 2023 08:55:04 -0400 Subject: [PATCH] feat: add landing page, improve onboarding (#840) * feat: rework login page * feat: fix for form, match design a bit better * feat: new image copy * fix: redirect to user main * fix: image copy * fix: update illustrations * fix: bring user to dash if authenticated --- background.svg | 42 +++++ branding.svg | 12 ++ images.svg | 171 ++++++++++++++++++ package-lock.json | 17 -- package.json | 1 - present.png | Bin 52422 -> 0 bytes src/App.tsx | 9 +- src/auth/lib/index.ts | 2 +- src/auth/registration/AddressField.tsx | 57 +++--- src/auth/registration/AdvertiserField.tsx | 48 ----- .../registration/AdvertiserRegistered.tsx | 26 ++- src/auth/registration/NameField.tsx | 71 +++++--- src/auth/registration/Register.tsx | 87 +++++---- src/auth/registration/types.ts | 6 +- src/auth/views/AuthVerify.tsx | 2 +- src/auth/views/LandingPage.tsx | 59 ++++++ src/auth/views/Login.tsx | 8 +- src/auth/views/MagicLink.tsx | 11 +- src/auth/views/components/AuthContainer.tsx | 43 ++--- src/components/AppBar/LandingPageAppBar.tsx | 107 +++++++++++ src/components/Background/Background.tsx | 24 +++ src/components/Card/PaddedCardContainer.tsx | 24 +++ src/components/Country/CountryPicker.tsx | 20 +- src/components/Navigation/Navbar.tsx | 21 +-- src/components/Steps/NextAndBack.tsx | 56 +++--- src/components/Steps/StepsButton.tsx | 38 ---- src/form/FormikHelpers.tsx | 49 +++-- src/theme.tsx | 21 ++- src/validation/RegistrationSchema.tsx | 11 +- 29 files changed, 719 insertions(+), 324 deletions(-) create mode 100644 background.svg create mode 100644 branding.svg create mode 100644 images.svg delete mode 100644 present.png delete mode 100644 src/auth/registration/AdvertiserField.tsx create mode 100644 src/auth/views/LandingPage.tsx create mode 100644 src/components/AppBar/LandingPageAppBar.tsx create mode 100644 src/components/Background/Background.tsx create mode 100644 src/components/Card/PaddedCardContainer.tsx delete mode 100644 src/components/Steps/StepsButton.tsx diff --git a/background.svg b/background.svg new file mode 100644 index 00000000..b6d2a7e4 --- /dev/null +++ b/background.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branding.svg b/branding.svg new file mode 100644 index 00000000..6299e205 --- /dev/null +++ b/branding.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/images.svg b/images.svg new file mode 100644 index 00000000..4f48d804 --- /dev/null +++ b/images.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index d031354c..3957240e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,6 @@ "react-dom": "18.2.0", "react-router-dom": "5.3.4", "react-table": "7.8.0", - "react-topbar-progress-indicator": "4.1.1", "tweetnacl": "1.0.3", "yup": "1.2.0" }, @@ -7899,17 +7898,6 @@ "react": "^16.8.3 || ^17.0.0-0 || ^18.0.0" } }, - "node_modules/react-topbar-progress-indicator": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-topbar-progress-indicator/-/react-topbar-progress-indicator-4.1.1.tgz", - "integrity": "sha512-Oy3ENNKfymt16zoz5SYy/WOepMurB0oeZEyvuHm8JZ3jrTCe1oAUD7fG6HhYt5sg8Wcg5gdkzSWItaFF6c6VhA==", - "dependencies": { - "topbar": "^0.1.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -8747,11 +8735,6 @@ "node": ">=8.0" } }, - "node_modules/topbar": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/topbar/-/topbar-0.1.4.tgz", - "integrity": "sha512-P3n4WnN4GFd2mQXDo30rQmsAGe4V1bVkggtTreSbNyL50Fyc+eVkW5oatSLeGQmJoan2TLIgoXUZypN+6nw4MQ==" - }, "node_modules/toposort": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", diff --git a/package.json b/package.json index 7482d317..b5e03f82 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "react-dom": "18.2.0", "react-router-dom": "5.3.4", "react-table": "7.8.0", - "react-topbar-progress-indicator": "4.1.1", "tweetnacl": "1.0.3", "yup": "1.2.0" }, diff --git a/present.png b/present.png deleted file mode 100644 index 08e0aeeab2556a597eeef7e960bfd2f5deae6405..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52422 zcmeFZWl+>__%FN?iuB6T-Cfch?otvi4N}q}Al<3R(h|}VOSg1`N;gQi2-4ln^X2zH zXP%em^_e*g>W(XJpOqCN=+vLfoMRAP#I0n^xZ|TbOS3l=G$ejjE$wYTCIf^UR_Vk%*@Dl z@e%eI_`euX8RBXC%u{@;l$S2<%)L(Hz63G&z9e8a|Ex%ZPlJz*rXWj$#uG97-c-=h z#B3FP{`fPaSFD9%U2SbsbMgMM_{QC;d%bs&!8;Kwhm|M%hl3E}@bONiJxN5_A(Ue$48Y7uWo4nd8Fv{xIB zZnX}^V0gegC0aTaf)mr_=`&kamJn$W)+!XF z8(SgZ;ZrDUbze+zee;%UZibz4oBr{nrbuydG3}@0y{*jM%b#>8KSVZKg}M<6SA5Xd zkg%xAKOeiLBNg}$Hqf&>yhbSI281c4BYzL5O%rS908K>PAFOON>fspUXXSM<_fS=t zwr+FdeG_|+6nQRcQVCUomUJe_LZLf_${1c5CEKnXtT|nuwFE8isD#aa?7>GIRgdHT{Z(IIQ$mT^dy{vr=ejuZ}aOVcM`@@-P{yOUYMNpuj1rjU_# zD6~c&2KPJ|sOsB}3;Ti5DUH@G-Cyr?J50v;pkXbIq2aiRX@thjZKPGO8tzj5{y9Az z5~t(w0qmL(SjL9MKl7^86pxh0yEd%kiERB@QO zg&?fyk7g4Qh{OVlHI|WKeN|yF398*YN^FR9>bykrcdG*NMtR&lp=akI1?T#iuaxx^ z;3-@M82LIM)gIjAnYp%H31OO62^zsdM9dkVe{a<(&0a9G`u#sX5A{p z+X&QltK{)ILbgxcLaa#6lQ07nmFpJ0JV!$tAIjXeJzAp z!%Y=eI!Q>dh>LoYXdZ-PIZpZvQ@`cyU#4MHaG;=Dbq#td}EWge(v2^X&Y9d9dm9q^fZ z^IQx6jQc<1Qq~jIRd-3M{D3=*Nh5ZU^sJ2;xR!c3ghieFrzquIIG2#p*AAYiTa}J^h=-iYxpNKfAp9)F9lR zDHCyBtNpIzx``G}6nrK4;IikB1XJx4&j`S}p)4^yTYv#vUs!dJ6;|r z5d_tK*IrG1{seECS?aRwYTD!ThG8l31B21!u}NTyG+g>sfiWkY`gtJlBT1@9eN$>I zSy3}*l0>is3pgLLx}3D9kyi+Mz0N^9`#D6cD*Ey%(-cc0{_gPJ@ej&-Gsk#p|CF}B z8+Rfj1QjeVFNgC8&6K@B`V>9sWz2N?yplmLz+fH$+_o8CUoR6K2sy0b%x=HCVuqP& zN;oK@mbYeQx|ufrZ}{^k7t6FBi{@&6+Lx8nMBHArozIUc+L8k}bg$}@@{2Acqs=n( zl%X{!j}h^%+`zyy-Pe@zZ!iCR!@0)!+=x6ZACCO^wph%isxDF{-5N3wi@M*B*S8_{ ziQ4aLz*)uils#5$P#EH(ZT3BxnQbjuH70nhiYE`yPAw31_Ud>ofBOEVgQ{NaRT@9k zw62Oefswj9AIbgm2x(A=iz1W{FPCbMzm=T*BEHGIcJy9%A?jl*7UkuQWq6Lq!9=J3 zsAQz1Kr3?0m4XQz6ooJ5^%s7V7f^+_kgbRlMSI%4*2hK~(WwL(7~VTK4A4!#yFE0% zUoI+*8##Ew*KMvxB+KF<He=FGpPv(PRP;w|obBjLMQ%4(%qkhbb%b)hWO)!;u_<)zEA(uWWGOj1wT zYQ~R!+>fAsx%?2#;Ku)1Pf9P61RB=VE7|sH`Tpkk_H~5urNp9pxH+pY??cBpzXd!5 zvDuKUjzC;1H2QuQxAxq>iIhn|AnvXU1_d%};JK)S%&(cA!s!I7#P)d~HtK)9HeLCZkCcCKGGk$k`tw6`hC_RR}G2egK8 zIj^(Z`zEw5b&_^ZSn;(*I(FziC{41sfhF9#b*XiLk*=8Qkr$RXu_LPm_bLp z&)=BV#r*)~Rj8d?V9$DaaHYcbA?&s*W>e)M<93p8oQ1gQffM{44(tL zTKx@)G{B=ijeLYcTk}hit|U;W*eTofDaWSz`wWrWTqZZU1RM+OzhwFZN6pLD?dPmf zb}spW{WyYU+9fQa9Qw3$+w7%}ev}|SGS0u}I`yISr#$uj@_vvQf6>q5t9J5!MMATj ziU56ghmnAtp%=`(<028;^Ly@b3=8?P(7Q-L0^6M7+AK`6RM%Cl?JiK>r-~}kRN)Wj zXZzXBHB%LFSga-0Ld-U!i7HEEtO$^KW(UI`CaK`!)JlFL)rMKsy-EwBvAzM zb&Ji*n*smM?inlMX0f#TKelTMD8_La0UE9cVg#JKA+Pme|5O@VgFt8LQ;CV}UH#je z{SmzOI;X^VDsD;-Nv9c+D1wW;7`bUbqxh!_WD*-CvS_tWk5MFz(?(`Pq4-_hBtBis z#4!iG0b6cySmD0iH+i>0QL7CRNs7=3LWz6(G{p5!kNKMe6}+iVQQmQ(Efie^j`I(( z{_eia-q(Z=90Thxhz#U)LPLO;k81~UjpX-4aF-}{j5G&k9Ya~Fo4#Gcfj{T<4+~Rl zq^D(NNonEtvk1gBJ`maM9n`MZ&rhWpx?SgzxdI8svAd$mm<8|W1m&6+Gv+rLgN3J% z-w&?ht#3R8Y)Xgpj4WJq%7RwFAnT|K!xP;AK5aXqdLKpiioE~u3hM3=j;%`Uq$ywd6Tk2HfdA~`wK}nx)onc4fdo4nbV3J+J=O$RWal@} zeOgiof^@seO;XW=Al zT(uxf@u%1NB>I+Hf12BO9?d}^X1opPia2DTAH)i2kt{p1XmIQxzY*$zjtknNq0*0E zWf(`i44#0`(DNb1UoI#bcc`Ns0+u%yV>Zkd+lb~U!vB4mqi7vJ(t>og=s`Z_GBtZN zd9;IJK`cLi8Gd-37vAtW8>}m)2Zx)O`r=6PasKM+hMgZj*if~g9xY_WS&#~i6TqcR zl(I34!YIEKGL>)OMdj804m31XhMW92?PWS}hQ9O9NfJK}^jl728VS?S+v2L|24%%d zL1gSuepY{}+BY!&+v$55kVfs>ZuSO_iw=fYthUmC?M*ub!=i9r7Z!ScvYN}rX~;dx zFLsIXc_CvE-x||^XJl!BR=>@Yk7>pu9GUC>9%_W<6Xz$kA&Z%Wy0FRPqtO#yq#${tzt6zqzl~9oRA?YCnp_hg*rTkp? zt4R;ch{hlD68WBmSTTJD@6NH>=h@%J9)f!PGA<)B@R;}ikYns)Rn292)-3jXl;Xa} zZe*snM4#Cvb=Vu-5Dku$$DO@sQ_wXuX zL4vuk&^GmaA_yM}<>Sr6A6sXllM?c*LqN#ZlQhNowE}FMw@JtH9WU5=@~sHf4LAto zb37hAG|Um&#<1swlVc=kmhupAE+<3;i*<2@4(xQ`7avIlg{VD)fm!k3oBNYsa2dg) z4IH1p4ulDwf`^1m{QYkT=2WSEl%uimzTDs04e(EGv`+qx&&!cF%ZJGj)X zPlE=O=Q6xbn&>b=s2zm@JOylw!GFfq$2trNyI!>TjHEH75y}r#hlv0NEYat7gHlK> zp~a7d!*@`R#>0k-@HUc|O?&`5 zgB0gNdY#k9#}WqFnShNwuvlQc-m|$>ie^)gkBrtnpp|tgq`1MI)>#f>d zW{Zx1EN`O#44OJ*nKOoej|zr6zEjHPYN)HV;x~7}WFk^`z!##cugyF@aY&leZ}A_% zJJJp#svMfCpY^V=z_HgGUV}eq#ING z9~|yB=fjt;`Nlv81xxgLiHwTB7qJ-V^xy7YBDoNq6P?3X+%L>%LD-#PilV-O|JJz9 zvK!ytcG4&g)|b03w_4smsU6VB5N=U`uB2Wmfn^L_E|&h5-=oEuufHI~1?=X8{Fs^a-R{d{ zp`^z|!&Htu$_ujPm5Xn>x-K|N8Nneo3a&A{pZ|)=)=jc;Y5xu3jg~oFh~;m;*%B@F z5R-EuBJ;-2ezi2-$FvrGjIDNlPlVv)H$^?QR|JFGjFucE;^#Y(aaJSUpWOew8w$t32x?y$F0VJ_z% z0~~zoiua-{prmAa!bpr`Y`t!TI-Ki8?AphGaxzQF7qS>YeGxGYlUTK87jLMy&coWz zrkevPvueTyS)efZC!SRnakDR->*Gmjcg^53Q&sP#F}wYxZq|6a^&S#9+fWyY#OD2; z1R`ha2_g7s>BPiTKkwt}eR$fukW{kYaX$YLiDseQW35AF1i-*a}b(!vd2?ixG~VIo{x2eH6F2Dj9!3yN`#4Zd3exvh#XFTt&MfuZqFMa zXC&LkjZU^w$^z+r+txPu7}l^FJV@tbQh)d`7*ktg*)?m%twHiLmZ_S{4Mzi0t5=&G zFU7jEGn)H}dVBwg?-Z^)`PK~hBqU(MoDhpb3vTxV7Qu)Qu3>Jl^gjWQHCR?$Cn+iWo=5#P}HoZ(YNzIk4Y z@77bA?PUgT-Xu8SpZZZ=Bcns8h@-eC49@GF-Ko{nV~0cT2Ij$yTa}F96+v%N+@CSu zs5hR#HhqmggLkFW7wRJL7`AaAi}PZIaZM}d*ah#hMJFMoXGkWTa4LIBw2sQ(t79KM5oK>kSpRWPqIya&e0uF+~8B zFL1^LPSGArR<1blYMuL!-Dia7-YVsCv(D+4w82v(vbtTPSZ-;EZh?~!yn)M2*V!_T zfAdYa^HN1p#NICPT*JBIrFaPj%F)MVap0EL>_t{ z6W#P@`CZaZf9{-Y=Z-0%%(*WG55oX4ik7Y199Ka zyK}Jz$&*g>M2*b`x%qg<%Ru{%^8({!WjRP7IHV~gMw|}Gm8PXosU11P?F(I9Q*~UJEZVvhw8JjG%n{^<~j{b7tri>v8RnzQB(Z&iuqLO@9 z8bxiKy;Ly~)K8uOPsz@ode)n%{k(KU|=QQ+3eb zAHB#;mNP6jZQO{I4gZA^*L^fSs77JfG9}w8pEKjX%G>Z*hhL{1fEtzq(L=fQg1 zHqE_DClVsx17IPLthP^-(R=?@+HGcKDsLO^yc^7Xu60#ukt#ut;TtO)nf(6Z#TXDm zBrEuEqYT-!fN7PaYDLn8!h9r)pCZ5Nu2A`CZz3KD%o>iI*MR|pzemR;FJlQ$d4|9G zN2AI`Yys0fmxTtcfOpl5SyD>x{@v^@ zQBIdmy!up%N!%gV!h?4s;g=EqF&Y5e^M; z8!3QgfbfCVpx|(qcx}3l?dMT}_+P^h!HH6LZsJCtHoN(<6mrf)D4`RI88KHb2E>}u z0!m9_2ix15Rv8(s-ikmJKej{Gue=Tl=31fj%*$;`Ip$ZHas(=Wm~VFLbl>m%AypHy!`Ab z?0fq|-hqZi;Yy8pNtuC$1rN_L+Y zcO9v^7-GktCSuS1FeL6~{%x^Z1DBdDtxY&p7E1V^&}B5wbUC}^oNvz9Z7yEWl)G^~ z9_0i&r1$&6?!SrGYiM48wVneeH}*8eO`b&0<$!a*C>|N!(DtXu5MUxgoj7f;zEJGE zEHj4{s;T#%`qy-ulXx+EKQ0@)Hxok?e>cv*M&ktD2h+2oZW~#n>IUJ1r_>RJRsZpe zxbQ#bTwTldDN|kI;7a)=$5Y<%1`wa*YO0rh0!gJdRfCx*)rq(%T`|X_qetAQDB}QCXK4-(2xtj_1C7}1rPQSdM4!dV_cuZ05T4~zz4jA&;RlhLe|$CEi)2_ z<(v=7Y`p4y> z$#62?3b=Ek$~V5|{eK_{uolImRGZR7vPy}PkCe{U8?EeoSGPE^}4c3QfrzWs0G8$uuWLlA6;M_XU?I*5rHma4Ry-7})A zP84w-5-*FZbYIT-xB8{W7Z{NNy%xBv+02D?s&BQ~RnH3F?3}cdt{0G|HmoeZ$0H#W z{1F%d75^87-GuJ+Ysr#Z@wh7zk^eSZQ2vc|JW&CpIa#TlF_YJVPJ_f;)qsGwvS7Dzd#g8}+(uW;yt}D#sG4qfg^n_A9$>*`gy5185od+?rxRxDQ*fY$ z1R@|(g&SCg;n9A=kL2w+XCCI`%S^a1k7)nIp%KXotij572e@RYU$dH?{#ddgQU`6A zpkboL2*yz53z(Kl))HGu68}VHX?Jh(Q-MNzfG9M^lvBKP^D=QT<(gBCUH_JGrSBp; zW+>%adN4hfu1YETXo~%rs@}$l`R%Z=gIcp(uYb zcw?-i#y#>Ys!vi<3NWjFG%u}*Tk|Rt4sZ~OF4m4ofh5h)_Xj60XUCa~WbsxtJW2a* zdAC!ZXsYKqp{3l|Ozdo;cOrx+oHsu}FnbzooPl0JY{##h%qBZw-u+v`|F9+YTwS(F zd;BkcJu?QDbgF!IWwnCg$dn|}t2*BGQGdgIzwD^|slk)aaZ{0GA5m}mLELoWk;#bS z$Ht+U@za~n@l|M*A71i)CmQ}q21?DJaclQ750yNoq4JmZIN;ZNYW6OQm#90O*P?`| zb7m!$k&sbSC1a(pb*8yhJSvzf6el|l&M~oyhMRz|6ENO z`58jIa}v;L;2IVk3F^hlv}pW9YG|7inyB-F_vs#!tVsoME$_S2EL9<~V+J6`kpMSu zSBa0Dh-a3kyIx|Ltx(WC1Kpf&UX%-YEbSh&j}wU)m?KH1-kHyLFZEzW{^&&H`aDaWF>(zvxTaqFOWpAU1YuF5BBwSqQi8)0Um{262x5=Mwy2%FGyX@| zO*t&#;v)kNm&0EP%>Doy6j1Ble8ZmHf_n~y2n{@vrS2@q7Uw?vhlp@!F0R&dnf-?6 z^#%oApR0#E@}#)9@1Oe(d-dug;v9_G!8E2P6A3PQ2EbH(@^RTp&N)z(^3Bj?S%OfN z<4=1)$-<@9!mSFcb0@FCr*Mj#qh{#_wr(o|KES(l6 z=pVWUjM}C?eMEg=nSdskE?=blt!khZ;7t9G9_6;tI#N}-P~Tv3)Tzh+_Ife^OXn_4 z;*>v*EN+NGRTQ6OMbS``mQK_Ojeh?7r~(NXe(~t-qQ^@~J(%2I)HskBQ=4}ltFNg$ z?1c~!_UR_p15DOC`axa;jA2cRoe=cbK2S{+AQ#qfX#&X^{Upo{VTSQxzWyv6Z=eH@ zrpW9=u0HCKoigFm_a)g%tj9~fut0>M6rg&2v*J02dg9%KDk7)gtm}Vjf3T>Nj^K*6 zBy+#h|m3eExo)*1*}3Q=~#U0D}oS( ze2>S=y5!yfgYOSS^#&ExSL7nz&^R)(kA6vNOqI#N9=(R)@p?9_I?u2lqMhK3nX;sI znEL{~Vr$HaVo~P9uBHs8)j&PU^d&yL>rsA~DoJldYduLj1#(sVmghh0CFL&t`0+++ zu!s7YBU+K|do(T36j0Cu*^Wb*b)uSTFeWz}V|4ues;1EB-oTbX#Md_lpL$p79Cv({ zIbff&IeA*1palL<$J7dELz-`^)X~3y*Yf1O8EGoHo6zk=J%t_hDYM#HUuUi0GD7TP z8JyP;Z5uD&x2xFVOl-e*No5KOAl2k`s7m~`cmmZFc)YYUSvOLr_IAJ7JshbpUUQP* zt0&ud9sV~bz=}RJC_BSwtN{hZqK8;3%r?2$rD_!@86QJdBHIAqvtljlq9P%`f7jo| zF1VDG3H-TSco{?Uz34L=OpENJMFnxeMp&V(C$kLnbzHuU*VN&HM+1gaZoQxU{XI9s z$QX(Fa|_z;6S*(NP{NOI`(GG`K2-%e8&kk&R}Yu!=j{g%42WeQ5!EYxj9 z{JD@%MWgaPb717vE=!e2dog7=vKzjR4(!=zk%%9#7mbJe18dF8zkcBFl1YRX{vshI z8*_KDmwcy%exTAx&Rq<`dAAcbZoKk3J%gJ-0pq8SaUFL!B8UWx6=s5lV#c&l!L&0A za%D@lyF%4MvkrW!_02a7WyuFbi>5VX)uIo7N@5nt`?)csFyN7^0_nhEpDoq?$d^~V zCq^^lMbrB>xLWqL`jpobFns1zi|h5}c*BdFCEYX`h?aEhgt;}=9P4j)JfWE9Xl*uwMb%rf}y;=qhVuIQcqrI zg@k@ziD0AgTy)1o8MR^QB3>d6dA{8#{hk91^)P?t|Ao?*gVGO462KwWBt|)(855CG zng`%|pfnm4{K|wiyoQ`(q#=-yr<2D~L61eivRGaYYHXy5z(H z-&ax(P+nf5ms);xl=syBjehXj z$u^VE+FX%UQpDoMw@}V@Ai$Y%XS2kvwZqUyLzThMF2(bHYxf|rS8(7+*-+v4!NYq( zzmi8aGK7Rzdo9<~s{n_Xfk1h5lPp=8QM`yn3 zduk17p*IL#g(iHvSmh4D1I3x+2>KVId|4^`aI|JuI`kX@8v(VtZ($!cB@e;Y<VZ_NHeR$-i9 zWt=6vzw>viRDV7MSF%WL@2hzbtko1B*7Z$@H*d7*?=&a8U1KsVENoaSL7&oN5$Wjn zF)CgF!BYI@Ymm&uGaj$<80oCloKgSTKC18^F64!8`#%KZzwv|~B`wbAP_=F~uc{$p zq3;>o(@GQ>+ac(Gq3Ow@=_s6>ZN9G4R`S%rpOf&?kNDnZoMe6;E}uTH^q;_}BWg9gADg3eo-c*URT}8YLZNFleRfXE~F# znZ-toaO}PHISS%BMFh=Sh?6*gT>})0b_p_GaOp0hZa&-%klG=Yi}jRJM=OcH(@aYW zVlXAJLq&eOiWQRb8n^Iqyd9z6xSi`oml8k3{zRu?Y|WDC3I!@f)$hX5IV^wE?}A-z zZaT%MqsK%|m9jImtQ97oX|;D+&EHr5*p~aKj}s#v*zVmL7GE32qDc3#qdIW{0UFJb zzs?)qAsG{wr(a3IttpQzejbkOwL2mlk=n`R7Wa5CDbv1O;jeGi?cw{P`<`Qp{BHfy zOowvuY|wLasv86LWe$qb&Zp|@QJzml~^kSv;cl89?i@bJYJT8&wkj2dqq=e=Z}gv=f+8ahAWI;fZ1uMU?1yG$=^9Ztf4@EnKCp zSUm(Vw;VQ}5wsHN9r9Hx0U*ANw|4Oi@3d1CGu&{g=AUd3`O>nY2~1@iM@F@BZ39@> ziR$6V&&__%C$-w5g)8P|@R{A;PdrpiKdG8SATfim?PU@M?Wyo(n#08RN{lL4k+3BX zbcQ*6Z7pBvmHJHozoAAS?u9b^l;|%yY^LJ7;=7*XhlO=|t~!t`y9~|bNTsKrUdJ1q z{?6um)m#1NF0%B6thHbo9Dv~sQhkq;xYK)QqC3v?zJMI21!-(PjKgXFk1wcS0ZTZ? zfT%BDH1f;Fu~j>xSGc(wdZDwnzcm_Hsu&YjFn*1|QW6*)|5Id-?-*HHaVBK?n@hJC zm*0KP+o$9qQrX{9+5&R*6c!uM+~xh(JkEXZcC9bfR2xrwLWePFM<#BH+Nr^PCoL?P z8x++_efMj2cRErfuqSp_gslQuEFb*vzgfb|Y`A<~ zhu+}M_Dt=b3{CG{tykx)NQrL!&0IL9pgz8mFoD4n+`c*(yCtP`)A+CJ+@9&|#D4sa zE0-1M%^B>sAF}^9$>Rp4=mMD7oF!?OOw#^W$Tf3!eDuhf(w!{rHHXd$?g&@d(A`yA z`qR>3=-C?N%oEF|rLnv}?7h1f5x#n8*+o86oB7>)_aU*`zY0I4pH1y*oqE6Z{1(;Y z?uwP$Yvl)D_!lcO*Yo#&i57}+r&lRm`Aa-fcLVoDeoa0)$-T4kWiVgDcD-h&(+}=D z3Bd|5&vKeAG4k9?Va8kYf8Fm}#efplC2B{-9({kks?*-!KWF^y+^nGIl^%;_hF)Zm z2L3mfDTn=&RGq#IUout6vUweuJ7B<7XzZGiOe|wC{%k)n;LeBt={xPCp$3ESDvO=9 zd6%zt>oMmZ71Ip%1$5$T5!%0sl~!n-uNaB_H$yg{l94=_9LBS#M0zeB*QX`a_k#iC zUQ5)Ou8ND$BBGN}tr?Kq1R>A``N?PzCnv}7O0qfnADMd5^ma4WsLA z&J74)fFm5m3EW5gWH_pm1opXY;%1?R5BzCEsstyh=^bzHrNgmHY}$=vp)whCc6>-> z@DRz2HL1ayG(rNW+xZH=E9%zczceJhB=D)vgyTH$=)-Qm>4)L{lAc&0%T(jG!3=)mES4Sx&0GQE#a(22d8si zH?BgM>j_FqQpxHb5`f3%-t`c}V+KwZe3oq}7-Me^ewRpv1+9GD2t9^YWQWjWet175 zz5&mFE}KY7`UfPzS)MK{qF!;gAK=w@$Nb)AP4X}2aTD*CCZ~{O4=J}Ep=inT`*Gve z$?m<`cs7uJ84{u*7DVg*f+ zfxabuP_hQ22vai*wfmowKCDa|wYm(9zR~7Ez6UW|jzaP3@a}pHGuxb9<%bxKc9EEY z90U4g+8*UGg^rJDw`$mMqMI)I&?A6pk7+@v2d+u`h4Zagg#*XgRq7Qi1pkXqVp1V} zjx846!5k<%wZgIThIUWmmSGd>7{Xxr7m?PR`s*`1RQVGKIfSHMD<_=cl z@3|vAQGG0a;CuQZ?oU(6+He|pT3i3`8w_(#_R_bdR*G3>IpPDw^x#W=Gh&J%D=ihH zUGaAV?Eb3))9G$=Z&Kwm>VFyHhmqDCxvj>uudj@V$3;!4m|JMSc`|BS3s7DXcyabJ zAA-!NHL1|ClfB<^gqKwK2IUmQj{aP*kdFir; zj>Do_zH?-|#)R-I^Otvx>^B|1&cT~hrWh*0F0kp}=SH6WNRXXK6AhT=f9mvUU^)0# zMe%gWl(hO=apVtT>+`$Rt1gAc`Pf2+Kz8w#hXI}Y-psbYu-XOYrIRPW-B1`zpBebh z-XGjCmvqjv6Vp&I(=3^G*mUCxbkOD4z64#$k=z!*mQERqbN3R4ZxIQ z{Q@UFjC6BrQ;^j3uggOGhkWg)1Ti>x*ro8KB$OxmLSud9v9>?Q61A$ne0IXy$dS4` zw4xs9Av;;$dcvQkGCWRDMhIMC1oZ5o(hd|DwWq+~%HRb+Vve9P;p zSB&6K(bcae)cWDuAH{Bf%--` zl~*)o#St2dJ`5V)jc^lZX_v|*CUa${o0G@Zrf{dy5@#^g%k}dTvLB1Z7@th$G}|({ zS8r^=%uP*$p9KJLbdM2&vjlXaT#`<(M|#)Ia@8?9t3^c;N(6_sc%5a22Xuf=bZLEA zuic53=HkG67O(X}ewcdDxt<7&Ufdx_TIr^66~Z?3rT*1V+5T%M)2Aw@YN7QHXZLA; z(SwyXt_8uIPsG{~-cUFMD_xReM`fA+hPvm+sFGwwF*Y`pRS>;pY03uWSQSR_MJnNk zL=|JdUm=0wfWsKwUIFHuyunp^zTCQdEc$aYDj9^{Pr&8cvZ<+;C-AQmJN0s0o(k=> zO2fFEHf{V`3&3?f3vHyybY;xf}o|+jtmjtp{8r zD4}I&O@}UIU=~dg`1T%c&b&g$?0Kt^JUGE)ri7LbRz1|*Pi3hIhv*o%4*PJonVeO# zU?To}Dg=|0Tc+F4f*|s~X(#Ut;ke@ud-rcE#E(CwLS2H92p|M#Ya$Y(SwpPHcNUJ` zW0(Hic<|~XV13EsdTUhC5|!ZdTu0>(bL#u+Z7sP;$o=`an%BTMTxfMW>M%mL1zbU~hYuIbZOZ zAg2%RrgE-yhi0xGNB|f)RuZh{IZ$-kJAA`pr9)6i-o&t{D?G{NZRmAQIIbT(8apl{ z^z~1D1r2|maXR_&{YuYHUq$PAPpR#$4mteAYTcaqda17>sE`UU3tL22c(0@Q`PUpt zmCj)=M~onu5Np;)`PUCW!*9m8IXAf}dsMR7cVD}oF<=?HV7v9{IGXQUB^$!jG{*x{ zH{to!l@}#fnwTn)luor*VDvy~07Rf}S~>LQ);Pv*GCZYyZ_H<;IxH+Y0uTuS7A?mI zkkcn_KiRl{+-W)?0svYe(|~UzCv-YNp|`bat0c4`i{+O3ZmsL)>5jmG&dEXXXj7Qn zdqc4yevIisofwdS88v73Qq95Vna;ZL*-nZ#wEDn;cZ^9J*L2td8)faff+jrafmMqv z0&i%bQsAT}zY{_2cq~~hlo0BDHxMy=b6u@gLTIFYboL@kfBPU?*=@ zWVW5{PieR?ZNZ>W;Vju23?MNL0po34DRvaAvu!n6)kNSOPoKt&?`WA@3y{L6LTIcH zhY|u>)4rW$r*yX8X-MgFx4iAjHo~+|w(jkImyJLn<*rHxK%&V68hrb1YQ8z7$JXZz zej-`FuTs(xkGicG4uR}^_lTK2`%$&AuC+o3J^IB818rWi9Ar<&AU-(_k2*SVv4r2^ z8M)bP58C3MvGx2LkgJHMep8;3i9zbq%Em=Bulew~b-IgbTR7|2w^JzPqfILPYrDcd zKoDGY6XREy#OEma{qbxyGT>_;hWfJOkXD)UdiaTsW&z&A!8>4%Ay;5T`i{VO9rf3t)e~j2|4VVw@I_^+YD%M(WObts}e# z4ncIf8Y~K{(AXS49?_)Zt#k=!*wD9%N}ImWdK?ukHVGnafhuXvm+1XPxM}M>TW6or zUucysEv#oCC)De8%{?^tux*I+TBW;??&83|FU05BcApZlFdI!U_^mNN5>%Xn4zMd3 zHX|P~HjvqrBUo|p8VaPrdalUA)JM%_!sc2(tO`8BLjFPfQ4Stu!2BXw^?Q0%BMG&8 zrtobHw{U?Ggnd353DT^eYw9)4l!iuMYKGXY3sDD6blr6XHB*hm3?JO6Px7lYJHPu6 zm{D`Z@u4ZH%dB}Y_FuhE5nYi7S1#fQF`$w$s4pMv57o6wjsf4p=gfu%BTr&&$>^#s zM%6*tQ12)B3IiKO&O^7B|2i4CygLY{MJvS*BCMT&_9jhj!_f@RQNR3s*PUCd^SN?Q z0ZNcb@pOb>0sJgO7b-umd6o)Wcm86LbzzR2v5intxjN~dGCl#5p4kJM-0eSUTXOnyo+BBte&**i zLO;e2IH5}Z$wG?&?T|%}d&9qseMW?sz4Kb?)&7gyhsWPJu;}I{b?>s2xwr2zwM$D& z8w8?#68wqrz04Ev6GD7QJ6mwGTV7tdy}do>V$I}K-PE~NQSH>!l&xLKXgEuFI88}l z>AQiKeS@u;dw2es%hW>F$yW=CmM>kVr%!kT4tudvP+c}$q&7|@BQR3P?jJlv8D)$7 z9}=U=dw18ppU0X`CX0y=CA}N+!Z+?O zE!`#lrrfGWyy40`I!&y!Y(wQqSrpK|1iSKE>`J_rYpZlt%(CK}E*ayM`m>f#x($OW zCxn0dk$Oe-f@Q4h(RPB4@L3iqv zpc#?9GG!XSSdv*t%~kEVAd$x2VBJ(nRlQkT5%BZHr#YcM;jaune7umlve#+ERg+Xz z9Cy9076|kY9JL4JeR}vZm;PDQ>8D7I7a#edPDMK_%Z}$Zl zVU=_Or6~v4gK-Qmm@l1NX{Is53vp-ZRwxyA*g#AA+&CF|{x;w2SP4WT9U)(x#TNY0% z*oikD&D|5&RW?hXW{#1fs~F<&=aE%^W0aMCH{s2D@GJEyqZ{hw{_tmZUYFIQ zf0w`vyGbJ}llJwKO|q%ET@MbJ>p@K4w_6qmQM$FOnu8%VvmxJ40wU#R63XKt z06*ONJ6p!(;a6@PR1bpf*2PGwGYYYyHAFw#g+Ly*D(zgVB@{^C+*F(a97_I#inu?x z-o)s#Zd~=SMlG^#ss^=%04laKZ`WbXb3e%cE@%5WOz;<}OJ+bZ9Z$1y$8k|bSEQYQ^0{#AbtNu=@Uv#;+=ZG?%`uQ-8 z!vZs}2AReufep$?y=l6!r&2j}E>MN}5ek=?U0ijATx9Uwl())^rrGI-WfNq&vt;!N zbNIKS5&&~Mw6B1+>Gr5)Id_fl)!(l!hB;o(&I9;|k+Kx(p42PVP{8(ncKh269a~{t z=~3n?^c{Ig)f%NE$^Z>#9?f`(r!+L4Z%$~PPLwVXXH7qHh^taREXIMiEWfWT2*~YX zK}N}JNE|GO=OJooh~WIvHhr-b=-?!hU8}}S-%48tqDKYmUzFy6`c+(G z6-n|QC(Kjkg>N9&&|MA~tCGN^RkDq6cybtNPG~bOAG27G-U?S84h8#K<3rp3$J1BG zMfrT;qDV+eC@3W%uryLjBP`M&-QC??(%sz+BHhx`0!w!+NH+*e=Y9G9?!Es3pAYlS zoH_BFGtZpyNE3t`!-W+b9Hy*x4Jo<+X6{ZM+}4wHa#ogK)?DKpeY`cc2*C-ZNa<^7 zjKcY*AzSvBLpO*T+iF%SNJ5%K)Z<7GN)V$~3du|(D|~f$TV8CLZc5toJP?a!a#ge- zxFIAvt$@}-N(te}A5b{nLUTIBn*5TST+r5wyES)UsJ_&ZN`ANX6$8n@`kSQ!6(qKt zMk*>}(-s-HwAR$?StugT7J#%}9+l!K@+9Uwp_IWs0nhFUBr0c1X&Q{!kw}SW_~T+< z1)ASbI*014%UD=`@747;Ai#KRbo*nUwNLD%8k?X#UJyP~sFsTBCtkAXfn|_f9E3_{ zsu6-T{_a`VL|jBa(=WCgn#h2papztmTDN|vTi_;7{wHEZV)$r&M9yvP*1x5rVC55g zHp~GRm;W9bif6ovZyUF3jv9dA=IY;IZlVAjvtycQ|#XFBQWy zMZ#iPpE_LJS$aBd`puYiWgKJuIp8d5W235Msu!<3suG2<`On`Pfe^HF&AC4( z9Ik}PcRz$KM9QIVlhp^-I;^fw95rXM^>BcM6_mczElHNAg-A1%(KsLFxtVUSKda`` z?-5KPg4FFe?wBLtto+Bw0oiwt}LPd(d zXZbF{KY~mxa4joDCkW18|2Of|#zeo+{5M>s-Vtddl`yDTL5|qaPysr!>t;Y&vS-}4 zFYamHaB1QN_F6)Ij0Iv9xxK}WQ>GB=G0Ofz=3TPq-O$1{ZSS+-{;Ft zRfg9lI>&FpHYWT!h9mc+Q7-sq;bC4b9m<~2VY=Jyb^P7`!eQp@ubDkdsE3!oLjA-T zIyHqM5Kd2}huZ@Sf6HJgRGW}u3H=_8+KAy%hlh?pRU=+HQ9e&wFP+XPsTeG^XDKb6 zX|vjg#vIsO0{H{C(Ph~kwM#3&y{x+htc?^ac6i^jfhM#*pNVefJC{ zc8ru5MOO6<`b>6gRDMvUvq?i{eQXCqxq6E6`}mxJ@14{Dmeb=0pTE(+ciR5Sz&jP@ zh@g!MU=dd{p0IiN>pHk!XsR_n(X{sn$tU4TcwJXGZ=C}(n%h}tS8o_co=hC1+s`re z1U2UqZgON3LVdB&*mD3vDqdRK@?gYx#Y0r)G)Fpt95$4xXX)GK=0}-qx|rBKMt`-~ zYO?ZGTwd=hJ}cW(;bVQq1yR&2{;vD;#v*WuL@^+lf`lNR2OZ~it*Lf`d<2opEk3aPCit&uvsc5fA{5X_*G-#qcs4`+eJ&|in=wOW1LdnZzULTHR!Z6=c-Bc z%D5PwemnYor*(!D{t)BYMAWS|Q?%yyHj?DNIq!R+d?wxIWNZl1VmN~7hn$=v%QXS{ z%)8eA>9hG8QxMC0Hcd;H$hAwi+4&(kv0yFUx~?wCc~2YUQ%B2fRu4jxm@uuaWwN96 z7Qbv@uRTbf_j>$XM=^9rxtr*%be~nvy!5pA8nwGhdAnyJ&r~tK>JdyAfDz2(iWIguFD~pm1$%>>F%lM zOsD)4SX>9en5Llr{pSml(c}1f;VraVg^xsR^pZKSPr~9#CeoX6lJ;LK;KG|VB0wx| z`f=gk{I}YJA?wfm+poH4=bX>BAkCm0^6eB!hBYFo9h2^taW;-6S!r@+nvxez+(39J zu)Eu_BKLMJyzpQdP!J#>{bvCMY=GbUS}-zd0a2p3$EpXFNXaBHEYwYtyUL_CO8hmi zr2YsWl(FyLjVD^demvw~G153m?P^|mTwb5iDFbG4pX5n)^#y9yIf{7L^bivHHlnOT z;2&iu5UsEsrEmreL`aM~(ElY{VAvbYGF}UgX?>_n?d;D*zB9{hY^jd#31%Ib9&tscVOXe(uDaW8d zj5JvV3%sMJ&C=(d1yd55Gu;3!omCUW=EwNY?i3OjAdsGj@${E>0}QkKrYn6z&)?)Lh||5u(}&agu{)QR;XGZ{a`ZU%{Tf!2ukVMFzS zF32m=V+#MIiMGQiR`d<5P=o%9i^K2fhgEP$OS)btSRKf>IAWXN$w|3vI=Te}V&#SQ zJ0+$S{U-&cZUk7DeWr70e&7U>l z>*cLGj%Mk+7mi_vo=IvN*xRH;CiaIkdEzfLKtEZ*wbXEipl|0$?dZ?L|ItaK=oYT^ z;^_D4isVTC!Pkx$Hl*~L_ge5JiGLV|vF=(1Mk&fJ(tkrw>G$>z?Ng2mVb@K7<=s7K z$mQKTARy?wV5}~PJzUjrcvQh<2I{@!#Ms}=UyllCN@ZT+kdIZdqI!EYM=gG8Qh(Tx zA}>fZ|BN_qzK_jf_hX(!hBsX+p27m_woDmlfa3ScJIj zwYfIzR@Iz$^@G!1oe;BVLKzYT+Ixao*O0RY*^n=E#zBF6>n5K<;o7IhjNT6e_Wa~K z&FCWBF{baw(PV~}^;gs^w;p++8!_M16#e8VBWBVIl$#fif93MBo98wOL+Izm+2rDv zuC7v8ETQGJu#RDp4|d`1xJzT+?>lfTd~{LAC57?r4s7O0-86uk%@t}t-DMeVb67~> z9Vd)MTEhl@9l;DmMNmrYT}@kqnoV%;P(MyoRGR0BoeJ4rwwp(5K>*Wuy`PSzx;GX7 z4K2sr%kPL?P+^Y&LZUJ{(fmglC9ljPA)3>y;<-z1GPv`Gw#2Bh{-Qb_#US_C9agw` z`KY*3F4DjG250El30u=WHgEX-cjA;piUIPm4XqUc2j89X1yJndt!vT`)aF@e4~6KV6BDm_rad zl_L`+qN;ycoA|CqqTIGU?*999qB=2j(*pp$+j)13I3JwS4ma>C_I}7@76)GF*!@dQ zO>bH#*cIx84qN9V1G7UXJGyGiB2oL;V%mk zPr#cb;?4!roqL9@(4u2wnjL!4ByPUQG_8;m4~B=yiV3$+>u#2q*rNJS_rsm(wjYV1 z;@piob^7hfIA5BEn7+ItmvTC%K6D9eE>x?Zkh7+-zO@u)o%)8m;B(6yEK5xhKsR^z z!%M)#>#bMEU$8FgLV2eqt2@&i#m%;yef~>0s=8#^bpO>IOMF^UV+qHa(3J!6fCjx{ zQ5dl|pN67dG~n{D_l}B5>-IA^-){S{)Oeqfp_7coWBlT#e6Q+bd6bz`#10O});yHu z&nC$4zvrb!!aj5Y{?#`# zkNESK_Q=DfC7&4wCx2fLJ;2{)tEF<*!=cikp2w+yF?nGzk{lBOB_J(ThVk=h-HQJU z7ucb2Ea_+bV!|^dl5SkgpXJfL?t~(3RT|4+4)a3VTDx)n2XW>TR-8CB1HQfBn;=!S z2yh6AsD>Pu@1U9KLf*CeZ@+(^W40l^p;q(KA1XjBg7^un9!sMuRgVUwp_EEqUqY%W z-qOt79*KJHH`;@388B5d9l5SO74azwX~$o>#WjT18E`0v{MkLUAhzsPYuKAk9zfDA z-Ln~Bk293ZV>h=3kISV7^;xYZ3A8FgJUHd`b+lsQiiAR{snC_l*`(|<-TAn6!MoJy z>q_-Wbsle<{q|0P;qL%MxM$F%DoM@#(dNAb*kx8#fW{$ zFZ0RarkHUTXs=ZPgmkI+9kYuyg=E};0``p9Yj`cc^OUOLNN#|7ys;0!F&}sn=WdZ@ zt5!EIzbRO^RIa)H_9fq3uu6|*Wf0$3>p$iF@t#i-v{;}p+Gwhuiq7-APe~T1XD$OM zFe+4kXa$ImohkyGJmUQ&%UJ5CnbY8@1KWGdgIi*;_Vb^0(4tcwoGUjtrV}E$fs`=~ zv$`n=o(?eT_k)flECc*-Z3yx(?UE-I!o{=f(s|a{Jv=g|2L^|^3(!G-8hDv@1+sTU z<=JoKL}@2(=M|T2y^RI$+!3&JaEDoGc9RaE&N*0*8}Jp^&e3e<>^VfFgKmg{*g>AY zOLYM0;!r%pX}D3v2#-|S+_C%j%l+G{c$>n|>F!UXc_F;RDj!At763o(nV_0JzaeK_ zU;NvvuAfKN_~Eoew%pEXVg_&SLA3Tvyi%@Owm1WS@+~CPXzv0Iqxq;x7fh+?(Usk$=>;s_FGJ2l*lj8zc|^rF^! zo3Sz0PLfqizbEk8zB!h9VMeJ`iReVXdc~%p7)mR%Sy*xZkkN~+L5hElV);pCdBpVi z&h*Ah0M#ELAZo}&3${1j5T8VAwpIDeF5J{#b2}`LX7SGbk&B;CM45EdEs}E&BRqm! zP-ccVA~WiY>jWQu@cjr^!&V0%ke1hrmLvs9P?G$4Qt`PzTja!$MmG^56r~``P=|$M z=bI#lLlO%{!eaJ$=*Fa>?3qpH!ritYj~pLF=VPTDiE^$1V@6{9JOd9E%tONCaIa7? z%%bC9JN%~L;nVGFz!Ede<3!qjj_yl+QT!j|(k{2>1>ZyseK_^vxkWl3hZWv)1|hdg z$ItT~wVC87OTLZhYirOaq;5Dp|0A>4uQ+o_13P&rafQz*;l}MqdB&)G2%#}IsF0Ym z+Xhruw}Pcny-%6k$!dw9CELwW4UVKDAh?C?H`3pPsGm2j||0j9NqM6$;x zm1vIl2}JV8NbQ&alp?U?fqjx0Nrq4BJ~9>TqHkx;wz=@{oS~dGKr@H89GbP_sqBf( zaU7S^E=G17z-ucHh!;IX?RP$hEm$`K&7)pfm7%emiG|cMlUtTY!HQFca!FmHiI8{* zmi(JnUut4+swzjYSMjV}eT3P`BTvH; z-l111fqTd7u^|1#xO(Ni+BDm5pE)~#Dc|x)#d92~RKja}lOyNzxZ2Ta?b>z4H*@}MjL#D%qe)*7LUD{cD5v^R(D9W3ESDc`b~kPl2qdm=cda9 zuSWh9kU*8~_v3AM9pZt6C#Asn`E2_R$CDT&QC*gh@+7dsSc{&^lS@InK+aeMun7`i z{V*}Ph1=7Loz>HXR)JF*-;Sd}Q~!^4+E*VH-;#e`?6ubdrK~(e&*gYu?&;%~NC=x} zj&0p5>>)VjMfD;1Ha(06pdtPJXjVgXFQ1iE6pET$BxKv8PA=qX*%GKz;;_%%uTe{= z@XArFWVC<8Yy9eKlw`GJkpk!~Nq!itHAbyhMy%oELGdiDL zqUzV-I`i_sof2E_8cu=ZSS86mKMM|2e?-B`1vRaB17oy$IY}39n^%Y(xq{Dv_h{B) zvV7f6K31^N6r0WW9$9aeDhx)@?uGRvT%^R5Ql?TCT|iAu-Dm@I=-Cl;KJ8rwy29;%%LBel2 z$j8~Dj{w>0i{Ni5;@pFqjvRU5da(pUNoT6B6Wc6r_j2{uNEbQpHLrVE2N^h;NHi|g z8)m8N{&-{RyFd20FV^$`Ci{hws->0(o)sf;p3YeHm>~~gc)ljO?$GQN>j!MHH+ZGs z-|`0y*@*J7s926P_1Ycx3M|yzhUdJPf51Lbp+9vH2|*&CE35ead(>XJvd4JQ z!1SnIKWw@1%jo-#SG#6$rgowIP-rs4-dbSJAFdgM@36DkmsWNsLa!s(HA38 zNM@3d^*^0|!*3o1Di2i3lq(b^dzJ=NT11Xt*eK)Y-C16qnp#Alc$dUxl(|LIGqvg8 z$?fdhB7*HeX%{zfCKd3Gm_gd{jemBixdhi8IWUo&-b>M{zf}3qv6sYPL#yU}(vA*} z)e-0R5ZA5!IQjTk{#@*2D!X&8V+Uf}Q3ZSop5`_Na|H)P7T-YHx1L@$U(#pZ1?}mK zV*_G3e_52c5?ZTlu}R5A?Pgvyf;+)5dZ7)|DvO*iu(z;o<7l&G-m^{)q7TpuZ~uqOx@aCJui95P1-mrBKW(EI9H6lLS9zU zyC12auvYC3p{_{L8H)bvn;DFY{W7nlg16_2mU_tjzDTp=+>9hsaYzc!O2%(ivNtHg8}LG6%Z3w;$T?@m?+!}ZAl6YvVQ93=Oeo3=_)>BL?^O{zMLDr{2`Bbqk-E_ zJ%fWuTR?e0#e%&kQ%x;Xp&vaa4aj025CC_1Li;XaRwJ!fBTV>ilAarDLIk@`zn(F9 zc|*>8>*{_sD@?G*p$b_nZUg+}ZTdN+ivg2P02H80X7*M}LE-UpNqI$@gJ_eue6HL_ zzyv`u9=i?PhvIc-sE2tW3*zg4*XJ6qJ$VNjbnp&{>T3QBF$0RcWrYS! zn*^FQ^E;>y&&36~!DCsRVSBSt-%m8B%PQSMCw2WmYoX^26ufqBvz4jkJ)Yvc?_CSW^F7Ml0ucBFp<(%uPer%>yxzEMF$dI51Ber57xzO zZ&n&d^(t(Bpf56u>mHHDz4gXvV_Gn4MVF_+qU3IOKO-h6;OFSW#Qu@E2Ju~r175CYm!mZYkSplA|4#bNj zr^`&T+@5-$wsAzz3yqpKQ}(E3KnrCx2p%}k!xSW*c?%lOr^w0}k7wRf^otvS-$cFW zt@6-}=sb!NlzEwA!W!VF8`THWy@SS;=?RjP2 zm{NwpvN&s0lDhUu5OQ_=%HNM>G9m@X_B2h`OFl=Jy=qu^>E}2_nHqD|w)1l3c*XB^ z>rO%%&&dR{hx4lv=!PM^29K|xG$QM$IZA5fbwlV$3PAMp&3%EMi}Ku6ID0mohCdD{ zm#FJ=TDcr|26!c6{$_{7|7qQCuXySgV~V>NhIXKnq=lv>t!uY7uHI*z&`8u?lur#M zP5NA=1crGyh434>jb;y6gP8B+AJT-@IB~Wk-g$c1gI>#wgowV{(ivBMw(nvsCe^YT zYEuv-v-kF`YBO2KSH2j+lG5=&&P|j@pj*m=Ysa>eeX4nmDia&qMD}ToWz_?%VBNz{ zRb7X@J`sudW7qOVP6gU@?(z@6^sfJ%%r+tcRgP^bhHcTlB+x>ss_nCCy$4i_mB;)4 za{<~xsQw=9*{83whFT0qemYw$QEnPDs=oM`Pjy!5CUwwRG28Nv{{$m8Ee#|SKlT9Y z6u3FO4p%N?_UNPUr{3TGZDK(bKD5Q15$5#xTmR(ohD$QKYWMH02|}$}JOr8+Wc*rR z5e?zl(v@lPKSwK;Z-LpFJ+t5_ophD1)iOil36Zn2+srMs7pn`-u)MrH?gmJH7)VU#OND#N(J0A_{&cJcx@kMj)H+2)nIp(yuS-z#+ za!jSdRW{H==JX~Bpb2Ww2uXT_!4~)AIWm-M*tN_X4L^7bGul5wed{2+3dpQ&lUS!bPW4`}ua{cESn`hPwtju?<;~*b$6M?wR*2@ zd32!bsovVN5JMjv6P?cYgbWs{NgbxQ#7mIPvWCrb#Q@;u{|&hVmi?MJS|MlYDQ*ibed>NkqFXHLk7P6lop>x=h)$wtC|I%!;%~8h+{6U!K~oK z+uR_9Bwg^R?SJlRwc}=%N|wudk%fn6`Pk0nuX6!WbqJ{m`8)XHeq4>(`3R!XGle4N z!vN@g&Uh(E^`fszgvdLFt$)_CtD$r580-U*h_}6;i&8l>PSKh_Rx{bgl!}(axE$|+ zvg@!gSCvatQzPX*A31yftcmhD%L%u`&4|!7{hIQoapH;&C!DhRFPiOOxJyW_Dt=H5 z|7EX;pl`VnL-s%a4M1X%+AP25x)hXB!yr)6K4or~jEj*15YjWU%Skt(t0|N?yId{& z5p8|mE>Y5`1=5}Y$-p7_q7zM>-t=r)zK;t>(Z-xBwMLFGlfzboKSmP!DxEDYO!0>u z?ie4DKLYc5DA!`*av_pSrgqxZc*sw2BrZ5En^P0fhutNu?#CA2AX|=%tlo66UbZ`)XU#+!w$JQ(DV}Z|%XQTny}nrqyP(sK6xz5rq!b|0C+OlC&&tiLF;BNJai? z<^n<+eQsa!PWHIGKZaeVLH49$#}ra~I)4GEbFNmkp0=od52dtN1c`i?`_@|xiGF2O z5OE>G{Y&6ThmEN$(?M!zn10T%t-eJf?;8tsnSyAEWb-yZSwgjJnl1uNxTNvhQ0Egi z;J}Okk9hr;lFI3N&2o`snE028kzpWa%y{4%(fq2)N;z@q*%us_BZ!CSP4Ngq(HrbA zcxrF$wi!I0{@c||Uu2EGO#59EZ*_Dpq4%mcHtrzn0P)PR+V*eD6ygK4H89d=^BU1h zoe86ag3v_CqFFJd@fyGfB1||QD1H_oPhKDIxIHrIQaE%!lmz0^cAFIX0apWWA_g$8 ze}5?{>h&L5Tn0XKt$;nOLO1YJg+nP=ZAsOt5{H&ILj&-?O8|rY)+thuu(Xb>NuUao zF?cwRS)ig0SgNu~pf)knzuC83A`w%RTxtsgMZ9I!|+R zYi$}urrKG;0GVin1VD?vwG&dk%=Bm1Ri$Q(-nWw>g-Dgvd7p}3o8|-1Q zG^KL5yDQ$>lg4KIfuFOxnt5Jq(xe7B9gO~7dBO1m)04r{Q4n$_io0J&_7#{#u3Aq?~n zJt`n^m@Z^MhDX6J_9e?(8)|({mwhuR#E|;2Z@>ocge6ZTJXA}e)vDGsXDm9+4GQ7K z=*M&Qb7+P_fqa*hcs8NQw-+NS|4R`%5MPTk#^^GgeOg7#hcsFZ2bd@{s;f(C@hLop zUlN!6)`^f(Z>gtT~H9T_l6r#paL{BkX{HDC?zeFc>C$6poRG6 z&CVidP_qoyj-4l`R5ru!d1*vN$77r%wc_f1-0~!*kr06{jv|G}22S@~J#jh19@O9! z5copXBO(GgoalC+z2Y&ePLYT{HJ5P%l=;s3TF%}tXuqZZ?!T^Et4T0*U5z1bC8ZaY zhJ?=>CS{y)2)NGnTbco-GXSBY;FYj4YGilplMv4g8U#p|OqLeD_Wg_J(~6ju&1y21 z{Tk;3aXH|Mny)J3HbgSk!9`=QC1`K?MKTy9w#}Gv2Dcn4urYGs099x~ym#7KgP{FH zjG}k~-%K2rH9}}6C27uN(Liluxhj-B>^E!{U&-3eQ$m?Hr}o^$B2)% zfJw)*=0$$nAV^^;Uc!itSzB21p3q+4eDJvSbPtvg9K*z4QH+;Kbww_Mn||Jshqs?! z(t+?{U>Yp`A{Dt7A0bs%Ajh`l%cn5&y}XH;IeRslfRetWWa{oApKC?YDoaUs(O&uR z(8+pJJQxQedee4_7$L`muK_DTqH5JC$|QA$BT%G^5P7-F1RzX3LEx7u*;{aJNgHkZ z?vwteYR2Alzr4c{nbJFEYgbyfzb!gN8v4aYye@!_xSxB{kA0ri8#L6NFc=(a5E%#> z!B+6<>mo2mm?aIUbaeR;$B8yXsm8kdXO z+C*FQbB3CTF>)I`ZR^n~un(4H$@sNZo>!gSc1u!J$F$pGUL3uFg^3NcbqA8%^JEcO zt=zLz$z>V^R;kR%vY!VAtcuK`6zeTaE`EUpZ#oC`eIJ`4(;DSldUpg(R37?>bnvNXuZmrUnMgJ)70rZnH35X5#BA zoIyhS{0@an^lJ&{hQE0QW0K?%79Lh8tZs=9UI=5GJr=rEnqyZN-WldzIiNdOBte1} zXfc^amd+i#-w1Oaf}S?aP2E*F3=C95irxYVY-9|ta{CQp5a8Q+D-Sg2Bi=>x)g0{s zUq(da|K;~cAgk*&zn$f}Qt7(+cE#OOonia%{%qu?Z-diNvNe?5WxG*;1#Fl6=W$cT zah1gAe8s}lC9@}5X&|dmX^uq0l{FIx3>f$keIHTNq13V<+TPAnf)=%H_O7s@``YAn z7XEuekE;`v)*IoB-!<4Lr=3!`c=@!z8ct{Dm-$n-B87ox+TCkDcB=sx(>?M1w zzi$J1xiiGxT9M*{!~_K(vJUpZ(@V=A0ERaIB)?;2i06 z{dfHn&*<_a2bMyu>Xz`p_|wH0?(863{Kzo@8qSv^W6^QSe1u+c@*J(+6A==c@nnF* z%=N&JBV+R)h4Mc$_c{=N3Mr4Oe0ZomalU(qK4_s=WiVZDJ!!3i)zo(@59?G9RrCVs zplH~9PkWaXU5F^BVRl9+Z4p`!6XVz+!L6yQgf%v|jf-c+2H^Q}ygIk+F97ly0t?ZM z#SFl-2@5A7e(k%#hPw$G`2h`Huq>na`>fid~683iFC$iJM&W{bo03NmO_d= z<UjY6(o0)AeuPA;J3HmZ31TY^kiwDQaA&IhPwy<^l-s}hsr zJ2e9Gups3CbX`sU&v1KQClGmfx%EE^st* z9d(eTz~#F$>oPEjD?P`=ZS0pI1;AKUDud)-eU`}4VdZIyPSf-3Ib%CZxJ1NYDM&Bj zw*~HJ%yP&b&BnqqZic)i5vue7KJLHU^wf_PsTVW!r6#z*!{gq3qG3)|s)&@x;KQpf zR-zcH;tbp47>1zGv*U|`k{RotuQBPg4(t_~qPI)n z#H~NHDIaO;U{-u*KtjL@KWG8o+ks5ipO>j&`5sgq=5G;)1QxHUvjq2ec-%^LH+dUX z$DZ8!+3^8d#rP@qaWD*r2o3n8`F49jxw zMio-!dGbwQw;ewylz70N`09sq2z}qvm2Xo$Z>Ea;`Eef&>9)$}CBj@yDuX$95mn`A zj6NgkOp3{0e8Q^V#K@S<7tiYK$yXQfcQnRoZ{FSVFl&jvGy2Ob_Pnj{1- z601JwoK^1kdnE90jSqg{B^G3NSf^;3x2jAzXfaDa;W-W~DeH+&rlrV=Z=e!3kSM_y ztG7z>Tx>qVs*VAZ-TV<-Btb+tkM8ln^ZdTUo#e3yY0t>yoQ z#~A}@aUCsuPI=1)X03QQ2Jz#*R-`EKKMpS?Ovi6o^yw#3H*(6#Yc~rp>Ktdf1-o9~ zx`fQ?KI^xZ1;(-!6&)W3B94B+QLV^G@f7UDM^TgRnbvAE)NHI#57i zUu_5fDKidf5wo(J%lTWrv`bv8@%CHWoW-w?FMksoZpX#pjKR}0f2c(ZtGDsp2l$F( zum0A@w5A)wk;MBMMWe|aUU?VjFs)bf_gpMo7;@va7AP~2I9!B6>UA9_Mr!E_W>l`g z@^L-jE4l@1>MDA&h$z zDU@n4X~LRSSySW=Q;JB7x9;cL7`u z1UPNZ7~oqhIIo8Zu?}kYLvJs*3dKkUyuo);feG`omZwrx<-Y%>X5q*V%?>s5$JL9^ zhT%7~Ju(35)4gBsYy#|h!{KqGpd@*4L<mv?Z{@GlN&FfDbG75>pdEZ^|zjONm zu4-GADTV062L(xE8ae||*!;!%)x($j%2gbb=pG+#CD!1AmiHQOd=DK5`>GV}!AeXw z9dp3@c!fNR3@Vc3n85)-84U$2Z0`yY zpwAZ*SWbus-jkAI`Tr)IqDAl|wfq!T+DOB_-MdKU!>aDP?ifPXu6aYzEx~XRw%G>6 zgS$4J>fX7*Zw>1$Hm#JFY^&I_6}*R`lvrgm`%kA0K8ye6|8gJDp$iH)NRCjY#q8&4 zvoEwrJn3yt_x*gc;54Kx{Xw;{f0Py>^_k$GD@vCnS*m2wR$%J2s1Z%!(tfQ?R@QkT z(*2XGX&Uf0%>w%G$Z#JYSH-G+^#?b^?_epF&6kb;z3ZaadBiojUEZ-Vb7ip34R2

QpRVw^`^!qRMZjT6j2masuz!Ajsr>z2PX+}-J#ZdOOiF5#Noa>` zP@t@qfH#UN_%O5CJ@<|HLP@oql{jd<<&`M=yK&70j*7vQnY)eeNT6MmyXpI{RZg?s>t}Qads#tVD~L29#MHZ z^jT*EA#xQ`KQrnJepN<1>r@D!Q;WGk@#^xm(X)xNhj4&YH(VcG9uR%03nH2uL#BS+ zIlQ$5PA0ruTTToA;XS2m-C#|;7QL`2We0-v@n0T*H30Z(ykutG+iAryp99TR8&~kr zU!EZ0wL0`Mrq^G68Wb5!gphoj|5=HAmKpGB(6IKlLf{8TKM3_9JMNT}lwaPk^DE)x zv9H|*mg}fKUGE%pJ`OsqIb_d^NJwk5z8L%vP5FULip#3<>6Bo@)k`V-Q)!eZH0tS} z%fQ?O-)iUmSw!02*yCXx5VH6)y;w5oyMC!BLJg&U9~pxU!2!b7EoHwm0P$%tpC39 zk%v>;c6H8@85p22XS|c_D>iy^Ses3P!q0ECv_+A$^N(`j4{02jba`rebFAhDau*7{T&J z!9J?qwyT1^XF?h!n&ss`!+6zpM)xTcC=O9r*t&TAC4UtwOYV%HGxvZ!0R!RV;E|xW z!IEOQTTgJoB8faN3vWl0)($dkIcj2qiCjL-RpT&FLV*3(P3Ahea~a#tmx$1lJAj0A zvG(G>!|HKRDmSXXK}~9L>1=xOpmO;dyFPB~`oHtOs_6r+u(RDku}uEfd5w@k!!!I= zY52vLUJ5IPaA7n{mxZD8!<0VTM?H_@qR+Ld>#^}_k*8X~n_cfBL=)Xcu-K|}+Ski; z?{avL+jeS)nH*p~T3@>)YYJv1n)CgiqOyT>p{jm9eb*J6)KlGkgdK#&hK-5YAi(#% z!+#MGVHXVGMvViYNg|bmPfhg409GSmSp#k(nc7?0mVIxFrJm8Nr#Y`DU)#15d1iv^ zY+kY}$9~Do;-X(JXDvwpaceiBY3MhAg!TeyE<+nAfGo2an8EEA2W?j%K^O%e6+Ycv zR`}kBbzaY0wYS4?8bXM!DIB;fY8ZUkT|DEo33_a|{irqZ9-{Yy>4(Lptt`?@XnT5k zDzLG0SD#ZL+07OkN>w1+l*g9=nk^LpNQ~U16l)L8pB9H&(sxZj;h`9q zm}^e>xk$k65rix$(A!sE3JMA)H05N5e}|gcKJk3AFI9kf9M9rKbD#Nn9uuwBP}+e@ zz@)fgftX@CPpxxV?xPD3qx@JWNduxQCcusCw-T3-p(kv|oOoVnxSh0P z1Eo@tooq)HAnhTVyIN=GpU`|mbQiE`9+D)S|5@w1o&^yx zmji%lLM4ilHyyeR@A${0rlvKdrgrEcvxHgu6BBvpx*o^*qUgTo1-$vR3X&rR6@IAi z3wl^I8l5JpbgxE%BT=E6@QwKoQ@$QOx zUYCdNAauYemadyWPVNmp`X?S<6_jY3P|=~B5R}lWs>W1?jcT#TL1q{8^2o>F8pNbR ztIyb4yT?9LIPV+7yNU*lgRd=gkU+UCbH{l% zw$|0Ch$=%wH?4%?7#s+N&002Ajy-D~&M@J; zj}!n!OIrF{f>s|PUa-Eq-EI?Sm4oji#~Jpu-;bXm1CNrh@Ye;xc`RzQ9~sRF2JBaz zMl1#H*H)jV-8G?H0>FgR4#F=FuI8!wWQ5S~qxwH`#R3*b+j+`W{dHr{qQ$ zEt2!!#D!vDVHuDj3mvTGBO_?Xq@f3O@9vttc{RHT{lJ1Fp*GX$s+iT*@(bk}r#9z) zCneKM-^i#?iH=;Zt=j!n($GALShss;|esj#bY>3~Enm z_0h<~dugR|NMIh4Hu5metX<;@>&)~<0da)iyi5q^s3w&vWq?BfnD(1=lJ@B>SIe@a z7^AU$@Z}S4%imctOZ-sotzW9Tjzy?2yPlMOOS~hjk_Y7A;K&kAw;o*$ugB1#p!oKn zHiBS5!MBs!1X4IG7EK1 zcbV^a^{3F$=mqO`r7dO56z`U63%og~uk*&ybB~^Vz!)7qS`;KGb?{=DY?a~|Du&#e zz3iM(dXxtLr{^-XbylYP;7~L@;IkvQNFr78L#a$hfJ;AKmu&g`c&LUWtJh3%A>>V; zfiUX{@TaaWJd3Y1GRgVuoF6%6$r`}o2&vEE|GX9)9TrNg%J0#+Sm$W6rGqJHAIqit zG?_VoT(qaVw;X9j`;aUMsS$Ra86-HB}Hh4Pf>u=E`#wvaySkqxfeND{& zm7{BS85AUv!6=%yqmT$Vjm&%mr{NyG05aXM9Fs^s0 zHP(K+uZnj{=DW@YpoRc^w4nWQJ=p%%&-)^zo$Pc?zKN?D-Sopi8Lm6@j@rXd^ss$) zZ(bl;jqdLLI53bv6cT#|5B&7ehL(&t2|KNV_nadhB5fO!$0WC1o;&P3sr)9+i{>;H zybdGTr(vB>p2Ut1@h5kPA_1@8lixh#DXwZSTx(sZu9Eyjm0+N*-{wz>^8M_Dd)?~Tip~GgAVE#eA zyrD?J94K)0eR=u&{J$@S=ZB^Zp0?$9rD)qG1N%~$vvTgdjOmJ{VsW%MQ<8c1((qi@ zXZr*|`=;`em@$#R{B-LEahuL#(8s(rjlF-l!VP0O!-J^epK{vouwu%7JtF&zLK!uu zjo-RfV{*>V6Gra6@xUe#mOv%T2zxwc4 zC7+@g8b4^{?CfmjRB}dSw7wlI!u(?yLE$Nv*Wy0^10-X?c3qcwjJd>c6O2iKb%}yo>-qAHT_X+ zxT>J4>cJV%^~|xHF6dM9Ri5(!=VtSteBk8D+q=DzPA2 zH8aI+07wUApr4=pGB9Dd>A+wsf%;f`yN-^IuKEp9?(e~2rdEdi4+sdsI$~ldYzc{@ z4^Or4Iw1Ogbi&&c|4n{A*DfHQblFwpF;>t{!}h-ax@VKHU+lDK`jb(MDh|}9XcA}#)d|l&fu*_gdwKk(VL}dTI-fTr+YvX$r`; zZJOP$Na+FYG+a-9Qev}!%f(Id+|`xv->5QNvKCPOXeFe=eLY~Wp{eOz zAw1jA-R?5|Latc#srVwvwR;w<$%!scr7oKAI#M>xu0iiQI7HAW zQvHdlAv$UPG>jAs?)hr1cJlBrm!6gxlhp}&)yzb{dN-9cp79hAgL4yVwZ-O)$+#$GIg1c*Q8kgX~2?Prs2rj{cyW3vg_xomd zc6MiG&)IW!|Cl;`=srz#-MWw0^Ze=-gYOj+>2XT92`mqU{GT<5tg7)o_DSzEvHjKBhX z|9mm%wSTD`)Occ0DbKGj3nhvuW)ElbF<(!GB;JxaQ$JcYxO&@aA8P0_d?&}c$GpH ze3(y$Q$oTD+mttVS4Xc&8Y4bFeou;WX#%QNBHvKS^-0kaa-zHb@%TAx`*#Ml>fFR5 zMJ{_a1>FiL&q)Xx9qUQ)AS3iuH2Qv8%QX@%b zg9>|~xZ&NFR#v#7Pq7*Dg!5)=HE0$p-w%J8a+_DOJfBxow?%K2SqTFb<#*2K$Q-_| z;?@$=O7~Sop>_w;#;F#asLPlLAwX&PgVLIVF{q zJG;ADO-@${40FcAzPpJ~Mij(Bd}0?8ZJBdBZiWE8b}hxld+Gzl*SNi;-hCOa3%(0W z_eXo+&a}Tw%u>*w$H&KRLW`4=1WysTkn^A9(H!|yRR#CZIWZoDPLv=wC5x_B;>VHA z)mw+diK5ibgZk*np5;(H%^$3&y1rYedPht9en4|JAmiu32r*mg>e|51pQEA(^e&GU z(sFxe=cXmvMtjbd%V4>)TS1}Jb;)~5=si*+$BVVMB>U^pgf;x@2}TDkJ8d`no@?n# zm$}o|xDL|j1Jxku5~1bg<*8-4DGASoaZ$eqzosKqt1nlw)VsK85I$VuiEgL0?seJC z*;6qu|NLq+Q}nz8Mn~a1-B!iHD?3u;=ahbaJ>J`2tNe3dph}WFoBK}-9zYb@sq9>+ zdXnW%iPF`DA^d9F!SDTmR;w}PMWNX`eBlmbvm`CLB|UZZXgcgdgVnc^fjoL7g~LV@ zl|@%PM3QQ`$rkIW@PgFFV72oIz0u(7hU;$`7yKWh7m}HETCOwjIq|hJBMZmsT)5R_z)p;tp%4SiraTAfSKMAanZ&1r=`6l4M0@pWQXAb(o|E< zX1m`qCO3X-=tnmZyrRN!Jg35kCUI?u<|lqM6taiZM`wMUkL^j(zW3h5n&LAAEvmM5 z`pj2Nt5%C>K`GkuPv=gqCJO6H72no^HFR`f+P~M~PmCh)KDQzDI9+X3mmDAHc-<>i zUiMAg49*){boWP?8Y8JSj%H@b z2gr9bH-hm>q`k!z6&010y*PM&aRJ2o0K0f#&hg#pCnUT4rg3DlZ*~*wz)>x1JM~>Z z{kF4gCY*uDAFjRtsNV~bFBwI@@on7K9}zn75=e~dHd4{x{?+d`|7LS;`K*0Z zFU>lbSN}_S;*mFNX?6RhueVP|7v{r{gUY)(#}PIZiKXf<24!wPzS=aGJT}G*#lmrm zk&_4x$d=P=4fBp%*2Ae@@a|oCuU+K8y=`E!`u9ZS3~sZ|gkh(jC%1z=I<1S2s+jK} z#L>OFQ{6$H0QFN3FpDlO%TT9oHC3TqWk|!Z$LVQ0fsYUx23gzzEG;G#4pfL@P#Mts z&y4y2>w(vUE{52_3`D zbzjsRkuN!GDBm6_w@MF_WNvFFN<^(0J{sUw(wS0tjgy#|m>LcVEuRCVQS(97YfO=H zcE0Mu9MP`*n*oCT-hjFnB7-6~Jgr80DqCvbVopTYkiNX{SmeDjGkGp}cEUttq|@tj zT2;tfw)AmuEck_09d%LyXFNqnpUOtsBDo@kWh?rZ%;Xbj#X z&gD3tkX~dje3#@%a&=*etg71@=L}!fohmOa?dp#J{1OlWYAt305>cOBgJ810!KL=o zpWrw--+y@SRiRXM4SVI1 z-_mTA+Vv@f5p?sVrDVvS)d+7fANjYHBBiT)hompkOVqT%=d0D`B{hNnebUf$DsoTA zs)szYA5+W^WFpiKe5?My?dTsvTD;RAvG zL(fHXQ*&MgN_`TCDM)&gmBK6^k!>x=%#(6CUVUxOR|F?3U%h3gEo=VvV3GmW&q3&{ zUr13)%Syz!(zL~OZB$g$$?%POg~Zn!{=?y#0^HPOf)Br@*gd{F7gIlT4| zXm}juC2lHNff6pWo~Mn$M0Y|#ul7=1AWyb%h$xlg$Da>SCNj$A=H^H-LR`QDlp4U= zVC6@shK_x|%bb$dT=o8%s>s7icnaJ5A1;d)?@T?`6Zvvk^SOmbnfVfxldI9ocqdd{ z^6`c8+>+r-;t*nw@TMu7iLFthr6LwPfmh{E8Tuj0Z+rLzdRe%Go-U2m{V>H2qO5=Y z%nzMu8xa6d6Kn*{GVOovJGx%2SKgnV&&m0?b+bLV?Y+eaNl;w4*5-hFz z^3*>yQazql!EH6NA&J%7?s&~6x1uQDtJ-Co&Z^M%sN#Lf{@)MZ8PSuiHC?Xk_EUu{ z(o22plcs+63b9Jij{6&I3=b=UTJdV|5)t@|Tf=|*^|Rf#`!uxnv+kZCm7$>>pQCV5 zQkTpA_M1C>!CArF3JeEBa!~_PY@XJ3&TS}UsmJME>A6wK-e== zF9ZO6Fw=7w1Xwi=B(-{;u(*mI{ZK{I^V;j))L(F!JKD_foZN3dcX{hK`)a^ecLkh=xQV>i?0D9rS;M~!B@@41r z9FC?A8gD4F1UGBbwoBFr(pj4>-)(vyX%8eqwO;=nCfxtk%@9pQuzd9?oc7TmG+dhlhuYD6jxYba4F!)MxUa zPg7%xxILuXHJ(grKb)+ojtF~pnz6Q@3Z?++D4;j)AH9B2u0ja?8NmUDHG^Naa@lLt zEqAA-MNz;dft97DYVm|$o0jPY5fJg19RMV#Q{^*H8o8oHwqurb92aUv+T6yvMXx6c zqXZA;YjP{BB#lg`oLL5rTbw595;#p2Y2&rqMj}WAdC@1*>R2T4qI;&<)TQ&gi}L9`{WSlR{1vE8r2BG0H4@6@Q*gym`!{6J-5-sd!i0_tJ2v7 zPHmafd3&O?;`+XU?e=@TlBn-q9p4vMy{Zb8f7XK`vXE+KT0<(mrOwhNE;5qFnn;1! z{;H4^oWwPO0^2W^MDG%RBVc30#_p>)da7-xj$0A(@odmJf`iaiM+Ej2=C&ZRl3)i_ ztT=V~*KlJ~hV_^vy&oRD)a1gJYU8s`0{Gzux~Kp;I=I;DU{B*T`2}Bk*yv8aUE9#! z|03+!GvC-P%n|_{9eVRWXB@CSch-cScC@s&S^FdisJtbJOb3z$-AqhpzfejvvuJ-K9}_w z5ccnk4GFkRcMsug-WzFF70tK7?ca8yNUWRreU6@qVKH|9qMG{cLr>9^dhc3kzVxL`@ z+#IUBqj>2o1sd1@10u%mq@koWB&9H4{jN5pD*n*&^v)mhNeW2{wqLZ{UvDmSlW6zZ%g#OtHy~#2!!e#Al~Z=a z)ptdj;{BT^I?%jpB%X0D^xb-{9*f$x`K9UDwB|d>QuT_+CIWz7gnB=j7I^#G(z2xO zuAGfy-0tCUs>rGzT>ZoG=2*GHm-HF!TEgmbG!3n&e{Q7oJJ7527?<_huA(U^V?GED zmhBLc4~iqDCejK=Q@uWJ64*Ky9SBz>xVVoTUq~o>MJEl#;Lo*or>Q1`B-op!w=5T~ zBoji-NO}!}W-jgq>pxJ3O*XZGmZn^*m2q1O$i93GV%9#J%rx(EIu2LVc#X85NApSQ zDzbSkY4pV4<_+^6#j}OMD^-MKlZ1sdjN%BoaXRbQKR@IjWa0?j^nJ}}G;isk&UNEd zl-wFt^d9F~Sy2i#+uwAHGn9>+R1b`g?sJO7k=1LIzx`uf^+(o$G>#KR!e}r?7cLV) zydVQoCnp&ZcoGEKtr)tf)i17#W)U0>^B!i}p6@2st-oJ*m-EcA^6~X&dBti^#pCWc zdf#Hj5Ol{`_cdKj-JaMLq-(se>HSV5@uQqXux|YaW9e-n1=frA5>~9D4Kt?o@CdQ~6cwV2U5i zzGtOYd90ffnVS~n{r1I1d6z@3nt^Nl5;J;#<4sgrBBq#=MFsf2T~JVtDf5tV>YFKO zPw6=;u56#I@A=}@3$|PtJ0?jT<$LX7*q`tiYg@y_up(-sAT~Dm#K*S=R*7P~&kCc& z?Ij=xKwp+7^EnvmSkFuvMGMc&{3dpOBPl6{WnSK2&5#k-eo1>nKI7u6Q9~l3rAh?- zqxwhX54aG7a)I@7AmKO|0H2-(Wx<4c1!` zdo{HyO5}Yj*l`buU3gPUrb4TxmbI+?UE=%v)kn`1yqpq>%o%RIwt&S*0o6EBgKP(o{)czNU_l2b1Ut`x^{2?5E#fkt?cj znmQSg;g(yAL;AC9mj-=%qhV`WLJt|(C&r)SK4*j=0LMR_jp#DGPQ5XOJf?Ine6HlO zBI}7pPEt}y(=)v#nSD}M`gK+>2V)kLb|m5RH!_)3={y!5^*7tYE;WDgYcBEcX1&H{ z6zk=Z6z<-{W~7p81o&T_V0Pw-T44ygfAlTFQ#m~SJY3#xB1oV$3~a=hked=I|FO#J z4%kz;;~!%Wvh0mfU%Oc=Je{T0o6ApTBak+UYTV6}qJG_tv$C=DS5`2k$sW&53~TzF zeNSFlCS`|YJM^0cPn3K=E_|q~@-hyF@+;_vjBo`q1bAeK9!L0C(?QgH8S5oq2S~a$)uX(;#VHv)T;_+?}Y5zuFnhl<*3%ecrk;IL!O(6`RbEvc+FK2wQ7GvYO4aeM`Nl+P3&6YaZa5?S*bS)i#@2c| z%fh!rYygSkU<{~fOQYd2v ztL&6ljG$-=^@`3niD0-hIhBvh10A~wuBq3H@FZR%SqJ9fd1hI|8aj5|@&o3xO`-(W z$EXv9eLwsW{Gd?ZJxG%UjmYWg5il}8dwB{C>UJ^8r^HY@ zK&woV7ow-{MxdFJsvlHM?F~d!6Qnnb!tXT^a|D0HE!=5TcwtY4Nj)v zb%Z>uQJG*wi@r~J`cq(ar?!g~&kfdKRIlrE%KIxQ;5}q(p0d2}Ic0vWRS8ofv?sys zb-1KWD!;Q*p#VeI*Nb?!{OmfL>v}U)k|ya%F=1uI$HhL?EBNneO+K4ohRkH2dwBAR z*I8z4RqdKK+O(Y6f`=T^dtJ8Z`_qrV4FreXlYbHG^R>P6IX4jY#(F(1+@y>!CUEZ~D@djn{-2;~3ZuRfz9Ky-Q?Tsmdb2t3E-R8$aHZvuUj1 zt%Z3~XBzk}uAo59{$1k_NodTg8cU;o(V6W0$IwJl0;O@J&66l^bI6l+B$>D8l$&(X zJ+X|r(4{CwnkTHd=2$tptSolvCO)l}8m^jO(>_1&Y5v={1L?}G)}bY``Exp3Epf%+ zP(3Xb0eFvsL&atCyvuA%VrF0pekz-rQF#<>6$9H=UR)(Qg05& znG(*tTy5ohdCM1+Kr70yhTa%a@GbwB+4Zr9w_YrKh6x>y;<`5%aRjBxLbR?u zDkS6(qc_P@8cI0Ja7TUzXU@J;uCi|QvAO(9CYc{{$tJp{IqazN-W;lXy~d{1B{Z-@ z{bP-Iwz{T1C|_!Tz|1dcmB@ zl8^xo9*3JT_4)5Hm|^Id)c_ESExuoKVcU~Jcg(+4YDO9G!4j70{lu_5BS1!dt-M6x z3-!oE?-!}9{jyb0QwN=+Osyy~NalAzF^mHL{K?Q6SPAqd)_*7iOb7E>y2%0pP*Vut?&ZYcvzA9u0c^^z4IW8Q#oj;EO zx}Q8|&>-R=!spY8AsfP}g|hk-!))98eNA?iyzligvOGMxCC?j|rfh}Yv3*K)V19?) zDYRg_G>S+5^`fFn%_Pf`q`LmIrt-UV+FYot5kZHQ(C4}>aMsRU$OGf|~59G)o4XRY3 zrR9$H@ENWAYi2Qc8*5-6vsP_F2(3~okuwdTEdP(`riIVjOu>3aRh8DM;aIUy2yW`} z_AZ0e-xoty477Y;4J1v7dS^Q!noIic$L`_ax-y+N1vwQtRkr-4JD<;+99`w`Vu$TH zoh0U1sgICK7?S9RFC|l!VEE=SHPgj8o;>OTT~f%qQ=_N^L?)q)qlzP`;B) zVz|=WorSK_A6~obt5Zg1IUQ)1Y6b?Ad31c8{N3PeRlT2U8c{uuqtByc908k~ueRQ5 z4wW=q;RW+}9l)a<#S74N$z%v{+fFsGD?A0WEky+)JN=>J+XW_Fy0W6MnsaV-A**6- z90BedvYS7?--5xCr@K9ZuzRAMvOq*U=?Y(_eegIE@43+8!h^(%R7aAPaG#c{Q# zKfa;3l!WK@_xkA~RUFKPX#D2{ukj-Daz==@*5s1=#T_ItOL%9Z$O^%a>M_-gB}}u5@B1g5&Xg><1-T=tBm>;pJmJ{(X}FAmHI?k z!`8Il3Z@$Ni`$YLo7f1#2Tze>yD6T${+owUT2T?!L-ji*W7?t<%irlWd+|Pf;UH7W3Ksm1R1d&5IVu(Jv)(kV zMzv^$mGN*TFE%BBl~%d?gI*9SW6Vr&({!_1~>qQ28~-e;t# zhB8VEfnCgIw5XJ`eA{PMLCq=mSm1?w=aChvIo`w08iF@=Uh(ggDXo{*mVx1P{NCw3 zM|mAC7f;>YJWlqvmW#zOHm~LM5#b9cRqVI(Xi*X##-Bsk2-$96#@o7lQqlQgVDWRM z2ZJwwJc8gAfaP#rwl$kFrSEI?tJd_7kXP zoVrVz1q3#RXBsP5uZ@O>29#n=F77$-w~K4IV^O!AjR=g#_`b;4;O*t~M3=1h-2J=Ml&N{1O2ldcjI%>tz zk^R?UZRMK;j`^oF1aX|MM;Jh6$esiJ8d*fFwT zduuD+mnyi|H^|m{ef?2i4pLnA>*wE$i++JEIY>@|o-$FX>Px!QMCjj0=Y@FMs5y&5 zvJ*8`_3LGAhB=}I^K!(xadLsfKrDEb)BSMs!NVYou;pxH<>$|8{fF(aO5MZ2$9vBO zt6J=UPmzWlx@sF`Zj#Gc$H3w*9)B7S#p8;IhIqR2h4hfRo^R>UcyVR`IRyb&rRj(Hgk!am>is}v+ zqrp;{ottYvSs19i8q)vNA-WRs`JiRBCzY%4oh}}b@QJxy0^yI*q;pYo=0&RKGsjQ; zan=KvLB#SEfzz1UfiU?cdrvBlt3-nXIC~9NXHkrmC72kTpP#s)LbXtt^SHaNF)S1g zYR(r))%+CMUvEVan4=-+(l9fI8GB|k6-Pq1e@BRT(>8NJgj&bZ;~eg(I8j>3+H!iM z;o{_+m`LMu*cI-Q`G$Hs49Ir+po}!CZ&!)VVzGi@W?L}?_2Snv%;nijIYQEwg1qs$ zP0<|GttohenOwsx$7F&CKNkt}uDlTBh{r{HxVsUWh);hFO-f%!hk(1UTgKbG^vIdE zGxQqL2t=~H7g{)7_RrShPukD+9mFeKe3^=9ZL;ZFB$mmBj))-nIjWMF)#S1v0{HowKh*lU3Xp2(H{^gt&b2cHD8SsJQk1W0R z5zw9(k-vBt)z;8n`KZ$Uo95w3yMDr0lfO!mlG3qcSIgAf>xJf5E2O>oDX&m4h5Wsu z`|u9-_1Idz{VCMAi|X@Q|Ktd60w^mQ0P&(=1%e&mqSefrWui4X5R+n``J}H+J})4u z@XV~R;{*Fi{al1uL3jA#P}jQk94#lF+cj=4F{NXjYQSjwgC05Lr!P?on*7CLylDZch36G9_-`kKwnU z3O!_hz7SkJ#m!?y1|Y;x)DAxdA{tT7D6XJ{0_C&$go2-v9BmNPF{6#=xINe^<6((c zjk!BbgFo5`$-PP-uWRa6HDgFL_#V_7Dn^tHTCrw~LMW?q=S`H@+~StpqO6nY<)~>6 zf7>FfIJZ83(rX`96^j$}ed)peCJevy<;(5+gOy4U-2)`>=i~W_ePHmAChAcx>cfhp zpfOXdZLov><5#TCj4aV4~&rfIpi<3l5$%Q)?~U+s~6q=CpO6nMrw(UX!1)BE9cX^o7H z6okq}Vq__;hO6qMsL(I-8Ydqgx$R*l+=<9E>!N$@TkU1yABy%tZ5!gWkoPHPGVf@k zijr~euLX0PGs<@NV%bOQBA0!7s}G)UP}$@&>o(mM7iJ|xGhO%19(gYP6eK%BO+d;o z`exyHj6om4>1q^xfJT~8RDa@8xoVK$Kh z@}@U->na7wxi!XgR8;B$gAZA?hf1Q^_y;korjbgJ*aNtzcg~SF*|RE5=5{2E$X6(~ z?W>~Vhg(?!B2zA-V7U?*tb{&W?I7O&($Bd6mF0+#BuLLh?G3ig^jD57LT6n*kkp>b z2y`=*!Yt~Q?21Y5`r=zHJv9ZA!Nm<9}*oDwF+Uf;=Zzb$?M={OI3;kc(Y_TMC z!^fT-MCar8v01!EbSfot_FoKz`p1aI7Z&a&#zz8k9!sLpO{4%31A7M|QGVDrNlE|Z zj=_pmEc6XOh@pLDcOu(S^;*=PkeCONVX%$KSM zX}K*#TYSfT6O~Fwg&`zt3;8(8um(p`jpc=UEqR`f6?(DFTU9O?9=U;#u?`u34g%n< z0Y{H!l9Z&LfTs*t5g`rlravuiVZ7~xuNBIgh>i&3zR&c0eS1WB@>RHMaWsw^6AODi zN=-sD^dM05<{68Zh^u4{yK+*z$c-VY5Y&J(bx^{lOU&wSw}y?_C`#}?Peq5kr ze`T-Po0i0TdZox9xyB!5G`HrtoKN<-OVLbJO5lcpMm&zB@CD1VNtP<+t(7L)I7!-# z41;)4{fjQGC)mYE4`^)nc;&FgcakcUNLznSl2xkX#6=0h@mJgQB=ZxFg&uzM5xmTE zU9y>aG@k!)O(G-EFy?kdzk*|_FcTOV$qTGgc$J76VV;j0S0m$ti{s^}AsYm!hZ|cFbAV3b*QHhdeI;(sgs@2i< zF_Dq23V6lode{AM&9S|)v{hgtp)~OfNr5OkE4}JNWn8QPtk*8xS=QH&9`W; zv243nVpU^{FUR!my&*%f3B4zS$Bg*N?dtZrJ5>g4FWlIDvb9CzmUPI6aoWW9AjOgX zH%)|MlGJ%L|7&slwpQ~{4%40p3zaDl#DxZ~cq3j3^x}kfz6xOP0ntIYD$dR{QW{)b zbU2~I6|D6c6CeQM?%uG7hjVB|?O^rPS+iYwi55(k?+-P3BuA;n z-wj%=stIQI?v@(@G}(IUe1*_zkri0b^cg6^(x^)pXud7<0VrMBd0ZwiDww)y#QB}q!MiW9#Q9oK z7w1|uzKtx`K+grtwX}8P=Em_(zSdM%iVz7L?PBaG} zHCv+IZ{+2`MKh$O3_*es$TB6kRG>lT%G^brhr02ecFJdf4|oo>PM|+F%;|P zBSx6jj;?yZqs&!M-B;Mt6l;h{|_8h@E&UEmp zGG-1V2}~ab%j!T}WkyCu)anmw*A((76PWtGtP{XawS0jHMBoj6A$GUBwnNx&dL4lB z#MaJ^ZezOyVrl?W$$Ua@GFV+!QNe07vppb6(D3lx!-V_|2adzr&u(3x0$$x1ade&D zM(YH}t=IBAPz|o}C%_6bud2n;Cd+e^XgLeabcYJWTxe0S%|2oE;wI3O-2P6a65SgS zX6E0pUM+l`YAh9)P`#Oh&%`Uu$5&~#F_uRXDg$nISLuo2C~!L=0oITorHNm-%a+SH zuOcTA0&f;*)|snfVM>HpW!(LU^ZGzlZ9@k_M}^vNQrP;69W!q1u=FncpkcggR(T;$ z;z!KC!8%rl?wg5&Be>U$ML541)Nllq{|Pwxyw&VzhHRy#o`f!eA5=1}3K7WAtFtUO znltLlQ3m{E~`3a zs{>h}@9T2UYo4)(QX63cD1Vd4-Wog_GqCw}egZQGk1Y@h zRE5We`mb*DAHB@}NMuwysiJ`ZAfZ0$NkON8Hr5AY!yY9n;Pera_FuX`e!wFD^LdYr zp7}9X05)aK|Hs#T{Mr8+=s$U5D5VRMqm)K$M{dis-#T8X-Wm!zd60iwZ$V)ZJFc~y z@>l4@F#yv{;Fq!>Q~ksYsl;BVyxE3;-(>&z0K$MG@U(Um>`3w)=W&6cM5yWbTu%z= z#Zy0Qv{n%O%8=qd?na++EFjQiJ-0KmITN)$U2n2XxbdfoQjYz3J*tf)qb91Mw9?1Y zr^44fSK}u_BReC}cHC4B%#;32A87XmSbG#k?S3r$ znbJ`)EbHbyUhz{ag-9&JuAsBbf6xclw3R#Y2XJ1={|RmEmC=#%(OwVFPWOIX zkOLlI3I_203hN1oaGca9BtQ!faSM-vnAZ*j{x+(z@qEib10Lse2Mf^@!VWjm{rRV= z;5gu=+D39|XBuo>tAKfk z68jfQR2yU62y|izWBKoUbss|du&92j_j}zC2?|IUjHV?u1k~Z{V6&AaiJ;4jMN{Gf*`)gNGv=Fh39OdkHQDa9Ye)hidajH}MKdx-eq~L?7)5uo`&fiBnBG>?;d{|WzY@eR0he-_pVtkD(%eXFLqg$3M zZGI>1uCvq1DUV+tZkU~laeZk*ZQ<58KE!+mX#1z8h|HRRM!XM9PAu1asZJSf-Fq`A zU%&Q>`-1iGSns7Z%fCjKUQfs~yC;Sigr%~}N{YQFDR!Ey5aGJY;ouj5Pk-nke7qOD zsvtc;(8z#|-jK)SIAmtH+ElncjE?8SM{TM@Ot3!ybld1el4?-rRUii8Jc2^O_CIt_ zkDdO%bQ7blgQN@)AzrG1uq}M9 zYkJ^`9|bW$#Q6Uw-{`k!QJ%+&kljaQl*@_$K%PF!K{Pv0*Ve!Zin3L6NwN4wB z|CM_lxt$THlJM-S+G9{t{d2d>65WOB*AHh9OA&O!T2nc_>^7p z-=HZhekYD2!8135!&pYsrOgtN=;eP*EX<08{-S~@+u}POO z4!mcRr@F`5cpX^(K~Z&w6=Mz$uLH4eBGe}@Ya)rbD8qgM^{D^YK=c=7nb85$4>Fdd zNwrfGY22* zHoVU!OHKC}p$M|+B)vb$Ob4Eo$@o7O8-P*576EhsNr^WqIdT=$?+<;ChUo2q_BP)1n=x!t=fNxq%tn|GkW`!|J6E?l=#YzKu5(ZO|Nj7 zFVq1J7++$(JVC_p3&2Uhia(pp%-mwcXtvsA-+`@6o;M4QP!Ax_1;@b`Q}s1mTYCL9#xp5+v_56p~6f1sNu&@{sLAKE8pXK1+2#Qo;p z!aFp)?FDX+DCWlN*b0JKsnF&8ACmX*KHwDybfSp}68qdWpD{z2jur)7ljLYHfsYGb zPd*cRU1saE7}iCEoKKC|fIBGUJM>V$l-7A22A{3AF`I7sIyg-^g6e{+%s^Tp>f3bp zS80xQwqd`gpvNpaNb1LJ<6XC1MS(Uc(1D-|cEJ?g*Elg(xp$t0Sd`A79eBB@kc(jC zAOaunT9P}L!*Em}gq!Vc4$MPk;mE#oinZK;-{%4-zs|w!$Eso*!GsL68&?$(_iuN1 z`n*%E%$#pX?v;n+{F%(liIWf`q~IUFE#5BPE;Jl0-bnMI3*PhQ4w@YuE%6=ro}RAt zSNMLnA;i|5l9D9!dEenH(Fft% zzs=!O`!cTg1GmWEnp_OF1AzvAh(8qKzUp@0Q#F79yh3V-1f#Y8T}A*06>z2WC`F)) zmx2Skyy#us-%Fgg>pEWiAu{|R`OiPP{ZRbmoOKDYv2Fi$_+WFK;rPvUy<__iIr~44 z0RW9fcz$xfwY06uQ<4#HbO#AJIgyC`AqdlZjYeu2m8cr)LWUpk{_~pu^amk?go&We ztmXb!Li}xF<}g?bVOe^HhH%Uk$&N*{|)EEs;@B2SNe#rq(6QcMWMXh=#*P7yyt zxRLq>^&6X(1AWGSA>#)=rRgUf@86?#z=g~(fq3Qrio7}{le1c-ddmJx>}*Ixu^>gt zcZPk%r5P5L{F6U=19__dRrmkqu3Q8KgTB>iLF`)?ch_Ho?D^06IQ`3+qg_`&jsGd4 ze4Dts4OTDILzxFQ-~ct00nqq>_!Q8gRwYBwE2yj2yP%_s)~d@pKC{sh0wsCCCuz^u zUR{x5@yc*vsFSv1%JulKQ}cp+E9xJ0P=?sXwVHh&?(Ia}d>eJ-Ta!r2l73-!(J4)( zCs}D*67PZMRAs=DtzdjZ9t#)VqGybL+92Cn { - return ; + return ; }; export function App() { @@ -46,7 +47,11 @@ export function App() { - + + diff --git a/src/auth/lib/index.ts b/src/auth/lib/index.ts index da26e9b7..7de5d528 100644 --- a/src/auth/lib/index.ts +++ b/src/auth/lib/index.ts @@ -69,7 +69,7 @@ export async function submitRegistration(form: RegistrationForm) { ...form.address, }, user: { - fullName: `${form.firstName} ${form.lastName}`, + fullName: form.fullName, email: form.email, }, }), diff --git a/src/auth/registration/AddressField.tsx b/src/auth/registration/AddressField.tsx index cf018455..65e6b4e3 100644 --- a/src/auth/registration/AddressField.tsx +++ b/src/auth/registration/AddressField.tsx @@ -1,61 +1,62 @@ -import { Stack, Typography } from "@mui/material"; +import { Box, Divider, Stack, Typography } from "@mui/material"; import { FormikTextField } from "form/FormikHelpers"; import React from "react"; import { CountryPicker } from "components/Country/CountryPicker"; export function AddressField() { return ( - - - We are excited to have the opportunity to work with you! The last bit we - need is some address info for your organization. This will allow us to - set up the necessary financial arrangements. + + + Second (and last!) we'll need info on your business. Once you are + finished here, your account setup is complete. + + - - + - - + - + - + ); } diff --git a/src/auth/registration/AdvertiserField.tsx b/src/auth/registration/AdvertiserField.tsx deleted file mode 100644 index 6923b9d7..00000000 --- a/src/auth/registration/AdvertiserField.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { useFormikContext } from "formik"; -import { RegistrationForm } from "auth/registration/types"; -import { Typography } from "@mui/material"; -import React from "react"; -import { FormikTextField } from "form/FormikHelpers"; - -export function AdvertiserField() { - const { values } = useFormikContext(); - - return ( - - - Welcome to Brave Ads - {values.firstName && ( - <> - {", "} - {values.firstName} - - )} - {"! "} - Now we need to know about your organization. Include your organization's - name and be as descriptive as possible. This will help us expedite the - review and approval procedures. - - - - - - - - - ); -} diff --git a/src/auth/registration/AdvertiserRegistered.tsx b/src/auth/registration/AdvertiserRegistered.tsx index 04c019fa..5e3c6bd5 100644 --- a/src/auth/registration/AdvertiserRegistered.tsx +++ b/src/auth/registration/AdvertiserRegistered.tsx @@ -12,14 +12,17 @@ export function AdvertiserRegistered({ error }: Props) { {!!error ? ( - - We encountered a problem creating your account. Please reach out to + + We encountered a problem creating your account. + + + Please reach out to selfserve@brave.com {" "} or try again. - + - Success! Our team will now carefully review the provided - information. + Thanks for your interest in Brave Ads! Our team will now carefully + review the provided information. Once the review process is complete, we will send you an email to - notify you of the approval status and any further steps required. We - look forward to progressing our partnership with you and will be in - touch soon. + notify you of the approval status and any further steps required. + + + In the meantime, check out our{" "} + + advertiser resources + + . If you have any questions, please reach out to{" "} + selfserve@brave.com. - )} diff --git a/src/auth/registration/NameField.tsx b/src/auth/registration/NameField.tsx index c4aadd2b..cc9208e5 100644 --- a/src/auth/registration/NameField.tsx +++ b/src/auth/registration/NameField.tsx @@ -1,41 +1,64 @@ -import { Stack, Typography } from "@mui/material"; +import { Box, Divider, Stack, Typography } from "@mui/material"; import { FormikTextField } from "form/FormikHelpers"; import React from "react"; export function NameField() { return ( - - - Thank you for choosing Brave's Ads Platform! To complete your - registration, we need some information in order to provide you with a - great advertising experience. First, we'll start with the basics. + + + Thank you for choosing Brave's Ads Platform! Let's get you setup with + your account. First, we'll need your info. - - + - - + + + + + + + - + ); } diff --git a/src/auth/registration/Register.tsx b/src/auth/registration/Register.tsx index 3c405917..cd3f8f66 100644 --- a/src/auth/registration/Register.tsx +++ b/src/auth/registration/Register.tsx @@ -1,18 +1,21 @@ import { AuthContainer } from "auth/views/components/AuthContainer"; import { Form, Formik } from "formik"; -import React from "react"; +import React, { useState } from "react"; import { RegistrationSchema } from "validation/RegistrationSchema"; import { initialValues, RegistrationForm } from "auth/registration/types"; -import { Stack } from "@mui/material"; import { NameField } from "auth/registration/NameField"; -import { AdvertiserField } from "auth/registration/AdvertiserField"; import { AddressField } from "auth/registration/AddressField"; import { FormikSubmitButton } from "form/FormikHelpers"; import { useRegister } from "auth/hooks/mutations/useRegister"; import { AdvertiserRegistered } from "auth/registration/AdvertiserRegistered"; -import { StepsButton } from "components/Steps/StepsButton"; +import { NextAndBack } from "components/Steps/NextAndBack"; +import { Box, Toolbar, Typography } from "@mui/material"; +import { Background } from "components/Background/Background"; +import { LandingPageAppBar } from "components/AppBar/LandingPageAppBar"; +import { PaddedCardContainer } from "components/Card/PaddedCardContainer"; export function Register() { + const [activeStep, setActiveStep] = useState(0); const { register, hasRegistered, error } = useRegister(); if (hasRegistered || error) { @@ -23,38 +26,50 @@ export function Register() { ); } + const steps = [ + { label: "Your information", component: }, + { label: "Your business's information", component: }, + ]; + return ( - - { - setSubmitting(true); - register(v); - setSubmitting(false); - }} - validationSchema={RegistrationSchema} - > -

- - }, - { - label: "Organization details", - component: , - }, - { label: "Organization address", component: }, - ]} - finalComponent={ - - } - /> - - - - + + + + + + + {steps[activeStep].label} + + { + setSubmitting(true); + register(v); + setSubmitting(false); + }} + validationSchema={RegistrationSchema} + > +
+ + {steps[activeStep].component} + + + setActiveStep(activeStep + 1)} + onBack={() => setActiveStep(activeStep - 1)} + final={ + + } + /> + +
+
+
+
); } diff --git a/src/auth/registration/types.ts b/src/auth/registration/types.ts index 136329c9..ec887b50 100644 --- a/src/auth/registration/types.ts +++ b/src/auth/registration/types.ts @@ -1,7 +1,6 @@ export type RegistrationForm = { email: string; - firstName: string; - lastName: string; + fullName: string; advertiser: { name: string; url: string; @@ -19,8 +18,7 @@ export type RegistrationForm = { export const initialValues: RegistrationForm = { email: "", - firstName: "", - lastName: "", + fullName: "", advertiser: { name: "", url: "", diff --git a/src/auth/views/AuthVerify.tsx b/src/auth/views/AuthVerify.tsx index 49a5e97e..0ee82933 100644 --- a/src/auth/views/AuthVerify.tsx +++ b/src/auth/views/AuthVerify.tsx @@ -41,7 +41,7 @@ export function AuthVerify() { variant="h5" component={RouterLink} sx={{ textAlign: "center" }} - to="/" + to="/user/main" replace > Not automatically redirected? Click this link to go to the diff --git a/src/auth/views/LandingPage.tsx b/src/auth/views/LandingPage.tsx new file mode 100644 index 00000000..f46a7311 --- /dev/null +++ b/src/auth/views/LandingPage.tsx @@ -0,0 +1,59 @@ +import { Background } from "components/Background/Background"; +import { LandingPageAppBar } from "components/AppBar/LandingPageAppBar"; +import React from "react"; +import { Box, Button, Stack, Typography } from "@mui/material"; +import goals from "../../../images.svg"; +import { useIsAuthenticated } from "auth/hooks/queries/useIsAuthenticated"; + +const GradientText = { + backgroundImage: + "linear-gradient(96.46deg, #FF2869 -4.13%, #930BFE 82.88%), linear-gradient(0deg, #111317, #111317);", + backgroundClip: "text", + color: "transparent", +}; + +export function LandingPage() { + const isAuthenticated = useIsAuthenticated(); + + return ( + + + + + + + Privacy-forward + {" "} + advertising made simple + + + + Reach and convert new customers through premium advertising on the + Brave browser and search engine. + + + + + + + + + + ); +} diff --git a/src/auth/views/Login.tsx b/src/auth/views/Login.tsx index d452536c..450892da 100644 --- a/src/auth/views/Login.tsx +++ b/src/auth/views/Login.tsx @@ -12,14 +12,14 @@ export function Login() { const { signIn, loading, error } = useSignIn({ onSuccess() { - history.replace("/"); + history.replace("/user/main"); }, }); return ( - - Sign into your Brave Ads account + + Log into your Brave Ads account - Sign In + Log in + + Enter your email address to get a secure login link. Use this link to + access your Brave Ads account. + + setEmail(e.target.value)} @@ -56,10 +61,6 @@ export function MagicLink() { error={!!error} helperText={error} /> - - Enter your email address to get a secure login link. Use this link to - access your Brave Ads account. - - + + + + {aboveCard} - - {children} + {belowCard} - + ); } diff --git a/src/components/AppBar/LandingPageAppBar.tsx b/src/components/AppBar/LandingPageAppBar.tsx new file mode 100644 index 00000000..b9446965 --- /dev/null +++ b/src/components/AppBar/LandingPageAppBar.tsx @@ -0,0 +1,107 @@ +import * as React from "react"; + +import { + AppBar, + Box, + Button, + CssBaseline, + Divider, + Link, + LinkProps, + Stack, + Toolbar, +} from "@mui/material"; +import ads from "../../../branding.svg"; +import { Link as RouterLink, useRouteMatch } from "react-router-dom"; +import { useIsAuthenticated } from "auth/hooks/queries/useIsAuthenticated"; +import { useSignOut } from "auth/hooks/mutations/useSignOut"; + +export function LandingPageAppBar() { + const match = useRouteMatch(); + const isAuthenticated = useIsAuthenticated(); + + const links = [ + { + component: isAuthenticated ? null : ( + + ), + }, + { + component: ( + + ), + }, + { + component: ( + + ), + }, + ]; + + return ( + + + + + + + Ads + + + {links.map((l) => l.component)} + +
+ {!match.url.includes("auth") && ( + + )} + + + + ); +} + +interface HelpProps { + label: string; + props: LinkProps; +} + +function HelpLink({ label, props }: HelpProps) { + return ( + + {label} + + ); +} + +function AuthedButton(props: { isAuthenticated?: boolean }) { + const { signOut } = useSignOut(); + + return ( + + ); +} diff --git a/src/components/Background/Background.tsx b/src/components/Background/Background.tsx new file mode 100644 index 00000000..795bb020 --- /dev/null +++ b/src/components/Background/Background.tsx @@ -0,0 +1,24 @@ +import { PropsWithChildren } from "react"; +import gradient from "../../../background.svg"; +import { Container } from "@mui/material"; + +export function Background({ children }: PropsWithChildren) { + return ( + + {children} + + ); +} diff --git a/src/components/Card/PaddedCardContainer.tsx b/src/components/Card/PaddedCardContainer.tsx new file mode 100644 index 00000000..b4db7e6e --- /dev/null +++ b/src/components/Card/PaddedCardContainer.tsx @@ -0,0 +1,24 @@ +import { Card, CardContent } from "@mui/material"; +import React, { PropsWithChildren } from "react"; + +export function PaddedCardContainer({ children }: PropsWithChildren) { + return ( + + + {children} + + + ); +} diff --git a/src/components/Country/CountryPicker.tsx b/src/components/Country/CountryPicker.tsx index 073073dd..d843b594 100644 --- a/src/components/Country/CountryPicker.tsx +++ b/src/components/Country/CountryPicker.tsx @@ -1,4 +1,4 @@ -import { Autocomplete, TextField } from "@mui/material"; +import { Autocomplete, Box, FormLabel, TextField } from "@mui/material"; import { useField } from "formik"; import React from "react"; import { useCountries } from "components/Country/useCountries"; @@ -23,14 +23,16 @@ export const CountryPicker: React.FC = ({ name }) => { options={data} getOptionLabel={(option) => option.name} renderInput={(params) => ( - + + Country + + )} isOptionEqualToValue={(option, value) => option.code === value.code} value={value} diff --git a/src/components/Navigation/Navbar.tsx b/src/components/Navigation/Navbar.tsx index 82365928..e2dc17c7 100644 --- a/src/components/Navigation/Navbar.tsx +++ b/src/components/Navigation/Navbar.tsx @@ -2,8 +2,6 @@ import * as React from "react"; import { useHistory, useRouteMatch } from "react-router-dom"; -import TopBarProgress from "react-topbar-progress-indicator"; - import { AppBar, Button, @@ -16,18 +14,9 @@ import { import { UserMenu } from "components/Navigation/UserMenu"; import { DraftMenu } from "components/Navigation/DraftMenu"; import moment from "moment"; -import ads from "../../../brave-ads-black.svg"; +import ads from "../../../branding.svg"; import { useAdvertiser } from "auth/hooks/queries/useAdvertiser"; -TopBarProgress.config({ - barColors: { - "0": "#FB7959", - }, - shadowBlur: 0, - shadowColor: undefined, - barThickness: 2, -}); - export function Navbar() { const { advertiser } = useAdvertiser(); const history = useHistory(); @@ -41,7 +30,13 @@ export function Navbar() { return ( theme.zIndex.drawer + 1, bgcolor: "#ffffff" }} + sx={{ + zIndex: (theme) => theme.zIndex.drawer + 1, + bgcolor: "#ffffff", + height: "72px", + justifyContent: "center", + boxShadow: "none", + }} > diff --git a/src/components/Steps/NextAndBack.tsx b/src/components/Steps/NextAndBack.tsx index 69427d67..e63c5d78 100644 --- a/src/components/Steps/NextAndBack.tsx +++ b/src/components/Steps/NextAndBack.tsx @@ -17,37 +17,31 @@ export function NextAndBack({ final, }: Props) { return ( - - - + + {activeStep !== 0 && ( + + )} + {activeStep < steps && ( + + )} {activeStep === steps && <>{final}} ); diff --git a/src/components/Steps/StepsButton.tsx b/src/components/Steps/StepsButton.tsx deleted file mode 100644 index 9c2dea86..00000000 --- a/src/components/Steps/StepsButton.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Box, Step, StepLabel, Stepper } from "@mui/material"; -import React, { useState } from "react"; -import { NextAndBack } from "components/Steps/NextAndBack"; - -interface Props { - steps: { - label: string; - component: React.ReactNode; - }[]; - finalComponent: React.ReactNode; -} - -export function StepsButton({ steps, finalComponent }: Props) { - const [activeStep, setActiveStep] = useState(0); - - return ( - - {steps[activeStep].component} - - {steps.map((s) => { - const stepProps: { completed?: boolean } = {}; - return ( - - {s.label} - - ); - })} - - setActiveStep(activeStep + 1)} - onBack={() => setActiveStep(activeStep - 1)} - final={finalComponent} - /> - - ); -} diff --git a/src/form/FormikHelpers.tsx b/src/form/FormikHelpers.tsx index 78be82f3..0b92baca 100644 --- a/src/form/FormikHelpers.tsx +++ b/src/form/FormikHelpers.tsx @@ -4,6 +4,8 @@ import React, { useEffect, } from "react"; import { + Box, + Button, FormControl, FormControlLabel, FormHelperText, @@ -29,6 +31,7 @@ type FormikTextFieldProps = TextFieldProps & { small?: boolean; type?: HTMLInputTypeAttribute; disabled?: boolean; + useTopLabel?: boolean; }; export const FormikTextField: React.FC = (props) => { @@ -43,19 +46,36 @@ export const FormikTextField: React.FC = (props) => { helperText = `${len}/${props.maxLengthInstantFeedback} characters`; } + const extraOmit = props.useTopLabel ? ["label"] : []; return ( - + + {props.useTopLabel && ( + {props.label} + )} + + ); }; @@ -198,16 +218,15 @@ export const FormikSubmitButton: React.FC = ({ return (
- {formik.isSubmitting ? inProgressLabel : label} - +
); diff --git a/src/theme.tsx b/src/theme.tsx index 111a866f..1936af79 100644 --- a/src/theme.tsx +++ b/src/theme.tsx @@ -14,10 +14,10 @@ export const theme = createTheme({ }, palette: { primary: { - main: "#F8532BCC", + main: "#423eee", }, secondary: { - main: "#4C54D2", + main: "#fe5907", }, background: { default: "#F1F3F5", @@ -28,4 +28,21 @@ export const theme = createTheme({ secondary: "#A0A1B2", }, }, + components: { + MuiButton: { + styleOverrides: { + root: { + borderRadius: "1000px", + }, + }, + }, + MuiCard: { + styleOverrides: { + root: { + borderRadius: "12px", + boxShadow: "rgba(99, 105, 110, 0.18) 0px 1px 12px 0px", + }, + }, + }, + }, }); diff --git a/src/validation/RegistrationSchema.tsx b/src/validation/RegistrationSchema.tsx index 7fb88fa1..14c8176b 100644 --- a/src/validation/RegistrationSchema.tsx +++ b/src/validation/RegistrationSchema.tsx @@ -12,12 +12,11 @@ export const RegistrationSchema = object().shape({ .label("Email address") .required() .matches(EmailRegex, "Please enter a valid email address"), - firstName: string().label("First name").required(), - lastName: string().label("Last name").required(), + fullName: string().label("Full name").required(), advertiser: object().shape({ - name: string().label("Organization name").required(), + name: string().label("Business name").required(), url: string() - .label("Organization URL") + .label("Business URL") .required() .matches(NoSpacesRegex, `URL must not contain any whitespace`) .matches(HttpsRegex, `URL must start with https://`) @@ -26,11 +25,11 @@ export const RegistrationSchema = object().shape({ `Please enter a valid URL, for example https://brave.com`, ), phone: string() - .label("Organization phone number") + .label("Business phone number") .required() .matches( PhoneRegex, - "Please enter a valid phone number, including country code.", + "Please enter a valid phone number, that has no spaces, and includes country code.", ), }), address: object().shape({