From c16ef67ff971d9483e7143901bacbbf61def691e Mon Sep 17 00:00:00 2001 From: gibbed Date: Sat, 3 Aug 2019 08:12:37 -0500 Subject: [PATCH] [App/Discord] Rework how rich presence is managed. Updating rich presence state every time the window title changes is a bad idea(tm). --- assets/discord/app.png | Bin 0 -> 56007 bytes src/xenia/app/discord/discord_presence.cc | 6 ++--- src/xenia/app/discord/discord_presence.h | 6 ++--- src/xenia/app/emulator_window.cc | 13 ---------- src/xenia/app/xenia_main.cc | 28 +++++++++++++++++++++- src/xenia/emulator.cc | 4 +++- src/xenia/emulator.h | 3 ++- 7 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 assets/discord/app.png diff --git a/assets/discord/app.png b/assets/discord/app.png new file mode 100644 index 0000000000000000000000000000000000000000..310bc047804d405bdb77b79c017cf733868ccb1b GIT binary patch literal 56007 zcmc$`c|4Tu`#*fmSPN0gnk5y95VA8W30aEnELpQ9LYC}iq)1sRvTr5i&K6n25LvU! zQZXd^GWM~|@|@S`^E`ijp6C1f{r-6FKW_K^nrqJUxQ_jJAIC8f*Y&Tm9OO9&K@f|! zmWCk&(SrY^g&66CO{SL`@Z-6jYh_k-4uc{ z|K3|^Y5iAwRoxXsn^pI41j<&1XZpHIcMxS6w~ao0_%MYP+z&y+QIZJie;}#LG{|IhA#{tF2RsBZtd|I=frME-w} z`d>a4q<$BI{`W|rg|?4S5BNVlW}k}x8PnDGAO4R_Fn|A7@bBOMwKrjd#;;Moi23_< z!M}h1SC85M+W(sRsQM_0SeH1W*x9r5$FMj`PlpRTJS>ZF&m6q{m??2DH+1lFjv9q(w?};TdxsWN>+L4z0@~-C9w9H{E zqlkTiDo;(J+g_c%%wqlTLvvHEfkA|-OrzQVia;Oj;~BK=AM@TVucmB zKGleF;@Gic+`YZMk{e!=6k)!PA3rk4xeTwIE&=yYkJ;^gdGhMm2k*VZGm!+Q3kSq& zWF5XGA`c+Vn|%)Llhad?OQvz`PA6T<=q8xB-6!HwSze^3)=Yuh@RNHC`y850>7;yD zR8%Z|r%$;laG%_LpKbf5o?eszIqaf2)4of^Se87PY?f?pY9cBN(MFMls&RrV8^tz_ z96D^{4uuEyW2*XH0}_KXU$CU??t&bPhPXxbMu1s#{e{15o_&*(lk@Y{t5@Z1sEiBt z>y+yE@86e$w}^fzSbx3n*xy44`Xq+I!9h)bm2^kFpW9f|OP9VB0+t0mUH}mrW^+$j zCxyk(5v%Z)vt{qf#+SiV8lEj;=z5o(UGTE| z0n-rsK8weRDHO5i&z`ks7m_QPfLe^N@9-zdICe?OW;T@3?Q@3l2Nq2U&yFU$9j2Gt zeLhRBtluIMiP}eKE90G+_i6b;8bB8hbhc<`VQ21-Y-6>r1_lyUZ&$dI#76+Bu%QZ? z%Tp?}YKiw!^hqZrehIF8?d$7P+4+|6U};|^)GJ+x3ty)@y>+cG{H<)!Uikn!MZ;9vWq{r~z-En}sy1L)6LxmQ5|NP(lGgc1V zUfDA=G$eB!rjH_5Uqha3(TqN>X!Z!YywmyDJS)<6SrZjKr`_K5;@Dl*l;tI)&Yyp< zm#!M1){JM^XL6yFl_g7TrMZv!(JQ^$z zIdy6=(z?dVEt1Ja^30j{@q+bb#KC>OsiOg*eg57tE$b>Nn`8IcxC8_!gr%Pq=wuw< z{t>eaos=kUZtjk$$Gft;8*0vM!)BJ2=~qJ4_m#hgla~_0#38=@vU?^VPR|b;N1Ljz zr)Pot^^52l9J4Rv%nCWm(9F!tP^<6;ZOSTnYSTX>^}KDfTN!gGPI&(!#w0%Fhk<7$ zBwXEq4e5Fai-97`m=^ZhmgiyWCKoY8J`iI34c6OiRYJuB9 z#OVEF>azi{j*gDquQkykBiBF2woE#utN4{9JP6r;oAH{#g4={+c_P>ty-$2B$kLJ$ zjvm3k?kP239_^>Ct^INEW$AY1f`(R781~JA2n=06N&2+e{MQVd*y9{ZM~)mJmj@7*W7dIhqFRow zmzP&f&~UNM^FMamvb>WkNBH7v)V zcJ21hu`%+YW#GVI&My8Wvc6VY(Q(@FiDZ$A8(IjuLniK^20hr85AQ!AuCR$Kb?k2W zJvm9x=$U18yU#Y9o{%8_Pq4_42X>#c<71r^>jFZ2H9lc@@%NoOwzh;KSUizTv{ZWQ z?SK6EF_x5`UiZuht>IO7ar|0#c6Q?h_a;?ZNDz>L*#RDTrZa_Ll!p&a)jL=H=H%(q z_Wcu$;kXvk-$$xaD9+)m0%{iX)ds~cuV{4h(5hYVo*y^^8z>xJtrPG6EDzG0uf(66 z5;*+Ena%ee%%M|^?(77vea}Tg0}+{;nidYYVOw*K)t(R*o*rMD>cBRV=&6LLqnz&D ztJYg6o66`exp76(ktUT((c=%-0R@Y%wG8`@;DF^678FEn_^NalD_#*$N=Z!IP8j{{ zgHGLJqqC zyM8V*GI9#|&nE%w`zQ3I?ONS1H#g@vcFa4nQ$+VSVNbxa*t#Kxi<5DmjBYtH%@!U< zvB~>Pb_RB1?J8H_R#Q`xw-!(vw#Tu5OraZ@!T6tlPHWX}db&tYAo&g)IPkf`b#&Ks z*=k?DN_n-lB)+7iq-#za3>6X4(XIvW-?zp=gKW$8`%g%`S}WQdFf=9!$i=#Ulo1sb zO))bwbDgTArwVtx00?GneO;s@53S6rHC(^2sdgTi8Sbw2^MK=2GN6w@GTlvIzmmir ztp*ntT^!F#O-)q<@0%XLM}2~=E0-MF(cbQn?Yetf?s>7Pi_2orhg$`^^l-F50u3ql z{L}i9pp&){#@M`fLRaI;m0BhLjoHKCkY|qIbMTnpaX3VN|4uSn$Qn5+#5`A7pB8?I z&mYxILwyrWX9{JZw6t_adW?0VYjRb^$ijk8lF%fW&ay9;6u{D3h2}eYd7)$7)2!Rr z2O)EFb3U!42Ta`{mLtG5EFeCXEt}3~#FS3ZjJ40Kt5(~!y~6hk?n{2$jN#Dn?dyhy zedT~mL;??|Z^?h`dvV`~RL%{cSDGT&ZL_;}OyzvkXS74>N0oh+iKqU)Dm3X0tXow^ z##1zkj9G?7k_U@Ku>P2e(Z0tNP6y6g$pPel0&)-3W71yJhkTIDY+k3MGSj*bq+4&_ zzCEb8iE3zOVdN_s3b5-+RYc7w(ol70*2kg$M)Rxg@~4BM3>NCxFwrU{B}F;Z2wk5@ zA7U^#FtF`~WavIaWwyGO%W(0;wFeI#P@ZM>3Rs(k)*Cg3vD`j$5p&!37J_Q@{sXga zaNIWZA)ZY+SO1GXchgq-1bQ1@L?6ipe&y^n##<+=&E9v^g-SH|_A!mQ$nW%vWy}c`7aS zX(^Nw_V)IQaLQiNhHw{!#Ul@A?CBZ%#|RY^6yW=I#~67?h*={B-Ub3vH=DcTygAp<_#v3@jrJrTaLn5spNk;;ew;TZRH~QPRZ`pmbcv;@V z5b3m%(r)&%XU~{fwANhcsSmNq@7^x4Ya`g+xpSyw2eN(&*HjC@QgEG~JXB&XmF@_b zUB51ML!V^uaRRdDDH_`Q6Ui+T+_Ap@fWP(L)>1~i|IgaBZpV?kkko71GX{UArw6s` z*Lc!Lsl4wgGopwI>n6Ss@-CMwse;Bi;LM5|x@8%udVVgf)6>-@c92PXC|$XIhgb7p9er6}ze^kl zxHzI^($9Z>An(RnB=5IUe)wI~hi`v=xMZB|x}~-=b4ZREa><&~1p%o8j@;dWR3)(a zIa`#UFK#?%BY*2IL}IdC%`V$bbsuYfB4$cymWlT~HgIPRza3b2)ntRFo;Ot+FsHw-&qEB)L?zS}N3^mqF;Tb( zG9uGx5^3;fX2t+y=H4}zsjpEvHGtLv z7W2yMbMWgcs*snSx%n?_IUKS`q0hm|nV`dFeFlGu%CcJT zdDPwAjX7+rCOW2skpV-#&zAV&MX@KYE=XVkq<=szf&(d(l#-H?`Kdp1N15Cpsho@B zrNI3jSc|NS^f?AwIflRA-zZO+ZX9wy@B^HBMCIn zy0+io#MkGX6bylr`c;V$xT0leXQ%uta!ouRQO|eEIzR<5=ozhh(X<6UOv1P!NKvxW zWp6a^m6asYLq5+yMd{NKe=cLPcK?A(DU=F(J3H|NO?0lQIt}KtlVAm?T8wBu*Gy8` zUQ@R!PzD2P2^0E_d$y-XiT0&?dOUHDU<3{!o^q$UDGg(r&krxGw^lSp%u?KcI$%#SUJ? zy=rq|2yHsAig$d;1U;>E2Z0+Dk}SZfz*qe8n@4XZp0{1g?pi;_Q2}APR(1mQ04Mh( z@Hb#q*Ps5B4)RQ=+ps91(YtI4cbcBA9?`0M<#QJ1g7tD9Wjr~VCu6`U0o0Vn7g9;A(x5hSXrH~G$V;2nok-5HX-1;7g z^`i+mM^jE6$fG*zYD`@?K?1(22MzFrPx?j+7fdsekbkT!W1tIMA;tT2tB*BMbzI;F zz~E-ysd-X04+>I{kdl}8$)QCQPFOHwz&#t}Jc_+pjHq{#WC<6zB^*R-v@4w2n1wZe z=BAq46Eg|`cYL(@ru|hzY!C;bS%V`_UHN1jbnEmpCsbMBa~`{{qpmMV)B^DA9gzlN z?xUJ@Uf!JC*btQx5JH`5Pv-)j8TqNC=jIw@kd=Ycpc;qlE{J}k-M^1O<48wfNz>QZ z#x=(#sNb70AW05Y>u}=<2bpvrObQ6GDpWm{0T>F9XC-YxR-AwPXOQ@uy5D?}DjLZD?ZQeZZIB|Xi#4)P{V!*;!Z2+phQk`l$6reFIymBsYWOtR@ z9vz0P*||BlFL`@=*VHV8t#mP{Ly)?H8<9a)RyOb_o`7l<0?&BLsr&oy@~w>p@Z!<% zF^?yw(RV>Qm^7$eB1H>5rh)UPM|4cV8llu{9(U$Z;K-927xyXZs~{x!ORMU3fTiWw zQ9l98mTIbFlLHkIoVV$y+A%#>2e&5BHnp_iNKnNxZ*s(Tg^6buxj5rYl zfk>vns!yN1Dr-&_Sr6kLP3<0jy{}V-)yZ>W@uE5Ri1_Pv?%S)Ty)zy_QhVNZ4 zHK0BLij9uuXugzl-ck3(L1sQ%otT)&aI46Y2W8;8(^KD z?_5_;Fo zo}QkLefvHxL1`1~LEK)=Gc*|fA_RacLNrq($S;e7NxPD8IS6iYd*dAnCvIiYFP;E^ z^%ks1z}uRDgrs;70jnCQQl>mTP z`2bUSsX7v>w*;D01?Mn+1lBt&w1BN_4sx!)wy)%|)+Ag3sEtj(;ELC+TY~`e{?%m0 z2pB7px~xbhvw zJpd9AQg%!oa5V`;>a${Ev7e%2z5<|YHV<~V_o)u|R;wA4ATU0*bLY-gIM~_AwxTj@ z8oL{YtRjKEDd4WtT939{=)$iE?#e)8rjE*V02yQPHmhZZLH0!pCHy zgcD~Dahw9*ENX4I z8~}sBAo#-uM4m>wJ2}m{&vorR6XQ5Q_G-DkDc^#cd9d1)LME*;5xcud1kW@)W$O|} zHDMR)_gjy$evNdWb2mU@Q{G}8U(t5HVxtn6a7Q z&w=XwI&;gBQr@MKn=$((VD?CcX}ZM?)BgNDixxOYJY4!w1b}v!6`aRmTpmV;%zftZ z+U_b@!T2U||AvU$bCBv=Y}Wh5IeiVgqrBG=4T5uf{WkR%Ul~`S8*em3N6oU8y@c-{%pdS)p92xgPHa+cyyZ5@ zN95ti1CEH~4BT3by{05HR(12!Npj~X2C+XLVESi^UR-`g1R zQSz_Sq$qN{oPB5o?eKlv(V*lITNKhuQ1m)CDp!b!EEi;zG!Q}ee0L5O!)jmPp4U*&gQV`EJxo5b%$~Vg~3NNNzRA4WKLzhbw@42BDUuY+vwZQA)!g8s)U|}q-*InK1?Zk zKiZSf^^a~E5b%D>WjdHC^vKCJ9i}+0mlgw)^dYdfPKL{D zC0M5)TV!EDV=KA%?grT9?6kIT)U+q{fXuk!YbAA(&e*giBzs+1SoT1u*dd`vqF`CHrLbY*q;Y*4- zRNcp!x#p_rc|z9d+sSyPkJn-zSefERuogVT(HRZlm!ddDl_xTcX5<;1o)fO{=d9|H~j= zemj<5=*RF&ToCRls9oGP=f7L!UKCV^pyGBIYEJ;JILwUFGdS+ABM+#swCR1;wMl2P zlFI)2{L26a3+24Huvg@faPAxTf)1Jpg6MHt)!c!ZeBg;vm2^!XRbzI8ROE8i^kVEv9`KBjzf!SUvDwqbK@Z< zfvD)^;4p1yYB1VVeFVH~V%-ilFphX_e#CO>^jOT>K*NqIsq6jPqY@H7IIV+A?PB6Q zyT{AS?B)(1F3n5|XdHCNEamrp8>Tl=v3x`=qsXcE?G==rIV=UKSAzwog@uzw}dE5-sd){D8`|M?5f0W4F;dhTdU0>@~Ju=MYfgK)| zy6ITgBH{NMS7YC)YUR9Qtf?LIbrK0cmq8eTZudV5#IW&wnv#6@q-JDpZ^lnvI{&oy zsY)UaV@9;dmBHkRE0PKzW>p%9^R3Pl40CWXw7HGOM`2~RQ%Jt!Nrl}HgJ%X8UeJfc zbS25maDploC`#=;;9N3ZDSfi230(TYtig#pJiPMpMKkYwc=k<=6fKWecW<<#b#GY{ zPl{5u;+AGhmHnGa>NhxpCvAoVSL|F}T|t8o*uA=2>Mm<j@ujbw3lT0N)-~P+j-t+cVKC^)=2@T}j0Xy2 z`u$5mTj5Dd#3l1O*@HyKOfi+`F2o8+b&J?ken*d(O1~!DS}ZaCT+;9xBVM7&u=StK zRV+v=aWS!umozCICZ9pBfmsGwXWVW{MnLUYi(ggPgwq?@gByCN*1J+fD=W-Sr~XaN z3xx0#t?6dxljQe=iW9t7Qz|sGjn_UmKhZ(zi-?H0sd>%z?3uQ}rxm)Aiv-jHeG3K? zRt;I!BM^!*_PWE91I&|H&#zfb9Q~a2EGZ$6-;O^;1y{J@7X^&a0})**2B9dgXCPO~ zDKD2Z?2tF@htIn917Pr+pnr&;JpD{w_MrGZ_d6UaEq9KGa8IUxOmR|jSb2(l|7#?~ zngwf|!0?NsLMgp>A(heX2-ew4kylVm%sB)!j_vL<0fm+D0?j@+rE1=rc*Jzj%FKH5 zYL+_fG??H>aM68LCC|)@pW_ZNwthr|HIg?NSD5n^!#@k!G?2x*J|IpRqo&ziLUp()@C;cWrMqC&%r%BAL@utKKder zkwi><-oc70D+i&+3cHj2uq>(*~LSmT|P=6cQv7$F`CVmEEDJLw$7`Y8< z*i}9L8JA7G5>%NZnekBN*lnjn!{MEZwUgv;@AWI_J5Sx6e7$$NFQdziJ7~!T6z=~< zM@LtbO3;JeIx{Hj_!0+0SCJY;adg`cv|EOu2*c@J4fF@wp0;J3BkEb~U&ImUdF*H>{`hwe8g!G*3j%XVkJ2XmhT(vwBTf zYIE~y3Czg-t>b9Q&A3Z*Yh4B4)wV z7Eon9?u%VpTeC65ZVE}Bt1P@>y~PaII=eKFuU-DM>zLZwbSHR^Gmk)sb2}k59e;#V z)M+iw^<9_1paV@)bMsh*LuYakKpO!`mu2PUvC3dvfF_DOzNKfd(fUuHV%=%?4jk)^mGQ=y)?-c@)oud+%VNWD96%CIxhFx>FU` zvzROyb|Tp0ix^ShoD7KbhYM1Ub70nh0hIr#DS=eNQwrmtb1|^bP4>GEQ}9w2`T*OFz&1C;4hPVa{w& zR>Yx~iO8>8w4T764U%&kO28H0bpWOsq^pcv3sr~1?%kSyAvlk|CeD=BxU+S!^wk{uIm>Fj z`52RB^Kqmv){YVxe%IH@L;c=hmi|Do=(|0d1b$9mc;e+5eF(6k$7iOnIXTTDo42}G zUm+~r;%|wQ5X)I8Oc^`U@>6w#ncW&!GAZf!<31(I+o=iDSI7-(b87%Q;2tgxuZoty z7|QI$EG&S8j>+!QNc1S&AHLaw+It{(PL3WCU#?wRc4dp?;OU^Fx+7+8dotHB)xBnt zeB9FhjQZ0nSFct?^U6!;iTv|19%c@cD8G>ZIlse`yr45_W}j%XSpPqb4bj`4A$TqPYkgf z-}D#A0JTE*r_|RM)POgh`RIcmi)jYUs)+%CS<|30H?xx|=Q^f~7A{0>WLMz{XV9fZ zTfu-;@yqDFj_BMCR{h5!Av3}~pIMLwhd_9)22RknfED0J6fnLbDk&)->}@2uS^{0V z>71r4HhecKD&ZW_Gu>Ti(qpuAB}(!IHi`dObJS+aC*$C&jeh#bpfkV&TJg%e5``9m z!L-A$vy)R5r~|z%XeUV+%Q@C@QB$$ppaPdb7wwUBNdICNc*9+wwFpxmZL z`vhe}X9TP*L+f*M0D6v9+Id!sV1(-DSAzk1y=@5h!$2F8q|t}YVscB^SezL-WhzzI zDf6(DTXfXW^=(RLrE-^t#cql@4SMvX{>^!XbRWzJ5CXL^zPZY>$PRS&mfS8cfcArL z-W>R#vVoxSjkR+bw@U1AZE!H?P~P>_&5X{3GqN%%p;5{cbxikn+mj(ulVAqO49-cw z3=k434jWX|uI=Xl|TxH61%URX+60vC}K@YuNrH%IP> zrbGJkL{3!ES4#7aYrxnZ?D>2^Dqgt*MpEKLja1f(a{Vf4==+=RH_j-Y-!zbs>-lam zCa}=I>Y984tpd8FjU^hReV(ZA>pOL<@~KcTzUNh{U?$ zCWE;b@PH4jI|nNP6(~4>I?*{E z|G4I6lgySxGja3hK)6hU7v;Q424=;HZQDI4h-6?FrTVm%9ti&oT(-X(Joj>q)g+!p zFltK0R*qKx^~mEYw?lz9e{A;}as<7(~5UzhafRI~7LMtigAR%okdlNn^eBtg>A zrq$>nFA8(|W%b18&!6uN#h<&ab`^HM>S$LoF8<}qkLC+;zEU(3=g$eA&DC#5Mwckc z1om?!(g{4PH@Nh2GGm<<=ZuPcxY6x@O3Eq3krm@vg0K_?#lV|WKv+F9)W$SuqMTv1 z6=e4NO;a}R6(aAxE;)4SY=GunIf|&Q{lE2|fki<WK+-ry^gJU}!?7?Oc8_zh}4FxYT-&oK=!T zC-)W{cf0&e5QmU$iEkZLc?w3~H|F}$BF^g}i#Nb&wRirarP!+gd}olv3|(Q(=+J(E zb|cTAc)4&~&!kz;2|TrU7>O^FEW-T~3Gnth308c~$a2r7Ns3X2%i5(b~-Tbs7hPClFnS7v*%3QhHxhh$xfF zRmdv=!1cv&4h#xH1hg@{KUc1qx=S4r# z-Muv*7^Gm<9U8Af2x^Q#BF~;bhld$X2XFz|RW$E8S-c$NT)j@$Qx^MYR-LD+OTw{q zD8S-(P%I&Q`i}`&xrUt}HC@CSa6w~6a$FISDerYkSeWchSRNH{MA0Cj+4gBlb$))n zf7GcpLAsu$envFNRDNC2@smvD5BT82V7PVpM)ez!UY_gYpO;9hkz?&?A$yNzXfR`c zz~In_!op}rb3sPX)8?fh;4wQ**s<}aLziM%*rqh>2NlRwSBGiC9=)3lXm(+=Gu=>7 zKRG&0Dm}EGwso;Q4Ba)Uf7Ab;yN~3cp0)=e@Q|>55SnT4I2%;I15%7gIIjY&zAhSe z^;V}SzqTLh{W5Y-Mo||JeG6x85H@t~ww;eztKGU1i((npXjx%~daPKG0_i9;IR=bk zAVIYSx11GDoUn0(o4^|nP1OTKCR4!huw8~j=x}x?9!kTPC8Q9) zk4g4(KdZzeHk1{|m2X|Ye!YMpcrmCxfo%*7L^$8OM>G`KP+`3a1tqYId%yK?R6fs? zJaXot!#eg;XGD7vck-3-;ynGuCCT;LEr(c?Q!qE<;EQF}`eOPJkn>W8KianB4l^8v z)VbzoXMF=ekpoZ8K4TEV1fQ5(sF^HhF#I{9VENvb_#C+Y$`^sSUcYskB-+5DT8(6j zUE!tI!f5VaKcUEDU|!eI&(AOZIPD<^0}W7bfe|HmfE(_FtI#62UM45XjjeVEN9u35 zjS;)u9ty>3K5=M}_jt|zv!{#jm#4jY~dcG-N4=C}~tF>^jGf+`o_8-h zrg6#>MK&ahEq?AL`91g6b{QyB08Dwz{Q2_@^inn#lYk42-rw9vGQ{_{Up|Bp(~7O1 zee|U7)JoOLPoe?3Ct^i-lc>DWq+FMbHoVn)JBy@Qa453;PcWVJ^WouPniP3AvdRb? zVD5l16}&DOGZz6109n%gFh zCW%$`P_ot>23r`>>Hpq;`&&*B|WL7qRA+y1i67Gw>jF2k1=JMn6z|->%!KLi4Wn#_H zkgs!Sy)A&Nk9n;4(gjEXCzb)mLqP(mme=hx{f1W1Mce=3#!A(zLQ;)#a@#r71aN+g zZH_TrDQ;E{=2loC)d{d5kqGDhT%1~<0rm-=`@dG(SqP6us?T&F4aJUA z@*7E?cdUM$wb&I4Ap55>oe(>-rcH=cm_zUpJZtAnD6CdsPba4a*kg2Qd%qSqhami_kwJ z+SBzx!MX7Y*dYl9K=R|yl_mgQN!)XDLtoX@Y(5zAK5aS#38|{2y@;wrH(w4akBBxM z{;iP{xwM0m5cyu0NB9_mU(KT&68Vzwr4~eZT~-Nr+MD{0X{b#BYKs?c+wcoPY?qXz zi{GDk5szC)p?IPKWED!tNe2Hi7JKHp1&5@uU?>m647`mXHWpzt++UDR905@a&aBR zK^1tc$|*0UO8${18tP#ffo|w~jS=geg3c&+TosO*-Ce_?0rZIER3K&`ESk_^$Wh(ABH&&HVkRGSfW0?bj45UnJ=rPjep#2N%a{UwOEY40N=LX1e)+{iKX^P2%RJKd>& znk4+5bOv&M9V3^pTU0&<7Vm!I9J(+sZ?$9WE@OZO5*o}QI*(q{)zv*IuL^NVC=IUO za`C>Cz^6=^MlZ*z8te`Ah31=yJappa-IeHDefs9iXMpUxh1SE{Pj(qzGJ98$Q2Bjw zI9R&!h#aW>^q`am^L+kTf3q@qBu4vRzZOLiO36-4=km_nRm)mhF8$&+`1U-?D`P%` zHZu{S_6|HdB>u*}m%6mHm_%RVa|*ICkrHDnR@EA z!b|c7KY{D1L|xXkDEdb7fEDs|`bQtScIj!-TWJ|3nR?tiBnVU1r4zbA_v1{O>PZB|TZ$;`=Lj zb6@=ROvYtV`SPPvW9=5w$>$?*hoIrxdz3$LSyytEr^)gqgz3D92?4k5<;i^>Z)U(q z39>8z#71EUznDk)!Xa`tHyXzRnFP*ffcdG-)|V&o_Gm3g(1kka4|;>Q+#r4=+;+r? zh>ZAPZJt3A7orV#dMN+?24NeF^rN-2P)Mj!J+%JHa}Lt=X>0ydybxrrRXwEkc)ba^*7uQsyOTV@q-J0A)-G0@H2gN^I_)pa*!Qjb5R%kp?n<^?SD4ohZY9 zCluYg8tnK^@(U`J(drw3l%B1lp3*7m-j{EK31; zy3u7tGJXxfHu@m?5pRJBA3l(5qH(nWgqD$RkZj8HDY%bcmKIs>jsrcCHzJgeBO#g( zUDhN4Mt|};$6;=H6)#+XS3dh|BM}OJqZ=EeJ}ya61g`g5^Ht z{Ge~c6@ZYZU;$)VObHdszyfgAxaiwnq42RI zIwRJ?{njH$`CXE=ELIzuT_9v`h;@LG2Z`|46~)GIv~^)igvVFOJIt*7&}`8sN~*d@ zfZXnk^M;QZ4{7Out_EWp;an_I_QiNcz$rEpU+0L15o=*+k`|F!bT^{}o&jCd3oE_~ z4pZaeRB#^5w`w!*6!C=+>H==$NhYvga%Kv>dJT5wJwdp1+7_da7q08L=c&<*t)fqW zp{!kXc)qo{xtX;@5rcpMJ*=4Xvon$}#36jhqZBq@` zSstCXJZ${oRKfrSi4OJoa>yTa`taGr40v7au3}`(t6DA)ae-dG06@2RQpHGn=mE(8 z!9?uM-%aAy>*z5}w0+8@p_f*gXZ>49J5gn13r39|K+q*gVd0zyOFzo2Ue~rjTh_FY zHRjyy@<9D**X0QW9aLMqV^9FvVzsSd6umpss7VcbUFL~Abav`4q4?wPg?_|49|-I` z&aUR61Hc$q;K;UBOFGEizID)73ZqcylAM{9dL)MJT=1)ocjalFloW#>L9vu$3I(kH z6ktI^UD9F!_gWWf6A}dER2%F@shS!a6P$TShat?!MGS(8Q-Uav)Uw0HDgn(-M0lBH zyO3{>tYoCD!DW<$<>3fv(xw*K*4PZ=kwqZIWmf|Tt00sA^JunLJ!T(spA! zh~9e5QBusbh%;cbH0K>^c)d?V{NfgE!bf=_2qSfm%>*9nU03yELozOOqMJ4J$)UWq z)Zrjq2S$BTtv+bCguD#N3BCm;v$jbzjPleKL+WDU)@6V(1@JC?&@IfPu2oJ4lFvT^ z1EpUctY;{;{nEQtvcUoYMBwBfIkRc997OqN+P{9=W~b4XYousTves@ENjq5i%CJah62yXvs@f)+9_ z01b&;c}sW!kvj9*HUhz*_uDSYpNj_s#rw#OwbNEWaClFlKv7lHCLvp~PCFp2@>uRD zK{a22olCDZ2vINh1MdtELw1lS%|cm)!s8MW9NRAbVe;n^rR>~aJaGW3`~m;`!pys| zPp?5kW-j7$gZ#uMfCP-D+*G?l*)eG%lnXXi>qQx;7i+kF*KH-G8$4&4zo7>=8`uoy z1c1P-jk2)0x%z25_G@`)81#I1)UR?D1g^Jml$r5N@_kbTc7zyh9 z#j^;7m{P-p(w;vKoJs;-V7a+%SAC-4V0~E%Wuv`VZD+_K9Q3sb#LtmyZS;O=y7~$Z z-kD7R$^&3s<+H8TA7G+)MsJLhI``Sfxit2a$>6N7=@x%QaX3i(JR!k)FuM22YpxHU zWS#|9oYP~#HW0-EK#t+!kk5VchhN{5)S4{Fq*4JNA*1$y^jkdgzgD|_&#d6M4~-lF zouC82iCu1|-ZZ+d|r(-N=WFUvbNAU)Jx&u2L$=!3 z!W_T#Y0|(SQCoO0`7Ru@x{eFI0u8YGgGM>Jt6meDYA16S35)P-tT0-*^VW;}Ck%co zNU7aFR`Ub49JOreqLgbtQ)drf3mBWS(xmnOKw0iu4SuuD4`wNYW9*QSR6G1T1Fzx9 zSe`(41@)9S3$l+2H>3n1b&v&0LqcQ2f-5`i?d_*xd1>$AkaJeWvwq&IFp!&^a z@nsn($f}Ryn78hpdt30hPN+O(h~wzdn;m(S2!1>H8Vz~~yay|!Q3EF0RpsR?x;B>6 z!4io?9K(Q^%6r5{$23X;C2llmJFUk3N`gWm@ss92KO^V}twKjL1xzpkICaZwSsn_~ zH0amM;K(6$e2OtOV5I?jg()MKL0X(EjN#PVd%2TN`2i|;PQ4FXsvT3yr{*uB?A z5A{@}P$mFU(LYgk;x$Wk(R2n-CR7HPJK(O>m#b+R-o}FIFx^LxOeG%LSPsyepDByB z92^?r4TKbm|NZyu4QImT0UU-O*j_#(q!C`Zdi6v4r;g6^P2=GWEbwl?p9b$_1_g|z z)v2#`bovdAg~GMISF{YtlF1K~Z*d2QyzUC5RA3i1vW*{55VOaASbYGaJ$-+UjKg7G z2U}7G77;I1b)Nv*ggJs?vZK-JBxR%|C%eih3casodKcbsnEwyt9~GIm-tDJSV@RIi z^A<7^+szlNr8fyQTFyQ-4mbreO6by(i-*UW1p_NT5!2vIY=D2%p$hy6h4?@QiVMo5 z#Xy+PbHonI$U|z%LAx6`C;4C_6a`)Zh)qtewiLLlGJtp-xQ<$QxuUa^L6p?qF<9Qi zE49z~Y8E(1*QbP@m%b-`_Pz>12=hXg+Nlefh$0uhsgu>dT7Rv zY+lR-VB5pbZSv3K#o|C$vsI6TWc7tkobbkzlPCv1Ondg8G^V?^zULisHf1z%r_+Vp z&4Pp{qje=F(`kE_zFE#?l%Ywxn^tmF-3ePK`mv?*Sg?r02wg|^lpT7*T4+`_&r6R| zpm)X9k^1{iY~WR95gS@w`I8x|*SB4y>>CTpwwpK1SF-7HX{FAtV2AErEQQ`bgfN>}%ODo;ow}3^^X~@EWPstM0u@drK-|0~rg%V&ZV!kc%I%M;W z9lw2#!lx!mF~YODR7QP1)EC$Td~3)zu&UM|h>^V(8QD3_PuC;bC$b<~kS$-;YXz^9 zWQ#P!*PWgEE=a=-6p0b?x=d}>Fa6j&5E=^6a7dVMqh6J*NJ&DFh2jq3`yx{ei#?bC zH`)!i#INBdznV2`v|aa&hw9P1vTE9(Xgm$dFLb^#y!(28#VjaO|HKQyudzWpqgwR! z*ES&Fn^-Z+ICV+zlP0 zN5oPAPazWbuTrS1LJj=@ERZ-Q-*Q{oC5FLGm9|0E@2t4)YjGfs3esdccC`j}edpuj zbCXy6at8O(N|;Bb|2di?G|%ovgc|Q&!Gg(cf9mj zWN!5FZF8bl$4=TP#Jh$0N*g=d(K63u++8S1W|&axUp_6|SVMBu#P>+O<-!%Ck_w)M zas5$bv?-Pyy29T!?nLjdND31sS@GYAg-&^u4HV2L&#UB_zPAJQ>e9Ek)4SYN7L`^+ z^`)BBHLKZ(aOR71>gFImQDS>U_u?o5D-PgE|SGrJRzM|)B?&Qct_0U;J7FORW z@68_t&WCM4Y6>exrLzy3tWukS(3vXiJWTTnY=hYwLC@$a2qlC@>_nMPx|w)Psl|^B zC!UgNR{4aY->no)I|m)(XP zPW{)B+-5Js6WNfT$r31+hz;$ncyGr%tBkB@|+wYfxB(QSnwiy^NWK#U4o-g9E?d=Mr zfPjI4YR<3^G~ggf4m+A`?t9^Z2<@5(9O{PhJm3}P(Rz{|RJ!*{49o=MYPZ$SZ-|fO z=)Ku@t8iiegH)c+vjcn$&kFtQzE)O{ZbZo@BR5UuS-7F zPOTYka>~kWxfJ;!l>Z>Eh~HJ4W3PK89I*PUK19rUgYPi;5^PTggh^|S|999Q zu?gVP>&2lWO|Xgfi({z~|L-Tk)GeOb&BGMzTgTyPV4Id@W8&ZXK&smqH*;VvZD!=T z&j^h)zE5>Jt&sxjKwOC^PbT?qFoY$SZQfvp(Mav$h#GiB;6dMjSwFc;s9_pC(W8gf zO;~+0Wl|^gzsi(YH`}H6wa^LpSzsSV;l|kHRm1HhmW5BYrnTN<9!muGZiafW`oCoN zzP0iJrcD9TI_)5Yz0R@n%Eo4mrjMDhNcA{3>HYD(>Um(^Acf7POR+xS;fd!EoqJ6o zO`gvKoUi{d5ey85b68CN-uRyN#2jn-nDndl*!E|>#PdcB9w zYK+H$(?q>59dN|kl+SKF7$pA=MMg4U(ZGX|xpF#K<+N@KvS zk^$pDg|pR4ItM+BBerwxF__N<1+ocnDjwjL%GlkfkY>pTqD9Vo)a|SFc^#Oy&2;5a)}f8?vr%F(1l-^)x2*RP{N19-p?bNGw_H3LH$u+AuA`njp4+w4Z zZWa*m?Y~n+SUpo5-1_J-xYiQjV+CM=-h@=o-WiL<20u#a?_lC909ZJ|P$gKr}vAm$J=9vZJ{fX|R63j`Ifk zPWJvfzwZm*{g3J(>l6j^Do1*Z_se@D#?&))pE)=3G1C>^k=sXF zN88w^0!e`CS>Ly_XsudDQo*L|eXWa>!o#xcni*1x;C(-FJ(O7IWQHxwYX3bsw`WCs z8~?6m`n2)$uk+N+c1+jqVkCe%Ag@fCB3*&t_55+YwQ9qfVx2J{2=WFhOb=vFMxpK4CRfzWOc~P1Kx$s!^UgW+0^i zlw!D%JfY4qKH9%4Q1uc=)rNDP#HA{YdGk`~aBTWdh<>637%PVY ztHpG8V3+p(KU+YuOkN9xLfuyFq;Qe^o3m(G!{WA(JwTi(wG z6Wzq}t+o1lmAkUAm`Ab?FD&e3Z~tsq>2KgN&zzf`RV@^dc+E_h1zv#2E*CO)FnK?~ z#1V5E8yl5WzZRBsTGnA5BulrK&)8+mss0R{-5u_daPID#;{kIh$OCw}r%?B8xo{jy zVSj9B*jEY?8(VNKXtwY0<%>UR%ibn}T)78!#>1`}x}joXpef&?&KMBxMw6{pYd=R(l<-X%ldxE{##} zhHtQb&bF6{QCoqJ^Th2I$+E%(Q!HbDt>+23th!d3acLq_maG6sA>e;98Kesw8QD2N zYACZtuSio0U^qUWk6{8&{Jo(Yui<9Ku-eABm4oHj5zJv!uYXp2jIO#U{{eIl)J`SH z`nal}lX`$-shG(wE}Wh{o1YDF*cNSeKjUTqM|6`|T~aXpN z#=f-4-|%~E2^RI#*IhjQuC2PXtOI1Jf!e3tv}oG!Kb$1@X2ES&2z;lSf7N6pba|qU znt}0%abp*=MIY0)NKa8PMek`2_r6zYpygV}&&ujdK{6w?6IA!mdgf|mvd@ei3oz@%*-d|5s7FA;X=DlYmpXKjl;PbSXVd5HaeqR~+)M?P_ zB(Eua6h>50HkEY#ik(e8i)(qkh3EYXgN{%dG=ot<1(Hrn%LMue()iU2wLt?uC^AjC zaE(HGB)<#Ho6U{k6n10B_JjR0OEsuC0=VJ@@yuxVGH{p?i{DU?fR)kVN0GT*f{{Zi zh5_9Il8EREiW{A)pi3AHMMSypPH`x0jkw0JS7Un?di#ZzhR`JrZ)D=_hQ)X z8ie@(V9a5^GQP1Tf|+6=7&_p?UZ@YTlOZQ`m21Wr>ZJ*???nr1o?kLV#*vFR+b0<5 zfrPHpSQTWWW~$+0(KIkPrC&ttegcm?(+#NtNOuq0QU}hPL1=7PN|uABV;R-O0p4ot zNqvuNaVWZw5A2Tx?~218-g+*&-r3PzC^JO5OLU=*Atq~ZjErY4 z(nu7XqS0!bKaSEmcK)xKx09-xiPc5i#pVrjJPa$Xdm+|?mP%< zvje(RE~T_~z%T?0JJWH_Tg!w3d3d1rRl#)Vd3f)}tAYpA7cOvF;;-`CSA=rwn}H-n zvGm8T069{5A|ss^1Nnw(rKp{>1A6jDZ&&7r^rYr*`zRY5ulEp|hFP7!ncSoO=1pWO z$;C5YRpUF~>6T#iQenZNn+~tb;~sr@QY;Y3qqXI!6W36`hPN1>@mxcF&*&g3iBb@~ z@@`i#A8frDN0})l!>0TK!?#7)V99BSK_k#tmryP4@hw zamldMoza{&UL90HNXt|wE+Bt)!56^IXOAxt_`IdKLRV6lkT>F<%k14rq@AC zqz<|_!*nZc)+|N@T;Uj2&y%*6_$^FHRFpkj>o+*&S~QBlqKRjCQlz3weKU$9CMS65 z;ISIvJgojDEiLVMq`VuYwTI6kfhhNtfuHCLgbf7djS_=1Kp;$}(@m=x&h%^aE$HD^ z`1z8S1INxkY+*nUwSu+j$v^3NZIu>A>*_?m^Kp2b@%CS9)#`meIy=6;It@5m@;z}G zoiRNAh;L63Jl5XudUR-GiHv$@u0&x7g)iQtYa1;Xk0wM!NP!Sa{nU}0>Win-pQ zB68SGLkt zS0wL+Z$>4{(uT!Zyl-wsGh@WeJL8j3pLyLiz)^VfdBx&xpM!XVr?}X+&Qe;TGrHko z#gT$C^WPd_n~@5~F!qZL0fO6%44=G|8&vol{<~h8*(vTkB)|<$g0X}Y@399E3t^RC z=Q8=Hm{TjmotwC8o=@TZUD#}g9~uARs`&Z@@DL8oM9&%D$TMX8=g*&XJVX1R2esidqNh@yN$ zz1*e-mhe2BOkl(K=>+5w8e~ESH0%fVccRE7--{gooWZAfug9fb;m#mtU6X~Kt~9Bo z@uQc&=u7WLY0P6{rK+@!6^CMD?jaG)#czTMGIm5zD*+UCFo z^Pq$=CGoz_0U?PAP{D5<2H83|3~fOcm{?i+kd=V9X_$c5v`gc(e~J zkDoWv?M4kX9qMniNO-v?bNdhb!GMOd(=U@Bk3eB=hv906%dC%s_RvMU8z_hf;^2@f zO{=T;thrY$(j-2@ucQO~w{AwK3`-u)mJu>*Kgb<>q*puX*gn>qu8f%=eTXO12 zXbUl^>KQDKxFdZCfugujolTxlirLs_mRm< z#RajiLb~h2P$GH6V=3RAYe-`C{0qCeUu%maQd_{_#DBUVys8&>xcgXm=Wt>$tiguh z1p$sW4Gn)+S;1N*DJ6A=c;4a8|PVC8B>n!Qd8>04X0vGK`7Z2+!L z+Cpp%!@yw|a-yY!9>5ECUb237yqnw2^{$qYQB_&_xHf~e@)2jIQlBNyueT`CTIC$I z=3h6p&c6^7d7(u(jkOLk%IPUTwqXDClqmZa6poi_*{A) zr2;6Mj6DjY(wq^;FH{$um(e*fS0K(?o};s8YcplG^RIth=3BcxJ9n|ogMS*y5^`1H zb+SWWguX$y%Efy)ngQ~$fG*njjA{|8OJE|wEodW#yTX8fo>c6y{#=#1aSjl_q-WZ1hA>BLV|mhWG=S`7T9+dwdk zmx#7$elvwfk}rJy0WehfnOFA{w0?%DFc%A4YBX2fy20&?ePEU(%qP9*B2SRAv-~UK z=eci~O|NlU0)8K0o;ueYV9&dmp)ubAdJ~R?!swJsFd9Ibbymh@^9Qp_Oa1Fe|FczY zFm8a(D}CDtfgj~T7&=$K_GpOkGe>A0 zas&KhmaJ9LimR%rJb+oh8XQl}bE31@QnVw5)f(=t3}M0%OAIQ=_?O^-H9Z#_?ng=I z#Q_NpaGS@w?|(S_x9k7kM$--#Pl$C^W6G7Y*TAkaR%pEWwBdN`Tjppg{%&Qa&gS1&r=57;74w?^wM zjT0iC01E=!CR^5J+s_tK*vFjh&#Lmg=e*n19z?!ChP8)yq6iG54CLRlDL~qu)R!jDco1Y`E0X#4`7=}e0 z-?q4P<9eJoFsqQ3R>|8ina~(HHr&dix3jraA2oNtwJs`VJpZ^u!oUf-+tBjb>|}cS ztFT36m}cUGW%|mkb&V|zc%!1u(e;J~LF7B#hy+geKNF5$0qsXu4HbFk%btqCNI`8# z=&jT-B~>`qx!MRfK5p#x0wwzlGt zNdKN^=IPm3Jpi!xO2UR{F7j?x6WQE9>*G)6|49_mt_E~o@*erDa-+eCl+THsfrrNA zZ^eBojxc%0DJopoMYkoZEo}{)pc~==A)2jp^BC9uQc~poySa5A2t2R5$0IS~#cQ%Y zI5;q{rw0Bh2``dBKCm%z#~iJw3SDA4rb!{}aymev)key9BxUF3qJ=B($oO3iMQ;XD zF_GgPv>#gKSTW&gSeSv?Ib)1HTCv`V6yYkJ`C6%2a`MuG1%Ef{~x-M@cdkS8~eI{#>L<|VgTh;PDg z)6U9H30%Kf9)0(pV?mt?$v>nLzWH1jWwBbO&bhUdH6 z#=Vp`>i?BBr3*n0nM>fzhr>##yA$m~kfL4Xjv-hoUf8+A(S*P72&t(0F2 zGo3jo7#ucm{$X!sj|MIU${mP=5@fx0IMALXgCPipYMq7Zf7W0MqNO*;dVw+YKE7EMS_tqrO4p(vRB2YQW z&?`~LwOtUpsTkhKK#(y&163ySs*nBssE*us9ra5|A(eBSy6k|{>wj|2Z0}Iamg2d4 z^1XYwjuDM{@c9y@U+WrBp|XgtdVW_U^M>}x6%?!Cvj(SLI?954S05G&P}f(%eBghn zn<)7BDN{fDjkt}TIWtFjbSizqEb=MDRqCXU?82DxC{(FULQK{^C);je+EJu$aCbP* zSL(7Sm#lbHVjFTd}|vA1%vz zH}NW$^hl{|20Y!U!Q@7E_WrkFn>VTjC%nLIkbQjaC~b$kuXQD9n}Xyz=C15l0bNlC zwS-fnt?Xi=9&jih#_pAWDJb9%=?{_qQMzR_W*`E*?Xckdr+5--m$8Y!t(Y3`G$ya?%6J?D1dD`+nzIeNfxw_^`r z`-G*aCXxuzG<>0!@Pe8U{gfZ^B1S})IT@2gTUksNCaOY53i(`GbthtXhva8V_O=BM z`?Z8#IXUp4s^_g9?M5Xx8wiK>g3QF((RcsSh{kDoX7BDp5||uVCRVCX6vyrHCzjxv zT^QGbUWk8{jX4ZMmm2k|%=$yl?@B4TPo&ed`!@2W^wl%h9N?!8!DmN*=KAP4ALDpn zoM&Vw-*_{oTKSwk0YS-pk-0Xp+e;CiH}8l}^ZYdSPVIOg(rskVItY0W-Y(TAPI)c) z`9GOb6u0(nh<`PdD6yEVOCpwGgM^E zKvjRbR?1#e@B(|;CX?cLPV*V}aMiTG_Y|q~BpQBH-H-5uK-jlohIbRJEs>Om&z}Y+ z_3*9RurZvi$x7P2wQ%`h5jSb57$jO-C?ov>!u0WnYdTaVyEf(P(T82pg?3TRe!hLx ztrmH-hB)BvkM+BQ&-! zMOKDW7L4V+>%EqHyka_Pd!TSRhd(p1r zB{bWvr+K7AxZmH&bR}v9c3A9{>mmrjN0OP&J`X;?^tr2C{Dl`E*{r$Ln{vlztuX5T z>`p+iTS4wZtmj9F%RU5csby^VelRSqs_7Z$#S7h1x#)y&v(K+Q+~_}o`ShZ1N{=ar z3IC!zvrsTdmrz&)>ahMapDrDkdvG?b!Qu>|?lqdaL9HPF$Bsd1TkzPz=LUEn`TlcI zg_S3~GW~}r{AwTwtQ%R!|n6VPfW4h@8@t-%B1Me_H8AA!WcMn+G=||209gTu%dJuz8ourYTm9gE}ttwCfHpo#xWOEbf2% zHZf6x**-m85Ucv1ZY^A-9O0!B{qW{cZ-^j%#5}OGP2@092NG$lI+_=p5V-0Sb@~4F zqvhB%O4;i;ay$1+^^j+r?O~aCvUex_BUDwz_3x^??5eicb8kO0a+tv|zr3FN$=qpT+Lv zn+%y0y&nv+0mRUEIW3K3JAA{gd#^r-0Bt84>dL%4l@_?I|H9mboTiRwLPCR#wshP= z&|bK|)+17*H-C}Bj^v`yt@ipXdfu(Cf&5o-f;YHlN*fWW<|oE%HE{qBTd&=mZpqY+ zMPEMh*CUd0m!;H>OAy@emr=l}b?NKtXi|aIH$8j)ypSL4<AY12Md# z!%20%<~s%Qw;B_xl*x3dTdi*@7HNS{e^VsjtniR;W2&Pnl684LZ=}W4p&;m-nBnm@ zm+_C74ie5|EC6lf^|)R%N!!#!vsp&7Z1968rl^qeyV>Q;%*=dCF#a#+rA*bnk20k2 z!8RmuJMNU`9-E-ZU`orOO}}m$mfvbGdNG{N3@;xL(VOvo|200Ezwq7OFEg>L*RH+3 zA$9zI0lH;s#iDzPm!shNRYv7|>vINhGNz9cZZM;wY?ZsA_~VuiYSLd~1Z|E`)Kw0G zBU^5M{^@7zy;ErY3@1Jr&h?O1CYw7mIs5UCb_@(cCkEfCfHFN=HI)3fnZ_X=z86BrHxwp~GT;ls_EDFnK#Z z`drtpEyJ3t0$D<1C7Vq2X1bz7{V~mg#8!sS%$76veRsDCgQQ}?e-=(UI>QpQ`Wm$T zUQdcL+y(~71gyi&x9b$$8C%CJg!|(7P9&(*CYXS;V;0E|`E!BAH$9K%q4`*u#wm3V z-w__$H(*gZFv>i}u@GR?6u^67Kh&o+T4l&XdI&RGZqD-K7=CH4gG6#xCn);SRsiHn zx+7uvxFXW1%;HNK)-)Qwpk8!83a_c07xSf|aPX~vQ>-SAsD1yZJ4q4AScNqBm2%2c zSP&~@um<*{f4!|n{?wvNH&5Mn`VHpG+TPpiiRm7T5-#TTx{0i2p^R%|<5^C|Hp2X5 z8?1uNo3{SkV%>Av9`!CQ>s|Ejl`J~g-wLI?q*%SaE_KHitEN48gu+EWd$7wMic$<2G*Ie80x!c(!p;5;3>i*{25+GC0+N6t-{9Wlm;+`3&?~YcSkm zxTCt~A#!|F+B~4Kr@#%cCulmKQ;DmJ`4_CJ&=*J*BVU#p^^Ns>s^W=Q-eFkr*Bs|cHzlHO`_QbTH5Khk$^O$es~ zSEduufNi<8j%=%;p&_OdYjjwz^cwrV^Rse> z#qTFvhVlqr?O7Z?-T++sQ51_`*A>-Kj^ZOEg1_F`t$v5Gs-^kryN)OEf~H?uW|~61 zG^0kd+`$kjGs*V!z5HH))8tFy}r`0y0=5HN|kD2LAcKQ#U!{|(eW%!L#`b@)4YS0)b ztjx)Fid^7W7vkV#8Bz*7-|k(cY?|@e31^WO7pW5#(Hr z>*ro?<|T2h(SNl+!v4H#31gT>czhuF+%h6y-gET)K6hPs*J8%7sq;`I~bN5 zQ*7386j9^HUJi~@8IztUTpr>6@@QU^?}Dvp`HJXD(LkVpA+tb1!J}Xl$)W zCuXAZl_tjfx&;CLj;GxxYIL*0GrulL#9V%Gx3KTu3T{AJc}Xd>{T6B=AzL#;a5 zi+pZVNl8i4TFY-gSph5E=YZ>8SqQX%5jC8Wl`1tblXhiABD7^T~N90=4tSpTDQC zs6qcsC-%df$^v!Q;1=XN_y$tz*5{+wAY|M}cuqdR)A#9Eg?&_-eCDL3*%KaTFp!Ag5G8Pu06e zHA+6XbTj#hIfJEJWJaF_zH)Yal$HzEs<$**2DxKeMNlQ1{`Zl(!5|8A`g>+MH9>c_ z0VDYV^iBBG(M6Xld&hnb*zc|^0*CzmW_j-_=g#(aU9&CUr{+q6zlV9oAJAHXlgmET z9p^|I0iWsXJF+qP;b?Ixq`D5cdj};@XIdF#Gqo920FLn$g}i%j&M+Do%P7epXWxI} zS6TV*mRWd46U}3uArwyctA=owd6*QtRo_*RtC?J{H8Agm=y5`>EPC8hZL|Qdwp#|L z3ZLWCP*uzB`-2u1;OW6coVy20=2!GvkUI;KV!6M?O6Fvy!XtSsr85lC`7TKY|8k46_c$j{JAre+(6gR>`&OEP6fLQ;Gvkyl*gdZ$l;jt(RF1 zZHbTae{9qL40>``vM`T{hwaOB_L5HxAddEEY*i}VZM2mV6J7(JA*xien{+fGBF=n< zHNerZT+aYG??+Bj=^DN&QlFJ_W|}#H zpH`q2hd2MokR^`>Z|-AMGHfQeE-0ug<0wd6ALpeB(5s(N&qa;m-81I zm`dLA@A}{zMRHf2H_cfEp=>ep@~We33Q~({;h}g@-mEC_;((<1}K1@AfcU1Ju z1R(bae2w@>_Wn9$o3R^|$JYs^^jcip7pSSZE5y5jGmFYWRaLbdS@q`akDe>Do;Njz zXYp=#RiEKpOW<{%oV@Jx^hWblt!sWze}sgq((&fXbS_W?AaJ~Dx+-M6r74ihiSv?# zn_-aN>4y1P%Okqmd|_XwO4eU9NF6iMUMFY%5Jn5^)^=TF>JpBYEuCvpJEd=B6ck#9 z^-frI`T1w>Mb?E6i;RxVL=~AOwo=9N=+zf~KL>N1?KfzdI}@U~Z0k#;gZCB-OJ=5! zdJ51DR_93HX;Z>tz-*EnB5c~YOz836Mp()fZbrCeomRNk{Y(t)N|HWp={=qhQ106z z)7%KP700UGg*frpFnX|OqEVEQXtT9`8T7@@T?G1ViXmF#EnJ5+DkqRh;J@E4VJ$s+U*K~+7xSTA2t)QP zgoPJ3f5Fe788-|1(?T)3H>h=C_2-mE5__ctxkQi7Iv-2egVD0qdg`DTk86Bp_lbFt zG~`QiHtr-m#bLG8exj`Qm^fgtRH$V7NnZqC5qACATYT}>#_=$4(nv3ZsKj?jYgPPB ze9GL%IeWCy@BbM)bmNFQ;?s%Ibuh4Wz}+ayCdxTDY*(v#1ui~v)QKC3m9no8I%~Q) zWO2XkhP>dXdwd(p-!gKNfKR&(FB5Fc&*E2mTbfu6`oa2U7EaR7x+X(83!8dlYt5{k zjgO+!68mRJU@J`gnTtCC=7pnK9UE5GJDH}bHfry1BEfm8yXF0q%M;U(%rQAP2KBt` z0}>89Fg~n$#(#0<0%%SGI6sb0Ppw;9K=WmD`P)?+rd~>-gTQAdcyP@AN=qvyjhdJa_Yq6dXb118tu^(A9a1?Vr@M47F=ZG^}VIRIkLb8!HcL{ZCb-2|p?D zuWyIFNU{zxD%i)@snV;|#`d;16HHQXQ6rZ9R|gLUxe-KBROZjIb-o#mPyi zEG^yD`yXoXKS*y2`LsjeO8Yho`V5h7@m~#YiCSLwPtW$`PGeLno&5SM1(;+^!8so0 zQ%;_VmUbG0`rT%IOsms58FKM-&$t;YTt=M})V_4fy!7@?5=1XfoYhs0kpsu@Psj(2 z{OlrS(@U+_H$9MVaB5nf5wbWgY5F(ZB0I&qxsidWW&I_!r;n=H)!HBJ$Lh8?Fn&auy4-QfK#4&g)6Y#_GR$5#yVi0#l#^jwVChsvRne6hoX~m z6_B)^YI_P|wL*_o;~bXve>&K5rlWoWpT$NG@q)va3dnDBvz3C;`=^76P*`$ee0;uWtV!=+k)3)AV|Y z+kZKR?2<<;k~L6hy7JHw;Ucze4oruu3KM%TzJLd?X{l#q2axeki=l!L(f5&~pfDin z1JZ1Om#XAr8l)6*B{eTlOM@C6YHACZ-E8)@0P=^Z{Fu;NCP-6@yS!u}I$Y1toG;S6+JhE7) zPGDd)8n2KCY5Q5}8wVKdjMG1eqRvaplN9ml(Aq}Y_u@ATss5zdUy_9N@AiYzu_F%W zfkmzWwDW$UqGswv-cJ@zX0+WBt5QaS6KtU4Lw#l=BR?5cZx+CZ^~KV%h%g(2Y+9en zjbkVen7!Snk*S6j1VifM@mBYfeRy39XYyv~4*z}O%9$TRoQ%Mz6H#SWG7;-Yu51_$ z<%kw){{4LGttU|)yYp~)(K|3>m=(&a@pV#E{Hm$(h)%!#VP|Hd3)-q;+&qPujiIVw zQ7alQ*vH*$Od@a*HBG$V_c7!$2m^n9`2~1YEg1oNTP(Gn$p^CKSp;ypGhG4&W}>kW zw?x|OryG`y^^~f}MHBz0I?5VCLo|dsxEAx&ktClsw=MRw zG_|zpL&V`1wGtJOk~k2+A8oIBO{waQAufUqpD89P*g z7>uK>l?UlgxfwZF>VuEyuNM~CYU(!-oo!IH=`Rw_>r)^e&1l>!J*U6g_1{(ryX3Vf zqQGgfLi0 zNPmR1CNnGE#k1smu(Lhy>o2%^IL?^D`qr4B&27e z`JG6@vrV46ccU$UK_)rI#8?GdICt1`Q}WM7R_oJeeFX4U@1l3C>By~@k7H68?QA*| z`$Y`IYV)0}vjU&4yaQi^A&vQ2`2b?~<2TncTcqB}OXfT2%%@_fWdbdKgdzla6emHm#S4B54+( zJ*a83u!RIfARbzG6uEBeU3k8rtIwzqwLZ772L(n$qoXUDdiw$ye&*y{p|w45EbdGh zkfPwhlO(sGjgkOfLpK(?ZtA(#MuEykcX_gY&SbQ)QM-v7R|ALLyu6!MTKUem-RCZg z23r8S!_F<%)Kp`+MvsP`5FqwrXF?t)xD4s(ftZAiF(DDtaefyRpW@igE|>rKLY)>y)sVgYF2UY- z>vQ^EI_M1G>yr`zS5yn}ERSX#U5`tGhRs2Ym~^-#xzX*)>*^gAuA#7_&luBU@V=Wp>nYT#ak&nj25kltQlT^ zxyZf~MMiniqqSpM)4KVm@w#qVOV+2Xd~VLp&T83z z*bMc@&Hthh6Ye$wffB`H0h5Mf;eC1^J8sXHWk}4`u<`8e`L5H#U+BaF;igTJ@+6w| zam;Dc%h19&nt`u-s%|RBZ_fTa@lj7I-fk7tn4opP2Bj)LJS;hUDQv2b;8`!+^v^a< zJ!6G)86-jc)wdt6c?Tsga`|ku=k#gJhXe%gS6f0$_{>hpXk+MC4QR+W3u#tzKW|oD zH=gQDFTVBx<-RA*0rS}o>s-Q27!6fMWoD37fneEdJW@-eiKj-2yYw){qj{NzNaW84 zM6nWKW-?f(az@{ZXl4F4q8%tVi4oST!N)>sw3%8GEPgQG3&!)$H;#9*0U z$hS&|d18QyW*`PT>z4`FZjLv6>uuIg zf=oS#XmrCIK*;%SJFoiv2ejD?qWS~Vn=n3QGml!OyG)B=#Te4l;*fT zrgCU?VlXG8>2*VZbJ|#QRI;$$$ucN`lePhmfM)SCu_2gYh>XJkbl+0-+EasaGjlI0 zwR6kzsA}41DXy9jOZ_(2!>w-dildEEA`<v7-SU2;c`sCkRZBlLkhXnjyo|KP*W zjeI){$wRR$e2L5E6nnJWQkLv0w8GrI@v1a$GFOeSyImkmna}OsuYdm3m-ZM zxLG%?EwF6RgD^e!AoR-#3w8W9E?jxK=829$#XL_ug?a))M9GV?Yf$qFM~6SL4r0c} zdXN@D(;xD_*8rVjh|k_;-HNXonkj0A00avX!vpl=XB-BWzZy;*e`0q|cHD;`AMju` zcpe_Vd7vP<#Vm>jn!ooLR36^6_}&gO_}t;<9_KvuXl^uALlqePyX40peb$pKQp0vd z=DVRiPO;w9ZK^q|5iK?cTf@ij z0Y4oCS7uuR8bYRyjxFR<#&xG4)HScO8aUonVJ|XIyEiosY94n#+j&kVqNbbC2H}jw`@_+pdA@w3CUG7K!+87{$T)gm zD0WkX5xkd1t^;Rd#FX6Z*A1YT{(!c|D8#Aun`FtmkaSv70CqQPGp}iwSU(j! z)SI(ly30%t^R!#?czzrb{Yc*mu)2~W1U|a+@>aUIff}jHW&5m4YH%6wM+&K-Hn^Bs z;?3(zF!+jTGW(OW~iZyPSnmsBS1$v2hl+n;GD#?L>LLJH=@UCsr25tTI+B1!gfBkmM@n-I3@oJ{P1D0U4RiSzb z=JO|EQsjy?(%gj=xuXer-)1uGxOzaC=weSZLw@4@*2Tw#C)e|Y#b-rsgiBxp&dJ(R4(wH$R&YkR=?$34SKe&DL)gBK$ZUft0H_-JG-pL;{0R5gMu z43;5fWgFR9{g02i&0ZeSI;H_R_n4MHI_nx585u>Og_fOehCnSh^U6@bTnd_FD=!<7 z>|8-6m)k;0x8Nb+$9AU^O=9|NU@(tn!Gr==lx~Hcq@W4ZXER-fB&muV5OIQ5sETjk zX`BWd-ui99470+?;;Al0w^1)ucHzVDrqxKOl}d-1Ty_f?)^G7IO*5rLb-9#+xK0E# z+6ba1xAO(Q^SO?=eT}fT@e;DSZ<56V(b;G-PU8nLJiqIx?<_Js_fnUjv5X&1A%r=0 zw9niF&*U{0VNt@1N)VQDp+50;V{JrSG|DOYq}Th8oW~ z22w=qq+4%!W??+B+G4*0DC?IqI~NxhAE-(>4OGofR8MOukF)MuBp{YQ5)ZA<;4gr` z^T1?#wAWxLYfGOPoEHLZ}k$;w?nBhMsxh0(v`&R^p{joD0ZD;2lM2i*`D zn^`He`>`&+8kg!xDttS&oJ^XjyVtC?p`F=_3>>L8S}$A@wY(5%B|nGcb-F8Gx^PR@ z{CZnfxD%v6AeaYd{-}!KCZDmIzhkd4Ip&Pz=ie3KqKx0^H||Y)CIF3oD}K+(kxo~a zKIxhfY5W`U0CP{v4>FH;{O%mt{#WK@T*QmgE@=}!kHpv;9FgGFIv}ePmpzC8H^`nmF@0*G`w=6DE zeN;`APUyVVmHtzu^J;kAeR}H^tsj9`@gu5qG9&Tu{PnVqI8pDhz0x-u1xrkNI!jC% zxLADPV_YJW3{D<5pQpYn`cpE0#(Td+IHt~kl#1C=^=C{zzUlGtX2BfPZZt(V)__n_ zQ=qmK-s?`0TgTCU9Z+065b?Z=n&6f}lPsND~_% zN>h3b7C@vasPrNrozQy;h>A*6K#&@xMT+zyy(l0^?>$HlE%csbua$S~F}`!&_d92Q z|2IDvI!JQoUTfV~opW9xP}Ma~w6*LaZIo%@!oCWQZ4Ft@!&-2meiN!CbP1$ByanzFDKnlIVgJ?vAuK4%la7$>F8v3I7ofC>nviYvs!Whse3AEBfMuMj-60Va889qXNVFmoMw8%_W& zFA`BBFH;1bWg3%3_y#zLo3-a}KJ)%FWt|JF06^-I@I2ti1(rurU%Q_uCmu_tlEVjt zyXEOPGD;?2#TDMH23ji%sxO6j<2Yq#yMGR!gqUU>`*wTf@9<(G% zxL8FV=1weJ*(ZFE5hf48sCBfWv^V@@(@GgOI$$K{0WQwsC1oaa4(|uP{%%|qb7dM` z62#(<0$DZDrhM(H;V$N`e?g20?yi~YVQ!)qe(&$ zBO|K@0fMom9X|sCRja8t+)lSRm%l7x2kUoi!4oZAiw_KW^2MNYDk53c+wC4Cvf5^G z^$sZ#^*@i)JnjZf{`d=-XXyq$Q2E4i7wQIl;l!j_UA=4jz{2Fiqy2e`7e~po_N{)9 z2rp)TINt^&ET&T#VD`k=bb4^V;?c!HkiyO<8O92#2!s56n!-Y9JvsP| zs`57P)bpk4=Z*sQkYt|wLukRHTd6=|HNNVx(rxAAeOBYX5Cv_fatv6RtP;qOwd^-3fw|Ly3bHn6FAIp0{g=u0+lB<;_J=+E?<^4@ACQ{^8y(! zSZqs)IyeGa>C0m!b~pvdV&q_23q{w|@RXz_NV@rk7hMJ$lIychj!dUzv*k&3*@Ps| z_n~p&Lk%jh)mD%Oo9r=QO9U0CA}ud+P|1d=C15fEUyWsKj==C8-=};V6zpv`L?4nk zFsly%!z%~K^P4K#1#i?MAuivT$Hf3fcOQnR6i>P4g{+gOpX(Fc;Ri$HGA6w5{ESLGKf9_ zr&c8=8rMlLYHDivEG0@l{~0_3eH~_^`CoR_(0mqUPJ2R@T`3nz`lROTR5WIUU1X97 zl5E@c`0;KEvMCK0>q%F5=Zk7w?&|(gPkc|QimFW`z}04H%YYhdPA}VgQEF>~EztQd0cbM*cw4UAJUF8%EK<|Cvm<3dmKbbAP>HF0l5)TWD3kM311z;d+e z4SVb3QL0Bf(yFr9KsVVhPLzD_rM}y!OlUUufd5d@(VWIEIPodGX<2&P%_T{{iRVhhu@| z-v?#%ik-u$babQM>bGIYp0HqpSM1Y=VW1G`O^QJULT}Bhx^~?B@3i_UXJ4xfTFqu~$pxIr>X+LqomuWG2ie<{tV`7aZTD0?{m zk>!rfYNj)(R7BA9=dn18YT6~Q=Z+tQF1*?g0-aTU2ziRt`=|Ha?Bpg?y|HCA_ewWF z?4itT;hhAho$(yjSiiz|yV3JsoQ*5iD?RBN$vn26F3(uRV&m1*wNFsADzaV&4v5vg ztQoeHcIkVQ%ZXesoGeqlnhSb1dLBMAr5>-ApkcYj!LCh*t?b2rg|rmT9qlbToX7)U3ho57EvGOg)p zwyr8Zl!1~E!0o41Cm-8O63dSon3+in0ZzY$1oZigGA`2o?N_Z${0{6betV+Nx(rg> znuROd8(x3z<7|h()ijY~-aePJXlv|wGyOBwNot``k!?h+pXng9?BTxuz<~8VK_(%m z-&0Lo3EWK`HP}c~sV3=7W*>5y2OSmIm&H?vlZ7tc>S_!xhV;~`;y|N9Kc~BkUdh}T z(>J4@=ElViyOELng^p^q9U8MoqoMXngxZY~fDJ0$+1Wu4=s4bjHdfT`oTP-r7$2co z?yzJ#3*tfx^I5nnO0o3BkmxNB#^0x`b<%?3ZqfC0JF zvMo3H3|iz;;~cS zb>E9Jz$j>D>+PyUSSPr_1f{9r2k1LhjxVnK{fT9f86%wd9@u|YgN6FzKTmMuYqG0; zyX&)Lt;E#8QVbA=?=CuL{SaO!Dw=p+eU_wYFs}b_N$PU)R@x7#qV+VOR`x<9aoOVM zcO&Y?Ob}S)fS&5N;#-?cMAv!m`}-=NS>t>11@XhHTr5h@uNBO4ER`fB%jzE({CI}5 zjo))y*g&8D*AB^fn`(&csIsZ*)w=}s zDe@;^-HdsYbI11#0j%!#Kaj}Ra4%N-dtcf!&}t00#`4n~l>a?vdpuy^CbCYRr`+1uWIV>EFpE|buo$o~qQNLQU?*qJ%A_|aeoX5;yIXZEv!q8lD zm|>TK88k6AX11*`8|rx&ryDa8Bl$Tb?<(k<{P>+-U}~cx1QN;Ku0WHDkPuR#B?>n9 zcY{j?wCJxBiud`$>H2D=cW~QHCX@z)wF2CGPm0fYQuEAUgE710Q)#b@hyqcVLmKGK z8oYWP@ zuN{=ik2wh9X`MS4t2H&h>ul2X1;e{yhWU1%>inomNTJvS?p*wmjZcZ8G)I5v#E|w# zgEcoDE4c`kxPOcbEhB2hEXE)1-RBYZsEC(gym|9xL?Pi#2sb%ArhqtJ8^C@nB3#yo zM81pjsMyC1ZK(A>$T|-<$|Vhsb+DHuXZYdrwnXRr`zqV3% z?PZ={4w)eoU-_F7mJfIy5|C9xn6B=6i&d{oA3jiIGkoDV>dt<^z{dgyTd7Lr=B3;_ z#L5C1scV)alo?9s&=ue&o zxomVWK^ZC8hz7f5ByH=AZSAhRHT_Jr&=&{usp^1!i{^@yHbTK_q#9!hC1Y!v>;Z$T z4`g)Jv{(C%U+tnXPH8$TKV?_`aR2Lo*3E1t(V?SqGLxH9`(&?59A`U5`0wYC6v9#7 zrU^G7OO2>|<68E~LDZ}6#pKsfpUq!awU2Q>Ii*!Mp?}p@w$K06JYIe4;5imvI zPBu~&WVMZqV5r8B;61elUYSi~`eq*-R5=xE=uHhMY%kdr71r)Wp=vG)RQ@b5Gnr#` z7in=#kg(o%foPF?X@!MC?Ol#v=$G6aVJB%NzS>#D&+LH~^D&a0tUGKUJKs3e&w2@z zxz?4?9dKT*`Ey>QK-bs(D(qNNLO-nc#{^b3H$*rC>>){6R8&Yp#*F&&@x$o zJ{6~xdp!P=%JtMv90@Y&LuXKKY(4K(L8~pcB(bW1)v>n)haS;ZaJ@&! zUNIWwJo)ZJ-y-ds-9e$^P|yFX{)0Gal62DD*AiR zD|)v-_z$lAee!lfoA`u?F94EtLbv?o!joeW)beE?vp~ePFybyU&=Ac^)YupMoH)iC z!*NP(U~rDGGEpCdmQAki=yuDDPvVbsvyD?~wo5!gGXW+AgBZbC4yF}Ah+Ro#)cd!k zZf4pRrM#(^Gd3y)J8-(U@6qd&Iap*+kUaQ0Fq2~Uv#H7AHI|x|)g;Gxy-by-bX9>l z%)l;RC`p_$$e6mTFo@rOKkGs;JGKnF6HpOMIYBFlg$!qjbhjMIW&)>B_LK;E=#HV_ zp_gnE`(D%om#N;FJKH3n4$@Z_yK!|Po+nH#!5Gf9xY!gHj)(#()3c&OK#r2}XxK$< z*d|o*rN^i7a&ue8p(1U0rqeSr9`-2GNG0#{o&GZYd?@P)uHNVAAM_b>Q`>S-=+jwS_(2uM6lCFW3Z>l3`vvmJ( zIf)TDCAiC+1yw{O`aaOPlL5}G@FaK^HVt}bQ*FWxVWht=D`?`*x4mGu$hnl7q(Qw` zhJB^#@uBFq{!mNTR1GhBzMA!BJjK~t3uuv1!_}#_JAEg$(@d{hWbL)7r3NXN7AELKyRHA#GrNxEEGRWC+ zH}NBeIU(sALbh=1M4v{cefo3{!4e?Yc4{*eM8m;}kSlL9wxWbPn_9~BV+YS{T)4%tdywtkk2K4z6 zesr`+3n|t+h5g+no4C}1HFZ%@ffK%IcoDFCgA=i+91PI1Bs;b?bez)`S-gyN@s-`@ z1C^T!pZzU0YckN{C8Yvb`=HqVh}4*xXnvQh%j!bA0@2OKAof5RDwQKn9~v@JRVAK^ zClo&GcBN!CC23++iM^M&@nOS1&h+f!W7Cb-wyVJap7uY41p^k*mq55cFQ=PdS+xWX zI4nyy83c9g%Ur+W0#c2#Rdx+wb}}`%y0R;S8Ow~lQ(sOg$Y)g2=*VHk zfD5%lrVII0Q+ra$A$%%TGJx}06nWSgbwY8aXK-r4Lj#3EC2XbU=1xtR=JJs|8IkKp z)c{mTTI51^MbOHgWEy_ zX)ok!-<{Q5;X4BCCPMEEr07WWU5}(SZN1VFi4x`iuxYBqf|t`8x@5l!CUXmj+j>BC z)o}4GbdZrAnC)J?1#2u&zBc%9lk)XkA-}%M(~sTCq-w+;DZGC3V>ewycBBhB=CO3j zX|8<+5}nqu`Ik9^hi}h%<+tsF6aq}RyH%}k{he3&GE&C)*W1-M?eDAA$?_~3zst`) z>DKX#2(SX-_x{^9#jxChPTZf{wU=5Uz5WL#8#Kt`=TmWW$uRy+yGAMB3jmMJXSRQ( zRc9ugEcrQmv5!+bpy+4WmRN4yHCeSmFhqX;aRfS30;TS&aP;R!54jM)M7+x~*!}`F zUhk-}t3y-HVIs{=>+1%M+lq<}q_MVdonz-vry?nz4+gO2gll|Zs&qNw{8ge8FomQ< z!$PfWY!1G->XkSIBzK?6$jqEPX?K0Q7$#q3m+7NhtM#H8144xP1$W9uY!+NPTh1~$ zNpwz|sOI$K`S?ivoeCCu5HD|tfTy>{uR%?nKyD;uWJXDJBL4+eCXouYjo+niwwf1m zYf;!1*@lS#8Lp`siz)D4$6bzLD&GXhswIX(7u{2oy71f_6MS@Yy;Rsq5nu4^Wz_H< zw^*_dl}Ox34xr|MvUjXVHt^8^Ye;K7SRu{Jz1fNSezupcmLepcFkm~fGgsk?wU&C`<{`wR ziwX-znk6s5U}|o1M(<5RPeKzI6+FJiG}I44k9k6yyRV|&efIVNL9I9Jh}tqUUf-Vk znWkn=VVw&}UaqUdp9IPPm$gm^*3`GBE^H23sZS~s^~*~G4?*KKeuF|Ki$BaJ-u_Na z0iAF{F24KHBd#+)e%u+aDJv^8v<`G->F(IvP(>qQZt7I9KjJ&jl&vp`xi$ z)jTenCd#TF%gPVSHl7U_nJD@hu*WPU=CuAgId-7O0%WzPiwTo{P;P4y9cfqp0E zW6!RSNZ*4$n;vEmxhw3^P$E(;L@d;an+>@rUDh#m%QE)q<>V17+a-suOjr2`cW!H8 zKB3~@ex-ZjlEp=^f=Bw&{nk!XYG-VmT3k11fdX)H)t~zQah(MAY_?I}5vhbIPLoZ} zu zxhvvFqq=clAFFWTAg(eWW*})zCuV)gL)c_kAwv14QMzo5+)Iv6C*?deKdrUVKwIf4 zTQ0lZneL>(&O4+AA)O)~-90gmCtEE#T4;tvo(?%H$A*RU1s{c;46xyD?mO|sq6R3f z_$3V^NBpZTkGH^-8D^Tj`n`?()v7I58y2BQLjI1c{au1}w1QttQ_qqWuHZE+S;=xIY!gR0CU_U+b<4~rj>Lt5bu zi3^+TqR}2y@FG5{@h*1-?Muwr+Z>NnvDLG!kQkoX<8yj4@RxLmxR2Y{vy6!8aTF4U%k>6Rbz9J|9$bQ6erfvhX|LPXzFdojl16D64se z3)|Xs_OQ=Qea;iv)Ih>3c}EGZ>F%#nkjiW6)X`(W5N0R#$)~EUOk!+m)jFYR{=@FT_TXo_OR4l~ZHdzR z(Lmb*HW{MgJjea|;YB%=x2gE-=FHJ!ql(G?$$gB;012b|Yl60t0p@%U^Cr)NQEW5VWB ztzW{aj{D+8-ZP>MI}SFNL!&EpoUo5(0+ph8cHMai5;)yJlodf`cM}!&!6d-16diCv#IwaH^GQW*FJ@9<2!ULnkHiLd# zGpiBW;00V$d0`Z$9Tc~aAU2-0gU?eab9LwV6v!VpRmz*y&fn@#YE&S-0Ns7NR-f$9 z;VUhzIazDvEd&?v{H$0(IlG1{WBAcG<*n^dll#rU(jI*AQ>mEi_1ymx0 z0@=~y;SCkv0b}wv&DX>Q;5^3SR-I&oH@)U!8SbkwtnS{YZUo34!*i_*!3$>9XSrGc z)NsvAh_^*u?=q7DvmE$X2gbX5YBA`Z<7;%lzwkf#jwFWLfv3`SY5>&_EAknLO=iwU2MX7<%+{K6M*Hc zJi$CrRN71sFku1SR!CvwGUnlR%%)tv$Lu=|abiB0z)dS?pcj9>k@@{jOEUhs)%XvA zS(?x#Tc88M9zr^vYCQJOs>KuGsR|ZWC#Cj8X&~ke6n5N(3w#*6q_)Zdo}sFB03g8; zjk$vH5=yui4mj^lEq>vF{b4<&w#gWUfS*53RlcRI-SGAu?C7x9Zkxs}t+c4IfO6xv zbKz2&zx2uHT6k@(tUP@h+Gl@#)==m8b9QE6CP??p6C$iNn4Fu%T31lJmp&;^ZJ0Hy zm=i<#_>-*C{piM%ZfRvWfBr|MXWqx#Zm1A1o!*HHNHrGOvj)N|4@<7cwY#$>#)X=; z@EVJCx3!bf*(6;nMhW)dV064>`^%qNt&=Nzozdqjx)8%J{AI5egkUm}s|85z<&IFn zjU#&3B9mup0Ursc8PyTq)EVQqPgx`<{OI!FEM^dnK*QVoK_f-n}b)_tk}Ky3_qlFrGKg z^F{w*ypMc!NT1zp=d%~;*V{AX&+D7MpTxJPEE=?aH3x4+p%ex_%Tx;2cCE*x-wa|eW28WhZnm3Y+ zygD1{NqV~%zCMY)CsF^H#>uL{?qKJsP|l_#JRybt!*p8hm>rgUwcn zxcZ&VazIc-6#k{3*z7mNOvIT$d}be&9R(;B@Jf+ukdkp zW0rt)s<+DHhD89e#jz3TPv}^#$MyUf&q!kb`!;;bS>xyL&nB<3a=cs34^V560EsC4 z`SJ>{W1vLbUe}ka%%tynrE5Podmb%E>7sV`ovZf}U&^$z%NO07G1>ezXLq{s@q2fh ztFHC1>(%EOi)MEp_eb8eI-+`$f!rR#j`V$-DGd<9vXXo}fXFED?XAi$9d%a;&;hl? z3yK$9#JvU_h3cx4K4Q4&%CDV2HEBt|S90i; z9q-=mRqqho9R{)=$Wg?~CPO7j=JOQ??g>kKNJ(J7((ysF)|J#`^qqXbf!oHeO%cwo z#$eqJ`hmBvNQz=PERTEn(C$r|`f78Ml_wR$PmSJp3TRY;${)Gh-9B20c-LP)W z>#YqcGz#72rQhEw+%nFCat?nMD!XQS6VWY->7A2q3(r^ComPOs=3iTcd+^DP9aI^m z3f`87eOez6N$>0#pKDn1VE4K6Pq`DmY8P{URsR7xn;qxWE{)0h*uEDG>OAynk~M0K zD+My=d`>d6u<#3I$8Pe)UvzrX@>Gu1EpW8MA$yh%e0i%$T8ltXUGm{eK$2egS2@ez zuxc1DKt|XVY2O(Dp1V?J=`-%>uZ2U&Qxd!t3Qr3Dxkf}|qW8{vOEWYdIXRN3EP7!> z1>F!4l4^3ceDaq0dG279Y7O5+-;x7cUiMlTDY#_n@fix(kJosVM*CyKhj?LMHnMB7 zPdGIWzyq;Q8Y*+1)Vy)-wUI3bQQ!7C0X^}^hS3t>&GxA#u`bVTTJ-S+2dZsUk4Kz4 z0IEXLYH5HD?(ca9U#K~y1<*uQp9Zg_#y_lZ0|SYchOVb?@(iOiZ!g>OcQI|ALmcGB zQbFn#Kc70{bWr6(r`GP^7?HR@H6<#&Ss^U(T0x#>=%qQ*K7s5+#RJUN??qY*XEn8; zRQ8@7)hFW3$^aEOV2EAal1!EY(Ait*6<+8w3|S6G;!gO9EM%^9gHD96j#KN_LTC6) zu`jT(-i3WPWxIatb!t|ved15U>^^Cy2a7Sae`I43D6{A>m8aox)sK`6#Y|Q|F6R;0 z%rm4jw*amoUn$wU>e6|{Q^^P*0yX2tcnKkPZnk%F;6t9n!An02Q|<3xHXjh~y!s_N z>a3w~{t{S;FGlC7I$OAf`E?VR(}~4TDmhWrDjaxRJSc%OdjHL8_Of60qoPKs(GK8f z5jsz)J}k{L`dmg;tTrrknY+KgI@xkrr0TDobMYK$WzR^stK<# zU?{5wXCF!e&X0IrK8uS~#v$VpG8be6Uv^bO@$c#Fw%jNTU)=YQMn;+b&e?MWa=R-Kmku>b1H z+e^YTe?MEBw1t$4wk=nSor3MTfLjWUXoaI_m{{1_fYjG+akP9J$yRkNxH>F*{>&TG ziUBe6-ybdu8jI$o93Stzfv}Q5Jowr(DT?!U;+`!Z>2CM+1(*|NgJ-r5-!yX!l;D^Q zu9+*aJW;rS(z|!>=L?6CzYl10cG{Q0s*w|&(${QDMz=)q?W+&yjv`L=*PQXwp+gwV zbtX4v9814_(VPoX+Pm?`y0SHy%#mUG_Ur$^BE*o%V@ETqF5yaXO}BdbJs`@+*?8u? z9=Rg#XRNDE^)m^XlKZB;hXqib-|84#O>8o( zEq8E20itX^{W9+bEk;v^f;y1_L1 z-~yA2ZCG}yw zGlS0*5F3bZ8;NhL=auc1srpp+IlCa8RL$%%MjFDp~P8p%LHxC3J#Q^}7pa)6HwE3+rc@Ok8UGs7g}X zC-s~zz@>`yX^>oUM`Jgd-B2Z3;4HI;>{mLCrUqjqv)Pnd2YuBuCUp@RK8G*uol4QY z9<>Pg$#hIdAF|DWffKtzoLj8i;}-bYv%NP$4I>?R$fZ^wf)QO#MaeNFhRk zf3kj<9lJ1CrSo0heUlaO>ti_RDL4m}{}uE_w*}q$kfBIlsOfT_`R6{Y(3}$2RDhrK zg~-5x1;ROIrcPyHCI0suLZ#Pf{J9`1H?}ZfUn{*Wn`#7D#`4V5h=Z?#`q@E4bLn}2 zUU91aOlb7dN{N!)y9)!OxfOVfpZz5;vnrWHRVd3l%R*>Y(7du0yUOWj1MCs$)AuDPW&Qu=O^ zP(z=lLoiVxIPb#3j1+vPTy8LoesY|0)gOE)uW?n(-WKP};A(GEJ`IVlQMIdC^77wsTYO4F^CsLfX0%`zz!w|#p z#C&E?TU12E04ALK!=79v@`wCHz9Sy=?-My)ve=_`H+{`h%wCh-<567}E}!IBwQq49 z0#DTSZ!npRWFUw2?M+PCywBO&W1C3fu~v5lCsy4vRZ}BQ6x0IQ<)fnxFqlzML#2{F zl9D~ZKcOMpA?~&>Jr-+1Ct6s1$0+ryyOyu9~t=#k9IC776X*5xGKE_ul~N?_4%RGFRFfOxb(lv zH^>`3pKUa}2+iz-8-71s>#EsHn5T5;PM7ZhftaO8iG0GJ+@m$OjvzY8mzbwtNJXha z%%p;(%lyV8y5K<9Gws(snLkUyCbp>sP+QV0Gz~0`)C{O0;`e@h6~{dH-T4~`2Ho^$ zlgmrZn{JjMOdnI7?q%-WzO*in#s-7@#D0haUG^-ruCN>FWC7aGWTWN7;5q;BciD01 z`^dAYdh%Z|aFMhL9{S2#ld~>E(Org*-zPMk@k<^B7F%$QmVswSxsAx|3L@QN_Yy0y z2iD#50Z)#su+dRbzL*)%Bw)9*#cqwHsPA#1s&;48g&7;a^9mZ~8P_W${iC6aHC1vhBRI zvJG0_)^E*hnfPT4MPXd5pku0e1EfO;*!Z5f`daBsoiYq#NOn>OB)uXAV~v~TV1D7U0S!*(0!IKA19I^jz+q;(a>#KVLkUMa30NMlvabs1b$ zKqRsY7}eN1eu5C1*1JVnrZG=Me6*`D+V<9Z za~E*~X$NvZp4ol8sMn&a{8xyTUR+ME+X+AUxvZK6?65!ZZswrk^? z1&l@Pw734HMk&6wi?>aG2V3Z9W&Di06??Ol?bPu`=vYimLE$5UcOz{6k%R_$R7@A+ zbXGDH1#}9de-&g0xRv$R-hHvWG6o}y-B~V{_ZHP zKb<*AfSqr@5gvnzowHA?=q{B@_JC8gGY~KC#J5c{W%G6U4D*Vvf|2B3;`#li z9S|pE=hN!EJw2YHiz=Na2ujjC`ZWLYo4dmz?5@i?Fx=w;U_S5na-@%LM6ZpxRX?_l zi9vAhx)Xy@LWiU#o_@Y1`iu3i56n~_#h)H8bZ*#|p-qh5n_#To*?=x3t$o&%p!gg| z)aVutBTi_0%^GHaIMy(zz0nJH55Bn5eigjgpQL?oO~1@}w-4r-Td1BufVQm?lwMa6 zen$7G2*dGI{=g~rtij|c3`ri1oF1?EL8wYpO6pc!v8#?GJ;c;AjlC=LBDcTS1yT&( zCRZ}!8OWJk<_@85hv2QOGTt%AE>JP{|E0GOclGPf(sp{c{UsYmJ}Y87w2=s;q|u^n zHT}AX(+d8^^ecSugnUbO>V#QS6p8dYn1RGgPdjn24YZc!<@gV`W126BNoP=HSFAN- z=b!&&A0-8zWLi6KPJ$M&XZFxs3aqF-r2W#M?vV39GBQ*uD|8)~x4uxizGmg;F4`rz zW~6h8oo9Xm8L~oYQUV15`nURN@<{ey8PHhuxo?bhW z$lEAJZ@@BniH*sFbNw}1JY;$n)uF4rD$Q0n4 zCKWbN%4r03o+Kx|1MK_6KscNG_#_2cpg?=5?X#GJadl>P+5D;=0|^WU(5D<~Iqnkk z2fA#uZ)JfZ0m?er-+-Q$?7TRg2TSkZj6v7hScZ^*oL~+0)44hFj8gn5ugRhil@eoN zF&EQma7VVnJv79+gDE;D4~QD6+JH)Nr6c8WD4aetSA-v`Y3sZ? z{xtST@h}QK-$4qpSS|r%(~|PG;2WUnYzV?HWE^vXe>0(kYN zSd}$*gymn~(U}|hK?xVh!~&l-(|>3x(treSzH`X9N;)mMc!Li)7@K!`nuz~Vn;}$8 zV+TFs1#1~=XajnBLg#>4!-<2Sl`IVEF%EfNn6hu^tJxeuY%Nc2twe0(NalbXnLXw9 zj0&EI+~4)mQs;*GvNM^uP4+0&tEwsWJt4p#@vHoxhWgZjcI13xn-9piqf^{Sy7*Bt z>AA^Yg;hdwtx?7mt(DY`e$cSUd24;_wIRjsZjCszvc1)BX|8tdC=8Zhqvc|vg?|7) zU}q7COYj%`qW_P7`oaIhwlAKfm(-{8s-Dzp^X>{s6=9->w$r(thw&|8;5qN4NT)KSGxBng8}Zsr*jC z4f>zG2Y%Eg`0M}weX^97{o7^#^Yu>u-=+EQmh^vg0w^!`qpbYDy^mFsd`eS);6(T% Rv!n18igK#=v+o+c{9o??O=SQ8 literal 0 HcmV?d00001 diff --git a/src/xenia/app/discord/discord_presence.cc b/src/xenia/app/discord/discord_presence.cc index 1bf93c177..b3d10af1d 100644 --- a/src/xenia/app/discord/discord_presence.cc +++ b/src/xenia/app/discord/discord_presence.cc @@ -20,7 +20,7 @@ void HandleDiscordJoinGame(const char* joinSecret) {} void HandleDiscordJoinRequest(const DiscordUser* request) {} void HandleDiscordSpectateGame(const char* spectateSecret) {} -void DiscordPresence::InitializeDiscord() { +void DiscordPresence::Initialize() { DiscordEventHandlers handlers = {}; handlers.ready = &HandleDiscordReady; handlers.errored = &HandleDiscordError; @@ -39,7 +39,7 @@ void DiscordPresence::NotPlaying() { Discord_UpdatePresence(&discordPresence); } -void DiscordPresence::PlayingTitle(std::wstring game_title) { +void DiscordPresence::PlayingTitle(const std::wstring& game_title) { auto discord_game_title = xe::to_string(game_title); DiscordRichPresence discordPresence = {}; discordPresence.state = "In Game"; @@ -50,7 +50,7 @@ void DiscordPresence::PlayingTitle(std::wstring game_title) { Discord_UpdatePresence(&discordPresence); } -void DiscordPresence::ShutdownDiscord() { Discord_Shutdown(); } +void DiscordPresence::Shutdown() { Discord_Shutdown(); } } // namespace discord } // namespace xe diff --git a/src/xenia/app/discord/discord_presence.h b/src/xenia/app/discord/discord_presence.h index 9e7d67f59..d63ce70c1 100644 --- a/src/xenia/app/discord/discord_presence.h +++ b/src/xenia/app/discord/discord_presence.h @@ -17,10 +17,10 @@ namespace discord { class DiscordPresence { public: - static void InitializeDiscord(); + static void Initialize(); static void NotPlaying(); - static void PlayingTitle(std::wstring game_title); - static void ShutdownDiscord(); + static void PlayingTitle(const std::wstring& game_title); + static void Shutdown(); }; } // namespace discord diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index daf973fb6..6cb2cd452 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -13,7 +13,6 @@ #include "build/version.h" #include "third_party/imgui/imgui.h" -#include "xenia/app/discord/discord_presence.h" #include "xenia/base/clock.h" #include "xenia/base/cvar.h" #include "xenia/base/debugging.h" @@ -29,7 +28,6 @@ #include "xenia/ui/imgui_drawer.h" DECLARE_bool(debug); -DEFINE_bool(discord, false, "Enable Discord rich presence", "General"); namespace xe { namespace app { @@ -85,11 +83,6 @@ bool EmulatorWindow::Initialize() { return false; } - if (cvars::discord) { - discord::DiscordPresence::InitializeDiscord(); - discord::DiscordPresence::NotPlaying(); - } - UpdateTitle(); window_->on_closed.AddListener([this](UIEvent* e) { loop_->Quit(); }); @@ -344,9 +337,6 @@ void EmulatorWindow::FileOpen() { void EmulatorWindow::FileClose() { if (emulator_->is_title_open()) { emulator_->TerminateTitle(); - if (cvars::discord) { - discord::DiscordPresence::NotPlaying(); - } } } @@ -444,9 +434,6 @@ void EmulatorWindow::UpdateTitle() { auto game_title = emulator()->game_title(); title += xe::format_string(L" | [%.8X] %s", emulator()->title_id(), game_title.c_str()); - if (cvars::discord) { - discord::DiscordPresence::PlayingTitle(game_title); - } } auto graphics_system = emulator()->graphics_system(); diff --git a/src/xenia/app/xenia_main.cc b/src/xenia/app/xenia_main.cc index 5308526bf..73e27cca9 100644 --- a/src/xenia/app/xenia_main.cc +++ b/src/xenia/app/xenia_main.cc @@ -7,6 +7,7 @@ ****************************************************************************** */ +#include "xenia/app/discord/discord_presence.h" #include "xenia/app/emulator_window.h" #include "xenia/base/cvar.h" #include "xenia/base/debugging.h" @@ -56,6 +57,8 @@ DEFINE_bool(mount_cache, false, "Enable cache mount", "General"); CmdVar(target, "", "Specifies the target .xex or .iso to execute."); DECLARE_bool(debug); +DEFINE_bool(discord, true, "Enable Discord rich presence", "General"); + namespace xe { namespace app { @@ -145,6 +148,11 @@ int xenia_main(const std::vector& args) { Profiler::Initialize(); Profiler::ThreadEnter("main"); + if (cvars::discord) { + discord::DiscordPresence::Initialize(); + discord::DiscordPresence::NotPlaying(); + } + // Figure out where content should go. std::wstring content_root = xe::to_wstring(cvars::content_root); std::wstring config_folder; @@ -256,11 +264,21 @@ int xenia_main(const std::vector& args) { } auto evt = xe::threading::Event::CreateAutoResetEvent(false); - emulator->on_launch.AddListener([&]() { + emulator->on_launch.AddListener([&](auto title_id, const auto& game_title) { + if (cvars::discord) { + discord::DiscordPresence::PlayingTitle( + game_title.empty() ? L"Unknown Title" : game_title); + } emulator_window->UpdateTitle(); evt->Set(); }); + emulator->on_terminate.AddListener([&]() { + if (cvars::discord) { + discord::DiscordPresence::NotPlaying(); + } + }); + emulator_window->window()->on_closing.AddListener([&](ui::UIEvent* e) { // This needs to shut down before the graphics context. Profiler::Shutdown(); @@ -271,6 +289,10 @@ int xenia_main(const std::vector& args) { exiting = true; evt->Set(); + if (cvars::discord) { + discord::DiscordPresence::Shutdown(); + } + // TODO(DrChat): Remove this code and do a proper exit. XELOGI("Cheap-skate exit!"); exit(0); @@ -318,6 +340,10 @@ int xenia_main(const std::vector& args) { debug_window.reset(); emulator.reset(); + if (cvars::discord) { + discord::DiscordPresence::Shutdown(); + } + Profiler::Dump(); Profiler::Shutdown(); emulator_window.reset(); diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index 3a92ae99d..df48ac89c 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -53,6 +53,7 @@ namespace xe { Emulator::Emulator(const std::wstring& command_line, const std::wstring& content_root) : on_launch(), + on_terminate(), on_exit(), command_line_(command_line), content_root_(content_root), @@ -233,6 +234,7 @@ X_STATUS Emulator::TerminateTitle() { kernel_state_->TerminateTitle(); title_id_ = 0; game_title_ = L""; + on_terminate(); return X_STATUS_SUCCESS; } @@ -671,7 +673,7 @@ X_STATUS Emulator::CompleteLaunch(const std::wstring& path, } main_thread_ = main_thread; - on_launch(); + on_launch(title_id_, game_title_); return X_STATUS_SUCCESS; } diff --git a/src/xenia/emulator.h b/src/xenia/emulator.h index efc51a8ad..b9db4a31a 100644 --- a/src/xenia/emulator.h +++ b/src/xenia/emulator.h @@ -145,7 +145,8 @@ class Emulator { void WaitUntilExit(); public: - xe::Delegate<> on_launch; + xe::Delegate on_launch; + xe::Delegate<> on_terminate; xe::Delegate<> on_exit; private: