F$)X&`&SFG%%XaRv_>r5`&Fq^T^{C#?VkB;P
zIXZ^9b%W&CS&V(BNmdo3Be#I}N1cSuC_p{fYdQ}y-O@ZTTSq5MR5x+2m}$uGC!6ej
z%;4`7&fxph`jjm1i>nb|q?@tqJaR|rsQpp3^4Y-As_dX$1{x0^|3v!n$bP23A2!Bj
z>U(POvtP_lAfMy3`o)EZ5ZXPrj6Cid(M0!erq@vAQJx{*!avI+YPrAVmIz&a=!K3i
zrEb^0N_-*rN6I+Ne;Yrc_pt$Qkat*TCL0fVImhjo*kK{KA$38iA&V3Uc;&E
zjn$%g+yVr`57yCPOeIquBX;?4eedr!hFi^Ouv*@5`5LC>*Dc;lS6{P#MMIZe&P?wk
zaifWB{b*f~$v|-8)OY%*p=apG?`qgdv(-s6=yY2w8}=D^YLYeTuhc2^ok8uktk=v>
zm#_GBI=hJf=pOl_1~Xn8(M=D!e*`G-Nf%n3u~-#VI7DAsKmXl1gzbs~h2^_w?eS(c
z_T03eYMakjKT8I>1Uxp$MQjakJx+5YC3g9Z_2oA_en}rL*N3hHy?SA~4!mRgi{8=B
z`&^2B^yxnAwY;`CvKMIu2;G|0bI&8JeHtyV_;6@yn#{k$JBf32j*nGoG9-iQx*s=I
z3m%Eb=ju1y0Ew#pR9O)H2mHRBh^%wA>oT6A^SxMgHe<{@
z??bE3!+Q`d!KeBN{+vo`-{YGIZ?sciqj^0^6H{5NN6s__BPuw1^sf$fNJ#IuCCh_>8N9HojyMeiaPG2z6oAjE&a2{WH9~CwxRo?^L+yTew`zG
zP4S}G9oKs`S#x60s5|?zqhFmUN`5wYc+aNR5_rtqt%@@4Qrj*tQwv!7A*GTkbrn?3phK5y@P=s@aTYPCN3
z`^4Z`>Br`OS(H;PROWNYBD?JN=XfhMumsM~j&t8TzsoOoQOB@VS(8h1+N_T+Dl5D5
z%g`C$)+(leue3nKZOi1JbFIKlr+;tgk}h-1sIxU_^tg*#cMPj;iO=0TP5Z-!^`uiC
zE|>SMAFrxHa=FaPQwn>%>OLRdAjk
z%0F96WJdN)ZDx3MO1uXDy0(_7I#Lmsns%(uGhSG
z%qR5c<<=AV{tWwJ`SXr{-%m-fQrjLC+O*rB>XIzuy{x+(a^#M|klt&6q}q93o7Q0e
zH0>pCNRjmD)abRZ(>=Jn3fL`fxBP}Zxcq%QIAswcE;c5gP_KuKRhK#RG;{7xsg}xr
zi=2bw2wL9xZ=aX`spTAU3K4}ztaa{QIi>7}3a3;e+&`B9vH_i^N*xkUA>qfwvf~YG
zHpWe(r#r8gnEcM`m-2uJiCb3mQmuJ*Sk8e*L_AmG43_gku#zqcif$}hqjA8
z&XlNa{{B>*k0YbE?==5T^QWh``ZfPm^4C`vA#eNaxoj-`sqr3q
zWJM!SnvR{@Bs(8{)jm4D>AQV*%^xRoxLzLi!1K4f3!@-Z
zMHW5Vi0hCS^3%OKLHqN0M45=VcMLwT)lr9`KECAV`QuqGGCtH2{>uFPv=i{J?fHG{
zE`_D|!Lt1i_wKgdVulzG49ZJqH2Fyy#kq!iAk%l~r9j=)Q=6H0RFk52jJqqt+{Wt0QNjPIWT&^`|s(
zY8gB#%NCtoZ+S(XS3K$V%x-x8$E-wuhoAf4`hM@1W{q@?*7@&W8LYZ%Yb=i1W3boI
zX&=_0B>Esa-q<}T&MWUq`lN;sdid7P48;zKl2SkAaYLtHpFa)G=<&=M(GNyfoEN22
zq9_Lb#_sMr^Ox_V-itg*?OWnhE-zLUlY(1Ud(zKWO4Oi?p^T{$O!Lm<|Kp^t%g~|o
z9A)f7do67#?O2QcKh2b$pjh8jAy@$ZFP~XF(*b
z;r$oq^C440VyfoAC6gfPU+Ikoa-t5OYo2LpyKE*1veqq@
zuyNB_{9E*5Jsbgemt~GY@lx_z9W-;$^5#3bM1>ejeQ)9F)xtcz)
zldR}0{HYZ>BklQoxMn${q1U9p*<1wDq_V^{YTC0H*>s}d@@Ab={iX3fClJ=La^wY(96SlHmu>Iy@AiIM
z^=j*D-rple=xbp8SH&it9y5@oP+GO%Mpo6XQ-p947;)cr8B0<&eOQtnm4?E*Y)M7R
zu`y7+9~(@fQt8f`J##Lu_*h&sOt_Bh>oHRKqpDPsleIAK{@Bv=sL^>CkycfXU^
zy9o9oHv-6N(d}Bx*rQZ7_)T9C#~zlz`FpwarIQaCwlTIPcB#)Fk?OiVx$3?FxlfU1
z6dzyY#{Kq&%Y7$Hw+!CNp`9FBL=MTXuY1vME0#Bscr};XQOn4$_MIWeX5o&j>T16`
zU5-67AN!-_y1hzlyey-NF>Y(wS(iVV=1_#7oq@|^U1dCsx4I?UuI4AsZ%_s4XXvP-
z;QR-bPo+OFPfc6CYvZbZ(lbcqo<1;}fzNWtiRfJo?WGz8N!DH6hGRqj!{bBRrj*6R
zJzeKS9qlq&hq`XgNzzxAv#F&f8MdFx5pvD*(R3KqAhnec=lIEZl{&@u_UF0%#@!*G
zM%mlaHV*k|Ylb1qy9Uwfs*_Xie_i#-+ZPuJskTi$pQgrUZy4`9Gip6G3QoCbep+Iw5VBVs)!`jW0EJeICH!Tjma
zq|RU6(n*|79Wb7bV{Vx~>r=TQq))z@z*}7d=1<4k!zw|-fPq@CdD(K8Uj}WaLgBE3
zH|iA$`O^Ni(RGo;>4j>Lt#{S+S$@-Nok8Xg>B`xwqZ3_N$i>sM
z!%uSWEPU6~;*wQW226?P0vY=}%KNEuP4@z}@3yHUk
zws@3{y@j?HVZ(Kl)T6MtSlMPH3%bSd$7QrpTuBXSf_&MSx4
zU!8LqD!pr2?a!f8N$8`?edcGnb?!X3i|dbz>m!YZDvlhd$lPxEdB>zOeU^{y-;mLa
z-zPyeH}-A3)g?n6&Q(fKJX@qXEB%*6xj5l8Z*}9c@^g10pV*gZpj`{K9VhayiX6^s
zl*&_-?YzhQa+`fF{VyW9sebcwmAULm^B^Hx{Mj<|vFqjP9vc6H^)$L4_*?eWc8s)`
zF6ladI~@0Sy%ZXz>%{iH(G@u;Y;{#p(!-sCP@H^QDBjt6Mw)SB(GWh2Mu&|Yqr@(A%!cqO^Ma?%m~NM}7`)5eZVB{Bt=sEJqyjRmzbm)gr*NNGFM%B#|85o@#=i
z-(6G<>YP$7>wHWW2rF#ydf6DE&vQCV#?JlWVNWT4H#`Wcf`)CMbXBPZl-JG1DyVD^
zJd_y{yoAeLIh(FDI%lMxcCA13vtwabJsZ7}=kca;S`P`w`Jw~US1*f5wr;0$uHCoW
z0(TX(#Kt#Kt?u#o@pVYsW)rnzY{-T8Rw)~KZTAc7mT3CCJe^ujJ8lg;NyY~o$eymM
z?0Ad&;$AiNu0PxR^sk6&sDPlWo0>mCb*;Mb>E_0{B5HnTC(*Ld743)`-*-jR?pQ5j
z^nnX3QTz4O-r|l>|JiTWteduqrbV^$>}OQi1ah3GH3#Alg8D97B5S$NY!Jo
zFTPi=Oj5JM^!Yn$K2K{$+L64e-nLWDUE4V-$Ne0GQ@$c1Y1FT#$I@7^c6m517~JYG
zq&h79>`uc6k@*k=^Hq`uU43b|rWR~`7PU_z(s`1x;o+c3r`%=aqcFk^l+Gn#Gi$CP
zS?ME$q(o}GY2&k>&&Gpo#rJo)g2Z2M4d2ay;FK%kDSB9H@j;X71xPUa#@&;
zP?wDP6HaYcLr%8kUM+7vRTdH@U_9rlKFW}s#FCsk+fCd1Hx0jWC%EMPdS*_eeCwI<
zW+OLb9lTo;e*fA?UfC&UYnl_O$_?b)2l90EoR7~l*WEf7?j6>sF4KKa(Wfa5hlkkx
zgvPjxy7r$JdPg~`v3a!*7do^rK2_p&e~&wnmB}2AQ2E<_4@@ef{bqE|>p3jm^Avf<
zF8M*yoBfKyRsS7Z&;D
z@eLO+TIkn6)%=tTke8aJEn3w^ljaa
zNuP!H(N?83gLK=~4j>cb4>*aMNtfs3`&@S@QV}PCmWf;(HSra8P!U>}*GOX^>5K3B
zyY7DrzO*kwK)>3W$T=brzVcgpznHurQUF)r6PDbN+b`d@o|i3^>b5i<0YpSEqs8m8*n@jET;v-~YU&M9p!tIJM*zMUPs
zJh4{MEmf6Hou|f2Pt30W-lQEC6VaM^rP%SgEsDku{j-Q9!yl17t1%q*w*1-_zt3@6
z`hNG%aXsw!5n&(e*KMnGOm{70WZm;~iJCs=SmXwhph+~~cH}jHWSSr7E88Yt&}ma~
zt*hb>u16oqQiL9MmUCFm`~*(Ia(-?)fNU9-^GEyXJF|?)Ct!cM_EFTxe?!*4XlydP
z`D^Ca`v`rJ$nr*A;)8!J=A$#6#v0Z|9-Ay-CIY81+PVno{e$V*4<;ktn`XUkf9NIr
z)PDQ2wfZmZbFzomFGd7Me$O#cx9hXUH0L_8RASX}npTryo0rd}m`gL`==${JC-l>2
ziI+D*V}X~ubb5i)&^^9y_2-=inf>y|#HPx?a?fgeD{T?-Z$8bev($>uE_!aeU-IBX
zDx!_Q=aRYYzQiMCbSI{xwEyUcl}>*Qn$6=
zS@kh;{(57J{=xqLr^z!Uq<1LC?^Yde#DSdqm(hq1&u6Bp{{7w`OxF6oj<>oW?)}BG
z6jbd$G>&16#q?dS;oQ#t&SZdUnW#lU>p7ObILFeQH3VbrZP#sGyA!%jdhKSmi_{Hh
z7kTc5X*42xXvJqHX`Y_{M7ONB&CltHM4r;AUNjxQ@sw&9)xYyiqcfudKyQFMw58Ad
z>kB`nPe1Zq8v8~YelRORDIbpI;kevX;;UF{vWGd=^IbfYEwGa=U-ma
z?prr#tz{mK`?}F6|1chTX;wk1ad(<_TQzM;1M_NJr_;ssZoIYAzB}#9$uBhb)yP)4
zzCqLMw69}hG412L
zYT9=T`nEj3)2=)1y3?-Ls`ugS@7=OU1d*6C)6{6|JW>MXkl(l*{WH+7-M;N}i??{}
z_@DMOnZpkkkv4h(DT6U@)cE$rtc&Q>vf84q8}AzY@Ao)`^`lvjXM6v9?;mC}+_u=V
zqRgB0MZ57^#(lfiot-{gX9jVn&vp^TvHDCN&)-c}V?7g5^h%1z=gwCf^LLX+
z51V;7i>r!_wiX+%Wca&DAi+z|1RrNeD*0OL@A@jShptL)Ti)(m)r{bUdfZjiDf`|8
z9jc1Q;|sn!%hzY6Gtd|Z|@L&SlT&H2yMSGrg
zU5_OE*(Bl|lJIAfh*Kq@uQ(sUIc_HpiG6MhO|DuhLXXQ!MW}I_R18|&$wp49{NC&(
zYCbucv3WZDWli=WXNcyIioYx&70Y*b@^IaBs7whO=;-UJ#T&
znJ$W|bj8a1{3YSbGu#>@Vm9f>SIY`rwhyZ?RqjoHoH)fMy`DeWU+U#K>0Cx0!@G`d
z56jW?fzd8quG-m)8%>PzS@SQPG(_hEniOn_#JvVu-GtP5xQHq&17toV5<=^SNM5Ha<8*$Z##hpq#PNhmXf00u`
z`6@S`nZ9jUr-$>^J4x&DYIbNBy?1QXveA8V^k4(OUD7U|1c$pg#JG&cx~znJcd!cL6Q`fFUrg5%+$)J!mi89TJ>unfCD;46CU8tX
zLW$q?MkZ=F*2%guQXNlAk&8CP(jQy>dlXgwO>>SY
zx&>nc)z%a{xt*($)qo_>x|D^YmL<*dgl~R1ZkzFl#4bKFbXtI%4;i}H;r^Uu`h0iB
z@;DilJwO_E_3pXVaf*Nj~FVN_E=ggrDC@>AA@=MUIpG35|6uVJ_W+vT^>U;!p-OS286h5oudLIq={Mh&~(K|(?YN8eq+
zI`yl2x4lQ@54IxpXm*|5x1vJFW3KN1f%#Z~~dWyFWCXAO6!&yt(V`Zg0vX
z&&MW5&TQ6n-eDPnp5a#C+Pq|{SQu}z5v^id%-^%
z-jEvZ{SL{e_ItyU2}>=X3t0Lr;YVg!g%w=R8I~_L6Y}nvJ?{~s&051?Ss!bg`^ms5m`(kM@j4S6
zr1OWqY=0Ac1?|tLDa)C-p=|ZqvZT^&(wh&BmhnmbR)M+(l}?8jZkXhFX4xB;fY3vE
z&rGV_RaHQ}Hoa2(t=Hz)aR(87?x8g9eRBxtqXI-|D0vjvQ=zr=+0@&<9Db-zwp>XQ
z%!oK;w7#0N*v+dv);wzsm5c9wC3~O{1}1+4JsMmL6!E=k7LGgv+mrFPh^7%}tEo
z@0?TAfi5wwxu=@@pA7qFBgLW;Ml|l4uB?M8DSwL8y6iT(N7dk9;%TB`-RRh+IH&M4
zv&X0s!|r}Is{X7TE43EZY2TN7-Y3;038_PJIzpyy7gqq$B6dCdC7NX~WnJ?=o|8U@
zGy9@NwMb7cW{;Z?jf%
zIk8h^<_WJdl~`0AQQ_~|C2G#NWBEm+uc(P8yGnE$xkn7??(yJw7pn$WNZ60
zVC`&8o9b7swaFZjXM1COqPa@n#HoMZZedXr@hWNXRIBVXtz(1#kxFg>FRu~r7>ASp
zfSU5i#iIJKU0qztlbs&i9zEFJ8$LnTNZR!2JyGAfwVu;F^uP1^+WGxuyuO{zbMO1u
zEYYZ#f8N-ooVLiVM)62)uX$W+`t5!$<)QGM&U0+&e{j<0U1GH(z0y91Q4_Vio;*y(
zZ);1@127Pe!ETF_8;a`W@0Zf|%MnsHU13f3dQX6I?7Z7xt*1tJt~%e4;Us)D*04To$rJ73bWZKI*jVuU{(A2%H8jV6*-FAV;CTsh`o9sfL&*kseXWkC0
z!1HRHZc?2z71Z$V^Twh%yQsJ3^apl#UDqSy^D*cU;A5zJ5YpZ6xW!X`*_>4xlWB|E
z@Y-IaJW{WVtM9bZz@~63#Qn&P)GjECu`!
zb|QURUevGcMr-X9Z+vL1JK^Y2#{X0eI`0Zs{gUpoVj{J_F1O8*Tjgb4X}eZ+YJJj>
z{B>$6>FcPl>b%Od?scOlyuQCSBi~EA?rfs*RsMCo!TmmT7vM}MvH-7abupIXi@EAM
zKWtUy@s@zSZkKF_l{FN539QtpJ+*JBE$WWK3}Iu~;_-+~j8wONhHam8grFyE=J~Rx
zb&B3aYUYj9M2zBc>&U4(Z#;MIv{APKX;x
zgHtox(vzjzC-ajO;iHUMTRz@uy!hC!A$?c(=ZDuZtm)jhkFn~SZj7Iwj^Q-E9!*EI
z6rBy15Cy|}^Dd4z>>K*alSANKH%~~GFLFjCr-z--pZff<@7=N@$KP0fy3GFn<;05f
z#^ujHtSc69eBsLtN%6&_0x@=%Mjwt4q+{%&1w>@XBi=GkpKg$41_kYr*0|NJvE@1g
z)W;lS;ngT?`5pmvcyx}nb~1V!?7pE`LgY$_0e>)!j~!Tc3aG7o@ooXNQHDDP)ZW6%
z;w(-Z>vZnwQ-?bxi=u==>q;?^*g
z2jk@4&qklbNPjY``c-35V{5y$KX=agn{2i&9XK2XL9AX2$!I`FPWP%5og1w5#G*hD2jUi)D_zCR(@{I*ZcI5ts7v|S&GArb$hOv<8Vz1d<}B{{Q_w)=KO%Ex<5(iC+&0sZ^N{_5n3`i$n3
zP`9cU_p0(y>lQ?}w=`6fR*qiZxzEk(%58*seXeCVb#XcWIr(G}Y2K6+PGgL#k-)LW
zx_luYS?A%)CVl(jRYO=-B4OYq`q`8kVi;$e)v3U959vJ)S!?sz2T~t59})Vx--PYJvo^ib>hoc
z@IA5-{d`Vcdk^b_e2f~mZ--78ibD+1CVAX+t<%rlr!`4k*6&apA*8m`grf1BUj50U
zBt%?w>y&O3d0;0xpq(G~es8D2b$jr~rVinm-BCpq8!>3A5~x+XW~0=)K&-2_d)wr8
ztwR?0dTm(x+5Xoq@)HQp->AA>&CH62Lz>QD9^
zH@o<0-o9>`>3Wyf_33ERGpn!anbK8CwkkHoxEszk<*AX0e`9}<+OHei=XZ_v2G96C
zwO)QT37`|->d=th#^DrF>fXDJXR18MoO4~3dV*Bf{LxO||FPK{>Mi=PMLb5`jNjUR
zaz@DW|GR#gj?vKJ(ND7`=iXbt%{*7hO%3pA+|A%MQJbi~8}>_8adEk7@5;EP@}jx{
zsLW&5c1^h`Jl!F0Hy^Dg)6%#MzHk0UT{~)5`t+e_=Cq)#shTmTP;N(nLRWW7Pz~o-
zCzhFK;nCq;dh4p_ndu#Ab8Z;opPg6G?G?xh8rDXU*Il0`N;8nPJsz)x0{Xh-+>RJ&
zsehC?mi|d`QImt?bx({`!)d8^;^{i(#_OEegQ@x^9bu
zQ69l8YZ7+ahU!L6jA41F_~ZBBfgz6BX_{_Lqo~9xGib3-Q=?F6hH2mEAZlysGItwJ
z3~i&A<#=NBc{M|hZCTm7Y7gOI
zinlQ(_mfg%-5ztlCci^>**wrP^Inx$oo6uE@m)@+&s+2kWQ)l2G79(NJadaaATE5}
zr1CFTElB5@s6dR)qIKzCj?!0^ek&QD(*?>L`~1U^w)}l6Td8XGF5Kw3BkSjV&sO90
z+a+{g8U(NHy|U9cH?ZJCL?+xvC}*L+zG5QWA)z}|$RrPY7b$i*pOUXWs<_+VL;n3!qVNl4
z)Lnj^%$3TlG5fVFyjRl}_`TIMJ3U|}ckOmfAMR%z*`QGDy7qlfn>Z~ohaSgH_;4;|
zKA8>-eJcLxui?nw?$h30ZEEZqYlT=kl3PFW}D4Zq8TzriyrQwH_Vk
zdR)3qxLQm$E~eRrbNhGBZ4T)Ve^JAMS^dxUxP|A;Y~+u|M_8ie&iT{tdgzKA
z1GWhC=y}z)m4lqXCP9Asd6SZE$baM`Y0u01p&hEWr8||zOFSGKpG7X%sr-|{2i0T8
zmsWSVmU2W-5qxX!weieoZQML=_@snq?0##lad)+(%+#o0cy^+?J~{%U
zAB+<5K!3EA=?(nYPv!$ZZ$8nvupEPJE#dxi+~@UOW5Y88eiv(OQ|NFXw1Wadmq|H1
zZAo43#r)Xq+O?88!d7X2v&dfYHfI+?p0s%}$I7%_D!FA0*Ew8ccc+Wr(lyq3s=beG
ztooVA_BVm=uH7sB?AX2X8{Gi>*7hTfb9LJS&+W-m`}@kI%8LtL8``mwj&Iut^wRKA
zkVk#K%tL!Jjc<|F(7VK%m*1~^O=I`0#N}8lckLSYU8Cb-9RFm|UGn$R8;{#^tIb*E
zKFI@DbpLgu!34X`$HU1kZ5O40TTQKpM$nii!H``Z#&0nTBtPY
z1k2}j*K5eGVZDw-pyvIl{qLTm-ddE}4wI2mj}MIIW3_c~mz1wTH?$|K#%X&GfgZ^T
z27?lwH+1y6!Rng^$9lqbjz7tcGQtbn1*CXhh-6N^D)-RWk(IoPoWw?yW=T#>ssrMn8mQODozTDdR&c#b#aitw+Mar
zb4+SeJI|z_P3M{zWu1I;eBmQ3E^i&;<#=Z~8S5~>`HRs;ycyJye%7^!p%_e+r$%+nc48fMaoLiFZ?aNk8q{*OFqex3RgPksr=IIr6A)
z8$C>(f;=CdJFy+*eqv7d3v#cX9w+h%(~%d^+Sqf{r^Kx39Y?v%`<=n6s0-12QABCg
z-0c_-F9u9?S-*d6@-)=G;MIBs5*f-@P0t%31Y3@y{U*mH{2eq|9{(n=M?DSrebKCs
zXqGapP-AV?%tQp!VeP7{8SCSfxCwo=30kPpV{{lhZAG|5S9lN~5=&7znHPptJ}skS
zd@??I?KHiLXoOaq)9-j2z75&q0Skm3T_rYayXSk;-UYW&fU5hcMfNIDG1mUxiAh=I-|KR=7Hii!(H*LanMxtl1NaDCvwMc3EdxaNi)ONcy^XWs
zEcK&?bKBXTlG_~@>w>GsUEuPmX=-$^D29_<>xS%R0zu>z+OWZYvUwuQx-RVHFdk=+
zh{{XbAozFP_&hS`!mfmKBT~M+4HWAdl2vUfhh%zcQG0UV%67#V{z+~rV=4MOi%3Ci
z)~l8EN-^QMnufh{U+8-`W%TmB&wGDLY>eHb^1Z-fd!M57`qYZB$Six;fZ;d>Ig`(=
zGA!@hfc5dp{;2*}-e~Y%?b}?6Ij;M6bg@d9X*)?xwpM|kNR*4!tXo4JnEZD*hzJB6
zZrydo8*Uo3>N&n|Z>6KeYE;c6`vGeZjYXEe^jFtsI|LN_d-n})RRImJHGQw7j{S@E
zXuYDX)Z)Kp>n^L-yJH(U#h0@MwU^&ap>#$1W6X&BPowI~CZ87D`CR^bj7{FCxIjG#
z#22fehDG+PU&i@JPa%iC(0m5AAS0Zkj^QJ`+{tq@h;eCqK0UuNY9JfX~+*`{W6H6u-ZL^HK9+
z2EW5c=NyScJqKn|$mhn)ypnTy3U?0T?yw)N_8v_c+U?DxQzGw;d!E`K;)?IhJ7jER
zEx9kwXuAcF^FvuR0u7ZKu*EfwNod<`^KJhxc>VTFhYRgpx*-dPp8a%(|JeGbu%Ab+0q6-CCUIy4R^%tok~a
zo3mVJK2u13xSN?=-=@1UUCN}og}xfh?m9Q0!Pj1c$aj8jI22SG9Ljj5tGD+)qBI
z^vgHhZ)@*sZ>QhXaMm7EnbuSz$DRjw)HpGwCfrV`5lMBhvCtIFo
za*0S|DVb`1-_((O?a~Hx2)O;sI%U(7+%pkSS8e{3m;6QxM)NpvYm=P7xK@
z9E93ihara#9Fn2fB=$6a4p(qbN>yzN0>3$j5(8D=8)#Ko#jpsh4@S~`N6DZqz9kWIh}91cr3yS_=Dnpp8-nnu`~-+5X7~Vzf!~!8;zdj(2UQyE=@;O1n{J{nR2E&
z;OT>#2-;b*W7`2YF*k>&8*Y5FHpYkOGne@qJ*SMJ$Vd&>I>9~$+d$pM_vWB(_{ur;I;F+I|`_R%z6{pX9$HqfKtSujJ5oq!|
zx0Zz^zei~?yom16p36cZ8KIHJ;i9hZYZQ|68l$&+s(23K3tJ1fQL@K8SxWmpTRzP<
zl(uM2DRV-UW>8A+qT6d5qjyqojT_C0aihM+3Paaw&@d+I^cwLo+EtTE=Yc65y7oK&;b_^!0A($7-Mh0lj=jqayXP1E&M
zsYm;sE61zL0!FCwB;SZu^h}$!^|@zN{c-$c~hAepLf9$(ACYxTG4b=7qhOPXY
zmfgB#2YZj~n-lx(&{kfPkz;gM3Li0J<)8L#e78%L3-;C2
zq4}$=?XJOcuy@0Yk6Q$
z-7`zov9o$hh|aS_9Dh2GUG&A@+mIg{4)5DOYlr#%WTUVj8^(z+f^Ryy{?gb4U3kx-
zhhkaBX0e~Iz^NOLvuhRijFP@Kyx&c@ZL@2*XVmnnu~~vY$FAU^al(snQt+S-!o)Z`^Re|XOME~(Vh5P3DOb84R@DoW3v7_NG&
z>Jv}n2yW425;GgYW*EfxY=w~Q{w~qJzVk>xPyz`au(Xst|
zYP#mY%VYHKv1NN+njN-pqZ1KToP|iw(}wSfy@&=vX8pP0XY}0-
zgX7MHj#zy5Th_4`4kTLloy|w5J(rA{h4tPv*swXiw$@wttW826f3A-_5p_H#IksL#bJh
z8(HDrvf#}5ZYaj*w3CmHe@g8ckyU(1%@DHa)}Hv0HJ{iYS&Gvo>v|<|4Nt>5$T0;*
zKG+}Woi-6
zK6z+3KqJW;``d*CY4b!5RUW&l?bZ-glf6P4;5jNY>D{{Uf$-ft((3(
z`IG%m?r+RW;0>&RgN^Y3b~5?-Wg~xMBS1vAx}I&vXL!0DfoR+EikP>b%)Nd0E$gG^
z&!%2m{rS}2TkPr7JM4!kog;m#oUe_Mw$H{YYR|c45?&BbF5*=PKW%$I{k+RUPoEiU
z5BI&(ZKbAfm9|=GIrcrT8OzX!1Ez`elVfQHEuAYyXOd2P9tQyCN_*~I5aaQ{7*m-Sj0mqckdE6Jj$
zh81m1jh57G51%#k&a%=uaFfFA<ygXdhfbIj=6(l#f`m7QrgD$FD7J@w$2Mx7LI6w^f@xw{h6sLMU^o%9}k$i?Ak?9Frd
zbaoXf4SX64&qQ~dpgG#`x2e1zpEU@F;;!OJRkzh(r1FUB0sM$lvzVb_P9+6*PUSq!
ztSq<2e{T^t>Ts2htF5Mu?=yp?cB(tYoou4uz>+`sJ*QqisZ$o;bnhGA_F?RCm3wa*
zM#st1ZwKV*W1C-iBO{B%@qPfpb}DNV4MTNYg^CUz-`RPsP2q~#J?1ZQMKz|Zp0VD+T)TH{{EYkQ3c%1_JyeB(FJrkd7wX
zBdD%6*ZOI#2BYuPCL#2095wjVGe`C?UASIap6rwTtCOHLPh!lj-8Jh>pn3|QWDc({U%~%&LQ*W5h
zA8`43lXd!>z?04^Xt0ITb0h172urw}TTqqpw$*#&Wh{=G#;0aExP9$XcU{y&J>yg3
zd$+MY9`M>I{y#Pd*S%)`HeBS}p6vZ@gODAcL(qmzdDKnqq%x`HJ_;J_x~Lt~Z*T;9
zoc`ykY;f9}uJMUodW9Ocn{<+TmZ&-nP$o6Z5qt)N(Nn-<4W?D_`4CtkFjTR!LXg+ks!?R$raMa{r+o
z8D}S6nVfPj!RP3!3D4ng&+@r+siPKA_maa|@Vi%Ck&&tI$r!8bUN$cDt8w`$s37>9
zs-IUkzu|#Xg4fUR6jj^iv_yuVeGt_Fp+@?sY8i%+hA2qP%J47y*dO_c%
z<+%OP`Dit6C;p;ttW;3GH>&{4R(Z7_%;!r_qqVWx$7@sYLS)0CL0;FP(a1UE(!zYU
zo+$B=oofc#d^R8(7mfEF2IsnEb~V(iv1>b@@7)l^It{Ta0k3u3G=oQPsyg?W{yRuR5W)y~*?9yx0CNDkSRP
zs}^SHsjgbC`k37nQ#`L3qk^RUS-T3U`x&nmiYIDyJ@IXL0Pz_%Tf2IO?{g?~ER{7M
zJP-H6M`z8O^_mNw8?JKTsoZu@O#z<=?dMOB@7H@?YhM4pD}T+qHQKL_(&mHub9MT!
zKiii@1iCg~)W=C9=Cy1XV>u;s=bgHr0!w~l08e?O9$lpqmD&mSIZ}A^P0Zf@&PQv1
zqlkNVTpL*Q4DzBKedhaioY+52qosVtD)C~x#|~PG_MA+wdD&JdYgmX*+Jmr?sdV
zpO+CUK6Bi`ogT~Sju@qHjEm%?Z}dl4cruNE=yyc|(wG9D%chaV8E1$2rn^J+kYCK(
zj*ZkB;B&AO-k|SL+iT-lc*T90ZqKUyWS1wylVPW%UPJj!YR{J6)vdt%sV*Ckr}{0X
z$LAD_%}?wM|Mi+xE)AcglBL3vWHsnSaO?tpWPI%e$|>^xRZ?I
zPJ&b0*f9Rln_gRAg&A)6PjJ&I-5Tde&$-_=v8LSiw$xxwkhazM4XI
zSQ)nt8#MuR*>vc{1xR|d-6z}Cr}qDJsE%x8^+F)#6yps;BW&e(XnVcvXsM;f=pK#U
zrKtopr`tH`5WCW+tJrs++5O8}Jx4p2(YJ=YVtP|NR_epL#WrrW^Ji|xQ3{k@J0V}&
zH>fjk&2RM;Kkl@YoDx#|r%hFDD$Jv1!e}4WDaJ7l^Cg|#HCg4BMA)R=BO*JIQGRbA
zcqzw>7*;xZ;8KvT%Wf*^c4x=6cWh_J&mT>=@}^5A)ISL`nwE_neeF6KKeEJI>sh*iw9dVA5oH@Xc5$ht)+aeuWeBY2}O?6
ztW)Xx>vLGK;~ZA4qOKcjILkS0Jj^wIOEqhGw_iPOv}%YRnJ1@{P1Hk04?1CK$dc`{
zPo$5*K&hkoEHo>>we=gHre3+Ck?ALGKb?2#o-yBa`J{Z;_67Mg_$oL!|GeZkzOC^F
zpVz64Z|b}Lc+f`6Z7%Ir>KQl}=g*0n`fRhBWjT%pORFk{Cie*PIf5EA&!SR-L&*
zMA4UKBu7YR<~)KobvC**q@yj{`!T1jkVE@8Z$;QE9EM8J*L;7u4Uw8X;)UeZb&uDu
z#e8ageH}~6c@f=L{*XMy!)CO4cjT$jfcmXtH_Vpet~6yXwXU2phPi^Z=*?3*^>lUC
z#aet_zrRB3VlBR|KU|@8v6f}!gg6rmU9_y9z?gnwj>jExqb?1E=`q|lEH|PbvvXO_
ztHV)gG9mAz<0#%e+S3UbYu8Q>$(4rytZG3XgT1yGdk->7?{^(YBZbhCCk|UG$
zbZysZ$D?y7#_d*D+^&Sb3!7l7e73gM#~s`iI4pNu@WBmDfps@nNdCZJ6f%
zLeatPh7#^2*l(W<$>}@iy&6u3POWevjnjj~k)j4llu{e7%~4%@)V;Pkw)=4z_&zfn
ze{8JW@|4RkzPs((G5Ocjvi17Q=wDaon0$w7oa^h3?sLwi?K#?&=vs3hRg9Zc=OSu7
zF?9wy*6A>KrTg3v+&b^KsT~g-)avM$om+F^7eysqIj>hnFTcOU#PVL5j$3ALSNzvj
zH-=7wqK?nUt@X@Y$0=mRBUP(NHx};@Qd`*=EvLw@>J8KJv}a^5^2+bpJi{DG_Uoxh
z#jk9?s1SF4Y}b%a8-MX04vX@4cQ1ya+V0wl#_Y_vGtc$>QfDnN`|`HQ!)|Lvw4mMrstx1r
zp+$U-M~!9qz#uopNDqZ<}Gd|`!>s4tD9j}F2nzJzWztnr}37-
z!HvPdc4}BTvghk~X-lKh|0?_P-e_Q;TlFK`<5$i6%W-%AZZ3{>-WbM47v&OptWl-b
zc*iJ$7&Ny~JT)3&KNh*MbsVP3Js6s`54K~|4rmDKK#mM@I_xh}q0HO6n@YjK?xs@Y
z%`!Q-TlW6$rc$_dO1%u&qlzN6tB`fUp{aeKquSepBh@XHfIA5-#&r
zcSq^4v>PWyyW%&2uiS==&%@pXH!eNB3NE#|Qws^)rPQ5%r*ZrS-1HmX(ypeT1}w3s
z>@^k%-*v^!>$p2kR?*f0!sb_|%}&gYQA`^Qux>>MZ<)SBFP_=Fvab4atgHqYi2?ZY
z?RekR%-axrHQE@86&_{~kIj0NT6!!79pBj5Pz3icfa~_o4CDIPES+Q9H{!&O>#3L}
z!w;S2v0g!oeSOl{+r;$`%&I(Y?9C&~*xs_Am!13G`3{Kcp4f=oPC>K+izR#mL37(I
zej@sFt{$I-NIn%8U06t?@pouZ&`cq=+!$_lO)cTK=e!IBw4k%Ngohk$1BHY92N`6L<5mmQp_Ea|$Xy
z!TO@nE^(tzzJJ4G-)!LHlo?uzaWsAkciw*l>GH~+TYfEh|N6PS;uLbXJlKPDjbJ%_
zuD-%L<@C`*PBEoyzGsp-x}?&b0e?8o#SBvuyH2MOY=jp^Q`n(z?f3d_jER`A|Md~I
zmS+YbGbmzG+w(EA9A=|vWb%u1tbmI1bR3PYo0U21P1Ip|Jn0tj_IQ1>adso_1*
zG>h(O#HxR9REajlkD1QD$HtrNN;zKNZ1}FelXK6Uk1Z&G5DD!08lQ8j?dKA>l&@vY
z0=i5Pi*6tru{_zP3&UGH@(yTrt8i0^Df$C%=&lv
zZu4AwuOCt&({Ak`ZCnAX4#9fqq^hu36rxm+&_Ap1EBqJ=VpHgVLFf+7f;pWc<
z)pv#s;*ZLCIk(215D{pv4_x?dqTkvRX(U&6EmZ;BM?`)ddElQa(ixvHwtVvVjF{+i
z`>T_d{w}tY#=@hDrx^in1-|fS(c$<9NF;q)$5agiP$3Y=R^ya5T!_{KJJ&3t2Nayq
z54`Q$_s{J!jkj-=iCAZxx_M)t%2L}mSg2OQGx=nHRS65`_Zw(G+5cpz;b-1rR|v*3QOsTB#1GV
zl?#4TK}!B#XSn)
zKA*iEM<}&Wztq>5r8elw;0Y&vI^w|cTz@MvjHgZZ>%gko$om~$=#G3PV`8`mMk&}O
zDSWjv%~%BPpPyRJ>Y@EM9~9wbADA`v(%`veaQP`GY(8OCHHCA}er$Y3FO$BR?^!PD
zMzard&yIxquGxcr2$a|6uAMu^i)1Aa4Wjw?0;`uS+G~@ma3MW)iGTD%$1Onf!-A|F
znwc|IkBmodS{?rl+ok_r0UT{xa0sfe460*;NOibW!p==MeriEAxx*B!(`SD(`k`h4
zY|RgoB1oT%cF+xYF++GdF=}279iJHej-gymLu#)cHu>iJhMoB_Q@i(m2seJu{QS^-
zWxgquHhmC`(~a0FwT`gkwAMJS!c+Z{pC^VTw8o)wWV{sRoqpNI6N|_oo*yqAczO}e
z<@sTr;;F^xUQmB+WB2Kt$JMOBSX;;~C+WlTt#)*J*mj~<9=f%!mvm_>v(mQ3=Q`Rg
zN1lq9ry$9#uiT2Qje5V)vU6ks%5~<@b?wSnJZoR>8>fFT8;K0SC$m3P=|&7s@oD!?
z`fOQ6T*6yh6l01|g)ivc9GBe*KT#6nXwAyy;x*t;y|k6TvVEVn+d7?Ajx|pV3yjov
zd3e{fQm?d%`m|y0q5^LYAEa*UW7W|!VU80-2NqQ&hRk`U{G8B3lkN|!$`^Z@lS@-~
z_o49tnHu?+)P5|xvn6)n=^9S>yuFG#HMDnGyI;!IMe`@Dx{kRq(lwQ-ao5>2E-UkK
zsq`v
zUrDahfNx4vDZKp>qoKz(1zULIC2Vm=+@@d)tG$G+>z+hW%)0iK-lAoH-U_b3t`{;iaZf1s`k%SHT4-R9Jp_b~3lC*SD9ocuWeZZkpT-
z?i5W-p&{3_DNHGXmO`T&{m5{mwcD;ZPuc7e3PH$?Ui61})x-`;
z3v3w1dGL2TfugNXa~L;eljJa#c8OP5te5T-CGeb)U^qSZ{oY>qDeKxrLE}9tnBQqE
z?+W7nQ@hq_!qOZp0NO4#DF!?Yyn=JqQ0qgOk?=LH%@x
zqC7q;@%8AIQtuhFYKXde5P?bej_2)4MlPzaBbhq;U`e7mJ+?+Yp(^=m7#WkxzH3yY
z`y%S&iY_#J{fXsfM)$T?qgjW#4NaYSTtBX7hFjJ86T6Kbe=c)|_@R^oL!v{lIn@4azK3bm;z0;Uk}sNc7+BE#!yzsw=O=zUhh3cqt`&HMihs$7lFF^f|wU
zUz(2?K3M*FEe^mqb$P=#b-w4DKK>JI*yr7x63^7>neT@vk7v5+<8d{k(;qL?4wE(W
zIxa=GruV7eE)Oc_hH+MFuJgdql*rkMQLEq7Dl8*$>UGTPgzK;a3c*N+CB;i3^D}IH
z%@tvJn9VMTRNGF65p|daixI(IA8hxHw~3V<6maxG*?lL%rs1yNt$=*_uF(hheT(|@
z^Y9H_+MZcNfvSGAwA+X&T&bVH-Bqp|hp{?8jH%BcSVR#iyxwV1p3SBqerOoxJcRt5
zE|`Vm&11H<|Bla1Lg!d?_)5J@90yqyori|0b1per+I$ZZSVWzvO}9?%b7D58pP6ez
z!dcz1)@5pEAh%LYFFUEOZTT+Oa(vRIWxBts$#$Mj`93V*^wYNVD&KSZPUS`UjPqyt
zxxefFcWV8g8h(Q+c{AwXan*VpZy9Pgd0zQ-DpJ`2y2<)^Ehw$8=7f9{=eS@1xKi!lU~;7|l2teW{^H>}yKQrwE}!a^urwLVGcx%wlcs@$HS?)4Y5agYU~((jD!;_Tk~VC0O#F9sdfZw`re
zrAs!g8<(Gp1xz#nJ5i^5IJZi@Na=x0IqNfz^-0E;k#x?-;VV6p_NgEB+oBtfVyx7B
zmp9R^LO$Ly`X0LfZi-w?$7S_h>lrIAyW&_iIfmxxmLPoF#kJkvby*Z+_w8|~1|KWa
zT?k7WNY9^BS@*qp$+CU*1lBRy-8(Je;}PxR9CsJo4n;uq+A5*d
z>#&`#tl100u=<%xx0YTR73pVk@A8dU0ej6VWt;Gc>?~+b&!>??eS#eE2q>Nazv~+!
ztc*vr5?{Oto!*~qos8)NOceorF>WGA5C
zG-Qen<#b@2A4kJ9bu$DQdTv+s}5VbBhny!P@;k!`5@Yql`8s%1#dVsln$JN*;}A
z-!CFutqZQj?-N=VWZm}=$xri|GxxyP1(!Uuavv9|i<(+{AsymUv29t5q0MD&%!m}_
zdJ)YZdLYk+#^<4f^5^S%L(dRTcx6&0f444?c_X!NqDF&n`Xm(Jw`ByMwmFnfyKVp~
zX;b534W(UWA9q;5S62e(BdZ_;pFtp&pPQ%brCc0Yi#%H=MA(_-+=5Cw8J%m#Lsfc08ZVbBLo%bRozdRaMjD^D%5?>LtS+;q
z;p#HWzbpGl@wrDd++Wa6@=X`d@?9Ut@O??Ed{(2F7%Shi$Ag-=t#^fI*UhprerV$L
z+S~Hfxoh4&O_^Df3
zxHsyla;Wxt+GvFv~8D_u;ML*9lS}brf^WNjTVf0t<+lB
z6gE?PA%#ymI*&uPa~AbD%5YRfqbus-osg%*PS|NIn$srwLbYhuy}D&~rxr!Uf8sga
z4&wbCRRhvGUctv
z^(?+J)>0d9xjaC(M$#%=Z$X98Yj2AFqG}&XrXm&%qk9$VxW}5+2?x9wKNsL}3ErVQ
zypKnIEyfev%<$S~<75&UTFzAP+Z;198)I{>CdTfEg6BEEHa7(91mo6bCr>4Uioba@dSex;qQRXw_v$xGI&ok#=voUM4s_JqMdLm*}o8fsA
zzoftAJZrjrF`wRt(1J0&XrU3K*bQ1$WUoSBiHL`A5^nS;b>h%1>2z*EwY~LXUagSI
z^FEwSJ@4b1650K|b;U@vhj5hZYpiQv!i%bLy2i<+e$Xi15i|IC#Z|7T)cwR=(z)GY
zSZsaeD6zKJjhBhE&?=Qvz^;m$V7qv6+1)GGdanu#y%O+>rmeg_CN^HIPZX1{AI^85
zTi7`_jFnpF~SzP0th?20lJRUp^r^F)LkPC}=I8S@!?#TCfcTTu)8JP`HFtDCsrx9=A4Z_Tw$Iy?OchvUq63$^hy+gQIppLf{C8FTBq
zdwH)-DnQq0Qo5r1y3;6CK7U^6R@+ngNa?t_4ey)Y#4rgcRSa+=B|PmSt^C>IG_n_pvXr*v>HW?al=Zj5;(pcWBXG@3UzY-6Hw
z9E6bffILKgWTWvM&Z|j^h
zgW~_#zH>$Z`w0#4t^J#80W8N{dhr+Ukzc
z?3;#iWoKz8^UN81N_1XlulnrA`K50O30`apiKs&~yxQ!D?_Ei)^5tXhY4&b8%JNok
z7rYLiY+bs!mn#}$JtD5|V?;r5-&rOc2$ULR|D{;G3Ms;!RgROl4m!mjy8L%n4jW|))a(Ni}r
zASmNDiUx0gUkWk+s$`22CTM&gFqPrulWukD^B
z+uldR`(TTIHpSPs%})Wtf}*5H>VjX`-%UaH_4)iIT*TeHYyPHSBXi?0)Zj}`7H&r3
z0AWDUhOsGD1-V+W>iC63bGJ&s+
z!#T}E?ZRd-d)$Jggf)Ck`Rc?~@KQGgad@2a+Z~<~ZcbC7=Qk%ozqx>*4>nG_oHf}D
zI+S5)ZjKsKh&eG+!d0##wT;QK>E!fSKXZQT_~8W%viwu~IBdGjK^j(QbVsYhyuBR}
za@%fGxXinxl{nmWZI}|TX=~XwUQ?@Pd%HG-?Yt@a4C}eXVXBul1zjrVOZar!vwezs
zUB3FUS#!0B{N;~vUf%OKWqxa2`4F=A<=oQj^<3S$;OaYdwY}NXF0Wlc}zLC
z6Y=-LCm}oX|F?IpyLB8#9_Qx;_8kO$PqGQH4o$wa9SNIy|9AKWj2>^BG}!`@pyCsRm!sms5YVKOY_^oA86>K8bqA
z9lu0yba1g|qZ2jG4U+cg0}0=uhO5y%{*!NrE(}W661ZkekKbx&8i|OWlW2U+_Rfz;
z{9Qp)ho{k~3Vv<>$jRgyWzBp(tDp$-az8ehAW2ZuzXIE9Qsk({nZD+4r*4+7CZ2-+
zIqqvl;HzFeG|j=Qx#ej#+edPLq=u%E;Cp6@KK2nZ3EjF&thG1gXkf4;uWQfSK|f|4
zRI*s;kk;aGt+o?f$@RP5FEyU)S?-MV9ru>B2hZd(&Yh7=a<7&kuGE~*m7HU_lXDn%
zYL2){YiRANmc7m5tM-X<-Pc)5G(-6F)q&RQ!F7}<=NXhB9=M*mNv=)5a+Vz4kIUOqAGkWfAr
zk)N8x%hwQwXfyVeL-CRCutuXjY~TnwmAAitm}_mb)N69phU3h2IdpmJTM*nrz3P@y6YIu8f99pd95lKM3u3Yog;P(+Nxi^~o)leUd
zcwFmtVcj{8&OW)30eYP4FFDQ0K%6h{5>s;#8jE_A{4ua^c|XpDcRs4?R)@lSVdMR1
z<7jT>+r2$ogI(;Y>mlB^wS9f|XOm8S1C;rVtX)Ydp7U9XCO%5OhT|3T6;$8#?Zu3>
zwa%n)jXsfOs-wErH`oe0k4CXi_+D{_%~n39HxWp^4)4ccG^&VLr0-1Q9B)iUe`7dY
zet;|v8RNj7_mO2;mXChcjsZK-f!mI+@vvt^YuMZUv)5QP%y!&1GhS*2c~}NfAx0$r1nxc4(gD|J*ngurlaV!RDMy|a}f
zHsxfwzD`rmZh5Rn4a9y-DsI?f*^ZYMkGYQdb|^7xEIp^52i$x1#b?3gH+7Aok@Hw%
z9bMODM5On<*Bu$SfA;IjC9z`?jv+?H|8hCbV$?bQfRB6Iyqp_)+>I}ZxSselblR!#
zx%e=y@E{^mHiQ4ayz$#O30{13D!j-s1RnR!{KQDt%~a;_TBJYqO`|y+x8@u0PTFy5
zk7W%fh_+;>sC)9oQSyH8ZH6D`OrS@_NEbKb^jIJIo$(SX`NhB=y}<0~ia@%=$A7Yp
z*}btym#+BB~0*kO~5zFP*dw*vBIrlm0r!vo=ej;pmeLc6kdZxFIT%WUO++VUj
zJd@i9?)+l$TV&wNd{nP9c|MoGt2CawFuouUlJQ{NBRfMp$+r>eC#8GlV>&-y^*Co%
zl;^dgi+m5QB-yofc)`azx4<>>g^f9)hp?#a)6$+3hbw;}gK$V(m{VJPfybqjnwGd>
zX@+nC7U#m?VX=eWYk5IAiP#Aj5NhhJ@oh_og78NM{{u%;!c|@_wZaggRsy
z<=@J$abIrFxK4S&_DWVZU!I6MPyIyZd#<7M(+TF>s8|8z7pZ!1rpd7>aGs1Xhtc&7
zulj22U;B0q+VywJ?;pwO-Hwn`dH;AhZQIdXin7l1;=Y?~MC7{v*dmc5%(!w=v&r*tMmbJSlW6KIdNCiJ+$
zqQ+6O&55A$RBi)9t*zrw;|C4#sBV*b8o$OXq^Df7UT5_Zq)Zmq;RMC2@Iu}Z7xHy!
z(I=-4I`>oA1`Fq>t@1Ut5qmXk(5TLN#C2&NxK@1V8iOmjbaQ7UR{_U)$tBL;syT_P
zflI6-*Mqw2EP{Ag`1cw=ti*iIZaJSY*41m`mr_T|Gx-?3qiz0cYqWJ&Wvr{Io*DFv
zUq;tn-?a7s55KOh-c=dzs*KBgb5~`Qz4*0O8D)dQ${iNPho!FV1~h5)J=cg`Ywacf
zroZl54NI*4jr@Io&b43t)IWQ@W9)^@dlc?@5TnqE_Py1`-`w!y2~_*5r^H3$*Zp*HPUh`U$j>dTv7#gAw&-+WW4GAc
z?#f-Qpwi)+$Gmg_nq9gtJ28V
z_FUA^w~tptSsFETsQRVVk)VAbTX8u5AYJMe*Zy9Ixr9;Z&*NbfI&lj|(w)b{M*46Y
zCayP+iH%#aEg0oG^LW_hns5uInZ`UGo|zWhf~EG%=^Hy}3;GJ9Yao}%HC?&qlMQ}h
z@bF4{xY9uyJ%1w8r|UF<7IaKl0{&W}Ydn+B{%X)G7XEhTMQe6+
zm&dN@>^aePuJQ_2`RcE+nNZ*DOwdK6F8j;1m19m@Jol&OCzLzy=rWI5rbqG-@n`&2
zW5SxX-T^)4QP=b==B16TJc3pvAKSAC#~k@_wM&D@mO6y2tjAAj!}u+8?A~r86|j&zj7+a3Xh-hmEegbnvEoLN#;T}
zp%{6o+m_7m#Y$;kmd{oLY?aXP+e&?LedEp5e*5XL%44%vUQ{QTu<%f|Av{y%qI+B#uW-&!2BuE-ybsc_r=gc;K*gt}WhH
zZI(w4C9dC_*8lky^M{|^j9;&-pGL+hJ5b_K2|f<>{Cg6PMUCUg@6J4@);eL+Td!?C
zr_+zNH!IVR7kL`_1^t-vW{y9yJl5s$IjMrRC08GQv&RI>_V_q_(Nm6-FC4G%ygl0J
z>BzY(^gdz__?lGsj2ZXTSg+$9P8W(1dYo#%)G2tV*R6HCi)!4@JB4R#cQ#+D-Ez3ozPa-patKq`BqZR=b@Fk5>ETx$x6r
zQ|Hjdb-&KDVAp;%{8Y4E`?YcJwbU+8*2DGm)}B^H_fO2LCj%k4ubQg2RyyMF8jI+w
z&8W2xuk)KTf?E7!N0;(#!aHK()8XxL@E*KXUpXDl<1=E{(K(A`PltUUz3!oXAM2iO
zCT)DXXC8UndAhk|(dM4{L~MGxIed2ZM?2T(lMg$>Tt^mK^Ex1Vk#
z?LR!l960OGN8E$C`^9A?ACHz9=`3LRv6&5Oty$kYUeA3$b=nRCb}D{lnI!kGPpt_bPUH7yk^N-S{-3vq
z*OO`d9xu9XU!DE_7BRcH!Jx-Yb=2EhNmWv1dpX-q94>5>sr3E@{e?tmmyPeMao($W
z{t$~#?$Srm*BX2jPIc6-o)$As-$1UkPa7@j?{L>HnCVnSYEV=m
z*yrc?g!bA_t0$%lsVh44pb*ftdi{94hT4};@>Qw#^SE~OUE}QcTGIOtsl>iN^DSG)
zTB~NUfqzfAKbAh|gKU2!jEx^O!_kXr;%`Bavmr-ktY^^)N)in?&EkoO5$PQ;K
zJ1p@kdLw!#V~pd;3%V^v$a=uGNKFkjWaq8Tkov9fk96Im@Q^8A`gD9wlKlRt
zs>Hh)@8?i@Imn;O`9FU)WFf!b%SHZNna3JY!8u`^4Tc{1Q&7osojm3FGfpcicXPQX
zP~xLC3b_3}ht}U&$~J*ZmMhcAni{#!-tbnNJK-9$Y_kYlNAJhk1ARQtGkrA8)hw3f
zdK*V_&1r|9;}O<4jw|0-7hjcc%*Q=ES;i&$yZ7|Do_puq8K2C&hPlaW!e1wqp_h&ev<~Gt$?BM>}^uvb^-Uy+3GVpv?I?OMcpt
z&jLOAIr_Nr$B=tGhQOpAbxki6H6Vu}sK}pu{(!sHbBpu2%Tp}&`eQ+Vs8mvczia$Q
z+_KCEqK4{X>=A-e)a&%^BjtN*|9+Ws!m?+vVC~Ik9MJZMQ7KRaL3RUvQD5FR=#K`_
zz@)E9#7=3KdpyGRu}jOHqIb=~Z7xI=51rR|K5?new2r+~8P%i@)G^&hekK28bZhaP
z8=;q`u(*sPD~%S!%HCCfRYk_*m0cqrmrLxkNh`Hg>p$96_lU$l8NKCgw-oO)7B%nH
z(zu2@TYa73%x=hawRW&Zm-+m}o41E`Piy&nf3>xHZJ6?H61RvoCD-J*&P^uBI+n0<
zy_45Mx%xMgFurMp_1cTcryaaQu%S+f%}~F}UR=ItpdEsVG!3}y#Ud=BJo?@u#Qs$<
z%ze^K!`70
z=AP@$;foXT5WXqjZ{DPLwm@46@$)M_IxkJHI^z_
z9v7E(hxK*+m2>AI>+8OLKR0q^ci%`QXSnob?7P#8u@9|BgZIQ)G5AUC*DG>MwoY=k
z``9l`ZoGq|#i;+@pRmd5!L?Ue^9Pc;B}Y2`MymXQva;<`pW(JWTi`V_+w0MV
zA5+`lkxvquI4mB|_SZ*M()J{2e@>cR5o18h^nE>EXy*EQu1)n!UK{x}fB7=^;c5?0
zUoRrp@Yehl=jpln#WUMi^uTr&eQKvqJ-42Uiw|$r61m1Zdp6~$;`GnRuRb^E`(VrS
z3y2qn^%rN4cj4<5i4yANM2)?0eXUB!4~@Q$?cY&CD3eEJCY7Q4V2oUr1Y+VPeB?wHSM6r}R`
z#BHA&ulpNIb8S7HFQ&P`QRV3plAJGXRu?wPrR6`K+3#OYoc+K?eKZ(vP1cznbK-Gw
z@^qHrPu(-vce;O4<(4+$OSHlKoW?8HuaGdjG@SV&9gz=J%3o|oqUCe@
z`|kU8_s_O^b$8#lqa#PL?KZEx{>ol_r){5Xp@G|PFd|=ZJv?EghA0XhDSatx>XB9Z
z9kT4JfVoT_B6qc{S0pcGCP-KK()G^k3{
z_iP5=nm_fkT|-Oro7Rg(J&wgto
z*DG*+kk?9F_P`<|A|<@bhZdtfHV7}KE063N(Hqwv487Vz
z;6+s_|R{>u`Jz;pZ`?hd?QDyqfi8OOHvsi+xm7N{07S<6C?b&-c2|fKTqa
zWG-set|EW3mWw(bfs^q2JPt#0UYMl(Xg`IS=bCe9YpN9&2A^6y5cf%{&kL*ruMw@+
zQ*>?(4yC>4i^+E=B7wT(cH_$SsQ=J8)ob5&_O~nV{1){Me1G&NT2zsOcPbJs_cN=<
zt9dP3`z4IXhiBtEEazN#m7+J^3V1U+Y~x(NC9^o>d7^K=79+Xwc)7PXj^Fr+O!CkI
zlEl(WrpN6o`v>KNhvq1q!KN#-gdz-y9m!M>tFDWmTb_AbK-eqarR*?=5%*mUv}-0E
zwft(&ufwIymyDXn#4hi1tMQ9*gLiEy7hJC-nYQ;9D}FoC
z@lR9t)mHCdZYI6l*1Ny<(tkY9Wvcgd9n;=rfqGIeJJN=8>j5vcwX1D9)UocrtPx|3
zySmqCP0!z+8wZ6q4s@@l3G=P|a#vsdSoKvj4=ap!s}54Hb85vhsV}W;+qa86EJ?7m
zo%@gICbASI4pIN*S-c-AH=KtAN4YjT6>d~7G=7a&NKZ+Te)hctsdmG4&A!x0ittEIxexETn`Gbw-DlI
zX}@0kyVcO{AF_$_dv=zs#aMr@@o!4K9qY5r+B`L0gkt-1D8Uhd(`W_OQnIG}r$+g=
zhONuaoIS>l6N3gWr`3=zy74s^I-!ZS-%WE-k0d(iRN9f9E%o@qi#*aRiHy4!h{ZGjq5ald)N(MMmx*cv{g@_^>(KAlcmvWD~ly7$9L**(%fzH
z_jAK6-@VFA*u9VK$4_x-U8Y-adHY>0uZ>5c%3F(Wy#F(#<*Y2o-67%==~14(d^{0
z;USODQ(A_rx?w;O?2mm;hDJelmiUiZ*ZKeOgz(bq89H3glkr5ECFg!m{benM_gQ}Z
zJ@3O@=biNO?m3R%Ofo4?CDWC3vi*AY)w%Zeo#YvH)_8(0#r2s54!!k#=C~uHsY4Gq
zYqbz-k?jNtAF-5S#%?8+Yni0!*>bHt%H&QNnMM4mJMsse;^noN-&LCbcRJ*{QgY?b
z+@2o&n5z!8{*gRH^m^$TW%AQ{Va%cAI`rSj!*V}RaJRn8T6d+fra8+tT$#s(09l66*Jqh)ymQB
z1-AFB<1w%m)nX=8ci=HjhWjLA$S=Zzy1G|ipYhrH9{6m_}sGzD=$?SZZDBn-c)
zm&?{R>+jk=axJnd{57^k+#T5g?uE81^>%%y)`Q&3`GY&T&vrHIiPc_~X#0g>&AElr
z`qBku4~ewGT+WdB#Hok9HO@3jy`p`@)k|9I*K#2wu`xz}mjdiFiBH6sxONFl&82YShY;!JJ;uPm6x<{x9
zz*on}`bV6xZEcLy+n_(1RvtO6PahUF&>nnQ1^HU;CM%y85_a>%D=i8)IE{O(Q#hN6CY6}{|!N-_REd3K#rtTpvhS?aGBpx^6L
zYLBD$mNQ8?-gw@Q&lvCaY(dFDufv!0HF`F5U7aBl@78>m;e2;0a9$O^I~6$NAW>!A
zslcuQB?rono$^fJ_O#~Qt6OJ({#A0l^4-_br1kO6&DwfyrqoMYe6Y(8dTnnOH~bj*
zdE|v~uk{+rYh-+}^>o#6J-0^UZdtAIQ>D!sJ=I!>x#wDVIiCX|k6yT=b?3KOxvMm)
zsbzoJ)0FgoX?8Jogj0n%tcO%k0yjK|-uG@fa%t2#+%61Xa3+TByKE#ObMYB(-}P8R
zgWsLq^;q8ZSpGBjSZ3#4w7ST3UY%1w;}RvKEj$adHSfEu?bd10Q9U%%XtEft>B5ST
zWpV8(i#fJR)W@_-{9ZS$c5f^a1Vg(kW*dms6TEwIVw0jcD2jq%#%{gv$x
zq4pr3Df$LuO|ajrE%_ViMsZS!*L^!RAcLiGs7!M1%WHezJMy;qt(OTTjWO~Tw~g~?
zHfP1m>;9Pj%683=^XU1_m^E)YeGkbjI3!hPGYGx6Hr6xDT-h?XqNKysKzj4}&C8&$
z)Tt1?{Q8VkN&BmDYfYtP306GeTK!PoSB`Lhr?X>m80D5`zm9f?QmoV_+hnZNY{Kyr
zI`5QvqU573n)|Ydtfg~5z8*c5P4IXua{eDnV~(`K-fTrF0a_i`!u(avZ<{>V5;-r$
z^|Q9$rno_>wKK
zjH+A>(dTn)iO#8Zm^9at=@`;8%E`-c9y5=p%D%nN?R+lv_5ES0y_NfGJ~0STiM>d<
z-x8e|f3PQ@B40b_9P7}zzv2(S;5fEh}Y-FEuYeRcnE*9dFd2^@woMK
zdY4(VlZ-3_YcqbkeNyiSoxC4s48foHjg6!lwc8wc0u3)-f}X5qySH$TD*5xmQGD>u
z#*pR^C+GzGAB@M|FLFak^WPe+<{*{N=Ib;6ezr;(mFJ-xgVysS%uzh>orke3L-X&C
zB&p@qr8R4x*Sa|k=lCw3>ED^hy?xWOOBzjQ0i&^WCUl%Ot0-7D#?LtM^Tc@mcP2@G
zT@jum7&y
literal 0
HcmV?d00001
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000..7e8bb04
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,53 @@
+import { Routes, Route, Navigate, Outlet } from 'react-router-dom';
+import { Sidebar } from './components/Sidebar';
+import { TopNav } from './components/TopNav';
+import LibraryGrid from './components/LibraryGrid';
+import { Login } from './components/Login';
+import { Settings } from './components/Settings';
+import { AuthProvider, useAuth } from './context/AuthContext';
+import { useGamepad } from './hooks/useGamepad';
+
+const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
+ const { isAuthenticated } = useAuth();
+ if (!isAuthenticated) {
+ return ;
+ }
+ return <>{children}>;
+};
+
+const MainLayout = () => {
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+function App() {
+ useGamepad();
+
+ return (
+
+
+ } />
+
+
+
+ }
+ >
+ } />
+ } />
+
+
+
+ );
+}
+
+export default App;
diff --git a/src/api/client.ts b/src/api/client.ts
new file mode 100644
index 0000000..264f987
--- /dev/null
+++ b/src/api/client.ts
@@ -0,0 +1,182 @@
+export interface Game {
+ id: string;
+ title: string;
+ system: string;
+ coverUrl: string;
+ size: number;
+}
+
+export interface RommCollection {
+ id: string;
+ name: string;
+ ownerRole: 'admin' | 'user';
+ games: Game[];
+ coverUrl?: string; // RomM collections can have intrinsic covers
+}
+
+export interface UserProfile {
+ id: string;
+ username: string;
+ avatarUrl?: string;
+ roleName: string;
+}
+
+// Function to safely extract base URL
+const getBaseUrl = () => {
+ const rawUrl = import.meta.env.VITE_ROMM_BASE_URL || 'http://localhost:8080';
+ const cleanUrl = rawUrl.endsWith('/') ? rawUrl.slice(0, -1) : rawUrl;
+ return cleanUrl;
+};
+
+// Function to handle external URLs directly mapped from SteamGrid or IGDB dynamically
+const getFullImageUrl = (urlPath: string | undefined): string | undefined => {
+ if (!urlPath) return undefined;
+ if (urlPath.startsWith('http://') || urlPath.startsWith('https://') || urlPath.startsWith('//')) {
+ return urlPath;
+ }
+ const base = getBaseUrl();
+ if (urlPath.startsWith('/') && base.endsWith('/')) {
+ return `${base.slice(0, -1)}${urlPath}`;
+ } else if (!urlPath.startsWith('/') && !base.endsWith('/')) {
+ return `${base}/${urlPath}`;
+ }
+ return `${base}${urlPath}`;
+};
+
+// Map RomM's native spec to our simplified app interface
+const mapRomToGame = (apiRom: any): Game => {
+ let coverUrl = 'https://images.unsplash.com/photo-1550745165-9bc0b252726f?auto=format&fit=crop&q=80&w=400';
+
+ if (apiRom.url_cover) {
+ coverUrl = getFullImageUrl(apiRom.url_cover) || coverUrl;
+ } else if (apiRom.url_covers_large && apiRom.url_covers_large.length > 0) {
+ coverUrl = getFullImageUrl(apiRom.url_covers_large[0]) || coverUrl;
+ }
+
+ return {
+ id: String(apiRom.id),
+ title: apiRom.name || apiRom.fs_name_no_ext || 'Unknown Title',
+ system: apiRom.platform_display_name || apiRom.platform_slug || 'Unknown Platform',
+ coverUrl,
+ size: apiRom.fs_size_bytes || 0
+ };
+};
+
+export const rommApiClient = {
+ get apiBase() {
+ const cleanUrl = getBaseUrl();
+ return cleanUrl.endsWith('/api') ? cleanUrl : `${cleanUrl}/api`;
+ },
+
+ get token() {
+ return localStorage.getItem('romm_token');
+ },
+
+ get headers() {
+ return {
+ 'Authorization': `Bearer ${this.token}`,
+ 'Accept': 'application/json'
+ };
+ },
+
+ async login(username: string, password: string): Promise {
+ const data = new URLSearchParams();
+ data.append('username', username);
+ data.append('password', password);
+ data.append('grant_type', 'password');
+ // Ensure we request the explicit permissions RomM FastAPI needs
+ data.append('scope', 'me.read roms.read collections.read assets.read platforms.read');
+
+ const res = await fetch(`${this.apiBase}/token`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+ body: data
+ });
+
+ if (!res.ok) throw new Error('Authentication failed');
+ const json = await res.json();
+ localStorage.setItem('romm_token', json.access_token);
+ return json;
+ },
+
+ logout() {
+ localStorage.removeItem('romm_token');
+ },
+
+ async fetchGames(): Promise {
+ // We use this as a stand-in for 'Continue Playing'. Fetching last played games.
+ const res = await fetch(`${this.apiBase}/roms?last_played=true&limit=10`, { headers: this.headers });
+ if (!res.ok) throw new Error('Failed to fetch last played network data.');
+ const json = await res.json();
+ return json.items ? json.items.map(mapRomToGame) : [];
+ },
+
+ async fetchRecentGames(): Promise {
+ // Ordering by internal id desc is functionally identical to created_at logic natively
+ const res = await fetch(`${this.apiBase}/roms?limit=20&order_by=id&order_dir=desc`, { headers: this.headers });
+ if (!res.ok) throw new Error('Failed to fetch recents.');
+ const json = await res.json();
+ return json.items ? json.items.map(mapRomToGame) : [];
+ },
+
+ async fetchFavorites(): Promise {
+ const res = await fetch(`${this.apiBase}/roms?favorite=true&limit=20`, { headers: this.headers });
+ if (!res.ok) throw new Error('Failed to fetch favorites.');
+ const json = await res.json();
+ return json.items ? json.items.map(mapRomToGame) : [];
+ },
+
+ async fetchCollections(): Promise {
+ const res = await fetch(`${this.apiBase}/collections`, { headers: this.headers });
+ if (!res.ok) throw new Error('Failed to fetch collections meta.');
+ const collections = await res.json();
+
+ // Concurrently fetch the games arrays for each populated collection to supply UI with hydration
+ const mapped = await Promise.all(collections.map(async (c: any) => {
+ let gamesItems: Game[] = [];
+ try {
+ const gamesRes = await fetch(`${this.apiBase}/roms?collection_id=${c.id}&limit=20`, { headers: this.headers });
+ if (gamesRes.ok) {
+ const gamesJson = await gamesRes.json();
+ gamesItems = gamesJson.items ? gamesJson.items.map(mapRomToGame) : [];
+ }
+ } catch (e) { console.error("Could not fetch collection games", e) }
+
+ const coverUrl = c.url_cover ? getFullImageUrl(c.url_cover) : undefined;
+
+ // Currently extrapolating that public featured collections represent admin
+ let role: "admin" | "user" = "user";
+ if (c.name.toLowerCase() === 'featured' && c.is_public) {
+ role = "admin";
+ }
+
+ return {
+ id: String(c.id),
+ name: c.name,
+ ownerRole: role,
+ games: gamesItems,
+ coverUrl
+ };
+ }));
+
+ return mapped;
+ },
+
+ async fetchCurrentUser(): Promise {
+ const res = await fetch(`${this.apiBase}/users/me`, { headers: this.headers });
+ if (!res.ok) throw new Error('Failed to fetch user profile.');
+ const json = await res.json();
+
+ // RomM obfuscates user assets using hex-encoded IDs (e.g. "User:1" -> "557365723a31")
+ const hexId = Array.from(`User:${json.id}`).map(c => c.charCodeAt(0).toString(16).padStart(2, '0')).join('');
+ const ts = new Date().getTime(); // Auto-cache bust like official UI
+ const constructedAvatarUrl = `${getBaseUrl()}/assets/romm/assets/users/${hexId}/profile/avatar.png?ts=${ts}`;
+
+ return {
+ id: String(json.id),
+ username: json.username || 'Unknown',
+ avatarUrl: constructedAvatarUrl,
+ roleName: json.role?.role_name || json.role?.name || String(json.role) || 'User',
+ };
+ }
+};
diff --git a/src/components/CollectionCard.tsx b/src/components/CollectionCard.tsx
new file mode 100644
index 0000000..f7c952f
--- /dev/null
+++ b/src/components/CollectionCard.tsx
@@ -0,0 +1,44 @@
+import { MagicCard } from "./MagicCard";
+import { useFocusableAutoScroll } from '../hooks/useFocusableAutoScroll';
+
+export const CollectionCard = ({
+ name,
+ caption,
+ coverUrl,
+ icon
+}: {
+ name: string;
+ caption: string;
+ coverUrl?: string;
+ icon?: string;
+}) => {
+ const { ref, focused } = useFocusableAutoScroll({
+ onEnterPress: () => console.log('Opening collection', name)
+ });
+
+ return (
+
+
+ {coverUrl ? (
+