From 5558b8c2a7fe801f5d04db3ed3d15aa3800b225c Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 10 May 2024 14:29:48 +0200 Subject: [PATCH] finished pellet press, textures --- changelog | 17 +++++++++ src/main/java/com/hbm/blocks/ModBlocks.java | 1 - .../hbm/blocks/machine/MachineICFPress.java | 35 ++++++++++++++++++ .../com/hbm/inventory/gui/GUIICFPress.java | 4 +- .../com/hbm/items/machine/ItemICFPellet.java | 11 ++++-- .../hbm/tileentity/machine/TileEntityICF.java | 29 +++++++++++++-- .../machine/TileEntityICFController.java | 11 ++++-- .../machine/TileEntityICFPress.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 4 +- .../hbm/textures/items/circuit.analog.png | Bin 0 -> 428 bytes .../hbm/textures/items/circuit.capacitor.png | Bin 0 -> 272 bytes .../hbm/textures/items/circuit.chip.png | Bin 0 -> 342 bytes .../assets/hbm/textures/items/circuit.pcb.png | Bin 0 -> 388 bytes .../assets/hbm/textures/items/circuit.png | Bin 0 -> 1686 bytes .../textures/items/circuit.vacuum_tube.png | Bin 0 -> 266 bytes 16 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/circuit.analog.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit.capacitor.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit.chip.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit.pcb.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit.png create mode 100644 src/main/resources/assets/hbm/textures/items/circuit.vacuum_tube.png diff --git a/changelog b/changelog index e69de29bb..dc25a9cd4 100644 --- a/changelog +++ b/changelog @@ -0,0 +1,17 @@ +## Added +* ICF pellet maker + * Can create custom ICF fuel pellets + * Pellets use binary fuels, meaning they need two different fluids, two different solids or a solid and a fluid + * Optionally, the pellet maker can accept muon capsules, each capsule can add muons to up to 16 pellets, reducing the laser input requirement + +## Changed +* To make balancing easier, ICFs will only directly convert 25% of incoming laser heat into output heat when there is no fuel pellet loaded, meaning when using fuel, direct heating does not apply +* The ICF should now display its relevant values using Energy Control screens +* Sodium and calcium are now valid crucible materials +* All RBMK models that render as TESRs now use VBOs which should make them somewhat less laggy +* Blocks like explosive charges, radioactive barrels and so on which used to explode instantly when destroyed by another explosion, now behave more like TNT, spawning a primed version of the block that is knocked back by the initial explosion + * This fixes an issue where spamming too many blocks like that could potentially crash servers + * Most explosives go off after a short delay, flammable barrels however will explode on impact + +## Fixed +* Fixed ICF laser parts being considered valid when bordering an otherwise invalid dependency block \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index d44a23b03..24ebe2f4c 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -886,7 +886,6 @@ public class ModBlocks { public static Block fusion_motor; public static Block fusion_heater; public static Block fusion_hatch; - //public static Block fusion_core; public static Block plasma; public static Block iter; diff --git a/src/main/java/com/hbm/blocks/machine/MachineICFPress.java b/src/main/java/com/hbm/blocks/machine/MachineICFPress.java index 0e608aebd..0acf7ff0f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineICFPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineICFPress.java @@ -15,8 +15,11 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; @@ -60,6 +63,38 @@ public class MachineICFPress extends BlockContainer implements ITooltipProvider return false; } } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + TileEntity te = world.getTileEntity(x, y, z); + if(!(te instanceof ISidedInventory)) return; + ISidedInventory tileentityfurnace = (ISidedInventory) te; + if(tileentityfurnace != null) { + for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { + ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); + if(itemstack != null) { + float f = world.rand.nextFloat() * 0.8F + 0.1F; + float f1 = world.rand.nextFloat() * 0.8F + 0.1F; + float f2 = world.rand.nextFloat() * 0.8F + 0.1F; + while(itemstack.stackSize > 0) { + int j1 = world.rand.nextInt(21) + 10; + if(j1 > itemstack.stackSize) j1 = itemstack.stackSize; + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + if(itemstack.hasTagCompound()) entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + float f3 = 0.05F; + entityitem.motionX = (float) world.rand.nextGaussian() * f3; + entityitem.motionY = (float) world.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) world.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entityitem); + } + } + } + world.func_147453_f(x, y, z, block); + } + super.breakBlock(world, x, y, z, block, meta); + } @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIICFPress.java b/src/main/java/com/hbm/inventory/gui/GUIICFPress.java index 8d584385c..6fc6aaa72 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIICFPress.java +++ b/src/main/java/com/hbm/inventory/gui/GUIICFPress.java @@ -34,8 +34,8 @@ public class GUIICFPress extends GuiInfoContainer { press.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 44, guiTop + 18, 16, 52); press.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 52); - if(this.isMouseOverSlot(this.inventorySlots.getSlot(4), mouseX, mouseY)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.YELLOW + "Item input: Top/Bottom"}), mouseX, mouseY); - if(this.isMouseOverSlot(this.inventorySlots.getSlot(5), mouseX, mouseY)) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.YELLOW + "Item input: Sides"}), mouseX, mouseY); + if(this.isMouseOverSlot(this.inventorySlots.getSlot(4), mouseX, mouseY) && !this.inventorySlots.getSlot(4).getHasStack()) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.YELLOW + "Item input: Top/Bottom"}), mouseX, mouseY); + if(this.isMouseOverSlot(this.inventorySlots.getSlot(5), mouseX, mouseY) && !this.inventorySlots.getSlot(5).getHasStack()) this.func_146283_a(Arrays.asList(new String[] {EnumChatFormatting.YELLOW + "Item input: Sides"}), mouseX, mouseY); } @Override diff --git a/src/main/java/com/hbm/items/machine/ItemICFPellet.java b/src/main/java/com/hbm/items/machine/ItemICFPellet.java index 5a655a3a4..215d0bc3b 100644 --- a/src/main/java/com/hbm/items/machine/ItemICFPellet.java +++ b/src/main/java/com/hbm/items/machine/ItemICFPellet.java @@ -34,12 +34,12 @@ public class ItemICFPellet extends Item { HYDROGEN( 0x4040FF, 1.0D, 1.0D, 1.0D), DEUTERIUM( 0x2828CB, 1.0D, 1.0D, 1.0D), TRITIUM( 0x000092, 1.0D, 1.0D, 1.0D), - HELIUM3( 0xFFF09F, 1.0D, 1.0D, 1.0D), //hey you - HELIUM4( 0xFF9B60, 1.0D, 1.0D, 1.0D), //yes you - LITHIUM( 0xE9E9E9, 1.0D, 1.0D, 1.0D), //fuck off + HELIUM3( 0xFFF09F, 1.0D, 1.0D, 1.0D), + HELIUM4( 0xFF9B60, 1.0D, 1.0D, 1.0D), + LITHIUM( 0xE9E9E9, 1.0D, 1.0D, 1.0D), BERYLLIUM( 0xA79D80, 1.0D, 1.0D, 1.0D), BORON( 0x697F89, 1.0D, 1.0D, 1.0D), - //CARBON( 0x454545, 1.0D, 1.0D, 1.0D), + CARBON( 0x454545, 1.0D, 1.0D, 1.0D), OXYGEN( 0xB4E2FF, 1.0D, 1.0D, 1.0D), SODIUM( 0xDFE4E7, 1.0D, 1.0D, 1.0D), //aluminium, silicon, phosphorus @@ -74,6 +74,8 @@ public class ItemICFPellet extends Item { materialMap.put(Mats.MAT_LITHIUM, EnumICFFuel.LITHIUM); materialMap.put(Mats.MAT_BERYLLIUM, EnumICFFuel.BERYLLIUM); materialMap.put(Mats.MAT_BORON, EnumICFFuel.BORON); + materialMap.put(Mats.MAT_GRAPHITE, EnumICFFuel.CARBON); + fluidMap.put(Fluids.OXYGEN, EnumICFFuel.OXYGEN); materialMap.put(Mats.MAT_SODIUM, EnumICFFuel.SODIUM); fluidMap.put(Fluids.CHLORINE, EnumICFFuel.CHLORINE); materialMap.put(Mats.MAT_CALCIUM, EnumICFFuel.CALCIUM); @@ -183,6 +185,7 @@ public class ItemICFPellet extends Item { list.add(EnumChatFormatting.GREEN + "Depletion: " + String.format(Locale.US, "%.1f", getDurabilityForDisplay(stack) * 100D) + "%"); list.add(EnumChatFormatting.YELLOW + "Fuel: " + I18nUtil.resolveKey("icffuel." + getType(stack, true).name().toLowerCase(Locale.US)) + " / " + I18nUtil.resolveKey("icffuel." + getType(stack, false).name().toLowerCase(Locale.US))); list.add(EnumChatFormatting.YELLOW + "Heat required: " + BobMathUtil.getShortNumber(this.getFusingDifficulty(stack)) + "TU"); + list.add(EnumChatFormatting.YELLOW + "Reactivity multiplier: x" + (int) (getType(stack, true).reactionMult * getType(stack, false).reactionMult * 100) / 100D); if(stack.hasTagCompound() && stack.stackTagCompound.getBoolean("muon")) list.add(EnumChatFormatting.DARK_AQUA + "Muon catalyzed!"); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java b/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java index 7d8a66dfd..ba49ba262 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java @@ -12,9 +12,11 @@ import com.hbm.items.machine.ItemICFPellet; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -27,12 +29,15 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider, IFluidStandardTransceiver { +public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider, IFluidStandardTransceiver, IInfoProviderEC { public long laser; public long maxLaser; public long heat; public static final long maxHeat = 1_000_000_000_000L; + public long heatup; + public int consumption; + public int output; public FluidTank[] tanks; @@ -60,7 +65,7 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - this.heat += this.laser * 0.25D; + if(slots[5] == null || slots[5].getItem() != ModItems.icf_pellet) this.heat += this.laser * 0.25D; boolean markDirty = false; //eject depleted pellet @@ -87,8 +92,11 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider } } + this.heatup = 0; + if(slots[5] != null && slots[5].getItem() == ModItems.icf_pellet) { - this.heat += ItemICFPellet.react(slots[5], this.laser); + this.heatup = ItemICFPellet.react(slots[5], this.laser); + this.heat += heat; if(ItemICFPellet.getDepletion(slots[5]) >= ItemICFPellet.getMaxDepletion(slots[5])) { slots[5] = new ItemStack(ModItems.icf_pellet_depleted); markDirty = true; @@ -97,6 +105,9 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider tanks[2].setFill(tanks[2].getFill() + (int) Math.ceil(this.heat * 10D / this.maxHeat)); if(tanks[2].getFill() > tanks[2].getMaxFill()) tanks[2].setFill(tanks[2].getMaxFill()); } + + this.consumption = 0; + this.output = 0; if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); @@ -111,6 +122,9 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider tanks[0].setFill(tanks[0].getFill() - step.amountReq * cycles); tanks[1].setFill(tanks[1].getFill() + step.amountProduced * cycles); this.heat -= step.heatReq * cycles; + + this.consumption = step.amountReq * cycles; + this.output = step.amountProduced * cycles; } for(DirPos pos : getConPos()) { @@ -249,4 +263,13 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIICF(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, heatup > 0); + data.setLong(CompatEnergyControl.L_CAPACITY_TU, this.maxHeat); + data.setLong(CompatEnergyControl.L_ENERGY_TU, this.heat); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, this.consumption); + data.setDouble(CompatEnergyControl.D_OUTPUT_MB, this.output); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java index a6dae446b..6b4a44178 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityICFController.java @@ -41,12 +41,17 @@ public class TileEntityICFController extends TileEntityTickingBase implements IE ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); BlockPos pos = new BlockPos(0, 0, 0); + + HashSet validCells = new HashSet(); + HashSet validEmitters = new HashSet(); + HashSet validCapacitors = new HashSet(); for(int i = 0; i < cells.size(); i++) { int j = i + 1; if(cells.contains(pos.mutate(xCoord + dir.offsetX * j, yCoord, zCoord + dir.offsetZ * j))) { this.cellCount++; + validCells.add(pos.clone()); } else { break; } @@ -54,19 +59,19 @@ public class TileEntityICFController extends TileEntityTickingBase implements IE for(BlockPos emitter : emitters) { for(ForgeDirection offset : ForgeDirection.VALID_DIRECTIONS) { pos.mutate(emitter.getX() + offset.offsetX, emitter.getY() + offset.offsetY, emitter.getZ() + offset.offsetZ); - if(cells.contains(pos)) { this.emitterCount++; break; } + if(validCells.contains(pos)) { this.emitterCount++; validEmitters.add(pos.clone()); break; } } } for(BlockPos capacitor : capacitors) { for(ForgeDirection offset : ForgeDirection.VALID_DIRECTIONS) { pos.mutate(capacitor.getX() + offset.offsetX, capacitor.getY() + offset.offsetY, capacitor.getZ() + offset.offsetZ); - if(emitters.contains(pos)) { this.capacitorCount++; break; } + if(validEmitters.contains(pos)) { this.capacitorCount++; validCapacitors.add(pos.clone()); break; } } } for(BlockPos turbo : turbochargers) { for(ForgeDirection offset : ForgeDirection.VALID_DIRECTIONS) { pos.mutate(turbo.getX() + offset.offsetX, turbo.getY() + offset.offsetY, turbo.getZ() + offset.offsetZ); - if(capacitors.contains(pos)) { this.turbochargerCount++; break; } + if(validCapacitors.contains(pos)) { this.turbochargerCount++; break; } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityICFPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityICFPress.java index eae05e2fa..b92b4dcf1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityICFPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityICFPress.java @@ -91,7 +91,7 @@ public class TileEntityICFPress extends TileEntityMachineBase implements IFluidS ItemICFPellet.init(); EnumICFFuel fuel1 = getFuel(tanks[0], slots[4], 0); - EnumICFFuel fuel2 = getFuel(tanks[1], slots[5], 0); + EnumICFFuel fuel2 = getFuel(tanks[1], slots[5], 1); if(fuel1 == null || fuel2 == null || fuel1 == fuel2) return; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 69731b7db..7614eb3ff 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -363,6 +363,7 @@ container.machineElectrolyser=Electrolysegerät container.machineFEL=FEL container.machineFunnel=Kombinationstrichter container.machineICF=ICF +container.machineICFPress=ICF-Brennstoffpellet-Fabrikant container.machineITER=Kernfusionsreaktor container.machineLargeTurbine=Industrielle Dampfturbine container.machineLiquefactor=Verflüssiger @@ -4209,6 +4210,7 @@ tile.machine_gascent.name=Gaszentrifuge tile.machine_generator.name=Atomreaktor (Alt) tile.machine_geo.name=Geothermiegenerator tile.machine_hephaestus.name=Geothermischer Wärmetauscher +tile.machine_icf_press.name=ICF-Brennstoffpellet-Fabrikant tile.machine_industrial_boiler.name=Industrieller Boiler tile.machine_industrial_boiler.desc=Großer Boiler zum Verdampfen von Wasser oder$Erhitzen von Öl. Benötigt externe Hitzequelle.$Wärmestransferrate: ΔT*0.01 TU/t$Überdrucksicher tile.machine_industrial_generator.name=Industrieller Generator diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c41c168e4..7a690afaa 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -756,6 +756,7 @@ container.machineElectrolyser=Electrolysis Machine container.machineFEL=FEL container.machineFunnel=Combinator Funnel container.machineICF=ICF +container.machineICFPress=ICF Fuel Pellet Maker container.machineITER=Fusion Reactor container.machineLargeTurbine=Industrial Steam Turbine container.machineLiquefactor=Liquefactor @@ -5269,7 +5270,8 @@ tile.machine_gascent.name=Gas Centrifuge tile.machine_generator.name=Nuclear Reactor (Old) tile.machine_geo.name=Geothermal Electric Generator tile.machine_hephaestus.name=Geothermal Heat Exchanger -tile.machine_icf_press.desc=If only there was something that would tell me how or if this thing works$Something like a changelog or something like that$Alas, I'm too fucking stupid to read something like that anyway +tile.machine_icf_press.name=ICF Fuel Pellet Maker +tile.machine_icf_press.desc=Fills ICF Fuel pellets$Left fuel slot is accepted by top/bottom, right by the sides$Muons and pellets may be supplied from any side tile.machine_industrial_boiler.name=Industrial Boiler tile.machine_industrial_boiler.desc=Large boiler that can boil water or heat up oil.$Requires external heat source.$Heat transfer rate: ΔT*0.01 TU/t$Cannot explode tile.machine_industrial_generator.name=Industrial Generator diff --git a/src/main/resources/assets/hbm/textures/items/circuit.analog.png b/src/main/resources/assets/hbm/textures/items/circuit.analog.png new file mode 100644 index 0000000000000000000000000000000000000000..a76569026031abfda21ff2bd0d1a55cc903d6adf GIT binary patch literal 428 zcmV;d0aN~oP)K0X~56R=;HLD{kKW)V8nsaxXIS)^KSmKKGgU@a9 z^6XUZNw3M;AobzpTlO}7uB$x#_WRO*e0s^;yzNC48(Wz#TbsU%)Bzy)@bj;Eo4>rh z!=LjXXEruA@~^g1i(#8`Jm-+A>l{XTyPD-^8fHcx(ll-`(*LvP+=ZP-_?>$)nDgd& zq^A6+oXgl&|L;$uso+CaZZVx7{k^_ZxFvv~?#~a$Nv$rs+cLxjUQ02!w*+lDGyRq} P&`S)Su6{1-oD!M<@d<1o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/circuit.chip.png b/src/main/resources/assets/hbm/textures/items/circuit.chip.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ba46c4c2affaea1ae5613a1f2fdb189e0a05f8 GIT binary patch literal 342 zcmV-c0jd6pP)p>Bjw5S-&ZkRWPmdI-n`43aj1-{?O;g5xI|k_Lh6f1IhQ zMby=hpqn!|#N~J!wxTKF%283*PBLb9XEM84;Qu2C0``5M*ZP~aMjXeil){`%(=6t- z?}ac7If^2dQsRqwow67+o! zA_5U1O;ZpN#&LuY0#Zs;RW&7YU6&UIuTSrjNm-Uik_1EqP17)6=X5$@7>3J7jXUlz4u4I}`p0uEDl# ov*S2?*n_#o>L0A)*TTPt5BD5((UOs8{Qv*}07*qoM6N<$g2G#l$N&HU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/circuit.pcb.png b/src/main/resources/assets/hbm/textures/items/circuit.pcb.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1301a17f9efbdb7f6a75eacbf560049c4730e2 GIT binary patch literal 388 zcmV-~0ek+5P)GGX8wWyp|u;|7SEUMq?(!rZqy4l z>>I*?;VNvAOn@py8JPsG-{)=lv1nCHxcF=$aYcm;y#Q>D$Rv?&tCuTQdm8Nu4_=dA z0LcXO0@#ja3BL^2PCGJ*0?3{%T5$#K3E~R%g?0q~jTMz492m^N5cUmEdmSYJrmJYA z-?*K9!455@ATtJ6=kiEgkeGt5h7TQG!9PgZ=ba9{05*p{;tI9-7G)`*T}?O$8P>pj z8|p_*HSq?S!<21RM@_bjkM=a;3hLECiQ;azKIYn3B72;+PEL)$cLzNq)b<-w?H*I^ iWXa}F{fUqB2lWFKU~#_cE7}6k&;KWJgTym+VM!Fo$E*Nu*qoW5*B~YS!ig# zW07)yVFwTEWt!Hyl3?d6=b`+f(MrD zqu8(3vP(|Mm6YM`olF_<<~m+n>W$=e3H#p35FY-ji@thol)Bus@_HR!1n}36xVgIa zhqshwmuO zXIQ9S0KFR_y0&jOH#b8Lz9g;$69ytc7T8rC_50$}m)8V?myixSqC_N5_dxNscU>=W zHQ1?xI~9!q1X8E+--{A5$>_N1N7dC(o6mh*6U`wDTiERwMWFQk6lQAW6DH-GjcL+` zV9~RJteZ8GQcu3oiAJM&ah)&6#>5YLy(?18^;qnzb7ke_`q2dtzuiGo?wPi_3oYR; zAt7ZE#j+mb_@?tyH*Vppr6X(-fo$d$=RDj~LKc(% zvskjA!Wmj9r`T%LQXW_39-=IL6blCI=4AZdd|j)Sr;h|w<{EK*PG;uX-m zmMtRmINV|EwR9_uR@0gHW&u)DIkOeoAG`?M+83S{%+c@Wr`nnM`TBz%#j4J!)S%SAws)`U?RgS42Wxnx)vh|* zab3=ns=}lN_6L6v>rC)1Ec&iV$yqn!f8xW342I6HpT`U>n=_U-!Jdqn3jEw6c8s^M z{&bZ~!8v;SDaJc5Y*6o%l)x)h5eg7X4~LIc;T2Vz^~W+uj(2kRvnKm;znFsbwts{u zZD8~gl2nX5^Izl{L7seQBqM{KPfjb9NEey~!UDExNXS$CO!yiyTfp?758r+%m$BeQ zC!E4O;9svuGS@>rm{$)h*>OzA-Yl6*mp|3T%UST`tipq)))>9`i9${F-TjA8lIDdbQ zVuryrhnAb)p1#fg#M8joSS&0#g=gspsRrXxR~MH*|G&MJW(I=8%l+p|@X1&-gzBC% zD44SI#DZUMIhwcM%4JKQ=4}z%aG61|&X3K|&dkEsn1SKgdwcuLC(Y?V&oFqp`njxg HN@xNAx_x0x literal 0 HcmV?d00001