From a037d71337d1af75c5f459dc53cb21af38e1a389 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 19 Jul 2016 21:26:50 -0400 Subject: [PATCH] Updated the Sanguine Scientiem with Alchemy Array recipes --- changelog.txt | 5 + .../registry/AlchemyArrayRecipeRegistry.java | 62 +++++++++ .../guideapi/book/CategoryArchitect.java | 119 +++++++++++++++++- .../guideapi/page/PageAlchemyArray.java | 83 ++++++++++++ .../bloodmagic/util/helper/RecipeHelper.java | 6 +- .../assets/bloodmagicguide/lang/en_US.lang | 1 + .../textures/gui/alchemyArrayCrafting.png | Bin 0 -> 2510 bytes 7 files changed, 271 insertions(+), 5 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java create mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/alchemyArrayCrafting.png diff --git a/changelog.txt b/changelog.txt index 1b6f1bdd..9f45b9da 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +------------------------------------------------------ +Version 2.0.3-52 +------------------------------------------------------ +- Updated the Sanguine Scientiem with Alchemy Array recipes + ------------------------------------------------------ Version 2.0.3-51 ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java index d3b95832..349d315d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java @@ -88,6 +88,68 @@ public class AlchemyArrayRecipeRegistry return effectMap.get(key); } + /** + * + * @param key + * @return an array of two ItemStacks - first index is the input stack, + * second is the catalyst stack. Returns {null, null} if no recipe + * is valid. + */ + public static ItemStack[] getRecipeForArrayEffect(String key) + { + for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) + { + AlchemyArrayRecipe recipe = entry.getValue(); + if (recipe != null && entry.getKey().size() > 0) + { + for (Entry effectEntry : recipe.catalystMap.entrySet()) + { + if (effectEntry.getValue() != null && effectEntry.getValue().key.equals(key)) + { + return new ItemStack[] { entry.getKey().get(0), effectEntry.getKey().toStack() }; + } + } + } + } + + return new ItemStack[] { null, null }; + } + + /** + * @param Output + * of the recipe + * @return an array of two ItemStacks - first index is the input stack, + * second is the catalyst stack. Returns {null, null} if no recipe + * is valid. + */ + public static ItemStack[] getRecipeForOutputStack(ItemStack stack) + { + for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) + { + AlchemyArrayRecipe recipe = entry.getValue(); + if (recipe != null && entry.getKey().size() > 0) + { + for (Entry effectEntry : recipe.catalystMap.entrySet()) + { + if (effectEntry.getValue() instanceof AlchemyArrayEffectCrafting) + { + AlchemyArrayEffectCrafting craftingEffect = (AlchemyArrayEffectCrafting) effectEntry.getValue(); + ItemStack resultStack = craftingEffect.getOutputStack(); + if (resultStack != null && resultStack.getItem() != null) + { + if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) + { + return new ItemStack[] { entry.getKey().get(0), effectEntry.getKey().toStack() }; + } + } + } + } + } + } + + return new ItemStack[] { null, null }; + } + public static void registerCraftingRecipe(ItemStack input, ItemStack catalystStack, ItemStack outputStack, ResourceLocation arrayResource) { registerRecipe(input, catalystStack, new AlchemyArrayEffectCrafting(outputStack), arrayResource); diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java index 2e7a1223..c5851b41 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java @@ -10,12 +10,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.api.recipe.ShapedBloodOrbRecipe; import WayofTime.bloodmagic.api.recipe.ShapelessBloodOrbRecipe; import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry; import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry.AltarRecipe; import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; +import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; import WayofTime.bloodmagic.compat.guideapi.page.recipeRenderer.ShapedBloodOrbRecipeRenderer; @@ -63,13 +66,23 @@ public class CategoryArchitect entries.put(new ResourceLocation(keyBase + "bloodaltar"), new EntryText(altarPages, TextHelper.localize(keyBase + "bloodaltar"), true)); List ashPages = new ArrayList(); - //TODO: Arcane Ash Recipe + TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(ModItems.arcaneAshes)); + if (ashRecipe != null) + { + ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); + } ashPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ash" + ".info"), 370)); entries.put(new ResourceLocation(keyBase + "ash"), new EntryText(ashPages, TextHelper.localize(keyBase + "ash"), true)); List divinationPages = new ArrayList(); - //TODO: Divination Sigil Recipe + + PageAlchemyArray divinationRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilDivination)); + if (divinationRecipePage != null) + { + divinationPages.add(divinationRecipePage); + } + divinationPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "divination" + ".info"), 370)); entries.put(new ResourceLocation(keyBase + "divination"), new EntryText(divinationPages, TextHelper.localize(keyBase + "divination"), true)); @@ -150,6 +163,12 @@ public class CategoryArchitect waterPages.add(new PageTartaricForgeRecipe(waterRecipe)); } + PageAlchemyArray waterRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilWater)); + if (waterRecipePage != null) + { + waterPages.add(waterRecipePage); + } + waterPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "water" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "water"), new EntryText(waterPages, TextHelper.localize(keyBase + "water"), true)); @@ -161,6 +180,12 @@ public class CategoryArchitect lavaPages.add(new PageTartaricForgeRecipe(lavaRecipe)); } + PageAlchemyArray lavaRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilLava)); + if (lavaRecipePage != null) + { + lavaPages.add(lavaRecipePage); + } + lavaPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lava" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "lava"), new EntryText(lavaPages, TextHelper.localize(keyBase + "lava"), true)); @@ -227,6 +252,12 @@ public class CategoryArchitect holdingPages.add(new PageTartaricForgeRecipe(holdingRecipe)); } + PageAlchemyArray holdingRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilHolding)); + if (holdingRecipePage != null) + { + holdingPages.add(holdingRecipePage); + } + holdingPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "holding" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "holding"), new EntryText(holdingPages, TextHelper.localize(keyBase + "holding"), true)); @@ -238,6 +269,12 @@ public class CategoryArchitect airPages.add(new PageTartaricForgeRecipe(airRecipe)); } + PageAlchemyArray airRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilAir)); + if (airRecipePage != null) + { + airPages.add(airRecipePage); + } + airPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "air" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "air"), new EntryText(airPages, TextHelper.localize(keyBase + "air"), true)); @@ -249,6 +286,12 @@ public class CategoryArchitect voidPages.add(new PageTartaricForgeRecipe(voidRecipe)); } + PageAlchemyArray voidRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilVoid)); + if (voidRecipePage != null) + { + voidPages.add(voidRecipePage); + } + voidPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "void" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "void"), new EntryText(voidPages, TextHelper.localize(keyBase + "void"), true)); @@ -260,6 +303,12 @@ public class CategoryArchitect greenGrovePages.add(new PageTartaricForgeRecipe(greenGroveRecipe)); } + PageAlchemyArray greenGroveRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilGreenGrove)); + if (greenGroveRecipePage != null) + { + greenGrovePages.add(greenGroveRecipePage); + } + greenGrovePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "greenGrove" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "greenGrove"), new EntryText(greenGrovePages, TextHelper.localize(keyBase + "greenGrove"), true)); @@ -271,6 +320,12 @@ public class CategoryArchitect fastMinerPages.add(new PageTartaricForgeRecipe(fastMinerRecipe)); } + PageAlchemyArray fastMinerRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilFastMiner)); + if (fastMinerRecipePage != null) + { + fastMinerPages.add(fastMinerRecipePage); + } + fastMinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "fastMiner" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "fastMiner"), new EntryText(fastMinerPages, TextHelper.localize(keyBase + "fastMiner"), true)); @@ -282,6 +337,12 @@ public class CategoryArchitect seerPages.add(new PageTartaricForgeRecipe(seerRecipe)); } + PageAlchemyArray seerRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilSeer)); + if (seerRecipePage != null) + { + seerPages.add(seerRecipePage); + } + seerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "seer" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "seer"), new EntryText(seerPages, TextHelper.localize(keyBase + "seer"), true)); @@ -326,6 +387,12 @@ public class CategoryArchitect affinityPages.add(new PageTartaricForgeRecipe(affinityRecipe)); } + PageAlchemyArray affinityRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilElementalAffinity)); + if (affinityRecipePage != null) + { + affinityPages.add(affinityRecipePage); + } + affinityPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "affinity" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "affinity"), new EntryText(affinityPages, TextHelper.localize(keyBase + "affinity"), true)); @@ -337,6 +404,12 @@ public class CategoryArchitect lampPages.add(new PageTartaricForgeRecipe(lampRecipe)); } + PageAlchemyArray lampRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilBloodLight)); + if (lampRecipePage != null) + { + lampPages.add(lampRecipePage); + } + lampPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lamp" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "lamp"), new EntryText(lampPages, TextHelper.localize(keyBase + "lamp"), true)); @@ -348,6 +421,12 @@ public class CategoryArchitect magnetismPages.add(new PageTartaricForgeRecipe(magnetismRecipe)); } + PageAlchemyArray magnetismRecipePage = getAlchemyPage(new ItemStack(ModItems.sigilMagnetism)); + if (magnetismRecipePage != null) + { + magnetismPages.add(magnetismRecipePage); + } + magnetismPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "magnetism" + ".info.1"), 370)); entries.put(new ResourceLocation(keyBase + "magnetism"), new EntryText(magnetismPages, TextHelper.localize(keyBase + "magnetism"), true)); @@ -365,6 +444,42 @@ public class CategoryArchitect return entries; } + public static PageAlchemyArray getAlchemyPage(String key) + { + ItemStack[] recipe = AlchemyArrayRecipeRegistry.getRecipeForArrayEffect(key); + if (recipe[0] != null) + { + ItemStack inputStack = recipe[0]; + ItemStack catalystStack = recipe[1]; + + AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); + if (renderer != null) + { + return new PageAlchemyArray(renderer.arrayResource, inputStack, catalystStack); + } + } + + return null; + } + + public static PageAlchemyArray getAlchemyPage(ItemStack outputStack) + { + ItemStack[] recipe = AlchemyArrayRecipeRegistry.getRecipeForOutputStack(outputStack); + if (recipe[0] != null) + { + ItemStack inputStack = recipe[0]; + ItemStack catalystStack = recipe[1]; + + AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); + if (renderer != null) + { + return new PageAlchemyArray(renderer.arrayResource, inputStack, catalystStack, outputStack); + } + } + + return null; + } + public static PageIRecipe getPageForRecipe(IRecipe recipe) { if (recipe instanceof ShapedBloodOrbRecipe) diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java new file mode 100644 index 00000000..77f03cca --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java @@ -0,0 +1,83 @@ +package WayofTime.bloodmagic.compat.guideapi.page; + +import lombok.AllArgsConstructor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import WayofTime.bloodmagic.util.helper.TextHelper; +import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.Page; +import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; +import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; +import amerifrance.guideapi.api.util.GuiHelper; +import amerifrance.guideapi.gui.GuiBase; + +@AllArgsConstructor +public class PageAlchemyArray extends Page +{ + public static final double scale = 58d / 256d; + public ResourceLocation arrayResource; + public final ItemStack inputStack; + public final ItemStack catalystStack; + + public final ItemStack outputStack; + + public PageAlchemyArray(ResourceLocation resource, ItemStack inputStack, ItemStack outputStack) + { + this(resource, inputStack, outputStack, null); + } + + @Override + @SideOnly(Side.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRenderer) + { + int x = guiLeft + 65; + int y = guiTop + 30; + + Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/alchemyArrayCrafting.png")); + guiBase.drawTexturedModalRect(x, y, 0, 0, 62, 88 + (outputStack == null ? 0 : 26)); + + guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.BloodMagic.page.alchemyArray"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); + Minecraft.getMinecraft().getTextureManager().bindTexture(arrayResource); + + GlStateManager.pushMatrix(); + GlStateManager.translate(x + 2, y + 28, 0); + GlStateManager.scale(scale, scale, scale); + guiBase.drawTexturedModalRect(0, 0, 0, 0, 256, 256); + GlStateManager.popMatrix(); + + int inputX = x + 3; + int inputY = y + 3; + GuiHelper.drawItemStack(inputStack, inputX, inputY); + + int catalystX = x + 43; + int catalystY = y + 3; + GuiHelper.drawItemStack(catalystStack, catalystX, catalystY); + + if (GuiHelper.isMouseBetween(mouseX, mouseY, inputX, inputY, 15, 15)) + { + guiBase.renderToolTip(inputStack, mouseX, mouseY); + } + + if (GuiHelper.isMouseBetween(mouseX, mouseY, catalystX, catalystY, 15, 15)) + { + guiBase.renderToolTip(catalystStack, mouseX, mouseY); + } + + if (outputStack != null) + { + int outputX = x + 43; + int outputY = y + 95; + + GuiHelper.drawItemStack(outputStack, outputX, outputY); + if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) + { + guiBase.renderToolTip(outputStack, mouseX, mouseY); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java index 4923b5ed..6f8d121c 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java @@ -1,11 +1,11 @@ package WayofTime.bloodmagic.util.helper; -import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; +import WayofTime.bloodmagic.api.recipe.TartaricForgeRecipe; +import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry; +import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; public class RecipeHelper { diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang index 6d4dc252..da5d821e 100644 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang @@ -13,6 +13,7 @@ guide.BloodMagic.page.minimumWill=Minimum Will: %f guide.BloodMagic.page.drainedWill=Drained Will: %f guide.BloodMagic.shapelessOrb=Shapeless Orb Recipe guide.BloodMagic.shapedOrb=Shaped Orb Recipe +guide.BloodMagic.page.alchemyArray=Alchemy Array # Categories diff --git a/src/main/resources/assets/bloodmagicguide/textures/gui/alchemyArrayCrafting.png b/src/main/resources/assets/bloodmagicguide/textures/gui/alchemyArrayCrafting.png new file mode 100644 index 0000000000000000000000000000000000000000..2e78b0c6dbd45862a103675983936a7a419f2fd6 GIT binary patch literal 2510 zcmb`Ido&d47QnxuCMib~QHiPP;mDvCkvzsZjWkD0r7Mpa82 ztzzevAdH3Sma#2z@_Gh4Py-_IHG2&Dr%RzjYzD*6o~2CVGWGqH>_-aJ7@_X=9~N0| z)Xq{$LQE_s-(&krI8F04Ju}$ZuALcm#GlT%PNJpj)T*gH{@|!Md&{~PYHhG}|A7O& z4|HPee6KrXSH+I$V9cXePWsQiH!B^grGJ$hen0SD-5 z5A;LRxgpzog+q1rg;X9uFSQqpTRWjPVMEeDq`{UvwcB~VYb1y*uuE^T=w_h z8M>jhNitezawofdao2taIAxR^99J(7OENsMXxXZ?FJcyLT^`3+m6g7Ir{*%8P-A1h z$}>_}mRFo?O-izvw^4UbbZ2$i2n2)7%cBZn>vRgQij+;3H9Lc_=nGd#f5{6SOJY1* zXudTfdA|@}XXKgYP+f`JVgqL`Lw`W~IvIZmBA%XX>RVaZ9hkf9LV0S$Ar@;bukE}_ z9CgSluUQ1MlVx-T>j*~aWS93s>zz&e@8ao&w&{-=*fgiI1ieK641rH5(49p^27F`9 zwFC}VHdqLoo9<>BC#Z`A5#DpL8G@jT;I(EWjG)J#eJga!%&hZVI0&*>(PliKq0h^m ziQxI5>tJyQiQnzwFP7e6E4%Ai9avR0pO2))&tq>tbzTwCDAS0Ecrw|Cbu`b~e(-*4 zxVoyab6B$_49P>StERvqZ~8J?8tbPX>NyMYu~*kZh|pC%SHnky3e z01v7{Y$lGKk1Rr(A#;w|w93qlUHpHS=3pqNyej~Li zTONtNpK|wZF1n<(nN~u3jsbQS5g8&OGqR~sV&!Xvu%5%lZ*(squB*Vae$tXeDARa# zGm#Vjv(vENs9R=XhE=p@p#@5+c29+{n{Qk%ZqMhkBP8bNX{OhL78PVmpHqU4HQ!ww z<|GJ8t)gdBNKTROs$?Lw^AzEa@-?QJg&n!kLJL%FH77!Ng7f^XpSXk}=>lqjZIMKl zK*}T*DkAU|t;V&k~XLv@$q`b~?UMep8m?x>O? z!ZFFNFmqDm%Gz4KVPgx0OUJIU*=lWFOP|grzhNOwQXXmSipnv#$K|TtE{;o>u6)t) zwXV3ODr9NMXO3YNhqT8n^D<8~ug09x9&n!w2-7)IG(FLd@)BGc8+sY8sR}uanea8q zgh#CPns6Xli9KD8jp!||dHj->GI_-HCJbXy^^uY=h&9IGG!*|-5k!nZtUASF686!3N zJf1mse%WmDlU(a8({ztYJ-fyX?r=j^^g4dl-|<_J>!%XGCWa`RZ-GV|E)Q4LMYM#? zCBGPe?w^;1#*>TbQ-N?FUkcZkV^Du1fDpdk#_ABg+Ex*Ersu*3^2)+vWqxi-RcbK7 zBJx!5=3^-T@&?hEHl0W`_g^BA-muzj(s)jNgAAr(YL#k$l8?$T&c8Z`H6fk=j;4uR zWL$MBbsaV=d9%o9+m{jWv7#|>aiu|-D>G0bu?bz!eG&`~se^fHYXGoY?=&%ylf1w3 zylw>9?^UO%m3(MxqO64xbWHP&_W5YmSSo=pdj>_iV~*W36j%Q^#I_LOlGJ z;bAAjc;vNcjo|GxJdglVU_bE5jQOsbQ*sLgm6l{=T~JZk3E7lqwZwaXj*=Por774f zR0up4Rh?l=pKcH_G+InExnr{6q@89h{2qNCZL0#B=%OJdY0pCL2G+Ca@zad!PQq_l7(d z$uWroJue{XS%E*vKa~KGFNTVmjq|-`U}W=t5C#5|_5W|^6x_c8!{hPd7tWCVYH@pF zJHF~C8luro(+SSu0?dJ<`IF+3V=dpCdNCwnuq0R8DF@L0XL=r_+tw;0f>(89GUrX@ zOjpq~;%#MmW{K|eZe;9Wb(Q?GO5|bgw}XI+w2vbf|99CZACiGO9zUATI37B9Q&vMc zs%+97fta{yo;FcJ2?+>mQ~7h7hkd5dH&!u0n9HO{`w?F%Y^7CyEj5#}(*Ue-3M;L5 zH1}foG8d)Gin5zHrmPc^+LX`%hrz1oUW>d3&R$bfz9P2?0cO_6qaB3jhBsKwQzgic1uO%a$-v z+B{Y+ccaFxdnQE`qv)W`r{E=?&VMOs5U#fk5VohlYwi?As6=(hD(?krf*uOwMGpY}W O5609IUH-G