From 53cc386b86b0b920ab328e1ec3577d3747cc8ba4 Mon Sep 17 00:00:00 2001 From: PepperCode1 <44146161+PepperCode1@users.noreply.github.com> Date: Fri, 7 Oct 2022 18:48:49 -0700 Subject: [PATCH] Layered with mixins - Render netherite diving gear with both layers properly - Mixin to HumanoidArmorLayer to render both layers for all slots --- .../java/com/simibubi/create/AllItems.java | 12 +-- .../curiosities/armor/BacktankItem.java | 17 +++- .../curiosities/armor/DivingBootsItem.java | 15 +++ .../curiosities/armor/DivingHelmetItem.java | 14 +++ .../item/MultiLayeredArmorItem.java | 20 ++++ .../mixin/HumanoidArmorLayerMixin.java | 87 ++++++++++++++++++ .../models/armor/netherite_diving_layer_1.png | Bin 10002 -> 8897 bytes .../netherite_diving_layer_1_overlay.png | Bin 8724 -> 0 bytes ...ginal.png => netherite_diving_layer_2.png} | Bin src/main/resources/create.mixins.json | 1 + 10 files changed, 158 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/item/MultiLayeredArmorItem.java create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/HumanoidArmorLayerMixin.java delete mode 100644 src/main/resources/assets/create/textures/models/armor/netherite_diving_layer_1_overlay.png rename src/main/resources/assets/create/textures/models/armor/{netherite_diving_layer_1_original.png => netherite_diving_layer_2.png} (100%) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 347e969b2..3eca8725f 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -252,32 +252,32 @@ public class AllItems { .model((c, p) -> p.withExistingParent(c.getName(), p.mcLoc("item/barrier"))) .register(); - public static final ItemEntry + public static final ItemEntry COPPER_BACKTANK = REGISTRATE.item("copper_backtank", p -> new BacktankItem(AllArmorMaterials.COPPER, p, Create.asResource("copper_diving"), COPPER_BACKTANK_PLACEABLE)) .model(AssetLookup.customGenericItemModel("_", "item")) .tag(AllItemTags.PRESSURIZED_AIR_SOURCES.tag) .register(), - NETHERITE_BACKTANK = REGISTRATE.item("netherite_backtank", p -> new BacktankItem(ArmorMaterials.NETHERITE, p, Create.asResource("netherite_diving"), NETHERITE_BACKTANK_PLACEABLE)) + NETHERITE_BACKTANK = REGISTRATE.item("netherite_backtank", p -> new BacktankItem.MultiLayered(ArmorMaterials.NETHERITE, p, Create.asResource("netherite_diving"), NETHERITE_BACKTANK_PLACEABLE)) .model(AssetLookup.customGenericItemModel("_", "item")) .tag(AllItemTags.PRESSURIZED_AIR_SOURCES.tag) .register(); - public static final ItemEntry + public static final ItemEntry COPPER_DIVING_HELMET = REGISTRATE.item("copper_diving_helmet", p -> new DivingHelmetItem(AllArmorMaterials.COPPER, p, Create.asResource("copper_diving"))) .register(), - NETHERITE_DIVING_HELMET = REGISTRATE.item("netherite_diving_helmet", p -> new DivingHelmetItem(ArmorMaterials.NETHERITE, p, Create.asResource("netherite_diving"))) + NETHERITE_DIVING_HELMET = REGISTRATE.item("netherite_diving_helmet", p -> new DivingHelmetItem.MultiLayered(ArmorMaterials.NETHERITE, p, Create.asResource("netherite_diving"))) .register(); - public static final ItemEntry + public static final ItemEntry COPPER_DIVING_BOOTS = REGISTRATE.item("copper_diving_boots", p -> new DivingBootsItem(AllArmorMaterials.COPPER, p, Create.asResource("copper_diving"))) .register(), - NETHERITE_DIVING_BOOTS = REGISTRATE.item("netherite_diving_boots", p -> new DivingBootsItem(ArmorMaterials.NETHERITE, p, Create.asResource("netherite_diving"))) + NETHERITE_DIVING_BOOTS = REGISTRATE.item("netherite_diving_boots", p -> new DivingBootsItem.MultiLayered(ArmorMaterials.NETHERITE, p, Create.asResource("netherite_diving"))) .register(); public static final ItemEntry SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/BacktankItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/BacktankItem.java index ce63ccc04..d5b0c0828 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/BacktankItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/BacktankItem.java @@ -1,10 +1,12 @@ package com.simibubi.create.content.curiosities.armor; +import java.util.Locale; import java.util.function.Supplier; import org.jetbrains.annotations.Nullable; import com.simibubi.create.content.curiosities.armor.CapacityEnchantment.ICapacityEnchantable; +import com.simibubi.create.foundation.item.MultiLayeredArmorItem; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -27,9 +29,9 @@ public class BacktankItem extends BaseArmorItem implements ICapacityEnchantable private final Supplier blockItem; - public BacktankItem(ArmorMaterial material, Properties properties, ResourceLocation textureLoc, Supplier copperBacktankPlaceable) { + public BacktankItem(ArmorMaterial material, Properties properties, ResourceLocation textureLoc, Supplier placeable) { super(material, SLOT, properties, textureLoc); - this.blockItem = copperBacktankPlaceable; + this.blockItem = placeable; } @Nullable @@ -108,4 +110,15 @@ public class BacktankItem extends BaseArmorItem implements ICapacityEnchantable return this.getOrCreateDescriptionId(); } } + + public static class MultiLayered extends BacktankItem implements MultiLayeredArmorItem { + public MultiLayered(ArmorMaterial material, Properties properties, ResourceLocation textureLoc, Supplier placeable) { + super(material, properties, textureLoc, placeable); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + return String.format(Locale.ROOT, "%s:textures/models/armor/%s_layer_%s.png", textureLoc.getNamespace(), textureLoc.getPath(), layer); + } + } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java index 9b0abbed3..dfffc1bd5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java @@ -1,5 +1,8 @@ package com.simibubi.create.content.curiosities.armor; +import java.util.Locale; + +import com.simibubi.create.foundation.item.MultiLayeredArmorItem; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.resources.ResourceLocation; @@ -9,6 +12,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -72,4 +76,15 @@ public class DivingBootsItem extends BaseArmorItem { } return true; } + + public static class MultiLayered extends DivingBootsItem implements MultiLayeredArmorItem { + public MultiLayered(ArmorMaterial material, Properties properties, ResourceLocation textureLoc) { + super(material, properties, textureLoc); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + return String.format(Locale.ROOT, "%s:textures/models/armor/%s_layer_%s.png", textureLoc.getNamespace(), textureLoc.getPath(), layer); + } + } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java index 5bfd951d0..a525dc198 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java @@ -1,6 +1,9 @@ package com.simibubi.create.content.curiosities.armor; +import java.util.Locale; + import com.simibubi.create.foundation.advancement.AllAdvancements; +import com.simibubi.create.foundation.item.MultiLayeredArmorItem; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -82,4 +85,15 @@ public class DivingHelmetItem extends BaseArmorItem { entity.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 30, 0, true, false, true)); BacktankUtil.consumeAir(entity, backtank, 1); } + + public static class MultiLayered extends DivingHelmetItem implements MultiLayeredArmorItem { + public MultiLayered(ArmorMaterial material, Properties properties, ResourceLocation textureLoc) { + super(material, properties, textureLoc); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + return String.format(Locale.ROOT, "%s:textures/models/armor/%s_layer_%s.png", textureLoc.getNamespace(), textureLoc.getPath(), layer); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/item/MultiLayeredArmorItem.java b/src/main/java/com/simibubi/create/foundation/item/MultiLayeredArmorItem.java new file mode 100644 index 000000000..025faf134 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/item/MultiLayeredArmorItem.java @@ -0,0 +1,20 @@ +package com.simibubi.create.foundation.item; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.DyeableLeatherItem; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.extensions.IForgeItem; + +/** + * This interface is meant to be implemented on {@link ArmorItem}s, which will allow them to be rendered on both the inner model and outer model. + * + *

Classes implementing this interface must not also implement {@link DyeableLeatherItem}. + * + *

Classes that implement this interface and override {@link IForgeItem#getArmorTexture(ItemStack, Entity, EquipmentSlot, String) getArmorTexture} + * must note that the {@code String} argument will be used for layer context instead of the type. + * This string will always be {@code "1"} when querying the location for the outer model or {@code "2"} when querying the location for the inner model. + */ +public interface MultiLayeredArmorItem { +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/HumanoidArmorLayerMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/HumanoidArmorLayerMixin.java new file mode 100644 index 000000000..4aa5abd0f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/HumanoidArmorLayerMixin.java @@ -0,0 +1,87 @@ +package com.simibubi.create.foundation.mixin; + +import javax.annotation.Nullable; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.item.MultiLayeredArmorItem; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; + +@Mixin(HumanoidArmorLayer.class) +public class HumanoidArmorLayerMixin { + @Shadow + @Final + private HumanoidModel innerModel; + @Shadow + @Final + private HumanoidModel outerModel; + + @Unique + private boolean intercepted; + @Unique + private Boolean useInnerTexture; + + @Shadow + private void renderArmorPiece(PoseStack poseStack, MultiBufferSource buffer, LivingEntity livingEntity, EquipmentSlot slot, int packedLight, HumanoidModel model) { + } + + @Shadow + private boolean usesInnerModel(EquipmentSlot slot) { + return false; + } + + @Inject(method = "renderArmorPiece", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/HumanoidArmorLayer;getParentModel()Lnet/minecraft/client/model/EntityModel;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) + private void onRenderArmorPiece(PoseStack poseStack, MultiBufferSource buffer, LivingEntity livingEntity, EquipmentSlot slot, int packedLight, HumanoidModel model, CallbackInfo ci, ItemStack stack, ArmorItem armorItem) { + if (intercepted) { + return; + } + + if (armorItem instanceof MultiLayeredArmorItem) { + intercepted = true; + + useInnerTexture = true; + renderArmorPiece(poseStack, buffer, livingEntity, slot, packedLight, innerModel); + useInnerTexture = false; + renderArmorPiece(poseStack, buffer, livingEntity, slot, packedLight, outerModel); + + useInnerTexture = null; + intercepted = false; + ci.cancel(); + } + } + + @Inject(method = "usesInnerModel", at = @At("HEAD"), cancellable = true) + private void onUsesInnerModel(EquipmentSlot slot, CallbackInfoReturnable cir) { + if (useInnerTexture != null) { + cir.setReturnValue(useInnerTexture); + } + } + + @ModifyVariable(method = "getArmorResource", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/ForgeHooksClient;getArmorTexture(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/item/ItemStack;Ljava/lang/String;Lnet/minecraft/world/entity/EquipmentSlot;Ljava/lang/String;)Ljava/lang/String;", shift = Shift.BEFORE), ordinal = 0) + private String modifyType(@Nullable String type, Entity entity, ItemStack stack, EquipmentSlot slot, @Nullable String typeArg) { + if (stack.getItem() instanceof MultiLayeredArmorItem) { + return usesInnerModel(slot) ? "2" : "1"; + } + + return type; + } +} diff --git a/src/main/resources/assets/create/textures/models/armor/netherite_diving_layer_1.png b/src/main/resources/assets/create/textures/models/armor/netherite_diving_layer_1.png index f4ecc6756d04e783520ab2b6b9c57009b6e9d4c6..850bcece6907b2683a87766c70d5e92cdcc93b95 100644 GIT binary patch delta 5424 zcmV-070>FDPQgWxBLWSaktHC1mgBk&g#U9DS%UZ`m&4~d*+G_{uSmHwJu~;7Ok#Ii zwnUL2P$(2+*1!I_%|Ceg?28F8msC@Fc!e6OYkVoseYNvxpKw0UE4-KZ{q4MQp9_vt zo}<4%OM1tD&fBjE?xFE5{xDG)?}h&TLVcHZ<)?|>g}f}174w~_z7u(WcQ4p?f_As{ zq+0TiTj=W^=VvG7{u_PxeCGa|785N`iD>N-8I1L-x=R@flqE{p!J3C z&c}1!y_VpR-}&k5Rk3KVHx$1P`WBV1Z$Cxr6JYamw1Rtw_@A7dzK*{=Z*2U1RF3O^ z#7}v@xu4FD>v!|~);tduA6cBwU@|O?|d_zA>&dm6k3B)6$dqk4%xzyYeoe zdJwhwjHmM+wpvG2wheaLX187EIPAd0;FfX3$~iZjKPL;Zt8RG3FX(Nz%f9+aG@TzO z?7_P)TkKi3KEs^V3M)^`P-mIU3KxI+Hh+4<-bw{)<;!w?gri;z|C}MM-~FqFx~m!IuWojx`~l4c%O((aax*NvOPmxbeuMvhs=mX^hr!dgc`vLA%dSA z3K(k9#}H#oF~<^rYi!AyJ_nOyPC4h2Yi`AtP-00Xmr`nJ)m0B^#+qub zrPkUSYc^(X+}#+^T6f*|(4*<8=U#g4Z2+GUMjUD6QAQnYy6GqUG1JVm%sSh$3n;Cy z;z}#8vg&FZsBLd{*m0+wciDBfuc*CY{pI}!QL}H<+=-Nb2IjA*aW?1A6jpQ+6*B_n zOt3^eD+B=ADP~WxAvi@&F?*^bE26{5sF+Qwh!MfCtc%-zVrSfqs3P}&#m(gKEpG0A zjhs>F{xEXC#_e}en<_)&MC@jvocegOkL#;6SDK35FGurN7yk74#}jP=NIdrT7W)BA zf--t^rjMR~;Fb0nGqNs|@?1{)3=OM1Uc>%w74!GYs>U}>Y0s3={chc}s*!OTwEw$> z@3E~#WHQ9P$JleNF-f*R&$^^XOOdr>_~nu#%jqFfzVh|E#zvMSJfoXwW6trxq&4h{>^kSQ2cwW?z@+0CcJPq5 zLio!ipOL4>oZJC*H zX(bvyx188iY>Ua3^?16KlQ1jreT~%pa^ggP*a>XKyGOjYV=E@Pv~bbPxB_1CI~8Wd zdp#$RQ3y6pV04jxk6+sT%)5E!#2xjf2+RdVV)`t(5iaPK1G`IvdFR?sT#IL3yGvzx zNBNy=_=Q&jtTwpU-0Z;QmV3-~&zyUjXQsN=nTbVZ+gWaxvH?)<%cUeQVa)`p%M^fr zv}@&qiNowbcI@O=rvO2~6htNhS2pbeJn$qLiPKI2sr^C%YBv7$*Ym{I!^g`&NPa$E z#@Qp4@Kh+98n!Db9|eqr(oo=^J9 z0I6pubHUA;37~h) z6b}(G)0D5ASK`4Gc={~_qyXT5X~v&q;zOZ5`P4n2X{caFKIKBTG|EQo3#8)5&d#cZ z@q=W9m#ajs;OKY@S3yIp@gE;cHrNxPF1hS-@?iw8WU^xZ83(l{99KWp9Ku%C1q@sr zu{HXLfYeWZ7Z@_97eOpc*JDR*B8$Kz@GAT^R4C0VzGquc0?4wOV2S~M&rqH|9|$8rZ9p`8f|hzB1V@o8*f3$Zm6re*I+HVP?GOSCVv zGZ790&60O3i3Lf6N_WzK)pW=qaUUy9psXz4u8sA#b(bUA=NF#a@-Mep5`eEZV-Qk+ zx?z-d(V=Fr2I+C!+0`#q2$94iSW^Z@?5)XmnKc9lw`Lm^y6m9KT0 zsTMUsZ~O8+&WWXeB!nZIFdfdq2y{f>GFB4g_yE3mz(1AM4b|M44{_MHbTtH|m25%0 zMJkzzoekfOsKAhgNf3E1Y3v3N@DD=Z`-Y&u?vIEKv*6%lmcoIWXmQOjQiMw=$|q7% zO4vv9)PYrBV!qr3HHrYWy$xtIqB7v+#|SAM0*y`VNWwdRmdwy<$0Pnq@mM;i*yRdY%+{3w z0P7(`lnUA&xM`9oA?1g<_AXFf#)7$GZ=D8Z&YPfpC_nv8Q0luR#QsA6ysU1DQbf5P zAz&)8+UZOKje?V!xdBr$oq*?~_@aW-B?=f8A3Iuqwnp~_klheOy$jo@#~~*rmG(j4 zsLqrRRTcHW;_g$p=zv+>BXJ9UGl?dd79*=Hp|6-`9NECAdFvcoSf}Q@D=1Kc^W5L} zgHE0pPRTLwFI^lm>hLkV^U(U7RDhaEtXC3KUCOl6Nd%IET!sM$zTGd?85P!T=fP~G zjqK!q$uXb0NlVb-HXK@{7DxzXX_C_p;oIisBr!o8oPC?4bF;983DJVb(L{JY&H$C2 z*bI4C{>$lV>eDrmZ=J=L;VR*PcG=tm%Bu2~iz+^>3?6|YWRPDn0Gf;5QZi~;80K@y zh$z^)cPk=~vSh=8;~~SjEz~s;lLzBu5Hq8HMxaChU&Z1lWr+1A{Bo>hKMC(>Lw1EL zoYoLuh<{-Y7!3N|3JFaU353o;tD^}ht~D#$qj8z(^TRE1B}4$WN!+ocnU04&0r@Q@?qm?SQKCpPvk&LbZUg5S3~NvKeN z$xl?@k~Ym(yyFxPv;zUWy#S|gCs2Rv1XgH9k9=<9Nby1XA-KhP?yt_%uy)txNpLG? zz6#ygbtO8sekA(IVoNYlkkyNzZ=2&N59<2QD1S%6H|Q6r(TE^O)pgt0eCmQO{Pz6m zJ6p<+PC9Qsc$R0#b*M>!O-DHMx=hbbACP%Wn!m4$eL?7|S zOmRK5j)Ve}NNiu0Ch86ndGaeCT2Ppm9wVq%@CP22?x^}BM9y^LE|nXwA7~J_ivQvE zSQF|nf0+HDToGeQleEtCrh`LmYwI@%L-6uu55t!rdg!))tRvWE z;5{$#&J~?M1V$3DefsX|;Rq5!bfs>Pm?C=ztm>r*mEDL4HBe%n5qc}~FhUy1p~O9c z!Cq7%#o|E5!X&zcI|6j1{9B?#gXW+sowNqiN;@%7Rh%w?WTfq&ZYg?U=y^jX_^ayX z2tmTI_Jl1lvB5&AW891ow%Y-JdG&Y9j3dCJ6yLE<&$lEm66hx9Y}S(?$_rhx3l*Vd zwZrIhNw6DSD>JAndZMAe3eMQXB2raGrBcr>XX)wgscNmJg{N#bZLXlmoM&Az;k$Z+ zM`s1qt=qLrX`nvQbQ(3wH*C-}wSXE45JPw$gB|q-At6eK>RN-vbW6S;w@^#|f=K9T z^~~dwKV_8v_GzmcDf4fS_z;$x5x8ZOs}CH1P!xqvQ^is$4((9HAwzYtAS&W0RV;#q z(pG5I!Q`cX(4-+rad8w}3l9D)RvlcNb#-tR1i>E=M<*vm7b)?+q|hS93y=44-aUu+ z?gNBYjj3ke1fXh`kx3@Rd|_1_ctsEa_z*={Vy2$TF6Q7_U-#5WbrF%=a_C-#2dsjo0iUbpE$xQl0tk=JZ{hhi66NxyZpwv?6ANyBStPWPaGi@%RMaj zFsm3U@icKvQ8mgJ@-8c!w>Yb{2J76Dzc5tPRQEs$e(*nk_&r;*G&Siag%Uvji*0|50t351yJ_3s$F|)* z0sPOvmDcswTfpom>CLVdI|7Ebfs5;|Chq~4J3#bFmkh~~{IrBp33xxFZz=%cTOhdR z&aHEf(+40&vs%6Z4i15_GG(uOygSf4w|{#&^ZNlRIC6^A+2RHO01j1YR9JMgL=i&* zBw{mVG+{VmGc7hTH8d?WF=RL`IA%9wEoEV3WH~oCW;Zc4Ws|EDA0%TlH8*5rF=Z`b zFk@ydG%__}Ejc-4Vl8GgH8o^nIb~upVP=!=6DK4xFgQ3cHaIdZHextAEi^D=W-Vee zHZv_TG-fhlHfAt0IAddzITT+EF*!0bF)}hYG%z(alcW@J3O7_SI65*lIx#Yn9~C4D zH&ih=Ix;mnF*1`)6^bNfIAb(nF*r9ZHa0RiEi^GTHZ3_bHeoF?F=An5GBP)1GB!7p z`xR9LG&LeGlXVqiBQaxSV`F7DEjDH`Vl6adFgPtaGc#f>WH2@|GB7Y=GcqwXllv7- z3O7_SI65*lIx#Y{F&AhE1hc5kos*p(GJgmG84M7)?R5YE1hh#+K~!ko?O4xm+hiDi zQld6a>R55C(hxP7%JQQ^9iHA9K7$_=hRKIwFL$8T=$($|j|`oC{(PY$Ra?)B6+h=2k54<5FWnVGjlDU4B3KyE4Ld65TY7qeDFQK86H ztZuG(`o#fW)_6bXg{iBj8c6ONii+=6Zaa)@C@M@{g`e{xGc#}Xixa2=L@5kYSK$i? z7!`#R6W8zkfW&KY0KoR2g%jgsjen`D5T$V6q<}ZOn6(~mZ32M9__wF0EioiwY&?b= zH*ez0FFr@pXwik=EPrp^zI6)+l_Hdy;&1|4pPrfl031|`7#ok_pi%??dOtQEd*M{O zP!8xMgns&Q1zSHq002zAJB|0=zmCs7{lxR1B0)FIrczejJVMYng1UKxKYt3l9oJlr zU$R0$9<{pW=qG*M*7riT08o6igIIF%%n{U82fQ*o?6~#b%Mfz$BU@v-CjZ$p}h0RR-adOi;L`1%dUsm|0@+*x0xd9{(xpPFL} za~X?N4^vmsG+NLM8Hf87ynh~#V>l25037Re9PU>T^o?L)E@P4Tq@+eeQ4j$}G=(Bp zQL2?Ncl8<~QUu$N9=euiH;y3u0H7;J3@LIIrf!QEMXsW0w5Va7urQagnnsJ3PG3NP zpYwv}BmltULIIU0yQnhNa1(#;XAm7#10d|Pz zUn+k#@_A2YMzVnC-hcLUUibn6d;w6Veok7%Nvb2|q=^_Bii$F`i=(0dd9R4}^dxCk zH;-IXVpJ4R-#!AA3V24iU04-389@@7MwLdB%~%zh8gBCeAdyTnOcy~}E~9C*5KB%v zBExo2xFa9TUA;z~h|RULE5UADKuB$0sn8T?FIDV#d?MvY8Gk?Lg)|X!7%J}->27c2 z^PbsM%5uB93Aaw;9V38MeLN@8UF`Ir{kBkJiLM>|GlNJ8(+rt9t33s52ddDF3zov< z7|b4Y$Z4*ymj};DXdicL?>`H3QqCr)Ch^l??0000>qr5RgB`>HF1K(b=C={C?BlvhscOOSZle?0(Hw3ZGlzFF`Kf-+w&s zeExG*Zs>pFr+$vY-_Q4d^6Ym-zeHdE&sp`{J+q6R3ZX8aO?_?g9&z7b3Qb)dODm7@ zKQn~gcjH|_^(1TSna|)oee;2=9H0F1-5s5_DpwYtIWJSw+7E(Uby(DZ}(4saE?lU!F$EBzOiCmAt=}^ zLz&Yjw~-NlK0(blz+dlQU&?DFgIQ5li8KN`-XTWze=$M4iH_Wu`F_jA+xiSZh?qLF z7$3<1S@SXb;vWmayeE*A1a+1kVhV!{_?*LHks(E@$U+U8nxB}zw}u=z?Klsak%>%| z8M$e(ldP07__0)f!BEdJr<`-imTPXgmsnECr4%b7#ct7(vuwr8sx|91)>LyX)oQJ+ z_7+-%G;=G>T5YZM&YYc*JHPJS(EA7@jx@3xW!R{rjXr_TOf%0iZPwXlUtz@sf2^`> z)zwztegmbQcHU*%uDk7ifZB=fq?1oMcIs)Te`oEJ*5BTL{~&ArleKU&r5o)#Yn(Ov z8p4ZCvT{bkf=ix^n^FLvgL3v%pHfifl(VM=sv-v#nU%BUl`%4ywh#IEuiUxtW>lH` zukz+B{Vi|d|C>3d)cwQE{hqf!Wo=1@=FQk!g$n8usXngn+C%LUyZ8G*PSD%)Y;dG< zw$oSgJKH#ayX6A!oX6TaWt=v=)-lf7eXbMrv(?TjZO^)L49i;H=TQAUr_;BcIT*Zp zJE_mDU)=lI`piBa4Vz9QN9!!EtxjDqWMzvQ+>OX;{QJi}CQ+GU^%l~J_KsG+kBD=q zU?(Apm;)J`4bbPxX9?;iuf%Z9kdyRTg)SRo64eF2sm1qDHoG8kbcTO2g*hV>GAWt zN63%9vdqM9-`1Oj9h*v~+2xUely9%~92E}l^KTKm*4pJXHL6~`Pxjtw%y%8U>zaHl70k$u|v zG2EgI=5aNQ!^-x`nqTT37=|hMD@-H7@g9?Zc%^hv%wd9$A|@pNn*~u6-BBC5jdg~$ zi%-Faom)J*Tq*3{b58xNw6V|xZnFF{mU5xl_P|O&0n2T{?Y$BemUI}i^>w!AilDM_ z5u|`$0xn}aBQ6-QwlO_8Yj#S$MGJjd8%%gEDo7laIqi&OR9Pi62@>5Im|on>8h1B; zMALRJY0Be}2WVvBXvnQ_(@%~IhOiL}AW#|Tr_Y^&oP#&W4Bv7{{a(lBEg)7sF{2}| zzS@c|q5U%v+E5%N)7Atj>8$z>|XZ^p>Gx}DZ()XmL)nyZbc+UzGr>UNu7 zgPDK=PHgChBGl8~DcC^m9o)xR9B7<>SPbxN8$=7x9k!~&#|?l$)%`gDw)3K!M4>~I ziQu_|^7zJ0E(y4UoC;@FHxVV@ttm})VvzVU5zQE#`akDxhz#2pDiPp%3B|GR-qUPh zAYZlb9>mv%?z|fjV0No_D|%vz#g1<{Ue*?#Yqwp_Is+#|Y%$kK#{x4(TQy6EPzX5E?6~ zs`Smx1it6@%;AgP~B@{Af#4?pO%9dnrO24fHWFq3OO20_7>;`v?m5Wjc$DYg#MO$Kh%t5lkSae4cM})C^ zq;b5EETcKq(9;!~kU7gv?b|BJpvIONq@UJvhrVDsGIA zL*^(_yv?3*QI~$SCE0+!K>3)A9TyDTKA3Om@A86ZY{qKiE|cOK&FG!X)ScOBOI&18>% zN4nk%CVw4vDit(x*C_S-i++tS_kPo*&)28T`WMqpJob>ej@MGY(uC!OJm+T*a6fsQ zr#twgqeaWhM&?Ttn|i=H%6b;nZy@`a$R=B8|H&4*Z^Jf!uv2oOitnbNYU?E+Skb^@ z5(R`#YXg#yzmL_Sz+nN_(S~EmU8|!%UgZ3l>)BBhhG8w1$>+nkx$8+rT_Os~N%4_& zsfz&4tXR0v+HbDa#9$Qr6t_U(m3*!t=b+!>5i@>4Iky|RPLncSX;~A=+kv}}BuCu$ zBKZyR0%VeZTsj?koV%vC#QA`o<2Ji-b&D`$co9Q@YV^2oKB6?77n~hhmK;)utjy~y zqEEHbvyE`ebj&N+opz5FXxz0XnC;LCuU^V}7pkH#(Hy#28{JzMuvLO&wRiU0L=LX+ zN*J+mw*$$y15x`%x7ww$i^1oD`Zr5Yohs=$6jrQ%gx=L*SOAy9t&+dHTG_lQ8Bi80 zrkiGvmWwuO(A^Mo)Hf5XY<~ zza~BhFDN4#13^i+yCap9DMWyix$a!j{sT)8W`e5JacL#d*d1f+E08QRt#=>p=SF79 zx7VnDEL#n;ZP^4X!^7A(n70@BILEiWKt2ugam;~S%sYZcVfVab$HfCoY@MPGSlpzt z^*>zt#hUrIS2*hZ3gkZ(MROv1Bd517gargA9Ze$Is6Xg0Axs*72BZ0^JKiO7E2jyrLubT&R8S*Vtcrg} zo5WlZ4)y6Oj4dCOLH{#SD&ec`Y^YcFTBKu0ta_4{pF{{`q5w7LdAD>%F}ILxRZ{jS_w(d zZWxCNFG$Bim607UG742i*4|pk1zxJStqrl^vH)WYWvK!uef?5kS;cuI&4RNC`+WT< zQ+W8eE>yBvi~s~b+*%OxW&BPuy-N6hC7e!0e$=1J@oXU=G+~BoSr?W$;NEatdN6UO zGyC*8^kJ9DA<)YVeJQ5$$$^gQ`gMM-u!($$w8un5wU8IDDO)-AdmikT4rKX za~eM`CQA-GjFHYzOS%nIL%`vCqyLc|r$16pexE?8ZAP`<}V7QEZ1+wSl`?+U<>Lo?RJ@trMPsx_5gIWUxd5FE1 z*ejPrH>EPetM(;8j>}F_kCxY@7p6$*9?KHt!#w1GfdB>jhotj=pp(Jaz;zWJ9&gDl zYz=Y6d@1~BrJj<2ntEIKftf_bw;pb(Q)O&vUOU(dZA_%Dtz2S53kSxIc6F$q))o*I zEX!&tNvYiv@HO!YFbYkt{Ueij=$JMOaeCbSl`9OA4+@C_i{GAj9p(C_yXdLmbvp{l zv#Oq$%9E?XWJO(nD5Pb4AA&X6kM|kO>tM8HxtDV8Gn*U9`tum1Auv=wEG-g;Z4$lU zR96LxNeKpfUS~|b(J~~{@SliK|WZX5&XONkT$h>A$;4d%s$eiP9#j#QqUc9 z#`4<7_aP$w>*;#3AN14;hP+(Ng>cLGM;`zv(Hi$}37q5wSW0B#Uz5oV9DhI@#a~mk zQd%4=DB_TzI*0{P5l5+F5iFFpLaPoYmwrK$h9t$sQE)9d__0`ZaBoMc*s@=)nMj7?YT($5V@G zbR1vz@bL96!m~P``*Q@9oPWsxk4QYnbi*RvAfDN@bk6(4Ay$+W;&bA0gDyz?$aUG} zH_ioz1)do)(#d(^5V2TjW4Vo4(NKw}iNlJjQNECIS>e3JSuIyt^Pc>Lftax9<%6_Voz|9^wu-J1ESNjE7F z1-f5s`(p&~?E;OOZGRuzcH;!_J_A=;%U`Jjv!A5bT3YxB=-UP^u3MVC2VCv|gHO6- zNRH&CDdh9O`x$*x7U;hP{A+G+&3&9c0BP!K`35*R1V#&#z24#7z3sjId#2gn4|)!A zs@@NC)&KwwRcTaMbhBa)Ljoi*I5c50GiEm}I5A^6Ei^Y{HZ5UgGcYY2x@W;SIlIb=9EEi+~~G&W%~Wn?&HFq2mjUkorgI50RkH8e3eH#d{Q z5^)MPR53O>F*G_fIFmgSBnmcEF*Z6eG&(dmlWP--BsnlMWMMF2H!U?dI5sUbWiU4_ zI5;+DEiq&`Gh{M3WH4hjGLsn;RRS|GlW-JdBw=A?V`4TnWGyvjH)Aa{WH4eaIWaLb zEoL`kWM(yFG-EP1W0M&aPzN?TF*G_fII~X`Xb1!vTPv!QyB#ur1{V%6!Xdqt000Lg zNklCB$a6$33j} zw3q!K_Q)U5rJ$7nf#3p%O6;nX(j1^!6qPuT5~ryXcRcpY#4{7ejrTDAzRWk{#12(~ z!h5mj`!W9BU(fr0yr28fMV>uF>6HdRQ1rLKsSNDe!Z7|Lu1^X!SDoNFqRg76!TJpb=zY@bRw#7pLc1 zw8S}X6A3W}VJHbhuW;V>>Sn|Ml1Lzl{&$t6;nhv{4*EV#(OS9uL`NP`EUeK^DY#S!~KKsI4q=Kj<{fkFH-^J;< z7690;&P_;vB7sWMSX*DlOwxDrg6RSP_k7~`X&8E?&y6SPR0D+wT|;w{<(p-ip!8h(g6!}W(3D=!f`7sjl!gg%Ejrq7LCX&?_D{P zVdgK*x3&!vhF&?6QDX-wAC&vI8+hY#g&X_#pVK{mFi8L1qiTl34q*uJ>L#{~O-}iQ z7-L52q+l?$KDzozUpU>ox`~7s!^P>jRea@b6L(4W>#^Zrr?vQ%{}%0Ib|wi_FtKUfnzrw!{uQyryV}Zl)pL3m-Vh(DRq( zTi@M(zQrmGRphy;sg|m!7|G=D>YH!kAAkD`mpbo%{8{Uhci%;Mvk0SVa7Li}&rD7O z0Lq(1jAU{sZ~A18ejmx?(D&4d@m4nuAc+LFt7BBn006d(O*Zzh9pU$DKXwh(x8M1o z_2m~=ar>)p0RWTFPvM0>yof*j@%4uW(8vpao|~HD4Dz7SfaUEl($nq0Pn{TVDYAsB zWpm?ntQUp5fgJ!83#;r-f;zyqOl(!FM|yu(Dm)O6bDzD4s;E7U{S={`gp#deaw>u^ zkK{t+*COA3bCatmyH@R?Qm|_TJZLny&tF=|@f?QLBm=~Ujex$_UVN3yd9Q9l-!@Qx z)pgjO2T4vsktG!G-t_@dP6CY`D1?9vs|>vX1SvTsG#k|ooS(gbEXiV}@EwQp6a#MDyv8YXe)a;J1JIRF#SFc|H7@{|Vz6u| zvV?vif!x>_s_kb$0vT4}xJ~fAgbBcZuMR(~t+m$zRm+Af3_=nKSL(dF$u3oby#h!U zAFjLyP0{>*f@I;&B3WYlb zC;&2J?dt4YT@7$dPC+IrQc?;vTScR8vB}KXILdk%0FXbK zN6oIGtd}u)a*~C)V>R2J=NlhkX#Xa8AGD~EOfKcf@f@}d6QzI`ht*`{7Alx#mbcT< z!^3J4*2)fGY(hGq=jd1ksB$TPQDBUTDj%Gu9-(WZ5k%m)q3*CvoDNzK0H^Y2xD+Vq zB{*&qx%@<=-QG6Rhlcn0*$ewAaO?Wv2H5i)l=U)3$Ot!4vugl=@cf?Vu(>d(*)AAk zRLSXx_h|D&c|TR2dOD~m9a~yl0M5-|X>kGCL>?Qf1ss!8*j-=7Ks+9QsQ^oh3mAyU z@u1Pb6OByw2&h^%l(x5btr~tP@3aA{iCuSJ(Xw8~p6B=s@9vN27ZTX>96V?=xKIlN z9oIXw! zhA5!sdOp2wdpgWqm3SQeLINpK0G5{zHvk1K3Q#IZ<5d2P|6hPk5S|Y|2lJR79svIH z@l|F>`aRg|)4f3hJ8p#oQ^##G?^8L<`~CrTSP9?lfgr`U+Gt6Cku}&$GtUO*Wp|K& z76v)MbKE9Z0qA?eH$ild?dnK~nMe;$OWoOgC<5vhYOV+65Oz9ngb3i;VcRnI*J7c`}?_`W5d#&}&Z_f3tIoIARi8VFW*~=!t1_FWh z>gj5l1K%fsw-74}@R@ZzG!g{bT@YkxOE*XR3sI36PcM+}@Sdbzb@fWsFIr{KiASVA1Nx)x569`g5ODzmF}roN~*1 zlfsgFcT;DCt9^AYX8x^f`w1mg~MB_EhlcD^%Q@M6^rFo|u zL)5ZEnDnJ;qb43sxh7rsNM2muc>AqT!(V;lS%=TPk_S`k#mXONsbgWm2DIQ=r%~Og z#H8n0V+Kk#vbQhu_IgE;-$H3ly|o{S>?_hj*WBUbllAK-Kh>HzZ+sY@RfIMryRiuz zpW?KRnR1So`&2eQ!EStNlU;7*SUJNx#<7mk4{-jlhx6`t-X3I%&&7S9zk_bPx%oA8 zxNl55a1oL`|1d6ahlubq*yNn9Bxq^9`_?JOjc=iw`%Ac(KklMoPEVxN#;0t?J3PD< z5S}30l};}Cdc2gKl?&s3bV7txsjYo3KFpJKAb9*mv-=aX-SDVg%qmktU5G@19TfYr z^1$4+XUItk`Ia5%A|`g9N06W^?g2}frzgc@GTEZ1ZZg$jA@GW=`J?PB_J$kU=j8?* z4T`G=oOR+M)g$_a#dU+j?=y8;;a{G5k?(zh@25Zc_($_n$X2STyV#O@!?&8wvRDb?Km&UM! z)UaE8?B;`Ip&1Vgs~hirI4V8_V=7Nnim}lEsqbu=BdBD*-h*nHn?7CCaoP^gq|+eG zaz-ztV>rz93sarRow_UE*lIs$_Z*;qXQuXKth3a)_^j{sbQ{1c_Z^Cq+6&1u5#992 zAVwmK@-~--HcO!!-%q@Rfi%A)++aOfcjkSU;JefvP6CTZ3tw7@M&#la_g1<;)n3XN zeP!6WY1fj;roC^+D=(s%)6-$=Cf>}Q57c#343l3(CxD8*qSTSoRW`8>1X7cJj~5%x zw+J=v{HAJ}Xz%;MZ~peIW01DaPLsl})L;Xoip|p&B4rAxGwU08+Qr9UWQndA7e6Sg z3g26dzI+5c`Fz($4emLK3UMXJa=2EhgFl|(JyG!@2b6haeY~`%{+fdsZM3mJPd#fe zzbGuJV#U~Ot*8&rADJPYl}2Ao%F!Zse-wS;<1Qam+DM1OO;Ysjp=Jo8w1jB(Jr+y- zC6zay86ta@_xuuYquE`i6ucB)bw9@}YDg?0e( z;*w*cuq748UO1TC>LDoOw7mx}+ZL(w#$+6PgNm(+#~`Clp}9gl-;~Kewk%7R(I1XD zb5PTU$aG1qQ%Nq#NKjmI_OP*-MbUdH>qaMYE-7`f3!7_P7>i?JoZ!dSeENoxTGqQ? zzzmkpJd(a{syh1Mh;YWycey-h7uwr92E3uQkJqGd%dREo1qq>_83;#%6Pa5MO;<+FzJXO42WQrr-&v(8*sk~WVc1`8IjWfu^-ne!cDpq@S z;D8$PYL9$UVtYn%;2?WBB9_f_M{XqTG3~f_jeb@eHb(aS{!9YP*>Ht2)n|qskq>>^ zio&kl#JX65YaxvdZ}mXZArO*(e-1b_1#jJ2FB~shK;?72kNTRm{Ju zC-m)}@lg4h%lWa9PCV1D@4WL(bz|={K7A_G*g)^MCS;_oY6u*8%q&O#>i+rk2EubN zE-GWyqH0sYimB&txrq6bIT+{W;LHFKgTJQ4$yKK=dONbKB#l`r!tJoWd5Ca4Ca>;7 zfsIU%cq!c`lGy(K{!ZkB+D9I8{pUI^IO&yN7WljzB#_@O^D^Bz4QdjV^?0dlk=DcaA z3iS{Qld-=}hwF(v(At}@N3lZRUhI|_@n%Kjfr7^yFi#$PBe}PQ&+?GP$phtyX4mrV zSU+M6Q&>F?=Ol=pa_vAp2@gMOK!v5ay|t-ti)x5|b0es@1}k`wt3UtLNj$N}dk}qf zpCPwlSmseB{8Y@U@xqza6>I6fcm$VpLDN#lgCOhdWG3FEI`U(innEqn^{n^3splf- z76;SRoevpArh4>?-tPO1+owZ49e&YnX))ts+f)!Gp4nfW^M>%*gO+&xIV^`7Puq@7 z!R~C4uLCnEr~3@T6ReKsYWt^2SDYA5v}I;lXjA$Tkb!!JbtTz#RJ-= zUbigB!y!uLp-Xr6iX3T8+Wrk>fp3+Bf&P?&gR@Vpn=<#J6!CufALD?|UMu zQTfdx++L2mb$torQB^G?iQ!m_ z`?c%f2j=7b)t=Kgm>d+#jgnK+Q53B!e3wSfe5v6QO@Mpx656{}&E(}+1XPE2NVepr zXf2>#5LCE8rd*B98VQLQyie?jC#x=tcRx07h>X$c!kOmcsy-o}WBsfJHMO`fMQz5D z9G?$XG@h*;sngDbwDZD82rpL5r$;_`^b{KmxvrerAIk$7jO?puukNV7b}DFRdZ;@J#$uV z-#xC1@LSL8Kg|4e&7)gn1!n)i)n;Jg?0l>#_>WCCiAr@ z-w9-O0{*1tjkO96kpo?x!R9M$CG9O7=X5W$$D}V9-Yptw-kg*)SN(EzWn}k4S>x5s zOvlskD&H#)y$W7uLcE4e_Q!BFYjXz{jfe+2SNg@4h8{^RG^5vx*ay|>zg!5BS&WGr zRbkZTE?X0DyWqjR3r%es>w>kdNL$LGDkGD|_6z8jN%ZP_%R?UQCrF(YTY&HRR>3Wq z#E;|?E7yq>5!M;K819)GGv&JTG19Uv%|9#C%4e9HE$IBy{LE{%0Y^jU?%ow6YYTDN zLKEh>(_~oM+FZ?9Wwc)`f+mPzI=#${(y0?CDl11ThvFIUK2juWTPs&LeLBo-__?N8 z&`UD!puN|#i~_^UJ{!EL<@doBR@S-Z@q3F`RQ1}~_CAm2KEAfkD7tINU`qY{+Kvm? z_nGG=C93rv z@4L*C{mVT!YhK>`)*C~-Jrc$sadsUfrFvZv1Y(FHXlR(~X=wcR)DAqWr-xir)@?Z{ z*ydtUZGN2HkJG2abkmU(w}@somxN7+ZzFGq{EwV6>M3ajO|z7(Iqf%{gR z%&I2^ucz}m-ERFZ7R3iYEcj(&^j`buiIX0d$)0}anF{a+rZpYA-rBS_OP+bJ#%gv> zzpMXpN|cmR`*Y<}r|!isNiEXC5>&EX5zXS_whoSQ_ zAntdJY5R9cfn#|!JMz#>`)p(S3NE^Vjn;iQz9&wYTr@cPoMpe_JF_UZM@tdk?=OROU})CjRF{qcJ9F z|M2_bP6$z*@-y<~v0&%1hfMb-cks%60CQ75RWH+320FeS5vp^sv)c^__ zRDd#gn->LKZ*@b#Lfa6!monJa$W%y!OvMSwO3O;aAX)(gKLl8XO-PA~#iPtMwSQ6o zEoHC=olZePq5l5<(*82iWU4z9uBfO8g(08_1Oz}pXn`a;IsihViEL5);Lya;FjNAC zP9T$nwm8vlWM8^67z~UH{UirQF{Qac`%@R1xLd|hBvM&{b)AGZS z=pw&5rFi?&e)Z`~!)9LxG^SJ^yN>qi1CLyUmu2?gS!b+hPm-D-w(O9Y^t{ zdT(Q}7%0vgM+5?)0nG3};pqhY9}D!S`D~5+OCW%|-}(Q9{!Op#ShjUVX_7I%TTb;f zmBCx_qOfEP0gKwcbd$l!q7~d^AV|2JEJPNLRe&hq<*^VP8jDqwm&eP)<#4}H>5*u3 zGzo*-q5{aJ2>=fstB946M<_zjGB^Z87Auc~C?e!!AXvC80-%>cqLDJcP?%5&Kqa8P ze~oI33JXvnU1-$igsqh#LYa1A)up5pGC4Ohy5N*{0fB2b7wro-!CA z4f~_V)EiC5lc_|Yya*&L*`M~ukR^eLv!J85WP>A-axkQfJWLLzfRI5T{{UIzs5BtW zw^-pYX#`?>1dBmw1Dt3e-3UaqI}S=Axo;0_Eer~n4j?Uht2zMY?S5c3C=DtOO(#<= z$z*S3@K&@!Ta?>HC8YGTTu_E&%(me+7>C`exSutrj&_G`Hn+foS$ZEpi8H0Fo=G_)TMyS)T}jz5Ml9%zy~4%lyh7Ta(Aguh5+oB~D` z4OftdAdv_Kpcdqi5Jez+Aqcn|8izp0;}A&sKeN-wc)CBDic@n3asXIopt!czS?Ji$ z{FC@I-robam0U1jw}rzXFr+1179|Tu$;yF$thSI6bZdwGZMI5VdytV4>Q_CKw)QBL z-c}-7_);j|1RV9xI{lV6{{!w9`=2@bpUi)S{jk;`Qv!i1_Mn^ilm4yyzX1MVFeG4b zBpUhOh5jq#hb+I`h=7=X^Z_?G;C>1H{f7B7OSTH>|MB%R`~Dw20M!3D`CIz_BiBE2 z{VfIl7Wkj+`bVz6rNG|;|C3$+XL7OqapcC4fagAc;6QymVTc>w*`CDUCN9NqsyC^)_Z8y zd#J8xz|`^>b)SJ(r}E`Hz3J6 z#R4*8Yw5RIWn_%jeDh@Eam0~}0V3?67psL7j~jDv-+fuU52MP%=Nt!v8X8$Z>~CLP zPcCasjCpf$KWVH!s+1HKo70!I-srS?zdm@1-A_{Mm|PnJ|m)^Ym}$D(V^ znL%qxO57)01fNK7t$oeaD*C?63W9z6#;mgXfu(VEL#8+7@@vcExPk5v=8%ZIwDr}> zvH_potE)Ik-bu4UuLK{&ATbQe#{_B<9CBn?BSgb&{{jNS! z-o0Ac{4Gb7y@zjb9+I2#WJnceD&rukG8uS%E$Ip(;~vRe)wc^BHQ>-4|1>+!8gMJh zyjb(-ZX}TTtHXyT`ux5==t7Bmle>^Ff+rGd~|t*$ozc^ zH(I-A-Zd5)?1^QZIk+Bf&H(&c@6NY_-61hD$1HmgD`Op1A3Yod(iMHS=b4siQYRp7 z>m>|(XBh*V|766p*K>&&TL+b4&qT56L)q$18OoOBAD8;BwBP`Zo_cg;<~2CouDzGq z8=PY<(OK+kFoNp#uL2=wClq7H+;aKnt5O6E=<^SnEMp>J-H8&m^U|(NdFnDft6?As zjUn|2ON*#^r2u2~^#+HqsqB=?6eLn5`qi}~jG&U9hKTOZMgn6o`Q;+1qyj732 zlAn9MosW}kxyoK7-|Md6d*8KZr;Egw9fOS>sIT*RrR0~vAN$I0w=GoL9pvi;eI_5{ b06{@%r8S7EzJ_>ULj&n)8EclPyPo+kGru|3 diff --git a/src/main/resources/assets/create/textures/models/armor/netherite_diving_layer_1_original.png b/src/main/resources/assets/create/textures/models/armor/netherite_diving_layer_2.png similarity index 100% rename from src/main/resources/assets/create/textures/models/armor/netherite_diving_layer_1_original.png rename to src/main/resources/assets/create/textures/models/armor/netherite_diving_layer_2.png diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index a8cd94f97..b58d1fc36 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -7,6 +7,7 @@ "mixins": [ "CustomItemUseEffectsMixin", "EntityMixin", + "HumanoidArmorLayerMixin", "MapItemSavedDataMixin", "ContraptionDriverInteractMixin", "accessor.AbstractProjectileDispenseBehaviorAccessor",