From d319ae87db7c691df7d0e9288fc82d512ddcdf7b Mon Sep 17 00:00:00 2001 From: Natan Date: Sat, 4 Nov 2023 19:18:13 -0300 Subject: [PATCH 01/31] update version --- CHANGES.md | 2 ++ buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 29849a49..3b7ba9f0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,6 @@ [1.0.0-SNAPSHOT] + +[1.0.0-b8] - Fix MMB code - Fix catch key - Support IntBuffer in GL20 diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index e4135d6d..4ff64ef1 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -1,6 +1,6 @@ object LibExt { const val groupId = "com.github.xpenatan.gdx-teavm" - val libVersion: String = getVersion("1.0.0", "b8") + val libVersion: String = getVersion("1.0.0", "b9") const val gdxVersion = "1.12.1" const val teaVMVersion = "0.10.0-dev-1" From 665f57436dbe40637aa384187855b60150427a86 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 9 Nov 2023 09:18:47 -0300 Subject: [PATCH 02/31] Exclude class fix --- CHANGES.md | 3 ++ .../teavm/config/plugins/TeaClassFilter.java | 35 ++++++++++++++++++- .../config/plugins/TeaReflectionSupplier.java | 16 +++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 3b7ba9f0..9a066f53 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,7 @@ [1.0.0-SNAPSHOT] +- add TeaClassFilter printAllowedClasses() and printExcludedClasses() +- add TeaReflectionSupplier.printReflectionClasses() +- Change exclude class comparison to regex [1.0.0-b8] - Fix MMB code diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaClassFilter.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaClassFilter.java index 7b364114..f5fb6212 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaClassFilter.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaClassFilter.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm.config.plugins; +import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import java.util.ArrayList; import org.teavm.model.FieldReference; import org.teavm.model.MethodReference; @@ -10,6 +11,10 @@ public class TeaClassFilter implements ElementFilter { private static final ArrayList methodsToExclude = new ArrayList<>(); private static final ArrayList fieldsToExclude = new ArrayList<>(); + private static final ArrayList ALLOWED_CLASSES = new ArrayList<>(); + private static final ArrayList EXCLUDED_CLASSES = new ArrayList<>(); + + /** * my.package.ClassName or my.package */ @@ -31,10 +36,32 @@ public static void addFieldsToExclude(String className, String fieldName) { fieldsToExclude.add(new Pair(className, fieldName)); } + /** + * Must be called after TeaBuilder.build + */ + public static void printAllowedClasses() { + TeaBuilder.logHeader("EXCLUDED CLASSES: " + ALLOWED_CLASSES.size()); + for(String allowedClass : ALLOWED_CLASSES) { + TeaBuilder.log(allowedClass); + } + TeaBuilder.logEnd(); + } + + /** + * Must be called after TeaBuilder.build + */ + public static void printExcludedClasses() { + TeaBuilder.logHeader("ALLOWED CLASES: " + EXCLUDED_CLASSES.size()); + for(String excludedClass : EXCLUDED_CLASSES) { + TeaBuilder.log(excludedClass); + } + TeaBuilder.logEnd(); + } + private static boolean containsClass(ArrayList list, String className) { for(int i = 0; i < list.size(); i++) { String excludedClass = list.get(i); - if(className.contains(excludedClass)) + if(className.matches(excludedClass) || className.contains(excludedClass + "$") ) return true; } return false; @@ -58,6 +85,12 @@ public boolean acceptClass(String fullClassName) { if(containsClass(classesToExclude, fullClassName)) { accceptClass = false; } + if(accceptClass) { + ALLOWED_CLASSES.add(fullClassName); + } + else { + EXCLUDED_CLASSES.add(fullClassName); + } return accceptClass; } diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaReflectionSupplier.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaReflectionSupplier.java index c401fb76..6c542ad4 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaReflectionSupplier.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/plugins/TeaReflectionSupplier.java @@ -1,5 +1,6 @@ package com.github.xpenatan.gdx.backends.teavm.config.plugins; +import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -17,6 +18,8 @@ public class TeaReflectionSupplier implements ReflectionSupplier { private static ArrayList clazzList = new ArrayList(); + private static HashSet REFLECTION_CLASSES = new HashSet<>(); + public static void addReflectionClass(Class type) { addReflectionClass(type.getName()); } @@ -41,6 +44,17 @@ public static void addReflectionClass(String className) { clazzList.add(className); } + /** + * Must be called after TeaBuilder.build + */ + public static void printReflectionClasses() { + TeaBuilder.logHeader("REFLECTION CLASSES: " + REFLECTION_CLASSES.size()); + for(String reflectionClass : REFLECTION_CLASSES) { + TeaBuilder.log(reflectionClass); + } + TeaBuilder.logEnd(); + } + public TeaReflectionSupplier() { } @@ -54,6 +68,7 @@ public Collection getAccessibleFields(ReflectionContext context, String if(cls != null) { if(canHaveReflection(className)) { + REFLECTION_CLASSES.add(className); for(FieldReader field : cls.getFields()) { String name = field.getName(); fields.add(name); @@ -71,6 +86,7 @@ public Collection getAccessibleMethods(ReflectionContext conte } Set methods = new HashSet<>(); if(canHaveReflection(className)) { + REFLECTION_CLASSES.add(className); Collection methods2 = cls.getMethods(); for(MethodReader method : methods2) { MethodDescriptor descriptor = method.getDescriptor(); From acf2add64a062abfda4e43cff3a1e42a15d04a57 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 10 Nov 2023 08:57:01 -0300 Subject: [PATCH 03/31] update wrapper --- gradle/wrapper/gradle-wrapper.jar | Bin 55190 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 301 ++++++++++++++--------- gradlew.bat | 56 +++-- 4 files changed, 224 insertions(+), 137 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 87b738cbd051603d91cc39de6cb000dd98fe6b02..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 45075 zcmZ5{Q

ww`AG2ZQJOwZQHi%>#}Xzwr$&1mu>d+y|d=d{PU7KSDrj;orj%!$BBqc ztph#32L)G@0R=-#$VX4WK?O!jU~u|3Y5`4G0Jd3J3^D2q^Sy z&4UsK2uL3@DTb64;ETJ0|D#X$dHgscGOLUsoju&h3I`o93=JK7y$(T+keaj{oTz&h zMNe{`y+kcX*!h~9{Nm%$SnafK59m8S-~Idj z>N|%h=ymG{#1ZujqhEgLyj?6j5_SAw+|eyMAfu)#=?Jb5DBVASv41&2_wQB)(Jwh% z@r)sCd%M>LuTxQ?M83T9_IiUrZ#(1wZ>!Qg4%{n0l=Eyd{lw_#R%38bae~}sNb`8R zmlxbEIh60#3F-Gi>(&_fRIMKPRAbu*g%Kz(RBG%5^`PcD9owPFyeCE{9F;g;lQ>CC zm})0P_1`W66r#LNeiui^9dt*2I`&0E-Z`P?^;4qrmG7(2Xy03*a~`t#`>Lbx9ghvc z2v7+8>G@f|G@Opq}5ft@$?oPX1%2bI#h-4^MXWmeQffO z|e7-P|}toOJ#d0 zLmh*!G7u!-EKdBBPas&V!`v|k;`bs+M_$ihtUW|Olq!J6sXa>P=ek_4-I;xDqwkiTPaGN5aBg1CKLVD zAiH!Ej@)Lf+NKO4sD66MjTP6@oD~tAiOF=4C-;z$`&0&Tc0m`l9 z1-Dr?J}$y6agB9!O1zlBnk*slw5f`$(>dM(V6+=Mq+fEhDx10_O1b7hZEhm5M?jP@ zOY;&VKEz9`rGP!>Gl46$OM0{EzC*+`o)9e-lphXVN@b8kvCIsp<|j;P{vmdu!{&S@ z4oJ~A<;UM}!QP!^4GO*F0N*o1ITH~XxiJ?V+>ND{4I9jvu1+~1(RBJ*HglWARL5li z2tAHzLDZ5qQm3FX%;=~@o?Ii3LbP{-_vMXxxtj-jU)k zJ6$gBe%r@2mne$|QkzOq{7sxf1&JXT_gSY_;ow~Knig2=1RO~L(+gHu=E-zeb#6$v z{#6R63QjMJU=i1T6YZd&5#`QWVwXj+iTR}_5TO{H=US+YTuD(GTpIqKS&qRTS-v8g z14UJ+j|w|1OtA)cBHAWPDQUn1uo^=VzfpWJD2^CWhTVgvsf!>dp{lRaQ=pLJWiy>0 z2Rp*XNfzUh2876`t5aPjA(hFV1)EU_2jPW}Jtreu>tt1JS(odo<TM8l-G8n$S=f1{CE62v zjG(SEM51Po2HhKrDl8cR_5Cu@-Ot6>92*262gVpr0~Z?>f_8>Ncnkzl_N49Yrn$4{ zEJ`wrEttEMt6_iBa6>dcAB0nCChK2uU(&5|t}INLmReoL%;=lLEYiJ8u$5rW69~GA z__lJ6HnC5pJ@FrS=q=A&dC+vW2T_Y%thJSLnJWs*0wSzXXwpyZ83j{TzRs&-4*Y+~sT`rTxETHmCp+!Tzh zu^y&xg+ZjDkMYd%CC^;=%}j)QISss-wG<#*O2QWVtv;TA!y#idjxoIFrRBD%Gfn?Y zOa-dgs+QQUJDMvMNU31_Ax(12N0TnGWBnv>V^Ir?v@nta%#|5%!Iu3gEE{zllV^OZ zek9}MUYmhWQXrto{U#08c)h0aj1!lAH1$r_sJ&Z}3#*5DV3hogD0C&k2!`OuiKw=1 zkkYo+emk|b=14fRwKh2CAVA(uKvEpi7ua_)bCmAU7UZ0669Ni%V5Q5B2@Kkv*_Xl< zXcI1Gd=HcY$W&N2L8XeS&im~^nD+3URE~uews-;i!E#54@G&`8m{;-fRi+ z$XcEYu_ozQ14fuDicbw%b28v8r9=3{Zc(4#VhjSSlaeoNIYNekY~}J`RnnfW40h~a2gd^FVD1HGadH?sa4eLXy?0eYuB9=JU`cQepr9R@UQ zAFlOa!*WD!JtC_Cw#|^!-s0_Mkbp0;Csrfx)*C@#tVLdv@L=f%i(fAyEdSAlfSi9^ zVwX7?ptMT{!7N%`hs9bIC+mX zerOvjri0k8v^{XQng?3F8rC$8@sm||%aj$vYd z5w2Cwi}H^I#RAVS!K?N>5_brODZ@28O_G3so!-ZG-~4KBo`6=TtByV|kn7ick$qh< zK-KE5lWUF(*Ba69>-K1=g%EjfnTys~Bhaau&=3s6g_Wk`R92-y*_5etJiR9^PE_HG z-RZlP_#13b3XkXFZs57Xm!0Md2nsMr%%lZ=KZL()18Zf5pQz=kjwa<21&V3{B~1{B zTpK{uwg~@PzrzTKgh|Kw#6C>L3s`Nkf<4_7><84yXnnG8=}yPuguI3&_ONo~0WUwT zxsJN*Ga1RTzKGJ%x&|ITYn+~2YL4N7WHsg&=6~bP{{fX-qYO@r|KKHSl8*&H@p1sm zR1^v>4 zZw@=jH4i6AZw|2u)(QXLQWLea7{tFP4xSg7{}%=iM-ZFHfC2&aK?4EtCOPGiC7I3R zB-MIB1E}%VF{r4}Z^O~g!M%mR=*oXPCkQW)K>z4WYGY0^Y}k)z+)?|2%d(Y|jRJ7; zCa_MgFsM=+N8;a3brzpfvLBB#JK`aXoKFyF6S%Oa z01}wkF11IK;aPjkDmzD+C+5xT>@HC_>w@ zP~ZZzXPG6jdn`>;sMU(&`UXo4wo@>#0bHjch<12!J?VpNW6_vRo`drzuIzB6v7)&) zxS72*_(_O4E2{dsqv%4mxhNY81G?y*0Cq8h7-(}!q!jgc^?7Y1kxZkzJnQPzblbS2 zt;Pbpn2Jmir;oydZI9VP)TDlnLcXLXtrA5jxG^djNNcL-e7#aJl^KbOO3@H}0J0+Y zDOyrNS+_~C##%~s2cT7VxIxnIQqs~P?vmX?G4@2RZ1pgws^WGf@@44VKkoQes=ox{ zwU2?q8AsK10kJ2=|9kor^*U1B%`xHz{DXSYKJ>+n%}3-Q&M{;#L2tRItOpjKtrZGi zrXY7_Xb5AUG9%B`G!C{MOq2Ekz)NP*F1>5J?C})nxWtF?0klThPMW85JIKjK_v9z> zN$@6}&K5)58daLZFG=fjR~<~+{QPoFo9RK<7%1KaWHL8D%5r8X166MpB|Yx${L2iE zb6yT@_=2KF7tIk2c$*}fAdw^RTlja;040-;jOkJ_I@fk&F2494QU1EFb_T8gek7^n z{*yW}HShh2e%I;B+Yg6|IfLF?~3_QeRUP@-K8Co*CJ9j8JD zeRC(-cD?i>?vvD?|9xWrr$TIS!15#^_z402%A*P)jrIA^_c+rxmlOTeLV;-P1EGsW zN9@PNtFj4YNfw%0%{hDTux^RmBl}|hjTa?f7>2wnh;CXd%5FaHPp9Z&ZEDKP*vQ%X z`S|{({H?XkmT$8B3&&)KEas95N78t)AB_%wiN_p^1-(xHv{2hQc!o*!!E~llO5Y7& zS9QpC(ih(Y4|aG zmnIYds-H6Zj#8(@X0)G6NUdRyY~TRU3^p_!tzw}B3Zh6n=GY&Z&a5=_AF4yzkj`P6 z_hQWrEAKu=KiCS@p2lsN(+1dd?v?Zc`fQ1@v~W{l?MI$hvh$FetIas&m!XJFAp@Gv z9A+cEx8=Q9mX8_A=;jGR>hKy(XQ2g0I77a4-xZ#u-LHj1EARx(#m3X;?YV#v_-R&I zf(l@4idg3txF!h)_z&MBg%qRaYjMQRI^k@>p)vWGA3_|8&9J|j_By&BzFsZf4pV8} z(>rpXzcKTpLHN_GyhYBD75T-KG1*ouOwWn0fvs?6u#>KTu|^prtW&6oFvj#q&d;8n z88aHzr;R7r<)6p$#exPD*GB{VDd!1=Pc7B;wGUOIQb=$$$p`1P;bQ10K}U&ZgQLTm zg9=GsK_@K49$`^vhHB?Nf8zqz&%4?IyAUf%Sx7BP3WUKDdox#WC@vpz7Ekk67N~3D zTTzfy;LtZNke#X>V2bSOJt*C)m^(q*`WS@TB*3ZA%fpBaG*F+Tga-YJ77xrxJ1+%F zx{)eti0hVL@a3ua`IgNt>&ORsXZr@uO#gik`Jdelr!(Q}`(Lkcg9QTO`|n=CxPS{7 zQNL8)Qb+oUrRR#JLpg##*<9pV2D<|Xl?q~{hE5AE=HjYB)lS+qEoet*O-?wWsGFBK z(}q4gUFCK|2Wlsx!U-CS;}4cd7o401Jdjl!L~>c5EBs} zg<8bp#zv`~96t;qN_C7m>RhLDsfGfyuw%2>J8r`n<{YI)Z@npwB5`m%unevrQ#o#% zVKw*FaumA2p?WP<7Sp75sw}B!*JNt5U%IWVPiVk@*IKi?(n@S%|Q8ZCb84X7D1eF{e0UFB18YlTVn|JLs`880mHMaL@aSeP98T zaZm3~hbx>vs6`Uyxq=sx1K_eyss=2>aqjiDYME|3^$vV1PwE7^mKlKPW@j=j(w^|F z-w72Hqsw$6XG~hKCla0JF1{td#I!t@u`u{WHn~Xh7j_{B8PKC>|JHClfsVU%e2KO^ z$^VkTr_26oSt5OuUo$}+Q!`#at0H;+EH_nKdJ-qi%q<#otB8B$JNmHRT+xn<44{I; z2dT71-!X4rM_8IkPV)e4iG@M2fDD)lLbY;-&ly5??Y$VEuqWrf1nw}F6=))rfiyg;FBh=h8UCtY@KP?SV-(0)HaZNYnrO)bXf4z&Te3X(1Z|59oZtoEnx*Lj&W^-HWg}1vxL4n zHkds#I>OCY--ytRpxPpWW;GD*`@{|m!#WcBixAPqNcEZQqUU`e9QciwaM=YhFKXmo zo0Ovo(0@m>k^>sw@Cx|h{&vPWQgc)EEPEeipvM3HKC%w-sF*+=O|i9@-XdZVASYaNH{n!{aebws}mm}Cy# zkxIOjQT&`SoUFr6gDVt)3KjH2&H|g-K^GJ(?h}rOPT8;k#1nr({E6R->8X}{uV(m6D^7rZ-!r4Yc%`<5H^ zwD3>~60NeFVw*>zNOQS_*vh~G*I zh*_D0fxI@ zZ+;`PE~It#+~kJqZ>LYI>L3tM?pG*#;B0yweRGJM7|g>p;d4WI@+}^|{;lxHK0I&y{b@>DR}q4P z)u1-k%(}rC@_ms<7+NKQN}2!024K{AvVMe2$1cECEuBrkhxIa57COuZ7Wfq=$xz0T z6j`nb47^F=f`V(i@K`bFmi1(TFomIrmC{c~q8HFdmVEpHpZ-2UtWTSJ-sLH)&R|Mm z8)Qmgr8|bltvw*CZfRyQS?Ll>PLe0zF3u5RZEp|R8g5FKf5K;=6)5}hFlhWyIGZij zEMMsx+%4V%cRmFmD@ksl3n9>1kSS2(WPn~-Lrzi~@>Rw7XcqXORzd#=tR}tzaVEaQ zH+D(ur8;U1MX?G3|7UtxJdqW^K>`7JA}2W|P$t1I;sItfFFnv#(EsKf|CyaJ?MEU@ zQ8c0n4$i`aX7plX7fl|Qs~?6SRmZ-;PYlS);9}(j)*)P8mC#8MP@R83fzhrAOf($+ z(5`B3sd9fG`P<*}g{w>FcAL>rcRVQfcAVxid(~uc+V(2&x&3+0`H#!bhd*LTJpjg5 z;-fMuiv}oLo``OYh-8O>A@U%0Ww`wsGz1F`=4Zh$sf&go^I}H}&;o`XntqCp=2`zb zmz10+AGHMgOm8<3CnZR|hy6-yBTQ(3k9!z3LFSuH21P#`sq^#{9<1~F zhE`}gV@2_&J@5dDWWT~m-MHKgm5Sw;Nv`2W`v6?A$nD(7TE`agg3vQh5m;i^w}>h` zL{P@0%G+244Kw;)L%l_W8Xt?K9u zK9$_`C`f|_nHlk$Ik3=>Xf};h(8As-im{}pUXyGch8rvCdC)iMU*1lZi%gT<+}#II zvIAW5$+e!+DFK?te!j5LeO?N#wTtzmfN*HaNw>X?V|$Kx!@X&9P(t9qu*ur(vo z7u8u;@&srNW9@C#z(ba0%{0v0wn^-rCIV{i;pPTf1lEXjoNt$L7LAwf>v%@lGP3W8>nc-p)=ijmzO%Y5-89 zS(Oh=50hG?Rxkw!2~5!}GK4h-f!FY$%mK@K8F?nEqz$|-CA+Trp|4n7;c>GbT*O~# z)?Hb7xu`U+JU_N8t)kBA*73MrI6B_Qy9eodEeuR^lr$6xtGEyuy7`Gt=c(krsJDy3 zg61!{X|-kdM_-yjL7?@-uA@2|)dRr%1f~a)hD&kL)OS*C?t~sGGQ7VFOCZz+dV!x` zJu(Mq#<}6gRu+ZwmQ%P=+T#+qMW& z>jh0Rnye^Exas6k{DRr-*8&Gv814@1cmdzjN)2$wj(By`AK(MGXzEe7{{}Dzu&;UP z!8FS?%|8bJLCa^KIU7Z?%$DkarOVl+7w2?s1?tk>S=F5?ZToevjai;GT61bZgXN zCP`7VAPZVxPm4WE!EkL;ngRgG2jDN+1FyNzx_ET)>i|GFS20D)grmmX#gahX{<^m8b)Yk`%C;H?n^rN)cT<=*ol&xi6UQ8qlngw1c8YXHl4?mCFYnS7yo_MqKx)8bk*f-A^wBtQCYq#ymg`juTpn=wG7 z8NkZ{zKc&uJH3L6ANIw9p(`u~NJ064G=EMLXC&JGWH2`vh9~5RE@J87x47V_nZlt^ zR13T=w!Gn9)V#ldIT=nDq4aAamsqiFJGMaZR}AAaMBCHzX*ZwqB)d_id?F7z8%ClI%Zt!g2N z=S(pRxI%na2mCqxH5oc|TR6I>h4hI26;EJs)V`r}1(zco)WC$FD;6@uDkLG{aRlZ+ zj4)j^LJvY{C7Go?j6^?jD)>Ns zQfqdZk;TXh!Q-e*NPzB_=L))QLj5(&B>9tnOeU>j_sC32e&VMVQu|JE@*;wBb3ucZ z{~5{fyHo-1G57q9i&>(AxPhVoODp6F>CtY!uj!M|$xzj2eUNSPzQ4ll+``oWk~pa@ z+rke`CcQ@3+Z-Y$?)fKyx&d~9s|Pd44`5{ER^-9sKU=5m<9SzEl3lD6U{7I55pAr` z19xW?9h)XxFay<0Fdkm?mm=y2A+tQ&fMK8l=IV6jP3pFL`TYo{!IQzg5DI<-;t%kT z(x}T8%a|sMW~%GycJ3p$;MULk=OyQFExJodqB_zD;l$!XPOF->(}f#D zCAv&{z}_(NIEz?^9rRS!RDJv+lvO?{ z`>A*MP^vWcl)Zv1xS&|B-|J_AXCT*gpVSi7JjQ~m7yZ7s9#cIY=|RAYv6ie}RF$ee z41EM+cte-H6uVm%qkEC#pN*ZhIt}#G1ER+ohMD&EP?%-$%lhD&#vF)5T0MBNDB_s1^B16}b_|Gi@?Ki) zDw$5U8`{KPbr#CA22IAFoW(57Dg zUi#g66BF#v`C2(`2OYW-YY#IG7K(2(iZTP}jM=hTqSHSDQ6bl6Uo%%M9;o}5f^LvANc-Q!4&E{0w}1TIG7kTsmNlRyvX@4-48 zx149D@mOQ`jHm`b(t^1vc64>}ll=wJzIyjZ5%2zIq? z&O}$?J4%7@f{2t);hfafTzmoKM9QWSKbvkf;rW<_!5Y*YJH;J-blPPZw+!g5k!=eb zre^HQKGjZ80CboqP<91Eji_{dM+_c)gSMW1Cs0%M3?}(4pj?#Fpgq7V$YXmB)*->} zNhfx1#W1t)7uY_nRCc_l+rD9}$jitp|74QKsIHw;SCo?m6vr;5FD(G#RCw%-HAlK* zbu<+l%1xlB;9LSSs=M!G8_c2CXj^Ff(~auWbSihu)Av-yvwM$Enog9tgD1Z z04i!CyWmU)Tyit4=A4$D5j(RHaC|Rt>Q)H4@4*-!#izceOjEilI+rUBy0zK$I9WO6 z+B~1IUX|sqRskJ-V>N&o@3hT{4)H)I=}dt%9zRJDtmH>{vLxrj3Di(w5jLPuR#S9n z))@y*i>Ap=}BCIM1eRX;#;qeFPNh&AFxX|riC zOI)vnF=B(<-m*aJp1QSlVgNdlSrdL|h{#T0olnXOjc`$%DvdrA>2-140bUJ633Az~ z7P%-hs0P~mUuGt$aIBgoGUp<_s56KEtg0_|S*Th6h%u>u)*{Y-dX9s$1>=8fI!S(c zSV=j_m;kjM=OuBppVd@SF{%-+2$4lXqF`-l<7_Z#%j{Cr*Qqwt{xYEun??4ix}w#<^~ZDuTZHCnM+w>LNGyY#&#Nfa6`S=+mZ zx#X)2$}l%N0wV5BsG7AZP9D75M*)}2mTF_nJ&`khdt}2MnU^gxc5!XCP0P(SC`KL~ zO8^ujd*?aMo{S)YNjPU#U8Q`R4`Kw8sRzSgCGtFbE(6na0^2*7UeT5t?Lit1pMJuJ z#F-rT3S`gJB?bu}Fl;NZ?)Pi>-H0uf`PTqW4}$cW{OvmCN|p;^Ps2Ejsl#aHJ$k0; zZs<&-cB2-20#`9qo4Tn|Tut}$z1cbhd%!eKhdQqPnoXt#y^?h=EsyL!8WI{u!kFKso91lc06V;CX878`)TY%3? zUae@eA(qS`xL(FUHmQE|3=xbl=HGPtt0T=JxNxqc&zvm|@aTH0PO)W`p48?%*_FnH zIjhNj#CFWLwwiqbv87LkYNs#)fi2ffkY9*|J+MRm9%FIb%(WUZ#Wn)Ny!cC2%xFoz zFBQfg@dYUDfA8#M6yKk}QcC8~nw9QYo0* zMJ}@BE9~8(4h&#NkR`H=d|A_JH0M;}ouUqcV#;ybCVseYkaz0j58pg%F`7T2K8k?h z3QDfV9!PrKxTiaHLJ$sF_K&#!=QDTNV(w}2if8y>zz4cvBjI zG}VWWW77UA92VDf*yg-ZW7cqk!4AdTG3vyn9e#hq~5fy3w zd7yjM)B2Krr@4Zn`C&G_rg;J*{$IruDu1@UGRZ&V7vNeRRSAjTEvqmSm-Driv)$+#y!*oJN)D3;Bg)qGI72Xg3k-+~|m^e5T<}eFO12 zyMF+A9p{d1MztZm*BpPa6ZL7E`O}iYw_1k8LMMbRbj!-xXOZf>-J%K{Hr#7ca{iQ_ z^c`izlGAvx-&DKoVYnYhhv~TY=hsaJ+F`L6bkv?`;1hsh>|{>m?lIvC)bXZjx!5*c zuxD-8M4>oz5Ni7Wm+6#UBUnylyhi9jN8P0)`ayxpF-Qn@X_P2lnd5+ z)$h{}oIeWu zW)1y zer>r0&iT5RD3iEgAKbSqIu7MbVskbYa}M-5E)c(JBgc5;!iEJNiMi}GseSUxz>Dcc zzHAgIT?Cg(f;qLRCXUE4p-q_))*1k)B7#NMx-edt$BvW+RT5W|$)6}!29M|+zNjzX z9*=~4n(ZAMA9B9e?AreL z;&JV;9JfhdDlpb(KxC&Iw`(j76@w=aJr2FzJfH|lWV~W22cSFb8Dmv$)IK-6HCw#T zjpT}C9AvH`&DP%8VS6N6dm2K*W#k;qzifM-ZP_;+;^V^_1n15fs_Lyh(8fZ6L^)ov z&pBku8C>zEZaCT|)k_TSq|M|)3)X*aKc`H>X_H2lpWF7jQ^^OPL$z6rjyrplDweS7 ztJaWhcmOlB0n#Lc_xm431{=}@K_*Kt3M{+5Nn&}I^sTy^JS^D<|7-h7Jz9Vdf)0($ z#QUXK=yqQ|_Q$3B61tJhMg2V`N6ozZbl#zz>s+r?$y4Xr1MaGcPHgJAbsG^PHd8!H zeKb0J99FBhb9H!sWoN(%gu7*)<_@QEBc!l$ZQbJl^-lkHil+%r#*n70QH7Q|Uf<-W3JBm_0f1WRK?2kf24u_N3u+lJ-X& zUfJXHCU_p@<`~@D8Y`O8zI!Mglr+4(Xa=fJ{U*};ycK#`LjHxJwxxzW!z z(wp2mv9ov*^g4>6(0>E{QW|}1wQUp%WV4!+$a~B_&2IbtK0Rdwg0$R_EV3pIvc^!b zTdp@V8WYZm_d1ti^cIs`!5sr@LWR>Cv|dZPIT&fbt&A(Ybtwfb!$S-TVoWaGlUa$E z=}V6LA zbIqH!Vkx^mbTS9DYl$$#hXr(_eVXs`$=p)MtHifCTNbTZ0Frhmfr1=y$p&K5jN8 zU%T>Jv`Mc6%~rOuIJB9Nia;h>uc3|XXeKp-!nu^exzrJJ?yy-3R$s)HEob~8=awe3 zUG4fPe=8Oudw2Xd?0+W5t>$odQg=ZxbPuipET{eU8Dx`GVIIi;<9b4R;lYVP0Rp0- z0Rp1hq4mMPHmGF^&GgxG%WQ`Vqg;U>e z{1WLlU^u=DJZ`&Qvt8!+r#$BTypPr&A%SGmzP&7m$}a8!8Qx!Y5#D$#cN(bncr5pT zx9#IQOo(1KM=nCh`xIzY3EAU=@&FSGh$GM5Uu1+nWD@+&@J<=)4EA-NvT&F~NOciP ziKpl)J*QP+B~%a@XUPNl*oESum19io%KIq?%VOf5CG+tK6ck5D8mUU5(Hu&_BKr3Y zDM`ymrX$P%asE*n;G^X2`-=k&Z|h!_hxXt<5sk+ z@i=t`zC<&>-z!>P{+2#rXZWDhm%v2b0rYEl(khos>@9nRfV zi3%xdgLz=w?E2o2OqVbYVu(J9Bx@6N;TInYd$ACczY>x8TCj;b7e+KBW0MambSTgE zxo;H!yoeF5Erc{{X!iKw7n`}nmp0p&RjH{^j| z(E&i1vTdn`Z;dCk)~PEsbyc-`js9NGk?1l2hH})mRC_pGjPkQ^ND*|Uu902k20o-R z^@9ynQztpU=fM)0RZ6ZjgZkrY9Pg6;18DF;dh}RV6h!S|yAjZXx5;1SLobsM1M%Ta z8zDJT_@Tu$>bRDaI{JR~K`s8ow0JbS7$I{<+jLHaKY*jg+kA{Sgs>FLCJgvHp_0=VrDznm6Tjf zmU4UF7_X`M8<~s8io*UTbF^(qV$uBo-Nupy`B42LLvtk@HTdruG{SY~RCO*RtpV(B zduQc5z5=v3e0yX2d1iLFKuH$mcLFr5*-tC7D6-TEc&bC>jpov!EuYJbk++Q(W9w1T zz|_~iq-p->=_fx6pT)l$(OKk~YSjpZ^`ji(UFPh;1#PbVSD+7TZ@IQanPkQQa&`Qh zi5Mv{KQOZ>RTWt6QB@lP%XV{A*6Ie2MSs6iG8A5Pbk+9!xNuF1*5xfHmh4<^77L;? zqkUo#TXgJgrLRHF{1C=o*ErR-Hdgl>Ut$)`1h`~;(S={c5{7x<5gC7VI|;rMdXyHssr^0OMlmtJ%COdi z(IVWeV&-IrNHg@-wp;*xU_{S#I(s7J^X5GCxVgoaI7j*1B!AIgQWDra;+fE9tVL z(AYobC)o>r7~16)%g!^E7~_1^K47!dN~sxneiGKszq39@sdFY}S?AX+$BdKAWwR*K zb(aNU&>q=lH&|-ITuKl5{D`vsXu^xbwWNbR5H_-dwyNV?MRB#nsYMAkB$PW6O%Ck0 z%?>!W?GNNvx*%Us3cOPRT$D&QCoG|0^cz%m7&l`K0eyn&*Q7yKCQ_0dPT}_i`^~`W zzxX*3%{K8b8kQ0PpT|GP6sYUi_DxwR0b|v8`FFdo_%a0XkgToB_%RSX=q#*c(%%?A z(0xtE#2s=#G6bo&u-dN71d;DYHLZCP;ev}-d%tYPrUH!shfnmcc{M5bmy6VY;@oV* zH`3hi>Xk_Y3elpbngw)e-bv7R^lnqzLTo?7bEEl z&1Hy&JDW{VIg=|hv_!eZUlcO%vJMfQ0R`pwmKRT)_o|3nawpPJc~oIP%ZX*Gi)!>R z!9xk{g7eFOp8 z4FuH!v#$vm9^$-BfTE8L(e$-wP|VM$x_7w}Z#ct&cBhtL$(N1F5HzbuZd0)gHA|`G z^;eC}R$V!Q(oKqua!=#)rF10y2JNTivVT$P$af&XKjNcjY3@Q}IHLBS^RD_T4KVQJ z;D3S*wVk&=G!Pw7;GTC21u7Q1Yk&$?vUg0v7H>lSC?jgmrA(3TZCpzStvL^h_#s`~ zBS=-mV0NEV12Idq6wkxeq$o!sgDBbP{s?9~yL}v8Nu_j*{z|{g-)T#EdRBOdy5iT1 zs+t41AYi8XjLBxT1Eq@k=!1Fzbnwg7sn2V`rm77j&q$ctGM>Y_@!P-;UtG~UeNO~G z=g?Lgh@+uf&?bi2!?@Zja^70s^`HlT<;ewM-iPvqbxr$&+qm61(o@k zR6UsF@@$|W>u9PbwU`nV2lCj#RyElkICKCgEWS-yxEj(~8h>0_?0{Zh^z-PV4cjMn z3mNVh>?_1OnkYV3W#NT*;K5;=I{swU=HziD8J||z)KccNCZ8p!y+B6_MBa~*R!q4o zsjon`tvjtM@Ly!fU!ymoYkLX1x0CNy4kbg3#|2-K92A3wSx+8wq*8r5>!3AfXVL>+ z8o}Ke<}4r-WY`uLdTGj6sU_#UpUs3vHj;mmc#so%evx{;oO2^$Rw0D+LTIHEP;ka~ zZXixc8l3V*G_D!*u42Jc2)4FVDZsEc*?RpJziZye!AXF8m0g8MX5OaRwRErh=`677 z*7YxW{AW0>Ma7@hh{}!f?hN|`K7Il);+iy)+bhs@WQpK6tR4?6OnLG_LSkh`*nCtw z6x*0jn}Z8_uP=`nO-B?r>j;mweW2NjJ(G7z%#&dFK6mmsG_%?s*RS!&HZ@7s%1z=X zQpkNHii}$}nhcchBzM+SfZgr~FN~ipuU*$ooYVbf+ed3IAovYQS+SYcljI0MwGZ9L zcyV#01#}lZes6tzBm8*kt$lZ?@wzs5YCZTNS$T$?K6d$Lh3UR<=`~{3Cfc{-z6?I% zIp?ls?;S0f!cPB&Ra+m(J()M5yfNvDS^I{REHIrhtFnBQF1-m_0KZkCCMKA1ZN*?( zB$kF!?18*TIwdsU8+rNs+KB_`sYVOC>;>Y!qa9s{>x*zshbHomZ~VKeq_642T;7Ts zgexs=#u&ORw-Z;;tsk0SnW`>lJZYmC%OpU}IPyPh&IGmm6LC7DScf9Sk?Fnzt(a5oWf zOK^2Vee7cH5bQxqsLVjTsQ8D{9<$q~v^m9mL2n(a=rV>m z2Kk0$9b?%~C_z^m|AmGt(kJ)=5rH>lbQ7_l=npvz7-9U7pMe3?1P;=4ZX8PPg}CigNz zg~g3=g`=lvgg?Un>FPH#B*wTeMt!8h+uL0O4J|MZFUH>2%bks&DYe_u9tBs{&nOB;sQ888L>Sx6biU|`-@4fUFVFViI?^cPGhB<4Njbcjkwoi zGT>ESjWL|sB0c%K0`9mi82_xMl>GJ*{Ih_uldb^RqAzz&v2syG{z8H9Qh7$fxaTsi zOi2$xD_ER(C* z>{|pZ7m3|x;D6Xfnb?>(x%s~Lt8>peb?a7j zRX<(b{a5d2_1=4}-`Z9>Q2=?5pQ!Jv25n!j5z)u*cOYk=Rarf}ca&feYxwR>L|NpK zf4;OX9k~A#mj8t??5FX9ReJLITV2bSRab&(vd^09y9iF8c=czJH)r|u=+Nuv%@tG^ z!o0^g@{h9RH2jQoofB%;*saj1($KmSHG8<*OHr=BXCq{A;DMqq?PrfhgZivZk}8f1 zDLJh^GXlZpX0>Vb&6l#XU_J}FNBe6|Djd`}s=z}R29Avk8*CW?*}=H7;QqXKyL7VV zePLak^REXQtv{eZKcw&Y!e5rjl6s8&`kGjN2^J=Qnxnd5jhGt}-q(0!zc?l!zPyX^ zd+ke#lZ$)8G>O|du4FFr59IR6i~G{?)<2oXxWO6(q!Nn#Ab0>KN^ig`CA1qW3n>Ns z1F$b}ogbOp5mf7(!|Zg4(tQcdGCys}@gY+ydnm9sqm|*}ZNS>Z0wlSaVfBs2bbZR} zWuhNr^=Zs5haw_Ctk}0X=MN7B$-N@_qfhx=$%~vMS^R3lwFz{*23W@oW~cu-FZ&~r zB~YvXbnZ^k=%n1h+*q?cu;p3R7kA2DS8H{H{*iM zwzaW)IW_pgww~nu!M3+F@s`m4Wb76A?|rZ2?j@|Bx~+FVzTiHjWvri8z0javmo{IQ zu>&3dMgB<+&3`?8bz$Hj{_pOz8H1avl`X^n3l#!b{~vE#*?*CU_D28fbN>rvBA6zY z?fi1RBO$(k$N#@CDjK<3syZ9Fn>o7}*@{@2nb?>))0@~DxwxdN>S*Aop?-vcnL~;& zr~r-N)Z*TOvKv_5LNbNT8OpU~RP2JKVtV0@Svl^^C^I<$ywCgjgg{?9e+2@SO!~`Z zymR{uX{l8#0=Z4@#P;j?)kf>{*_FX3h$Hxp>1_N2R?I2RMI>P0{Gy}RSW_27E=Nq&YM3sWeT-wQts-XM#UR$Yp-Hm) zvFSjG^hB(x8%BGrkx^AA-7;u48RVOqp6|lt&=Z>Pi(lp^I z8A*#41_~hwAn&<1<4|Z3zsgcs|7Px`VV$BS5k7DuFA8t#f+@SGW81)L$s4ODtCz`6#4$h52$JuA|BY3{tUi#gor^Twk% zWk9sjmW(ViX*Gu7XOc=cC&Za`D2lXlh2op;*3W`#El`^yf3T}xhlcrE7KcPb!0wDx z9U9uMJ0=gp;n--lItiV<^4_Mb-}B$(1 zTvC*#s0O-RJzePS-aDz0Nqggf!%KTtGE9qa@3HNwvJ;I~kA+#~_=~uhI~}{wF2R&2 zliRwf=hwW^h6h!|bwU*M96+D$h3+Az+$tB(dGpPW>ZK5PXLS8J$1TK>?=B*EdfJME6|&?oDPa{2A$pVKKv344y~i^sh~$>#hw2>pS# zh4)BW<;WG1W>7BgzsRA{dfOC^@JCkp(zdY+U?M+f1E2FGt%|i;!GY>Xm^zkK;j&1n z6)b7^;t&Upy|!sb7>R#Oz5&Irj0*z9x!z6@{NhUASbpy^%g=gvz-myX+1%%!7&C7S zn+9m}xMgz-&IpH3B7~dfn1C&d0;i#8xDNeR%J?}bk+wr_+ft-0XECHH+vF@lQXq9I zIWCw3-{tqo6E#UQbO2GyJpsr}NrYT0mM^@UaU6-{o#(R4Cm^|ZR~4ps8ne)vwYWOR zi@7T$Wwp4YwUnh#;Q!ouSJEEt7y9xQvA{q;`2YVjLE}HHv#6DetFx8ymkv4Dt2qO< zA`bRnGVvui|IvqB6}vA#64AefL02apVZSS`hBWDEY3R#}{JEm7Z)?0y#^J&;Gs*Ik#Ye#3?;XMrPQm%N(Y7#CI2d}2 zX0zkY@ei(&o7sq@(56tbutMNSS?WEANQ-&}OBqKx2W1i<-7oxZoC1@ukaA$kux4&)hc-pKsQ3xqh-WXtBv(K^e#63>r|gc1 zMT2}ImljuHh3RBYIj&)(XIf-q(0BC%>QH(Vaz?CHtszuLv~89*4nOoGS1xeLHz$O=dib7zOv)n*9iUk=lU;H|9@q*%ose9^GSXr%YQ=! zNSXdK{$iCU>=y)4`4-yTn94!~b;gTBT4qTTv>V`zh15tBV4@4?5wj!tJ+#Q!r zt2&^Y&BGS={9K3ixp+*;w5DnJ$B-f&gR4RPNdg7-?rV*rMhxCEjpD4>1gt(JN;P#6 zo@ur#<-N2K82{)b@~wfkoz^}zceYMSY}yK*{=r-u-;IcHtyti=5>-8qR#XN~K=wH{0HW73>t3nW~r>lMr1QcaF!AF;IH#61-Bs zKZIp2Pv2%^t@0pPaVn;6)Mw&okUHBVZ*dIO7fjJ`y2klGm1*3W!Vd}@1O)c0^NTJy zfdu{Qhb9K#r7{>{^@*W{0yPUr5hdr=)eBT(DQ64PDB0)N;m3$#R_^1FNAFMd9b34FePVD?eHk&*X`N}D`dRTd3ggApSmxubxi+(mAy@ZPjTk$UI*RQpp!C>oBb!aE#Qn#UEzS3n z%I>Hz;;sKu4J49}z&2qxPtzi%fj(qot@B<4StGsFSaJF;I4#I$TE`_bo?kGwCAT%E zR4GMHfeT+mVZyHrxr-4u&oVe$Y)vxVFJc0kzH&!e6niJXZ#DUxbcU(Da%1hwCCq>K z1h#0Vgv3R+&Ohm_-W4DC3QBP%=|53Ic`(5WUAy>z+-ls!?64hfN|BS1<=1@?p zzeqb^r>%p^Y?oF;iy>`XsYNsz3JMO2smd735gF92n7EG=mZxc<@ zHLR|DF&VjLiITD}!H}AAp9CuHJ5F3sk|sn0(OzDVoGsN8W24NeS!VDh?YvJNGzWCpwUz_G_~8=+VRInwVhNw?ozVGPN_upIa)2A z<0OvE9V!QQwcXHj<%{!_2Cd2~t;&EG=-yJ0$6S2;hBKev32835n06DJN|Zh)4_z7)XNQ|{f3*u3t{RLKHVC-3 z#mt%#;zHsPolVCuxU%YvG>$Dh(%kXJ&3mj&HGFcovOqTYW1K^pYR97tp;(GAyc-{n zq7q9gPg8Y?3NS!eTEY(y%@P-KA-Iwe-Jp+VWSc@A3`xRxQSYO9-zDZt$XRht*Uth6C)~ZDd6P!1Q!S~005!-Wm_hv0~2I8hn9~j*G@$bEYQLplR#_^lTQO!P(Ae52r(D>xY zVY;+|G(uV2&(NK>At3Nt6#LG(0_|2@B`|HsF}Huo2_f|874kZsLv`$H5AIC(-;|emA8o#Htqe zauzQVTzNiFf%4zVO_0x>kLgygmI)9)3_7#1FQK#y1>T4`mBPPm14jXkmcibS>gaOVQu!&W9z_jOq#-J9mP?CPwUcw3KYIP%XM}jAlsa}x zlEce`w*8=MRoB35A~ipA>r~9(`{aA6u)Dv$<@}_y7?@#1kCk~uie7loi`b>=JKXp= zZ?He6t|$2Mr%NyUyY?ES{egoEyb)kCxeHbw4Zt9 z<PGo+>}t$V^REw|4Xa z{yFTWQ0dK@i>M_FBEmbgom$4Hu&k_!sc)zwWKb%x)`JL%I+Ca+D%5fuKKdx6jB$>e zah98uyVbmmrJOrUTTF^6N3c>8#2;(fJe=}h&}2ww1$N#&*eM1alt(7s-iDS4bWFh3 zc7}5Dsf#YLd4I_Z$qU#~Ne4o%<*2xRAzQ$bt8yuAkKjhk3lFi))+v4w(37&Ok`XqS z;PlNXX--D!LWJRLloY2AwNnx~EWr$eaWt$nrCO9;`VWh$IGUDsz1%*Z66T-m+goMS zWEvvr#G(PkGJ6|FZ7GZ`L^wT}5@|(G3S%_0C|s=0?iTL7nYqvA?pG`60`IW9w9*i9My%3k*J+M_peg_LGwnB3>o=3UH+`1PjE#}=W z{eJYNDpJ{=g}JeAc*@I8aPezbR0tL`k9XFX zW}IFiS^XIvHhEM)y;ju8>a@DLS>FvroJ&`nKN%WV8Dp_Y+5!0?=V4=kNumi<{z=<# zW6TWJ%Q{Q1_RsUAdrtKR>2Na-m7}&=*egfhz)sj3cagBcHFkZWXIw=%_&_$a+A$|+ zsj&0Uvmaq5ofOS>u&$;_L@COPqm|i*e^%JE$cjU!qKJP1atdr5Y7<0b=%i>A&(xe@ zB0pVNTGO!Pd#iTJC?ijY+llGeB*bV!_NTZ-T01B^EtV|Q&5ps&K=D!@>t)| z!(++z`#fNPvw`eu-bN_|73yx~g0dZooK#_NsNj3}$2py;eJ8hQNoXOJ^eFCUx%uhD zvN>DRFnpm2TcUeBD{KhMb7I(Q9QoPbplf|nU2-m(ZtjDF1|^|Zb!MlKK)lG#0C8nC ze0PQy*p@)E3yq!c7N!GPqKtr~k(XC_ z)JEsnPp}`~50SJah)>P{br&o2DTkl1cY)&=A!jsSvlQfNA6)h=7WxA&X-u)N`goYf z6pi>EFNY{Haf(x!luFn-R(0VX09%*I;P!3-J_AODaN*f7Gf0CI_Gws}!CM4?;Ejkd z6*2)h6*f)6SVA0CA`H#L8}yV%L^b=Eb5`i|k9{QQdV~dym(TxeWjzl{ILH0PNwCs_ zfDrx9eGCcwXCXbM4dtu4v?M^0Iq8$xWeX|_@l668Rx6cSCI|^R2#WL@3lwX?yu@u% zjI8;*mZt5}dX)Q5JZH7Vw) z0IS?Qt4){o0Sw>b@1Jh=i8Ik9TE%zT&$dhLa{Na=6@e>On{{{IxeRGa;o*6Q@>cA> zPjJ{S=i4?!Y}!XfY&?_0^U&;Ppj$1xezK-ZE}Rt}aqjN%U#6Q!PwVhCN3EbGzEu)Z z?`hlxgy-$qaXUO-m-=R&x9OVGuXu(}1NC!jDRg+)SE#i=O0kkglFT);kgUW@p{#vF zr#nSQ5~fY?*GG+VNx0+B-n27gqkb6UV;{9mLm|8edz^Ji9CS1PQaGY<^UoFES$cZF z?}@5ke#YiHfWtPZzQJ+xPo7>m=`uJvbL$bZeK6m9LC@W(y4!H|@0{j1eS^<+0Op?q zY`e4$Jgj|TlIO7Cb>>RZ^K_hzkzmx?-uc;Rv9O$nr?c(@nw#w{xa=0%zF`ZSxtBO1$cqgd&&rb8 zA~w+2h85?)BmyOK6f7IP{Hxwz1K3$=EiUhNI4j$Z<$2-m+~9b4yg0r*KRtzQZnZnr z!Z6&Q7A|t3&XCrAU8#4t+CnHm2U#>^#}u{wHWCq4VPpCF&znyGUXp64KLs zouq4t6R94xGT9DLs5jd8??E!v_Qw{R|am85?cF|C+VtT z;5ZpYy07Tx#)uo!%J@rtrr@;_x7QUWxtfmIH1fQ^VJR7N!%FORGM7k37Z;0FL}$`c zab&uLh95hm491)p-PHbd2asN-D#~TYgt`iI0$rf>lXpvFVu6{GDfcRXWQ@BUwCH^2 zqDVJR%!0_Z;5~b)dMh8i2l+N2LFpXx(}CBl;L!KT;?;X$nx>}T^X?w&#?6Y*9{zHG z-z{t8YW`^pyEnY@brF@{Oi_=oIQS!1k`paXrHi=deHTy+P-#wz0KBGvd3kEc%lA(Q zO0pwguro(Tuu6Mta3!qP2JMJ(6LrsuLFRDp+7KCwEeb7> zN~&!TpYl^(9a19NjKf39Jd;@#7MZ}`yYw`dsyVoWRnV%bfV!y)F@IhJC{!9(*xw*S z&QYqp$)b@~Yv1gVR+~5e*egjMP=9SsG*FfI7D5Z+1_oS?M{^l9@Zi?0#@$`jMY^f8 z>XY&472el{`r4ln%j>30SQ!3u&A*z4^{d>S-|5H0k_tB2I3B?Atj9s6CnH8b^Hn zBrZA$lz&dOj1h8tbj-}D_>SU+&T;geNYnV**||BXft8+qpnLwxF@Yn!?22x| z0Rh~naRMcRv?w@jh?d$lszb;Ut|R+$?ukD5>d*(4Tb6+1Sl?SRD;&@2;(&W{l`<|R zR07Ul01!Mt!1iSTe(#FB83hXr5SV499-SIqk3JPc?2Ou88=d&&2n5Pp!CGUw;%wQ^ zz8(hvLLRf1!1h|oe`r@?_(%TUOxd(5aD65gB-$er4!>_g&8~yepAeM;y>}SD z&NfL9{{;7e3+QK!CK$aBk{2*9{!vIp?FDP<)m|nDrVpJW7K{G#(jy=3hi)W8R@$ESx8NjjHJ8OE#((hg}L0JX^*Hvf5G zxBkuo?gIi)IdH&wv-^na-}#Hc@~nJ$d&Ok(QLy-hZt>c~v01+H1^3PfFg}I9k&w?n zjY0^3zuqZ;5nFT#(+Rnj#D$r?56=D0Ah05~>!d}&T$38z&5vRM$fst+4$Dg)V_0X3 z0<~v|c+Dv>8eYAJMc&x$#rN>J(mntwhP~7RLfh-RH<+?_ot1xI75=*CSMiY%cz%A_ z?^WYZE)y{VK@w3ru!FozHi#I6Kv@!GvZ~cTljKihG`J6qS`ffzn1LXr zDKt`$tMoL-Q|sH;m^<%|p63}q7hc3@4DQ=Y){A5P$nEbv66o`P_d7e&zaaoM2Nv+U6t(oezxs97RJDCRXCL%}DMvmcgx&cZV!T1~9+uqH+d&cYV>{KQ=pmdvJO*O-M znklttF4ziG?QcRkEQLb663ep5MQnBYEIVpV1NI;N!1-1l4%02mZwKDIc<$VXIUGWJ zZJPrc>IysDe&korIKbx&eyXzzJuVUr?HGx?{vpPcFHE+T)0|h75d^nNPsROEO`A)x z(59)LhRg9Hme@_icN;OcX%~_0AhQ5rPMpNMve`ep+0=atUejflmoB&6NPP?0L~hqD z40n3VG=Q2$^~1|@PEs%!3o$RVgBEz3yr48K77*t6P<|iabjdxXa(wsX zM*Z$9$vWsfHF;WQqGMHKyc{#&;!Z8aLvt7A9)E!iEpC$OfZSxT-!rK@Eu*$Pp29L& z*i1FiM@#WHCvBMSmCB~~VizhzkoRHJU2N%RSB1Avbw($#1lcdusLsHOB=lHoC}Nl2eF@#lzb9Rp-F**0 zjUq%qg9{^O^0M!T2<%sqp-vC;mk{llN!&J9RVlZKvLbcSOKK=FPcP`?w~mXc{IUB) zB_uG@I{5k1t|%X8&mzoN#h4ZR%&w)ODkWm739p1a+YZS1vxvRp%6voyM-oYsbAa9} zyjzMHVWg62DwoH%QGPMTZ?^sj?P6dLHv$>vA>rN+RNrEnyiOYB%O4pxEc-b zIBxX9x!jim(@4B;&o6Wt2sPhfom4_lZd`WRaq!0|!- zOAk!lOTD1-yPX#NNO6d(LV?DuBCR<8gZcVrhf-oo({DIHn5IKnzfEG)I+ zmS6H}N~fYF!|u*bgE{DK$nA(oi_x*R=b&9@cir~UEt*=M%HC5E;{?Xp?mzcZnP|DZ zm5ZR(AXX6Q1(1e7VoF-&ENuAqt=W3uH`3XHbWJ#3V_shu`R7uBc~BSIF9|Dkxp$>3 zy#p7#QZBZhqT(SoiVEw37W*K19%&bw!?yS&grPg;B!)ucW{hB;AKtmMhM-en28T)* zxguMt2%k9;*(vIH?5)k}6Z6`1GB&?xYnPh7Uf|Z2P*k{BoV3zP^d>)fh2R5jL45=E zg<9HoAdQdr2dupyl+~)m;MVt;srdz=plrNC7PusUcr7!TFvChwzA5Z2w`5Z5}Ry0 zt5gGr=q(u(j8s)}S&x|znIEu6U&SK?2TDV#pHa&zVc_EOLG(je6o2+!L9LWe$F8mOWMD$gr67>Dv(I(^mQ0 z$tC#}tTymu1wO#(3=H`7@U-dZlRV+n!r38(lK$FES}ViV#kZuzAm7_oS<#e*KcDT2 zoVNnY`4sy3Fh|9%*iRHgi& zrLD%D?L88Ouq_0U#`}t}Eq=F{^Q#E;{BYU0uIdk`ox4i60t1kvl2alBFSi|6s|s*Wsv(rbsY>Y$Ci2qC?NmwGOi$< zL?5hXAn3Z6JQMKCV3%d79ByDEK{ukP!3UQq6=Vrt8`6QcYy~t#gXq4#%)A4_>JCnl zb%j`YC*r#go*~dqPzdl5dVyY)aRl$vJ-xc8+~Oz&+J8TWCk*^54aNui)H!+Gy+=i! zTae_OAwlX6sP2ot$Cq@bS(&xllx)3wcKuOb!sErZHHATh1r@XnQzE(l!alvw$0f8= zc=g>x32gk)(VdAD>fk;YOj@vdy;$U!chQ&XfQso5u*~R|0bnGLO)rU z)El07?kAE~AKg953l*9$g!?~qCzkgZe|VVG8)h_7do*qZN89ybbk!_m6zrDSYRtbyoe?LNy zoRt+GOFsY-(c(MawELuPHTtKOIZqX4TfXUXwy*6Ek+Zd4)g$b+a=e{2;uN~o zk%9AseOM&f*t+^J_Px_XqqQ0s-yrIQg{c`Ga7|Y5-EeEQ+>Ei-hH6T zc>E@rRI<>wr7-IB>BV>!w3;MuLU+QtEZqA|5W2yKjL@%dtb%b_pb{)EH@D@88u1++ zQ}y4U1Q(5VB=e2b5=D<(4_YZBhmz|B*1VFHe~Vtl%yI3E_>}h}pc%H#ODxMMQtMl) zq!_pWEja|VO}9@{GX_{EL7|^S!<}2x-9tN%AN{n1od(O5ntNnW1h>6wdf#(5>PrQR3iy>mN6#hPtt(B%C+ ziv5`1?hzsbX($5mHN2&hq01`AZxy`9gl_#XBUv^U!T(yj2?dgMEL~?UHk4m7af5o@ zyZ#WW@S31jT;EZ2AUTG-cE3nu4LirVdrYkI2jP83qJ0%f!|z z#78eah25`S__>7E1q6kz1%4~cN5KTy{0?ewpkyd`*A5EmZD&|8pcgJ)jeuL+iYsOC z{oL|}tJw$p-C{T10!eJ9(3Lk{XPlwQ&c33R6P>F3tWD6%lZfoP11WlOfw411jJ||U zx5U0;t2uA$7;P`-ujAP_XN}_;m&SutabvVZ>Eakcd$xAcGkdKe{Nc6$8C9DCYb51_ z=xy?k%GteX>Aq>uK5+c1XpbB3_$ z>yV7(XWEnh&Dz{6_OKH9%7fH=m6;R&_iiNuJpz!bexiY*f%*vt1~F1jXg{0^T}$-+ zTe|w`Jh5afxF|8<`nr6Q1!m@C2@A?xi~G*wFn!KHm)`qmJ;)qy`PX5E_hj$&yltLj z!JtGEN9Uc+$F28mkDa%Nohtx@Goao3eAo(t3Bm%CchFE$geFWa#!}HqeYhgb8@W4^jXv`9&>Fn+4AgQpm$H;3E*08`F1F&& zP&cw%4X(z1W-K01O;j?Xvg|6$wkykBoQf8ApJgl!f)mkru<>4OD2^deYl!nw4m*Rx zj0=(zn`A=fnrWzY8r4N^D#5@bh)$dpHwR?am(fUaU0e@UX8BEdPAu2wRLWwexxLwG za*s_L{-rl1`POpSwb^Y!yQ?EdY1Nfyli%U7&<^qx_CeK;XyU7o)f~TozOM2Y5-vKF zQ<}kvgpo-&XNI^=pFznRFCZSd3VXngzziXdmIw~fMyF(UoJk9N)bD%fAcSHP%K<6- zBaW}*T)~sQncbW z)DqPi+K*!@bxw}ghSW0eB_;eeC3QN|T_j7c^uq##^-RPo*^;%P45MF>EY<_@VbHUuF$+e65#)sAdB?~gWkXE zT}#SUq6OmOYc$xcEpf87r1EF7Os2Sk)fuVpa@$i@TsB#N=^J;!Fu-&LWq+?{_KdZv zKY$D5xJm2V@RS(t{C>6P7l?3O7!?o3KSJ?6pZW1CVmyrT-C&;vtre`t`~+~guI=+^ zt2BIVqA}r`U}1Kqda%uC<{iPm(yg_s&{99t@2^u!t~cBPZGnyrF#9XhlX&o$UM@_I zSLx#%a2OV}9i{Q>mP}{ucFCy6<7{CbXNfDIfK7Ek;yy-qEklUOOSZwDrnG>?_v)q_ zIrKK!FxTP-DR}Lkv`eup($^Uu(~eg1$|H71VON)8P4;bp`EY+M3`ruXT$MaaI;oU&~vl~76H>uXB2(b94^qm#*E^&fmN4Z9`7 z^EPRrb&69q#UG}4kd0jVv37gIrbF)#DTijONMVM>QkmbXdWuTzXeSM1%_mQ6;~G0G zf4tH1asIWi@$z?9HNSE0)`)oCJV@;;G|iMXQ0jD1&pLh*T$Sao7m=jO zaWP#C{j0e}^xup~r0XP5Og+yPe=6x>iC-w`GR1363{&x*=~*=^(vU_P`0a%ev;{fV z)Cn>C8!*a_`cmF5ZDA_Z9)rDexW%JbPTX5a9pAxIk*^(qZg_T!D0c?+r_m@d4=7SU zn&S*7dA(cZ496#?l!b-QLT|KcGeOEeQk0lT+vqiwpS%x9dXK%~%1*Qj}SP^kca0TQHV#}FA zF!wowVKBwNlSm%mc3U`Y7Qq7XPHz!VZy{1|(zwxWe=Hb+5XUb1kZ>RFJX;e+8U6d1 zstSeYw?Y>VM0YG>P5~#O(5j+G2ivC~#mz(tg5IdSYpW7k0QK(<1A{shInwxW2MyXh zNK9z)^hLz;yJv->9fKc^;{rG(iU@Ock(NG4Zx6^1P?rCjcorz1^f>akn$BJQp6m||LI0UgSY!O!jM8`LWoCT9AO+oDxO@3!6I{g zS%WKH*!=Ti@$)whJ!_&R>&-mOC*^^UJPeKrM4H(ZmxE8<&TAK6`TO1DC<6$LCVPUI zR#+x(s20}cgsZ%SSlk_iv*v8$Z@`chwC5xW<0H=yv-0x#ansrNto-*s!HCx*e;wJUb)|KpaU|8PQsSCL}tMO>-JZ~M(0^q zDyx~}l9W@AvQY+IE*8C3Wqc~Uq0o1A2#|aHSdrNxuv&OnZvP;7qlr}dXaqIoyNy6P z)4A!JtYk=(bjP(J$mvYRM1aG{aCOLSbM~u@)JJKy@<_+Q)!2#-The9U&&NZP( z|Ky1%jIlun^e3cKeVsG_(-q6+^j@KzHPy9L(E^o2jyrw92v+rjJ z+1^rO;r7tgV!hM{CK4_t{S{_n>E$6>$-;*`7`=pL&AkaU0VgDn*N6oRlpUV+o46+) zOqEUr0@|Qi@%R7B)1-USUw!+cV&vIDKnVY5mhj_$ zJk46|AD%i(X#7W3yjuQPEeE9Is=~6kGv|n0q?|1xxV99lTJn^H8#66}X)&Y}Oh3&~ z2dG1pu`RXmtYAV*=-ewZOTneTZn9FJxo(b)_ZdHh33cK5dfywL$1SJJ%ulYzsH5%Y zc@xoQRh|i%VO@%NZ!cEQ%3KcM*taA2=`TgspZ!>`WBZg*a<3escyb25nJInyy(xX~ zl-Az|vbj3lteG38bLzRRV>uVxSJ%o&SE%b3x2u0k9d7KcDsy*=zdD)uC5~L&;JvNr z9j+b2yLkT2{WVhA-qOz+%BUK? zf3K^-#h#7nr9Xl}_RPx7!>v;=ul@b?kFI-y9;qV)?@F;J&sc}FJe?A>^yTm_Um9Rl z2B}AG=q2LZsc*3L%r_ix^El#AaZv+d#YjNh{|NRXbW0129(5}AK{EyMt1 z36S6b>PN3#i-S0S4*azqxH6vt!U-0i6Q;xY-n z>|KTv-u+TP;{b_2?-jfqZvK-K@pmYvQ(A?$l1w=pA?OZYhotgMXqy((*g=>jrmk&7DWrJ&~3p44|Rz zrvTrQlJT^(knSQ#4e_R-ZmMj-dL=?4rXG%06hegTFuhq$y^Mwe%>2ty)1lW>I% zS{rLtBL`Fcl8QI#xzWOdN*Dn-K5~@E(lut>o%fi|csfZQ7Cv+Cu-M#Ex1v%t-A3d*Mq7}BFEPOgzMSdlf6$t>qfVC+I}*6y$f z|0oVt1gc;lL~!20FGtZ02Z!aI?mN-J^QL;r)hPV|BKksxgf zW{o{W+jp%q5x%nd=wcm3+ClWhk3cYYrr@szEN+Nz`u(B_R0w}+w-P5toSOX!QPF|9 zXAJI7<#GYx1D{FF3LnOWYMtV_5a(mujtNu-ing_a4nmd*YLBtig6$ZO5#e`qK$f#J zg~gMO8>iUMJd0`rI!aPErKiZ17w2l6d@=_k9=?wbwdyeY^<`>0WUX{E1LIs47HqJp z_EF0^Tzn86Hi!wZ=dtjvm7$HSOm??WSXv8)TNma_G&ClJXo}tmUFNJ8pB$YM9prx! z6aH=#jdcbye1Lvzy^nI~SwzDPBuH|F7yTl_K7%1ghQ`V2ufc-}C@v|S;6DXGF4wFiQZ12T>}?nP+=l^{*HxZs#tGf4KH7NT-Q3prTSr~sIfu-nFm&wFp-LpIz?JUB*7x9h)Y1wAu0;S--_jghO;8jJ^JhP>uTkN z9h{iQ7p2)Jw<$AAd$}Ld8Yfw!v$s!jeHbkf5+vVx3%!K0j-u0|ofmB?tmjM6c#Wlc zAW!cpie?j{w;(Wc3@uTNgzb{pu|iJ4QwuGQS;IoGV&RN|L)ttz%i2?f5#%uSJ{H5R zl7D7Zb!Y>izlcS$i9@2yT5`f^#4^`a?X>6PT9TL%$7joI_(ie{zYbB+TDR59HnDVJ zW8_xIM!2)0z*_&lcD1>X`e>%(Z6xJe*h^zQk{ZDoN)}WYA%KY`%Y-mlcgwL_X;5-0 z&VHNyn(#RY1b>iO5mgt|HhZyqOc(9FrRH-~Ch7ShchvUDF+$gcW~Hi|9oJoY*n zTAFFM*QsG@mqNI+cXtjUNAzbP%8gylG(x9T{~CsPPxH61lxZ%V?A|C{gm$A|yp!m3 zslC;qDDfgoOp@ejpgqdz*(H2)i$A$yoQe=YIzLMXeqUd~k$G236GQ8o_n6!&mtf}m@&ZEP}|j1HjNg_&~zZpeATp3!Y^MYk$o7#)|fq&*jg|= zdW;tNeRcD&BVv$fni-`+9?sAPzE_}vek6HHk)CY&b7lTcSjuHKDc8$}ND&eoF{p+f zcLMDIS|(@HY-nKZN?WM0%AjFwOd59!Qh+e`D6lDOyUKokCpQNPO5o8eGDt|~B`pUrOTR?NNZ(KD)QP^*Y|l8U>c zEJv%ug>_3<+TF{BmN;O~5O5 zxd@Ml4Rf=3E%=~MZP5HIyUkajfov_Bnd3C}#IADf)ND(XcPmtz+?1Z?$-2A9Mj;#a zy8PT{O`~8hSG8nLUZiQJNKvQz+&+D9`n9siM(vcTwr5T$;@1f^4Pa2xQ>7IC>B*D8 zwmVje&!cXtg1YniI!^TEFZo@RpYhaVrsdq&D9VlEf7S0Wk5(r)Q?we;V_eQ@SEOJC zsU|bDv%CDjupcIxW(eKBqPIE4;OuIY~yFf=NmaW*5^ohQTzM|mFn&^?c zw+1L#R}vRRLDJ;`p;+C0{p&EY){PI{?sISs2DI3v!c^7f3bFk(DX{1Cg;a~9w2*LD zLJxe0R`u;dvF(_S;f0ZD4VyB0q^JtmlW^y$Zus=Fp}2&^RV6YAo&$Sg(_-@a3F!{m z1}5ugby4td_KF2(ooXSV|G9qbu#=SpgAFF}@dlJTJO_S!ro~q3tvQ4Rz_lbi)=AVG=yr z7M*o$TeF$)dBt=pu%;~@^UZ~EM=2)#M*iZ^9Ew|bn*Fkh)RvI3|r-UJ|eM8 z2Va6^La9Mv#VvJq_T-Z?P*w)3)!$g>A7$)C+ZY}H1pN*<95%^PGM7Pn17Gf7JW zl}y#OOLwE`{K$1fSecg(Sld;mK6i-PGC97P;7zdr{{Xg!?y)Z~L5*sG;bSoOWh#i3iD2G*_M8<=bmX1a0H*Iy;xpM<6z>v6x%t8D-JQTg zCF~$OzaHmKAl0u#*Ak!7MRH@e=1szrHzhlLAJ@;7v>@4Aw&A=4Kzn>@!fMM%MSeWKXy*o7(-wXph!BFkxH|UJ<$1!VUv9sFZe@Jl6U*PbIoEGAHFz|Lf z73YLvwYf7)kSuAzHNb$}C)91IzH0ER>v{)(Ef z*>QN$Ha`R>YmyiTP(TfCmw)-ZpujB7*T8l)zUp-WJTEpoLZLy>q%euNFp+6D1R{MH zVj6`V@RilC!1y`HRbYsEUhQ2p_nL z=@QXdvcf#$pz-|eNXJ#gRlsmX+c%UOJo*>Am$nZ~-%z4+0aEGnTPI}O0aO|*q7BQz z!Yi}yj<*UZhxH^L=;1rDT_0u3SAt0DvA$2ehp-lx$c%N$J?ytYO5`_|ogP!db(+og zJc|o~F)cC}%6qnfiqOFjCYYO`;n!JQbPj(mAkm3ty3f4$#>@0r*gS$5ZQ(-}PNB#V zhQJYll7QDFHGlw~RAJ~~j8VE9qR`}Z8ym%14|2jI>h2Ma00~4J!L}>Fz5y=Q2wFC|50O%cs%@sqfqSsT&AjpJ`^@db>QmP$)%C0E}W$QxLJ*%uaOk05F_ z-v_5*Rd=6hd4!|1*R@(>GUwZP-e=CC>L{tP&oRom3ZBT03cY^iCYmtdhuATiOMo6>>_s|(`UG)qM)1l7;|7(5Bz4> z&$XKu;Lk%n;c7qH$outPKUcm!3B%Lp*t>2*nUfwhua8bKbaoi67l09ttpweALwRqyatZqYo-A<-E%S=)BY)_cgLak85r|oukw3%YnEB^;h zHno2m0oS{+(XvD|x<@e7Q~5yfgHqu0i4aL@db|XgBOhEq zi2wAYyws_Bnf?4pGD4ttXoA&yd>>ezqzWd+u19zykWYteWSuP|oBt1VBbIXY(}KfP z20$13l3!(VU{&+r;aX6dRTca4KAnH|C03$#L2a4g(7Z-holTv07B2ttbe&jFwr<&D zo!J)+K2nA3)M>M$^L^KKKq+*?7ftyex8=?<6pXqrixt?_rGf2)g)JGlAWVEy2A1Jl z1>;=Ax6&E>aAOlu+j<4bNznFbAj1r8JwUyDWtWV$Y|WxzFtL+n;qKm2O&ILu=7_;DrK9xgra3S=^wy(`+oPAhkVgbTeMf>@eS$`< zjL2|m2e`u~prMhW=#zAHeX6PO4v;r-M(rh>&Llch%+v-oth|@o+&Er`U@H$WUXl*84T8z)`KGHWQ+DBjjDFinkR>9cq1J~|@hjZzeHDm>SJ5vbb4{(&xXOovV z1W)-OzGzO9pMewmu1;_l(; zTH>U&ZX3fm6tb1oU;du?I1)|qL;$X&5n_zc*!*;dxl`vV#G*8ZyJ>*GQa{8;Q>&Yy z%2=)05wXje`?Rcg!fr`fT#!-Se8$5+i$$h)n6!1#D#uS0$#%W++xnM4!gW2@HQx@+ z%z3zDyf!v2R%=mhg+Mm)G2%>@+jjglxpeNACN z3|%<8B(8RD+4~*Somw?M`WCi0wm3Z_eMpbPTImKMutRxiMnmlx8MwHoLe2(m17jo` zm)onu$(#=XegGesH}Ut(8u&B4eXn_dtYt=%>}}c~6j&{Qrf(Lvd4&>P-mpnFd|)}3 zA4=RzPEu+iI7I4J?zX;I5lPC z5~xgVqIsC(Z+ic=_Ql6y-Py=q`E?zfImp17WbUc!#J-vckv7tKXQN3DK+O*mQUnf0 z3DTvIVpmBmOxVr>6PKNO8@&=$rMVgX%VyYUf0oED6q$!ci?0Z|ni0w(y8f_CbwYiN zbs~L%>{>Ik#El+}$<`>yyO_`^FOFy7(I9E(_cEhyBx20S1~#}MeT)=w$V@i?sH)lf z%>>6DgdNZXGJ!N}TVr1Dm=alH2?fK2d;+RM8Rk>(A)aO`>sF3*V1cug#ZZ6JM*OTH zBQlBgbIp(m(F%@mXc~r@9;Lb9%Qu#1gcJzaoi1zmBPf`IqvG3*rSIi0

Ag&&P7c z#C4W?w7M&=mMCZQY-E2biKC%w0^NRBb_neDdX*RyNqc{F*u(3^f7|u-li!cP+jB37 zoW5`DD(1B$E-Bu6Xp%#p+2wh?>95r=3PFw20AN+5)xdEtA-EuSCWYQ(^8ow~E!)%?FgVXZEa~#dyotSGZAeUyfB9i8H^@3Y_V5f{sgw`m8BweZIsLZV(ajBnq+`N&A%+EBxs8O>3vt2f|L{IPOmsZoN} zw<&X&siMOI2nitP{%*&yv(AltZ08(y{G$wW}L+JXJeP zD9w~vK7>zp>``41?d@BFaV1!vy zt6i&HpWZ4V8{KMYb6%?}gMm-k>mxBP=Rs6h+M}};pr8lW;KOs=->=fe-U!#2b7Isa zN-N4lJrA5RRV4R(&Fpfl9Wt?#m=1_4)2l4KKNG=b?^cv)SHDfh&8 z&OWpso&ElddnP*nHUk;YeT|;JOD?RZx@P#jL_c33;|`X$R6oBE<*qh@&7)Gkwh+yZ z{G>w0FqZolua5Lfw=P<7nY@l(V|p6{7Caouem1?M^gA35VDhD1UfdopW*}f<{^Bw# zh>NV}>cfZ+#=G=Of$!wI37FppKe=Y$Y)>fX;ef0V0DUGjk0{xgo4s2wHv;HP`+TW7 ziZ7-#6k;#PYS`m>3D%4t;q(_ng1#Sq?5cfXEByiFMqa#jV5YTDdn}OZsI^qpg5wcm z6&tWZ?}hoXjc$jfi^VjiuV)CbQ*@Co*xcETqSG%5VynWhche|zRnCdg*Z`L_vbE!V z{w+;%PS9dQN+kWLuHDY2uiDup)?n`vPH1qSlBcm%0qyK0(5C#-*PNv~pq{f_$;X+# zmj2}pbZ$WXU>oqogC{MWzA;26F-s?0ly7FtTy`6NeAD*JsHIuX{U-4-`ZMzo`Y*HkV2 zfzm7Z{nB$FI_KFL4EQJ|!Pk?=B{gg%6dLoNK4{1vgcgMWlKgfX393vtZNh9n>!iZoMMqbZmLx$X{O zaZVuqb50FKN9J1ptit}Y^QEz`@ke_%uSHb8XWa

^&2{TmT#wE=JH_Aw*Bzk|$H9rio4 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≠j5WZKO*PC6lWWI^Njoa59k5p>;x)!s-{qRTwOcb02;T8-JEJ{nHUoDXNn~V=aC?ed_c>S zvOMmBk@JahehgqY$OJ&n-arO~3I;R!{UnXpYy286Gl)59fmh(5X3(3N@SS$P;y-!t`*{2Z>o1-} zZpuWOpWFM&L~E=N_(QE9M1}-IoK9NGnKy=#M4ih=ZSWVe4aqXL7l#~R~fU)6fA> z$X5+tfPO$3Q1$sk?vntRUT5=MG<;MNTvn59#kHPtm+#CEu>l*yT*q*KMvUpGb@fV$ zgrfg3vRqVjn?ttE$RxJ|HZ`lmiraG4>M>XGwJtxwN&l!=%()L+FTJQTW!3I_P&~#f zxSrsb^J`+%SZEj`Cn7IhyW41GK%`}6#_}0_Iv4d;cNn9^>ZS(p6lg@tVW#yQ9eIh} zV)1%hKbP)J0zqs7$B0F7P%-Ry09X7)@X?Ea;TCJurgLE#c`y>Fy~6a)1nnCI3SMjn zXB}Fr=baKCVpPQ6Yc`i7(m^&Qkld|w*|P1s%U0~nQtQJ%SGshjOyg2-cG^)W8_6K_ z6I#H@6h5&y(Uc7Ei`7EPhm1Uc*z4JW@-5V8{s_q*d6Rg|BdTB*Q7na|oy9xykUO~b zFI>6eX}f>hufGn}uqRT^o$mH>Tp=z_>D7eNB%iUwPoSPptfL)xERtI7ZkW%3*;Ts& zR(vdBkZF0VeE7DBY{Z@No!(fN_Q~qunCa!1{v!&oF#w zE}B;QtpX|h?jCae57dLmF9izYi`S^l@9`7y|FszlhM&bNfqMc%fG>q_-s9(!*U`9R zk~Wx_GICUtlHF@>%djCP`&&_uxE-05h*c8haDMDY&RCs_x2j9rUh898v%beP8x5rz% zR}<*rYps-SaW=!jq~;D+a@J&nhA7mwuXDOP=#bhe2nE}5n*zA&~hoJT*D_QyO;dV-8on9 z;7h*>ZFka68_Kj9%0wyxrzvle%56wpa(sz~8 z&fvn2)S_%DAlQ|tPc6>h+KVwM%rMF;YUI1AFj}Re)0ePQ+XdxC$*ew;}hkJqRZYTXg!keDnQn<7zjkxc=2O*ST=1t@HoW= z#43q}aqP#xCrTgyrA$@YLdrSJRnP1tPf5*DQM85i$3Y~He9&+n@pS_gSn~}i9x?y( z$Xf_IHY5Qzg=GLU|25w0)7)(%#0(ZapGI4#YF5RRnkYC4NeVTQLQT$E>VYFkUQ5?) z>?-A@_Rm;ms(zPHLBw1o0La|4RzrnReLL$Zc%1p%^XzKg>*M`}{D(x{<-tTEi~$qg z^ZWd&PL3TVgnG8iFE7^R6CNIcT@%>TkqP|G`NtxzhLUhZEI7wW{C0m#jSu z^_Zl?k8nVHlWqF0{Y}3CotV)xD4)z@F9^?=KC}tj7fXwE$TWx4x|&9-a2bxONG5w@ z_;d6`5&=NM^YD}6db*PoT2tjmi_uUVbmY5C9_IB9QzxZ!w}4TDk3w!csVibb5M@`UfNhkki?C zOxCRdO~k>}m*D9*>qOrM&wG$j`H>n9iUO2Pu>kYE_vV@(Gq5hjnv!&(2^WjTY3Cn` zv*eC+t=I%&GokkDrnRh^dG4h_M*jNcFbpBZmhmJ&I?~Lv?jHb2gb}1_>GVUG`9oa% zANGd9bilj8FhS9LzB)C&u!5d|lAe$X+sO}{>aw+8r-kR(C|%k7z$

o?Fv%)cNJ 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 YcTXf)DSq%bBM{rc7rhZQ0ssQ>FL>zZoB#j- diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 170811b6..3fa8f862 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index af6708ff..1aa94a42 100644 --- a/gradlew +++ b/gradlew @@ -1,78 +1,127 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,92 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 6d57edc7..93e3f59f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -9,19 +25,23 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,38 +65,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From 6e586e3daf79e92bf628671dc997b62cdfaf69be Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 10 Nov 2023 17:41:25 -0300 Subject: [PATCH 04/31] update imgui lib --- .../xpenatan/gdx/backends/teavm/config/TeaBuilder.java | 6 ------ examples/gdx-tests/core/build.gradle.kts | 2 +- settings.gradle.kts | 2 +- tools/generator/core/build.gradle.kts | 2 +- tools/generator/desktop/build.gradle.kts | 2 +- tools/generator/ui/build.gradle.kts | 2 +- 6 files changed, 5 insertions(+), 11 deletions(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java index ed91bd18..bff62914 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaBuilder.java @@ -75,7 +75,6 @@ public interface TeaProgressListener { private static final String EXTENSION_FREETYPE = "gdx-freetype-teavm"; private static final String EXTENSION_BOX2D = "gdx-box2d-teavm"; private static final String EXTENSION_BOX2D_GWT = "gdx-box2d-gwt"; - private static final String EXTENSION_IMGUI = "imgui-core-teavm"; public static TeaVMTool config(TeaBuildConfiguration configuration) { TeaVMTool tool = new TeaVMTool(); @@ -215,7 +214,6 @@ private static void sortAcceptedClassPath(ArrayList acceptedURL) { // Move extensions to be first so native classes are replaced by the emulated classes makeClassPathFirst(acceptedURL, EXTENSION_FREETYPE); makeClassPathFirst(acceptedURL, EXTENSION_BOX2D); - makeClassPathFirst(acceptedURL, EXTENSION_IMGUI); // Move generic backend to be first makeClassPathFirst(acceptedURL, "backend-teavm"); } @@ -430,8 +428,6 @@ else if(path.contains("gdx-jnigen")) isValid = ACCEPT_STATE.NOT_ACCEPT; else if(path.contains("gdx-platform")) isValid = ACCEPT_STATE.NOT_ACCEPT; - else if(path.contains("imgui-core")) - isValid = ACCEPT_STATE.NOT_ACCEPT; else if(path.contains("generator/core/")) isValid = ACCEPT_STATE.NOT_ACCEPT; else if(path.contains("gdx-bullet-platform")) @@ -455,8 +451,6 @@ else if(path.contains(EXTENSION_FREETYPE)) isValid = ACCEPT_STATE.ACCEPT; else if(path.contains(EXTENSION_BOX2D)) isValid = ACCEPT_STATE.ACCEPT; - else if(path.contains(EXTENSION_IMGUI)) - isValid = ACCEPT_STATE.ACCEPT; else if(path.contains("jParser-loader")) isValid = ACCEPT_STATE.ACCEPT; else if(path.contains("jzlib")) diff --git a/examples/gdx-tests/core/build.gradle.kts b/examples/gdx-tests/core/build.gradle.kts index f36e04f3..b3d094f0 100644 --- a/examples/gdx-tests/core/build.gradle.kts +++ b/examples/gdx-tests/core/build.gradle.kts @@ -7,7 +7,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-backend-lwjgl3:${LibExt.gdxVersion}") - implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") // Optional diff --git a/settings.gradle.kts b/settings.gradle.kts index 23764927..433b4b63 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -43,7 +43,7 @@ include(":examples:freetype:teavm") //includeBuild("E:\\Dev\\Projects\\java\\gdx-imgui") { // dependencySubstitution { -// substitute(module("com.github.xpenatan.gdx-imgui:imgui-core")).using(project(":imgui:core")) +// substitute(module("com.github.xpenatan.gdx-imgui:imgui")).using(project(":imgui:core")) // substitute(module("com.github.xpenatan.gdx-imgui:imgui-desktop")).using(project(":imgui:desktop")) // substitute(module("com.github.xpenatan.gdx-imgui:imgui-teavm")).using(project(":imgui:teavm")) // substitute(module("com.github.xpenatan.gdx-imgui:gdx")).using(project(":extensions:gdx")) diff --git a/tools/generator/core/build.gradle.kts b/tools/generator/core/build.gradle.kts index ab3907b9..d24c8986 100644 --- a/tools/generator/core/build.gradle.kts +++ b/tools/generator/core/build.gradle.kts @@ -4,7 +4,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") implementation(project(":backends:backend-teavm")) - implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") implementation(project(":extensions:gdx-freetype-teavm")) diff --git a/tools/generator/desktop/build.gradle.kts b/tools/generator/desktop/build.gradle.kts index d5f32c50..9cde75ec 100644 --- a/tools/generator/desktop/build.gradle.kts +++ b/tools/generator/desktop/build.gradle.kts @@ -5,7 +5,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-backend-lwjgl:${LibExt.gdxVersion}") - implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:imgui-desktop:${LibExt.gdxImGuiVersion}") } diff --git a/tools/generator/ui/build.gradle.kts b/tools/generator/ui/build.gradle.kts index fcd4034a..5580d2fa 100644 --- a/tools/generator/ui/build.gradle.kts +++ b/tools/generator/ui/build.gradle.kts @@ -5,7 +5,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") implementation(project(":backends:backend-teavm")) - implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") implementation(project(":extensions:gdx-freetype-teavm")) From c45070a843f623db751b29598a9bb79e78492fff Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 10 Nov 2023 18:10:23 -0300 Subject: [PATCH 05/31] update imgui lib --- examples/gdx-tests/core/build.gradle.kts | 2 +- examples/gdx-tests/desktop/build.gradle.kts | 2 +- settings.gradle.kts | 6 +++--- tools/generator/core/build.gradle.kts | 2 +- tools/generator/desktop/build.gradle.kts | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/gdx-tests/core/build.gradle.kts b/examples/gdx-tests/core/build.gradle.kts index b3d094f0..941e104c 100644 --- a/examples/gdx-tests/core/build.gradle.kts +++ b/examples/gdx-tests/core/build.gradle.kts @@ -7,7 +7,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-backend-lwjgl3:${LibExt.gdxVersion}") - implementation("com.github.xpenatan.gdx-imgui:imgui:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") // Optional diff --git a/examples/gdx-tests/desktop/build.gradle.kts b/examples/gdx-tests/desktop/build.gradle.kts index 12dcd06a..a66afafb 100644 --- a/examples/gdx-tests/desktop/build.gradle.kts +++ b/examples/gdx-tests/desktop/build.gradle.kts @@ -4,7 +4,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-backend-lwjgl3:${LibExt.gdxVersion}") implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") - implementation("com.github.xpenatan.gdx-imgui:imgui-desktop:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:desktop:${LibExt.gdxImGuiVersion}") implementation("com.badlogicgames.gdx:gdx-bullet-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-box2d-platform:${LibExt.gdxVersion}:natives-desktop") diff --git a/settings.gradle.kts b/settings.gradle.kts index 433b4b63..4c521ff4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -43,9 +43,9 @@ include(":examples:freetype:teavm") //includeBuild("E:\\Dev\\Projects\\java\\gdx-imgui") { // dependencySubstitution { -// substitute(module("com.github.xpenatan.gdx-imgui:imgui")).using(project(":imgui:core")) -// substitute(module("com.github.xpenatan.gdx-imgui:imgui-desktop")).using(project(":imgui:desktop")) -// substitute(module("com.github.xpenatan.gdx-imgui:imgui-teavm")).using(project(":imgui:teavm")) +// substitute(module("com.github.xpenatan.gdx-imgui:core")).using(project(":imgui:core")) +// substitute(module("com.github.xpenatan.gdx-imgui:desktop")).using(project(":imgui:desktop")) +// substitute(module("com.github.xpenatan.gdx-imgui:teavm")).using(project(":imgui:teavm")) // substitute(module("com.github.xpenatan.gdx-imgui:gdx")).using(project(":extensions:gdx")) // substitute(module("com.github.xpenatan.gdx-imgui:imlayout-core")).using(project(":extensions:imlayout:imlayout-core")) // substitute(module("com.github.xpenatan.gdx-imgui:imlayout-desktop")).using(project(":extensions:imlayout:imlayout-desktop")) diff --git a/tools/generator/core/build.gradle.kts b/tools/generator/core/build.gradle.kts index d24c8986..1f75fb2d 100644 --- a/tools/generator/core/build.gradle.kts +++ b/tools/generator/core/build.gradle.kts @@ -4,7 +4,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") implementation(project(":backends:backend-teavm")) - implementation("com.github.xpenatan.gdx-imgui:imgui:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") implementation(project(":extensions:gdx-freetype-teavm")) diff --git a/tools/generator/desktop/build.gradle.kts b/tools/generator/desktop/build.gradle.kts index 9cde75ec..d968a183 100644 --- a/tools/generator/desktop/build.gradle.kts +++ b/tools/generator/desktop/build.gradle.kts @@ -5,9 +5,9 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-backend-lwjgl:${LibExt.gdxVersion}") - implementation("com.github.xpenatan.gdx-imgui:imgui:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") - implementation("com.github.xpenatan.gdx-imgui:imgui-desktop:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:desktop:${LibExt.gdxImGuiVersion}") } tasks.register("runGenerator") { From aae3a3d33df4675f3537dc04ec0e8afcf5655ad3 Mon Sep 17 00:00:00 2001 From: Natan Date: Fri, 10 Nov 2023 18:52:44 -0300 Subject: [PATCH 06/31] update teavm to 0.10.0-dev-2 --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 4ff64ef1..b46f774f 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -3,7 +3,7 @@ object LibExt { val libVersion: String = getVersion("1.0.0", "b9") const val gdxVersion = "1.12.1" - const val teaVMVersion = "0.10.0-dev-1" + const val teaVMVersion = "0.10.0-dev-2" const val gdxImGuiVersion = "1.0.0-SNAPSHOT" const val gdxFrameViewportVersion = "1.0.0-SNAPSHOT" From 184bfac59a632f5fd32bbf6f21383ba6b4a7d486 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 5 Dec 2023 19:02:29 -0300 Subject: [PATCH 07/31] update gdx tests --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- examples/gdx-tests/core/build.gradle.kts | 2 +- .../com/badlogic/gdx/tests/TeaVMGdxTests.java | 14 +++++++------- .../imgui/example/tests/frame/GameFrame.java | 2 +- .../example/tests/imgui/ImGuiTestsApp.java | 15 +++++---------- examples/gdx-tests/desktop/build.gradle.kts | 2 +- .../xpenatan/imgui/example/tests/Main.java | 19 ++++++++++++------- examples/gdx-tests/teavm/build.gradle.kts | 2 +- settings.gradle.kts | 4 ++-- 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index b46f774f..e9cce33d 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -6,7 +6,7 @@ object LibExt { const val teaVMVersion = "0.10.0-dev-2" const val gdxImGuiVersion = "1.0.0-SNAPSHOT" - const val gdxFrameViewportVersion = "1.0.0-SNAPSHOT" + const val gdxMultiViewVersion = "1.0.0-SNAPSHOT" const val reflectionVersion = "0.10.2" const val jettyVersion = "11.0.13" diff --git a/examples/gdx-tests/core/build.gradle.kts b/examples/gdx-tests/core/build.gradle.kts index 941e104c..cca11e4c 100644 --- a/examples/gdx-tests/core/build.gradle.kts +++ b/examples/gdx-tests/core/build.gradle.kts @@ -11,7 +11,7 @@ dependencies { implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") // Optional - implementation("com.github.xpenatan:gdx-frame-viewport:${LibExt.gdxFrameViewportVersion}") + implementation("com.github.xpenatan.gdx-multi-view:core:${LibExt.gdxMultiViewVersion}") api("com.badlogicgames.gdx:gdx-tests") diff --git a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java index be6d0775..b63668a2 100644 --- a/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java +++ b/examples/gdx-tests/core/src/main/java/com/badlogic/gdx/tests/TeaVMGdxTests.java @@ -272,13 +272,13 @@ public GdxTest instance() { // } // } // ); -//// test.add( -//// new TeaVMInstancer() { -//// public GdxTest instance() { -//// return new DownloadTest(); -//// } -//// } -//// ); + test.add( + new TeaVMInstancer() { + public GdxTest instance() { + return new DownloadTest(); + } + } + ); // test.add( // new TeaVMInstancer() { // public GdxTest instance() { diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/frame/GameFrame.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/frame/GameFrame.java index 33af1ea5..31b7ea15 100644 --- a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/frame/GameFrame.java +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/frame/GameFrame.java @@ -5,7 +5,7 @@ import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Rectangle; -import com.github.xpenatan.gdx.frame.viewport.EmuApplicationWindow; +import com.github.xpenatan.gdx.multiview.EmuApplicationWindow; public class GameFrame { public int windowX; diff --git a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java index 1bfa342d..290e33d6 100644 --- a/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java +++ b/examples/gdx-tests/core/src/main/java/com/github/xpenatan/imgui/example/tests/imgui/ImGuiTestsApp.java @@ -1,6 +1,5 @@ package com.github.xpenatan.imgui.example.tests.imgui; -import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; @@ -8,14 +7,13 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.tests.InputTest; import com.badlogic.gdx.tests.utils.GdxTest; -import com.github.xpenatan.gdx.frame.viewport.EmuFrameBuffer; import com.badlogic.gdx.tests.TeaVMGdxTests; +import com.github.xpenatan.gdx.multiview.EmuFrameBuffer; import com.github.xpenatan.imgui.example.tests.frame.GameFrame; import com.github.xpenatan.imgui.gdx.ImGuiGdxImpl; import com.github.xpenatan.imgui.gdx.ImGuiGdxInputMultiplexer; import imgui.ImDrawData; import imgui.ImGui; -import imgui.ImGuiBoolean; import imgui.ImGuiIO; import imgui.ImVec2; @@ -28,7 +26,6 @@ public class ImGuiTestsApp implements Screen { boolean gdxTestInit = false; - ImGuiBoolean booleanFlag; int selected = -1; private GameFrame gameFrame; @@ -46,8 +43,6 @@ public void show() { camera.setToOrtho(true); batch = new SpriteBatch(); - booleanFlag = new ImGuiBoolean(); - ImGuiIO io = ImGui.GetIO(); // io.setIniFilename(null); @@ -65,18 +60,18 @@ public void show() { gameFrame.emuWindow.setApplicationListener(new InputTest()); ImGuiGdxInputMultiplexer multiplexer = new ImGuiGdxInputMultiplexer(); - multiplexer.addProcessor(gameFrame.emuWindow.getInput()); + multiplexer.addProcessor(gameFrame.emuWindow.getEmuInput()); Gdx.input.setInputProcessor(multiplexer); } private void drawTestListWindow() { if(!gdxTestInit) { gdxTestInit = true; - ImGui.SetNextWindowSize(ImVec2.TMP.set(200, 500)); - ImGui.SetNextWindowPos(ImVec2.TMP.set(900, 20)); + ImGui.SetNextWindowSize(ImVec2.TMP_1.set(200, 500)); + ImGui.SetNextWindowPos(ImVec2.TMP_1.set(900, 20)); } ImGui.Begin("GdxTests"); - ImGui.BeginChildFrame(313, ImVec2.TMP.set(0f, 0f)); + ImGui.BeginChildFrame(313, ImVec2.TMP_1.set(0f, 0f)); for(int i = 0; i < testList.length; i++) { String testName = testList[i].getSimpleName(); boolean isSelected = selected == i; diff --git a/examples/gdx-tests/desktop/build.gradle.kts b/examples/gdx-tests/desktop/build.gradle.kts index a66afafb..9c2e2aed 100644 --- a/examples/gdx-tests/desktop/build.gradle.kts +++ b/examples/gdx-tests/desktop/build.gradle.kts @@ -1,7 +1,7 @@ dependencies { implementation(project(":examples:gdx-tests:core")) // need to use lwjgl2 because lwjgl3 call makeCurrent and replace Gdx.input used inside gdx wrapper. - implementation("com.badlogicgames.gdx:gdx-backend-lwjgl3:${LibExt.gdxVersion}") + implementation("com.badlogicgames.gdx:gdx-backend-lwjgl:${LibExt.gdxVersion}") implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.github.xpenatan.gdx-imgui:desktop:${LibExt.gdxImGuiVersion}") diff --git a/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java b/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java index b8a6dc21..5d459e79 100644 --- a/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java +++ b/examples/gdx-tests/desktop/src/main/java/com/github/xpenatan/imgui/example/tests/Main.java @@ -1,23 +1,28 @@ package com.github.xpenatan.imgui.example.tests; -import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; -import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; +import com.badlogic.gdx.backends.lwjgl.LwjglApplication; +import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; +import com.badlogic.gdx.tests.DownloadTest; import com.badlogic.gdx.tests.FloatTextureTest; import com.badlogic.gdx.tests.g3d.MultipleRenderTargetTest; import com.badlogic.gdx.tests.g3d.TextureArrayTest; import com.badlogic.gdx.tests.g3d.TextureRegion3DTest; import com.badlogic.gdx.tests.gles3.InstancedRenderingTest; import com.github.xpenatan.imgui.example.tests.imgui.ImGuiGame; +import com.github.xpenatan.imgui.example.tests.wrapper.TeaVMTestWrapper; public class Main { public static void main(String[] args) { - Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); - config.setWindowedMode(1444, 800); - config.setTitle("gdx-tests"); - config.setOpenGLEmulation(Lwjgl3ApplicationConfiguration.GLEmulation.GL30, 4, 3); + LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); + config.width = 1444; + config.height = 800; + config.title = "gdx-tests"; + config.gles30ContextMajorVersion = 4; + config.gles30ContextMinorVersion = 3; + config.useGL30 = true; // new Lwjgl3Application(new MultipleRenderTargetTest(), config); // new Lwjgl3Application(new FloatTextureTest(), config); - new Lwjgl3Application(new ImGuiGame(), config); + new LwjglApplication(new TeaVMTestWrapper(), config); } } \ No newline at end of file diff --git a/examples/gdx-tests/teavm/build.gradle.kts b/examples/gdx-tests/teavm/build.gradle.kts index 49430d11..bf50fd64 100644 --- a/examples/gdx-tests/teavm/build.gradle.kts +++ b/examples/gdx-tests/teavm/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { implementation(project(":backends:backend-teavm")) implementation(project(":extensions:gdx-freetype-teavm")) - implementation("com.github.xpenatan.gdx-imgui:core-teavm:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:teavm:${LibExt.gdxImGuiVersion}") } val mainClassName = "com.github.xpenatan.gdx.examples.teavm.BuildGdxTest" diff --git a/settings.gradle.kts b/settings.gradle.kts index 4c521ff4..c7758fbf 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,8 +15,8 @@ include(":examples:freetype:desktop") include(":examples:freetype:teavm") // ######### Add libgdx tests to project -// ######### Need to have libgdx project source code tag 1.12.0. -// ######### Need to disable in libgdx settings :tests:gdx-tests-android, :tests:gdx-tests-gwt and :backends:gdx-backend-android because of some conflicts +// ######### Need to have libgdx project source code tag 1.12.1. +// ######### Need to disable in libgdx settings :tests:gdx-tests-gwt because of some conflicts // ######### Need to update assets path in desktop gradle and teavm build class. //include(":examples:gdx-tests:core") From bd24663ba6b7ed1695e37c57f7c47c5904f13fd0 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 5 Dec 2023 21:16:00 -0300 Subject: [PATCH 08/31] fix downloadFromUrl --- .../emu/com/badlogic/gdx/graphics/PixmapEmu.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 7e752c47..7529c6cf 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.BufferUtils; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.utils.IntMap; import com.github.xpenatan.gdx.backends.teavm.AssetLoaderListener; import com.github.xpenatan.gdx.backends.teavm.TeaApplication; import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration; @@ -101,7 +100,7 @@ public static int toGlType (FormatEmu format) { private Gdx2DPixmapEmu nativePixmap; private boolean disposed; - public static void downloadFromUrl(String url, final DownloadPixmapResponseListener responseListener) { + public static void downloadFromUrl(String url, final Pixmap.DownloadPixmapResponseListener responseListener) { AssetLoaderListener listener = new AssetLoaderListener<>() { @Override public void onFailure(String url) { @@ -112,7 +111,7 @@ public void onFailure(String url) { @Override public boolean onSuccess(String url, Blob result) { Object obj = new PixmapEmu(result.getImage()); - responseListener.downloadComplete((PixmapEmu)obj); + responseListener.downloadComplete((Pixmap)obj); return false; } }; From e3b8885c358306fc045b8961c8f67c6eecf0b6ba Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 5 Dec 2023 21:16:16 -0300 Subject: [PATCH 09/31] update teavm to 0.10.0-dev-4 --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index e9cce33d..75f4af2c 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -3,7 +3,7 @@ object LibExt { val libVersion: String = getVersion("1.0.0", "b9") const val gdxVersion = "1.12.1" - const val teaVMVersion = "0.10.0-dev-2" + const val teaVMVersion = "0.10.0-dev-4" const val gdxImGuiVersion = "1.0.0-SNAPSHOT" const val gdxMultiViewVersion = "1.0.0-SNAPSHOT" From 1f8f488deefcd266b5ad433c0404c78396cc9095 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 6 Dec 2023 12:48:42 -0300 Subject: [PATCH 10/31] remove listener --- .../emu/com/badlogic/gdx/graphics/PixmapEmu.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java index 7529c6cf..34b72912 100644 --- a/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java +++ b/backends/backend-teavm/emu/com/badlogic/gdx/graphics/PixmapEmu.java @@ -738,9 +738,4 @@ public enum BlendingEmu { public enum FilterEmu { NearestNeighbour, BiLinear } - - public interface DownloadPixmapResponseListener { - void downloadComplete (PixmapEmu pixmap); - void downloadFailed (Throwable t); - } } From 88cc210cfd18f69c3c2c13a22215d662e62eb2d1 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 6 Dec 2023 12:53:44 -0300 Subject: [PATCH 11/31] Don't throw if properties failed to get --- .../gdx/backends/teavm/config/TeaVMResourceProperties.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java index 43142288..90918581 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java @@ -141,7 +141,6 @@ private static TeaVMResourceProperties getProperties(String path) { } } } catch(IOException e) { - throw new RuntimeException(e); } return null; } From 82a8be3e45f4138f1b6d4ce5503958ebe13d54b3 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 6 Dec 2023 13:20:26 -0300 Subject: [PATCH 12/31] fix imgui method --- .../xpenatan/teavm/generator/ui/view/GeneratorView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/generator/ui/src/main/java/com/github/xpenatan/teavm/generator/ui/view/GeneratorView.java b/tools/generator/ui/src/main/java/com/github/xpenatan/teavm/generator/ui/view/GeneratorView.java index 669dea4f..22dbf5e8 100644 --- a/tools/generator/ui/src/main/java/com/github/xpenatan/teavm/generator/ui/view/GeneratorView.java +++ b/tools/generator/ui/src/main/java/com/github/xpenatan/teavm/generator/ui/view/GeneratorView.java @@ -5,7 +5,6 @@ import com.badlogic.gdx.graphics.Color; import com.github.xpenatan.teavm.generator.core.viewmodel.GeneratorViewModel; import imgui.ImGui; -import imgui.ImGuiBoolean; import imgui.ImGuiCol; import imgui.ImGuiInternal; import imgui.ImGuiItemFlags; @@ -13,6 +12,7 @@ import imgui.ImGuiStyleVar; import imgui.ImGuiWindowFlags; import imgui.ImVec2; +import imgui.idl.helper.IDLBool; public class GeneratorView { private static final String PREF_JAR_PATH = "jarPath"; @@ -46,7 +46,7 @@ public class GeneratorView { private final ImGuiString appClassName; private final ImGuiString assetsDirectory; private final ImGuiString webappDirectory; - private final ImGuiBoolean obfuscateFlag; + private final IDLBool obfuscateFlag; public GeneratorView() { preferences = Gdx.app.getPreferences("gdx-html5-generator"); @@ -60,7 +60,7 @@ public GeneratorView() { appClassName = new ImGuiString(); assetsDirectory = new ImGuiString(); webappDirectory = new ImGuiString(); - obfuscateFlag = new ImGuiBoolean(); + obfuscateFlag = new IDLBool(); loadPreference(); } @@ -72,7 +72,7 @@ private void loadPreference() { appClassName.setValue(preferences.getString(PREF_APP_CLASS_NAME, "")); assetsDirectory.setValue(preferences.getString(PREF_ASSET_PATH, "")); webappDirectory.setValue(preferences.getString(PREF_WEBAPP_PATH, "")); - obfuscateFlag.setValue(preferences.getBoolean(PREF_JAR_PATH, false)); + obfuscateFlag.set(preferences.getBoolean(PREF_JAR_PATH, false)); } private void savePreference() { From 56c6264b8966da64afe5e6068cc9fc1617962902 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 6 Dec 2023 13:59:20 -0300 Subject: [PATCH 13/31] fix getting property url by decoding it --- .../gdx/backends/teavm/config/TeaVMResourceProperties.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java index 90918581..8ff9a8bf 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java @@ -5,6 +5,8 @@ import java.io.InputStreamReader; import java.net.URI; import java.net.URL; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; @@ -131,7 +133,7 @@ private static ArrayList getAllProperties(ArrayList Date: Wed, 6 Dec 2023 14:02:41 -0300 Subject: [PATCH 14/31] small improvement --- .../gdx/backends/teavm/config/TeaVMResourceProperties.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java index 8ff9a8bf..451a37fb 100644 --- a/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java +++ b/backends/backend-teavm/src/main/java/com/github/xpenatan/gdx/backends/teavm/config/TeaVMResourceProperties.java @@ -113,6 +113,7 @@ private static ArrayList getAllProperties(ArrayList filteredUrl = new ArrayList<>(); for(URL url : acceptedURL) { String path = url.getPath(); + path = URLDecoder.decode(path, StandardCharsets.UTF_8); boolean accept = !( !(path.endsWith(".jar")) || path.contains("org.teavm" @@ -133,7 +134,7 @@ private static ArrayList getAllProperties(ArrayList Date: Fri, 22 Dec 2023 15:03:35 -0300 Subject: [PATCH 15/31] downgrade teavm version --- CHANGES.md | 1 + buildSrc/src/main/kotlin/Dependencies.kt | 2 +- .../github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 9a066f53..9e396fce 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ - add TeaClassFilter printAllowedClasses() and printExcludedClasses() - add TeaReflectionSupplier.printReflectionClasses() - Change exclude class comparison to regex +- Downgrade teavm version to 9.0.0 [1.0.0-b8] - Fix MMB code diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 75f4af2c..32545895 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -3,7 +3,7 @@ object LibExt { val libVersion: String = getVersion("1.0.0", "b9") const val gdxVersion = "1.12.1" - const val teaVMVersion = "0.10.0-dev-4" + const val teaVMVersion = "0.9.0" const val gdxImGuiVersion = "1.0.0-SNAPSHOT" const val gdxMultiViewVersion = "1.0.0-SNAPSHOT" diff --git a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java index 0ab5b58f..7bf076e0 100644 --- a/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java +++ b/examples/core/teavm/src/main/java/com/github/xpenatan/gdx/examples/teavm/BuildTeaVMTestDemo.java @@ -19,7 +19,7 @@ public static void main(String[] args) throws IOException { TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration); tool.setMainClass(TeaVMTestLauncher.class.getName()); - tool.setObfuscated(false); + tool.setObfuscated(true); TeaBuilder.build(tool); } } From e078896e5098c2bd05c0779f866975e48a0ebdad Mon Sep 17 00:00:00 2001 From: Natan Date: Mon, 8 Jan 2024 13:17:13 -0300 Subject: [PATCH 16/31] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 22ce6551..5e17549e 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ dependencies { - [Bullet](https://github.com/xpenatan/gdx-bullet) (WIP) - [PhysX](https://github.com/xpenatan/gdx-physx) (WIP) - [ImGui](https://github.com/xpenatan/gdx-imgui) (WIP) +- [Lua](https://github.com/xpenatan/gdx-lua) (WIP) - FreeType ## Generator: From ac74b4e254e07a017ca2eebf4c91ca23787aa017 Mon Sep 17 00:00:00 2001 From: Natan Date: Tue, 9 Jan 2024 22:11:19 -0300 Subject: [PATCH 17/31] update teavm to 0.9.2 --- CHANGES.md | 2 +- build.gradle.kts | 4 ---- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 9e396fce..21ef7ddf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ - add TeaClassFilter printAllowedClasses() and printExcludedClasses() - add TeaReflectionSupplier.printReflectionClasses() - Change exclude class comparison to regex -- Downgrade teavm version to 9.0.0 +- Downgrade teavm dev 0.10.X version to 0.9.2 release version [1.0.0-b8] - Fix MMB code diff --git a/build.gradle.kts b/build.gradle.kts index 09041187..ed047e0d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,10 +18,6 @@ subprojects { maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") } maven { url = uri("https://oss.sonatype.org/content/repositories/releases/") } maven { url = uri("https://oss.sonatype.org/content/repositories/releases/") } - maven { - url = uri("http://teavm.org/maven/repository/") - isAllowInsecureProtocol = true - } maven { url = uri("https://jitpack.io") } } diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 32545895..1617fa66 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -3,7 +3,7 @@ object LibExt { val libVersion: String = getVersion("1.0.0", "b9") const val gdxVersion = "1.12.1" - const val teaVMVersion = "0.9.0" + const val teaVMVersion = "0.9.2" const val gdxImGuiVersion = "1.0.0-SNAPSHOT" const val gdxMultiViewVersion = "1.0.0-SNAPSHOT" From e5be4c13586e165b5e3954e139db6337a8227568 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:22:53 -0300 Subject: [PATCH 18/31] test tag --- .github/workflows/dispatch_build.yml | 15 --------------- .github/workflows/release.yml | 2 +- .github/workflows/tag.yml | 19 +++++++++++++++++++ gradle.properties | 3 +-- 4 files changed, 21 insertions(+), 18 deletions(-) delete mode 100644 .github/workflows/dispatch_build.yml create mode 100644 .github/workflows/tag.yml diff --git a/.github/workflows/dispatch_build.yml b/.github/workflows/dispatch_build.yml deleted file mode 100644 index c3e4fc9b..00000000 --- a/.github/workflows/dispatch_build.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Dispatch Build - -on: - workflow_dispatch: - inputs: - isRelease: - required: true - type: boolean -jobs: - build-and-upload: - uses: ./.github/workflows/build_and_upload.yml - with: - isRelease: ${{ inputs.isRelease }} - shouldUpload: true - secrets: inherit \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ac0faf7..90a17c5f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,4 +11,4 @@ jobs: with: isRelease: true shouldUpload: true - secrets: inherit \ No newline at end of file + secrets: inherit diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml new file mode 100644 index 00000000..94050e6f --- /dev/null +++ b/.github/workflows/tag.yml @@ -0,0 +1,19 @@ +name: Dispatch Build + +on: + workflow_dispatch: + +jobs: + add-tag: + runs-on: ubuntu-latest + steps: + - name: Create Git tag + uses: actions/github-script@v7 + with: + script: | + github.git.createRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: "refs/tags/1.0.0-b9-test", + sha: context.sha + }) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 0a21a4ca..4d850092 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1 @@ -xUser= -xPass= \ No newline at end of file +libVersion=1.0.0-b9 \ No newline at end of file From 42f4ac852472f5c92d1f86936d3e33614fb421a6 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:29:07 -0300 Subject: [PATCH 19/31] update name --- .github/workflows/tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index 94050e6f..a19572ea 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -1,4 +1,4 @@ -name: Dispatch Build +name: Create Tag on: workflow_dispatch: From f53ec5bcfbf627948bb506b93ac86f77540e289a Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:31:33 -0300 Subject: [PATCH 20/31] update script --- .github/workflows/tag.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index a19572ea..068d6d53 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -11,7 +11,7 @@ jobs: uses: actions/github-script@v7 with: script: | - github.git.createRef({ + github.rest.git.createRef({ owner: context.repo.owner, repo: context.repo.repo, ref: "refs/tags/1.0.0-b9-test", From 26b791b799ed6988f2b402ab1c81a7af0f5975e2 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:37:52 -0300 Subject: [PATCH 21/31] get version from properties --- .github/workflows/tag.yml | 10 +++++++++- gradle.properties | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index 068d6d53..bfcbb7a5 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -7,13 +7,21 @@ jobs: add-tag: runs-on: ubuntu-latest steps: + - uses: madhead/read-java-properties@latest + id: version + with: + file: gradle.properties + property: version + default: 0.0.1 + - name: Create Git tag uses: actions/github-script@v7 with: script: | + const versionOutputs = ${{ toJSON(steps.version.outputs) }}; github.rest.git.createRef({ owner: context.repo.owner, repo: context.repo.repo, - ref: "refs/tags/1.0.0-b9-test", + ref: "refs/tags/${versionOutputs.value}", sha: context.sha }) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 4d850092..0cb8670e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -libVersion=1.0.0-b9 \ No newline at end of file +version=1.0.0-b9 \ No newline at end of file From 79ec587e075d092f48d454d1ffade869e3ad734f Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:40:37 -0300 Subject: [PATCH 22/31] checkout code first --- .github/workflows/tag.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index bfcbb7a5..1081253a 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -7,6 +7,9 @@ jobs: add-tag: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v4 + - uses: madhead/read-java-properties@latest id: version with: From 12955696a81132f400ba75ebbfc581b67a9242e5 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:43:54 -0300 Subject: [PATCH 23/31] attempt to get version --- .github/workflows/tag.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index 1081253a..e3d449c5 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -13,7 +13,7 @@ jobs: - uses: madhead/read-java-properties@latest id: version with: - file: gradle.properties + file: "./gradle.properties" property: version default: 0.0.1 @@ -22,9 +22,15 @@ jobs: with: script: | const versionOutputs = ${{ toJSON(steps.version.outputs) }}; + + var version = versionOutputs.value; + + console.log("Version: " + version); + + var ref = "refs/tags/" + version github.rest.git.createRef({ owner: context.repo.owner, repo: context.repo.repo, - ref: "refs/tags/${versionOutputs.value}", + ref: ref, sha: context.sha - }) \ No newline at end of file + }); \ No newline at end of file From b2ae2b6ff6543b29f7939ee209185be95a39bb3b Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:46:57 -0300 Subject: [PATCH 24/31] run tag in release push --- .github/workflows/tag.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index e3d449c5..a6ae966f 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -1,7 +1,9 @@ name: Create Tag on: - workflow_dispatch: + push: + branches: + - 'release' jobs: add-tag: From 02b07c33fe87c7a87979dca9d3df6ece6c91f357 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 08:59:02 -0300 Subject: [PATCH 25/31] update imgui path --- examples/gdx-tests/core/build.gradle.kts | 4 ++-- examples/gdx-tests/desktop/build.gradle.kts | 2 +- examples/gdx-tests/teavm/build.gradle.kts | 2 +- tools/generator/core/build.gradle.kts | 4 ++-- tools/generator/desktop/build.gradle.kts | 6 +++--- tools/generator/ui/build.gradle.kts | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/gdx-tests/core/build.gradle.kts b/examples/gdx-tests/core/build.gradle.kts index cca11e4c..fa56f816 100644 --- a/examples/gdx-tests/core/build.gradle.kts +++ b/examples/gdx-tests/core/build.gradle.kts @@ -7,8 +7,8 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-backend-lwjgl3:${LibExt.gdxVersion}") - implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") - implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:gdx-impl:${LibExt.gdxImGuiVersion}") // Optional implementation("com.github.xpenatan.gdx-multi-view:core:${LibExt.gdxMultiViewVersion}") diff --git a/examples/gdx-tests/desktop/build.gradle.kts b/examples/gdx-tests/desktop/build.gradle.kts index 9c2e2aed..a5250eb5 100644 --- a/examples/gdx-tests/desktop/build.gradle.kts +++ b/examples/gdx-tests/desktop/build.gradle.kts @@ -4,7 +4,7 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-backend-lwjgl:${LibExt.gdxVersion}") implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") - implementation("com.github.xpenatan.gdx-imgui:desktop:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui-desktop:${LibExt.gdxImGuiVersion}") implementation("com.badlogicgames.gdx:gdx-bullet-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-box2d-platform:${LibExt.gdxVersion}:natives-desktop") diff --git a/examples/gdx-tests/teavm/build.gradle.kts b/examples/gdx-tests/teavm/build.gradle.kts index bf50fd64..f7811f8e 100644 --- a/examples/gdx-tests/teavm/build.gradle.kts +++ b/examples/gdx-tests/teavm/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { implementation(project(":backends:backend-teavm")) implementation(project(":extensions:gdx-freetype-teavm")) - implementation("com.github.xpenatan.gdx-imgui:teavm:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui-teavm:${LibExt.gdxImGuiVersion}") } val mainClassName = "com.github.xpenatan.gdx.examples.teavm.BuildGdxTest" diff --git a/tools/generator/core/build.gradle.kts b/tools/generator/core/build.gradle.kts index 1f75fb2d..b0ec452c 100644 --- a/tools/generator/core/build.gradle.kts +++ b/tools/generator/core/build.gradle.kts @@ -4,8 +4,8 @@ dependencies { implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") implementation(project(":backends:backend-teavm")) - implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") - implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:gdx-impl:${LibExt.gdxImGuiVersion}") implementation(project(":extensions:gdx-freetype-teavm")) diff --git a/tools/generator/desktop/build.gradle.kts b/tools/generator/desktop/build.gradle.kts index d968a183..5240eb5c 100644 --- a/tools/generator/desktop/build.gradle.kts +++ b/tools/generator/desktop/build.gradle.kts @@ -5,9 +5,9 @@ dependencies { implementation("com.badlogicgames.gdx:gdx-platform:${LibExt.gdxVersion}:natives-desktop") implementation("com.badlogicgames.gdx:gdx-backend-lwjgl:${LibExt.gdxVersion}") - implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") - implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") - implementation("com.github.xpenatan.gdx-imgui:desktop:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui-desktop:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:gdx-impl:${LibExt.gdxImGuiVersion}") } tasks.register("runGenerator") { diff --git a/tools/generator/ui/build.gradle.kts b/tools/generator/ui/build.gradle.kts index 5580d2fa..23a12553 100644 --- a/tools/generator/ui/build.gradle.kts +++ b/tools/generator/ui/build.gradle.kts @@ -5,8 +5,8 @@ dependencies { implementation("com.badlogicgames.gdx:gdx:${LibExt.gdxVersion}") implementation(project(":backends:backend-teavm")) - implementation("com.github.xpenatan.gdx-imgui:core:${LibExt.gdxImGuiVersion}") - implementation("com.github.xpenatan.gdx-imgui:gdx:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:imgui-core:${LibExt.gdxImGuiVersion}") + implementation("com.github.xpenatan.gdx-imgui:gdx-impl:${LibExt.gdxImGuiVersion}") implementation(project(":extensions:gdx-freetype-teavm")) From a5ce4be58dcee101a278df87eb0fbafea0045e84 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 09:01:58 -0300 Subject: [PATCH 26/31] update Dependencies --- buildSrc/src/main/kotlin/Dependencies.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 1617fa66..498b2d6a 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -1,6 +1,10 @@ +import java.io.File +import java.util.* + object LibExt { const val groupId = "com.github.xpenatan.gdx-teavm" - val libVersion: String = getVersion("1.0.0", "b9") + + val libVersion: String = getVersion() const val gdxVersion = "1.12.1" const val teaVMVersion = "0.9.2" @@ -14,12 +18,17 @@ object LibExt { const val aiVersion = "1.8.2" } -private fun getVersion(releaseVersion: String, suffix: String = ""): String { +private fun getVersion(): String { + val file = File("gradle.properties") + val properties = Properties() + properties.load(file.inputStream()) + val version = properties.getProperty("version") + val isRelease = System.getenv("RELEASE") - var libVersion = "${releaseVersion}-SNAPSHOT" + var libVersion = "-SNAPSHOT" if(isRelease != null && isRelease.toBoolean()) { - libVersion = releaseVersion + if(suffix.isNotEmpty()) "-${suffix}" else "" + libVersion = version } - System.out.println("Gdx-teaVM Version: " + libVersion) + System.out.println("gdx-teavm Version: $libVersion") return libVersion } \ No newline at end of file From aa328e72c3bc3de13e85612260bfad4192f34f25 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 09:02:51 -0300 Subject: [PATCH 27/31] update Dependencies --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 498b2d6a..8498521e 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -29,6 +29,6 @@ private fun getVersion(): String { if(isRelease != null && isRelease.toBoolean()) { libVersion = version } - System.out.println("gdx-teavm Version: $libVersion") + println("gdx-teavm Version: $libVersion") return libVersion } \ No newline at end of file From 3c5e08d74ad10ab9a8ccc6dcb4cde1c1ae8ce7a0 Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 10 Jan 2024 10:52:48 -0300 Subject: [PATCH 28/31] fix import --- .../github/xpenatan/gdx/html5/generator/ImGuiRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/generator/desktop/src/main/java/com/github/xpenatan/gdx/html5/generator/ImGuiRenderer.java b/tools/generator/desktop/src/main/java/com/github/xpenatan/gdx/html5/generator/ImGuiRenderer.java index 351234da..6d94788d 100644 --- a/tools/generator/desktop/src/main/java/com/github/xpenatan/gdx/html5/generator/ImGuiRenderer.java +++ b/tools/generator/desktop/src/main/java/com/github/xpenatan/gdx/html5/generator/ImGuiRenderer.java @@ -3,10 +3,10 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.graphics.GL20; -import com.github.xpenatan.imgui.gdx.ImGuiGdxImpl; -import com.github.xpenatan.imgui.gdx.ImGuiGdxInputMultiplexer; import imgui.ImDrawData; import imgui.ImGui; +import imgui.gdx.ImGuiGdxImpl; +import imgui.gdx.ImGuiGdxInputMultiplexer; public abstract class ImGuiRenderer extends ScreenAdapter { From 7a784e0856cccad697da10653baf630f94d5c5c0 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 11 Jan 2024 07:46:19 -0300 Subject: [PATCH 29/31] Remove tool from maven/snapshot --- CHANGES.md | 1 + README.md | 8 -------- build.gradle.kts | 4 +--- tools/generator/core/build.gradle.kts | 16 ++++++++-------- tools/generator/ui/build.gradle.kts | 16 ++++++++-------- 5 files changed, 18 insertions(+), 27 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 21ef7ddf..9e4d1137 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ - add TeaReflectionSupplier.printReflectionClasses() - Change exclude class comparison to regex - Downgrade teavm dev 0.10.X version to 0.9.2 release version +- Remove tool/generator from maven/snapshot. [1.0.0-b8] - Fix MMB code diff --git a/README.md b/README.md index 5e17549e..bd3774d1 100644 --- a/README.md +++ b/README.md @@ -59,11 +59,3 @@ dependencies { - [ImGui](https://github.com/xpenatan/gdx-imgui) (WIP) - [Lua](https://github.com/xpenatan/gdx-lua) (WIP) - FreeType - -## Generator: -A WIP standalone tool to convert your libgdx game in .jar or .class format to javascript. [Example](https://youtu.be/BIL_5eaxg9w) -
-
-Note: The compiled jar game should not be obfuscated. - -Setup: TODO diff --git a/build.gradle.kts b/build.gradle.kts index ed047e0d..f358d205 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,9 +29,7 @@ subprojects { var libProjects = mutableSetOf( project(":backends:backend-teavm"), - project(":extensions:gdx-freetype-teavm"), - project(":tools:generator:core"), - project(":tools:generator:ui") + project(":extensions:gdx-freetype-teavm") ) configure(libProjects) { diff --git a/tools/generator/core/build.gradle.kts b/tools/generator/core/build.gradle.kts index b0ec452c..fc00691c 100644 --- a/tools/generator/core/build.gradle.kts +++ b/tools/generator/core/build.gradle.kts @@ -13,11 +13,11 @@ dependencies { implementation("org.eclipse.jetty:jetty-webapp:${LibExt.jettyVersion}") } -publishing { - publications { - create("maven") { - artifactId = moduleName - from(components["java"]) - } - } -} +//publishing { +// publications { +// create("maven") { +// artifactId = moduleName +// from(components["java"]) +// } +// } +//} diff --git a/tools/generator/ui/build.gradle.kts b/tools/generator/ui/build.gradle.kts index 23a12553..3bd64279 100644 --- a/tools/generator/ui/build.gradle.kts +++ b/tools/generator/ui/build.gradle.kts @@ -14,11 +14,11 @@ dependencies { implementation("org.eclipse.jetty:jetty-webapp:${LibExt.jettyVersion}") } -publishing { - publications { - create("maven") { - artifactId = moduleName - from(components["java"]) - } - } -} \ No newline at end of file +//publishing { +// publications { +// create("maven") { +// artifactId = moduleName +// from(components["java"]) +// } +// } +//} \ No newline at end of file From 527558985661def77b50161f27981bd7a8b5f245 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 11 Jan 2024 07:47:09 -0300 Subject: [PATCH 30/31] update changes --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 9e4d1137..2bc3db43 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,6 @@ [1.0.0-SNAPSHOT] + +[1.0.0-b9] - add TeaClassFilter printAllowedClasses() and printExcludedClasses() - add TeaReflectionSupplier.printReflectionClasses() - Change exclude class comparison to regex From baf782d559ab32fb4ef07926b6d994f18cb9e650 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 11 Jan 2024 07:50:06 -0300 Subject: [PATCH 31/31] update readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd3774d1..51166eea 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,10 @@ repositories { } } ``` - gdxTeaVMVersion = "1.0.0-SNAPSHOT" + // SNAPSHOT: + gdxTeaVMVersion = "-SNAPSHOT" + // RELEASE: + gdxTeaVMVersion = "[LAST_TAG_VERSION]" ```groovy // In teaVM module dependencies {