From 1051610ffa1d96a0e02e9a3a7b56a1c0f9ef2bd3 Mon Sep 17 00:00:00 2001 From: kin fuyuki Date: Sun, 21 Dec 2025 10:08:50 -0300 Subject: [PATCH] setting up the launcher now --- CMakeLists.txt | 1 + built/launcher/linux/res/btn.png | Bin 0 -> 159 bytes built/launcher/linux/res/btnhover.png | Bin 0 -> 166 bytes built/launcher/linux/res/btnpress.png | Bin 0 -> 165 bytes built/launcher/linux/res/exit.png | Bin 0 -> 754 bytes built/launcher/linux/res/forebutton.png | Bin 0 -> 2963 bytes built/launcher/linux/res/forebuttonon.png | Bin 0 -> 2043 bytes built/launcher/linux/res/forums.png | Bin 0 -> 1020 bytes built/launcher/linux/res/launcher.png | Bin 0 -> 11748 bytes built/launcher/linux/res/lockbutton.png | Bin 0 -> 2767 bytes built/launcher/linux/res/options.png | Bin 0 -> 1048 bytes built/launcher/linux/res/playoff.png | Bin 0 -> 6082 bytes built/launcher/linux/res/playon.png | Bin 0 -> 5976 bytes built/launcher/linux/res/showcase.ttf | Bin 0 -> 69692 bytes built/launcher/linux/res/update.png | Bin 0 -> 1139 bytes built/launcher/linux/res/verify.png | Bin 0 -> 965 bytes built/launcher/linux/res/versions.png | Bin 0 -> 1206 bytes built/launcher/linux/res/website.png | Bin 0 -> 1126 bytes engine/src/scenes/node2d.h | 73 +++++--- engine/src/scenes/nodes.h | 1 + engine/src/scenes/scene.h | 5 + engine/test.cpp | 2 +- engine/test/libenginend.so | 1 + games/endlauncher/CMakeLists.txt | 22 +++ games/endlauncher/src/main.cpp | 197 ++++++++++++++++++++++ games/endlauncher/src/netio.cpp | 5 + games/endlauncher/src/netio.h | 110 ++++++++++++ games/forespend/CMakeLists.txt | 2 +- include/tiny/term.h | 34 ++-- versions.tdf | 3 + 30 files changed, 417 insertions(+), 39 deletions(-) create mode 100644 built/launcher/linux/res/btn.png create mode 100644 built/launcher/linux/res/btnhover.png create mode 100644 built/launcher/linux/res/btnpress.png create mode 100644 built/launcher/linux/res/exit.png create mode 100644 built/launcher/linux/res/forebutton.png create mode 100644 built/launcher/linux/res/forebuttonon.png create mode 100644 built/launcher/linux/res/forums.png create mode 100644 built/launcher/linux/res/launcher.png create mode 100644 built/launcher/linux/res/lockbutton.png create mode 100644 built/launcher/linux/res/options.png create mode 100644 built/launcher/linux/res/playoff.png create mode 100644 built/launcher/linux/res/playon.png create mode 100644 built/launcher/linux/res/showcase.ttf create mode 100644 built/launcher/linux/res/update.png create mode 100644 built/launcher/linux/res/verify.png create mode 100644 built/launcher/linux/res/versions.png create mode 100644 built/launcher/linux/res/website.png create mode 120000 engine/test/libenginend.so create mode 100644 games/endlauncher/CMakeLists.txt create mode 100644 games/endlauncher/src/main.cpp create mode 100644 games/endlauncher/src/netio.cpp create mode 100644 games/endlauncher/src/netio.h create mode 100644 versions.tdf diff --git a/CMakeLists.txt b/CMakeLists.txt index a89850c..2ff3595 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,4 +8,5 @@ else() endif() add_subdirectory(engine) add_subdirectory(games/forespend) +add_subdirectory(games/endlauncher) include(ExternalProject) \ No newline at end of file diff --git a/built/launcher/linux/res/btn.png b/built/launcher/linux/res/btn.png new file mode 100644 index 0000000000000000000000000000000000000000..f68b8a08bb27b2cde72a51d58013a96e1392fad5 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^2|z5s!2~4JZoFLwq&N#aB8wRqxP?KOkzv*x37}x0 zr;B4qMC;oN8+jQNc@7+CxKY1yKC9wIMX?{e1v5qVaq4XU+bZYga%O65V8nU873UoF npIdcUaA3loosaIk={i(*M3vLfzu literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/btnpress.png b/built/launcher/linux/res/btnpress.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6b8005895a68b895cc952d54c25a4314ffd1a2 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^2|z5s!2~4JZoFLwq&N#aB8wRqxP?KOkzv*x37}xO zr;B4qMC;oN3q>0Y1P)wizCP37jXmos;VWC7i3mHS_&@QVF#Yk)cNeyc3D&N=D_J^s tH}k6E3-c$wRCs^|UicNGTwLxJtDlw2b86Q^TQi^)44$rjF6*2UngAwaJ5>Mx literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/exit.png b/built/launcher/linux/res/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..328384c736f5465bee405b5258b08158b0c21af0 GIT binary patch literal 754 zcmVAHIP00009a7bBm000XU z000XU0RWnu7ytkQq)9|UR9J=W)lW#1VH^kW@3TdWn5JH8hL{5P8@B2LO`}@Q1g$FR1OeWL6AR@O!m>Wq zRoCCBbQb^sB9aT>DuA;9HUYeg#bU2Rp%9%;Cu}xbFMz`&Zz!cs0C)gkUTfXD{ryP* z5AnO7ds^$S39;P(nzFOAvkD6f&xOO`_W<5%tzV?F#{=E%rMLo62izO}W* z@$vE4@bK^iNeci}R#xT?4Gl3GjWQ4j6nA!ZKHuEjB*~4PI3&H3lan+IgCuJca~Ouv z8w!P(3@puMmYHHs2{r)kMfBw?h+1V@o{r!t|b#+ZE zD=VcW!z527#d0q!EWAt}fQV%Ie7>6`U!|(Ay*iZc0!Xe`RaMQkwYAv+xRbUEc5WIQ z8)uwO=i~bN`c|dX8h}emsr8f=yARSnfM75f$OawOA~*0Q&cmgXGWU<>mZHBx0?osIV!eP6LQ)t!MYGu{}!r z003Zdaq-FO>grvW%QZDUJw0Z#**mE=h!4Pd0Py?$7Y)P66OnAKbsqo(gTalWqN0_Kj*i=QyZu>aX68gs zPtTE@oSZeK)YEkKeqfNyBsoPgzJ1M+ys*7@KjH9nkZeeJF5Z4;E%}rsIhK^;Lqhx+ kk_EffVltUbCQ~Z>0+uClgWVAsb^rhX07*qoM6N<$f*A!}@Bjb+ literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/forebutton.png b/built/launcher/linux/res/forebutton.png new file mode 100644 index 0000000000000000000000000000000000000000..d38eddc743036e991eeed9d3dfeb1f1d2750a523 GIT binary patch literal 2963 zcmV;E3vBd>P)GQh71_EO++>#raGpWu z5k{Ct5S&NQoev)B)h%r@ZXobXds>-NfH*Hhj;+On9xs|j!h=0?IJ|J-!fZCvWJ{$|qtS3Q)7E|#?Ck82?~RR(G)*~QtyVSDKr7NT z#&o+~V+{BPXm;_$4A^Zn8W!J}6p?aKw3bA*q%lbur)i3TbwXl-)Vp`@G{SH=#NGg~ z%VSh374nKRh*F3imo5G{u-MW#X`15a#>R%l@y^c9ix)32V~l~Att}gk1|>}~^8nym zGdh_}FxID0I(CRM3atR-cwUoBm_ zlqFOVIXO9rqR1GdovdE3V}Ly4)Jq19O?}$GbPMsv)OE>{qJmqqSSGC>(y{LEOR|rw{!}klgVT_9AduF zXh2Td)ex;186bG7n44KYPft(zb1)c`N+re_GKvA#V&5lEo|m zd-p^n2m+W2z!4SZXfv9k#W(0umC!YWD#}^)jJ6hwzU2Tv1SZe(@pz2W^m;vLB#NRS z2!8*o_mAoRd-(g0n(Mk*mXRe9aa~tLvMd{oMoUtcg^+-K`-Yw5e=)$O*UdOgI@;Dn zB#NRi4Da8%`b(Hx4X*1_qtPgionU3`1iKmi>C!(^MD`Yqc8q zj^kJu*AcLQEh6x1nhobIxPR*^=mHG^!F62}%xRh$W5@^SBuS#pAW0Hhf)&s-eh>tM z!GP4j{oGB91|tgvt>c^9!$V|YnowP>Rtv)rYe7c~#iEJx7tK;9AadyYzUO&!gW1{H zL26)@reIhwoB_334f4qI9Bg3~s6iDv4UwTJinvkHEFqNQcBpFi_xHa>7;WW%EX!)O znm)P(Fht~mAPC?Xz(<7~MNu&_$gpD?$ zZ;*qXtz=yb1`!Eo(AG@3SPMm@R;wYDS@Xq^z~$5F6jEFf+%icLo@AZy zkOxErX2beUCvb`YXCqCxwZ;cnmcy~{`*?Ob9cMfqSF2Us7LX9seTJLnd5$X$dLDS9 zqeFFg#bl=^kvBxuWYB|_6s!f~IF4JbmWZ_5?WNw7)b%p?s;{*!OKuR$j4?2ArZ!NB zqUg^%iIyl7Whu5OEM4w)yIpYaXbfyX4Z5ydyk@cRb%9HI_E=mj+$@Nq2ysw{YKn(}700-FHzfjiqBX9(y#U9S23iY{ zl{E}N2ZuA_quy9M2`vN^DDNKyy>*slkT;%Z^`;Db%$G$3t(l^$0E#UO0(PF~Fi5P* z^V}GN$zndyNubqgJ$(3Ze*5*}#fvZupFDYT#z~5B<2I@H3WINm8KsUW7sLUmE;x)f zhb+rrDsddYefxH)UbiY4V4rO*{~@PH&j9u<>x)ySFj>S|SrqH-cDsyAQ0u0TPUE^R*8KmjVu~Kg9soaa zJXrs9I`w@Y+|Rot7&?j>tg&*<&t+Hl1Da8?s|U!quInaAf|Mj8old7LBE}fhFgh4p z8}RdshPyWd#5jFUUCdxyY=78Kv4z*mi#-v3x~{vsy9?WHx7+hB2_KxSDi328%|+n$ zqFO|{9nL%$46OEtj50WCZ9vJO$>K~FE;kyDrqik8I0A#gyVKKC?bj6K*$ti)N?*<( zu!dpix~{&BvYI1Zd+B+aP!I&wYSkDM1OeiDr_&J@0=TV|W&4xwi0idlEzfg`-14ws zaWQL*DYl-l0gV|fKvX%YzdkU$%)2Cho#MIm-mdGe>=6k%XkQU82zi@w6Lt^;zVCzk`JE$gsF}c_T!`(PpCE7EO?B{E$J|c`Ck#V|MQBh*vF{Y> zjoV)fJy~7m>0;zgxWiQ^dYAMK!s#Bn?tjdpi;@nnw( zU`>Zfy!AW}q&UNY@B7_ucXxMJ&k#YM0d&9y_!$faUn30424GC5Q;>+`m>%8jc75MR zrLS4UQAeXux7+34ytH^Un&whOKn-WWlaxsf%XK#mm`4~5)`{^G_rhG+YPEPpPn{H* zh7|A?A|PhB+Xa6-124{j#xc(f(BA<{*REYVK0f~Z`E#14uU@@^m-xP)Wf|yJtJQ;p zgM)*Et*xzUwfgeq%e}q5ZnwL&wUuR==XvMOojW)-m;@jp=Z_s-)hRBhF4jZLEicp{{x6;(4m(ysXG7w002ov JPDHLkV1f#Mqg4O^ literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/forebuttonon.png b/built/launcher/linux/res/forebuttonon.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0c010fb49bff879d9a47269335b8e0e2a7cdf0 GIT binary patch literal 2043 zcmV8`G-{_3ZD^u!(& z<#|4tOw8=;?Cj}73-cp%b#*nFOpYE}jJwf#y*9J?e4b_5BNKf-pI=>FnOWcWPaayB zJJWnV2izYe*0U^|PN$CyFiMY4bfCo?V5+L>y3WjsqA;_r>x!ainx?9%rfD$1Jtnzh zOxJbm^_o-oR{M2nuBc2fCeL#-Td&urr>9w#VL-y_2ta5kcU?mp9MfzGZSYYJY^(Ah zJnED@&pBqjUKd4y75l#L`#vE$?LkxF7kX2y*xs>{PFv2!Z=UDu*R|Bxu7{nY(I|v) zA6R$5P)In%x~_Bff|8KFs;auK`8E;P$?N^+;XhXD5PkaTxtXok>paha1v6VL79oVu zXtddEcC21il_KoptN%s9qVG9Orm>DV^RUtvMM2jj`e|}=!BIVli2V5K$-^Qi&-1S9 z02`CY=B@5R2Oclq&F@9X9nv5RVt)wX`1sh@Fz{$(BJ|t@rhB(N)^)-l!kF3h^|cor z6X?;*4#bbrr=OnF7`B^eTq;#Qapbl=0gWJWZ8MwAWmq2&$ zOBzDegY;U}*=`X9XH8(;A_O~B>?0ammr=1)K4!h7K9}$2U}AzCGuv!73^Ly8wzcJf zBGD1unq~$EV96q6Ymf7jSPd7W0d$Mql!`ii6!gjQPERUBpwmGS0Rb~QiIZ6SW8YgY zmu5Db&3s(f(Ceg+MW^&!K;xuTkHm*As_?(C#fLIwuMB<;2O?E}jX(1AMCcGFO7IMiNt0PD9e1nx@AuK=`WCASvg zjuH}Yd2yG%q;{!pU!eT>>PcLURJ&&)+YLl+35y(2t7WHZ(=;b1Cmfs*-ANe-tbJ2l zbp^wws6fsM+2v%(b}^J8iplxXRjR3s*AO_S6!WMrPLc z{c5#JWK-oHw__zu4rx{DuxwlN^YEsdL*iQG>8>V0bzRqWJsywkHh?)mOoz$oanjKn z5xrVLk<46P$vr}x&YPww%hHRkcNmAk&GEL!iMid34`7SKTYRd(idyC3#>*My zjYEY%^3#A)GN>`+u^+)9uFOc91e2ZW2~}0KZJWN#h$TC`2@p#M@Z&_Yy(7R|;(RZ5K9JXWPEd87kqeTy2F~%IOsFfN8fT`9`Wx*BKD zgHw{lZmRWd%qSkLYtS{(*7az6MWCt?r#ww_&GwE&>-BF~cRu05b5a4u=J;)FE%yzO z%r#8ujbF~SM8atng_?L}~ zi;ECKmSy<3I{$DPuSYui>sJ_qyGh&Bb=@@0X0stH^gs>_!>hWkIg7;4Mwp13j1a>4 z`FXnha&%a3GyD7J-xY#Q)1cD8Bjwhf5CR2F%B>t|6!z>K@aFTI+UWH3l;f7m<#*+# z^cD_Z0^E(%!9obwI;Y`{)xUiCfKmp^a6*!;sK`05tpelTv+I-q8I^_*py z8v8KaSbZ{?yng)}J4-BH{q~j!qcJEMXfzsCRYhX}Ee`r7=ua|v_UzeoIyJMt@4tTi ziht_p6#A$d{%EmSTwGk7ot>E(=2um!6-rmnI9cdDVURA}zL(su`_M{2~V>lz7i7>2Se(QezeEX!dSkoI4` ze2LNp*St67SF8{leCv>dKc%RwZakGID~^-$H&LEjT>#-;$BYM_{9L@+0@}u z1#(u`HeHQjPU9U(S;2&5S-yGm212h^D@sH8C^ULjtCbE=9d?RdLX-dWv8}zCQz(!s zz!1UTvMgaU>@w`cUnj2Wpl{6#$576qN^RRdr5w({u3vW}wl0GV%;|){N*2+0Jcd!P zudfv(u@1@hk?j`Kpe)PK38bnTao}4nm%}iepP$3PDkb5o3#*OC<1yvNu`Sjx$#XWF Z{R0oeXU9Sxff@h+002ovPDHLkV1g!1^^O1l literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/forums.png b/built/launcher/linux/res/forums.png new file mode 100644 index 0000000000000000000000000000000000000000..5611d840679fb88e3ca297d2dca09658f62da4a9 GIT binary patch literal 1020 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 literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/lockbutton.png b/built/launcher/linux/res/lockbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..1bddb89879cc21172a7a920aa195746af4983815 GIT binary patch literal 2767 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 literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/playon.png b/built/launcher/linux/res/playon.png new file mode 100644 index 0000000000000000000000000000000000000000..48a57fcfb7d5694659d4b3b1e6e722ddc7bafc89 GIT binary patch literal 5976 zcmV-e7pLfnP)X+>dk5eeU_XcP0%0^Y!(0yn6Kt0FZKRX?=Yi0Nm%Sr@t&~ukF29TVC6-Ivx*I zye~86SX&-1RlM3h`P{p&&%AbQUE8m%U-kE^SFf;yc=6%|0AOcl z2kmwn8ygz{fbn38L<}?*?R7%YK~$Bm(oD9TH^E*R@3}Xz zo}gn?r7>d~gZHc~tIFDTV?4xUl;=5$qQGD<0B{A0EX%?*?^_~}R2xx)vHpt}FEAdD zk!2aSwzdEO)9G}ft>JKpUayB%tA*KYcBRQYW_2JIFjZP1RU^gJc&uz4d6O37&C@DX z+C}By0mkFq)>puJ3rX7@3OldZo0l<|etD5MTKeOK2msymGkPvT!3YG zij^A-2H4%*#rF0##^W&tgF*0Fs0jvx0g9ps{ta+7=>P&?fGbU*{?F~(x5LC1MG=6I zWf^vNcLS(+uPBP3$$%^1tgWp@$Hsc(L)%e6s=3s^x3;!|CL0ci7>!0~x7+CTdZqF! z0RHd%{2b@!=Kz2_&vANsik+PubUGcZuCC(s>(`ji=eU3WK02KaPESuUpU=^3HnFv} zh4b@s?Ck7db#)c3Rtxv;-NWYQCQeUJasU2(93CDb&vSG-9c*rHVs&*DTU%Q=JUql( zZ@qMG99 z&(Ul)@%!(;+Qd@|{ixolXZQCnuqPv)M$i*TcPg_fQlC zn$0F|-MWRdvolO46WqFW3*+$^-EJ3?$pp`zKgZVA7RKW-oIGK~l1i+P}T@(en-7XFf4+AgFW;67~UzX>+!^1;tZf=J9{Iwur-N|GU zuCpw|WHJfBTUlAb{{BARfB${_`s=R%5O}_I>lWU5=NEnbE19gwUWKZcFBwOZ?y?E3}xiCM-4~0sfkn#r+uVQ z3MNQaiv^#|GetHmRp)VSZ4KMo+Y23SY;1%9>YxcG{^~Ol`^odXRE`7WJ%UO5wnFEG zaI%$mnkywvwt~a{Dvt`Vjg5_{!1+AS^RQ4jjugUC+p3h4-3<8}_r)~(VWs0J}Xf!HCAGXeXJ`eq|oTo`Fz_TnX-P6I3 zMk5qOvCx;QehV;a000XU?g31nRT0ZI8jXcEd%YgAEDNCV79DvZpLDXx1Lud&6<{PA z{aLxGTx?s)E1y|RFp`|jX5pH2!$yC$v!W=%AhlBpXFi{Y3H6v%!FZF}ZnsPAQ`lA@ z1dQkFkn|ZR)S6JXr@R8!nkB`TQX)^*tl9Q04*(Wq*KW51Zwf9=ZnE7@rxRqU@?+iO zVno2x-}=Zt-2`70#aq*X)xv2`lTfLRi0V4{8?T($&|5bILfBi>y@;m z&XsLbX*e8~7QZFRSTUhK+1}nB_V)Hl?FEoAE1hN8LK;F*O(&HNG#U-p)L2Jag%KmG zqIH#c0Hk@b=2R!bwr>II`FUE`115b@YgRns;!|WJBD$A`_na zwo%UAufG8R+%*EL`&;ktKYJPm!HI4(8l}mgFy8;yzuk60(=6`)4nkco4TMBU@;Rq91eq-ytudsd^DR) z04S$0*4EZsmFt-?3WDm?Q~7U76q@I=(Alj^8^l&EDQ4!>iMKwU`b~cpU?h&!PNE)} zsf((CtHo(eqVjAbRWFE&Q57brwP+?=tybWJTa^pv$(V@MOs{oxc~7-Km1cPpvSxvR zP6e|Uf-8A>IWI?KCqHJg{tSKc-S-Q9c)ZpTf$#aEUX;#fbwrb?bF9|{Fpu_-hkn10 zgM)+W=+Y+lG&<2v=@|aiq}pQH_C0XfBw}4ojN{6(EP(v4(qNW8{`Nl$zG0m<_DK1& zfrCjn#dS=?d#$mjYc6@sG?84`@WRqZnxWRFaT69Ue$h{MhC7O{=L1u z5M6RRiJI)>_a z9UOMuN7aa!tC#|uPN!%z8l~+r@|$8JfBfRp$~{%U2a?h!-+hn$XHSEPYcv`GEKFPM zKYLo+&inuRH-7m1QOS1({2(Sq8hBKh^TA*cj#?9#s)ZMPGCh846L}g1(Og;+-KkGuuTFTZGFj7Hckb6FsFJE?zH)NL3K51C+-^ zJm~fj&E;@743TBG+r8Sm^iF;1COKD==Bcd7(G_ATmTBj2mSssmTShQI+!SbZstHFf zmSz1EY97^$Y}?y%sxx`kNw+Bu{-yv;BX#8|WsEj}&?uLfxVX3o?dzi8fyk2MZ%<-m zS+;Phga-fAwXh zPpTm1>K_h=$r??qfJWB5m$Eq3)GxD8y^VK!7-D5*CHP|i@bcwL09W8DIsSYRfekTz z!MquxE4z(k8K@!!m^#*)6ioq6YRJvDV^L;R1gB@m>LNS^aj(}a?Jigi#?_wU3t6pb zNx`22H2QGrpVb9Xn$jU3^s9N#ZX+r6`+WewO*NCc@5j@ont>)`1Vm~^TBB3zNUG_r zYRdykD%m|hy|00QZpo;|E{Y<$6~^SS9xPPnUl+!*z7YAHOeSG+J#^ zeDP^%A=K4TOsJ_=OfWw-o6Qy$<-x(hl}|=e0pxj(wY4>LI-L-m=_a&lqS%oWOKMiU zOnVA(&{by4(~4FwBsJX{{pwCb6`=JPj%s+DPx7Mb7+Lqj%i=5FG-1p5XaJ&nzqT*s zqtR%TFv0wo`eglnAI)YH2L}fLuy`_7R~yZyjlQfI@KO_&(JFvx+cBbgt~x7~La|A= z{H5;2S`d1tIy5>@C3~2YWbdhVP6gWCufItG7)ddqzOM3Q$9H~yUN)BmnFj*vXB;0N zFKj8Lm@YM0F*94Gx-}x=#NDmvE2bG${VPA(4}Gy^Hm8C3X_FYAG0L*6*e$QSEL66X};~tA>>VY)g6squZN$P&}eERxj;3YqGXf93NYr! zcpWquUj$W6rZ3sXUZMKCY5&>Nr6*az5nElVNmZM13s{{(q2aM63oOv793SoSdA5{mUBwN*_MazgaQnWT!@;%aUraH_2To z(Hz={v8p`+jKZ%18{4*<>$+8D{g>1;amtV9qR<`Cz<|Fge%OyD`>#N=sSE4iS8aEx zKL(g>C3bLjc7{C9OVNcks;}2Cv+7gmhtD4cp<3;j+E2Z3i&gnJG4jsY*#)RC z-b|;{%AiLzxQ>I1#><~^QKV`xyWl)mg8XvZEQX2MY!==iS1ktoH@Z|os<|wRBKTx{ zW}``a0MH{kl~!1GACUmE?Wws*@dXtyDkyy(^KEn=Q`@TRPvtV1Ocq|;u%M}GR}ryE2iO`~8^hyJelts>1g zGEqC3OoD4-(>VGW0(tJ}*}0sm~a zJ+-X*n0nq0xb`nK%1k-6LXF~S{$)v{b-UNeG0=~+DWa4kPkeLS@)%BGWLZ}FwyGsH zRW{;VHf>@3B6Wn-L5}%My#K#S2B)NFJh@osJ{D~*+iy|C4^PI3r)F(>!pno{bNvQ} zB|9E9kv0e@Z7ZoS23&nU`|;z)K|@*JL_4aB`l|A2ULJ;R+N~_0d^Gy+BJ1x|X=xn~ zC(3TO*f#5Oetf21PkIybw&d8iM$fTiy5-aQa26AM-tYIr+vELyA2*7kD18*TC<;7& z{CJ^51<|sOxJE~@?@IvwCp47^u+)>dZ%Vq#>l}Z5xkj_#9CN4BDFq>n%BzkldH&C` z*``_yX7RbOHPWv-S7%RWSl&rDwDaBF-35TziPpn(%MRQ!pk_r^j0#1aRUP=> zN#uupR{3Y@6jP&HnJGvZl~+0cHub^pkfkna@5K_&g4j%fOuBP%EiPv%3bY?;R9WUoe*B*1EbyZ;9eWv9FlB54<9}RaJ@lZ z0$H7}^Web)*Zx}bG#ZV9P%OnJGe)sVjtN&mRModfoak8JF~Rb4Nd%hmKmgi)>$c=# zz=@5=1GKgib0G*a3$R$99(jFfbXodl?07t0`0(44Cr?5{b%N2(j*gC!KxFFyWo@Q| zjqNRZ_iW#mchzbHmkK&I!CXK*q^Dngwmj)u)pm?l)7rjbvZHL?e*5k4w`#uFmvwBP z{Iy!$)4En$dsZz*2L}gNAY-F?^76CKK6BMI?|B=cO3SR?I&spX&r+O)BfN zO)pQx@$r{H<8wVFIvfrcWKlIn1))craIcI7C&!`-fuQ0TSzfym@&0B zNIejkmWe)=i+ zWHH1l*;T57RN#3GraIZ)zybXQ*8r|Trp~&Z%-A&ttIlnm7V#WuRqNhru)?PH@JzC$ zm~ZCQtBTY}Hj>n9C66}+HMN+Iw+<96V^5y4j5pcZ7VA|3!fUgt{i=4two(ifBo&?q zuqvNN+wuGd*7u^pm=DH!oJ3FM>o57I8RwS(V|>TVyX9R!z-s}P=Q$oed>HodNFRLg zLHL_Ts#u2i2_oS78($<32;MWVoVIDt;Pda3laqx$>)Q7KX6u)}em$GbTzjlet|j|f z?W%~#I=`HB?I$HTV80$ft?6NIiREnW&g(;;J$(2uox9j%f@u_FVyf*duO;50P@-2Bji)|w%b-{M{0)j_s z!ZbX$&tr8pY3Y^s%!=oK#C#IfK!7jwSbhEErS{MJ&1N%9{>jP70!U)o#RAOsYoBYM z-k3ZdtHx*f3VAXw!ikafjWio=H48J~N>%<))jjods(dT*Wi=8|7O=N!tIQ7T#e5YH zaIyBN9rP1Ryss0^YXZ!IS;1GgU}EF;`n7G>kp-A)$o~f!tan0(s~x!j0000iZ}xfpdv8Lj3AW>UfBU4hJzd>R@BZL-a6CRAPG5@`1{|m*y}5XP(%S2Lw{`vdf@VD5 z3wkH5-?+MK>D&`1hcM(hJRfy^*S1ZSQ^RJwzZRcw-q3Y@&zNN&_^S~91IN@}yJ_Q= z-aW6pdO-*;eK>^Sn>KCUxamFrdPFbyUw~sCx&hCdE=hCnQ14U4&ZCL;h41Zje9_2 zCZFSxl*+dnzET+yHieOTIhEhkeofuXxINT{0hMNs8ngSVCyuaV?hOOKGBdpT zI-cQkAuOA?WMa4(eC;OUa``d){J~q} z0IwJPSMzHc$n{|3lt-(gnSU;Om3qi@k-hd-wxy#FqWxCryq(V)-^M{MLx~I1u-PxS zM24Bt=ibiPZ|#_jlS3VqNm6M}%PV{NDPj*>;--8%2y1;PA0$=rez8|@(dV^;jxIh~ z+Vf9|XWQrFuX60K@)?t`|4;V+>Ond&Ui-+Ff2#a?wx4ZzWbSeK5hdA+cMr!4ltKHs z4Rbmih4$puQ2Q(DEvHcCg!|(AaGVrJ@>3YOB&i=~I4ixL(bYCXA^Fb!Wox36(r^UP z&iC=Oys!89X}j^$`AwP1u~WiRnd?&A(^z`1#4Tx6{C}inu$m{B&GFjEP*d|Dwl5;n z)P-xp`{VoLN8%^r7vmf0_;hjFmcE|;KJBjDRQXWl!CH2mXEx7mUfTR?&F^pi?dJQN z|Frot%@4KIwluaJ(=xhcY|F%!i(9U4`Dn|7qtocR(E~;wHG0_SrqRcZK5_KPqfZ^Z zV072$p3#3eCX7jAhK^}z4XvqlaO=?4qgzL`j%+=tbwX=L>x|a*tsiK;we|Ma54Zk) z>nB?uYJH^jORYOwpJ@Gu)^E0cr}f3LGseywJA3TPv8%^kGxoZ1jjyLS_M?*F?OvDj zwKPI>BQ&gMhNxw!RamvejTy{(_g<$MxyJ_|Xg z=W_Opy%ustlk<(|-}vSmfAhveZ(RGvk~dB`@QVYVIq>NNAK(A_{#W+@_x_jn|JVMX z@BilhC-&dDZ|%Oz_AUAGgddOoamx>%{NZ2xaK#IAUYPyDtQXFH;q(_eU+8$D?S;uN zOnPC$3nx5(;Q7~|f9?4nKL7mlKY0H8&)@d^d!K*L^Xs2q_x!5oXFWgj`J?vi-*f+- z`}TZt&&T(CY|q_$KDy^4dp@}5_C4$OT)O9yJkkngTZ1~XF4Ut!Jt7PYgTml& zWEc`sI4TSc4PjVl3`d8ia7-8;MucO-ap8FQ_X%NCI1v?POBfx-gp)#R7#qfg@!{lf zN;ox42&aXKVN#eJ+QO939y&s2I6X`a)4~~HdN?!82xo<}!#QDQm=$J+Ibm*?7v_g^ z!-8;LI6qtv7KRJMqHs}I94-z^!X;s8xHK#amxblw@^D3XSGY1<6|N2|!phJUR)y7} zJMgRW({@)UM!`5&^cu&|C-WzTVzZTvXem&e2-p}Zi z2GYa`TK|97#Gix*!h_*6;gRsg@Ymt1;cvpgs&m`KNqJNPm_-6F-+e7k)c@Jl+$&9=;Rq4Y!2fNuP~f>CyCH_;9!8f;fx;$MGo=v|Dd*bD3Q~FT4HeFX4R2iIBg}c+c(u#CV_*D3_ za9?;Rd^$WFJ{xv~KM#+F&%?-{3x5@MhA+ioaZ`Lx*dDjU-ncdVVcZsPi0_u8p91tQ z2p@xVuf*fx{Ma3DjCaK+Y|Ys<%WKxw z+)?vj%~x^%e$6YjC)F;heW3RHwLh;LS~sz7S>1-ZTk5vgeWLEGb$jbW{rLLD^}Y3X z)qkn}+XKRYu>+=;%Q+2CW@*%b<@9`of@Z4>~Y-)Zp_6Up@Gi!FLUQZ159EO9g5 z9JBtIj~w&ZG2b6PV0iQJX~P!{UpxGc;a?d3?C{q{j2tn0ME8hWMto+((<5FvcEqtW zj$L)^ZO1-z?Dvlwa@@@0ZaD5U$31&|&GF-pUvm8Wj(_0zr;q>X$blm#j9fHw)5v>9 zJ~8qqCk#Dd_6h4xxb1{TPIzuq-KdG9t{8R8s0T(pJ?fw9CY-eRq+3q9@1$>?^iu1v*6FQRxAwN)(fV-f)2%-lJ8I`*cqcaMEy z>`UWDj+;Af<+yF*?i}~fxNnSmaeUqQ(c|ZiUpfA!@%N7Z^7uU`hm%h^dEv?HPrl>i zhfaR_CT*Maz@)EE+B3Os^5n_OCckg; zeUqP>ysvG1+mg1M+8$|ps_oS&Bc{xrvSG^oQ@+t&(>|g7%JvVp?`VIj{gsYU9p`tf z>bSAv_Ktfy9`4xL@npw~oi&}!ol`m&b@q1N()m#5Q=LCM{g~5doPO=;A31%;>Cc}2 z^Qp&7oj&!NsW(r(f9jW}zBnyS8$IppX{)B)JnimjUz)aO+G}SVcgFlPHk|R1Grn-f z(`URgef;z*rr$dK-sw+Gf91@PXU;ft)tMhU^Pw}JJoBe#9+)w9#)27ZXWTmD;TccP zc;T#c*2uGFoOR_{H=Ol}vv!@e_v`^@k3W0S*}Z3f?Ch_d{nK-Xo^$#+SD$n1Irp9O z^f~)x4x2e)=KPu0&fGrp(V0J*RWobitogILXWc$)$E+u3{dD%w*=NsQJNwqz_s@QM z_Rr=FnKORQ{5e<8xp~gLbG|g^xw!-8PM&-I+*NbmH}~$jkInu5+*jv~owsP-4f8%W z@9}vr&JXiP&!0Vi?fj3--!cEY=caRyJ9pZ-i_cwu?ycuOcu6x7c9Hr z<_jLa;Ah0~U5HT)6Psg*Pw!*usYvKDqEm7Y?{^)P)@vo`2!`3va*hp$ory z;kOrsMI#rTzG&&98y09wJrA*{;T)O1a zYcJh)>0OsTbm>!1G|pvn$mTC*Rrnet{b{;>$P4}(c_jfzIc2hR*h;3jP~O8EiH*jp-bY|JpHlk?&!DD&DB&c=)`H$Wiw{$j7vt zk9@{G6KDds=!Qt$2cCgA+;O>z{R7WLv_ETe9vgGs#1)j)0)E;dDU~;-wMqJGs*J&_ z_>cUj>^3}DDfn_8s7Z~_o$ffn9$3j`dKr!p>2?hP81BiGH8PA)bWRMxG1Alm@7p6rG0Fhi0JvU``313gRF2LtwX?mcjTpxkifCy7 zAz>7+4aaL@I&L>TxCBxFgm(uZ%J2^OLkGfrvI6vvaSkC%=8s|%dY)<`N>e%4bS#cQ zk;@Wfa5g<)7~ViOe%NyIV~UcqzH-UXWAS)5}pP7qDnmN#=sk*?%)2Z7rY zU~4lqeU5QPQHJnq8pBvnX%_yBFtv}T!UAzOxH~N;`V@iyqQ0@Gux}Q9;5B*N8I#2v z#2~~NyutUH5QnHWyjBa@Y;>A~x9k~#unSP8TrQk=08{t~IkK1WIDz}nXW<(_Y^45p zC)998bJqm0%ho? zVGM8uWbK8vNl^R&uW9-I2mM&bKkXY@=vJA2vhacD5SD=DKk`>6@|V;ltP-}Sc#ecn zfng}Q9#9fwE7M;v!n zgcKUhkRt!4l8Qi_VOspPVhE6@-f?e&eo#*6#v`Rs#zx|D7wUuMh+eELpcY0xo-3q0 z)N|<8`@k(Cuo0``#0COs%Fi3sDIK^HxiNVRx5gi!A!<&mZYBbuZjfFKlD*vDbWC-g zroY({yK1+g+@VmrIFRb4njKla6furLuBDTC1Z%zS&t5UMmRYY6mO=%@ z(AUHxc9r{|O6tZMokS#fQ+`j)oJ}H8Uynqj2gX6)%6DoUwn_B7$ zIS2q~gS-%g2fFPomJ463t5i}+UnE%V1Ik5iV$9t3N@F04v{|p5hB@Jckr@$OvCp4f=7vO3UB4 zM`u8#AK)Fsmh>Za8lQ0jTyi^OGrXv2SIrK_1H2U?B25qtyvMrI>d7i!-^sd(^4VRw zmANhQnQrWnW-bdQI;d$BH#uKwK*blPT1n56MzfePP2)%!xP@hrWpZO#?Kqee1ryVe z&ApBc0f(Rt*P)0CI7*QY;8y9`z5hY44>G@X8(~x&2@BIk@?E^*h5-fgfDK&)g>sHb z^1%3;$-=sU8qe*N6SYiATbr}dcvk;GwoDY0sFdG16J(w3@{kD8)809*slAhWm4-cO zfQlz3Fi1PfHzg~PK!{5k`b~9d*=TDv|=}FYFHOC6gaV2aa9DDI$*4+u5ZH| zZIyGOa3-8&4+qKAC?2v2tZ?8miIM`6rmgbVT*=+SG2#(@1#>XYkK`>87NW-(^blG& z!Ks*E;&b#%;1o3vqE>w;>Sy3Zc?(>NUBfk0Nnb42q!FB&#w_Yvtzm&xvYP@-mog(P zncYlorD5Y0RZbJR00LfLT(iSaP25zCNqz8cg^FUJyo4NN!)4oSDBG6sC+swWN|75) z4(9sOJV*hJSy2IF7pE%#K~^*E#M!HW`odUJ9n{I$GKiweV3TA2gP5jawp`iEhz=qo z!2DI>Mg5s}k2WB3EQ&UZG8Rw|Y@#2)>X_9*undFB$u>Iz2FU}Gf{D{!>-Yl~hz`)F z@RvC{#32ic(85e14|9{Ejf(-Yj9#GQQXJT%ZjFc=a-Avd-onq+rHS&9x@?qn>n`Ff6RuRBAlf~o8{ z2BR>J!sT7rq>r2ETW#OOS`%KY9K}Gc0FLm@vcs7wWMZ{xpQmbg9PXNl(3cd)oq|Pi z<`;&o0xZCcf|mHsb;a0G*iC3*RSw1(e04NXUww@9%a98lLrG+VEO9Q3F%{Psdl<2) zGO8E^Bugeg^vlC|IQef7)6_8{|4y_MpkwwzIBv>$E%52Kb$mLy_l@AR)b)Kp_$-d4 zugTk`D)%;en&FDZf})BGe>JfMm&zV8z0R1>f9`EPXO77W%ZA2ct*nfhZ6!D zf*2JH+p1o`Yb2~2Vagl4v7l?YwTbp|XfwJCR>UY6@qk!52EH@ZJ%_%pQ85t4p>fPW zeXvk`o=5bVAIFzzNsdz;yWPhDeH?@Vfk48kF9vxSoEDQkX1)@iv;hs_-X1 zr*1Odg=uLF#PEc=;--oo_-V}L_OMl!1sV`RrU5qlXvngz)wiG(AIMHSlKM$;qdRE-B->DL^IeNK83+}X#A6O?P%gO{~)2`Qxp&uyp?A!lhUP|5m0 zsDjYfh2`pI;sfwgR6Q?CX4Os+)W%^1_#;D-Qf9^j=kQ2hp0k7i@dDlR4j_pKMl!lI zQ46Ojvw_f5=+2^ogjO)O=mIi|EsAOiY*>LvBG#A%M@oGeCczIdYUU|cvaN!8vZ2ID6aAqv)H5U@?yWw7{#d($0Ytj$B0pF~Dkg3X*dJ3W)V;^P#}Vig>}%}}2_Wa+u3J>#{se&%8-T{kzF^d6G7Q%VM;*zTDA*V!;NzZhr}0WLpXnI*dnGH9c#lK zXBE6QmDr+p;FfLe86FuhaKi%_H(+sJDWAGh|D$FHA`#9zB5uItYId-I!N0wac!v1d z-#LVuDm}~ohtxD&0O*tlf?dv<4$`<@5zGB(TvEWg;5RLoetT&E;U20F&A=F1`pEMXkd7npdAm26_qeCfYY2B}P!X6qVa$YSv%JpUy^d{yWICF$ z*IbQ4GJdleVj>Vv44AmF?`?FlzBlN=u%sqhq{oK1RNx32MTztllUYR4N5fr&uqgyr}L{?wMvCLqlaR z43Yy-Cc)ACBOh<(li-?u$T(jQ6EWjfxR2MlHm4I?#{R+=eUAg`me~sfXTC^$@fpXj zhYZD9LDr6zYZMKXWjYz}8EJ?P-kCQ!LBZNQa55Df_?XzJFtveUM!n9F-i= z^Kd~Pv?k2`tX}mi*D9WjYef#j1;7s;$U!4`Yr$iGe268op|dWMx{4Q51%S89=V66D zxRUDxT*t!m(By;?qiiaqhr{ShXd|@%-Ox7FhOb#NCsJ^8Q=W(cTO2^0T7JrH~f4Jj0e)aLHi2EI$-s`n1*YcruV+CX~m`aQf57S{0eu#Kb4~)E+EYY&&$XlW%ZTCk@71rTMDc)QB^S+B{9f~*NisBwb(gHdS0Pih&p*Xj~ zkl|9YgCs}gBQyl{AoBG8d2ql&zUuQBq|fKMhJz-sA^Mzi!XRbZ$e#8=9gtJExMAEF zdGmMSQ1di9JBg6tF2}-+rc+0Pp$&6cJ8hz}L&=3Ld(9nXcja&RZKPBNld+>EYwNE(DBSSryF2~e}M z76xkTULB5)Y8p6G$twR~5+&@>C+Gq+IooC|&7foBr;rEU4(}3rghhTOrlbj z35Vma#1OqydZDdset;OpN>fTTCcqretmDuk8Vc_AU@=gbsYe84+<`m{U6E0Y)`nWy%#N84uE%s=mXG zLVHl2(g-Dum8oa`SI2WqR^v-!76Z)kW^c^qFd636Mxf3CWNxk?(G#hKD59S5hxBIs zMbJgW!WAohDlR4$#Zc?gkUtQjKTEqAljZn8UsP^jBsIX(gb1n7YJHQ{UgE~i%3+s* zLOuzmtR^H3OEITR(}8X@iSJscDH$`G#CU&Xi@Mio@(hk++DPiGq1J?%((-eM6drt1 zanxWwr8b{ey}p}D zAt_D}eH0Xn<8)5Xj-!O-BQ1z!>VY*ao>ow2*!g##6Zp|Eokms9T$aOw;+53l$3rDm zHmlef*+y8X0=^ONKn0rMSw%2FAErNNO~agv>O5-siqR6P1QpoY&a;7lDF9S(tSu$L z4)%y0TqMEwgN29vKh&vI+Alw2)7~UMlw$Xc2ct1>Q5s!5HtrOJ4bu&wHBRbhCc+b2G%a zs(&Ecf}X-n^-4RNn+emj4udAJaINaHfEyME#>ri#@BVi07i9BD^W1*KEY1*`Oc3JbRYw8MISQcEIOK?qpV--b`vL<)Psa45}IOJ5Q$@mrTOh+XfOOKLT zn9)cLT=y&tD)>Wak6G|$YfmZ7fsX1V)nABGrn^jspu{_L>y%Vqi&<*Xc#$%(@It)> z`5F-idomt~f}jU9bH>76fcG}lop$*^3h}gr4YMr?;0}{gZ6u+xEy}i@HykDO33-_N zfGNzw2(iB6)UqGf6m_F_$x%u z_)`GrpTPpdMFy{CO@2}8euBe{FBuXk7l=b(D)9s_Ep&DeKUED&3hcU4>{Xu4<|SrL z5~$J^`^T9dl>JMbAqy%04~K4rWL6P~?b zMnkP)QeWJA@SqDpODya`EQ@L4gWx>G z2s~#HplTsK_}0yHj@DGEuJAR2RIJl$EL$Jyv{H(mVnn#tpDzC|F!?{N%ObBKPWW{! zxt)}gpjdrZMK;+|VgqbT4; zo{%>#Zs@}%U#5D?+Rf`EoHG-DqNh|*)^6R*{SP9aD(U2^g{^FU$Ub;Ur+HpH1c%Ty z3!Z+tte~j1fLP{~H8x`_bkL{97L)XTQmo(~Jd&_ihfpHqg||W<#-rzqtS6@kqP{Vz zL4Zi~xCX&Fq-7OAQNQln!;>r)_fbjU#-)N#ryQc1KlOlY9tNtsUJr^Dd^kU(X?Ves zUE!s&q=XaHnOvQwtjMrtUJ2G%t%?s5Qs!k8cZV$34#J2{jO+}HKmwOxvZZ`fl0>r| z8aK05PIqp<>CD3~kOB4wPx0MZU@0M-;3i*uE4elD@-haGxdJTEUHX^bGd zDwZklpr&gC3TQo()pX#Rhr|?=$52S}hm~)L2Z!jRA*`^E#xP_4Pi(2K^zMQ6@GSP{ z-wl$V1EpJ9QAi~d+SCcPLyuwX%#SJc{x~K_jF5rH5rPI87dcza58uuC&c`&c$jY>^ ztm^>5*pStaLI3#B>-8s)w|w4bSN^JzM<*dPQM1#j;&!gMXA;CjZ*JPTf3A87o};tg z48E^L3RFw6lahe~rE@BfkjdGaC!ht2a4Pr)uE&yj;TyQgzL1lh604^yL@Q`gxwt?f zbABin`P2ERWIbNt-VauE$2AjK=Y?yEMG5LQ3nP)RQ34@lE(5jZ4^9`^&iQCU1Tw_I zae_FijhueN=+S*VuXE&=yi@E`};L3e7E3wX*@N2h|E$2_bBjyX-AIWO5b*+@Q)aBN@qu9h-gP6>D-zCI)RdEp*~Bxo`C|CVQWyF_p&i zQNejOrs@~=?6K;Q(IS(RS;C?mq01;|gX6fucIsuoc0j6*Q!!Oo(4&><*7E|O1rk~O zfE{to6M8*a2Bn5UFOyh-mPh*OJsUfV(aenS6qY_s*q6T;nsGdx#2iE>f|iRpcWu7* zsj2-~$PBCE_=a(yL(j6KfhB8k0vJ*sm4+DNy-4tlm5#;%j@9VpD}#Zi;@V(NgK01N zCVYtN4t(u6&e>(sBbZojhQiDN$cljMCUBd33{!v5G~nYmagHesFbwi&X@C%wE*MvF z)A77ILg%b_45h~^3iPB!56`&%!L>+ZSOm-TKwrsKQo>=CT!steAyDfp7Y|lAIPeU2 zg(=r-Ar+2O$fsR1&C0CBRo9R!zwX*~%kPl%T%mHVbbS{O)=FW&!YiwJjD?aMs=KmP zE>uZroedi%#R?f}hWr=UvV4`z{Urf4ObX@?EIU~K(WOw=sPs}Y_v;3{wzTsGS)-5; zw{oP+iwsQjlsK{|>mrrr{nk6rW$$Js>`fg&)9%~Z?l6&0wFT;a8TJoX0Zn+WY-JT|rPTb7t(ktdoUJ}6UI{?ibq zQSMnXG@HZrfG_?jf5DrbM`k<(Me@an$UV?By0+>NlmTZ>9^p##CMIi= zp0kaT&VrJf>(qFZ!KF~@m1M=Eu_=cw)fYH3XmyM6N4ngzn#DDM^AuKdDuD38R?1-v z<5$vq%>un*?noJ(JM4L0fc%UgI7~uQpAy^jC(fY7espLs??;DPZFzVVmUL*VtMj@? z&S=uQeK4oVy0lckur7W*g%+9=%S`?f-FWtRZha4`P6-X9xpu;B?{*`uM4iJ}Pv4}# zXrhS+Quik%o!ERIq*-OcQo37pX)C!%kttIR8ePCiJ!eF@rJ^&eI?rR&tLeit*)Qu{ zU9=L{`TA+Fo)6$U(RgKBT93~7CL*YJ+%wK2#uDdzC|H-<X{l%2ZR?+^kp% zCSJVWK~(@RH3fx*8i=Im znK6S;FwU!XmR%9+8o^CA$CIXI2k@jTZq1UQ%I_}G^o|cz{%5{HEb!kMGuHrfV+uVP zZ+wL101mTUZohK=W-fODGGm4?bdgdDvp&G zgV&lJFs`A-LS+?irOE*8@ea-^kXiXByZQ?pfecYnMF?`DU*LGl`xa$hP;05iW_4ZS z36k}pWj+N`d0mvPC1C|eZ5emsuS~TspCsLvQ72yLOj7q|WHTeH>C)<;_?J+~t`5^8pAd49k%E^r+Br#uys;H6Tv^X9>ne!jkp1V-O#jArXZ6n`A2#6I{c;x7D$9C1#W zRVnHq09~}5E6l*9C*Vnu9O{F>h`vXO324pECqY_1$BB0u zLl4{mUHVetkG{UUpbU6QgY*E#O4`^dW21b7?dyxZDlTYS%cq=o4&phZEZSwBJ!T%3 z>4ImkFLRy`#jkRkm?eFQZ;HrRJ(PZ_54^#S>W#~<;N4hhq!}U#(xWmDa~73kzKf&=Dd{Jg&RfPT);Yi>f%#+3$`+`xr14N z9?#O0JXH1)zZ?lj)6kfp(8CD=%s8(kQ%<16yS;H3BbCU=}v)K*Z7bvSN_w zf!PK}ag_<<0%qP>rA%Xx5l23TeY@Yu{HuJA24YKzFP>R~PARj+GUCln`4Sc;k^l?M z_}t0se?~a}bq^q))l|L$T4{lZXc@qm~LQvnr z=@G|t)p6Vo^pXt_HJ`TxLHTq}2K2mMA~(>G&u*}_J=M|V3j9DMsEe#+yg@AK2q>3q zu5(nN(m8{XbB4eum*Xr3YHtS(Qp}tg{_HMo5eZU11N~EdsK?<4xji{c##zY>arK=d zh;v)yy@Why(ZZ79MkN!^#nL0;k1n_T(F-@u&i#Z|Ntv`S-?_?DVUC2X?vcv3^D7BdmLv?s0ej$j|g;-a*eF49TEl zU;lzwf7rE1I0B!|@k#kjhlqu)0{~yK9@^v<0t@wWCYD=tDV19onBtpLfd!*0y(01x zrKG4T8d#P8SmA6CXNWv7I6qEyMU(+LpnenvECz5eiC9H|!Nmj}n_-3tgyQraHy;zu zoS&y9<2V2=x_@qVj<(Rf^|EZ;2V_PERj`WK2v3}lAVSq{!`Db+7h5foW=h@{@PmBs=WJ8dQQqc-Y*+Gqbr(0s8q4hd$Suw^v^&1jyQ2dMJ!M zV^k)b!v3t8pkV091g63>^qcMJ%oallgV%0%i&OI=R`?QZ-Y6=0c6jseyJk&FL*rhK z;ELU{wGs<1l(*8%qIYSo@XpqKg)CKifdfh><`>Ay^a;x^nNui@N+IqN%Ik%mnE_~7 zXcx(ZK~t*`^qY1-CZr@jK@AXP3Q>ZOrpx?uod`#=Zge5EA^Q;Eh7g2ca?8JC*)nO34QqBki{(LI*}BVL}9_|YsN=L z-ooD)=@@&+JMJXL(x3k3-}@&Ji40>#(E;U4;4ClP=^gMS%?-$}#!w8(=G)-d29ZlQ zv8tjC?K=sW_iYp$$H?S7W{+xd~FBTuH@G~YKHAA zJg6R5-Y=Aiu^|g*nj`T8$39`K9dHWrkuVpxXC%)eTw7h4H7=kFMtVwV}bk7+!PvbNN zQnHrHY5?gw&(*3-b@e@TPHX^#I8L$3yr00JWmR)4Qi2rift!UVP(#%2 zqqpqLRxSMr*ia>soppoElmrYBBGkIeq-$;vV~cYz22bLUz9$*-q?Y-b+q}WPwE}FD zWxqpr_9V+aECJ2(C`_4t3_}ox>NQ?emxvd|lxiy$tG^0Z%m4Wu;kc>ybf}tyG03b= zGZ#9ub)OIx%J*qXUXdVpv4pUKgsw;;S)QcqzyanI#-+3kn9*PCR~H=O%8p>KknQdD zkv&gf%>4TyEMlYnp{?PqnqR|IfL`HTWSZ*nSY|wX#Rq%wP*&@h1X-LVLU{I>dcv6Q zliB%u(-bqg0beuXT39}>{s2#mj~R!s3Vqq6P?{@ZAaW@LN8zoftA{U!{AR0DVfQM zNC(lh$ln#rWW1)#X3bnf%;O-2HN=T^xNnvWVHX{*dfIyVSp7#A6wa{avER=lg2#6vKNmcD4ym3M!L@Ox6-Fo}+IrFc=Cyf!Q@S2D%dM6j zScy_ZeJ?_(F{S`RSToo#L%7dkj{MGC!&=PUKu>cwW-H_vJi;3lMPLp#4(NDNKmAT^ zcCw_iIB=pOo`5&{9nng$SfWEu*>9>btZ1<%&`Qe*v}L)9nwo6zNJW@p-@l(7aac}F zg##JT9!Y0WPC#?4NoRSlgyDs0mH#Z3Yz#b_(83lTASpw=hM;B8Fwo5$iw4Q+gI}#* z@wVnIP-@nTc#~^uyl%0aA|I`=XUEwIyvXVj&5=;Va9*y(@T}Z8+d_C}{K1+rmJw9w z!E~@5ivf`TFbLF@(~-uU5KigYFQjR<#PUG6z=L?Q&Y9_);fJ=615{r@=V()Fid-4= zOV}Ti)moetSdn3KepW}SnY0CGFd=R2u#LLo|o!2$yvN$PbI2}|CB){;Q z3Uv&%uRDkd^5g}a>{M@ME+ebg6v8Aj&s*xV>R8#SSbJ{JkdmV&K&W?%}l36JP zO$t5W9(8jOH$CSlZss5~I?xMaCuylGnKgOxXii%89oa?9drSRVpWmvsBImS#&8yI_ zhe25f?|)F3;Ez-hBaj1n)mnT+v|`+MpjRusVvc~dQFJ5T$%P)_N_thO07S`(_`(As zn|F@5^(n5slw;2Qoih-)({N(WSt+(n@o$ZaD(fDyB}BadgG z6uUUrN;2jH^mJUpJC}Z%^Ww+BgK(t06GzH_=uxGkb=HNdmj4jDg}(m>db*Bl@6FN= zGc@F#S!kYTBJ;FFnF^jD(f?Inx9q>rB@K(a`7dkF;x{D=KUDQtU3L7wx);lOnNUNq zoTpY;zo?Puai}AJHN*?t5a(RS8QvHjIpS+i zqgMuitkSm<9aa6HiqIlX6*Z_$JXqx`F0X2Xj)pH#8Bymzb9ie zKhK;Iys3nMsPHHg&YEAK2O4xK48y35Q)+e%U%{(m5o`iMWYK-B(||5M#UIl#)z1+G zMY$<+1oY+fFgNy`Xr%!~Hx)p8x-t<*TYW>+Kx9ej4`8j(d)~VwXNVoRD_!Y}9;^jn zr3RT|z|6}xa!0JYAA_f?-XI->ck(7$ct*b|)f;A02u;1A^UfRgOY$AQ*03MA!I2mr z=i$94qVwcXgrW!wWs20QY6JSD;Zg5+Uml~GfgMSHwZ38 zo-^Kaf3M?pu(Gox?_~W-oig6g!KfA48O&fS2+7KLj+?>`j4XYsm*u~=P_8OmrBW+@ zaf)=n`?n<1~b@Ey~4o)67&myQ65~LpS@D~1NUPv1jCF2$U%!1VoQN-v-w+0Bq$=q`Z&FK;X6XiA3mYNN*Mbxi9{o_Uk@^Hf z@;-2eZ<;H{XI+qGI2=)`BN)bjQ7wef=M{$zT}O~G{<(Hy6Y*K_gqVBSI)X>o(L7GL z)>wV&2-<}9E>HY5KLf=X2ZF{0#SaJ2*qdwAYZ|Ia99eju1aNxB~BEq!l!5&Nwd z&aS7ZGPdwudF$T??s!w5CjV9g1W>BZYB!5h&>-h47JkhwfZVM7$o1#)VrCC-@;C#l zVvoK4s(5F82KYKPXD(lri&Rqy9L4;}#OyPNq7(Q$N`ZqIF<%v?^LZHKmkC8>$;S_| z&YJ#|_b7#Hub?1OgdD^GMr4X6=g-5A`bLkuXBur_8&ZD2>fAsYS?L#4PHK?n5hLbY^1=&pws< zr1VPhLUkj7A;&Vo`tiU4IQfaNSS~NgL7(mj)Ew5ogBfE~~a5V|QWmhRs zDIf(tRLp6TVFp6j@td8c)F|a~*dK;BQNLV=3Rb;OgKa}2Mv&6U=O&v1(f$k|prmSw z6&f+j^&4)#ygn<=8WVxM!mz(dw%JeB~D_%5>8#8Eh!s#2b7k_JdDrk z$^m)+*}_IM!F?m3aIVpydTib${rNgBtgXo8V3`bV>~r``UiZT<8$l98k&_q}C<|6@ z+v*W;4?%d8Rg!edLRX&K!3+-p3Cdu7U+_f;Qem`PAxGB#Rt$hNUc=gobIfpfu@qrz z=bWs+;RP(m#=H0(Q|JSBir`f00N<5n#7{hMCcv`5@LKfuYZ>*)B9MZQ$)NCF&R$IRDlJo+4Iw>v)Q~(FkJjhSs_?QtvI@yHXzSfyyIrni zr#+=ZTMk;%J@OeZodt`y7ZxxpSj%0;gCb#fLoQ=1xd7W~`5|@V^9CB7prXzlPyFsY zi=8kWrBd^c{GshvWn)&q>DA2a^!l z2YyM=znw%hc&<^oR~TWC;dy)TM6Oav2aw2+N&`>}7C}G+8iX+V)p@8vK(#L+Ea^V~ zbB#WOCBj(OH}Aju@!pv)UTJ3{u;mJ_3>)5aL)gSGQz!u$ zRfs{V6^x+lLtYB1M2kuqPZlIj&{grNb2H#hT!I!H9wX4%^xMcz(VU;W3jDCFoRxKf z+eTQ*&Y2v7N7kpnM>Ut=n9||_`OH`}*Qn-`vNJGKmvWIRedg-4yw6Mk*}*0y=BXXB z4QrNkdKg|CF%~_rFRwQHuV$Bi3?0aiy{Zm)%)exAiO<~0h)kcsqs2M(p~RQ>!4Iy&?H6*uj38wFEE4Re z02g)+`FrfZ6@LRAu7LWNI>h;8Pf@hx;opOw`EPRDwN7*`=mKkz7^mz#`XKfRV!Y1& zTHtIm;ALc~Up|g()Hg0Md*b_abp5Du*vsGp$M^l*q2d=l_r^UG16N+Nis<_}Ep?*( z`@}<*Hu`mLU`W=1gKO;yWU8SqWE0Y)U3j$!tlEYmuQlJZtX2t@O{a=BQhy2Wi_(R7-(7abM|J9U3v^ruEhn# z=b=HI@3lJ*usi32{5bF2YPv1v^`QC?ztxUN>vJcIes(>wMLbA~KiJG;vGArD4ZKp{ zTfrO#8$-o7jRU&60kjA=gnxh6#SQ^IvaP8KpQ=TVer4yX-a9SSY33+GJGuOO#`aT2Ic8P4DCb<=&vfNZ={9hzqP0KYy4 zYkb%c+P2EV^A{r|qotjTGP%JWJs`WmM&)C9PTu0IBDSJzS!>y0*wTFP;oOGwV4U?O zBE~UJV@p$6byGagwNH1{jp~LRAF4aB&!W|PsTkR>$LG~JZLl_YhqX1~ z%TKC;4nFVKyZh%G@j2nPljwjh_l-d749e7vG1_HfM^*ZuPAuav>*(HD)(XY&!?mHS z9Ly&*LPRpYXNqMQ=8g5EmKokPMqR|D)3Z|%Unm@FjJEb9G~18 zROvO8*Ysk%X0?aVLWCH<u77K=fP`$# zLPPvWhAiIlJO%GfxL3zp69Bft=i_$8%Tj)~G+nZz<}uWW)x5T4=&?|Yjn$=D?JT;= zvD+Dk(F>y*r4%9*WjPMc{T+6D;~uXuFk>Y?>Y+YyF3gaB9D-x49l%Fh&?c!VxN0J& zQLl637!5z`%2je2m(0TyqF12Z=m`ykUU4Jl#TVue+by3@eRCW$n93BOQ1)Lx!>q_(5SUOXl$iBOkvrL07=-D7N2C|aPWk^dm1}Bi^%4}mAL-3WH@8#&* zT0eqrtgZ{2Bj}fpV6CI>jlv2}oA3++oO=Qr%w8uU9%tt)swK}fi7oqT_=QBg?~-R< z*KMu~&sU@EAnB>-FeJ}a*>|!S7OU$hX0fJvT9V^oG@eJoS3+VU*`#g-Ie@Q@iR1+T z5eBK{XM|HSVv!`b4V9!PjAr&Pqp&FD4(8kPPJ4n#%aE(~IpPk`X=`XJ(vB*I3Q`6d zO*W;a^I7CjmFJ_{fJ!I^2GF$AEQWuKRnj~4!E=U+i9CNzB-jur9@SAY&e^NA8zTx= zz_E+wUn79^OWq&S_q?-XBCR1d^Ex9gPDbCv)Pt`!p@(B?0#2n3a;KQ)^#u7b$%H1@ z0^Xod#q-J4?eoeQ)Bn_wmoYQ(?QGFXVAIkgNx{nHSP zkpru+V%Mng*RNVtZxSLZ>P)!|p+R@mvvp6M?TQLK3+|G0}V|?(n)fJ-I!IL9r@c z&4Tzuz}z&e2Z<@uTWc`>4xu&9&?9xnxCZvt;eL2&aKIx8rBqa9XOKLMjxhAQ^ zFrbPr#=dOslyk*-I#>bDGET&qUadWdC+SAvL- z!Wi|$NLc2HI_wW)u%Ew9h4s;uo@Rifn&8N=VP9Pp@$pc)V!}9BPdQKEfTLrhJyTa- zwsKuTM&Ma2Y5ApBGxNJ*jhM}~;nY7kl z49oC!_*l^d7f{4R4FKkGk32T_g3fS8p*7V* zvM5rCTp%8f&s>9UO6m`pqHqXfl@>N*S~BLdqN!ZXFKrB-tFg!!S9nN2ScEP;JIH(C zyS14Vh`+!pD(?QH9TAzwxy+9b)~zEzykehQWW9s^rHC%n>sf_n`|}wf^l+T!+AVob zKg{OZH6_DAjM;uzHsx0HO*|aiN4sYhd>4qwG@Idqey`f2TE98hIVOk);X>YD^7=9+ zz;q4^2eRu~Odrg1Be*U{rxMTXzOlMwKJHY^#4E=B3F#1Qo6A`sppuJVmDdr53bm>@ zNmR|?x;D>qh5_Gv&a#}<~#=;}|1v(D>97xYQi&mX0(nxqv%*R0NFXY#ZVNRym2|vvg0~b&hq0wj(Y9F_3 zoNo5KI5*EUT0NQxnrRVRQZc8&@VJo+(aLLX(8Ag~+)X)>w~5(>+_O4S%}E(@Hx;G) zf&D^Xd%$Zv4nd1W2jx469!?%(i3s_szF7~<^u##~dm5s^+y^dI;qeQ2*pG6IWao~Y z7=a85XkKIE_96>}H6Jj0ZbBU3S+0Az)42&5OW z6wBv}Jns$O(Y2R)K~Q(B3W0KYU1dJo;Mx!jkVR@=FD9(0mqiVT2p9%$e01hf=R*as zwCXcs)q=Wf6bAS6LYRLZ>YOdRPxkAF_)zXYoUbyc!*bNS>mK71t%~||+&BHsu*01j zdq;Y!IIn>7?#)0odTf^D zM*egzMC;Q!RWlg+&WsIX@CUuva{-a<9M&)d4gg3)s4~_<_`H5%kA0VXxt8&X^Kkz5 z6IRCQ$Wn}ey{vnsz9FuVz$eJC?DZf`P8QX>Q_r#j#G&KGdItQluYyUbeLn;k!_622 z6{1FGfw`fW9+#}g(Uf;8NCMVw^ey@X42gPVJ!f75s!*aHiDN1>ix<+SVrFTIpbYMP z5%FF0%or#vtP$iGybbn@7zxxFjL14^vj=MPVi`=s(D~SF=~g`U{yzJ65&xW_qj~cB zV*58E(}9I|_WJ;Re$P1YVeU%Fc{jHuTiJY#TI9{#HfKOFp7ipVNP0$$E|fWtrw2&q zJr$2&pvb;#i5_>${UfU%**5?)21c$iWAsAL0BtDh#1@(O)E2{=M6N z&4{AuRFZ5OM{W^Ssb&RKib*7k5ZO`oeFtM4a}j)OJ0dmLYQh<~x{+NjXc^=9+BV`6 z-at#T=f>5cTH$QPg64Mchi;3#T7#p{bM>cuhgbz&5QSI}!zS9aeV{K|?BMwr_Fgcq z*3@O+r_42H_I=FVm1ci0=Na#D^%_@7viwHx4Rcz}0$qHF6rfCefgRsRCT9%T zDY=~nlOY_43x=Hr&zIU~jD}6Wt*vN0iUz-TOEfZ0MCZUW5LxT)ur9!L;=HspkP`Wc z6R<`?-vgyWEBs@db++-+($az%i+K z8<&?~if;D(yvyOepbQi1`UkFFpf%`iw5!({`pj@D9e2FRJIumwj@q{;*U56NOrVP~ zyuzwx9|mYH6NH6nBjpCzUaJ_KB-i#a#va&&%ti)fQjHIpmcw3yH$^5In00#Zc5a{XpNyRqtz|j!} z#Dq$K+HFuQ!YmZVRe!>m_1h^Q8Kyp<3&R=5XMZ!(h2xQ*m0ZvVI+12w+JLZ>g`o@2 z+u}o%8jNKW0E4e_T@s;#R{UISkcV?@*!Sk<*vQaf*aRE+Wo{`Yv$?O=#u`}aC0lK& z3`gxi<@B=yg9SjaqOTJcOeQ}!0?pv7%3)Ki z4gmN}xBae5^LYtU3yx_L4m9bdYW+R%SiG0{m-$C?@g5vDf3MQ)y2Wv|pjm0o-yKTA z@=L1?t;^c)IwSr@nrd6r4fRddz2bTG==)k{g#CP*z3y8WN;5iaZHM)$3RXLN&(f8) zpl4@%vB6 z1Z&5z!p0gCRodz*;d#~(9nSYq5OXB}J38Dp@_qbM_NwQ2t?KiAo>x#)R^Rehq#eFz zdcn@YuRvS8vDD)RN-)(?i(LL~-6n$)-X=49y7W~4_ z$zcir<7fYv5};(pJP2oXG(q6AdhD`-uJw1ZLSLV%miU*C=Q2}PlhR-EE&{}|MG){S zbrc{7ZxE80D1E03>m^>--oOPk$R>n$%I9&allU$(Gd{s}O}3B~df^;}Ys63`fJQ4m z#n~s`pu_U|#_T;-dYxFcNl!w}Vhwu#ockz71Pw+I#k{O`wHm>CaL^1V7E&M-S9Crg zmn8`Du6~F76LAfmX5lceTB_oj*&pSL#Y6eE#)95;@AMfL;-TGmved?6(ySVb*WTa` zJZlR%tN=vJxAKzu$3VFC*UztBtH_QC*1UNals*98LZd({Zs|MpC-$7`@p|d(B*v=7 z3P%^i99tj|_8Be&4SN+l>3mjc&RfJa_RX}y44DZ5mKjP{F*a2&_HewW5oz_(;KHFn zEju-fk7YX3IP5XVp6o+`6m13d;bTUJ1->}e1NEjF#bYn5%V>`fOIUDLj9wU4b?{gm zsaOsPDKn9k$MfM_HKHRirXk8ZQy3qsLCK65$*GB+b5*A7`gHA*znUt{t0LmuG2)+V zOEH@NB9Ezx`B-KkeyN+jxHx#_1v9m+O$9B)TZw>vzG5b0D=|^QbI!y$CVw5WFpDaH zJgL}OcD;+NPDCKoF(+#$Q@zJOzQg%j@jG9Q-rpIg`hkuqLn4kzf4a7-6FpEyIs7x0 zX)McWV5Q*8c_2nLK6fmVsV?ZNmjavF`2+b&1+p^-W%}Sg^Gl`^{fZi1V;83w8>-Ja zA&8MSMkp|tHng;lW@3p>H0eEe9@@M#r}Pd~BTUppKuT~62^BoYF9BKi%@Ku=&Bc#} z#BKnUSVhm7JqUi+4X+>ec!aiGLz{Ub#3NlrsI(l@6${Xm2|BdzIWv0}wObLl;DdP| zs0gjB|1_DRZioXq5^s>VIM!C?()kb)V0v>xZ1D`Q5uDPpfn8I3saL>~YhurYucC`e zvO4}+kBaEZ<1j78Kj+J~CEnC?hUx7tUI;?n!Ke6=aQ0x*Wsi1kzUGhS!`7>`E+{dD zc+TUjktl$uyG0j9tjT%|gJ3cC?hF8G@N#vO8f8?Nu1vORl>>sBGQsThl)jges8h_A z?u(iqo{hOAgt71i9_@-kg-xf!*|x(AvqQ`4il6!S{%3A$7NgY=H>r+e2_3Q1cb=v{c*2U_JS@c@u3vc#S;?@!v`O^B>@EY2E|d@oT``l z?X(Z)*;ydQR2EcegfKEL0~+i$E-d!_7>)@K_ao-*Mtf265p>4BjVk@Ux(Mf;`;-_z*OV=M_~UL z-yal4r}4f&82eZI{*hsGy3_ZEgexnveScV(Q28dR|E-}ntPktLhR_q5!}xFmwyW{l z#;_SHa+>vgbJ&7UY{X}p!>aIJJTAlY_4woxNYxysgvt637j5lbzivZM^Y|NjR`+h) zd~)**J)5_z+qj{5)q9(lty|x-WJ2?l$x|i=SZ^Et*JJc8IDP^4o3V~-GVTk*a_mpT z`_r&;WD2%n@wUb5w{B@(u(-Kx^5lifo2PA?cG?uYz61=c0g3gY3(STkJ!`hE@4`;O z-1N6J&~ykpB}~LW2R4zoysQl*$^7*G8JT{=l!;SLqgrsJBMNkU7n23iYs5h-gzSlipXY5Jr| z>o)YZOCCzj4Es=2^YHo7b({ z+6(NScFEeV%{{Z$ue+|Nxnttw=JPi6_H5pOk8j-2g+r@lT-}HF)m5Blx|$^JR)ZJH z(}Vv>@~hLZ*M)uKcv7y@)z02(}-qW^pO#)~5{5yg@)#M&$ ztvc{0*`|VPvSNyrSQBewU967-;t_FR925t~Bjb>GR2&)`;;`5lkB&|8m^eI+h{wj` z;_-20JRy#XC&uR3f+$pjy0Z=udjR@m15pnR#@d}BsEUT7^E3=+E00EfbPRe>Bam~C zLtQ!&nRgV{#57|y>S$E_Ct7-9&zdvtWKQ(x19*>O$IWj;L5NL%+^oG3b|>R zvrorWVlyyvKO5JI%>+7T15P9^Uj!vyjL>pPSQ;)xD7g&r z=<;v{IwV(ytHRajldKF~adaFLJ{4{azlk`0SJ)eF3wMOy4u2Fr9qx}Og%5@AhTjOk zA6w(t@H^oT!tLR2!}sI3@QLu5@ZaI(@JhHZ{CW8M@b&O8?7li+RvrEUIM@}Q4Brgj zKn{B<{Cl`2{Bw9Z{8RWWyz8a#d*R#R8DxsJ;XlHEh7X2oh41Tuqz&O-pzPi7PR41* z^Bcl@!cP!6Z$zyAweaiVec`e2$?*PgQ@A;NApA7^EPN@Bk0-}d;;ATBPYe6QfjBWv zij!kocq4{5CAPA1{atlDITp8kfb(;_`TTydu6UUKy{7SH~6Mh490; zGIqsPadqsDJ@J~jCa#U^;yj$2}H+!}9)?}^*O>tSE` zQTTCuZ@e-7T6|yp^>|Z!f4n(v49|w=<9*?K;kmFo z>55`Z&&%{5A55+%^5692O9q}*XBk^J6A)%dsZiTHQ%Yw_!GSN!|<~JN`WWSA04CcYG!OBEA}b8DER9$9-{sJP_YVA;pwZCDo+bRF~@0fOJF} zmBuxB9hHWrhBPcSrlV6+IwlQIBhs?H zd1-z+H!Vo#rSsDTX<@oBElL-q#p&X-Bwdo0rc2YZbQylb;qr7vdRMwKU6rm*E7Ho; zl~$$IsXO(gYtovuHmyt7rt8xBbbZ>8Hl|JK-Dz{$l6uqDbVGVi+Lqp%ZcM+H-j{wo zJQ6;aZc6VDUkG0ePo$f}qv7-6@6rdtE#a%-x5A&Hp8Hz*jdW}J&G6;$m2_MBt#o_( zVAz>HlzuyXIQ>q#BmHjLo_;TVB>jH6GkrAOmHr^zo&GR=EPXuPll~}uBK#u#ak@8s zGToOxmF`b}5oUOHFyiX-|4S zy^wyGew2QkUQGX%_NISNKS}?QewzL>{Ve^j^iulY>F4Rc(#z?;(<|v0>DBbh^jdm7 z?MwU9f%HZNmts^>_{&PAQd6m|)K%&$11d*U237`D23L-(45=Jd8Cq$m468I&j;=IS zj;Y_eVclfhd^^{-ZN8o2+jie}__ouxr~7uQZ>Rb84ByW3?QGx9@$Ed{&bMuwkKg9w zw)wbiK5mbq=PH*3}Ao*R1Vy0odEwQ+><>IQCophLzAFQ@O)*8ZO=%yrpg3aC+G4+E!K$v! zHEZ!ucV6$h_1!&n>$Isq&-q{H{GVt1uQP?6=bWyyZ94D#wC>tL=NEJbU0duMFYRXh zw)UxmuUoUZr)R_Zt_|JmR@W`;TD`Tmr*6GA{!z1kTl<{4g{Fe_+SDwBd^PLwP`AjA z+E6;G!%)`NaeCb%J8FX|ZbR3mjazy*Z``!Dr!sHDno7@xHT4&{cpF{3i%h(Y+8lY& z+N~SbbZy>x{rax0y+>{=KdW0}BX2H^-07lqPOV#FBX73NCHC1Z+6=m+P|2Vz#lFdW zx|{0s_PV8ZaIZEsOKG598t76p5DI44ss2)zV5>`TsY$R^o7zh^uiLPub}Ju`ytK^! zkz32p>MwOeZnf>8%L={*y{EK)d1?Q>#eUrtCgF|R47?)8-@qI5-P-jVH>}xGyK(Kt z%^OVC*;5D3B4>6`SH4?6Yo1=J@9NQZ&_!F;cWqf~`x}dWQJLb=V~R(QDIPthc=VXk zX;Ep)REsiG=2(4WfdqmfUjlDhVd)9Rg zp0{bsIHV&`X0ax_%wQiaois^x=UQUEj0DKGd)dAFmp#R%6x7?&$@aS`xzbeK3>fgc&mc(YL~9XUJVDVy`XE;rY^Y4^{cwO(uG^oqOEE9IsjQ5 zq{ZthOV)0zy=2{*>$@sTySCOlHk8qrIcI+WXm|da+i=*Q~woW-J!$rc$pCR@hq zm~2?=m~2?=m~0uZW3olOj>(qsIwo5t>zHgAuVb=hx(?5{9iDMJJmYqF#_jNo+u<3v z!!vG&XWS0=nU4Qc%9ZrEQAA<8?eWC!8ANj6NP<9!WdL_|RmQ^>653YoIYdYyl9%?_ zNssM#i4#FkSPuyx2tr7RpOD-+aOchm!4KgWzN+_?JzItV-I{){URAyC)zVe%&+Xwo zqj}G0-ZPpzuI7%bx#Mc?xLQenXvOw(gVBoZS8Tsx`xV=-*nY+KE4E*;{fg~ZY`%^}UzfSx*@f-Bppx*}lHt1K@g(#8xCrV_# zL)JbUz*Buui5n`s&6$)?@5K5PFSm|M%7BUzdakL9qfiQ znf2MA1LC(mgt?WiUz=givd^^RN!no<*E!%!H%mMHfqlrDr0wB=xv?pyH`-WpQCrH( zWLH(0?5Zl0T~%dLsp_WdL`c_(kggLUT_-}iPK0!w2yMkIQ98lCB5gT)wpgEyhb|FS#bG3?q>7@`<#aN| zlkJpU70G?2A`>0M2Z3p?Kkk&L^Py8F;zVvK6p^SRxuuYns3N(gkUm?6i?qMpoA%bG zJv`}(J_)-ZKdG-xFj501%FXe3IM34Vbk%9IQN_uz^&y#^;d~%k3qgrC8+8V2tk4;> zCh4(sXEeQuK3K)W%ML!IxWEw+0uv+fuAydTrLf-ptZLJC(9q z(#3JLy3!lYCh0n6RyN%3x0@NBjViV>=4Un?E!5WZ*o6i-ZyZ)}8WhZ3u~gy9Wr4z{ zg56XsHLq-W<+N8ey<(_n???IS#zPqIIre^(w zg)I?>ZL;^{4A!E2sCrS@d&WjCwX}~%d(W;}wz^p~aN);U@YK`FhV83vqzrB*48BdT zh&Ahq98Z~^;t9HwuDI)J=c<$CZa>SgZVYdf&ZCnyCQmXS+`_A3}mURAIIhX;CgF@x>Ku3R%JL!2Q*H0@EuRL*-kP4t}haW$!t*S z;*)Zg7VTwaGD5_~b~bCR^wK6kJN+iUGU$XmvkB*5`ou2XFJYT@T8W22t1LFP57mtTv z)?Ydqf?a&t7 zq`?K~y`YP4eEUHk`jz0y@ethN)srEZ#SE5FFv_ihVY~)?9*lDZu!}cxMX-h+K>s}W z4Emkm3wXF2+(ntMgRgM?CcrOO!2W#;{eEyiS1eS52e}Z8*?KN~hyw$be==uZ=EqmW zcsDhNpC4G89m&N}ES$2r!7m~gcB|M|6FPe=iv-@@le`W}@O0i6C8!_|tnr2`zdz5W z@&Cfy^{~8uWpn7>mzUmyMOmJL>eIeV&Uvuy-P>lo$6{Y$a)-}>|NI8q>uoIZ*kXUZ zy=fcW(TDBzM;-rE*VlX8a)*~cs`fH(sfib#_VRGw-g;2(ueZCz!920-vvcHVU5xH- zPyb!VuK*Ww+9JqEF0X#xE#(sH(IdJn^M5rT({B8wzSL|h4m&-*&68uP9l2)sijO5F z$^%91y(lMs+k^w}PP)U(99}=#HJ-djWc4|)1_8r++avATW{(PF?yrMV zHX0X^ofr17*Ik~Ghm@3Z=TB-j4VWLW^3jSwS+URXxp*N~&z Gmirr)T#f$# literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/update.png b/built/launcher/linux/res/update.png new file mode 100644 index 0000000000000000000000000000000000000000..c47f0ca18515c966605f4e0c1eeec739b4d83c1b GIT binary patch literal 1139 zcmV-(1dRKMP)AHIP00009a7bBm000XU z000XU0RWnu7ytkSB}qg6(8ZujHe zAKk%WQByi4^!3+=@B8yS&-?p4d_Uh0aL6GC8Qp#x*eL}C1-kU~^qWSb@uixfpF7aLT3*;eh%P55C!OS{Q8TqmVxwI^ zMDhXD0ccQ4EsIDMfKmX>N~!Neq#i&9fExf_0dO3^1b`b#sjX0sV*suIcmjY6zlL0_PUTbV@ zEc5w%cinC``}_MhEf&kQ$Rmj4C6eo2ub183-9eI{g*CU^{mJS7!C-JkL=r^g63ID|*GZn3o}RAg@9$p-4?slDipVt)v5Lss6%`fllU$0ZpJ=gI zYDs?nH{Mc;iiX7hSgRn^ypg@rvOB_(|w9UT)St=sqi*F^mY3Pb+m*R1pV{nY7n zPimUB0RSRmt*)+q-Dot%rKYB)0{BtWv^PWAkjZ5FxU8(KR75lY&vkTkY-DF=Uk(O? z#|8%n0|4$nptWBM3k&Bh7KdrVEjw1yH1+ki@odoc#$K&yaVq;=rVm2}}Gp~9)p1PWv zn)&th^~T^$!mW3|t8W0%3hCD=X`_)z#J8$;rvKq@<+t zBO@ba0Jbzu7^6WY-?`C;E^)Me_I15AZI@4@2u%5ve3OPO_Hdz0mVJB;zCE zGe|Cnv<;FKq4n*MZX+2a86f!;$%%0Oh#cdgJ;6}^(-GPUlG73TJjn~u?u!=f0{=$n z8k(1zn_E0KHuj=Y>dXE1bl@QQL&Wv4cfb7{a>yZj#UEpBYSs>HZFv9y002ovPDHLk FV1n69AKCx_ literal 0 HcmV?d00001 diff --git a/built/launcher/linux/res/verify.png b/built/launcher/linux/res/verify.png new file mode 100644 index 0000000000000000000000000000000000000000..207bd09280a407affb53c09e109c4ba0fc401588 GIT binary patch literal 965 zcmV;$13LVPP)AHIP00009a7bBm000XU z000XU0RWnu7ytkRcS%G+R9J=WmtSaGRUF5^$Eb9L=BW~<&>>=1YGm!h)K)O`SG|IR zKp%7?;H-4a`mjE@W$lB33chSUjCL@~5Vn@KV1p<=ZG@dha*f!*W=$v=BZaPuL((;) zu#x`B{rb=w30c@)np;@=f%|aJ_nhDT-rwQ;&N;v?yX<7tb{lXC5qSr|Q2=`YWJrdl zr>D8iww@hCq*p{dPtd>0<#OMXEO3)YBwbE=eC8pUCi#9PO+-E+d5`3Nr+qz%s+J%T zIRfAifOP=J0lWg>TU)-Mwf;jy_5%0}KqG)h0Ipe<^-DAwr5)o_00w|>05k#c1Gu5J z9AHTG`yiAf0 z0YF4vo12@n>^^Tek)x_2BJOZFoFM75-;ZrmQIq0yt}ZlFji>-Z2e=BzgK8~F&qxh7E70i z9JVa$bCTz_J{ynoe6>HIwO(mzYMSco?7Sc%egOAeE>{r1n*dxL9UbX`fq^;z@0AUG zwe-d9cCP`rsFVuXO(R?6Z>_PhvA?yo^}L7#0NhkcjR9!eiug~X>JtC}sZ?q#7K?r9 z^?G|lq0l^l+e)c50BC4vxF3(l6QNM(EdT`YIslK>`dWohcdF#?s%e^;Kp=3Ur>EyG zfXhlLM~ZS7rMT^4{2rPMqCh{y|leSPVfnVEbtnf$Y+rsn4G@Nk{S zDCU458Nr%kPOuozcF`T=+Wprxhd?QAxCHwzxXre9 n79AHIP00009a7bBm000XU z000XU0RWnu7ytkSXh}ptR9J=Wm48T_bsWdvUp;)3R#NjYEnAyxj`_$ybaT(Az{{9f z47WjZ>tK`Yk10`%NnL;F{x}K1CA)W^CzTf+-s;W1MC>}sQfFuC(0Iqnw-p2O!cJ_N51@IDp zQvkLD*bksvRn}Wc z2;l1C;^NmG9UZJFO0*E-JOB%Tg8-fYa81*++V1Xd1e3q+G&eVoxLhvw^JsH(bMes7 z5HmA-Jf5>ebo~1D>&LuauS?T3?&<0Awzjr@&&**<9({d%BlY$5Tvb)|iKb~*hr{9X z`FuYD01@rV&CNaN@p$fNn#PwdU0R%&nCN0=!;+qv5BK)=veW5gW_~$vJ|Zf}&(Ghl zY1-}i`FWqsX7jbQvuOd-T=tJI-+or?f2 zEO`_b79NR@kFP2yC^#%h((efg39&+m5B*E}IXOA`-MYHES)dNs?|xMMcFK42Esf)6+TtO#ooETJOrTd?6+# zCNm-;BHd=Qz2J7cBLU?3ZI;bnDXTUB0K45jvt!4OhV1O@N+QYyFs{?-J_3-!%;8yC zS)-+;r5gY|cb{}~;2}CXdI7*^LWmN7=~Dn8qWR+D;blp|)YNd` zz=12l%qK}w1b}%V#4&$ql88RY%gZ})-_>`75Pd|n)8%q~o0yom(O+Lx{=-<41pvVC z@NjKwYwK}YmJ7{h^A7+s;YYR0alI&)LyNv zt)0oq$=NK+a^CFh>^{9-|28vALI~5t=Ca%EK7+v^wY9ZH6Hz2H>x2-m0GLAXZ{Uja zmt)NqpsMOmX=!O~Sy@?!^m@Gyz+eBzv9YmpQ&UqX_UzfyH!v{J85tSbZLwH3#KpzE zE`)fEh{^#xWwBUNG)+q z1pvy+%hR1sX95vDuBvK10Jz=mn(^`RQyCc<1O5H|_AOhs+^Vdsd<(!`B1!`A=9x2R zQcFroS``<6O}!mV{(lN){*9T39#DUbnfsX8=l@2Td1pXhAHIP00009a7bBm000XU z000XU0RWnu7ytkS7)eAyR9J=Wm48T_bsWdv-#dTAyoENMa|AXl1$S@@Dd+RK#SP=e zf-xOrjWZlnV>&2@(k=r3=?B`Nz>WTitQf00!gn_=VBYQ7-39O-<#BNEd*O0Q@9R`h319 z0BD+)rIdONKsA8h0elPKlCJBw6YD(z;C%qfYPIgrb^VtlKP!Nin>TOfx3;#LMdSDmlFM-w{G2fw70i+&f#!01cO0aadB}TlKyC=)Y+DnmK~8u`;cz$$z@pu5?|` z@DEO>vsx*2A3!;PVqMq2Sq^Z!-KIbwkfmu_j#8=`z&fSWJpc;8i#O{>-zX={nEt)*@6Jv8W|b6 zd+^}FcgxGmdxOE?!iEhSngDzW0MpacCuV17^J{8quA5Az&k73*?Jk!~NS+aq!vMBb zR#ryy^75`078be+3JNr@*INx>y;3R;VAgClf7IRG?WwP?fBMv^Qx_~2ixH{{H?3l809EdqD3i{g5mo z86%lZ(n2zt(tniXb&~fJSCFJ7(Yr-*iDVnedx=AGn&jh2^8+NmPMQyp%uVY5ntIBT s97}Pyk~IGl$t|n#%a9>MhKGc|0Cc>LNhi5Q*8l(j07*qoM6N<$g13MtPXGV_ literal 0 HcmV?d00001 diff --git a/engine/src/scenes/node2d.h b/engine/src/scenes/node2d.h index b022f49..a624a55 100644 --- a/engine/src/scenes/node2d.h +++ b/engine/src/scenes/node2d.h @@ -2,7 +2,6 @@ #include #include "nodes.h" -#include namespace enginend { struct node2d :public node { @@ -18,14 +17,14 @@ namespace enginend { } }; struct textured :virtual public rect{ - int ID; + Texture2D* texture; textured(){} - textured(int id,float x,float y,float w, float h):ID(id){ + textured(Texture2D* texture,float x,float y,float w, float h):texture(texture){ this->pos=Vector2{x,y};this->size=Vector2{w,h}; } void boot()override{} void tick()override{} - void draw()override{DrawTexture(LoadTexture(""),pos.x,pos.y,WHITE);} + void draw()override{if (texture!=nullptr)DrawTexture(*texture,pos.x,pos.y,WHITE);} void exit()override{} }; struct colored :virtual public rect{ @@ -41,15 +40,15 @@ namespace enginend { }; struct tinted :virtual public colored, virtual public textured{ tinted(){} - tinted(int id,Color color,float x,float y,float w, float h): + tinted(Texture2D* texture,Color color,float x,float y,float w, float h): node2d(x, y), rect(x, y, w, h), colored(color, x, y, w, h), - textured(id, x, y, w, h) + textured(texture, x, y, w, h) {} void boot()override{this->colored::boot();this->textured::boot();} void tick()override{this->colored::tick();this->textured::tick();} - void draw()override{DrawTexture(LoadTexture(""),pos.x,pos.y,c);} + void draw()override{if (texture!=nullptr)DrawTexture(*texture,pos.x,pos.y,c);} void exit()override{this->colored::exit();this->textured::exit();} }; struct text :public tinted { @@ -61,10 +60,10 @@ namespace enginend { Color textcolor; std::string content; text(){ fontsize = 20; } - text(int id,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs,std::string txt): + text(Texture2D* texture,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs,std::string txt): font(f),fontsize(fs),content(txt) { - this->pos=Vector2{x,y};this->size=Vector2{w,h};this->ID=id;this->c=color;this->textcolor=textcol; + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=color;this->textcolor=textcol; result=content; size_t initpos = 0; @@ -101,8 +100,8 @@ namespace enginend { std::function function; bool pressed; button():pressed(false){} - button(int id,Color color,float x,float y,float w,float h,std::function func):function(func),pressed(false){ - this->pos=Vector2{x,y};this->size=Vector2{x,y};this->ID=id;this->c=color; + button(Texture2D* texture,Color color,float x,float y,float w,float h,std::function func):function(func),pressed(false){ + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=color; } void boot()override{this->tinted::boot();} void tick()override{ @@ -112,16 +111,50 @@ namespace enginend { if(function)function(); } } - void draw()override{DrawRectangle(pos.x,pos.y,size.x,size.y,c);} + void draw()override { + if (this->texture!=nullptr)DrawTexture(*texture,pos.x,pos.y,c); + else + DrawRectangle(pos.x,pos.y,size.x,size.y,c); + } void exit()override{this->tinted::exit();} }; + struct labeledbutton :virtual public button { + std::string label; + Font font; + int fontsize; + Color textcolor; + labeledbutton(std::string name,Texture2D* texture,Color color,Color text, + float x,float y,float w,float h,std::function func, + Font f,int size):font(f), fontsize(size),textcolor(text){ + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=color; + this->function=func;this->pressed=false; + this->label=name; + + } + + void boot()override{this->button::boot();} + void tick()override{ + this->button::tick(); + } + void draw()override{ + this->button::draw(); + + Vector2 textsize = MeasureTextEx(font, label.c_str(), fontsize, 1); + Vector2 textpos = { + pos.x + (size.x - textsize.x)/2, + pos.y + (size.y - textsize.y)/2 + }; + DrawTextEx(font, label.c_str(), textpos, fontsize, 1, textcolor); + } + void exit()override{this->button::exit();} + }; struct slider :virtual public tinted{ float value; float minvalue; float maxvalue; slider():value(0),minvalue(0),maxvalue(1){} - slider(int id,Color color,float x,float y,float w,float h,float min,float max,float val):value(val),minvalue(min),maxvalue(max){ - this->pos=Vector2{x,y};this->size=Vector2{x,y};this->ID=id;this->c=color; + slider(Texture2D* texture,Color color,float x,float y,float w,float h,float min,float max,float val):value(val),minvalue(min),maxvalue(max){ + this->pos=Vector2{x,y};this->size=Vector2{x,y};this->texture=texture;this->c=color; } void boot()override{this->tinted::boot();} void tick()override{ @@ -143,8 +176,8 @@ namespace enginend { }; struct textfield :public text{ textfield(){} - textfield(int id,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs,std::string txt): - text(id,textcol,color,x,y,w,h,f,fs,txt){} + textfield(Texture2D* texture,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs,std::string txt): + text(texture,textcol,color,x,y,w,h,f,fs,txt){} void boot()override{this->text::boot();} void tick()override{this->text::tick();} void draw()override{ @@ -165,8 +198,8 @@ namespace enginend { bool active; int cursorpos; textinput():active(false),cursorpos(0){} - textinput(int id,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs):active(false),cursorpos(0){ - this->pos=Vector2{x,y};this->size=Vector2{x,y};this->ID=id;this->c=color;this->font=f;this->content=""; + textinput(Texture2D* texture,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs):active(false),cursorpos(0){ + this->pos=Vector2{x,y};this->size=Vector2{x,y};this->texture=texture;this->c=color;this->font=f;this->content=""; this->textcolor=textcol;this->fontsize=fs; } void boot()override{this->text::boot();} @@ -201,8 +234,8 @@ namespace enginend { bool active; int cursorpos; textinputfield():active(false),cursorpos(0){} - textinputfield(int id,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs):active(false),cursorpos(0), - textfield(id,textcol,color,x,y,w,h,f,fs,""){} + textinputfield(Texture2D* texture,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs):active(false),cursorpos(0), + textfield(texture,textcol,color,x,y,w,h,f,fs,""){} void boot()override{this->textfield::boot();} void tick()override{ this->textfield::tick(); diff --git a/engine/src/scenes/nodes.h b/engine/src/scenes/nodes.h index b64be56..2def91f 100644 --- a/engine/src/scenes/nodes.h +++ b/engine/src/scenes/nodes.h @@ -2,6 +2,7 @@ #include "../gr.h" #include "../aud.h" #include "../net.h" +#include namespace enginend { struct node{ diff --git a/engine/src/scenes/scene.h b/engine/src/scenes/scene.h index e6a205b..35a24ea 100644 --- a/engine/src/scenes/scene.h +++ b/engine/src/scenes/scene.h @@ -6,11 +6,16 @@ namespace enginend { struct scene{ std::list nodes; virtual void boot() { + int i=0; + tiny::echo((char*)"initializing scene"); for (enginend::node* n : nodes) { + tiny::echo((char*)"initializing object of ID: %i",i++); n->boot(); } } virtual void draw() { + + ClearBackground(BLANK); BeginDrawing(); for (enginend::node* n : nodes) { n->draw(); diff --git a/engine/test.cpp b/engine/test.cpp index 5296f9b..f60786c 100644 --- a/engine/test.cpp +++ b/engine/test.cpp @@ -17,7 +17,7 @@ public: s.nodes=std::list{ new colored(Color{255,255,255,255},0,0,500,500), - new textfield(0,Color{255,127,127,255},Color{127,127,127,255} + new textfield(nullptr,Color{255,127,127,255},Color{127,127,127,255} ,100,100,220,32,GetFontDefault(),32, "welcome to enginend!\n" "hehe" diff --git a/engine/test/libenginend.so b/engine/test/libenginend.so new file mode 120000 index 0000000..d81c6b5 --- /dev/null +++ b/engine/test/libenginend.so @@ -0,0 +1 @@ +link/libenginend.so \ No newline at end of file diff --git a/games/endlauncher/CMakeLists.txt b/games/endlauncher/CMakeLists.txt new file mode 100644 index 0000000..670fd61 --- /dev/null +++ b/games/endlauncher/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.20) + +set(CMAKE_CXX_FLAGS "-std=c++17 -g -Wno-error") +file(GLOB_RECURSE ENDLAUNCHER "src/*.cpp") +add_executable(endlauncher ${ENDLAUNCHER}) + +set_target_properties(endlauncher PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/built/launcher/${PLATFORM_DIR}" +) +target_link_directories( + endlauncher PUBLIC + "${CMAKE_SOURCE_DIR}/link") +target_link_libraries(endlauncher PRIVATE + "${CMAKE_SOURCE_DIR}/link/libenginend.so" + "${CMAKE_SOURCE_DIR}/link/libdesktopraylib.so" + curl zip +) +target_include_directories(endlauncher PUBLIC + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/lib/raylib/build/raylib/include + ${CMAKE_SOURCE_DIR}/engine/include +) \ No newline at end of file diff --git a/games/endlauncher/src/main.cpp b/games/endlauncher/src/main.cpp new file mode 100644 index 0000000..97d7f0b --- /dev/null +++ b/games/endlauncher/src/main.cpp @@ -0,0 +1,197 @@ +#include +#include +#include +#include "netio.h" +using namespace enginend; +struct background: public virtual textured { + background(Texture2D* texture,float x,float y,float w, float h) { + this->pos=Vector2{x,y};this->size=Vector2{w,h}; + this->texture=texture; + this->justclicked=false; + + } + void boot()override{ + img=LoadImageFromTexture(*this->texture); + } + void tick()override { + + Vector2 mp = Vector2(GetMousePositionDesktop()); + Vector2 wp = GetWindowPosition(); + Vector2 rp=Vector2{mp.x-wp.x,mp.y-wp.y}; + if (IsMouseButtonDown(0)) { + if (rp.x >= 0 && rp.y >= 0 && rp.x < 600 && rp.y < 300) { + Color pix = GetImageColor(img, (int)rp.x, (int)(300 - rp.y)); + if (pix.a != 0) { + + if (clicked==false) { + clicked=true; + relmouse = rp; + } + } + } + }else { + clicked=false; + } + if (clicked) { + + Vector2 nwp{ + mp.x-relmouse.x, mp.y-relmouse.y + }; + //todo: implement proper multi-monitor lmaooo + int it =GetMonitorCount(); + RenderTexture rt; + for (int i=0;i=mtp.x && mp.y>=mtp.y && mp.xmaxwpx?maxwpx:newwpx; + newwpy=newwpy>maxwpy?maxwpy:newwpy; + SetWindowPosition(newwpx,newwpy); + } + } + void draw()override{this->textured::draw();} + void exit()override{} +private: + Image img;bool justclicked;bool clicked=false; + Vector2 relmouse; +}; + + +class test:public program { +public: + Texture2D bg; + Texture2D buttonfore; + Texture2D buttonlock; + Texture2D playbtn[2]; + Texture2D menubtn[3]; + button* buttons[8]; + Texture2D buttonslabel[8]; + Font gamename; + bool vsync = true; + scene s; + RenderTexture2D target; + Image img; + bool captured=true; + const char* CONF() final{return "test.tdf";} + test(){}; + void boot() override { + tickrate=10; + framerate=10; + SetConfigFlags(FLAG_VSYNC_HINT|FLAG_WINDOW_UNDECORATED|FLAG_WINDOW_TRANSPARENT); + tiny::error("is transparent lol"); + InitWindow(600,300,"test");target = LoadRenderTexture(600, 300); + img = GenImageColor(600, 300, BLANK); + SetTargetFPS(GetMonitorRefreshRate(GetCurrentMonitor())); + this->tickrate=GetMonitorRefreshRate(GetCurrentMonitor()); + bg=LoadTexture("res/launcher.png"); + buttonfore=LoadTexture("res/forebuttonon.png"); + buttonlock=LoadTexture("res/lockbutton.png"); + gamename=LoadFont("res/showcase.ttf"); + menubtn[0]=LoadTexture("res/btn.png"); + menubtn[1]=LoadTexture("res/btnhover.png"); + menubtn[2]=LoadTexture("res/btnpress.png"); + SetTraceLogLevel(LOG_ERROR); + //468 + //58 + buttons[0]= new button(&menubtn[0], {255,255,255,255},468,58,96,16,nullptr); + buttonslabel[0]=LoadTexture("res/options.png"); + buttons[1]= new button(&menubtn[0], {255,255,255,255},468,58+(18*1),96,16,nullptr); + buttonslabel[1]=LoadTexture("res/website.png"); + buttons[2]= new button(&menubtn[0], {255,255,255,255},468,58+(18*2),96,16,nullptr); + buttonslabel[2]=LoadTexture("res/forums.png"); + buttons[3]= new button(&menubtn[0], {255,255,255,255},468,58+(18*3),96,16,nullptr); + buttons[4]= new button(&menubtn[0], {255,255,255,255},468,58+(18*4),96,16,nullptr); + buttonslabel[4]=LoadTexture("res/update.png"); + buttons[5]= new button(&menubtn[0], {255,255,255,255},468,58+(18*5),96,16,nullptr); + buttonslabel[5]=LoadTexture("res/verify.png"); + buttons[6]= new button(&menubtn[0], {255,255,255,255},468,58+(18*6)+15,96,16,nullptr); + buttonslabel[6]=LoadTexture("res/versions.png"); + buttons[7]= new button(&menubtn[0], {255,255,255,255},468,58+(18*7)+17,96,16,nullptr); + buttonslabel[7]=LoadTexture("res/exit.png"); + playbtn[0]=LoadTexture("res/playoff.png"); + playbtn[1]=LoadTexture("res/playon.png"); + s.nodes=std::list{ + new background(&bg,0,0,600,300), + new textured(&buttonfore,3,36,62,62), + new textured(&buttonlock,3,36+((62+4)*1),62,62), + new textured(&buttonlock,3,36+((62+4)*2),62,62), + new textured(&buttonlock,3,36+((62+4)*3),62,62), + new text(nullptr,Color{0,255,0,255},{0,0,0,0},232,19,1,1,gamename,16,"FORESPEND"), + buttons[0],new textured(&buttonslabel[0],468,58,96,16), + buttons[1],new textured(&buttonslabel[1],468,58+(18*1),96,16), + buttons[2],new textured(&buttonslabel[2],468,58+(18*2),96,16), + buttons[3],//new textured(&buttonslabel[3],468,58+(18*3),96,16), + buttons[4],new textured(&buttonslabel[4],468,58+(18*4),96,16), + buttons[5],new textured(&buttonslabel[5],468,58+(18*5),96,16), + buttons[6],new textured(&buttonslabel[6],468,58+(18*6)+15,96,16), + buttons[7],new textured(&buttonslabel[7],468,58+(18*7)+17,96,16), + new button(&playbtn[0], {255,255,255,255},406,(18*11)+17+9,153,59,nullptr), + + }; + s.boot(); + + } + void tick() override { + if (shouldtick()) { + s.tick(); + } + + } + void draw() override { + BeginTextureMode(target); + s.draw(); + EndTextureMode(); + + BeginDrawing(); + ClearBackground(BLANK); + DrawTexturePro(target.texture, {0, 0, 600, -300}, {0, 0, 600, 300}, {0, 0}, 0, WHITE); + EndDrawing(); + + Vector2 mp = Vector2(GetMousePositionDesktop()); + Vector2 wp = GetWindowPosition(); + Vector2 rp=Vector2{mp.x-wp.x,mp.y-wp.y}; + tiny::error("%f %f",rp.x,rp.y); + + if (rp.x >= 0 && rp.y >= 0 && rp.x < 600 && rp.y < 300) { + UnloadImage(img); + img = LoadImageFromTexture(target.texture); + Color pix = GetImageColor(img, (int)rp.x, (int)(300 - rp.y)); + if (pix.a == 0) { + SetWindowState(FLAG_WINDOW_MOUSE_PASSTHROUGH); + captured = false; + } else { + ClearWindowState(FLAG_WINDOW_MOUSE_PASSTHROUGH); + captured = true; + } + } + } + void exit() override { + s.exit(); + } +}; + +tiny::ErrorLevel tiny::level{6}; +int main(int argc, char *argv[]) { + netio nete{}; + nete.download(); + tiny::startup((char*)"enginend test",(char*)"1.0"); + test e; + e.boot(); + while (!WindowShouldClose()) { + e.tick(); + e.draw(); + } + e.exit(); + return 0; +} \ No newline at end of file diff --git a/games/endlauncher/src/netio.cpp b/games/endlauncher/src/netio.cpp new file mode 100644 index 0000000..a0175ef --- /dev/null +++ b/games/endlauncher/src/netio.cpp @@ -0,0 +1,5 @@ +#include "netio.h" +size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { + size_t written = fwrite(ptr, size, nmemb, stream); + return written; +}; \ No newline at end of file diff --git a/games/endlauncher/src/netio.h b/games/endlauncher/src/netio.h new file mode 100644 index 0000000..c41e730 --- /dev/null +++ b/games/endlauncher/src/netio.h @@ -0,0 +1,110 @@ +#pragma once +#include +#include +#include +#include +#include +#include +extern size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream); + +struct netio { + netio()= default; + std::string url="https://github.com/kin-fuyuki/forespend_cpp/releases/download/"; + std::vector *versionhistory; + void download() { + CURL* curl = curl_easy_init(); + CURLcode ret; + if (curl) { + FILE* history = fopen("versions.tdf", "wb"); + curl_easy_setopt(curl, CURLOPT_URL, "https://raw.githubusercontent.com/kin-fuyuki/allgames/refs/heads/master/versions.tdf"); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, history); + ret = curl_easy_perform(curl); + + tiny::TDF_FILE fetchversions; + fetchversions.filepath = "versions.tdf"; + fetchversions.read(); + boost::unordered_map* foreversions= fetchversions.getclass({"forespend"}); + std::vector versions; + for (auto version:*foreversions) { + if (version.second.type==tiny::TDF_Type::TDF_DEFINES) { + versions=*(std::vector*)version.second.datapointer; + } + } + std::sort(versions.begin(), versions.end(), [](const std::string& a, const std::string& b) { + int ra = 0, rb = 0; + float va = 0.0f, vb = 0.0f; + char pa = ' ', pb = ' '; + char rea = ' ', reb = ' '; + + sscanf(a.c_str(), "%d.%f.%c.%c", &ra, &va, &pa, &rea); + sscanf(b.c_str(), "%d.%f.%c.%c", &rb, &vb, &pb, &reb); + + if (ra != rb) return ra > rb; + if (va != vb) return va > vb; + if (pa != pb) return pa > pb; + return rea < reb; + }); +#ifndef GAMEPLATFORM +#define GAMEPLATFORM "l5.64" +#endif + versionhistory=&versions; + std::string version=versionhistory->at(0); + FILE* file = fopen(("fore."+version+".zip").c_str(), "wb"); + curl_easy_setopt(curl, CURLOPT_URL, (url+version+"/"+GAMEPLATFORM+"."+version+".zip").c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); + ret = curl_easy_perform(curl); + curl_easy_cleanup(curl); + fclose(file); + + + int err=0; + zip *z=zip_open("fore.0.03.a.g.zip",0,&err); + if (z) { + zip_int64_t it=zip_get_num_entries(z, 0); + for (zip_int64_t i = 0; i < it; ++i) { + struct zip_stat st; + zip_stat_init(&st); + if (zip_stat_index(z, i, 0, &st) != 0) continue; + + std::string name = st.name; + std::string full = "forespend/versions/"+version+"/" + name; + + if (name.back() == '/') { +#ifdef _WIN32 + mkdir(full.c_str(), 0); +#else + mkdir(full.c_str(), 0755); +#endif + continue; + } + + size_t pos = full.find_last_of('/'); + if (pos != std::string::npos) { + std::string dir = full.substr(0, pos); +#ifdef _WIN32 + mkdir(dir.c_str(), 0); +#else + mkdir(dir.c_str(), 0755); +#endif + } + + zip_file_t *zf = zip_fopen_index(z, i, 0); + if (zf) { + std::ofstream ofs(full, std::ios::binary); + char buff[1 << 16]; + zip_int64_t read; + while ((read = zip_fread(zf, buff, sizeof(buff))) > 0) { + ofs.write(buff, read); + } + ofs.close(); + zip_fclose(zf); + } + } + zip_close(z); + } + } + } + +}; \ No newline at end of file diff --git a/games/forespend/CMakeLists.txt b/games/forespend/CMakeLists.txt index bf3e4d9..82ba8f3 100644 --- a/games/forespend/CMakeLists.txt +++ b/games/forespend/CMakeLists.txt @@ -16,6 +16,6 @@ target_link_libraries(forespend PRIVATE ) target_include_directories(forespend PUBLIC ${CMAKE_SOURCE_DIR}/include - ${CMAKE_SOURCE_DIR}/lib/raylib/include + ${CMAKE_SOURCE_DIR}/lib/raylib/build/raylib/include ${CMAKE_SOURCE_DIR}/engine/include ) \ No newline at end of file diff --git a/include/tiny/term.h b/include/tiny/term.h index e3a0f9b..c70ce7b 100644 --- a/include/tiny/term.h +++ b/include/tiny/term.h @@ -39,23 +39,23 @@ tiny::ErrorLevel tiny::level={1}; extern tiny::ErrorLevel level; - const char* WHITE="\033[0m"; - const char* BLACK="\033[30m"; - const char* RED="\033[31m"; - const char* GREEN="\033[32m"; - const char* YELLOW="\033[33m"; - const char* BLUE="\033[34m"; - const char* MAGENTA="\033[35m"; - const char* CYAN="\033[36m"; - const char* BGRED="\033[41m"; - const char* BOLDBLACK="\033[1m\033[30m"; - const char* BOLDRED="\033[1m\033[31m"; - const char* BOLDGREEN="\033[1m\033[32m"; - const char* BOLDYELLOW="\033[1m\033[33m"; - const char* BOLDBLUE="\033[1m\033[34m"; - const char* BOLDMAGENTA="\033[1m\033[35m"; - const char* BOLDCYAN="\033[1m\033[36m"; - const char* BOLDWHITE="\033[1m\033[37m"; +inline const char* WHITE="\033[0m"; +inline const char* BLACK="\033[30m"; +inline const char* RED="\033[31m"; +inline const char* GREEN="\033[32m"; +inline const char* YELLOW="\033[33m"; +inline const char* BLUE="\033[34m"; +inline const char* MAGENTA="\033[35m"; +inline const char* CYAN="\033[36m"; +inline const char* BGRED="\033[41m"; +inline const char* BOLDBLACK="\033[1m\033[30m"; +inline const char* BOLDRED="\033[1m\033[31m"; +inline const char* BOLDGREEN="\033[1m\033[32m"; +inline const char* BOLDYELLOW="\033[1m\033[33m"; +inline const char* BOLDBLUE="\033[1m\033[34m"; +inline const char* BOLDMAGENTA="\033[1m\033[35m"; +inline const char* BOLDCYAN="\033[1m\033[36m"; +inline const char* BOLDWHITE="\033[1m\033[37m"; #define ending \ mixer.append(info); mixer.append("\033[0m\n");\ const char * finalinfo=mixer.c_str();\ diff --git a/versions.tdf b/versions.tdf new file mode 100644 index 0000000..1bf617d --- /dev/null +++ b/versions.tdf @@ -0,0 +1,3 @@ +{ forespend +0.03.a.g +} \ No newline at end of file