Login
+ {/** Wasp has built-in auth forms & flows, which you can also opt-out of, if you wish :) */} ++ + I don't have an account yet (go to signup). + +
No tasks yet.
; + return ( +A*ftbnx_2@R~?Ec#;R@zv$7QA3ERp*U@$*=Gv)1J{Q8RU{AVR)UMk z^rvrZ#=okD`zvTtKy4Fn5Ux~2x-7GGAu32QV-g!A`8*zV#iYB<`9|x(cLQq#HL;EO zs!!RAgW9#FD0(7G{^3CZ%H?$g$>Z5gb0Byx#-}&D-@Axe* z&I+BmbqDt+Wn1Na=iYrX0Y%kpW(>ICT`Cs%VzIUrVGTrWsocV@`gNo=W0AH)&1hsY z1st@M7AF`or1EKLLP*>EQ{cm9ambDma5O)nv*?DX)Rs_db 5_zm+JW=HL6lnY3@fs5ApZJjUvC_@F0Twz+(-Dm zkptCf7dwS3*t#J)n1%v2lj&v8^Eof;*~W!aetK^lJi`aTM$H1x?^J(47)hf>Mk!c{ zkD4YMDh*pfmCOD8{2?^R>&TB&2{E4iEp2e$W?Z64OL*zd@0~|)q~pZGZbN5@ojv=8 zZNXkSr((p$*VdQr53hSaO>TamfHuYTCCcR!nfFieNL~k@eGhc!-n`FZ1c0z8AlfH@ zD=Su1HH>JcfSjMUYKhP7&vsW+i_%LA;=x~g7I{b8_Vi)r#h*vwk|ruZAi^4|S-flx z3O<&*s1VLu>Gtaz++}kf0g)}7 _?L zQvC+IXM^*;l}Gn;qcy**;|i!`X(Bp21_CYu-GdOE*4`tbb_zHMF?>Rp`~6CbTKsus zR1-LQusf9BckC7oxI{p&=}b=`u)D6QBuZhM!bt!+>*D^Eo|^hiveW0j17dSL_1-5> z?JEI8@dy!|zU_@@{o|(~qDomS((%#s!UV-^eJc3L&FyR9B4|-jtY{6eTtX)LR%= zeCn%YV|wA2XkBj G#I?8u78vsfd=?SY(rCLTA)G;r@Yc89Q9f4Kend~t2jX2_>(^l9URwnQ=X>G zwMtT#Cz*zzji-Y&d*}%V%dP&pw0OPnP~~>gcB!D(WetJSfZoZLKfE)zInjt(NQ6z? zBeCn;HwJ*Yo{?=;O#HRWEx@X6M}peF*`q1nLLwA+MI7Yonp^E{_5Ep%`5{~!zk(FR zN(8CDKW ^QCg(z9z_9~j6 zo)LYm8;x))3xX-E2bIM0Fz&u6WCB;w!VNV8M>t1Kb6PgZ$4pg83GD#w@BEb%Crs13 z=yPaD&9%1F>OPwM*qbT_2c%4-l*& `%c0KgjuxY9Lur`YX3y zC(dUZWRS@GJ^-%>f(s6(sTY&%am}#Gquj89JW^o6Y#Gw@R^{8#id!_-M$3uvDN(3^ zFRL>R7*bRP%_DL6epoIx)k@plJC?>z=qCuB-3`2E-11C{A~ Z!LGUp J>y6fKsPFX|KaeOj4)3l&zHj$0tQ=Rx;}yUJwtb z?RHSex(hJ!VBhH0of>hqIg-Y1MLb+Eq{A%BW-;@YK!uGRjJ%z_S1$xT6dTG_O{LfC zA9^t_qnK;qF>e5zA(TZPp+;Hw?T`n*+;z7!Ar*2rXrq!PHa_IV@Gt-G=MlkUjERPc zMlW$dgd#L=HUiHDPikI_oJX0?ngf^vtm3-5GbwnU1C@gG{!7>LTkwl;!zW&uP~dqg z)(VTnjN*w^V(ZdyCme4RRY0xMgVF 4*HA?hmIlKJNYk_hlDQ#X+cmYF$M#iu#b5BK|4M5GTNR3?Zr3qi*!pk^A;@JZvk@ z^8Q;y`wRq7=8lKjC6D@@>WO@3;x?>X(F_I!9UCia+f%@2 m-g|SCMNz$!AA}q zTXC(NMAjuY#P17O0mx{~$QKZ>cA#{x)p--M@st=wsX3u9^%{^)4Lf9v{#@`ZuHcEB zY-;{@e!vT}z-w{l?S-RUHVbX|9lIXVFadONKwrQ~tK@wPqT}9QDjbh-5fp$`p q`4ZcGaq#Q{z44
fg^qc+;3nVi4ZF7P6A{RgA zHR0EY&AXPKj;qD#VKUu{00waomH1nAj}JdNA+4kid7BN40nUw&&TgI$7Y&O ID-#8<&C&~-l}TScdFSM5ITk2tT^0v8c8!20Wt#) e@Ig||JT9eTcuYNK{d(g>kI8f^YLl*-jFD-#|1;_LNy zM|;!#lLhveiwTu{Dua(&ZE~$*3JsV-!R$cf;9#0Rpm!eXU2##FncI)jEmYFLM8A*~ zz1at4mrS8ZKB>v*Av_uuIDYe ~!0#OnCcHdX!TcKU3kAi!`e3ebSB4mQ;S zn|Ukkhk@hmh8fR6fjcL4x(1&5&0i1ujkkIXKUEvv`2eDT0_6QE%v>lpR-B@z#x+^p z*4uEnx=-6;{9PVQdVc41o65USXep~+bq_=OE!yo!TI$#;UHuQ$S_BR|taamU!bCRZ z0@n(9&Q!$dd@doPKmsdeelVL=%so`h`XsW}oJu#PofuLde$bQWbDm%G@}lpe&f}V$ z0d6Q8069WC0G{3_kB%9EaFIKWn7bB;5KQ%V>4r)@S(y@E2~=+imArU}Wwwgi?>3Ru z-sYNHY4*MhzC;+G?q=k=!RX2R&%>U^q!0KWxrSq8Aw)I$>s(MbxX{szNO_qLO=#LW zoibRkS1V@x$#MPgmlki99+uA>aPY_Qn2~2zrQt3(2L*r_G`?3>80^#bZk=eZIJ)4> z+~;?@qlevoG1`FfVW6wX%vNU&4RMcAh+=rku7hR$=ixbGOA=#}2Yi+;8kp6?sork} zk8ri^MY!R69|1w(+S~H?Q46CdUN`@cl$^6o6;KTjyC`F1+o6v>N49mGZ~128N)Brp z^AN$+?s0T9hrhjair>^feRnY~$yP2^d<}ROie^W22-di7zF!GNjpv&5CC~scr-90~ zeAL``D_z|Y)K5D+D7LD>7&a)2FCtB( 7?0U{l%HCsCmb@m$ zemP!DfhDVm2pBB*vQPSLkqH&W83mb@*dc^4KaZrHDBUMbTptwsoD?JdMvN5@Ry*NO zcqZu&N2PlQhOXCu<;g0-&5V;*pVg6$E=oDNx= V%6>(9;_l}6Dj$mUHHlKr#c>m4)0f? zl7XZnW2jE+u=2nsCAGSROFM@S`{V->8MlRvUMJ+#Eg$jDK7Ua1wNw2W!7<(LdM$QK z%V)i}QZZm=(W60hWEh!}4TY9_a%(2v-@G Hw5)qf{h)M~QQ-g}2c^SzdERju z-q096(*VS6M~GizQbu7EQ<9cxw4>KcR4~}!t`0ek>~qxKO)*>w_Ma99nJP%Dd7jnr zIGw|WbOnouj3TfLG9rF#33DB96zgQRtnna9L#DFDo6}@30$Yw#dTVf=mtaB(UY=RG zr~6~^fds}kvPN|%>z^EsFr4ENTg;f&E<8b|t^u|gSo7wx+{?HgHvT7ozhCSqQ`eR+ zZWH{~pO)?!wzQ&Sj6DfO@T6m`Ttr+?9;@!&T}wb&QLPLbBZK6HD`CRoGN14;ngwV9 zwM6yBn2{SFuYokXfaHc#OLk9h(ePVIBV}qV9YQZo$XH5h;kseE``7Vwz(Pn-ufu~v z%RIT=g6h9?n=xX9j)OP@vz@-aKcc!TAO?|uvO zh30VQR01xdQnROLEh>OGj3U4x4+l%48SJ&DxjU9<8bn D2ow7?$lPK=YoB3>2%ZsWEvj8k U_81`8AKIQPW8 3-qq6uX*27f2HwfJPrQDb&zRH zlc2R*dDVeWad^t)BYn4MjPOH3VnC(d2Qy!C8hjFCqDbngN^cP~Q)71~i)BBrH{Y{60 zW3oljs@g=A+DS>vS7l_IS5jp0Lu^ht+U}a)3^d){1cZd=+07!az-}o&l(w1A==QDT z3K9vb=pcf%>bu8U{JP~r+eC;`;dxI!x0ZrxZA=*f1BW=GK{=8(t14^zaYm47TC>J3 zm+R0`O@mbF74v#Nh@(MyhOX%zqm%FId+v8RlQ-xpo=%u08ed_&C<&U$*u@cIvHb*O zN|I~$Z~(Un7Iq^=xiyp;8=?~$>7lz-W*n~x-*edu(w%jg&&}>nY0UfNO>AlSF9ZWN zZ)C|*m3Z<|hQ-3RtCaMf&$eWk>-99hx9+9Mf*fv9xL*gZ_H> vD?mJ^f4T##_dqkq)cY4xOO~U)fdUx_kbk^*ZGAx|Lm~=c8_o zvd`*!iax&09b_Xhv^?-Rp|7D~SC4t!hOEX9ZglsZ{oel&Ehezu3640)FdiMZ@{9>R zd8}dXD|U_vnE-#HiYOEbtb}H-BX6zmqj<@9Tt-$bsndAetct>333$$wh+M}$cNf94 zRV{iPN&0clTm&$uMkA?BOoP_uIEI`Uz~X?YX+}#g=qw++uo&TEuJ_{p^C-v9adCzS z=L%A>QE2J)%-XR8Cbi;3xiHNUwKEciiWw)HC~~{!eOed{;DYZ{nH8!hTbH^DUI>2u zR@k@HNgx el>-N)jnAaNl3Lh%pf^yfaq^IZoM(;xEu|ORjBbrC zktIjaqX7Xd!EG?=X=ck0#|mHVu2zM_>#&p5HPhOGqn?ap`YY5xZC{3*Zg^*YqK5JM zs_BQ_h#AWMx@`)#8L+=%=?t<`eYDa$-w-UqnQ3Cg3wIWT932d%DM?E*Tf1CY5*!2p zpsr7PTKjG_)qZl#4=fQ1qgs%5kNZ6QY&_ysnL%sf>XkWxg5swfpX`p^(#s8ScCiN~ zpO0Ob>s1GQdT4pI97Ijq*5|xhvKAC1Sac(dN_1}g(>PJ`s?xE>{>ZZUEq6t%*lb@y zH`zwQ*8C%qJ^he* (oE#+9AS*{*Lv50%U&c)VKs3lk=z? zGO|KY7A=&1|LpKXFlyuv*O9r^TK*tH(-0a64WpPbT9Z{ 4@aMsbEp1` zekOy#?5` PPvC5WQb5ssL{i0M}{dlXwC~uc#d@vT0MkZ*|5A{9!Hw5zO=E7+w9-yX! z^>cz0O|SM{ghERMD2j{-3gF%60VR`hcpz^#Yf0NJ3vE!HV67zZ?JfFTY|LS`cV0L< zAYmbP-sMzvlkl_2%C^clP(1 K^*%i`M?g^h!KQjlS85nc^s_&^J^swaz_E p?SR{rufq!cn{>KRkP~oX|786c=&||M3IBx%1_;YQ)&TY5+ zmQx;bEHelw{v=Lh7XgA_ArkI93cnUwChaxB4>3)B`_HJDlPDd2 w=ynY z47>N4dSdlenYFLz1g6FVM1exM;*bTQ`#2Ft?65!g0~-3*4?qX4Ww;xjsc*1kpbcO) zj#s0HF*Ku5a=t&;DUfzzV;!v;qr1lfN)!K%Uk^>%!Oizq4zFbdp;`TdDYv552GR7c z 5$# z{(Fr(ETk&*PV(6wHu%^>X^j9MAIU?(7A(?%Z@OTI^*DLelisAyg`s-8w;UrjOdkB) z$9*M+u>vna%dm%s(_-JIzsCrt-3|WhzVbAlGu6Ge!Nbz6S(|a!?}Vy4y-qw}&c|V( zj{akM02rdCZrjjZ*OJpQTxeu%+P-3{^r>t9_rv&CWiNd3hJe!V5omqib#lr?ekO?S zrKLxsx ^wU41+^#j0p6JxoY!o>H|gZ9MQnPdfzgL}H5ZBnVt-^OOad z^G{XC_SBRXnA5DmsFaTEgh2JQ{#^`e*%0#bu0ES_ U z`&aK#jmi4gKpG%Nf=ooK6Yym1HCz)6(#+D$wPe1NRc?gQdn1e4w}n6D&OIHP+S)h5 z8F;l7mP`4wuE*KE`#}1H9G3d$pqqYbKH{h3wo?g49t8MI{*xQAG4F#^=3Lz$*u*ir zkscBL=ARXM)5Ruv=lGgnHRaPS_93k8iiE(I{mvuE?zGOII~>W&%qs^gWu1W<9N)q4 zOeZ~0UA@*rcDGgiF{a}cD}118ypE39pFi@jUjuAFp+}=Gq|O^!YpRAsXg*kv-xQ6g z#Tt;^8-KsNOqDoz=@28IVj4C0GUOUa(lKrlWZHZ;MgM}3{EaivO9FfkA!1@%G~hg} zJ7ZX!-W*c&22F9`7N_a^lmzxeoN`K>3h2%NdupaKI}50e2^#Av=;H?W({?-?egy-? z3N8q1hf&U?wbF24H8+oEXDXswu!Xbx1`i2t41R)kTx6Ug wCs)h!x&6O=YAtg%$qEdy`&9lssr5hSvgp@)m%5XuYk$Uy1_2_)ul zgK;nMAD*hk84GzhFCn@zP`<_F6ZVtj*vbz?O&@Kwe=;3rz#p3f*)g>}^*8xZ6PiLG zsGZIXm>9~G!;sHd^Jze9RyVzo*_P>FN%bZq6V%D8?(n0+dqJ3gLd5&x6EW;gcMTaa zwwiQfG_Y#y*F>EltgR?s^LKsM@9WdUA4M(Yd;KjlNB(B$WL-Z0p0-&L)l-(|PMF6s zTNU2L@6e`|UGrL5i8NDt^@rcPb1g(fL!H5H9*_tUYNETHYYn(E%X^h`r&`jw&s*h( z$cCm$PbV&H53`nqo1f3$tiJPHhTqpB0%{6+XLYl?uFj{{oq@rgrhZ?vYty~ O^(z-HZ^o@)3s5w zD%Je)r4bIkWFs!pIs|8w+S^f3bwKy;Bisv982xQGd#6Na?gea&I4q|-9F8Za=)4dJ zes(|iX ZZ7lz1 q4c+G~huJ_VTEI6o=yzr} zvbEv;lGfPd21O`Roid_0(}JSIn5AlD4ThX4uyQncE}kCiqlk6ZMJ4FzJ7P_{^4%AQ z<>3^5YboQ$_U(f@WrV*4W7S`)%fj31CcOG~y1!1&FdG5NV^4Ea{MUvnS8Do_V1fzy zNjoXNkwzjR6+2u>wkyvfU=7h_GFB<|L4s$<#NZ|tcx*cjM`?@)$;XdihP`t?&jK`} z5^3Rd-|SNok_UU{`j0KU-fxI3wkSQuC=vwWXp*v-9lv^+=gPEHyT3Z{uszXXD^QRI ztZ@f2<}MZEYLa@c<^77!+U?p6RR5%G0;YcwNi!Naa7Hdb<|KB$?nyUAlcA8607`u( z_d|roM{o#jzb+6@*=?|KM;T)-@*xsi@amMNr3q>>zNK|-cYKoTW+elb`84(Op#{fp zHW~5v^kf0<^@tF1=Z8K|y%rl_-w91KCI^jcpl+(e)!MuQ>H_d$QPuSVgvXUhlmSNv zy ZD>Yfm3|N8KkS-CyiM*;j+IqGCPhNo>2*!^hP~d{q`p>M_YHD40`DAm} z 8y^yzL{%s7PG2s+03LxM+y zEfJj`zZj#HEkK1$)_Switk13?Po>>hO4%WePz^e+bhN0gYUq~wDWI $g@1?8jHl@c-Vq(0i#MasL=n)y!I@<_7PI%(drjja<@2VkW zRO^{6>26a*sbq;GsH${y5t@`Q8rn)7j)qB4*w|@B*)}FUV63s)od}lxtkTCB>@Xs% zJHoie12_M=VluMphOyXrw=4Dzd8h|f?s+gFz1PRh-Wfx<)1Waag>`6qt!w(IBg%82 z;l2YFOR+;u)dY^0xtdKZ=q?%3*0Ri|Ky?jmy&3C8C`PSQH}>;09`xP<#E=ySYWgi9 z`t=bQsnPnKcgER1 ||Lw37Z)#yIko09XhIltQF6#a5l8O06|Zul$+P_{NG5o;QFS z=^72xKBjuRV`babz3V!+2lO5zQXxA!SzXr$AJ2xLx-)nOxBB9U5CRVsRiM8T9eW3p z?!gzsw6*1kf0jFDM~@Fbp6xe+TwAB{HX;E!<^V@_ymuc27POP|eNYVlBJnrd1tf^q zz&|+GuRS{te;C&B5mOzr6Np_Vqz$90o=!{HZh=l77aKF;BPGP@F4kMZvJjX9Y6st( zD;Xs#Y*Hp^Zq0Z*?xCuR=t>#|B{q9c zyi^+Tm3uYpqiKe%%VfDC-Uz!kp&luM8*i-KrSzt$Z ZFeN z%!Yf`txDawv`?q{)rdVl3@_^VhuT&8Y3Z)g@G+Nkej91$*6tkhtArS!z+D{Dr6kBu z+fc(?FY#fNljmQ(D+I~`mg-P(#}^Db=u3|t`*YhS5nT}fkF1_C;^jJBvHj%)F>Kg# z&r9O*L{few*6RZG*%yn;ZpGae3r?2Y#<{h=8LM>z4s;@bSl`K%*YBQbjL9y#7nm zAWj^;CMqs;^>M}Pk0#oT-J7qfkQj{UK $YRN^k|97~W%vby z)dmBime-J@WNsFqJ69n-@QE>v6FXlm8H@r^+PTeo@*h0`@OXzt8D26)y~W)l|Y{ptUN&Viq5SLlFnozZyM=ll;Q&@2YT=(nFbq {_sfCD2u2%-aiQMb}QMAzTf^LJT;uYM2MTq(+%-e#5h zvo3x F%V*jzMXO7S}4@Vo19f24z(H4fQNboo@Ecf*%A(!jzSfqftA>VPuQaRaU z%h5#ueZYSfbRB< mBp4cwb~llga=d)!#5rf>Ec`$y)U3jGNe_ z??`dSFPxxfK&ovulE>Qo3X?v55gO`1*RIc6OtQy@p_5zFR0Rg-BGBuH9B}*EJG<9m zJs*FS&?ZDci@`pO<7w~0sKQz#yp)-+I`o$>)^XPVO#L~d6CG%p@GEM)7v)9>!^|z- z(PBDbi@^d7*g~^<@Mho(bRx5uXej^PhK#Z}IpDd}8xKb-zr_ZqO<-JU36WdvvtZfa z`Qo#+98T~HnwxQDVgyL1zrCitjCp?mC;@h{;P*`c6lRs;v{RebwrZ&HoAm@Y=hmzf z1TZ8X;sXqC {%gC^D1@sTF$wCC2qvuu zyn@ce(#SKFf1&|CzYTA%R9^cfi0k{d0CPZzv>n25fwsEcNgS5mXtdx#q p;u8uh!TrR+Aj4&Sk z(N>=JCamGm>oKcEi~hd($daKNYfwUbK~0+pHt`RQ51vOpS-hsBJx4q!Y$5<}Pg;;4 zfOk7dV!&99{y4SkJ~br1Y{^{93dw`YJ{kfgj}0sMyimbP)D1Ff^;~LMl6Iv1vMJkz z2?!oXLF(V=W%49~HV*u*dbnW3pVYrzF}K=0TYu|RpI%VCxbCi$1x0kkMT$y%R-WaB z+vte`%f%+4KhPE$8w4!g?HtOWbTziHHJhD}eV9K(;>83c*KF`vx#Pp%O|)0sWT9gf z!ymiX^PzQm?XU{R3c9v DuP?e7OvD0Xn&F0Z z9d)ZV^71n$MWhHc*o7UI`lMBt_VCA_xI)CeJ{Uj^h$+-)T>=)*0vXP#XHutfC|5AU zeTWdDq%MmfR7b&TmE22qE7IZLJlM5k!O?!ktz}m7wug0&zb(0d !(KlqoN}PGya!2`*+y7B?AW83ZbpBl~*(Xo-Qg z1LDWZJ$@E!RB8mR(N)(4_HTUKPIGTvHFNzV1EQvS c-+T_1i)ZdXFnI!D4G(1Obn?fp7ExaTE!JIU6KeI^2VX3e zwbvY`rgf7^O>cZs#pXCWdbaCwWIX=$mQEO$#lAqRMh|iiEb&kcDpS-=yNew;RbO6s z(=t>Of$S-JS1morkk0n&v_RwtoX*`eBpr?X(Z&32rhxv9j`*L`f9R@DnFW!IgOSiV zP^ZOK>^x_v_$vaeo3LZs>C63TUGs=jxz1`uH~10i)beNaWzN_Xc})u)ADbR0LK`-l zYE;0~M~f9v6bLAFrSCnfe!Nu|gou!Sdnrwu(xSAS$atb(&3yKGW7Uzw4PuP3&UueB zFI}Zoynp?yvv$GuAUZT{lWE_RI*Iv-OFH*O2tI!3>zuIux%6l2$)oDDq}8;9n3RV2 zv$_Ey!Nv K{f>cy{$FP)>(CxGz;;uK1=w&{&1X5rJtgNtyt?1rYLRwZ_v zCXeQZFWD2$D7Aw3JHBmwRVc8a_a6M*V#X-Y-LmvbVWAbE(hT8%scYRx8+vQnNy1UF zlN)FhJ^qAS)!0`eDduleULAw7!=g==g3FoHPpD0xEDVT_;04eKFj+&^SwNtH?V#?c z+b(8yTbK6M{ymbb<;_H`ydfh2CL)x4YSY3Z;+G=k3QaKZ_r>*1Z=VUWTz+@!eZY{> z8>lyaLha=0Tl!dgtgMQ{Lz;fgwO_g{6+{9ZW&{k(+4xo$$Z6VBH82kNIrv+Y@M)cH z%6X5e>kQd`p?wV)af6uKwLvjF5}pX3>E{5J$znu^H-Fw3CixjHnb$(uGr<$@4T0Le z3aO%@%#6M}r;2&T1!TEC@myX;`{~1U*Tc?d#_O`@$}F_FQE=r*_~LzS4nVI%mO&)e zE ;HCe03xoCZG)xNULMehc5w_eydEMInRye$-y zV_st~2qpCHNz9shC%fv9YLkz2qL=*FK2Ra~IN%L=9uz g;}6RO%l@n zD^eex(N}w(f266|0;V;Ax~?+Ryo=FbQ2x$U?p#6w%UWgDIccO*C|%nIpJXCJRO$&~ zboB ~&<&6x+JK%@i|$u9>UC||u#O#I=1vYOHxcip(hxMI(X z4w!j}dkVPU_skNam Iji{JOER6{E(*jCD(!bb}-8Js|bN@r-RbL z^X&cD{iVKL`{dr}T@ttVG&yHh`B%Y@&*c|~a+yyX)A9%);cg(hJ#hc-=fpH|YRm%4 z#4>;K#y&9 w$StQSxn59e$R zgXrh_AGZ&$R}uib41sn4txbco2hSZ*XV#bg_jDdOZ)yIt7M &2^ytH7)6QU`aq+IAFcBd-{)5^~ 5off^iOcsdT&XW$ zVQ8;y`(5!}Q5-t)GJDU9#;Evv`_aMv)1ORM<}m5Ww_A=uCSl|@hA@UAI$Uya##65D z@|`SJ5nN2*%3_bW##C(eN^0@pgy5Dyd4Fhyydx^=J^-Uc8ol8sl$mnY&R{7_!!N;T zmTx(wEV%XkuOPE!=b-Zehj#_On1PdkX5A5k!4F@qpl*KyKB96q-QK>x@^oAH^qV80 zW&4U@X)=INu;87e>rt4{)t^#gJK2FRbE_=U10}b1r(5S#Pu#MK6qHY+h6(M>)`GNv zCT&(YNIBA@+yC8|uMRRtEJ!6Q6q?B}*MDj8@mm*Gv2clGKFa5ow{gr6G->|%aEdSN zJH`lL^d@U882R>ti2RFCW{l&@!VeBkTqRjK7W~fWA?E4O>TSRP`b5a>dN8JCSxmWn z?S-=lDb{E@@y>!wGrE@OhfcneFPpP_vqFHf62`fobZ&)QQ1QYonnQY>cmWv9HlQ25 z9Y!WUc(PBe4Eqf1mBo)k2vwkTUG`U3B*MA;xh>vDV;GnPKCnk(NRiS&*L~| zl{&HBJq-72bgnyj$G0vy>6^5hUts)OZwuP}`AYDF2TI0v+XMBG0nEz@F$ZWNN_)17 z&5l+vvz>ZU2pMv&=z+rTXR?~AYGDvH8(>oes`XpiZ3G%ugG`3ApT6&wc3Tytu5&Ie zV^S3*pK{kA0XT5=$?I9>GTs)MHYUsBy|aU6Kc;AQGYR(Arv!Z>u6J7$N=mv7ckX=V zn?7**auY&|&BiLOF?Ewah)LhWRBZ^&W-t7|mBhdsGQNKJPQ62xzl!l7vhN?wj=OWA zfeTUj=vX&n>AV$G5%VLrhI@QibM41dG2e463UuT$MMd%X@7}g_zYbG0Fhg7AV%~>x z;AdF5qdbCwt^UieuKzG$z%#Yk 6U$elF5{6Q&oP-AMg7^tWle`6kQ1zRy;cnGb9*XW|B*fr0rc^J<>BCrfzZ-D z3qsg4bwk}*Q0dwj@9MYL=)^Os6v3cQtPmlo=yC7kTE7#M;~`~jLNMQ5HbYW!nBuPj za@5PKOePDOfrxnehxac*ZdW= -6^I;gn+S0 zsOvMRRdz8}KfMv&l1v7-;eSwyS)_=L*Y+iIh^~z!v2a^ztjp^G?|#@%KrfE{DwJ#` zzTSl)f7^1+wbYpwz)wgBGl)`5hx@ncODBAg95H5jkf}(Q$x3QC`N^oqI5yOp4MYEZ z99;9#gk`quUmguNn=O%-cO!J`Xq34cF+k@K0u*1No#qQtOUCT`gsR~7^#PD&u5 zFVUZ+PwY&k>cGsaV-OB}`+~1xU)+b_TS^Q6(*5^;Rh1QJmO>IeV?BS0_(S(=?Nu0C zaP SJP!%8Pgb;;Qnh;$6s}W#Q0=A0gjQrPSLcDN}a+O;qw+g T>zPsK;NG9-Vi{*NsjP%fB_L0CG9v7X@Dw389O%zu+gghp0b>OS<+@RTX;I&b5; z+{^#ofii#ug&Q^o;dDUNDQVD{W~`gEZeATLaO{?%K%H9ZKI4CXR;WHAK%Q7UVv4wB zLM;D3R)%PtQZePP_j~mv=hNB$mCSmRpmrl7mgUc8*Vy5rUlv6FqnITKw-SB}l-Yp! z2Iqx _GR`*ovf%|^m$HgIy+W*aGU`AImsw_-gENr^a)XHL6M0(|(7R3Kw zxsXavMWf0fqP6Zi>|nFpL!azwWDmoGF_jY^do4q~V0jKp(7)LRT(AXUP2#(864>5H zn=oo-cYW6XdtrzIKGtEMCzgZ)B}Z$2JK0WlPx#LJzrBir6QbfG2UR?Q+Nru^5Ev;Y zV}2E>0`(xaUIj51dAK%;&&%v_7VqnQpox72vYUozd$#1Lao9K+tS{s6RcCW?_mlsx zj$4h^K5!c}VV)p^9rR1YlnR)b{D-wT60d}}QY5g2jjFhXK3RYu(1ws8s~QubN5Ju= zek!HoBPCIKLNQ^bid`71_=NbQWu{HrNe;G>BSY;s>5@{kx#Ue%zh*d67xcnxqRdtq z3z7`*Fml~_FIp@^q%wENoDLyG4D0)~82H+!ITxMicJr~>V{R5~8HpJT)OIMj{`Ni^ z4*{-~S=nWKfJPQmnO;=m6HoRSVXkIGQgw*JqnOR5<=OREagz~juIo?a6pf{T4a)>* z;q%j55MEWJ!m0g&-GdLFs@;=!b=ftr)t4pl9;}bXGd1x4`Jg>I!5mXr?l7DEQ7DYG zRr_ zN*LJ;_7*=~blvsKc z!wtoH@<^z{p@bkSN1!h<; _yDymfTqAgyrcP`)&Fs %`TV4NBXyX zkeT^HW@`wrm}QDcd-@^IkpW~{-W0L UzosBTSnIxKVL$%3HR#7p#0D191OAlBfUIu|^O9gctQkONd0fjg>;;=d>M zWqp3t$+;+I!4U~UI=q0zd9)=hBu*WD9}jD*iC{kN!HmOHuy2H>!PA4kLjl!^9C-T3 zfCzSA@?qeqD>v2>XSoA$_q`?;{fW|}=K1J}RQE>po_0MP;O6Crc#}s1*I~=W`l;LR zuZn8qh;5i1DwriE)x~?G))E{4FcH>kEmUdqYPw*0e6sm8=f1pU|N5N;pq}!3(x=PX zrt0VIc*}X#xAEC#%b|9(gFqkET}uGYQAX!Dqmyq;brs4P&6b`tog!4zkZ~sw<)d5& zY&;O$=lCZZ8zKzLzYtp9Z)wMbA~y4jX*3>SZ4CpMsZRtF&^)x!)8paCyLXN9Tbk@M z>See+nKphfP+v$}nodo0c+}50S5nJAr1ajw5tyq0#t5uzH(wKdqr<^riNO3V0I6zr z-A-{g$?9jqM3&iYzE00oLB) 7 z5Iz}KfsO{EmAL-;LX}ph<{E-;d|>j!ciMtUop4MMhgV>yhK#xOn9^Y@?X5C@7?Yk- z+2C6!D~NWuTB{_nkg0yHY~lB@kuN3Y4s0U6U}L9SW^VVza_U1WRJzMy$#MIjb{QcR z3(%JDbB?9s-`mizwDT>sb8!C=lFSAKj%T2)ow+;Z!l%3B-N8*2qZh5`wGIp4s3! &h4(EPb|ZYXVO-}cLf z@k0>fU`PlT$g$~qyt1W1Ce6c&cYlN?rcEZ851w*ndsHw17x-}ydiWWAGQ;9C`XuI; zbw4*u#ZzUgK9^5#)JKgm-w_=Mg8&67S~JJ^&Covn0Evib2b$Ngm!e!F9G!1f?fT%I zn0Tm)1|D`WDRO<2-=ig4T%7VOzUO^euc(BHT-iisHTp)0jU6wOwuoTf*S7%c&yRTe{K4V0;TM;u zsby0SftiZ)QW4EOesD9*-yVL; 5J$G-EaE=_w%D6NWz z8n+w_Gf8nYwHqtY!ZUp`Z*FJvs|qgxd%-TY75!V?Ayb0${0R>Q?j8ID<0>ih;EJ{s z0%TsCz=mpL&u?(eCmlF8M2bbC!)6|!ruMzM@ j2;Bszj8De 0bnzz(G!HC4&$V?ESX;Tf$)< &%8Bc& z2Go2gspY4uE@>$7hIH4)ji7zE98az)7Cj0CNiJ~d`PqSJ9ol%iH|3dkr2iGxDBrg< zjoDv1pxPZa%X%yb6O>p+wBlT6! {R *fn8ljrXSz`-sVZ+15Kt%x-|pQR z-iS<-8duK@b*~3D0l>6|W`1lu_s*Z_X-y_EOm_L+pK=I>5j-}(z07fh&M)4(#*cd5 z-H>U7X$cxx+lG~O|C0K#fy#W(c(-u(7LJiIl (iA(g z#>)egN*o-|(#Ndi#ZN;7)np$8a?q`afav>;58-rqA^EY-efq8k2wFSY7(8z?hh`Sv z0L&0~3tHk_^8DodXSDR>Mt8YLnn>loRl!Tb8k#qonu0HDtnZzR5);AH#W^Q@2N!!* zcIE|FeIssQw9kcjql||s8W 1?S=@IA+!A{$H0$HUSYVVN2vuVo~m3(pAo3%@}2f&&Y;r>{$;8U+kdzUmS z`uaHQpS61;od-w$GQzdi`Vb(Jh|LX2QyL7~^W2%1W%8d;;`*pNHtEI}rKder< (Qq=5sbP{FhDd{t?%^k8A(twx-{(=r+i7o^qnlyKP*U4?Bl~ zc{!Nm ok2*B2^=&5_ z`Q8eQ#wPNZAU!J^YDYfq7oaZkJ;VL4|0i94$ gYqng}8;S@2HV=7?R&RYR@O^oc zFxeHhA$UCCIdV_?)xf_iVVIfeRD$~h1 `1yvvXc0wn*@F_c30^dNU6jOto3=4Siq z0ojxo!~Zc|R1eLg{LMarnK?feoI58>#?xY9m!9&~8vn2RFG &$1E^T!Cm z_=cZ_aAy-gWbg)Twx7R>T 6gQy4c-`Ywmp2 y8ZtD$3%%jAtBL%5Gq^78X6@bg_5n@_I=MXwvxzJNXWisnX&K7 zP(qTi4l@QNS;m@%%ox7c40reM@%v-`n(@B2bDj5fopWAK&Y13XbN9b caF$E$h` zwI}%YuV!>|A;ZDWo#Cfy#+{EqUF%tFpR66^Gv4;u+&fj$`jgrB=SQXTsxt%ph8x-} z{Dd4PtHX-qJKHu}w;#0#nPOPRWPN jw1uk;5s2$e|BZ=mg@NRC!7V7-IdORa zp2tg_K~fA9#%kodJCaQ;v!WWt6jjl4+3Ltcgh$>H6NDvCj0wV{UisT;0CJ%j4#-21 zzUU}7D!EwK_KMA%>Bu^{cDC_`RDY}8oQLAS*ZElBTJBeNw~pnU$eTzQh;em_i(I1k zZLj`62B-|8*dfPgLZ#n8@)I9RK!0~@=*XLh_uR9c5H#parE*Su-vSyt@yP!cf8D$A z=OU6AJO*0z=-*P8F2gAYV&9yj!&>I=fs79_wx=fT;ul58DilTkRe9>+k>*S;h2+V0 zn4M@IO_wZTkT*1mI3_Whyof&RU3D7qwLhtdW@8{TSB0`4v~f3Re?tfaaxQ|Sbf>dH ztjg5i@vB~gkS^*d$1@kTys#JJtUKi@-S>6)u-~p3y{y-s-_`S_gC7*m=-_->Xfma> z;o`_|G}nN5Oio$e|Gwm}M9pJhy9>^{iDQwqp!fwgzCx}^?YqcaiPaZ6gye$$(r|rA z`Cv$~e0v^W{Nk#zf<7yTp)A9eR`mw%P9S^tD$nPhjAK2Y(HLq5isai>Xr@!1`LD+? z2&rT^;GvPtJwLV%!;QG_=w^1ws`cON3gOC~mV3JkB+I5cQ*KV&?zuOgH*n5GePesg zugSBkZ$FawzmN%rahqatROxm*qY*`%O|k+{?2Vv`4`(Jh_cej&M$}!XlT8SV;KZ>1 zoo`7%&=2Pqa(U4;Q7U(ctDa>Sew&px&ygI3rU@kcv(jjV5L9)4yXg L| zxlYsa0qc%BQP&Cg7Rt!VF)!W*>Cej(kcP;u9KZQXX&SBWQ3ijD$lj?gRsJd?*$4|A zrDrrbs&_DBK*OoW3x;_}gc(cyrxd-Ufr7&pDz9vPIrU4LHJq8P?zw*yNhHO=NW}HB z9qs~m`kr;FLP$~C%3^J{qJYu#`L6#RjLCM$>9m1QMJ0Rh1l2@(o%ca7!}oor#6-I@ zP>VqsuD-m3a$x!#&+_W(i~x^XTLBXKZ~Hxr5QjCR^Bc?ssjPQ#*EVYbR)DZajFR z*6o*Q=L0H);*4@k?s7CB20s=`F1g+{-1B?_0aV14%@iH*e4^W5e_#$kjJQVJT9>l7 zJY3NE|DU9o1p6Kcbs@CqDd^p6l+PUv3-|@&wF$S+C3H*3+OY4 CHfWA-P!j3y#Ws?BGDiq2p*7kar1 z?w#-0^LKht!Q_jBHpaik47HiHjKo63I!ue?ezJ1ZDJMLB#X+qK2dC8?;1g~s5B@^d zSIHc&)1RpJd%6=Isd#zjvB }VUKU)*m@k0y#IC;yZhC$61UP}gkZUiyrFn@w|L`o~`^YTu@;zE9A~dArAavD+;~ z6TQL^vAL!aGkaBpaVe_*OzMr2Z0%?6pfAvY&2#qVX2g%9C9OOI;)w%$+u_E|OxcR- zqgoLjC65_REW3061YFVRkvA2I+!xA=LYCi&vz*IU8!KXC5ve(@wMKlB1=sJmj7`iI zxlU`zQ{45eaF>r0X6-pWBBt99C$L=0I` 4fVBh*{z1%9!{C0)ee!L% z{iRrEVXrEqEVz-)YYF>8rL;`#5lBRF!d&vvUWKrRao!;Jklsvt>THJm0>{s;5uEhX zZL67;q70?;uAEKg-#a!$!w|Qm2daJBZfE(?et3mRV +re9lTCeS2QvDKZquR;M`T!84ET91&J;#`zDNPod=q z*lJK8NcJOHJYx;=i_Qr-MD2iu?m+FGYrpMs#VT-$cE@{Zd!Eq%1%ERq6;?LW$8z3v zt5Q;1SZbo+L*$_go|KUs>wcPsE+h`T0dHjRy$#5JHnjY@HWB2ESVl@(bwxb+vaR8h zmHGXrXx6jK(6XYeE?qJ675{kcMzBYnB9{AHYW6L E8)E z*teblupknw-fERXbG%V21BA(b^NZSX*dvh`>iiWk4GBprnT4|@D@{yqQlTJeQlnKQ z6H}GDb1Bfj4sPz nE0)<@SbOu-8;vmLOX44G*^wDHcS3qA zYl~kM%#Xqsy)5lc(Ke|cq !!qeDxmE7k3H4 ?q4gWtIQ*v_}<^3(N}7b z@DT8LW+qy1uDlNFy1Qrv{rE=)|2C}!LVhQ4mRjVr>{CuoE1B$lCf>Jcpw(;nOiZv# zFS38=*dap3mc0GSMpjj_H`P`I*`M5hM7Vl;%hk7=bloR~@lyLReL 3JNHB y9)2WVDj4cWw91w<5#gj3CNq`_Uly0Ty1eABEG z_(;3vf$ EB>auhqKV~|{LUy>uN=c~PSV)wf`*_PSQAU(r30pb+9nE0AkrFEVAamZD+k~! z+5p;?%;j)Pz&pugsg_m5lM){|4xxI*%(D<(LhYoD%*1Z*3twijik?A&P>7gP&*wxA z$?`PEw3hCZI9@S~FBFIfhQTW{$g!y< XLc`8^Cu2ZEsyZ)b5`*ae;~j>O0s@lu zBc7mi{4>z(!+D0GcQC5kH@O=%GkyW`;*5>yLdti4>E1~#g*#b<^LSY?FPnMbPZG?j zM7k;(kxu$Ux>!*7{G$=@=#nro!xmVhx84-g6d#zh>>Fg@xI1V{AIepjmP%BoY(Q`3 z7_%}=@ f z$xd6>j40 $)!Xw@$)6vIuj>fAEDwtS5z8iees z*Q p8HaVR+Dpn0BGeeDX zQD5gtQJS_@gnQNA-Y3QL6G8GR4y7Mmn2}95ZFW*G)z1DfAchK#zdz$GvIU!doQ9LJ zC@7>zsV^RI0=G^i{hNmwJ8`KFv+KR;$c kQm#}_t#9Y-B7?|;S zOnz u-d! z9Aa`}PCSPWp<;V38WL}T(-?)bLHWI5y`3Ow+n%o!#4U&D?b{aAqFsaJQ*1B=h7t^C z;s6CuOw+OGGfb7eaM@60=#SZOnVoF49;ol&5Gd2yt!bTQ;j?caXk;$T5IuI|b}%ZD zN05P2Jd=H~V9aCV8pVC55L;o|zmydSAb7@8#~4bHIFLTjd1l`4CF1xZSQ8vHV!aRE zzNsnDGAJ}QxFNxS)ScTH@YKo!+qnzmRB#+sJHs_){4mLySt(>J6X30ZR?f*9%!tK( zF`INbR6NpZxC%AdoL+aLs|J}XUI>AsLZaVqav)+gNlGk$_i@SbTriF Z^bHsC7dJ4mFog1HS`Vl|F0SA`D|hKqjE z psT}zwGot z7^$C4*AU>N^KpK|+lw9g8of~^JRp*w5A?&qD9(|c>}u}AfUu})`g0`OuUTC#|4mm{ z@?$Z )I3b+t*h%rs4>3~2Ytx~aSMMBEu;DgZ7xfgjD3IorKFqiF8Np={ zQ*{9^fEioJ<+v|M$LBrXGa~xr!Ew|^q5kB&gBAU GTpz^PS<3E}w0NQv{KM)`R|QZ{v8ox& zN*}brATIJsb=(CvcYt7lH~Hh&?EEmP(BCsJ01{h#%V {BJ$;LMxcaY zH0dDS^=F`$ZiHuumotF2qz_xX%1?FeD;Lm9P|aPL_>|Jp#!%wc&|4msLWE}){?wC% z7=R@)cqBQfiKKtcy=>$#R4hxHfwk2Ti$bLH-vRD$QH*K&vyyIa2C0@L54l0HAkfgx zGOsZJl##0WX5SYdB6!EOV|E&R;*k{s=wj4eCL>I7T(MW92}WXZ78}<5x pn9P`!<9W@RMoOdj?Ks?PTt-)|5$$>agZ%9WlWMO~fA~%@h z3Yz=2tYB<*j4my>_32jxHxFv#4yMy6m+V 2V1@wH0x|0LzJR}$nW);N9nO!r5YTb+k9&@Vlqb$WWu=JR-B6w@ zTxOiLX~sG0yg9e#j(>yIXcSDb68n7$RAS!)oN|L#e7EI}*=h=y+2cf_di5@h8iWfu zY`Re<9J#_OB9;>FCVQQ=OU4T)`CEDGx=$LlX4r0OR4%>xd>?%WM388~nGY`kV&j5d z#^qgx8fSGj+)boYY360q&E=YEh~|=VMd|OWU&ekrRFg9lddgp;bId&b@!*HIjj^v?44kvS z3yU<>-KmW5bJlm~$E@J{sxd { + if (!context.user) { + throw new HttpError(401); + } + + return context.entities.Task.create({ + data: { + description, + user: { connect: { id: context.user.id } }, + }, + }); +}; + +type updateArgs = { taskId: Task['id']; isDone: Task['isDone'] }; + +export const updateTask = async ({ taskId, isDone }: updateArgs, context: Context) => { + if (!context.user) { + throw new HttpError(401); + } + + return context.entities.Task.updateMany({ + where: { + id: taskId, + user: { id: context.user.id }, + }, + data: { isDone }, + }); +}; diff --git a/examples/todo-typescript/src/server/queries.ts b/examples/todo-typescript/src/server/queries.ts new file mode 100644 index 000000000..dab9b76a9 --- /dev/null +++ b/examples/todo-typescript/src/server/queries.ts @@ -0,0 +1,9 @@ +import HttpError from '@wasp/core/HttpError.js'; +import { Context, Task } from './serverTypes' + +export const getTasks = async (args: null, context: Context): Promise => { + if (!context.user) { + throw new HttpError(401); + } + return context.entities.Task.findMany({ where: { user: { id: context.user.id } } }); +}; diff --git a/examples/todo-typescript/src/server/serverTypes.ts b/examples/todo-typescript/src/server/serverTypes.ts new file mode 100644 index 000000000..870f56eca --- /dev/null +++ b/examples/todo-typescript/src/server/serverTypes.ts @@ -0,0 +1,11 @@ +import { Task as TaskType, User, Prisma } from '@prisma/client'; + +export type Task = TaskType; + +export type Context = { + user: User; + entities: { + Task: Prisma.TaskDelegate<{}>; + User: Prisma.UserDelegate<{}>; + }; +}; diff --git a/examples/todo-typescript/src/server/tsconfig.json b/examples/todo-typescript/src/server/tsconfig.json new file mode 100644 index 000000000..70a79b44e --- /dev/null +++ b/examples/todo-typescript/src/server/tsconfig.json @@ -0,0 +1,48 @@ +// =============================== IMPORTANT ================================= +// +// This file is only used for Wasp IDE support. You can change it to configure +// your IDE checks, but none of these options will affect the TypeScript +// compiler. Proper TS compiler configuration in Wasp is coming soon :) +{ + "compilerOptions": { + // Allows default imports. + "esModuleInterop": true, + "allowJs": true, + "strict": true, + // Wasp needs the following settings enable IDE support in your source + // files. Editing them might break features like import autocompletion and + // definition lookup. Don't change them unless you know what you're doing. + // + // The relative path to the generated web app's root directory. This must be + // set to define the "paths" option. + "baseUrl": "../../.wasp/out/server/", + "paths": { + // Resolve all "@wasp" imports to the generated source code. + "@wasp/*": [ + "src/*" + ], + // Resolve all non-relative imports to the correct node module. Source: + // https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping + "*": [ + // Start by looking for the definiton inside the node modules root + // directory... + "node_modules/*", + // ... If that fails, try to find it inside definitely-typed type + // definitions. + "node_modules/@types/*" + ] + }, + // Correctly resolve types: https://www.typescriptlang.org/tsconfig#typeRoots + "typeRoots": [ + "../../.wasp/out/server/node_modules/@types" + ], + // Since this TS config is used only for IDE support and not for + // compilation, the following directory doesn't exist. We need to specify + // it to prevent this error: + // https://stackoverflow.com/questions/42609768/typescript-error-cannot-write-file-because-it-would-overwrite-input-file + "outDir": "phantom", + }, + "exclude": [ + "phantom" + ], +} \ No newline at end of file diff --git a/examples/todo-typescript/src/shared/tsconfig.json b/examples/todo-typescript/src/shared/tsconfig.json new file mode 100644 index 000000000..f78b58a77 --- /dev/null +++ b/examples/todo-typescript/src/shared/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + // Enable default imports in TypeScript. + "esModuleInterop": true, + "allowJs": true, + // The following settings enable IDE support in user-provided source files. + // Editing them might break features like import autocompletion and + // definition lookup. Don't change them unless you know what you're doing. + // + // The relative path to the generated web app's root directory. This must be + // set to define the "paths" option. + "baseUrl": "../../.wasp/out/server/", + "paths": { + // Resolve all non-relative imports to the correct node module. Source: + // https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping + "*": [ + // Start by looking for the definiton inside the node modules root + // directory... + "node_modules/*", + // ... If that fails, try to find it inside definitely-typed type + // definitions. + "node_modules/@types/*" + ] + }, + // Correctly resolve types: https://www.typescriptlang.org/tsconfig#typeRoots + "typeRoots": ["../../.wasp/out/server/node_modules/@types"], + } +} From 5c02ce32cb8ecfc9ea3e56398fdfc4bb106b163c Mon Sep 17 00:00:00 2001 From: vincanger <70215737+vincanger@users.noreply.github.com> Date: Tue, 20 Dec 2022 11:30:00 +0100 Subject: [PATCH 2/9] Update main.wasp --- examples/todo-typescript/main.wasp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/todo-typescript/main.wasp b/examples/todo-typescript/main.wasp index 08d34e399..220e12c7a 100644 --- a/examples/todo-typescript/main.wasp +++ b/examples/todo-typescript/main.wasp @@ -1,4 +1,4 @@ -app VideoTodoNotifier { +app TodoTypescript { wasp: { version: "^0.7.3" }, From 148bdc205d40745147eabcee8279d3e37a7ff812 Mon Sep 17 00:00:00 2001 From: vincanger <70215737+vincanger@users.noreply.github.com> Date: Tue, 20 Dec 2022 11:37:22 +0100 Subject: [PATCH 3/9] add esnext warning to main.wasp --- examples/todo-typescript/main.wasp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/todo-typescript/main.wasp b/examples/todo-typescript/main.wasp index 220e12c7a..3dccb1a8b 100644 --- a/examples/todo-typescript/main.wasp +++ b/examples/todo-typescript/main.wasp @@ -49,7 +49,8 @@ page SignupPage { query getTasks { // We specify the JS implementation of our query (which is an async JS function) - // which can be found in `server/queries.js` as a named export `getTasks`. + // Even if you use TS and have a queries.ts file, you will still need to import it using the .js extension. + // see here for more info: https://wasp-lang.dev/docs/tutorials/todo-app/03-listing-tasks#wasp-declaration fn: import { getTasks } from "@server/queries.js", // We tell Wasp that this query is doing something with the `Task` entity. With that, Wasp will // automatically refresh the results of this query when tasks change. From ed8bc2ef7411b1e68e990e817bda1c4f2a255984 Mon Sep 17 00:00:00 2001 From: Matija Sosic Date: Wed, 4 Jan 2023 15:27:28 +0100 Subject: [PATCH 4/9] Added link to Waspello demo on lp + fixes deployment docs. --- web/docs/_addExternalAuthEnvVarsReminder.md | 5 +++++ web/docs/deploying.md | 19 ++++++++++++++++++- web/src/components/ExampleWaspApps.js | 11 +++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 web/docs/_addExternalAuthEnvVarsReminder.md diff --git a/web/docs/_addExternalAuthEnvVarsReminder.md b/web/docs/_addExternalAuthEnvVarsReminder.md new file mode 100644 index 000000000..a4ec07201 --- /dev/null +++ b/web/docs/_addExternalAuthEnvVarsReminder.md @@ -0,0 +1,5 @@ +:::tip Using an external auth method? + +if your app is using an external authentication method(s) supported by Wasp (such as [Google](/docs/language/features#google) or [GitHub](/docs/language/features#github)), make sure to set the necessary environment variables. + +::: diff --git a/web/docs/deploying.md b/web/docs/deploying.md index d1110c64a..c1cdc1eed 100644 --- a/web/docs/deploying.md +++ b/web/docs/deploying.md @@ -3,6 +3,8 @@ title: Deploying --- import useBaseUrl from '@docusaurus/useBaseUrl'; +import AddExternalAuthEnvVarsReminder from './_addExternalAuthEnvVarsReminder.md' + :::info Wasp is in beta, so keep in mind there might be some kinks / bugs, and possibly a bit bigger changes in the future. If you encounter any issues, reach out to us on [Discord](https://discord.gg/rzdnErX) and we will make sure to help you out! @@ -43,6 +45,8 @@ Server uses following environment variables, so you need to ensure they are set - `WASP_WEB_CLIENT_URL` -> The URL of where the frontend app is running (e.g. `https:// .netlify.app`), which is necessary for CORS. - `JWT_SECRET` -> You need this if you are using Wasp's `auth` feature. Set it to a random string (password), at least 32 characters long. + + ### Deploying to Fly.io (free, recommended) Fly.io offers a variety of free services that are perfect for deploying your first Wasp app! You will need a Fly.io account and the [`flyctl` CLI](https://fly.io/docs/hands-on/install-flyctl/). @@ -99,8 +103,14 @@ Next, let's add a few more environment variables: flyctl secrets set PORT=8080 flyctl secrets set JWT_SECRET= flyctl secrets set WASP_WEB_CLIENT_URL= + +# If you are using an external auth method (Google or GitHub), make sure to add their vars too! +# flyctl secrets set GOOGLE_CLIENT_ID= +# flyctl secrets set GOOGLE_CLIENT_SECRET= ``` + + NOTE: If you do not know what your frontend URL is yet, don't worry. You can set `WASP_WEB_CLIENT_URL` after you deploy your frontend. If you want to make sure you've added your secrets correctly, run `flyctl secrets list` in the terminal. Note that you will see hashed versions of your secrets to protect your sensitive data. @@ -156,8 +166,13 @@ heroku create Unless you have external Postgres database that you want to use, let's create new database on Heroku and attach it to our app: ``` -heroku addons:create --app heroku-postgresql:hobby-dev +heroku addons:create --app heroku-postgresql:mini ``` +:::caution + +Heroku does not offer a free plan anymore and `mini` is their cheapest database instance - it costs $5/mo. + +::: Heroku will also set `DATABASE_URL` env var for us at this point. If you are using external database, you will have to set it yourself. @@ -375,6 +390,8 @@ Go to the server instance's `Settings` tab, and click `Generate Domain`. Do the The Postgres database is already initialized with a domain, so click on the Postgres instance, go to the **Connect** tab and copy the `Postgres Connection URL`. Go back to your `server` instance and navigate to its `Variables` tab. Now add the copied Postgres URL as `DATABASE_URL`, as well as the client's domain as `WASP_WEB_CLIENT_URL`. + + Next, copy the server's domain, move over to the client's `Variables` tab and add the generated server domain as a new variable called `REACT_APP_API_URL`. diff --git a/web/src/components/ExampleWaspApps.js b/web/src/components/ExampleWaspApps.js index 466049140..0036ab979 100644 --- a/web/src/components/ExampleWaspApps.js +++ b/web/src/components/ExampleWaspApps.js @@ -13,7 +13,7 @@ const examples = [ authorImg: 'https://avatars.githubusercontent.com/u/55102317', repoName: "waspello-example-app", repoUrl: "https://github.com/wasp-lang/wasp/tree/main/examples/waspello", - //demoUrl: "https://waspello.netlify.app/", + demoUrl: "https://waspello-demo.netlify.app/", // todo: try in GitPod/Replit url }, { @@ -122,9 +122,12 @@ const ExampleCard = (props) => ( From 44fec49992686bbd679906cdce6f35b87e725bb5 Mon Sep 17 00:00:00 2001 From: Matija Sosic- {props.demoUrl && ( - - )} + {/* Demo apps are not mobile-friendly yet so hiding them on mobile for now. */} + + {props.demoUrl && ( + + )} + Date: Wed, 11 Jan 2023 13:28:10 +0100 Subject: [PATCH 5/9] gtag tracking id update. --- web/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/docusaurus.config.js b/web/docusaurus.config.js index 3c75f409f..c2be4e1e4 100644 --- a/web/docusaurus.config.js +++ b/web/docusaurus.config.js @@ -127,7 +127,7 @@ module.exports = { '@docusaurus/preset-classic', { gtag: { - trackingID: 'G-3ZEDH3BVGE', + trackingID: 'GTM-WJX89HZ', anonymizeIP: true, }, docs: { From afd59877ca358583b225a88ec7d507b51b48e734 Mon Sep 17 00:00:00 2001 From: vincanger <70215737+vincanger@users.noreply.github.com> Date: Wed, 11 Jan 2023 11:04:58 +0100 Subject: [PATCH 6/9] Added Betathon blog post. --- web/blog/2023-01-11-betathon-review.md | 132 +++++++++++++++++++++++ web/blog/components/ImgWithCaption.js | 8 +- web/static/img/betathon/betathonpage.png | Bin 0 -> 1200676 bytes web/static/img/betathon/chris.png | Bin 0 -> 798326 bytes web/static/img/betathon/emmanuel.png | Bin 0 -> 123824 bytes web/static/img/betathon/github.png | Bin 0 -> 685413 bytes web/static/img/betathon/keyboard.png | Bin 0 -> 859060 bytes web/static/img/betathon/richard.png | Bin 0 -> 376247 bytes web/static/img/betathon/tim.png | Bin 0 -> 636083 bytes 9 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 web/blog/2023-01-11-betathon-review.md create mode 100644 web/static/img/betathon/betathonpage.png create mode 100644 web/static/img/betathon/chris.png create mode 100644 web/static/img/betathon/emmanuel.png create mode 100644 web/static/img/betathon/github.png create mode 100644 web/static/img/betathon/keyboard.png create mode 100644 web/static/img/betathon/richard.png create mode 100644 web/static/img/betathon/tim.png diff --git a/web/blog/2023-01-11-betathon-review.md b/web/blog/2023-01-11-betathon-review.md new file mode 100644 index 000000000..126d54531 --- /dev/null +++ b/web/blog/2023-01-11-betathon-review.md @@ -0,0 +1,132 @@ +--- +title: 'Hosting Our First Hackathon: Results & Review' +authors: [vinny] +tags: [fullstack, webdev, hackathon, startups] +--- + +import ImgWithCaption from './components/ImgWithCaption' + +To finalize the Wasp Beta launch week, we held a Beta Hackathon, which we dubbed the “Betathon”. The idea was to hold a simple, open, and fun hackathon to encourage users to build with Wasp, and that’s exactly what they did! + +As Wasp is still in its early days, we weren’t sure what the response would be, or if there’d be any response at all. Considering that we didn’t do much promotion of the Hackathon outside of our own channels, we were surprised by the results. + +In this post, I’ll give you a quick run-down of: + +- the hackathon results 🏆 +- how the hackathon was organized +- how we promoted it +- the community response + + +## …and the Winners Are: + +What’s a hackathon without the participants!? Let’s get this post off to a proper start by congratulating our winners and showcasing their work. 🔍 + + +### 🥇 Tim’s Job Board + + +Tim really went for it and created a feature-rich Job Board: + +- View the [App](https://client-production-54e7.up.railway.app/) & [GitHub Repo](https://github.com/tskaggs/wasp-jobs) +- Follow [Tim on Twitter](https://twitter.com/tskaggs) +- 🎉 Prizes: Wasp-colored Mechanical Keyboard, Wasp swag, $200 [Railway.app](http://Railway.app) credits + + +> “***Wasp is very awesome!*** *Easy setup and start-up especially if you're familiar with the Prisma ORM and Tailwind CSS. The stack is small but powerful... I'm going to use Wasp on a few MVP projects this year.”* - Tim +> + + +### 🥈Chris’s “Cook Wherever” Recipes App + + +Chris created an extensive database of recipes in a slick app: + +- View the [App](https://cookwherever.com) & [GitHub Repo](https://github.com/cookwherever/cookwherever) +- Follow [Chris on Twitter](https://twitter.com/breadchris) +- 🎉 Prizes: Wasp swag, $125 [Railway.app](http://Railway.app) credits + +> “***This was the best app dev experience I ever had!*** *…Walking through the docs, I immediately figured out how to use Wasp and was able to make a prototype in a couple of days.”* - Chris +> + + +### 🥉 Richard’s Roadmap & Feature Voting App + + +- View the [App](https://droad.netlify.app/) & [GitHub Repo](https://github.com/Fecony/droad) +- Follow [Richard on Twitter](https://twitter.com/webrickony) +- 🎉 Prizes: Wasp Shirt, $75 [Railway.app](http://Railway.app) credits + +> “***I liked how Wasp simplified writing query/actions*** *that are used to interact with the backend and frontend. How everything is defined and configured in wasp file and just works. Also […] login/signup was really easy to do since Wasp provides these two methods for use.”* - +> + + +### 🥉 Emmanuel’s Notes App + + +- View the [GitHub Repo](https://github.com/EmmanuelTheCoder/noteapp-with-wasp) +- Follow [Emmanuel on Twitter](https://twitter.com/EmmanuelCoder) +- 🎉 Prizes: Wasp Shirt, $75 [Railway.app](http://Railway.app) credits + +> *I joined the hackathon less than 48 hours before the submission deadline.* ***Wasp made it look easy because it handled the hard parts for me.*** *For example, username/password authentication took less than 7 lines of code to implement. -* excerpt from [Emmanuel’s Betathon Blog Post](https://dev.to/emmanuelthecoder/making-something-waspy-a-review-of-wasp-571j) +> + + +## Hackathon How-to + +Personally, I’ve never organized a hackathon before, and this was Wasp’s first hackathon as well, so when you’re a complete newbie at something, you often look towards others for inspiration. Being admirers of the work and style of Supabase, we drew a lot of inspiration from their “[launch week](https://supabase.com/blog/launch-week-5-hackathon)” approach when preparing for our own Beta launch and hacakthon. + + + +With some good inspiration in hand, we set off to create a simple, easy-going Hackathon experience. We weren’t certain we’d get many participants, so we decided to make the process as open as possible: *two weeks to work on any project using Wasp, alone or in a team of up to 4 people, submitted on our [Betathon Homepage](https://betathon.wasp-lang.dev/) before the deadline*. That was it. + +When you’re an early-stage startup, you can’t offer big cash prizes, so we asked Railway if they’d be interested in sponsoring some prizes, as we’re big fans of their deployment and hosting platform. Luckily, they agreed (thanks, Railway 🙏🚂). It was also a great match, since we already had the documentation for deploying Wasp apps to Railway on our website, making it an obvious choice for the participants to deploy their Hackathon apps with. + + + +On top of that, we decided that a cool grand prize could be a Wasp-colored mechanical keyboard. Nothing fancy, but keyboards are an item a lot of programmers love. We also threw in some Wasp beanies and shirts, and stated that we’d spotlight the winner’s on our platforms and social media accounts. + + +## Promotion + +For the Wasp Beta Launch Week, we were active and publicising Wasp on many platforms. We didn’t outright promote the hackathon on those platforms, but we were getting a lot of incoming interest to our Website and Discord, so we made noise about it there. We posted banners on the homepage, and made announcements on Discord and Twitter that directed people to a [Beta Hacakthon homepage](https://betathon.wasp-lang.dev) we created. + +The homepage was nice to have as a central spot for all the rules and relevant info. We also added a fun intro video to give the hackathon a more personal touch. I also think the effort put into making an intro video gives participants the feeling that they’re entering into a serious contest and committing to something of substance. + + + +As an extra bonus, we wrote the Betathon Homepage with Wasp, and put the [source code up on our GitHub](https://github.com/wasp-lang/wasp/tree/main/examples/hackathon). We thought it might inspire people to build with Wasp, using it as a guide while creating their own projects for the hackathon, plus it could be used by others in the future if they want to host their own hackathon. 💻 + +### The Response + +The response overall was small but significant, considering Wasp’s age. We were also extremely happy with the quality of the engagement. We had thirteen participants register overall, a nice number considering we only started promoting the hackathon on the day that we announced it (this is probably something we’d do differently next time)! + +We also asked participants for their feedback on participating in the Hackathon, and they were all pleased with the open, straight-forward approach we took, so we’ll most likely be repeating this for future versions. Other good signs were the many comments that participants were eager to take part in our next hackathon, as well as some dedicated new community members, which makes it all the more motivating for us. 💪 + +--- + +**A big THANK YOU again to all the participants for their hard work and feedback. Here’s to the next one! 🍻** \ No newline at end of file diff --git a/web/blog/components/ImgWithCaption.js b/web/blog/components/ImgWithCaption.js index 7bb2bf04d..5e9472b58 100644 --- a/web/blog/components/ImgWithCaption.js +++ b/web/blog/components/ImgWithCaption.js @@ -4,10 +4,12 @@ import useBaseUrl from "@docusaurus/useBaseUrl"; const ImgWithCaption = (props) => { return ( -diff --git a/web/static/img/betathon/betathonpage.png b/web/static/img/betathon/betathonpage.png new file mode 100644 index 0000000000000000000000000000000000000000..f99582811d5a34c181c2f9e811f34403c5c18882 GIT binary patch literal 1200676 zcmbTdWk6Kx`aUco7D{(obW69=FoeVm3@IQj-7QF`)X>ckLrFI%Da;VkjSk(?4exUA zv(GudbN2h;e?IWRHLmqM&)wH`-%scpW!c9MDIVUsb?dRboRr$FTMtZc-MZ^@|1R)k zpvRWw)~zSE+
`uXzcNBpyGS zZrq&UI?v&bBzEVYE*$Gx+jD!)_LVN9@QS=QO5m9IiI0}pH22-N+{At2aM=aO9RKf` zhXfv>lDH%ZOu-tE4z5j%J1-P49vpwgB;(A)$gpx3l+5t7Pq#|jq&g?Rdh{PE{=L%- z6krH6bfXo(Vi;pu!$q~fZjYJzfN%+eM>>)Q9%Da{EadYR93x39pa4;fIgpPny9q3* z8b^l?$1y03KKAnecNO!P-PL;X1>^Rk11z#N^+P6L0hvc3?sb9&!f#w>Fa9 GP^1K&v)Dckil*&yjeHBv4h!onlNQQ6g*k!J{mkA9(+% zCw{IccW%p|F{nNk-ueC8TQN+d`7X@&jx=v`X}?GR(?I^EouRbf0bU8WmD)cC5pT)X ztC8yKZ>erJ(ov5)$M9`9tOhNXGd&8`NOeuK?2CIcWT}AjhEM;?f7 K zs++1?U&|vZ-l_FtV(W+SU=cDB&i>cp^uXd@$ti?hv<)>n<7Q z|239dzYW0L5?I+` `(eE zvLCAt)A2vWS09S;6z{`nyVoApIg$56Ah6*B;;uRO8d5qC?dw3^{hM_GTk8RAE%Nk9 zUM+K`<-zTB!(k~8vYCEIDQKl!G0PaeQr2{{q=tHOaN@JbZ+Gcs2UDrI=*bBG{ab#p z_78aX$wKehJ<1{Y{lkZ|-}VL9l^w#FCHzn6{Bd5pbilqSKwj!G^0?d(PZ$Ws`fa0x zB(w`RFF2V6zD%;W>~Mt)Y?WO2&)0uEcy! n#QNrP+4pWCMsWiN%eRG_Aa`f}P4s%qB3NAw7Yf4bfe)TJ`FR^UDB(24HAyb3Q zRK4N9YP=LoOo=DA_5#n)*oRE#M1UtgzuVb7Lsf=f_ Y1uKku%c%}{C(kWMuyU}-+-){XYcUO_&-NtyncPr|(#_iwE z07OZy-4x#F=d`ngf3MKi-$KhzJgFfj*GLt}PY$mXn!xT8D|8&Fe4#@e{g%MIHSR-G zPube|`(P=kL`i~Y1+8e|H%DPB;xm4YqrS)Mo5wGu4M?RF)e`#AEcVJxft=V2Y;1(5 zkLdp;4>NLLUm+YQQiCj&?*)KV$he-Y=$Wlrb@uT7Z3cgZGzMxb*ZWn>FN^rx?}|oP z1R+WLl%W#w;I?Hr8DMEj()nPF2lOE@{?|NCiYyKs#dqXbTbb*RvA`?(@Qr;%1Zzls zP7+ N0^0yAxpv&+^Wp?CmMP^3}r2k}A6r!}R zAeg*(-B5SXwAm|LCLYW&etv`Ycw^mNr=h;?!~fiCeeMKqi)v+SJW5co1KU~O9@Efq z%3;}73vSNKZrXfc2tmF@&80o@wfjR`w=e<8RNwi#cw0xOD>-y`7W+Sa_|{#KM8AX8 zfuXIbdBm3 YXpAjkYbzNZ&v<0-#n z$t(_l5>JsnZYW}IEDcMf9PZ)FIKQp-npiNgh{ry4sS!-X8?CTY@*K1R^>_oe 74vpFK^K+O47Mkuh?B9(L`;k1yjSLCsE4_LUqBLFh8eEEcjF7Agi5I z&)FT8=Bq#X3Ov<3o6A@yvK_+QQVM@m9Jc$$0&U71rZ3l30V-rQp#_t4BZiAF6n!x~ z-u7l!dIlH1@L?mKO927D7ai{4AijlvPE`S`HtX7!`I^l03O @k>bL9jfbPT6lS-ia!hHX?bumLC0H2}fW;z`#;vV|6zCO5=7OVwk9- zw+$hnN*tXiTs?*Zg5WI&K30SOG$D}wR!Ryb56ydMqZqdsdMY!se_`hA{Ps2Ed;e6t zV{Q7F$bS3XH}2>5dfNK6-wUa>D=vRMMO2RmK z(j2KvmJY<0197v%wm6H=%r_wfZ8Bjx1a-rlDm!(tosoxGjVQ~EX%F +V0@1!K_gl>l$Wtq^I6%c-e7 zd<%DEHr@Te*}1#2Qc#8OFja3U8kyBJYRS&JoAdxqBrntsf*BrCXLPP>(pC7)$1 zpCflVOtF9g;>EP>%cP@5yBu@~e&B>a4nIz2Qku#Q({wOvF%;QJ9qugs!*^RDvoFL* zb#G!V5lFCm12bUS@_Do28^<9I5w+T@EZl)mScJOEjDeeDK4MOxOzVjmXfoe&aH=+z z1@^LKlApk|f*Z!%BEiWJ1#0K2TG3xJc24UOFuZW 8>ltL~v 5(`(+xe?Itkq9zjf z-$(afN0*l3(S?@sl?kxdP9Ml*3fef@yP!S7`0QHxml6&L-BT-gt8Bg@k535NSqTH6 zHL!OGr6UW6f)Ye3^}5fmi+Go7(Z2g0nGO;&Z=h11h|rBCSmRi}o4WOxo;m}em!Y+< zVXDrJ7NKcHR>6;RqTz?}TJ;?}P?>G7H!;QGgE=fD6ikacmF(sL3f6^ 3immcZ00&WYo7Z7)8@OT4#)>F!?oYf5K0Pi{Yd*X5U zn%CKUoeQCE>3kX6{N50VXJCC@Q~OzdM05O^QJYCWCYeeE!#_}+U;b}*jp)P_xU2f$ z_p>ivKmihN^>)Mn^S=w?A-lUMJdETRSw}JuoHKmpJxl Wn||aBE7`=~TfDluW>!SsE#|_!ZoibzG{Sg=5?DDt*B{rm^l!&^_{$ zjV{eC(K1Jg#JuY$Z@M{GL;Xl@$nY@_mF+23x!`d&r0@mo<-0^CIH&y9YS3YR3c^V8 zYm`f9bGzIo=x7}#qd1v`93eM^I79DN{3zxz;V154dk%tpVi%{Oby*~^{%QTQ9~!hr z!Hi;75jRaLuQixj26ZXb1UhgWz8R}v^zai>zDoPn&RseLY7)tfF)vY$hp(nzNR090 z8<4?@5w?=6W_hx-{|2#N8U0 y2_lIMU?C?n4d1pGk^7$}B z)wco QFMMdvzC zb7{q-%P+Ux6-2&IA9{?_d#Xk*)99b_#OIQv%tH-HuwC7lL`ftp7=HO%ErQ!K`Yv@E z1snib^@)whL}ikSNs&&F8^Y4c)9sm6gqahWYNS~r5Go6Jh7e^tS3Mo6E9L`RMBnN% zxm7?hNmIbG?s)n{ PAs>~uUlbGRtL|uLun(v` z%&4}uk(;Y=Pd;jR>b!qPCKW{e1XcOG`m^XK5(L}Bf?#{v6m~a os9~@JV^W6PPn5IZs6o(;#YJ;=JFC7#Mdgze)?~B7!!lapx$`iG z0oPdMlFL%y HGvGOc$Z)4Fb6M zfJJH~loFc~>r&?mm7~Hh6qY(>W`Ec~7MVv3X~jkUl{+~Bcl;NWo;a^YoMR*;Ea9II z)?8bmd{|gnvk)5;5o4IE-3q9t`XJs*iXbs5+W*5qeDKRR{=y1qKuRhtx&S-${e!Cd z>#};Y2GEn$b?>Rz)(gNQrINtlS2g5Tq7w04=#uHAfx{;VLh! 2Bi!5XaKT@HoL`0 z9%TqQhp}%rR25Jw%*4_^GMh0{N`m(X2Wo4p#x1uRHGDxlODL3O`epBA!1M;auZM36 zPRy4Fk*^rgWb3R97SinCnN}2nW_-~HAHziS#F=JF^)@~O;G)>wK4VKE-*RHAmKi@^ zImsl~rkN+_CCB}$lpT8QU;b>}f4L_>?g3ebCqF3{o&bh|<)=>C8R`0>3Cesx4>Tcf z9O7wB3iR{(`od(0OXEpQ)Rd>`n3nPlEJiE)$tFrX@tr(+WS!pWSv7iCx>Oanm5P1V z>SLng@>e4$-;{7bJEK3rC?wAslHV1X>)N~@n^~g@uW+$8P;fN!l0cG1!k6++Nq8YL z)_ey^K%G?T?NwGoW);EvPk#c+rB@*1FM38#xTUl+SQ#rBPz2kq`H!PknD$-XZ7QCz zMQ-Pt;|4$< I!n&MVc)7-@7`ZkgA3x zbxNBn8g7oT*|z5DY_-wFJ|AcI{50Cc)p*Y0X$d%!C)28zS?bY`<+FI_10F-j@6zBZ zY!Oy;E``(rTcj|H)os6)ZcV!jP>0`!UVa>Wd;1^p;Dgyqpjt8w!=XuRo}60WIXWUj z->_p@dyjDjoYuk6cC+1UiSdlS4Kz=EcKH;NO>0@Uez^&uFZi$&ep2@-N56Nm{ya{5 z!cAZ?*Uql?OK&pJi`0c~0ZY$ G_tBoN=J3rNGksDnb~4g`t3-fE{x%as#R;kQFiOPzQNmGm-EPQ7 z*i<_!$(*~xO-*Ox>!jsMpxm;2=-*E&*yY5>J6Q6G@9>yKJSGs@TcDGg(uNlelxyGF zL|4l=Q0LCA%rQj52HW#BBRfmq3sh+Jgp{ppnL5`BQyZO(d$bKI`}MYMqRxb#qY%u> zZ$dxpcicr9_aW~xW2sD;%>d}=;}Md4KQ`$2 QZX!zx!n*RJlX_@X$Lrs>C-sEWFam`Wv!QQgaZM_z^yPbu~TYVt-x|A*J0`h+S$h zTBDyeR->Ob7CFvdhz&%LooWvsJuTjH;dH^uzD25Phf41CV)D#SgNN5@0xoV%Hfg9e zZr3IICAlZobB)QhHggi$q>`z5^G5U5TW2)OKWQ-kVN -nzJAOH>MeTLf8|jM1 zV5qnt2_zU)T)Z5l<+=_;3b+ZBl0|7`Ox&IYvlS@=B*#G1?LRJWJ(`I{GCLBJ_F1Q^TuYw)mCpnP`Dm`kHj;|~smj*+CRL*(1< zB8pf?6AY3)!C+YxLem8Jj^ BqeoP)|nrrwQW$#M}qrJ9xGGL~WUFGqasg zc-IM&*Ftb5H*u3m;P#Fj*Hba4lk>X@5x?L`Z*7h0SmANw@GH??HOLRhQ#nUh6f;{d zyl^Oi$Ylvz0rZG(t2m;`(CKY|lha!ztLe5z-UOmmvhJ!b1NAiHo|2=ZDCkyNjoBiZ z(AF-P^s;$v2!~_e;6kueXY?ava8ssu)tQ0B)LwwPzHf2b?LdandWJJonR-rMT3VV$ zQ{2k9`Q3Lf3T}@8qRYz^nK$$+dR(~1;Z`sI85Dscqc3q!iA_RIz7^zovXgHyl0W># z57WFiR=RUAI6NGiV!5HZ*gM2&!1t!TgMC;xQ;_G~w*nrcPP^%9dr|4R#@AzDl2qds z#{$}`{lvC-GW*&E+qq_TuC55dSeL0vxY}j&ENd`&201d}8X0e3__~bgY>H)YWUxw3 z?tYet^X9t$SkN(LoeI;qrMXYvA)cwAI0xUMFt#BqyuD<4!^k5^U{>@Q1EF4(LK$By z=jOm$L=m%PJT@^0+hk3#hsD>Oxu)+QHy#!*(+c2a5o(4e-VqaXEXiNwm^@q`ak8L> z3RPqq48T6=v!Iw;HqC0vr;ZfX2jYF*^O$XZ_9r6_mMvt#t2I|gS;NP;7%iN|(S| U^JQp8# Y3`Yk)1QpGkpWa;W-YhjbZH|vw zFMq%ky|+eq_y=wPh{@l~mlh#c{iZ;ZN$7%Jzfu}8sgQ~b+^DCdGo(fX3e6_W*U*Sp zd%q^~aQ--jO8jTvLp>4h3jrX2u$K!8nFevQx5R`Yce~aKCCa3aZECC#0b9 z*DL@RJL(gb{_)H6bBpQE)xIqPo08hRyOIhD^)_S+F=CQw+6}uf)(jP6I>T|f{ey+4 zw6-WQf`c*^N50`7+PMFWZj9tZVb9}NDI9%!(Se7f>MFg1fe9R^zBd;O_^HffV+?{! zG3@$}@<-!ebR5W7*p;leV%9C@te4hllSgq!pBY^5lZJ&yRtmu`uVITVzuK`IPik44 zjYz^C9y}VUIt?GGwOtta)eH+a%W#(oqxBW;&OV(!oE~gD>o132#_rH3#b)x|tQ spkCZq<*Ox0fUhXz2LVeP`F;HuET= z`E?+9eL7PCL1ywIbw~}GpRDbDmu*bN NGost(AM)9O;c^}9xssIlMU_~F3*AdL(`uWj`ilgJD zh! JhZq99IwI4a2XuD1r9#PXUrmweLBWW)QiZ+w%xwX!9_fN3& zdM|I8mY^w$2f5?X`l+C+vwHP99 SBylMT4eo$)^d>#%7qhcT*9yc-bpk`{;uySNH^<& BBOqn?BABdf#pf{%{}vA>d*UmJD;ZJvydz$DMk3wo7#zOFR$ z&hmY-lT17@cZ2|FR0V3g)pR0!9|$YBl$O{ZpQ46^Jc-j@Hh*ed1fh_)%w1~Dw*Aww zU0_ V!X3;CziBK4Uh?7FWE6w~BB-hG^>nk!Zy=x92U zuSCf>*K5+ 7sZjCC)wj+vS8suh6vMPj-P zI2R|oahsX3X>!6>XF-;=PPsfjmjc?A@3{6N un59;y#n%d zb(*RJXUY`#ZzvJWQJQ0ZU6SrUCBb|95*O;yE=jDc=w&>R`mx%;lncVm E+>zb7$FhLuHI8oZd zq*u7;*-2R0+(1Ys6;KZE+$-)|@gUJnm4h8F9%el=a2R54s8X);GX7d)uc2OATj-o` z10bABqcS4Xt1UC}T;+73K0n_f#x6B9ee&EL%6;lu7z9c}RYf6IJAO{y^S$m*Q+-Q< zsl v>qaJIvW^XEjHJ zoS*W>r#r-;Im)wiUe7yS3_J8Gw91X)T56nC9H^VBadrik=Y4amV%pi)R%mieVJ=2! z?8Td`m~;=NQwlR(pDQag*BB6UFr72bwYG+rrR%UZnNVxZrQ~o}=huhKsnsWbJF?T8 zg+L9no9tgZU7<-HinazwsIbB}N$XTC+v(89JTG=-fnfZ?9>&|lYC`VU)D}Bi2^qNf zG|swH%yOgc_C)W2sGKG{P2Oyp)4G?v{nNmE_l9D;k>)o8Sn;t$r67hrIfaP)@YR!% z3dv1Iy9G-jUk`q1>7ZD6&afp#3?J)~K;RwPnD!P=d6z{q)BKUZgPyft*VffDwrteG z&EaKwEpp4tBuy65$wr S?Q zeDhpMJOYtN#m@$)WC%$=BO)T9%qLw=sUbcngB}R%e--^>b_D=}em!v*Prso_*ZLAK zB6~a1h3#X>R^f^I&-D9-3b&wDrV93_$u-9!0nq-BdM*_NQL4TdGYgF396J0k*gnC= zjlH-<$&~1}4VqeyYWtK$Trz1)MC%6^p<}e$#L~JBoms}`^0ac%8V=FyOqx0&pht$_ z+`M*C4}eY_x5_sqUXQ@vc$Bux3E8Ec7?i8?ALO~8EH$}|d>(;;o;rS1C;buRHKp|< zk65vS1*V!&!KI3*{|(T@yw3}xwx?P~IN8Ems+Y-_uHD_cc#AdHVOpd4%av2xEZoog zKZ}@L?RNHj|MB&s)3VjUyJf-R$pnjpi%XTeCMi=@X7cuf8G_QZUcdY{(q7I_Rv0sG z`UH)6C75W<{3g5czL^Tlz}%pcxgyZnj&^pv^D1lSD4l1@^YEXD<;(ap%eh=Biuua$ z#1I`PtFkf_06^$ot6wkUSAJ#%sAjN;RXgi*`*_AwB*F6jIFK-&x3dn!CB7h9E~>N4 zP7&y7=W)SNA4g98kt--|;GD=5vW>~_ug<$Te4bu$67cu=1> >WKZBdP@FCP$ON7s_EGyio(z?n)2M z_}gTFKV>t%Hf8(*`aU##zw-9O$7`|-{H;uZgp~7njYDA)x9_U?xHKCkyOv#ik8!qD z&)S`F@^Ul-r;S`+t^Y`Ih1&teawn2(r`)ywq1IT+ZAgo3c26_dLP~hc8ahOXUm4?4 zz9Hj-oF2i!Z?#aFX f0~IEy|N(qtdR);$X|Xz-K!+3qc#RtGYlaN_9Cuv?h S=LS;j$%7CBph?WemRtJFmxI)qnBCJ5#(!^2$Fd_#8ft71kgK zt#!uNRf~0#?6*r3?3#` zBa 1yMkboiCJmZznd3a)2!uX2KV-ytZlU2VC$BUD2iH!O zcysOYz1xw|*1h mn_4BcE zA8D*JLA7Qy`gR|xUY4*sI&RqaY?)}Co7UJbnh*CH)#DCr{PgLG(d#5tDlrHc%D$YC z>Sz$valxQMm0RuEyU%5{4g!Vc9R^}G1ldbp3r-~mtxC5xD;jH=he(=)@r>8b8t^}V zzNY5JI5${*g~PS!)2QKVq96KTkH~#7Wvmt4%{!fW*d=9==5u|JIYXpd@ix3C8JZ?w z*j(ltan8rV4?^q~mtU(WxUT*1S?8|GDhY>1L34a3>m`%hCe36T-mgHY7EAH+nG#>V z!ztIr;U_{cjnw9ObDe~o R?g>uCH#MgBo2{6J^wUj{^h-X8 6Gustk>bF)40N$~#8OdSUuLqjX95|RYQ z h%VRbR10Xw4v;J4ncQQFiAq#_ z=gMwBV2%Xcw(ODx`ju(6_M=`Mm-SSt?6z}HQHUb;0(3ob(6ZGGjP$(X=YHJ4xY7)N z!`B^q2eo58(2T28QkS*q>!N)b+l^5s=6rwu0R`AF>&q4zd$6 IUvtoyxul?|_t^!zRB*cNx=l1tKov-K|c}f~kb>*-SOZK+5&yWpCq7T^bfDMGvmb za_0PFR?2Us{~s}kH*@9LfYC%A-c6l}CgRrz+@hSElGjF2sRcdAvpFGK*(72f$tcgo z06$L9Vp2k?eI)yPUrFT-c7tg<`_+s1O!tn@k6BT_0a85u&%U~NJ7>D|1#N~tp}J*f zAst$+BxlnDN~hInAw&sl0Vp{5dy$gucrfJXb}7Wk2s5~D?Q(!dO@xiZxxK`dap;6v z(r`SxW_LKdrj)Ly M7lDZLZ5oSV^Nj~)xE7${T7sMF)XdkHt%^Y%JII!KQU(e*!hEZXl2xhk_|6%(39 zX4xCd3~AxS3Rt~}B-bO=O5^nyUA2qiC-k;czEgj=$1l+4=ut%yXp~pRQ zkZCa7&D2JmR#3uY9)+A1jN{<&F7Q$=ofY@l3SllktR|x1cX=dwfZ|5*-0a?5iSM5* zWQQT0Ln0gKx;z&nCqlc_cWZ2vwtjS)e6H`&7d;c??YY{jGW;E2e6L3`omN>`;fGzF z4-V1c9EgoRkdTaSQ%<;TIXf#3CExqPvh7)VA9kB~{Y$~rK z($pe`R>iGK-ZyzD(lEb#}M+iHX4vI;)Tzh#()K1NwXg z#RKWWltT6vfza6?{T7d+KF&Us(YVC}rQ}Lms=0}WRlqPn(KF$AU a}% A6>Wt0iT*pNX09l)qNl6>%i}gZE*1-__2c?K5ubCQovpm+RnQ-Na*{k?oN&c zJuFkn-l$Y$VhmKO4S+WD7+dtw^tBABkCAS5g4NIDs?j8dkgMh% 0Oa*|ZMQnVr z{`PoX66hvP64eT-^8@JKC&pDH39K8hq9U>v;N^Jv^ Nr3ZSz>eD7P9+g^T*^lfJLb+Ty7yc|rOZ}Et&oO?zqHeO|hyS|`4?Q}Y8H$D`+ zCi$D}0|uSG097SxvpGAO6>dc=tP;4rNzb-jpx38z-(kx-p-jV6$P~-g_hb99&yxn@ zIT7K|Vf3*&(A7|=ZwzCnU1Mu9wWn-9afU1O6NKy9n#{Fhisc;W=)+lp?+v#kUBxGO z`4K!DA33Am1w}zw2ZUPIA3qcq_@r#@@sXYOEKSWAN7VxjZM1hGNuM7Min4W!i?TJB z?isJknbG7gl9JJ#ProlNgtppBN=Ua4f2m&fW-Gz^g`nwJlL>rQ3`E|mnfEExWbO(% zEg*HL{Q1qYb+50x@V?G?RMbUu_BT86K7}@=z_ayuJjbZpe2;RhLBeu|7yIlQy79%u zO*NNY_AV%+0#=+>9N?gtlfS-kS - ^@pt9Th+S9-X(}9YwCxc5}6x zXWYC@hmqhuHEkB7+2mrqTw6s}Y@0cM2=F7I9(}i;SRH0RB-{@B`3*q+PxU1nMpvKH z`K7o84d7_i_CYeRg?u4pm^Z50?gLZaxvhGYZrMD?5|?9e cXV_dBYuG1N3Jk__mSPNNYIb}`E48`mLnF~ zvfMBk)5tGP<%;b=*;Jkia{r?z5Jvkh?2E<6!G%Jz3sT*O(5Kc^h>il 11Ze_DDLi~PaGMMdsy{eOp0{uMo+){VPYVJeqp6!fh68_&eTtu8(s9_ zif@$(4fr#fv_O~Oiai&U{D?%Wcl=B)-_^Q}pWbd7x}Qyo-JFy2Z2e$R7J;^>(2rGx z((fL`M)X~}ok_Zss)psVF2kLE{qO;cC|6m}km&hn8^XS&b^*M57y3b&@$j55fFC2- zRifGeR!6UO+Jn-YkH9q4ZA$_S#iMKB+G`cq8Lgd`0K=Iyl3gR++`shslX<-5s?DfL z-2K=`@Ovr>=vyGzec$;OgEYa4zyJ|I#pLwO7HjB@e_p1sqS26BmS2XwAi%D5GHDc0 z5lq2t3bS93_fB#xwV7(SG!EC4J&+PPpnb!Lr7#YAx#Y9ju S;GvXW|Bm;?;| zlH5=R`{K 2S2UAj+IVyhufsEh7Kmg1$Hy6{k zhe#ec%6fp@@dLNFOB^#E&YWO$1#@I?Exkp2ju&A4^{G?kNEre|x(8+@OW*o~oI@Wc z=UPfibW-Svn9Kp_P= F)s(C1eEZQXfg2c!_; zFL>E}nyilv^I7Sd#0< ^1Ag3u~i>BXbdrK~c1G41%T=R^x}gnQAUk9wIEv#TGxC zIV}1*pQ zzL9*28ZR?)Or z8U2hNOq&{R5WoJ3+X*^g8hL0)65df=rk%=f{b{)3(>K+p>39oQi?lay5^`BbzI*F< zUySRN<~0J`CO2yjkS|5(=jZhiLi=jTMocm!q(alQ{aiG43*X;@ek_J?7G OG82d856dh`N_C2=VR4WAL#okcwWOyZBUkB5E zivwEl2dt47ONqncX127R!Id0B^uH=6V8QmH6h{&o`Va~2f`SG|Zw=?Se(`wE_G--r zGxi;VsWjbfkT4}gHS4}w#;SLz8w<~&|I%Atr*C-jx4NHw7T)XL)bEj67+!WgMlpet zMJgUq@Vp_my*#yV6fnA-BJ7HDbh`HZe5-2k1wUIGwdIUbl-UcE5h=%WRk9v4d|2&V z$$e52p{g1>lmk6&XIHc_=bIvjs7gAN(RalD-RK*`+%0ie>?*C(=>k^{F!kvH0=zI> zx4_Qe@=I+zTCXDhXwf^vG2UKm{f29MvNgeFd%pk!Q!K{1NDwFdea-qFx#Qix8g{(D ziTyX(e#z@?r$(`tO& (8@_R77?CFOMOyFe>&CifQsh4pK{F1 @rq ucehOvEH)8%1E$;PnfXRJu_SQWk-(PH v!Vqh-4( ziVPn-rTJ^-zwpIVJiFl2F9{+wQBeE|S~l4g1)m)ybxHCEJxu$Zj1Q-eQ?|s2OD4@G z5TEC$*Yw|i$R;G5*j-uQbI_Khs*<|qSB@ABRZz>hl22Q$+-1ld=~6wG*Pg`yU$&>s zAWm6P1ZR4Wsj`F$P^&JdFQ>Rz+%!px_hNHTCWK8}qtEXkG&I+lk8i)If{o+%-qaCV7@;=3RN5>M{4)quJSPbTKm>*pN!y@{w zy f3o)T_ZFYEDj^Dhe8FPrL!AZ#=;TM&4^%Gue_JUG^vq{)=cfK!b$ zle%g}c~?bjL_FIrl5=x90h{Ln 9JHVMzJXegYh0~IWr`ZY*ksPqXH 5CV1^8!HfzWnn7!u6hV_r(7({t7!crv%9nyF*mv98XLConC}kNq=d zoDCFzGG*q>{;n9}ZN+PgpIFzvZ3U2CL3>cIiB@mnjx6W4%CWkrhgF?T7_xPy*j1-0 z=)P;!odYeq7Uc{9Q{JeTK8`b*1G2~G3;2G~F}a!F>ay3R#f&!lE~m&AbJKFA^->)+ zi>^k=fJrHnS4l@n_pA2Xr-wbuuRmpY WA2uc{ausfM?P&KMRGAINjx_FfiF&+vlRF z>N~I5DALkwx`ysg;!3ya>6*Npm{sk|{A(7#uSN(!{OLl@Ik84FpnLlsbA7c3*V&Ty zoSbVQ`2skGu+^J2LgT>F)#wDZq%QIMXZK3)zmG d>a zw1w#T&|kUFe ^+)mY* aBx*s%*yQd;O79Je72?-2H*XHKBvsq;$c;Ld7P@ zYL)2`bA#TrkXc@Vg1yhhOd{AGxPy}Ne3X=sL2ez!3e8g}=r`~p@vYsNtoUf?MWgxM zbQ`w75a#7(RcuR5Y}#_RLfN@!%^`AiIHJ~qA~Dr#penPBtMo<-*S)kp|0zhzUO{hu%n*DOuF(Ij*%K~TeazilfqvP!s^q*lOXc_L|)$IGUZo9WNvbe zWH1-R5Ejc$AXW$$BP)L)xh%wpRXaL^_cQ|PhzJUFrGV=93!HYt=79=t-4A4% z)~lWUIFSvs2GiFaW`~)v7(hcWhLY#{d*97F)s?RoJ4B{?xUWs-+}0&(4|yM6ogc?6 z)>=(Kz$zxxnQrI@MiZ +h6-H=mbe{ns~FY(jm^_-GzzB zxXs!laHF#gqHO0`IY3QQ##%wlKUf=%hdwUdfN{UiG9JfpLA^9#>d;0MmgF_rudZKa zCs+G=ivtu?#wE--i+W)+aC^Zi3;2ttuF}Of6?H&uJPWNFXWL?aP~}DHlw0$grygq= zV6*aZoo?^}Ag4;j^e&K|LO`;m-HZ0xEp8#r@jus}A14|$QxiTFHmwj~5oLoWhzpyZ z$wfi0m=qV2YI -RU9<;NX zigWOXi_r@D`&=&47H=TYMMs-n)UEf7@rml f;#8je`f^nqWKoTzOL>Yia%Io;FpqxlGh?c~WGPSf?vv@4{MNc0HJ;x-sZb+w z`C1BmAp 7BwyZFFO z?LFD^j?>rqA<5mxzR4M0`@-yjc_X`m8o}A3KCe}LZyu~m?4>4V OaK 3e`^uC-+M8eZDEQtpQj0nyO$s7oS|zExdj7l>@WbBh3jj;m ^*8;=EUmoA;t$=ayG?W=7DgiNUc zN}`0#WDRft3P-A{eMhymFF~zKZOznYY>Pt~E+M}j@4Ds~UoWozSTQ^*gO&jh$$(J` zs`t&d|IKuheF@R=doqwGUqtSQQuVddRxBb14{mrtcTu+llEhd4kM6Y2YLat*6sOgc zCM~kPWa!{xd&QfBH)h522o8Xw7ZW9Uon+t?EQKD{NKUJnpupjmLC*dq7(9*-gM|!X z6Y+jayzXyX7_IP>GDSl2RnVMClU(7F4Myu7>v6#&@u8Ut=o0RN_u+#P=W?DU16)9x zlj^k{s$KNUq7Uwe<3(X0k^p!5^&c^IL65tYMSQIlRAH4-?eZI2$?6ERS^)Y0-5NGg z>=mwLQ+#$Ip)K1o9TAZe#6$KZ^X5{=Cu6%X zj-cHCtI6qkS C!9aIbhG4Z$KXvrc=L zy9b5_X=P}H0fvz7h9QP{H=g6U>b>{;-gEE2_YXeQ?7g37J*(GutsT2;+%3V6jB}_q zXC0$3!<_ydd|Ek4ODZ#XMKI`S*Tk*f4tp{DX)CXx#?Fp@*bDubW4IfPKXp`gIjdSU z?IG7a4#2v;+Q%-l_Ze?zg=bA-i28pEe)C4D>6(ORSs1)Yp;hc9@in6XL8O(q=Nv;} z+1+bn=CHM|ci9NIgN@}QoAjpuklZ_GVVPvlJ<3X-^>$*koalLTKX4UCl3*~Fe{9PV zrCny{GXhA=qbsG#4-cq>#WISkUnB{NO9 M@vrW+^&B`0;F}Vf}R$ M!H4FMWavV zi!dW=3~` wm;QwmPL#nyXE4OK3?yelnxM`{y^pgMZ`j9cU|2-}}vpKa8 z1)yk~=;ujRId98+Eq1Dtv@j^uuej>Kg)D&(=&clZWm8Oj=DxKCt+aS^Uo)5{TmHky zO^WNe{Nxt{dU{mM2MP???7NrCD0L6B*ie~3T<=ijygc;qkuA9ktKY*Kt01z)N|$A| zrYjaAP7C+-^!R~12WL-_f7R3tSh=XnN=|?+NUUx>JDZ~sb)o2!^_Ps!*PCP}lu(z| z4RnbzdmHHlKjgi<_2aNS8Y?dYcKVoxkS9C_ba;;p;r;Ugu;Qb&my%(#?nmn_C<3bO zT9wGY5-W;^J5_2~8)==&-*QHoJ@WfTH}-I=1=PDQW0ZB>f@kRCIix0G3gSD%j#&rg z!5k{=T>f*t8OL^QRjc&-q+aKNDxsrU0;?amT{$fLgX?pZWEaqNcBW6)Lmz-21}{Az zE8bRr6sTHBHX_D r;ymx)gbQ3BgnHsbcr=V}@0b}_dWmFSjx+5oA(7uSpHcBs{bkv(8h0w6Xo zjm9}qZxb|}q{Dn#B2H}YgiLK{M%`n7fXri{&L?2kC!G4uO78pf=}hR x*aDYZ&oie_!Aup6&ZTS0Lj%R1EbAOpv!srmw2Ug9uwgC2LigTwqI zo~Ut&X0$^*XQp?`2+4&;K=K;f*IEo20obs}BYSdg6>8=(=}4!WYj4%a(VzRZ9IO4b zf^}=}do=dLc@~#TN8h!6ExPYHt#NLGsv<0Lmr)cg^Fea;;!Ig={|hhxQfIGt8UuH` ziejeXP2kKH_MY*!XDXO`SxZgx!u-nzPryc?HlB`$@*j=|m$iqsz%|T(%o3TY$uf`3 zS2ZUDW4Qk6SCx#Q73)&sRP<0UF8^39?*0|U8Y`h7#v2?BcRnl @vDEAx)&|3UthQ@0BZK$xJOa zzw&`^H{D>>FtKU^a|{=SMP#-1UqF;~$aZMA7CrBX@0)JFaodDuNwP+gm=`P0j|D2~ zVz(q5O;L{GW5w4FSteYo`m4(_ansx|*7H&ueVN`7|#lf&AbE{m2d5(W32Q!Bv0H znbeCrOM^_W3&W ;}QlL?*1pBmy#3#nSpj}G!JR&NYCD4zq@Ves@7gjws zC3X%zQr{_4o%g*3fqjQ52sZnNIs<3+JYA(U`-Dxr-+i>gWIGHmG84W4cOPxIaj~yg z Xx *@dops*Vah=g!2zN)fvC|C8nix8Y#$kO}aqO`{} z_j=PkW!>ENG&b2d*wQ|J#B=!6-q&IRn2%<=wz<%$+1dt6J> )AncV_W48K zqwg)sC#hkoFfJ{Qr NOc=a3 b=j%~o7VjQCXawO{Wk5*yxTyD12Aj=G zVp_HM%BS=9I9~O5*Qvg{qP|{M#pts@EoVYiW1-ytdS_YKl(pAt2lXiM!QxVrTXU0a z_Cgk!sXYy3k C{rXkB!-T71^IKrcT>vh`B*S^+a45<#u0$2B|Es{nk!zG5|Z z*Ph$vs95O9l1kI@gUhpSiy1(_e&_M6%NF_`%j(kO6fKkV>q}`(#|n=scjoBt9;`Bu zm)VRV{oovWEQgf+*u{=mZ-;9-@LbrMdG7>&&B>G eMU9zVircQB#vNokRez7JeU$ z(=1J^TDq@W4Gns|q4O!U9OyDzX4z^q%HA7RtmP~>fkKAvlA6U1i#Ay5m>jhp;;y|e zt{LSGj72=QZ`1CIfOjt6MR`gjSw#d7<*1sv7jd)!V6^Bn2jt)&n83l+_MHWGKOhWY zxqU~8LUTIONqIR^T^THY(KLu*H4`tTz!oi{>)tI?Wj)?6k22rBKtEJ!#y?W#4JH#3 z5J&}ZB@>sT#0<|3YIk(OT1=yOZ0^WYipEr>$={rQ_bRC>Ri8VL0zjfUE%s-%lG+bf zlWnd{y0+hqw$DF%qNz>+;}@Lp8xat1Q}!2{6X0wI)NCWj+a>Vwu3Mp2+S|pC_YzM+ zaR33-0|Xsrq@B5Y @dU3l}irL`SeT{)$&?w( *x|~Ps>atwyyc5nm`#tAKqQR z@r)bWztF^HcDd7B6zJV-D6VQu5cCGBgWCb+)_J~yH5!rOF=0|3J4^3q3blwjpYuC^ zD$>{qqDC)nOfh{5TL;QE?`wANrEY07&x)A)L92#8^uGpuz{lkscikIHT%|FQI`}wE zEx4@We N9Qd484HV=#* z%q?@;UI@>+ Y5R#Bhsoiam|A>dnuLHWmkKl$xQAYI) ;$4jV-znOp^W;n*Vv-ZSWpcA81?;?R4~} za6vNZ@fBue1!U2GQBq!^4G@vcmFTc?@b0HUgiYIfYm&eon=lP#Ih=$=Vqc|M6)#I} zu2`tk