From 24de14b66f0eaaa36c293b4451e6ad8cc07fc078 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Tue, 18 Mar 2025 23:00:13 +0100 Subject: [PATCH] better mod ui --- .../saturnclient/menus/HudEditor.java | 2 +- .../saturnclient/menus/MainMenu.java | 2 +- .../saturnclient/saturnmods/SaturnMod.java | 4 +++ .../saturnmods/mods/ArmorDisplay.java | 23 +++++++++++++++-- .../saturnmods/mods/Coordinates.java | 7 +++++ .../java/org/saturnclient/ui/Textures.java | 7 ++++- .../ui/components/SaturnModComp.java | 24 ++++++++++++++---- .../ui/widgets/SaturnImageButton.java | 4 +-- .../textures/gui/components/cosmetics.png | Bin 455 -> 3563 bytes .../textures/gui/components/emote.png | Bin 619 -> 0 bytes .../textures/gui/components/hud.png | Bin 0 -> 645 bytes .../textures/gui/components/mod.png | Bin 874 -> 867 bytes .../textures/gui/components/mod_bg.png | Bin 0 -> 714 bytes .../saturnclient/textures/gui/mod/armor.png | Bin 0 -> 675 bytes .../saturnclient/textures/gui/mod/coords.png | Bin 0 -> 526 bytes 15 files changed, 61 insertions(+), 12 deletions(-) delete mode 100644 src/main/resources/assets/saturnclient/textures/gui/components/emote.png create mode 100644 src/main/resources/assets/saturnclient/textures/gui/components/hud.png create mode 100644 src/main/resources/assets/saturnclient/textures/gui/components/mod_bg.png create mode 100644 src/main/resources/assets/saturnclient/textures/gui/mod/armor.png create mode 100644 src/main/resources/assets/saturnclient/textures/gui/mod/coords.png diff --git a/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java b/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java index 9da68cc..c1a20fa 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java @@ -116,7 +116,7 @@ public class HudEditor extends Screen { private boolean isCorner(double mouseX, double mouseY, ModDimensions dim) { float rightX = dim.x + dim.width * dim.scale; float bottomY = dim.y + dim.height * dim.scale; - + return Math.abs(mouseX - rightX) < RESIZE_MARGIN && Math.abs(mouseY - bottomY) < RESIZE_MARGIN; } } diff --git a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java index 72a60a7..c201a3c 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java @@ -32,7 +32,7 @@ public class MainMenu extends SaturnUi { .setAnimations(new FadeIn(1))); draw( - new SaturnImageButton(Textures.EMOTE, 14, 14, + new SaturnImageButton(Textures.HUD_ICON, 14, 14, () -> { client.setScreen(new HudEditor()); }) diff --git a/src/main/java/org/saturnclient/saturnmods/SaturnMod.java b/src/main/java/org/saturnclient/saturnmods/SaturnMod.java index a321638..bb1d1f9 100644 --- a/src/main/java/org/saturnclient/saturnmods/SaturnMod.java +++ b/src/main/java/org/saturnclient/saturnmods/SaturnMod.java @@ -1,9 +1,13 @@ package org.saturnclient.saturnmods; +import net.minecraft.util.Identifier; + public interface SaturnMod { public boolean isEnabled(); public void setEnabled(boolean e); public String getName(); + + public Identifier getIconTexture(); } diff --git a/src/main/java/org/saturnclient/saturnmods/mods/ArmorDisplay.java b/src/main/java/org/saturnclient/saturnmods/mods/ArmorDisplay.java index d169ca2..88c8698 100644 --- a/src/main/java/org/saturnclient/saturnmods/mods/ArmorDisplay.java +++ b/src/main/java/org/saturnclient/saturnmods/mods/ArmorDisplay.java @@ -4,13 +4,16 @@ import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnmods.HudMod; import org.saturnclient.saturnmods.ModDimensions; import org.saturnclient.saturnmods.SaturnMod; +import org.saturnclient.ui.Textures; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.util.Identifier; public class ArmorDisplay implements SaturnMod, HudMod { private static ModDimensions dimensions = new ModDimensions(0, 0, 34, 75); @@ -23,9 +26,20 @@ public class ArmorDisplay implements SaturnMod, HudMod { context.drawItem(item, 0, y); - if (item.getMaxDamage() > 0) + if (item.getMaxDamage() > 0) { + MatrixStack matrices = context.getMatrices(); + + matrices.push(); + + matrices.translate(17, y + 5, 0); + + matrices.scale(0.8f, 0.8f, 0f); + context.drawText(SaturnClient.textRenderer, "" + (item.getMaxDamage() - item.getDamage()), - 16, y + 4, SaturnClient.WHITE, false); + 0, 0, SaturnClient.WHITE, false); + + matrices.pop(); + } return true; } @@ -73,6 +87,11 @@ public class ArmorDisplay implements SaturnMod, HudMod { return "Armor display"; } + @Override + public Identifier getIconTexture() { + return Textures.getModIcon("armor"); + } + public void setDimensions(ModDimensions d) { dimensions = d; } diff --git a/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java b/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java index 2f62821..cd5ea1e 100644 --- a/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java +++ b/src/main/java/org/saturnclient/saturnmods/mods/Coordinates.java @@ -4,10 +4,12 @@ import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnmods.HudMod; import org.saturnclient.saturnmods.ModDimensions; import org.saturnclient.saturnmods.SaturnMod; +import org.saturnclient.ui.Textures; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.Identifier; public class Coordinates implements SaturnMod, HudMod { private static ModDimensions dimensions = new ModDimensions(); @@ -42,6 +44,11 @@ public class Coordinates implements SaturnMod, HudMod { return "Coords"; } + @Override + public Identifier getIconTexture() { + return Textures.getModIcon("coords"); + } + public void setDimensions(ModDimensions d) { dimensions = d; } diff --git a/src/main/java/org/saturnclient/ui/Textures.java b/src/main/java/org/saturnclient/ui/Textures.java index 8477cd7..98c7afa 100644 --- a/src/main/java/org/saturnclient/ui/Textures.java +++ b/src/main/java/org/saturnclient/ui/Textures.java @@ -5,7 +5,7 @@ import net.minecraft.util.Identifier; public class Textures { public static final Identifier SETTINGS = Identifier.of("saturnclient", "textures/gui/components/settings.png"); public static final Identifier COSMETICS = Identifier.of("saturnclient", "textures/gui/components/cosmetics.png"); - public static final Identifier EMOTE = Identifier.of("saturnclient", "textures/gui/components/emote.png"); + public static final Identifier HUD_ICON = Identifier.of("saturnclient", "textures/gui/components/hud.png"); public static final Identifier SEARCH = Identifier.of("saturnclient", "textures/gui/components/search.png"); public static final Identifier CLOSE = Identifier.of("saturnclient", "textures/gui/components/close.png"); public static final Identifier MODS_TAB = Identifier.of("saturnclient", "textures/gui/components/mods_tab.png"); @@ -20,8 +20,13 @@ public class Textures { public static final Identifier SETTINGS_BG = Identifier.ofVanilla("saturn/settings_bg"); public static final Identifier TABS = Identifier.ofVanilla("saturn/tabs"); public static final Identifier MOD = Identifier.of("saturnclient", "textures/gui/components/mod.png"); + public static final Identifier MOD_BG = Identifier.of("saturnclient", "textures/gui/components/mod_bg.png"); public static Identifier getCloakPreview(String cloak) { return Identifier.of("saturnclient", "textures/gui/cloak/" + cloak + ".png"); } + + public static Identifier getModIcon(String modId) { + return Identifier.of("saturnclient", "textures/gui/mod/" + modId + ".png"); + } } diff --git a/src/main/java/org/saturnclient/ui/components/SaturnModComp.java b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java index 8882530..e620e48 100644 --- a/src/main/java/org/saturnclient/ui/components/SaturnModComp.java +++ b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java @@ -2,6 +2,7 @@ package org.saturnclient.ui.components; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnmods.SaturnMod; +import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnWidget; import org.saturnclient.ui.Textures; @@ -18,14 +19,27 @@ public class SaturnModComp extends SaturnWidget { @Override public void render(DrawContext context, boolean hovering, int mouseX, int mouseY) { - int color = mod.isEnabled() || hovering ? SaturnClient.COLOR : ColorHelper.getWhite(alpha); + boolean enabled = mod.isEnabled(); - context.drawText(SaturnClient.textRenderer, mod.getName(), x + 27, + int color = enabled || hovering ? SaturnClient.COLOR : ColorHelper.getWhite(alpha); + + int size = 12; + + if (enabled) { + context.drawTexture(RenderLayer::getGuiTextured, Textures.MOD_BG, x, y, 0, 0, 86, 20, 86, + 20, SaturnClient.COLOR); + } + + context.drawTexture(RenderLayer::getGuiTextured, Textures.MOD, x, y, 0, 0, 86, 20, 86, + 20, color); + + context.drawTexture(RenderLayer::getGuiTextured, mod.getIconTexture(), x + 4, y + 4, 0, 0, size, size, + size, + size, color); + + context.drawText(SaturnClient.textRenderer, SaturnUi.text(mod.getName()), x + 20, y + (21 - SaturnClient.textRenderer.fontHeight) / 2, color, false); - - context.drawTexture(RenderLayer::getGuiTextured, Textures.MOD, x, y, 0, 0, 86, 20, width, - height, color); } @Override diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java b/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java index 4e53197..e5c5239 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnImageButton.java @@ -34,8 +34,8 @@ public class SaturnImageButton extends SaturnButton { int hoverColor = ((int) (alpha * 255) << 24) | (SaturnClient.COLOR & 0x00FFFFFF); - context.drawTexture(RenderLayer::getGuiTextured, sprite, x + (width - imageWidth) / 2, - y + (height - imageHeight) / 2, 0, 0, imageWidth, imageHeight, imageWidth, + context.drawTexture(RenderLayer::getGuiTextured, sprite, (x + (width - imageWidth) / 2), + (y + (height - imageHeight) / 2), 0, 0, imageWidth, imageHeight, imageWidth, imageHeight, hovering ? hoverColor : ColorHelper.getWhite(alpha)); } diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/cosmetics.png b/src/main/resources/assets/saturnclient/textures/gui/components/cosmetics.png index f6f213db39e75ab4a446b6dc0a8f292d2a2467dc..725110f34498f2ad3dfd2fd4e1f698a27f847c1f 100644 GIT binary patch literal 3563 zcmeHJ_ct2~8;*!nrNo{^YqkwSUDSxZsl92Ws8rM{Vwc#ITBXBksTmdfDnis~jjL7E zzEY!VhpSDr$miaF;5*+B-*5Ll=Xsy=yzej1dCvR8n`UKU#L6Pb0ssJ5O^o$z&Y1Ey zm>JLd`G*28&WIt{#z>c8c1R}n?^&R+b1(n^;rbg4fagX0000nUWo~D1wxs`C|0eMN zPoO_$JmT!y#zJf?Yys?M52}Y(zn_R<-_p$+FV}eecmjRHUu-Q5D)l>MIQ|9xa`^h& zCDfeKJIlblg77{EdF63p3EE#~Mb}<~`Dd%M4H>dlnCNli#k}D4{__n1Ed1q2WfirG$aOZWi>{&M~+H@W2tLVyDR(A^!OzNwPXoh8r4Hx2>zg|@}BsC+p9RvF9J2ahP(CT z9QKyTOz3|Vq2w0^Zz_3b>z6QoN8+z`rZU`o6`2Z2hy+7^xX)Yw{CpHiG9u>I%~qPF zPPQ!hfZPxiRaN=>j)cegcCl*6RqM|!A55jNaamdtS0>kFBSlozNio1@(DlMoy)g+i zQ~P~)zS~23JoGZ}`})yj%>c8A!nBc%9tF|%fX7&a)1?*-7yWa*NA~z{V*}v&>a2D> z^uc1<1vjK1mcCQn1onp{UWhJw6O%N#(UYj*GQcFa!RuL-Fo{*-YmX}GQxP^sWGR;c zsTtG|QTbBd8WM52xJZ(2rkd5}0bDop+?~Q84Y9Me~ zb4MF4+fqlLY;jAcVO>ZVcrt#Iy7*1jrY4nC+?xgC5~G+9Y8tst0W8TY?aK$n{Y!k0MxQ?@=Hwy|Kh{>tfoz8^1%{~j)T(2gHBdtAuDz7vo z4<@_$m|W$1!g3rG2pMMm#Y51|NhKwW<1M}EMaH8RT{-ZY#=KaQIx8_LO7&6#O69Z~ zT>g}Ve(5ksL8mFP^n>bkRqQQLqRGLMGYC~K~xd97bTVa`M1Xg}Sz>}u zCD{;c214M1ltZ1Z4KH$qHS*R_~LsjkLz0r(NDeTqq4GtV4NG)4^S@wq2Xz zn}5Qy3XF`#7ho)bAc7!m>WYbW&H@Z5Ka00ZTlBRqULf|9o`vXeESNFh8^YUF>>|Zb zQDtWhIk>0;F{ zTx&HEmQ+W!zm4`}ru2_DrAtv!P($Zd_pivKt$G!I6~e0K z>LgJBK}q5LlRa{ENW6y|88e*QKArB{T6jqMvIJ{bwy%}gt#B7LfMisiw&lwbY$O8- z`O|lm@8SqE{+eYwLjpTIo5;Bcsv5b~Ec2b~_oAH*6=5Zh-qXM`)IBi#cHZs5VNWInl z0%?hpL|R8=W;Jg2-sAhEqYE1sp3)6pyG#21F+}J)QjdHxrwSlNxT;mVKTa?mX2Q^-KEXb@XuK>+w*)0@yy|B zE?3aXH#|6eSidD`v9?OFQyft1?(IrGrf!RW87Q^+%Uwy08y{1p9Hn{W-avzn7hzK~ zt#3={brNHQde=oBJG!;3w1k=aj2Z7f__yqArT>O>Cx0WQ%ddam318*kOmuq zxukHsEJpXGCWOYsO``-Z-ND?O7)?C$8(bnde_fb6k<=;Y;OSZ=HIgcGSo}Cj4#aes z@{C-l8tgt4$h2s+_{ebYULi1^o%ZsfcHo~oX*SCk>P7Z0YVajyoT%ZCf=;zTTCmxi zBE%ppniq7L65sjdc8`hz*3b>1#%S=XcNeq3(Q_Uu&`y^PsYk!woSi^L?`K{~$MN|Z z##=7hhW(gYe>d{53=(^P1FxnSL)PFPAW72^uQQq^zKD<&6X&KYs?k3YQfqxZOg?c> zmdwou9*JCp_H`(Tgu%%b9tQK$U)tHiH(XqK265=0}z^>TWAf=k?H)2v*Uibo;GjyQIg=rRk2L_{toIM71^3kFN8`+}R3G2j74dgNkGE z^0$zouh6UrXLaw^yDh$*ceA@gl4;Lho{X7fv$}F2UDDMsII%j0hKTQ<=lIy_RGGm+ zcPjfBji&0_yO#P!`lFnFZtLv7XY7=NZg*%jY#os5NB&n4xx_#hRX0t5mgJRGoqfpw N69WtVdR{1YQ6rqkP4pmT$zt`sATGHAiy)Nws zKknt;UB0~V@<*hv4#;bj41yrbf3OBGa1GC%=lxiD-9G|TFbaF*-(s6_qCtiOn6#!} z;Q`)Z2*x01arPUL2pw(=MJKe&%e}~Zw!3qqB zTb1-SE_cC5^`vH-QhP{U>KqC_t$9PR3xT-N1s+BCu685AmDFBMMqiRnpW%20+h)>k z{ZqIM<1I<2BAmd!R%9ll-XOy)C=-_?q1ZnWHJ@o%q@RznIFc`2RNu_G*{>v1(|xV} mLG=G3EAdsKtM8?!^an7N5?#=y+}Qj800003noZ1oG#wY})Bwelh;jkoMwP1ohNSh`)U6Fb%V?#lBseI%Onn zX3)dhnprMF2jxc+b*2Gv z&y2bO>LCR$Oz{Ei!yEW6{((|EgfxQ3a*ufu!Sr5|{DM|9fTED9BM1)U>Mzpi)x88= z(tfhduohBvNg`P6D}(SZNjL0RiZ3OCIX#02ZsFJ6gA}f5OZp5{_TJOQF(iWX z?R4v)!v+FvxpJBhr9=#37}qgKdN`jKEMnFOX0#2R(WvckkX1sXsOifECxiQZ(>|S^ zCOo^MP3h*$-mu?4!lOK=O;S1Sm$`-^a@yNP_ZzQ2;F-51^Or;P>;o2uDrL9H-2cGQ zV}2`3X$3R?LkZqh%Ff&enLRy{&9Q{=>;l>&~t_Y*)IVj#Fah)W4?YdoIKs z3fpBi?ZC86{O=FDRWE&-zz};Q@cs4md*d6b`Q~hUJs~%xFJ#-y?Y>PyEjbtNR^+k3;6|nsB1ezu?Y`_yhH- zw@=Jt(0uqi_`zN-Cdc%9$ z=*q0$W|9t}n_9oDW?Z9XP|m#baf*BPy5e^io=E)r-L7$ixo6Lpl_^2jOVi~(?hcCO zxgXB3c<;k^pBs|x7XIVyIIFkV`G(&5AFh+wFWpG}!fF39HKcX@_JyogL6#>QzoZq{ z`9>Z6vPrLTJ=+Q`b5Enw;f8zHFn8>WNK-W1;#&MtsE1|4`B{pd{ew>gTe~DWM4f8TJcK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/mod.png b/src/main/resources/assets/saturnclient/textures/gui/components/mod.png index 3eb5c44d2d183f199fb2846b086ceb5c056018fe..7202acf511e03bada3856ff9d47147fd9a5d8b23 100644 GIT binary patch delta 794 zcmaFG_Lyx#Sp5%A7srqa#)YOs=yeKhTou20ZxAA7eE;DZi<4bvD^l1(iPHZjeDPZckcl~4iYn&V> zdw4kfPc(dJflz9HMO6JKH0`i)<@^x<6$4WFn-ovKZrS|msTE`5%!!N-IVA<=O#oB( zrZ}6e-gcdn<20&4%VakFdbp=vNMPE8w>dx(;V_%*6l<~HiU#$Hw{NN`=zyFR%y;wG z2{VB+&rJe-FW>pve^mQ6Cr9=r{uiu|J~hNWaMo0e{;tpFFUBOX^ve9t4}(;DtLCde84l=?t>+{SAU5JOEhkJVmhN!v^!Zne(Ura_!vpiyUPrk<6kX+IG zSha7th1~3Ak@8j>Z*Dhc%Mp`*cgQS(L3Ky}kXq>j`OU=3R z=5Twc1`S$~(zoE=?{Z5VuXe3$G}dn)$Z?^cSs z&hFN_2BjrxrMa(i%kF6&Q!j6xIirK|=*y&O=g-Xh&Aj zi@!a~Y|vZt(*DEsT^(PaFlrPq6s7%7BqTYp zh4`Onc*Q9hV5=zozIa=1FOQl+%Hzm4?VVsT=2hw-T|6u1P3SeRKfUcbNGFmYh0GIK29);q2}ex`SWbg zer5wsMQL^Zn`#V`1z;M04!mh0_Pc%|gOiz`+@|YLy*DjhGv7WSSj+Wi^Rmo$zoTC- zeaql;h_|XyYp0|BhlL!H0eeL@mHtmDs5Wj;IvO@N)jz)6No+2A!>6Z;)t-vKr@s9m z#&D{9Vy^vC&0CqfU)wNDkZV+J3U0Pwyy? zhNt+()N3ox&gR#6+;=o#*S4(ME=~~z-AdlHq?3;>oV@-vn!oVO?YsTfjQ>`@oBOC{ z!@W6ZI1u| diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/mod_bg.png b/src/main/resources/assets/saturnclient/textures/gui/components/mod_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb0eeedb051426f64772ded290ac787b5ab50cd GIT binary patch literal 714 zcmeAS@N?(olHy`uVBq!ia0y~yU^D`<-8tBRWJ}y>W+25`;1OBOz`!jG!i)^F=12eq z8Hw_^z3F_)i{w@%t9cXM?aEnHt4zy7d+ zOy1uQzJjk9t6xm_t?m{-kiTNV-Y*N@{x5%gb;8$%t53dOVd42rA>t;6diLL7= z>;-bxKQ`d`+H)p^P36}2Hrc-8`rCLF&aeA-M)9@l>Q0dGP5rl3)G!|CO|m$$r}ew?i!UMp$$Y4P^; z@7@_kZ{I$nwvzvV{>=HEv3^PJ;mTK&!=lf3-E?ODA^r92lg~emH+q}OPRLW%5B{7Ec*7bRHxM|LN6S9`gz;D1OC3JS7iVreAAy-FVy}s@VM1By(uyL Q3QT$op00i_>zopr02Z4&rT_o{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/armor.png b/src/main/resources/assets/saturnclient/textures/gui/mod/armor.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1c75e62fe47fff5b6b3f0bbe587370da0762b8 GIT binary patch literal 675 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz{Kn6;usRa z`F8qw?c6|#w(kcYh#4)r!>P=sVR+=slWTJ&6OvLCf|FF3)w=c{Ff|E!<<@yoSM3jH zmx_w2eOur2%Tc?pX06?O?bdTK=J>sD^Xp&N&fj`#?q+NC({?+xQopYcTfI2tcu3vu zpp|c?r>Z``Q6qQLbUu$4?}lXgU)k?-?wpQ_*D`;>Zq>7`r?Ba`q}3y^1WY- z_cC0+=#j@|^2k-%W7DAvUnM%yW|kH0<(s9EGG}M+ zxUO^dT;Mw9IV-R7-Meo!gFQ(4=!*c$v*!%gG0Qwz9ch;LB{h0-;-z=CR`ED zDz-ixylHLM!KckP1^gZ!*rUK1Y8|N9-ub7mtsu4};*T=Zakq-g?@QKCxNGuBJum#= zlmhWxrV8#~?y^qoSDk8YQdDll{dCT27WNBE87G%XZoR>n=9|Gev-IfM1#f+Kv0v!> z=A-pjd(!>RzbnMoD*ik$OLc!+y;^Qq3Y%H;lft%Fa))ySSAUUuAfLfES9!Od#EI?8 z4O5$={>}N9wD`V9T-xqGmb!mSeJwxKf8WPkqP=6b6gA}f5OZp5{R^jR57!twx zcABjpvm;OIW)G2&4(=t(9Wpa_Fos&`HJ&hCQN*U9RLHEd&Vko8sE}d7!Ud6biwlz? zB~4~`hKppM+?cNRt@`oJpOU?7CqowG-j4oaV=Qx<_XD@qr(VCLi!o&k;!QbEc=yW- zF;o^j74$#USg*Nhqtl}^qB-`yLg!^KEY7^WO6Pm?j*~?j3hVcZ?w|f*`8RXl;@0~0 zZw*fOEPoNfuz^2{k#)=CTjFWk1v{8NdkeHqK5H!?p|v5H^@i%^Exz+N#fP6g5P#dC zv0jBKm)FnC%>6(kcW0!T=h*{hOnV!-3;h$s3zCk#Fv{E>J!Qey*am(1IqND5Z+1@H z?Yi`Kb(4no0^=Qe_Lc9ZFm9XEqO4%qmA>vlR_E6Dokl_|w%l10PB@qUy>(93Mct~I zq1xlz%4fM(Hj1@f-;#f!JS5K3w8-ZJYt@uVdp@1ATI(4hbJ|61#hTrx7Fq20*01o& u@`C-23G7$rG5