From 71081fd52f727b5e7e4c8df7e94a53b95f7d7ec9 Mon Sep 17 00:00:00 2001 From: nastys <@> Date: Sat, 23 Nov 2019 03:12:14 +0100 Subject: [PATCH] [Patches] Add custom patches & fix MP4 patch --- appveyor.yml | 9 +- .../patches/custom_freeplay_text_example.p | 6 + source-code/data/plugins/config.ini | 2 + .../source/plugins/Launcher/FeelsThinkMan.gif | Bin 0 -> 106958 bytes .../source/plugins/Launcher/Launcher.vcxproj | 3 + .../plugins/Launcher/SkinnedMessageBox.h | 3 +- .../plugins/Launcher/SkinnedMessageBox.resx | 3 + .../source/plugins/Launcher/framework.h | 3 + source-code/source/plugins/Launcher/ui.h | 2 + .../source/plugins/Patches/Patches.vcxproj | 3 + .../plugins/Patches/Patches.vcxproj.filters | 5 + .../source/plugins/Patches/dllmain.cpp | 163 +++++++++++++++--- .../source/plugins/Patches/framework.h | 36 ++++ 13 files changed, 214 insertions(+), 24 deletions(-) create mode 100644 source-code/data/patches/custom_freeplay_text_example.p create mode 100644 source-code/source/plugins/Launcher/FeelsThinkMan.gif create mode 100644 source-code/source/plugins/Patches/framework.h diff --git a/appveyor.yml b/appveyor.yml index b67edd7..9e36d2d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,8 @@ after_build: - cmd: >- md %TMP%\full\ + md %TMP%\full\patches\ + md %TMP%\full\plugins\ md %TMP%\full\plugins\pv_equip\ @@ -19,9 +21,10 @@ after_build: md %TMP%\full\ram\databank\ - md %TMP%\update\ + md %TMP%\update\patches\ + md %TMP%\update\plugins\ md %TMP%\update\plugins\pv_equip\ @@ -34,6 +37,8 @@ after_build: copy "%APPVEYOR_BUILD_FOLDER%\source-code\data\README - PD Loader.url" %TMP%\update\ + copy %APPVEYOR_BUILD_FOLDER%\source-code\data\patches\custom_freeplay_text_example.p %TMP%\update\patches\ + copy %APPVEYOR_BUILD_FOLDER%\source-code\data\plugins\ShaderPatch.ini %TMP%\update\plugins\ copy %APPVEYOR_BUILD_FOLDER%\source-code\data\plugins\keyconfig.ini %TMP%\update\plugins\ @@ -46,6 +51,8 @@ after_build: copy %APPVEYOR_BUILD_FOLDER%\source-code\x64\%CONFIGURATION%\dnsapi.dll %TMP%\full\ + copy %APPVEYOR_BUILD_FOLDER%\source-code\data\patches\custom_freeplay_text_example.p %TMP%\full\patches\ + copy %APPVEYOR_BUILD_FOLDER%\source-code\x64\%CONFIGURATION%\*.dva %TMP%\full\plugins\ copy "%APPVEYOR_BUILD_FOLDER%\source-code\data\README - PD Loader.url" %TMP%\full\ diff --git a/source-code/data/patches/custom_freeplay_text_example.p b/source-code/data/patches/custom_freeplay_text_example.p new file mode 100644 index 0000000..a41445e --- /dev/null +++ b/source-code/data/patches/custom_freeplay_text_example.p @@ -0,0 +1,6 @@ +//# Enable FREE PLAY +// Just in case it's disabled... +//1403BABEA:75 // ...enable it. + +//# Custom FREE PLAY text +//1409F61F0:!My text \ No newline at end of file diff --git a/source-code/data/plugins/config.ini b/source-code/data/plugins/config.ini index 8ce9e90..5c0bcee 100644 --- a/source-code/data/plugins/config.ini +++ b/source-code/data/plugins/config.ini @@ -58,6 +58,8 @@ Enhanced_Stage_Manager=0 Enhanced_Stage_Manager_Encore=1 #Unlock PSEUDO modules (incomplete, will default to Miku) Unlock_Pseudo=0 +#Enable custom patches +Custom_Patches=1 [Graphics] # Set to -1 to unlock the frame rate. diff --git a/source-code/source/plugins/Launcher/FeelsThinkMan.gif b/source-code/source/plugins/Launcher/FeelsThinkMan.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd88e2652af30db3eecf936b67628a72e07aa92c GIT binary patch literal 106958 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%0DmIeG0l32^o98{IP%XxHbHmjrz?Wi}__a z2`$&mi(t|6YF2j7<>rHay1|rGyQ2Jng5tV&<=6gIGVX(fwi@*6pIGi z9NS&7a&?o_o+0RCM=He>+b!+dw)(PY3~ttG0|n!H^!ds8W0O#U!;3HNg|vgw+6DK z=Bkhh$pFX>o7bO1X`)eNX@&hfklo5J(!Gh9j3$qC&!QFn(U#iEBAuE9!16gqfTn!$ zFqWNj&Aec0zIgC2kR5%G4nVpe-7CIayl(o)xhaw|JvR}VbK^Blib86=r>3*?%aOR*fJ!tjsH8}vX zt1i2*3F$K{@bjg;o}}EC295olbPtMNyG{r8>gm5o_xL(4>7Imy_94oynjg8deB7N! zx<9c-y0^(Dkx#S(XX#2r?pZnqD9ka(fxGnBikvOq$}Z>SCm{%72<|ES1Augo#jla> zfjRy^uhah<(tXzCX=3QF;ks)0zme`$E4u)23WJYJy2rWmEs^KfNcT%T(tS0LbWcwN zuGvkF2QLuMz#zCI+xF>UD($v&Pucn0f&tR~zCj-8e)Q~m;FKMp*cs9-*GTv5YT%R| zpxC7WgLb!{r2CHY4Zt;f5D#MaZk$(~m;NN(hXN2g%vlQ#0}RZL_xvK=%dC;^gSe#o zRo<+9`4{OvYmVOWi*#S{AEbMy!Jnl29@+E%Al=skpm zx^LXh(EK%b7XV22Mm7CCytz9EFw_5awN9`6d9}VTQi(^pFZM>40;GFi{3l(*U~D73vA}?$`qZ4m{HRzQBwJe%`caoE0d1bHRA*XtiaRjRIEc++Z+?NMMbUk!I_u953z&f&Mhs~F&)cO$ z-3N@`?d1ECR)B+c@pU+&1rud4T7MnakZ=+GMEvHa)n1>f{yn-^x5-N;BqyrJBm$Fo zueWIK1^e3`19`~{8wCckIz>wcVyy?yJZk#Y)9?I0c)9-DSpOg7y5Gk7-^Tia-^Tj? zSH}APTRHcc%fC7Izd856IrqOg_rE#!zd853=K<(P-QS#hlrI}n`I~e9n{)r0bN@et za}PuOcdrG=E=~V>baihIT4j5clVP>g7FN0Z!u{bpWooQzx((qaL0d~TJ!E&c?cb&^ zRpd~4JmS`^dZe_q{0zQn)^?roTa!gL1xnFiC0+2Bb(<-LpLUq8x43ZOzMEIW6ysjK zjk~^>gmUw9rP`wNwRdFm*s~~~TD-8fwP?bt`yIq_qc>`zH5D5YHye&eis?VNq(~gt zo3gY`r6*e@aOb1&p-1Wb7E^iHsoao@d*l?_I;GEzyLi>71{~}g(1dJ~Pz*Ql`TY8# zDXm>?@17c4h`YeE8<+0)d+YD8hJLlSzH$tHICTaSA^48rz^A#y|RNh0KDz+ock zp}m59`R2-Awems15swYe1QXjAjvif)7{Noq@}F(Vj)4c4G6kMWgl^Bf|08@VWoyr8 zZ+Ny82vx?#f#!KJoz)M+I`Ouehr^$Z~$%m_Dw;z>KmCy5z zy7G-ugVSA??;Ux0W6z|$BRz}{ERT1H@bbRxTb&i1?y#`i)Ym4xTB|xd>#Vm7r`yxL z*gi=iL@_1dnMMGSEo*#wJ|1Kwk7o}y`W=XASnr1?j|jSan(fw*Rt(*mY?pXJlkCv& z@Qw54bzkQ+5|!r$1yu{bR5Xt&1|h&gRIDu@RDP*XaEIV9rD^1jYq?jn;e#EO+1=TK zl`~C=6{k+T6)qjZkz(83hbZ}7BQRT;q z3Z27ULhV#kM;PxVWv;&YB8ZqDZnM4m<$!16<%qX7e2LiNk-0u)4;7R_QPW8mMZ1$< zH51gWdUqUzm8Un3lgR5;Q#RBgoW6mNwls1MOL~gEnh-dmvhhB1`rCcGKO{-kZWXU* z&P^(!L?Q(m*WnPlT|<@yHM^5&GvHzK_sY_Y#~JHFG`1Xo8-{I$CodtF z9QSa8oEQ^_3~dgw>#sau??}rMAKm66wv1I;XOJh=>C15uJ6d-7bEn2; z8OUg;)M@vB=!w0=2!k$trY}r=d%1UHE?pb%~ctwJFy%5hvrM$Owi6!hh|8C zX5r4KrbAI~8E}ywwa`uwpKMk4839T?3TcxY_MxTn`Es}Q8<}1DPE2SRI$}fh5Z}R? zPkJ)fi?zJ2j?umw3-8fgnaPHsib-`v-UVjdmXajBERx%kQO~0JD@jze@K0|DN;}sL^d8x-X+xeVZAh}m{ zLYI;t@wsvP1zxV(D35)3@A#LN`VAX4;xH;(%*nFy#CH*nZ(xy}+Ar5?72e6Wf->&9 z?Q6N9Cj79aSM1*YnKstW%dr&&{!%FrzB>t&I75cN;HMq|C|xhE^~7TrYbm~oqRX*{ zn6qi(ceX+s_Rt>;Km7vN-jFg>nmlLqtodjw-ltM5wSQxNVc%8k!-e5gg_dXc4``LT z>Q-sVE|x>Ah{-=TksA~bNGO}qdZcU5`fV;@AB)hyLxv2pn;~+dQ`DY^N+(G6Z*h}t z=cG8F_e5i@(UQXEW@ji%xd%sc6`jzOiMaEufb*j`H6pZ&{j`3JT6vC{BQ?WC3t{X^D8VFhs&myV2}w0B#>76LR)4 ztMb7v{SmVbCm##MSBpJi9Q_dLTz62%it)!+s!ckZxWVK#M5J>*o8q#Yb*RCw#!mjg zy110usfZQ3xi43(g+mq`^=kK}L0-ySA~H!zlFg0daD@tIXC0w~yOKi5{M#;vdrT?X zH@3c0OElBCAl<^>_bvx zX@P&sszNx>^CPs5<$K=Z!Jivm8HHB^bz07C?}u@)VJ!hipMGs@E5A6CPqB+8 zchzC+xMfEYAB&YS6~xG6J6B@(L*d|SWPaV%VCc=<4kdn9knWU%Ks{z!gaK93OU@H( zX7#GXQwn|ADpJXL&yJLYXE`$tLuJDG#0$Y$LoQFH58`{}?9d?f)f!N}Pg&oH`^L}n ztCnI!JH_}QOAAYkGz;6W&m_Z2R7zxQzr)blhXhAjXTEj`r@q$_&f;S1=^E2&NP|n= z^zE+MLl(qaWWh)uHHZtV7jWLC-;zr=agv8|0O=k07UzagkMN)0CXf7itCjLmg}GwS zJ)x)SL43|DJ&4>DxaDOJ%#Q)~EO%FBlF6o~Priwa|D&~^kI8p}C z2rQGt${~!n>v|%DRjIHEQO|6!j?4#C7u~rEFSUn?Afkn6-XMNy8HGWzj|i7x-%p@` z@q~B;cOoF}Ly_{y?5ZHijFN8Rxf21GdfomH7Vc{k0f2L7kl^CPod^)z;3P5)q-hqTWg9vesghGIY z$3b&BcaJCGL@MHHqC_lN&<-O69*uu97ID2DVf;Y^8_hf!MsjCGDnmLq zos~T2otYLccx)MYE|{mgV@B$PW_VVw6L{{RVn7l#r%11@1jxB6SONi92^i#cds7<2 zDN?k;Zr(~@nXsn2i#45(G3^G!$b~~w#q(hWv^vsl7Bpc#7vS7IMnDhy6g1@)y)#eY z!tWV;gp#}oTybmSUXl4?!J#8(X(VN8Zo+(~5BBFoAi3?x52ySAGt~32`z}k|V>N2xL!{;S9JFfq_h^bSi>|j=KoB?yx3B zpe*Z%Tq|HAK+To@#%0@WLzYdOr_fp{J80aAfGH{qE6s0Hi7=!{-7-N2sp}cNK!lW< ziZHknft7UKPZ|lQoAu4LxDx?sTB^{{k!wU!=2T&z1tdX}+JTe>Tz80w`ip&(2}U}H6Li{!6y|3LCcT?^ zD*@2){#niFoSaS5WeueK#KFX1!VcgDAK`iu0N$&GNppesjFXQ^djqg?u3nhgGn)>K z2~=Qp2b<6%!J;I#E`kAdK?@4GnyJ{rDRZYuANM~V6L|kZ&8sDBVGMbi3Ind~_b{Lz zP(N1!hds=XEV}VkXP3@Iw}Tb_poC|QTdjB4DM#hoUlC-1J)@MJ(Nm9)yGPS~1)*A; z)pdYRn4lFxaTZM>T+to#tn`3jf(5$XkZwkh;?nNf)usc2JFw_f2El4nW?!U4`=a1F zY}EbIAQ3hQY6IC8vw6q)054-@r|&Au#LwK z2&S{a*B38R`4J^pp)PlGz;efDV}!>h#m+*G)#?U|Y>>PlIinuTRot;9e9-((fZ~p9 zO3H75@YwdM&B(MQ$=lyID=mqMJg<>$+T7%Rsdvn^sU|$m1WnO6p|e%!;XnL#RN$ww zN)-=<^oXL%5)5pp5pIo=!zX<9*_ER(9&WY`4p8uQqjvTMu-{Lxy=n$y3!jFHtnRS^ zbm6#a+9%a6j)AyA4A*Z*L-CM!A{OVjZrcd>?dU`(xKgK#Pt~t!mk#43?s8#o(-lb# zszc4uM14%7zTgt&_J^xuLv&ytVB9Dn2<1=3!A}}Mx6WR<$lC|Z@-tjkT7Z3k7O)S% zbN2xcW}7(OW<_j>y`dU@U-Oc?*8l)&`?9fl{C zaW3kzE=7>eKqj!kzEq@iQ^Di$>!#p{Jcb3}wrd6E0go49bOCVJ4)i+=kaXHmM@K5sszXK5XrI&<_MNEQ&pd!vwdxF~R*@I&8lEexjUf{?4w}C%f zGuZRI!dl?33E5+K#=|{T-k?_mik}bwD;~buFQ!NIrfI3|`MNJ)WWwx8U=dTwH&SG( zTMS`p+EeKK8*l6+37 zS+iH4X%;OejET%oV?l_jcVC}rLdGIyvPM?<9;N~qXh@BAHHYON;($MPbl*`+$Ehuf zDOudq&z#%xSL$!_JJ9&|)GyMB3QD$1zcueU(k1)WdGl-jc@4s^)Za4kkJK+eOlcnd znfeR3so%Nsvt)b{ns;qmMiZWAd^3G%dLDrPGQBd;~=-}BJ_B=cu&_QUkdb&GP%5XSxwH4Zs}JY zOlkR$x1pg=_;ivj@@`1J!s9#-55siXN!EaAli|jz4{36fM6=0}rQ(Ao!I89a2f5D3 zJk|N}Zm3hb6DbHj$F5SA8e%zk9f*_Yc=SY`L{6(Fm(q5>cw(xtO?u-8RVk5jfmL?; z!zXGwbBhoyj3FG=_Td<#@TJiJh)1?P z*~8wZ0@W1S9hPY9@64K_3>;m-v<9-ulP(~r=ZiwjTB+=Sx^~K=@e=sc(c;+(JZ5* zO5(6Ehu(JAgAZRE+7lwnxFO?4x<#)3=Ffs{j|52{XgO(v$&!+1uk+WlLq6}*ve02? z^-R5pu5HN|dW#j3J-YkUn(hu>sh4?{tGnyd^28TEM<8};ZtB8-#j3h%S@Igf4~ND( z#P3+t67TOgqCI9^cppk7+iX(6kxQSl5e`N3umh-FC~8f)jzk!4uzk`4{#g%UpeZEC zoEotF(paAH~EUQ~+7ifC$9=R?6Ke#~%e~+J7-gr6T zEo#)w7-G$%9wrp*^zVU@5j&2z_ zZ`$^vq%x8C;kqvIYX@8C3i0NfbQc`GQ%_SL-d8{gAW}eY6t1Lnub@5#H; zOl=2T`d+!CWP~%@=3JKk9&JXtM2h5}JwiGT$qb}pNlCB6yY+`l7#XUavU(-4g%1xh z{mh+bKaS0Tu4*^BUNH}r=va=5{szre8Z7Kbz3A7w!+*fZKu01f=irb2#>~CX%L9CT zHeEVzcqp@B=5gTw%i@}i=+3^7wme7G0?VdUYxMby-P6fuh!R>ix6WGZ7gh>eh;1^h-t_7~m{&NqVtw!&;+%#d&O}tA9V-4w9_5XwuGZhWaa$i1-Q#z({6b;FkFC42e{6{=o$);4E!sK+iWI=vGsw}HRYa~kLx zdB4YUdh)f;l+OBgxN2c}YmU25!H1?~?W2^X z-U?wg92v>CBy0&?$&EW3fPFb#^gZ6TsawiMsTj(~d0BO!lhUt`TM7Bcm{* zP|6YixBY2+O91X(X;~zMF63$e7k59Mw6CRG=n&clL|ZI?(9?HH8Sj{6@+HhUvqeaw z_HX$Y$T$q2#7z*NWVD{Laq^55)~CzR|5^5H7tZ(bz)j*0sbKY~r>840OwLvG-0Aq| zFBhh?wnkqPrD(hek_4l>UklkBe{}=`^I?%+Uwj6C8+e)nno7Gk32!ok6ca>P41T#K zOA(M^^3jCtt-#k)K#u{F!%O7h3DFF$((ZHXLCY|SOJl$jM;e%zeql0c0zuZ|T?{nM z9WDkg2AUEV0jnK(L(X_~EI}gkBdTk3=U*=Zm%TyjrDZs#aceIEj|S7hqs06$uF_7c zK3%shYy4}Hj6w3vQ6lgnupc-YsId%Rdl6X7uAnCFuP6T7ivS~})iCZVa5O;A0*4C% zS*9Gjl+L>7nT$A?hU5-Ipqz|^N%d5 zdoLlI(a4(v8Qx3LukqW@Fu^L+B#m6I*iM-W#*OBw(1}IBivT%)vMzm~EnRoHXp;9L zAVlQ72#m%#&&NFJ1;f}y&&;VmS_>~DlAp7n`R4h+i@*{BT3TN?IA6?HdHCmxz)b!G z^T@4N0qRavWv!C-|Pn zZsAeQqmXUXcgtD&tUS%i(qc2BZbUxtB5=a|7>=9^ya-IMy$CSMT7eeTxV*z&< zAhui7A1Nh=*I9CAkJf2Iu%qdJnw5&S7hbB!d+t-ALeG^(6|tMZq|uTQ4cj-Sd|Gfr ziCFFWQtd1crMde8npE*!?ZwKt!-LD^$A{AN&5ObKVjrB7?h-NtBNI)5o+rr#=d6Eb zgNuSj^w{uT1Te&1z>C0WE*5v#uCfrx*;d>ak$qcKi?o;zJPCaKB15b%tFF^I!j5&06_YVMK1EsAgHL<243M^4KWD=9tHS5t3*O0KK|`d z0F`un?Q|e>>+vlgkj5L)yI7fR-GXB?ieS40`?CtRuR*}OK=RjMi_x=YlIgDeu?}a> z+P;F+O`o%MfX|trjmu*`dvS^QcDPzSNp;|KpuW1=IZT54E`U4Z?6nU#9Vlt#J2_V8 zRU&Yg!v+nOZ!nhxlYrX+s`w|da`3B-OG>rMrCc8#0k|DtoU{1b>44EV(oh?nG7GVy zkb!pr^j5u;7xHM}6#;{|ixsM9Mc>LKjCjJ0dIhflrvn&?%VQF6<3u*tfF$Cj_e@4| zFi1tZz{BGg)=meEJ_>W624-CFqsS3U4PY2>M_KazJ+p2RC8ex=|Moh-uDPRh{>9n> z0o$d3Y`9u|c~wkwOOT<%Ex}7A4x7HH?b)rv0Yz?#Aq{;~n*g2uH|-r=<3|uzdk4G@ zNPJ8*s4j^xY&Ow3>C36Gzl75BaNBy*0V@4nt)1Gi-l}Dd*7s*fljHb$t3A3G2GAAH zRZF32UBK%Ah5I^ig%rRA=674PeB8)=9RMXkV~z)w^4VIo91v(a>B^`$)6!GUI5%+S z{55^dlD?o##@M~qIg1*N*N`B-Ep#>_bQHDKKvf~C0R}k}fM#$;ua&OA(D)X>@TRr{ zl5Ue4QzLt>RGa%cV53IddiC=?voL$~>O4fL z{l-e;Pij7>6|mjiRX?~StFfFB4VR3F{UEFdLTn3y?;J%n4qpSn`JFTMX$$g`oQJNR zk2-Gp-N5+4ly`K(hDBK*{(?2z9aZUU-sYIn(^gbu?Kn(1sOuyE?_2CZGrOQ;>u5O& zBXpQDB8=xp1Z|v;CjF)whOo(5EcXlQrjwk>j7rl z=_O(A0|AwQi0LsMxyF4UKzGkuL3^z_cY^x*{5mWApf-=eYVu68)kfffVC6dW0ZZ`j z4+J|p`!!Z!0ad-g13`dwyWeB5#tev7!B<7)J9k0gsii2f| z2yln|-FCkmqHXbW5U_eyJBtn5%^L)q(^UhZWM0gyS4}>m^_Gz}XdNz&U}Xq9Ge@|C zfV*dH6y@>hhE*Q~M>A`|^=^~{p~gt-MTqJygIhb2K32B8U}_ZBo0nahM>bP?Earxs z*K78H)t79|7PfKj9KJUW{nDwib(OR$S$15VU^N>;ygHJ0$^-sYcg|LC(S?smrq2mN zv^v=!0xed_b~y~z=_-Aq^I+*@4O~b*X%~tJhMSo8I!N7f6+@?^Z+B`L4=(YM{uHYU zppsE{7RUDFPY4i(MiZPHwF{eCD!I0M8eqH61Z?-qb3&;M_nZLo(GkFQ@374+DRpfH zFbk{z+CE>x7wP!BVEHO|D*&d`HWBU$;1YZ>YA<&M!1BCoA`Pqn+_v*!TOj0ws1PAM zBtA24Ka#rwU{2pj`qE5)r~B6m!2Dg9*_*70>@QbOJ$cI;0dNkQUVCA4B9Ul&U3d9Q zD^ut)K8=_8+w?T`;F)Wge^}viJY@y-JQ&w5J>`S{+X`S{$I}nI6@Yu>$net-r_Oa` z_1>zQ)w%2zqIwB-Z&%>_8_f61p*u=4gJ+z_$gRs?nU9*^gF~`#7tv!(p<)BICm&GY zE6!FFvD{3RDv2p7Gh67vy6Mi28NQBz4PDGDld)wpl%uqp?J_&_Eda&ci_w1lJ9Mq1 zxth=cGaW_zgiUPWv|EFA=`$Nf)$ts(@)1pwa$iVgW_>WI62fO@np-y6Z0qQtZ?v`o z04Z$=8UAYokjLRGZWK@pgJ=}Q?C)D=^PejKgRN&Q|9JJ5emQS`+TbVv2+++aocJbv z@8Lq$x7u@M$wF`9?uY^_fY?xz6I&g)JL@h^FIvO-9=w#8C*6;}N@+UIg=EFV!-H?sjDr!yKe)OW9D^wrrxBRvMg z3ny0M23mQz#r7-yXnyy_dO7QlTA>pM(!(;UI`HoUN~%N-~hmTU13J+xm7o^_=fb_AX zn;?P@E^+9du1hOF*I$oEITKO6O)z5?6i9%sKtN|l0s;MOSo(Lu!6qI^AHD|C$7BLI z-uaioK5vrP6m}S3=^t5R=_BFCz6yj*C6Z~`5j>W@G8-Q2lk6pp0;+r$0Hn=ir+fx)S;5^LO2b3udk^v<*Iwntg=g>5B?tAA z4P?=%Pcn^|gQ9_*nR&(lApn;f&B&Og0BO5pPhY?md}^RW$9<*kWK~yepDn;38_jfn5|Kc?E(9cbI}V#HH(}N zKKaPDoMYZ4wwi=P71`CA`APLTI0Hx(CztSIBVwNg!{vty)>d>|%2ug`etM2eg%MUtqfi0m*HxE>2FB1!y&n0b$~{`yyg#r8xFxxsy9Ows^u_9adjYFw zCr)e=0^B(Jy*B)DL5gNofrh;fiO)y|m--GK#=o?#Qx$XXF zWTQ$@sw=neclj>EE%kAmfKnfLE8xX<*mZI((CGsae{SE=+5H<;YR-H*Cctg;nF*+e zd-jjU^md0?fm4A@|BBc3r@jv4TJAV>fo?3+BOjFu6#405YoclYt|rm2}cg9oN}FIhFON!9aEgD;PlS$s&7Q5hRF4+$`j0weOK& zpi~eca^=G#r zG}Lg!h;m~)^OAx=gNWfdEJ-1q?BeFv`uO|Li~kMWi+?k;tkoXButa#g;jrLZV7DJd zMHMswf&I?-y5>dbS}E@u)mruFlIP;3WUGdMYxM8sK0b4G_PmAAC@h?(xvLTYmkNl` zuuZ_TlLZ!f9?;y4w)Y7z(2MOS$t~4Z*K6SXciwdV^3r$F7c=>7Iy`Y5{VT9-QJUuq zw+n6lOLK>IgSd6R)!}OH23Oj*(p!@rK|go2rbNLDqi!lNx&lXU02lu&+UVs^NZ^`( zKacD`ftMe*6M}-7qJqpoSFY(!+P_=Ozg5A2$zdkghl$z~_Dq1fVU69IRXy4x*Az#5 zn?ZZfjXi+)u3v}w(x%tEs#kLdUz}FfM1`7NRUV*=3-z|)=;tS?KcKp#vA5X9aHP&|gHWgt=4Rh{}zy9ON zpF4iP3m;BC6Hk{iU*zQJdR^YHW7(s7mV7roX&k{HL*CZOzLWl-xf=dX-B#=tI`@WH z^<>M?vlf;KF2=Y9cFe~1T{~4kdIDs?2)D_=^6Q&3725rC(Sm!x`r-rX1mkm_2XKhU zQP5e~F|rg6n_=7%ue5$6SP40H`&?q2{1%L+)AI!wipCZ+v{&ERg|Fzb7!<$auH|}@ zly1F9KLMPxSS#Q_89-~l1@;;iJ-rh}?I~B^Fz@eje!N2-M>jDb;}AQhdL+L_$OwvOArsnRTL1mw*Bcqz1p-@I z99O?j-UuVAG7C`?e~wAkqGUy(swpQ@+#} zM()j5s+zyX_94x0g zW{1r_L9}bCS9mkXS7PZ@+GUpSUGl+7`jp2Pw9(5AveQO8G{;3wrfm1XVe{Y%P45z= zZ~b8(%CSuznZDC7O4i(BcUyS7OE5EBRXa8hi0#9ZJp=2D_h)4)_#2+uGA=8t-cMYx zT5tT8(V!xI-t)YrXX4H<1Yu{$*i6YoAhruW+)FJ?u6%YizUj)o^Skz3vMP7~qcALP zp2csqthWM;_g_|RF!{sQO+R}UVxw9kGX44#qEk~u@I>!}Qj#fkGvzwf|1O`ql5w7nh!lWWAsH?{pFqE;TA+tRz{NN9i@`>;fI&>{2se&m&Fd=-f)mW7*kT=Xpn{u z?aQP}slLPpw0AfT?WaBRk2)jr?e?MQto?5ucYogd{EnIjd;=3KMsfN`-kA7$bpSsn zhjmaqx&S(7OxWdX-lOf+c-@oEMlO;a^_|F@dZP?#{PW>6{&p58ZSE5aB2SiuQ4!pNoej$cXkrvRVNAA* z%&!cBEl5!Y2&oHZl!G8>O>g5+`Gf41Bt0Ex5+w8-W(^Dzg3`&4OCJg&aP9K(Hpg@?@WEe2JqeK0i{<75!M)HY$(XMeu(PYhM&`;yV#m=#es0xo4er` zn=eAQ7q!)M{q%X#pok#?83^u-#1OR1D_rt*z)wFKg!WLXOV>W{ZZ1*EoAJ95uGAOp zuPi(A%TI6bn`G;gwXGfY!aOk@TT$W$Z>Dn#_~j*quU8$&rIJ7guLlyoNTy-G2>_P) z9>+3Kz)x?GWefP}Iha!dK~$i+&%;*riU`)sOA5p#wl*4n8%F}Y{biuH4<;l#9krXz zNku|!h$6GoluOOLeLfqq;EOq_mCpuBd&+)muRzRJvkCzA*W?;N=1=kF`RPZIna@27 z%4NfV><)6>QsZ#fV*StT&e&@NWOwW?AiE1`2lFq>ESJl1Tl$uG`xZl!#!?`=dt58d zu0G@&Wb!&M3@GH|Dnm5B$V7}qt6by8cP;*qdZp^EYw?{K)ny!S@@czoB># z-e|;MRs5cZ!IsNf&FbjL)-y17*iIaLr3ES7yFRYT8rbJciq(va%0`Iq3#_rf`a$@p z=_NiJDEjsJi~k3g?Q{01^OkCm|B+w zd0@}LpKz^s$CaPOJGKQV-c!VCy2LcrM}>b@Gk^O1XYmf?_>2{F+sS#Q~63FpnUXH&e0B!(sJfpdFtvkmj8!QU9u5?K? z3xL}np#nQPy5yqh)Ef)GmidbU{DJl8JASZHfg6Bvk1>030-HX9||zm z2e8b)(QXATvufW7>OSh%9*Vmz@)-PO1%_O0K8b1M(0RssD$iJt6&keJ^}`A+_qa!H z6=tvsi!$gnc-vF_2&~wU=n*FBQQ^MXfppSz%nf0jjwZvWvB=%8X zUSdCV;>Fc^8@{3>4@dwREOcjdEX#TVnu+N%N{CF4S;d_~!|J3|ap}gH6XmL(d-fW| zD|j^AqU#-eh5EqE*l!Dg&%~3#qoj=WExXT1VO|=kVe{SgOq>YXJEeLl7DT$o1mTM= z`p<2j6dMKA{?P{7sOReLK9V30r-O0t`7`9I$d_}44s7dU7rV=1Yb1zKd&flX9Md{# zHGwCGnhgU*dt&nhnNqk4kofWRmXo&|q-wuSKZrGLj(ZFNwx@+7oEzoV;p6LEoGP-o zLwulUKeTrdC5WDc_4Q-%hNA-dXl#2=(I1DlxcLieer;p+lc|5YnG1_BA}Rb=h=X$V zEsJV9UVawa>CUHzFOjl+v_anMm11LjAIG5s8dUt%Y(ILE`?0s4A?w?hH4vo5nK|Sp$35sc;j!eQH;^oRDx|-;dk3 z!*@Rpk~2}x(a(;7@2s}7Q*yoGyF@;-u4dnGaj<8}>aO&c6V{pHB)jUy5mAj!bpe7j{@!rQ9W1JpI^n^b2Yjqmr=2)H(7?x`?o!PD0#_X86xVqe5|71agl+CC zJigN@1sx}K=ZVg(c*0kAXV95KPfma91uc?-99Hx;pG#ZihtB<3C#IhE&NN=hdy8MU zHO1TkXKtgtc?Rcg&n8)z_ge%k4NIN{*>NxyLnpV(`fE#c&vw<^df8hDeW?VD;O!4L ze|-MoyT)xX#vx{C3F72r>rXd5|LDKm^pO$u`Sz!pp zM4)JA-9ny1)wy+-34x~hD-BkVMx$^|X+Hj3$4}<1K49I!e9z3sS*qq5=Wkx`) z&B^(JP>?_XyHBW63Bd2$EEOEecwN-}{lR+0rGqSx7{38wo&Q?9uKVEKtC0gbr{`h( zR5y@%E@)|jm4Pu@qwnWhYc%`g+_qEnx*J(1s zNib;DoUZtmp?IfXKMZKsXO}1Ma^74_`|+a{j67nN976z(;Nv|iU|!zZ0(?3$qA3*& z{r<1;EClRcD{<&6l3!Eim1&w6ntM+#9u6$>Nj{5-FashmpuZAEY|u#8p(SCdVCq)^ zHDY2tRd;As_jEHqf(+SAL}7`jovko6pA=>C;q$FYu4vHES0EcJNNMN*C-vG>X~2Nq zCmf0Yn)tQ?tjycbi`5e)fZ=)@F&YDr!DLVep(^yOgHkyMTN8nEdN39Ihhz3+4iU_N zRRdS+iGM+FX!au(lSG7#0~Xnu4se` zQ{f%Zc4Ja6+8lVzFo-sRWLKnpZ%vD!fpH*s^i-l+E-c#s0>)=vB4n4d(v;`(FHaR5 zM1#sS&`fN+VNCvVs2C8P+Z2K!`(&L`b-Dyj+>JY(VfgiEpU`2s52rdK4mdMS!znlgX>V=ww!Pty24N*HP zCDJqy*w06Us8yOJ+sunrDv}OiGMw4j+4QVdO@ey;5imX{sx2G0nEg2CNOYK}xg#8Q zk9Sdz%~T!AZf+|{;IN9Kmb1jB@+7|%%p%FM=Mxp$v+RfkPL;aA?14Wf&KNDIh(QW! z{j*1ZIv5X})Q43RJRz3MY92Y(mIoXbfXSsOEy8j$+5~be&*0cn5DX~Mg-ridq7U2` zsK9LsBcylG%3tP|UzSFku0zL#ZC;0s(j` zD}{hzPXK-N2~33P7`HATUaQNMQh>VrJLd%~=lpRMtz^JYf4>rczU1f8d`Rv31#lS` zoJaOw-UjKyLp3p(bYoco)B#08KCp}j`f`ewd6$P_LZW21g;Eg{wT=N>+(vILiS{+r zNNf-5DigSi^_v>6UWy3`sf(U) zOperAp>CB_u`mO^W)F4U4$UPaU!IkpB6QAe%`FcDbj_2jqq56fp&N>4`o)lj8%DYQf z<<2&f$gjm0bCeZ$3pXn$RE2AayK~MtVwY?)+?{j7Lw3ycSk&rRY3v;ouXx=VbL;!e z4T|$3QRYT2+m2OoV5xM^Dt~@0D8kA!+gN%2$c33s#e7cb)vi)WabC7|KUAEjONw*o z;vMGUqkZ;#d!z6r5b^XuG32Kwt~FTadZTvMUhFm$~iZo0S=)=W%sTS4FZccu^FK4Owq@P|EwB}?#k!P~+3Zdgx$cK~_SyzcsqQt)D-xVmuH6~Qj) zJB_d2Hn=mJZU8?$v+4DCr52)z{Gn;YwRuFNnZHQkb3^ktyZS*_?Y}j6Qc;{22Gd;o zG}k`OwNG>H1^*#j`#Hn!YjIoL9Qm`}=M3q1JNJlvx#5lsB4wAo`U`%XCgq1~_FHf* zJ|dpCgKF{f&^0@`{$Bn>Eq?dp`e7;TnoQxfu4>V~-IGn-WO2%Vh`$|ST*Vex=&x7* z=;*KAb7Iw(e3d**+2QpgMGKfnxE3!_!YHGCh_+AB*xI?d1cmjcKfvtNks>k7p0lK_ z2!h#b&C+Mfj+}p#Dhk=W5!P}LvSnUt{(9Bmoa13{Z3=ITEzk1Q3?oZZ|6%FViT6>e zwewBpTgteem{}0;%fYRG1|n!6WK-qJpjw=Fii%km(t$1sK%U6*;5;`%ctF?eGe1{S z&mp%o0?dAvmRk}SQvwl?UtMHYV~LxsKtYzknPfo?zskjl;M!wa98fnptVkW-+CgYb>qN|`vk!r z_1bO_CfF;Nvc08hPB2TGh#r%*c>njcIP1Gw{O!N3#UHr+Kd8lnT{O9OCAIkF?`!eE z`)3sl;&7*+kgZv1k3^|LAzNwIg&iPdUoa9#-Rq}CYiV|#X`Nf`;DS-FYS2+16@~2a z-CA!YAzQsVea$Lk5zMY}@KJ&;fY}?9Iv?l-clf3WGB3fXsRa`}wZ^$*{uI5p8*cg%Dpym?9Ux0mWKw;&nhPx+C@S6uJ$&3W0-e#*|e&i}d< zRCP=H+28;CQtgx;SrB_mSAL5Lc?&BuVQ!g+a;Ym?CLJM98Hq*pd06}Dn!Ln2Mz8$U zEOxf+Q?#$8%M_UXPqaQl1(ku`&R!40?41Qq^Ek7VE&6%XD_Qu)iEH-o+mqMq?lTb| z0KqPsZO^ji#YvZpZA5Sc=&kyB@Q|H_@XM;PCu%(Te_ojlCdwKWBIvJq^Ksuf^Vbyi*2CF{S z<1EYe3(>6gT`8%4SpQP5;)zpnLsIL|9? zZC@k^+n}vBs|_pZHoT>~_#zy(w^8uhDR>eWZN`e$<;66PMuM>Y7=&$s<|1b(Y_CzH zfv|nZ8y9avL9oPOTW=_Q;aHsISU426N%3bv*cK$xoEfxHXuA%CZ7Bx*t*|3poVJY; zUE@j3j&TZo;U`qF%HFuD*XUifamg%XLq}vYJ*K52sh}?*qAz^i5Op$ala7`;NlI{b zxZDs`z7M)yC+RR~xp6Ke+*~5URV^yAB$?g=!rfU5IQ#X|}D7cv%o!LW$Ippln@)pCj1IqH~v!aedt z*WH_I2=?BZ>#_xAbS2^Sm;w;EnFUbbHu7C{2U@Fpgwg&}S|8Nh19gTnFVO{G^38mr zK;C})Cg4JVC*aYABXg^FZTPhB7@W8F&e#m+ZBjz%@>v^rthIsE%uN3}1+DiAKICi* z4J&W%CUM@z%sRZ>OL;s;*;@LfTCN3jkUs3!g)z}v5MXvU2)agx>+Cmq(i$8jn3uCN z!1mE*eeenXJrh1cCx?8w4od7ZVNbD1fK8usPWG(V#g_ElM7a0<0QcU)bJhp?4my~~C<^y`%?JqDut`(IptCWH?JOY% zy>v9d4=gluQ0ZTZ8-`Eq@m2nc!lqeX0Ph>8Um1EhEsj>wR8WjwtP*$n%uI#Mg4^&O z-B-BpF7H|k_1&!nzVx-#9;Ia;)Ir}JO0w0z6MfK9^GDpAmM^+kR}Km_T9)W@=hFMl z?hbmUQQMaoZnLW2tPnLzw(mrFe?4YLH+~D-K>+&h3ih>+lD_*c!3wFQ238Vu@(LCd zYTsFkHS$mNl>tZV{}d^j$)uO^FVD+|F4lPwX42+I+D`bSIU1h70@LQm#ao1Gi|xH_ zRp%_m3Z@X}q$4x#K<#s@Q>FblT5r76bGY0)*I+bmZGw}*g}b?rR4f zty}vMqc+Q>UWegrBkl>m${oCN3SsKe`XQxCgB_9i=k6iE23<0&s0$(>Hx3`t&xFfo z>RI3|1T%u}6?JVlE`!talLPn-<8_4ttFZ`~ZbGB@be-G?q2`sf05!j6$KB|sQHKf$ z*{pZ$#Rj>-{HA&1=#G@DC(Th|k=!jh&6IpD0PQy#HEVS@R+TpOKg5q3D3q=wTwY21 zCz3Zfj+VLE1jurkRG$3+5-F=n+{0Jd!&fwHQVig0KH^^^@LoRU>sqwT)8L5fZ2W(z zo1Y$%pB|E*9+ICPlK&qalK=R9ojq?}JQKUk`(rlej~51w)GiDC4Y&)(&dGipmd|SJ zm>JsFvR`{evh)i+c7biNaW1H{mtrz%=FSFRj}$ zhxvz+_4b16@M;__e>k{Uv>LZA|JF>sHP8EnH^c8{&l%tI%7X5b-JlgfJ#FggV~JeMHAZ3~iOJ7$(%EZO=g534;-NzrJmSXx$aQ{x-roZU)3+BVM~&-6H^c=**$)m58H zHF+n&)%ot;t_L;sA?12({^rL4NZ&n(vuC~En#$@pt348+{N>7a`yjS0tt~o+A$z0m z$~Xr{1sz1glkxpsyFXX5%0;laW85s)u|E##y-o1;{9KiDQUr@9?Ytsk#f5#JYie(m zAMuA^aRGP9&|*xm2o`UBTpk!OjvxGI6#>BFN2b8yH8&o=7sKLL?Vh|pb*>(Q#qUC} z_}MZD7Vmqj^LYv^-Z$Dj5CmXxGzq}s&FHN#EdKW;7#5FJ62anV0E?HIKNZ#kSey!A zaiyoUU{(`=#Tg4>SiDV742u_wU~vyw5iE{`VR3B7bmU#B;}%#`SBiu56i+JpRi8rjDr_ zA+6rAC#A5~l9=SZq59A>+WgHgnqMKR4+M%k>|eJs2_ySnjL;Xvd`#VGA+W$Z?CN!) zrQ0pY$%$K~_e)LyEv{M$#B1H&?th$W>HD|Kx*dEZ$jdM)@>DX_Ks`#Z8cptzCH?vb zTXk7o+Cs;6gYhnnJH_?sayoB(s2X1evlaW(<+S%xO?QCjBAeeo4#WyhS#ht(Z&C zo;8|B`hs|^Vr)ryz(sz(9M&|lYiVSAhUGgrU9Ydlk}23&1Z<46KZGa}J5m+qktSKB&LM>vU>M&mOb4R(Hjj?O!BXTSf8 zpeGzVnrK1^Frp?pQr&p5=x#a)<`>RKlw+fhs3rLgMIFIKpZ1n@kX)Uw=-8K8=qGBo zgHu+3v2J(li^KKePe~D-_p2lL*UuPbwO+TeZ4IZM*sEhNXhkBGG z<(txjz|py5QVBT;jCs?DnO}sVs_iRq0+6{aSEMoH7bnFbyHo516jXnfXG!AkwdtIW zwBP*B!raLZClPa@;#Bc^z=YsHOx>hlk3w)H|kvPuM&NI>0xjydn&=_bW z?r29zMw@=}ay4v<9vx|P+>0A3^Ax+&22-IH!EHIT+>$gnu^g}K4K2qbL-R~i9n7*Q zl9ThLUnq-);+EH;Zw&><3XW62$vGK1IS1gzhHH;Gd?(f zVl$q9ywIADyiTt07q4=(n=O1-;2&@lX7_5CwK z!LmL%AMmsh9wmjRmxzwdNxl_Dq!>XcI5xNWDJzbUu;QPx9|Bg~xabcNEAAK~wR`tL zQb6lEFY`>O<{pGu@laow6^BuAI}s`_{1;Zd4?l$!C&8?^BgBd)h*)vy3p)?MtoU6Y zDW?$K309n1>=htp#qlsJ{$MA>ibue#_?Y^?WyPNd8&xFxWM2AxH^hpk!mN0eFL7U; zaZiMV6~9ux_MRuGyb~mqce%AmC1Aw`tXOL)tq%%-75Dpr6(?WTv4fI#Lzn44Cty~b zR2UCf@d;GC=wh4@u;T2)ldO36AtCW%56p_s$**!Zs;u|LJp39ASn(Vi^Ff#u$Nj*H zTb65aN);;3ngLea(P7g-O^<{XpAWO*_*v%L20V}C1TCDxiti`<$co#(tvTjezJpvI z)KEJ0#$3&V@n~-K09<^N;2ZN}1Y|O}G3Ql?Sn)G}6?d$=nsS*)t~-gS%4?|0$H=t% zNm%jjt88k#48MMdpuTY&z0Oa+aI>7r1S(D)c9go)@S?N|1or00Ix8J+-~j5KIXBo3 z6aThJ%c#-au}NnD|H**(7u>S%m9XM>04q*wmPu`P@8&_naF2L|M>SfUW}#!q8ZX5) zuMwvcc<5z(9nBV9`x+JdU00~Ph|5|GuC_FmHoxQpFMO-cjmu(I96cS%r|oXjcDHG} z+y5VSx9L#+pB&1w!aB^KT-gqL+#(>4+cDVV7NJ%3WQxb_>({WzcfjNJkDs#c=Ug5R z_P7ng9=A*WGJ7iar=2FhdpkXJsdOh5@OtGEO((^>Enfgz8hZdaAZ*@dV*;44QBL-}!u*Hp1OAiGWw~Zo;n}=l2jWlU-V>lze zs;bL%h|_s>7!^qlJpe~@lnWK>5?7u}QSYWSlS9E~`&!uIwq9&;1JOKqt!=0z4~PrS*9wGtN^QJ5dLR=pdTk z#G($nB%fiVJ~oY%Slk#rq_h&xJ;pWtMynQ0P)-Oz++hj5-5Mwukm*k&F_-WP6KP;ucsc z6vc5wyrB<$(U%l^CLQ-B+jl6@43~A?G?KxknzQK5B-{dgypfvBGI+Bcgm|ZavADg^ zgHF!%7edo*I9BxEo$19CN^oC_gPGJp{ftuB;x_6X@htGrawF24i7ajmXK`BAHGL_L zUh*ch+}`ulMl}SVfu3S5XJpv^Wndg9{#tb*_)&yJ97UUo7<$l_K2EN;qTi(A1> zALtO>^1rjV1-w2L{^@`?kym+6BywPJdxmF;2HPQv8xvUE60)8ihAnPhz~Uya0$JR4 zwOQ0Hy{SrC_M-5cxH@17;D{|c`C>NnraW=5^Ls#oZEr%Zk0`dr`o3uyRE?PzX?yZ zU;26;nriP}l(3v|#fUgh8hcDnZwU!LQTJf`DjZhyl&Q1CxY5vsRFvB=&O5G{D;jAB zJ8yzwFMg?L=S>^V?rp0zvGbwqF0BxD2BdIyfe_T@-%q`9Bp2(Ouu3B=6_hKdENP|n z0Tu#WtoQhAAf8^7O*koYd8P;yw=^F8x}0oW$oKG;<(qE#XyX7E=c=GMr?TQC3I5o2 zB~YA42yKYeI%6}VikSmfK0L(V?=saO_y$OM&)n@TI$4+RGu*0C@D0yiVx;8Cm+ZV5 z&3kw80(LdQjadHY?^o7_0I}j%*A?%= zYlHNkI#8S8+VEjF`qSpR`%|vhlc;k_JAWzgQ=;bJ@}Z6PdU&I~mdL9I8|{HuZD^xi zfrZ-F@Wi!(c#Ya{l3iVYqX7i@p_C@cNP8382#mDXgXVk?bo-oYXrx_GT?!Az{TfCb zb>;msjs`jYX-b2YQC;=`O5VQicz(@B1YgUs`HmlN_#s}8UuMTUTWkg6<-^J|5Yo6p zzCjcS@h!Nk7{Bh81NnT+BWR>O5FTldyhx~&sd@ee@yL$1XiuAUR2zcS>W{2pbrHAe zwVhU0u(i0h{ad4^1@YKQ!iAL$N>10@zFqqzze1Ai9slRN?b8~!AHD6<8n1IYAz_;u5VkE`=6|3}0EBJr3t?f~epuL6UjYl-W=e!@ zPa$EO!;>>ik+AK$*w<$Gov%#@3EQ$~d%XI&uuZA=%TI-EGSW+oPHH_`nQ2A0@jcCv zHTDi$XZ-$POz++6O*=d4A86Sv4F0@=SyL(fzEWO&p3Ck2_0KQK-%0Tws+I`bS|E@- zYeLv|{Jzz5iLgyZ>$&ctp9tHAoaT)Wtc^8+g>B1VVH-64rZ)Sn~D_q+GY)!b^u>ns_MKKvxQAz&NfL0j}=)ISq0YJ z*i!K>bvdO861E)>3)`HQWC}|wws~!Q4TNpi#KJc7<~QBhKNq&?y@iBr-mtLk;P=9| z_ab3in4$Q_o%de|+a^}vj8BLERM-~$`d@`@TbJlAf`n~-SC?6UVK;fAkbM|wW!9#HD_zzx?u8qP9vli*vVA`B@K1zcX)pb7VG-PW_0JgSJVQyH2Y7$tB zgNNW^AYB{NZ$j7hD_0x!nPBBYrw@hCfpu+BVez>vBwsJ;y>m(;h0)RxV`s}~XD3bQ z+Bog8&L1QP@XT;k22D$>Yh%o1heboWwxo{pw3=F)=2&V69R2?mMgQ(Viy<jzdzt54Cj zu^vFWwl#HWx}+%X*zx4+F|$q6kmR(fy0*MExv)*30ni{+US;~s1sTG)tKP>!Kp#S5mqCXN|2fFIEue=8#|RgxdNIq;uM0T^rj1 z=-SAx3%d5tw$2nL^04_wH~#sI&a00M@uqorWt6KJ{51(zr9r zSg^*Oue%(`5WpJ%bTH2;1qbu_69@B^PWsJ`{OUDWY%*an-N{TeoWARPWZ&`5is{Rep~~Eik#S0u;Ap1u(hy zsOnvW@8|R2`*|yHKi|3|e#-s)i~;0`Nan6EJB`PQH6YRk>Sst~?(U$@M;vOwTndO? z+vn*{Tc9TtNQpUiM7=94bC3R-b9-MIzPi5bZGF!;X9uz3irwYOI)8+TQ(vD4HsjvZ zNhgt3gG>5r@Fo2v0`dlsxl<{9u*{vciFkjYc{u^uJAe<%Zyb2*%O>-%kI*RyY)UtJ zhOA77?%Z~OunQoWI|Y`xM~)lCXray-2eT%`{{>(>4$)6pZm1W{r|}4KK&3d{SYwy5b(XZ sefl9lY;K=^2pFDz2$+5dnDDkwKLm)p?b8nd(+>gD4*~!ELxB1J0?eQ-uK)l5 literal 0 HcmV?d00001 diff --git a/source-code/source/plugins/Launcher/Launcher.vcxproj b/source-code/source/plugins/Launcher/Launcher.vcxproj index b75347e..57b35d0 100644 --- a/source-code/source/plugins/Launcher/Launcher.vcxproj +++ b/source-code/source/plugins/Launcher/Launcher.vcxproj @@ -124,6 +124,9 @@ ui.h + + + diff --git a/source-code/source/plugins/Launcher/SkinnedMessageBox.h b/source-code/source/plugins/Launcher/SkinnedMessageBox.h index 18b41b6..f78d298 100644 --- a/source-code/source/plugins/Launcher/SkinnedMessageBox.h +++ b/source-code/source/plugins/Launcher/SkinnedMessageBox.h @@ -253,8 +253,7 @@ private: ref class SkinnedMessageBoxForm : Form // https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.messageboxicon?view=netframework-4.7.2 if (icon == MessageBoxIcon::Error) // also Hand and Stop { - Drawing::Icon^ erricon = gcnew Drawing::Icon(SystemIcons::Error, iconsize, iconsize); - iconPB->Image = erricon->ToBitmap(); + iconPB->Image = (Image^)(ResMgr->GetObject("FeelsThinkMan")); iconPB->AccessibleDescription = "Error"; //this.Icon = SystemIcons.Error; System::Media::SystemSounds::Hand->Play(); diff --git a/source-code/source/plugins/Launcher/SkinnedMessageBox.resx b/source-code/source/plugins/Launcher/SkinnedMessageBox.resx index 2bf6d6b..be0a343 100644 --- a/source-code/source/plugins/Launcher/SkinnedMessageBox.resx +++ b/source-code/source/plugins/Launcher/SkinnedMessageBox.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + FeelsThinkMan.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + PokeSnarf4xd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/source-code/source/plugins/Launcher/framework.h b/source-code/source/plugins/Launcher/framework.h index d18ba3e..ce32c63 100644 --- a/source-code/source/plugins/Launcher/framework.h +++ b/source-code/source/plugins/Launcher/framework.h @@ -10,6 +10,7 @@ #include "ConfigOption.h" #include "PluginConfig.h" +#include int (__cdecl* divaMain)(int argc, const char** argv, const char** envp) = (int(__cdecl*)(int argc, const char** argv, const char** envp))0x140194D90; @@ -203,7 +204,9 @@ ConfigOptionBase* optionsArray[] = { new BooleanOption(L"opengl_patch_b", LAUNCHER_SECTION, CONFIG_FILE, L"OpenGL Patch B", L"Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing.", L"", false), new OptionMetaSpacer(8), + new BooleanOption(L"custom_patches", PATCHES_SECTION, CONFIG_FILE, L"Enable custom patches", L"Enable all custom patches.", true, false), new BooleanOption(L"no_gpu_dialog", LAUNCHER_SECTION, CONFIG_FILE, L"Disable GPU Warning", L"Disables the warning dialog for unsupported GPUs.", L"", false), + //new BooleanOption(L"ignore_exe_checksum", PATCHES_SECTION, CONFIG_FILE, L"Ignore exe checksum", L"Use at your own risk.", false, false), new StringOption(L"command_line", LAUNCHER_SECTION, CONFIG_FILE, L"Command Line:", L"Allows setting command line parameters for the game when using the launcher.\nDisabling the launcher will bypass this.", L"", false), }; diff --git a/source-code/source/plugins/Launcher/ui.h b/source-code/source/plugins/Launcher/ui.h index 2731af2..1613679 100644 --- a/source-code/source/plugins/Launcher/ui.h +++ b/source-code/source/plugins/Launcher/ui.h @@ -666,6 +666,8 @@ private: System::Void Button_Help_Click(System::Object^ sender, System::EventArg System::Diagnostics::Process::Start("https://notabug.org/nastys/PD-Loader/wiki"); } private: System::Void Button_Launch_Click(System::Object^ sender, System::EventArgs^ e) { + + //SkinnedMessageBox::Show(this, "It looks like the executable has been tampered with, or the version of the game is not 7.10.\n\nPlease use the \"patches\" folder instead of modifying the executable directly (or disable verification).", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error); SaveSettings(); diff --git a/source-code/source/plugins/Patches/Patches.vcxproj b/source-code/source/plugins/Patches/Patches.vcxproj index 2d811ac..da64b37 100644 --- a/source-code/source/plugins/Patches/Patches.vcxproj +++ b/source-code/source/plugins/Patches/Patches.vcxproj @@ -102,6 +102,9 @@ + + + diff --git a/source-code/source/plugins/Patches/Patches.vcxproj.filters b/source-code/source/plugins/Patches/Patches.vcxproj.filters index 1f5bfee..03a4db1 100644 --- a/source-code/source/plugins/Patches/Patches.vcxproj.filters +++ b/source-code/source/plugins/Patches/Patches.vcxproj.filters @@ -19,4 +19,9 @@ Source Files + + + Header Files + + \ No newline at end of file diff --git a/source-code/source/plugins/Patches/dllmain.cpp b/source-code/source/plugins/Patches/dllmain.cpp index c94c06c..5b0dfbb 100644 --- a/source-code/source/plugins/Patches/dllmain.cpp +++ b/source-code/source/plugins/Patches/dllmain.cpp @@ -3,16 +3,19 @@ #include #include #include +#include #include #include #include #include "PluginConfigApi.h" #include +#include "framework.h" #pragma comment(lib, "detours.lib") void InjectCode(void* address, const std::vector data); void ApplyPatches(); +void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING); void(__cdecl* originalTAA)(DWORD *a1, int a2) = (void(__cdecl*)(DWORD *a1, int a2))0x1404B23A0; void(__cdecl* originalMLAA)(__int64 a1, int a2) = (void(__cdecl*)(__int64 a1, int a2))0x1404B2210; @@ -57,24 +60,29 @@ BOOL APIENTRY DllMain(HMODULE hModule, void patchMovieExt(std::string moviefile, void* address) { bool isinmdata = 0; - for (int i = 0; i < 1000; i++) - { - std::stringstream ss; - ss << std::setw(3) << std::setfill('0') << i; - if (std::filesystem::exists("../mdata/M" + ss.str() + "/rom/movie/" + moviefile + ".mp4")) + try { + for (std::filesystem::path p : std::filesystem::directory_iterator("../mdata")) { - isinmdata = 1; - //std::cout << "Movie " << moviefile << ".mp4 found in M" << ss.str() << std::endl; - break; + if (std::filesystem::path(p).filename().string().at(0) != 'M' || std::filesystem::path(p).filename().string().length() > 4) continue; + if (std::filesystem::exists(p.string() + "/rom/movie/" + moviefile + ".mp4")) + { + isinmdata = 1; + //std::cout << "[Patches] Movie " << moviefile << ".mp4 found in M" << ss.str() << std::endl; + break; + } } } + catch (const std::filesystem::filesystem_error & e) { + std::cout << "[Patches] File system error " << e.what() << " " << e.path1() << " " << e.path2() << " " << e.code() << std::endl; + } + if (isinmdata || std::filesystem::exists("../rom/movie/" + moviefile + ".mp4")) { InjectCode(address, { 0x6D, 0x70, 0x34 }); - std::cout << "Movie " << moviefile << " patched to mp4\n"; + std::cout << "[Patches] Movie " << moviefile << " patched to mp4\n"; return; } - //std::cout << "Movie " << moviefile << " NOT patched to mp4\n"; + //std::cout << "[Patches] Movie " << moviefile << " NOT patched to mp4\n"; return; } @@ -131,17 +139,17 @@ void ApplyPatches() { { (void*)0x00000001406A1FEF,{ 0xC7, 0x44, 0x24, 0x74, 0x00, 0x00, 0x00, 0x00 } }, // MOV dword ptr [RSP + 0x74],0x0 { (void*)0x00000001406A1FF7,{ 0xEB, 0x0E } }, // JMP 0x1406a2007 (to rest of function as usual) // add new code - { (void*)0x00000001406A1FF9,{ 0x66, 0x48, 0x0F, 0x6E, 0xC2 } }, // MOVQ XMM0,RDX (load touch pos) - { (void*)0x00000001406A1FFE,{ 0xEB, 0x5D } }, // JMP 0x1406a205d - { (void*)0x00000001406A205D,{ 0x0F, 0x2A, 0x0D, 0xB8, 0x6A, 0x31, 0x00 } }, // CVTPI2PS XMM1,qword ptr [0x1409b8b1c] (load 1280x720) - { (void*)0x00000001406A2064,{ 0x0F, 0x12, 0x51, 0x1C } }, // MOVLPS XMM2,qword ptr [RCX + 0x1c] (load actual res) - { (void*)0x00000001406A2068,{ 0xE9, 0x14, 0xFF, 0xFF, 0xFF } }, // JMP 0x1406a1f81 - { (void*)0x00000001406A1F81,{ 0x0F, 0x59, 0xC1 } }, // MULPS XMM0,XMM1 - { (void*)0x00000001406A1F84,{ 0x0F, 0x5E, 0xC2 } }, // DIVPS XMM0,XMM2 - { (void*)0x00000001406A1F87,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x10 } }, // MOVQ qword ptr [RSP+0x10],XMM0 - { (void*)0x00000001406A1F8D,{ 0xEB, 0x06 } }, // JMP 0x1406a1f95 (back to original function) - // jmp to new code - { (void*)0x00000001406A1F90,{ 0xEB, 0x67 } }, // JMP 0x1406a1ff9 + { (void*)0x00000001406A1FF9,{ 0x66, 0x48, 0x0F, 0x6E, 0xC2 } }, // MOVQ XMM0,RDX (load touch pos) + { (void*)0x00000001406A1FFE,{ 0xEB, 0x5D } }, // JMP 0x1406a205d + { (void*)0x00000001406A205D,{ 0x0F, 0x2A, 0x0D, 0xB8, 0x6A, 0x31, 0x00 } }, // CVTPI2PS XMM1,qword ptr [0x1409b8b1c] (load 1280x720) + { (void*)0x00000001406A2064,{ 0x0F, 0x12, 0x51, 0x1C } }, // MOVLPS XMM2,qword ptr [RCX + 0x1c] (load actual res) + { (void*)0x00000001406A2068,{ 0xE9, 0x14, 0xFF, 0xFF, 0xFF } }, // JMP 0x1406a1f81 + { (void*)0x00000001406A1F81,{ 0x0F, 0x59, 0xC1 } }, // MULPS XMM0,XMM1 + { (void*)0x00000001406A1F84,{ 0x0F, 0x5E, 0xC2 } }, // DIVPS XMM0,XMM2 + { (void*)0x00000001406A1F87,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x10 } }, // MOVQ qword ptr [RSP+0x10],XMM0 + { (void*)0x00000001406A1F8D,{ 0xEB, 0x06 } }, // JMP 0x1406a1f95 (back to original function) + // jmp to new code + { (void*)0x00000001406A1F90,{ 0xEB, 0x67 } }, // JMP 0x1406a1ff9 }; printf("[Patches] Patches loaded\n"); @@ -171,6 +179,7 @@ void ApplyPatches() { auto nTAA = GetPrivateProfileIntW(L"graphics", L"taa", TRUE, CONFIG_FILE); auto nMLAA = GetPrivateProfileIntW(L"graphics", L"mlaa", TRUE, CONFIG_FILE); auto nStereo = GetPrivateProfileIntW(L"patches", L"stereo", TRUE, CONFIG_FILE); + auto nCustomPatches = GetPrivateProfileIntW(L"patches", L"custom_patches", TRUE, CONFIG_FILE); // The old stereo patch... // Use 2 channels instead of 4 @@ -420,6 +429,27 @@ void ApplyPatches() { // Don't update the touch slider state so we can write our own InjectCode((void*)0x000000014061579B, { 0x90, 0x90, 0x90, 0x8B, 0x42, 0xE0, 0x90, 0x90, 0x90 }); } + + if (nCustomPatches) + { + std::cout << "[Patches] Reading custom patches...\n"; + try { + for (std::filesystem::path p : std::filesystem::directory_iterator("../patches")) + { + std::string extension = std::filesystem::path(p).extension().string(); + if (extension == ".p" || extension == ".P") + { + std::cout << "[Patches] Reading custom patch file: " << std::filesystem::path(p).filename().string() << std::endl; + ApplyCustomPatches(std::filesystem::path(p).wstring()); + } + } + } + catch (const std::filesystem::filesystem_error &e) { + std::cout << "[Patches] File system error " << e.what() << " " << e.path1() << " " << e.path2() << " " << e.code() << std::endl; + } + + std::cout << "[Patches] All custom patches applied\n"; + } } void InjectCode(void* address, const std::vector data) @@ -432,6 +462,97 @@ void InjectCode(void* address, const std::vector data) VirtualProtect(address, byteCount, oldProtect, nullptr); } +void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING) +{ + LPCWSTR CPATCH_FILE = CPATCH_FILE_STRING.c_str(); + std::ifstream fileStream(CPATCH_FILE_STRING); + + if (!fileStream.is_open()) + return; + + std::string line; + + // check for BOM + std::getline(fileStream, line); + if (line.size() >= 3 && line.rfind("\xEF\xBB\xBF", 0) == 0) + fileStream.seekg(3); + else + fileStream.seekg(0); + + while (std::getline(fileStream, line)) + { + if (line[0] == '#') + { + std::cout << "[Patches]" << line.substr(1, line.size()-1) << std::endl; + continue; + } + if (line.find(':') == std::string::npos || (line[0] == '/' && line[1] == '/')) continue; + + std::vector commentHSplit = SplitString(line, "#"); + std::vector commentDSSplit = SplitString(commentHSplit[0], "//"); + std::vector colonSplit = SplitString(commentDSSplit[0], ":"); + if (colonSplit.size() != 2) continue; + long long int address; + std::istringstream iss(colonSplit[0]); + iss >> std::setbase(16) >> address; + if (address == 0) std::cout << "[Patches] Custom patch address wrong: " << std::hex << address << std::endl; + + if (colonSplit[1].at(0) == '!') + { + std::vector fullColonSplit = SplitString(line, ":"); + for (int i = 1; i < fullColonSplit[1].size(); i++) + { + std::cout << "[Patches] Patching: " << std::hex << address << ":" << fullColonSplit[1].at(i) << std::endl; + unsigned char byte_u = fullColonSplit[1].at(i); + std::vector patch = { byte_u }; + InjectCode((void*)address, patch); + address++; + } + } + else + { + std::vector bytes = SplitString(colonSplit[1], " "); + if (bytes.size() < 1) continue; + + std::string comment_string = ""; + int comment_counter = 0; + if (commentHSplit.size() > 1) + { + bool ignore = 1; + for (std::string comment : commentHSplit) + { + if (ignore) + { + ignore = 0; + continue; + } + comment_string = comment_string + comment; + } + } + + for (std::string bytestring : bytes) + { + int byte; + std::istringstream issb(bytestring); + issb >> std::setbase(16) >> byte; + unsigned char byte_u = byte; + std::cout << "[Patches] Patching: " << std::hex << address << ":" << std::hex << byte; + if (comment_string != "") + { + std::cout << " #" << comment_string.at(comment_counter); + comment_counter++; + } + std::cout << std::endl; + std::vector patch = { byte_u }; + InjectCode((void*)address, patch); + address++; + } + } + } + + fileStream.close(); +} + using namespace PluginConfig; diff --git a/source-code/source/plugins/Patches/framework.h b/source-code/source/plugins/Patches/framework.h new file mode 100644 index 0000000..1b75502 --- /dev/null +++ b/source-code/source/plugins/Patches/framework.h @@ -0,0 +1,36 @@ +#pragma once +#include + +std::string TrimString(const std::string& str, const std::string& whitespace) +{ + const size_t strBegin = str.find_first_not_of(whitespace); + + if (strBegin == std::string::npos) + return ""; + + const size_t strEnd = str.find_last_not_of(whitespace); + const size_t strRange = strEnd - strBegin + 1; + + return str.substr(strBegin, strRange); +} + +std::vector SplitString(const std::string& str, const std::string& delim) +{ + std::vector tokens; + size_t prev = 0, pos = 0; + do + { + pos = str.find(delim, prev); + if (pos == std::string::npos) + pos = str.length(); + + std::string token = str.substr(prev, pos - prev); + + if (!token.empty()) + tokens.push_back(token); + + prev = pos + delim.length(); + } while (pos < str.length() && prev < str.length()); + + return tokens; +}