From 13e2db49bf165fbda0da0904a64531f6a87ee933 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Tue, 27 Jan 2026 09:48:33 +0800 Subject: [PATCH] =?UTF-8?q?2026/01/27=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 44 +- build.gradle | 5 + gradle.properties | 4 +- model_source/blockbench/Love Machine.bbmodel | 2 +- .../love_machine.geo - Converted.bbmodel | 1 + .../blockbench/love_machine.geo.bbmodel | 1 + model_source/blockbench/love_machine.png | Bin 0 -> 1538 bytes .../love_machine02 - Converted.bbmodel | 1 + .../blockbench/love_machine02.bbmodel | 1 + .../103d9f3f36b01595f1aa5172191e60eff02e6924 | 3 + .../1de3d2ee724999f84a11b20b51c37030049be277 | 4 +- .../2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac | 4 +- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 5 +- .../735031f3addf80804addae5e3f53249900116f1e | 4 +- .../75f280e54a980f6a77c88dc343cbf0782c07266f | 5 +- .../77014a30e3830c06140a018e90b86650574bbe4f | 4 +- .../82018c5420b46ddbb7071e62df09fdecd98133e6 | 4 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 395 ++-- .../a08bd3f44ead0bd6fd5fa8b8b892410f513acc73 | 24 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../e770ae23b263abad87dc6176b4d285ce96b89934 | 24 +- .../ea9f1243983465af9c3be845045b49f5270f1526 | 8 +- .../blockstates/end_rod_love_machine.json | 96 + .../lightning_rod_love_machine.json | 96 + .../assets/eroticdungeongame/lang/en_us.json | 80 +- .../assets/eroticdungeongame/lang/lzh.json | 80 +- .../assets/eroticdungeongame/lang/zh_cn.json | 80 +- .../assets/eroticdungeongame/lang/zh_tw.json | 80 +- .../models/item/device_key.json | 6 + .../models/item/end_rod_love_machine.json | 3 + .../item/lightning_rod_love_machine.json | 3 + .../assets/eroticdungeongame/sounds.json | 12 + .../ac_animations/crux_pose_01.anim.json | 2 +- .../ac_animations/cuff_pole_pose_01.anim.json | 2 +- .../ac_animations/pillory_pose_01.anim.json | 2 +- .../recipes/tools/device_key.json | 35 + .../recipes/tools/device_key_reset.json | 35 + .../recipes/tools/end_rod_love_machine.json | 35 + .../tools/lightning_rod_love_machine.json | 35 + .../eroticdungeongame/damage_type/fucked.json | 5 + .../damage_type/whipped.json | 5 + .../blocks/end_rod_love_machine.json | 21 + .../blocks/lightning_rod_love_machine.json | 21 + .../loot_tables/chests/dungeon_village.json | 1757 +++++++++++++++++ .../eroticdungeongame/recipes/device_key.json | 15 + .../recipes/device_key_reset.json | 12 + .../dyed_black_acacia_prone_bench.json | 32 +- .../dyed_black_bamboo_prone_bench.json | 64 +- .../recipes/dyed_black_birch_prone_bench.json | 38 +- .../dyed_black_cherry_prone_bench.json | 44 +- .../dyed_black_crimson_prone_bench.json | 42 +- .../recipes/dyed_black_cuff_bed.json | 30 +- .../dyed_black_dark_oak_prone_bench.json | 72 +- .../dyed_black_jungle_prone_bench.json | 52 +- .../dyed_black_mangrove_prone_bench.json | 34 +- .../recipes/dyed_black_oak_prone_bench.json | 32 +- .../dyed_black_spruce_prone_bench.json | 50 +- .../dyed_black_warped_prone_bench.json | 50 +- .../recipes/dyed_blue_acacia_prone_bench.json | 40 +- .../recipes/dyed_blue_bamboo_prone_bench.json | 64 +- .../recipes/dyed_blue_birch_prone_bench.json | 56 +- .../recipes/dyed_blue_cherry_prone_bench.json | 48 +- .../dyed_blue_crimson_prone_bench.json | 38 +- .../recipes/dyed_blue_cuff_bed.json | 42 +- .../dyed_blue_dark_oak_prone_bench.json | 72 +- .../recipes/dyed_blue_jungle_prone_bench.json | 52 +- .../dyed_blue_mangrove_prone_bench.json | 30 +- .../recipes/dyed_blue_oak_prone_bench.json | 34 +- .../recipes/dyed_blue_spruce_prone_bench.json | 50 +- .../recipes/dyed_blue_warped_prone_bench.json | 46 +- .../dyed_brown_acacia_prone_bench.json | 54 +- .../dyed_brown_bamboo_prone_bench.json | 64 +- .../recipes/dyed_brown_birch_prone_bench.json | 40 +- .../dyed_brown_cherry_prone_bench.json | 44 +- .../dyed_brown_crimson_prone_bench.json | 40 +- .../recipes/dyed_brown_cuff_bed.json | 72 +- .../dyed_brown_dark_oak_prone_bench.json | 72 +- .../dyed_brown_jungle_prone_bench.json | 52 +- .../dyed_brown_mangrove_prone_bench.json | 36 +- .../recipes/dyed_brown_oak_prone_bench.json | 28 +- .../dyed_brown_spruce_prone_bench.json | 50 +- .../dyed_brown_warped_prone_bench.json | 50 +- .../recipes/dyed_cyan_acacia_prone_bench.json | 36 +- .../recipes/dyed_cyan_bamboo_prone_bench.json | 66 +- .../recipes/dyed_cyan_birch_prone_bench.json | 56 +- .../recipes/dyed_cyan_cherry_prone_bench.json | 44 +- .../dyed_cyan_crimson_prone_bench.json | 38 +- .../recipes/dyed_cyan_cuff_bed.json | 24 +- .../dyed_cyan_dark_oak_prone_bench.json | 72 +- .../recipes/dyed_cyan_jungle_prone_bench.json | 56 +- .../dyed_cyan_mangrove_prone_bench.json | 38 +- .../recipes/dyed_cyan_oak_prone_bench.json | 28 +- .../recipes/dyed_cyan_spruce_prone_bench.json | 50 +- .../recipes/dyed_cyan_warped_prone_bench.json | 72 +- .../recipes/dyed_gray_acacia_prone_bench.json | 36 +- .../recipes/dyed_gray_bamboo_prone_bench.json | 64 +- .../recipes/dyed_gray_birch_prone_bench.json | 62 +- .../recipes/dyed_gray_cherry_prone_bench.json | 46 +- .../dyed_gray_crimson_prone_bench.json | 38 +- .../recipes/dyed_gray_cuff_bed.json | 42 +- .../dyed_gray_dark_oak_prone_bench.json | 50 +- .../recipes/dyed_gray_jungle_prone_bench.json | 56 +- .../dyed_gray_mangrove_prone_bench.json | 44 +- .../recipes/dyed_gray_oak_prone_bench.json | 34 +- .../recipes/dyed_gray_spruce_prone_bench.json | 54 +- .../recipes/dyed_gray_warped_prone_bench.json | 48 +- .../dyed_green_acacia_prone_bench.json | 38 +- .../dyed_green_bamboo_prone_bench.json | 64 +- .../recipes/dyed_green_birch_prone_bench.json | 56 +- .../dyed_green_cherry_prone_bench.json | 48 +- .../dyed_green_crimson_prone_bench.json | 38 +- .../recipes/dyed_green_cuff_bed.json | 26 +- .../dyed_green_dark_oak_prone_bench.json | 72 +- .../dyed_green_jungle_prone_bench.json | 52 +- .../dyed_green_mangrove_prone_bench.json | 30 +- .../recipes/dyed_green_oak_prone_bench.json | 32 +- .../dyed_green_spruce_prone_bench.json | 54 +- .../dyed_green_warped_prone_bench.json | 72 +- .../dyed_light_blue_acacia_prone_bench.json | 54 +- .../dyed_light_blue_bamboo_prone_bench.json | 64 +- .../dyed_light_blue_birch_prone_bench.json | 60 +- .../dyed_light_blue_cherry_prone_bench.json | 60 +- .../dyed_light_blue_crimson_prone_bench.json | 34 +- .../recipes/dyed_light_blue_cuff_bed.json | 54 +- .../dyed_light_blue_dark_oak_prone_bench.json | 72 +- .../dyed_light_blue_jungle_prone_bench.json | 30 +- .../dyed_light_blue_mangrove_prone_bench.json | 38 +- .../dyed_light_blue_oak_prone_bench.json | 28 +- .../dyed_light_blue_spruce_prone_bench.json | 50 +- .../dyed_light_blue_warped_prone_bench.json | 50 +- .../dyed_light_gray_acacia_prone_bench.json | 30 +- .../dyed_light_gray_bamboo_prone_bench.json | 64 +- .../dyed_light_gray_birch_prone_bench.json | 56 +- .../dyed_light_gray_cherry_prone_bench.json | 40 +- .../dyed_light_gray_crimson_prone_bench.json | 34 +- .../recipes/dyed_light_gray_cuff_bed.json | 38 +- .../dyed_light_gray_dark_oak_prone_bench.json | 52 +- .../dyed_light_gray_jungle_prone_bench.json | 32 +- .../dyed_light_gray_mangrove_prone_bench.json | 34 +- .../dyed_light_gray_oak_prone_bench.json | 28 +- .../dyed_light_gray_spruce_prone_bench.json | 50 +- .../dyed_light_gray_warped_prone_bench.json | 46 +- .../recipes/dyed_lime_acacia_prone_bench.json | 40 +- .../recipes/dyed_lime_bamboo_prone_bench.json | 68 +- .../recipes/dyed_lime_birch_prone_bench.json | 62 +- .../recipes/dyed_lime_cherry_prone_bench.json | 44 +- .../dyed_lime_crimson_prone_bench.json | 34 +- .../recipes/dyed_lime_cuff_bed.json | 30 +- .../dyed_lime_dark_oak_prone_bench.json | 72 +- .../recipes/dyed_lime_jungle_prone_bench.json | 56 +- .../dyed_lime_mangrove_prone_bench.json | 30 +- .../recipes/dyed_lime_oak_prone_bench.json | 38 +- .../recipes/dyed_lime_spruce_prone_bench.json | 50 +- .../recipes/dyed_lime_warped_prone_bench.json | 46 +- .../dyed_magenta_acacia_prone_bench.json | 36 +- .../dyed_magenta_bamboo_prone_bench.json | 64 +- .../dyed_magenta_birch_prone_bench.json | 56 +- .../dyed_magenta_cherry_prone_bench.json | 44 +- .../dyed_magenta_crimson_prone_bench.json | 38 +- .../recipes/dyed_magenta_cuff_bed.json | 44 +- .../dyed_magenta_dark_oak_prone_bench.json | 72 +- .../dyed_magenta_jungle_prone_bench.json | 56 +- .../dyed_magenta_mangrove_prone_bench.json | 38 +- .../recipes/dyed_magenta_oak_prone_bench.json | 36 +- .../dyed_magenta_spruce_prone_bench.json | 50 +- .../dyed_magenta_warped_prone_bench.json | 50 +- .../dyed_orange_acacia_prone_bench.json | 28 +- .../dyed_orange_bamboo_prone_bench.json | 64 +- .../dyed_orange_birch_prone_bench.json | 56 +- .../dyed_orange_cherry_prone_bench.json | 50 +- .../dyed_orange_crimson_prone_bench.json | 40 +- .../recipes/dyed_orange_cuff_bed.json | 30 +- .../dyed_orange_dark_oak_prone_bench.json | 72 +- .../dyed_orange_jungle_prone_bench.json | 52 +- .../dyed_orange_mangrove_prone_bench.json | 34 +- .../recipes/dyed_orange_oak_prone_bench.json | 32 +- .../dyed_orange_spruce_prone_bench.json | 50 +- .../dyed_orange_warped_prone_bench.json | 46 +- .../recipes/dyed_pink_acacia_prone_bench.json | 40 +- .../recipes/dyed_pink_bamboo_prone_bench.json | 64 +- .../recipes/dyed_pink_birch_prone_bench.json | 62 +- .../recipes/dyed_pink_cherry_prone_bench.json | 40 +- .../dyed_pink_crimson_prone_bench.json | 34 +- .../recipes/dyed_pink_cuff_bed.json | 32 +- .../dyed_pink_dark_oak_prone_bench.json | 72 +- .../recipes/dyed_pink_jungle_prone_bench.json | 52 +- .../dyed_pink_mangrove_prone_bench.json | 30 +- .../recipes/dyed_pink_oak_prone_bench.json | 38 +- .../recipes/dyed_pink_spruce_prone_bench.json | 50 +- .../recipes/dyed_pink_warped_prone_bench.json | 46 +- .../dyed_purple_acacia_prone_bench.json | 42 +- .../dyed_purple_bamboo_prone_bench.json | 68 +- .../dyed_purple_birch_prone_bench.json | 56 +- .../dyed_purple_cherry_prone_bench.json | 48 +- .../dyed_purple_crimson_prone_bench.json | 40 +- .../recipes/dyed_purple_cuff_bed.json | 24 +- .../dyed_purple_dark_oak_prone_bench.json | 72 +- .../dyed_purple_jungle_prone_bench.json | 52 +- .../dyed_purple_mangrove_prone_bench.json | 34 +- .../recipes/dyed_purple_oak_prone_bench.json | 36 +- .../dyed_purple_spruce_prone_bench.json | 38 +- .../dyed_purple_warped_prone_bench.json | 50 +- .../recipes/dyed_red_acacia_prone_bench.json | 42 +- .../recipes/dyed_red_bamboo_prone_bench.json | 64 +- .../recipes/dyed_red_birch_prone_bench.json | 56 +- .../recipes/dyed_red_cherry_prone_bench.json | 42 +- .../recipes/dyed_red_crimson_prone_bench.json | 38 +- .../recipes/dyed_red_cuff_bed.json | 42 +- .../dyed_red_dark_oak_prone_bench.json | 72 +- .../recipes/dyed_red_jungle_prone_bench.json | 56 +- .../dyed_red_mangrove_prone_bench.json | 36 +- .../recipes/dyed_red_oak_prone_bench.json | 28 +- .../recipes/dyed_red_spruce_prone_bench.json | 54 +- .../recipes/dyed_red_warped_prone_bench.json | 46 +- .../dyed_white_acacia_prone_bench.json | 36 +- .../dyed_white_bamboo_prone_bench.json | 64 +- .../recipes/dyed_white_birch_prone_bench.json | 56 +- .../dyed_white_cherry_prone_bench.json | 44 +- .../dyed_white_crimson_prone_bench.json | 40 +- .../recipes/dyed_white_cuff_bed.json | 34 +- .../dyed_white_dark_oak_prone_bench.json | 72 +- .../dyed_white_jungle_prone_bench.json | 52 +- .../dyed_white_mangrove_prone_bench.json | 44 +- .../recipes/dyed_white_oak_prone_bench.json | 34 +- .../dyed_white_spruce_prone_bench.json | 54 +- .../dyed_white_warped_prone_bench.json | 46 +- .../dyed_yellow_acacia_prone_bench.json | 36 +- .../dyed_yellow_bamboo_prone_bench.json | 68 +- .../dyed_yellow_birch_prone_bench.json | 56 +- .../dyed_yellow_cherry_prone_bench.json | 48 +- .../dyed_yellow_crimson_prone_bench.json | 40 +- .../recipes/dyed_yellow_cuff_bed.json | 40 +- .../dyed_yellow_dark_oak_prone_bench.json | 48 +- .../dyed_yellow_jungle_prone_bench.json | 52 +- .../dyed_yellow_mangrove_prone_bench.json | 30 +- .../recipes/dyed_yellow_oak_prone_bench.json | 36 +- .../dyed_yellow_spruce_prone_bench.json | 52 +- .../dyed_yellow_warped_prone_bench.json | 46 +- .../recipes/end_rod_love_machine.json | 15 + .../eroticdungeongame/recipes/key_copy.json | 4 + .../recipes/lightning_rod_love_machine.json | 15 + .../tags/blocks/block/crux.json | 14 +- .../tags/blocks/block/cuff_bed.json | 28 +- .../tags/blocks/block/cuff_pole.json | 14 +- .../tags/blocks/block/hanging_post.json | 14 +- .../tags/blocks/block/petrine_cross.json | 14 +- .../tags/blocks/block/pillory.json | 14 +- .../tags/blocks/block/prone_bench.json | 334 ++-- .../tags/blocks/block/rack.json | 14 +- .../tags/blocks/block/spanish_donkey.json | 14 +- .../tags/blocks/block/wall_rack.json | 14 +- .../tags/blocks/block/x_cross.json | 14 +- .../tags/items/item/crux.json | 14 +- .../tags/items/item/cuff_bed.json | 28 +- .../tags/items/item/cuff_pole.json | 14 +- .../tags/items/item/hanging_post.json | 14 +- .../tags/items/item/petrine_cross.json | 14 +- .../tags/items/item/pillory.json | 14 +- .../tags/items/item/prone_bench.json | 334 ++-- .../tags/items/item/rack.json | 14 +- .../tags/items/item/spanish_donkey.json | 14 +- .../tags/items/item/wall_rack.json | 14 +- .../tags/items/item/x_cross.json | 14 +- .../eroticdungeongame/EroticDungeon.java | 22 +- .../api/event/LoveMachineTickEvent.java | 48 + .../client/EDGKeyBindings.java | 36 + .../gui/components/DungeonCheckBox.java | 82 + .../gui/components/DungeonSliderButton.java | 43 + .../gui/components/PreviewControlButton.java | 108 + .../client/gui/components/PreviewToolbar.java | 177 ++ .../gui/screens/OffsetConfigScreen.java | 763 +++++++ .../model/block/LoveMachineBlockModel.java | 36 + .../model/item/LoveMachineItemModel.java | 48 + .../block/LoveMachineBlockRenderer.java | 77 + .../item/LoveMachineItemRenderer.java | 27 + .../content/EDGDamageTypes.java | 106 + .../content/EDGVillagerTrades.java | 132 +- .../content/block/IColorBlock.java | 2 +- .../content/block/ISeatBlock.java | 8 +- .../blockentity/BaseSeatBlockEntity.java | 55 +- .../blockentity/DefaultSeatBlockEntity.java | 2 +- .../blockentity/IronCageBlockEntity.java | 10 +- .../blockentity/LoveMachineBlockEntity.java | 332 ++++ .../block/blockentity/PilloryBlockEntity.java | 35 + .../blockentity/SpanishDonkeyBlockEntity.java | 4 +- .../multiply/AbstractCrossSeatBlock.java | 2 +- .../multiply/AbstractThreePartSeatBlock.java | 2 +- .../multiply/AbstractTwoPartSeatBlock.java | 2 +- .../content/block/type/CuffBedBlock.java | 2 +- .../block/type/DungeonCraftingTableBlock.java | 2 +- .../content/block/type/IronCageBlock.java | 2 +- .../content/block/type/LoveMachineBlock.java | 301 +++ .../content/block/type/PilloryBlock.java | 36 +- .../content/block/type/ProneBenchBlock.java | 2 +- .../block/type/SpanishDonkeyBlock.java | 12 +- .../capability/AbstractPlayerDungeonData.java | 3 +- .../capability/DungeonDataSyncManager.java | 3 +- .../capability/PlayerDungeonDataProvider.java | 1 - .../content/command/EDGCommand.java | 20 + .../content/entity/SeatEntity.java | 29 +- .../content/item/DeviceKeyItem.java | 189 ++ .../content/item/IronCageItem.java | 2 +- .../content/item/LoveMachineItem.java | 90 + .../content/item/SpanishDonkeyItem.java | 2 +- .../content/item/WhipItem.java | 6 +- .../content/menu/DungeonCraftingMenu.java | 6 +- .../content/recipe/DungeonCustomRecipe.java | 47 + .../content/recipe/DungeonKeyCopyRecipe.java | 90 + .../content/recipe/DungeonRecipe.java | 2 +- .../content/recipe/DungeonRecipeCategory.java | 2 - .../content/recipe/DungeonShapedRecipe.java | 2 +- .../recipe/DungeonShapelessRecipe.java | 2 +- .../recipe/EDGRecipeTypeCategories.java | 3 +- .../recipe/SimpleDungeonRecipeSerializer.java | 51 + .../content/util/FurnitureHelper.java | 2 +- .../compat/CarryOnCompat.java | 29 +- .../compat/emi/DungeonEmiPlugin.java | 8 +- .../category/DungeonCraftingEmiCategory.java | 4 +- .../category/DungeonCraftingEmiRecipe.java | 6 +- .../category/DungeonCraftingRecipeMaker.java | 7 +- .../widget/DungeonCraftingNoSlotWidget.java | 2 +- .../compat/jei/DungeonJeiPlugin.java | 13 +- .../categorty/DungeonCraftingJeiCategory.java | 4 +- .../{content => core}/device/SeatType.java | 6 +- .../device/SeatTypeRegistry.java | 2 +- .../core/event/ClientHandler.java | 76 +- .../core/event/CommonHandler.java | 6 +- .../core/network/EDGNetworkHandler.java | 47 + .../network/toServer/OffsetConfigPacket.java | 77 + .../toServer/RequestQuitDevicePacket.java | 102 + .../register/EDGBlockEntities.java | 18 +- .../{content => core}/register/EDGBlocks.java | 20 +- .../register/EDGCapabilities.java | 2 +- .../register/EDGCreativeTabs.java | 10 +- .../register/EDGCustomStats.java | 2 +- .../register/EDGEnchantments.java | 2 +- .../register/EDGEntities.java | 2 +- .../{content => core}/register/EDGItems.java | 15 +- .../register/EDGMenuTypes.java | 2 +- .../register/EDGParticleTypes.java | 2 +- .../{content => core}/register/EDGPois.java | 2 +- .../register/EDGRecipeSerializers.java | 7 +- .../register/EDGRecipeTypes.java | 2 +- .../register/EDGSoundEvents.java | 6 +- .../register/EDGVillagers.java | 2 +- .../register/tag/EDGBlockTags.java | 2 +- .../register/tag/EDGItemTags.java | 2 +- .../service/SeatService.java | 7 +- .../datagen/EDGDataGenEvent.java | 11 +- .../datagen/EDGRegistries.java | 11 + .../builder/DungeonCraftingRecipeBuilder.java | 3 +- .../builder/DungeonShapedRecipeBuilder.java | 2 +- .../DungeonShapelessRecipeBuilder.java | 4 +- .../builder/DungeonSpecialRecipeBuilder.java | 60 + .../provider/EDGAnimationProvider.java | 6 +- .../provider/EDGBlockModelProvider.java | 2 +- .../provider/EDGBlockStatesProvider.java | 41 +- .../provider/EDGBlockTagsProvider.java | 4 +- .../datagen/provider/EDGChestLootTable.java | 97 + .../provider/EDGItemModelProvider.java | 17 +- .../datagen/provider/EDGItemTagProvider.java | 4 +- .../provider/EDGPoiTypeTagsProvider.java | 2 +- .../datagen/provider/EDGRecipeProvider.java | 29 +- .../provider/EDGSoundDefinitionsProvider.java | 12 +- .../datagen/value/EDGBlockLootTables.java | 4 +- .../datagen/value/EDGLangKey.java | 488 ++++- .../minecraft/MixinClientPacketListener.java | 57 + .../mixin/minecraft/MixinPlayer.java | 5 + .../util/BoundingBoxCalculator.java | 2 +- .../{datagen/value => util}/ColorContent.java | 2 +- .../eroticdungeongame/util/EntityUtil.java | 133 ++ .../block/love_machine.animation.json | 159 ++ .../geo/block/end_rod_love_machine.geo.json | 88 + .../geo/block/iron_cage.geo.json | 2 +- .../block/lightning_rod_love_machine.geo.json | 92 + .../models/block/love_machine.json | 129 ++ .../eroticdungeongame/sounds/piston/in.ogg | Bin 0 -> 15353 bytes .../eroticdungeongame/sounds/piston/out.ogg | Bin 0 -> 6059 bytes .../textures/block/love_machine.png | Bin 0 -> 1538 bytes .../textures/gui/3d_controls.png | Bin 0 -> 784 bytes .../textures/item/device_key.png | Bin 0 -> 407 bytes .../structures/villager_str/cage.nbt | Bin 0 -> 2175 bytes .../villager_str/dungeon_work_station.nbt | Bin 5397 -> 4535 bytes .../structures/villager_str/iron_cage.nbt | Bin 0 -> 1138 bytes .../structures/villager_str/pillory.nbt | Bin 0 -> 1122 bytes .../villager_str/edg_village.json | 29 +- .../resources/eroticdungeongame.mixins.json | 5 +- src/main/resources/logo.png | Bin 0 -> 298643 bytes src/main/templates/META-INF/mods.toml | 10 +- 389 files changed, 12743 insertions(+), 5484 deletions(-) create mode 100644 model_source/blockbench/love_machine.geo - Converted.bbmodel create mode 100644 model_source/blockbench/love_machine.geo.bbmodel create mode 100644 model_source/blockbench/love_machine.png create mode 100644 model_source/blockbench/love_machine02 - Converted.bbmodel create mode 100644 model_source/blockbench/love_machine02.bbmodel create mode 100644 src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 create mode 100644 src/generated/resources/assets/eroticdungeongame/blockstates/end_rod_love_machine.json create mode 100644 src/generated/resources/assets/eroticdungeongame/blockstates/lightning_rod_love_machine.json create mode 100644 src/generated/resources/assets/eroticdungeongame/models/item/device_key.json create mode 100644 src/generated/resources/assets/eroticdungeongame/models/item/end_rod_love_machine.json create mode 100644 src/generated/resources/assets/eroticdungeongame/models/item/lightning_rod_love_machine.json create mode 100644 src/generated/resources/data/eroticdungeongame/advancements/recipes/tools/device_key.json create mode 100644 src/generated/resources/data/eroticdungeongame/advancements/recipes/tools/device_key_reset.json create mode 100644 src/generated/resources/data/eroticdungeongame/advancements/recipes/tools/end_rod_love_machine.json create mode 100644 src/generated/resources/data/eroticdungeongame/advancements/recipes/tools/lightning_rod_love_machine.json create mode 100644 src/generated/resources/data/eroticdungeongame/damage_type/fucked.json create mode 100644 src/generated/resources/data/eroticdungeongame/damage_type/whipped.json create mode 100644 src/generated/resources/data/eroticdungeongame/loot_tables/blocks/end_rod_love_machine.json create mode 100644 src/generated/resources/data/eroticdungeongame/loot_tables/blocks/lightning_rod_love_machine.json create mode 100644 src/generated/resources/data/eroticdungeongame/loot_tables/chests/dungeon_village.json create mode 100644 src/generated/resources/data/eroticdungeongame/recipes/device_key.json create mode 100644 src/generated/resources/data/eroticdungeongame/recipes/device_key_reset.json create mode 100644 src/generated/resources/data/eroticdungeongame/recipes/end_rod_love_machine.json create mode 100644 src/generated/resources/data/eroticdungeongame/recipes/key_copy.json create mode 100644 src/generated/resources/data/eroticdungeongame/recipes/lightning_rod_love_machine.json create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/api/event/LoveMachineTickEvent.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/EDGKeyBindings.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonCheckBox.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonSliderButton.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewControlButton.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewToolbar.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/gui/screens/OffsetConfigScreen.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/model/block/LoveMachineBlockModel.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/model/item/LoveMachineItemModel.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/renderer/block/LoveMachineBlockRenderer.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/LoveMachineItemRenderer.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/EDGDamageTypes.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/LoveMachineBlockEntity.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/PilloryBlockEntity.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/block/type/LoveMachineBlock.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/command/EDGCommand.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/item/DeviceKeyItem.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/item/LoveMachineItem.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonCustomRecipe.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonKeyCopyRecipe.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/content/recipe/SimpleDungeonRecipeSerializer.java rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/CarryOnCompat.java (66%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/emi/DungeonEmiPlugin.java (80%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/emi/category/DungeonCraftingEmiCategory.java (91%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/emi/category/DungeonCraftingEmiRecipe.java (93%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/emi/category/DungeonCraftingRecipeMaker.java (80%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/emi/widget/DungeonCraftingNoSlotWidget.java (93%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/jei/DungeonJeiPlugin.java (85%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/compat/jei/categorty/DungeonCraftingJeiCategory.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/device/SeatType.java (97%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/device/SeatTypeRegistry.java (97%) create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/core/network/EDGNetworkHandler.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/OffsetConfigPacket.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/RequestQuitDevicePacket.java rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGBlockEntities.java (74%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGBlocks.java (98%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGCapabilities.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGCreativeTabs.java (82%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGCustomStats.java (97%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGEnchantments.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGEntities.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGItems.java (98%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGMenuTypes.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGParticleTypes.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGPois.java (97%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGRecipeSerializers.java (80%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGRecipeTypes.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGSoundEvents.java (85%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/EDGVillagers.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/tag/EDGBlockTags.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/register/tag/EDGItemTags.java (96%) rename src/main/java/top/r3944realms/eroticdungeongame/{content => core}/service/SeatService.java (98%) create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGRegistries.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonSpecialRecipeBuilder.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGChestLootTable.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinClientPacketListener.java rename src/main/java/top/r3944realms/eroticdungeongame/{datagen/value => util}/ColorContent.java (99%) create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/util/EntityUtil.java create mode 100644 src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json create mode 100644 src/main/resources/assets/eroticdungeongame/geo/block/end_rod_love_machine.geo.json create mode 100644 src/main/resources/assets/eroticdungeongame/geo/block/lightning_rod_love_machine.geo.json create mode 100644 src/main/resources/assets/eroticdungeongame/models/block/love_machine.json create mode 100644 src/main/resources/assets/eroticdungeongame/sounds/piston/in.ogg create mode 100644 src/main/resources/assets/eroticdungeongame/sounds/piston/out.ogg create mode 100644 src/main/resources/assets/eroticdungeongame/textures/block/love_machine.png create mode 100644 src/main/resources/assets/eroticdungeongame/textures/gui/3d_controls.png create mode 100644 src/main/resources/assets/eroticdungeongame/textures/item/device_key.png create mode 100644 src/main/resources/data/eroticdungeongame/structures/villager_str/cage.nbt create mode 100644 src/main/resources/data/eroticdungeongame/structures/villager_str/iron_cage.nbt create mode 100644 src/main/resources/data/eroticdungeongame/structures/villager_str/pillory.nbt create mode 100644 src/main/resources/logo.png diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 63c3cde1..4ee58c85 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,9 @@ -name: Build +name: Build and Release -on: [push, pull_request] +on: + push: + tags: + - 'v*' # 标签推送时触发发布,如 v1.0.0 jobs: build: @@ -8,9 +11,6 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - name: Setup JDK 21 uses: actions/setup-java@v4 @@ -18,8 +18,36 @@ jobs: java-version: '21' distribution: 'temurin' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + - name: Make gradlew executable + run: chmod +x ./gradlew - name: Build with Gradle - run: ./gradlew build \ No newline at end of file + run: ./gradlew build + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: | + build/libs/*.jar + !build/libs/*-plain.jar + retention-days: 7 + + release: + runs-on: ubuntu-latest + needs: build + if: startsWith(github.ref, 'refs/tags/v') + + steps: + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: build-artifacts + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + files: | + *.jar + !*-plain.jar + generate_release_notes: true \ No newline at end of file diff --git a/build.gradle b/build.gradle index 81c7234b..18059b4c 100644 --- a/build.gradle +++ b/build.gradle @@ -127,6 +127,11 @@ legacyForge { '--output', file('src/generated/resources/').absolutePath, '--existing', file('src/main/resources/').absolutePath } + gameTestServer { + type = "gameTestServer" + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + } + } mods { diff --git a/gradle.properties b/gradle.properties index 8ef0e6a2..45415b82 100644 --- a/gradle.properties +++ b/gradle.properties @@ -32,7 +32,7 @@ emi_version=1.1.22+1.20.1 player_anim_version=1.0.2-rc1+1.20 geckolib_version=4.2.1 curios_version=5.5.0+1.20.1 -lib39_version=0.1.8 +lib39_version=0.1.9 accore_version=1.20.1-26H4 ## Mod Properties # The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} @@ -43,7 +43,7 @@ mod_name=Erotic Dungeon Game # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=Apache 2.0, CC BY-NC-SA 4.0 # The mod version. See https://semver.org/ -mod_version=26H4 +mod_version=26H5 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/model_source/blockbench/Love Machine.bbmodel b/model_source/blockbench/Love Machine.bbmodel index 1dc0f66a..e318aa58 100644 --- a/model_source/blockbench/Love Machine.bbmodel +++ b/model_source/blockbench/Love Machine.bbmodel @@ -1 +1 @@ -{"meta":{"format_version":"5.0","model_format":"geckolib_model","box_uv":false},"name":"Love Machine","model_identifier":"doll_247 - Converted","front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"geckolib_modid":"","geckolib_filepath_cache":{},"resolution":{"width":64,"height":64},"elements":[{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,-1.925],"to":[5,10,0.075],"autouv":0,"color":0,"rotation":[0,0,0],"origin":[0,5,4.075],"faces":{"north":{"uv":[0,12,10,22],"texture":0},"east":{"uv":[0,0,10,2],"rotation":90,"texture":0},"south":{"uv":[12,12,22,22],"texture":0},"west":{"uv":[0,0,10,2],"rotation":270,"texture":0},"up":{"uv":[0,0,10,2],"texture":0},"down":{"uv":[0,0,10,2],"rotation":180,"texture":0}},"type":"cube","uuid":"fd3e3a99-bff1-60d0-0cef-dec677875407"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,0.075],"to":[1,6,5.075],"autouv":0,"color":2,"rotation":[0,0,0],"origin":[0,5,4.075],"faces":{"north":{"uv":[3,0,8,2],"rotation":90,"texture":null},"east":{"uv":[2,0,7,2],"rotation":180,"texture":0},"south":{"uv":[3,0,8,2],"rotation":90,"texture":null},"west":{"uv":[2,0,7,2],"texture":0},"up":{"uv":[2,0,7,2],"rotation":90,"texture":0},"down":{"uv":[2,0,7,2],"rotation":270,"texture":0}},"type":"cube","uuid":"d51c05af-cba3-c129-6244-53f87af9f8a4"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,0.075],"to":[5,10,8.075],"autouv":0,"color":4,"rotation":[0,0,0],"origin":[0,5,-0.925],"faces":{"north":{"uv":[0,2,10,10],"texture":0},"east":{"uv":[0,2,10,10],"texture":0},"south":{"uv":[0,2,10,10],"texture":0},"west":{"uv":[0,2,10,10],"texture":0},"up":{"uv":[12,0,22,10],"texture":0},"down":{"uv":[12,0,22,10],"texture":0}},"type":"cube","uuid":"901d8692-bc79-bd9a-1326-a0fb7859dd59"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,3,-2.925],"to":[2,7,-1.925],"autouv":0,"color":4,"origin":[0,5,-1.925],"faces":{"north":{"uv":[3,26,7,30],"texture":0},"east":{"uv":[3,30,7,31],"rotation":90,"texture":0},"south":{"uv":[3,26,7,30],"texture":0},"west":{"uv":[3,30,7,31],"rotation":90,"texture":0},"up":{"uv":[3,27,7,28],"texture":0},"down":{"uv":[3,30,7,31],"texture":0}},"type":"cube","uuid":"bb196c15-6055-91c9-3fa9-c443280c214e"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,-10.925],"to":[1,6,-2.925],"autouv":0,"color":4,"origin":[-1,6,-2.925],"faces":{"north":{"uv":[3,24,5,26],"texture":0},"east":{"uv":[1,24,3,39],"rotation":90,"texture":0},"south":{"uv":[1,24,3,26],"texture":0},"west":{"uv":[1,24,3,39],"rotation":90,"texture":0},"up":{"uv":[1,24,3,39],"texture":0},"down":{"uv":[1,24,3,39],"texture":0}},"type":"cube","uuid":"79364c8f-3955-ef7b-e037-4bc9a7e4dede"}],"groups":[{"uuid":"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a","export":true,"locked":false,"origin":[0,24,0],"rotation":[0,0,0],"color":0,"name":"p","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"uuid":"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4","export":true,"locked":false,"origin":[0,5,4.075],"rotation":[0,0,0],"color":0,"name":"ac","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a","isOpen":true,"children":["901d8692-bc79-bd9a-1326-a0fb7859dd59",{"uuid":"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4","isOpen":true,"children":["fd3e3a99-bff1-60d0-0cef-dec677875407","d51c05af-cba3-c129-6244-53f87af9f8a4","bb196c15-6055-91c9-3fa9-c443280c214e","79364c8f-3955-ef7b-e037-4bc9a7e4dede"]}]}],"textures":[{"name":"doll_247.png","relative_path":"H:/Download/doll/doll_247.png","folder":"","namespace":"","id":"2","group":"","width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":true,"sync_to_project":"8b3c4cf5-2d9a-6882-33cd-d32beeb815a3","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"28ae3426-f9a5-6d13-5579-4d9930f92440","layers":[{"name":"layer","offset":[0,0],"scale":[1,1],"opacity":100,"visible":true,"blend_mode":"default","width":64,"height":64,"data_url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFFklEQVR4AexY3U9bdRh+esY6OiBlZFhggwkWxmQO5Wu6LSoJF2gg8gdoTEh27YVXmswLl2hissSLaUyWLTGTKy/A6LJhKrhlJoyPLUgJETpE2PhYJ9BSKOLI8Txv+WGFC3dCQk57Svqc9+O8P/g9z/v+Tlu0gYEB/cbFdwW3LrfqjNva2nT6Csxh46ehoUEnamtr9crKSp2WcTyY2yi3vNE6OzsxszgvuD8TBOO+vj78GV4SqJxiEgqFUF9fj5aWFnhLSlBdXS3wer1wZ2VBrNutyi1vta6uLrT9HMWX383i828n0d7eDr/fjy+uLQh4j7l4Jnf7+0EwV1hYSAO3QbqqpkYsRZJkAly0YDAonWMnGxsbpZvsZHNzMwh2NJ7H2tqahLkeD7xlZZiamkJgdBQFBQXIzMxEIpEnES03N1eIqE4G5+YkjkQiGBkZAWNFmgvM1nONlaFxc+xaOByW7rGzzLGzJM/Y6XQytQmz9ZsLLeiIAOw+x5jnmL7aJ880Y+ZVjpY5M/VcY1WIAOw2N8hzTJ/k2H36fNjxOcH7CszTf9p61loVIgDJsts89/Q59oyVv/UIMM/7T1tvVfLcl8bzHBgfR0dHB7q7uxFaWkIgENj0jQ9B8tbGYsJsPddYGZrxoccxODjooPX5fI6tUHlFgrGZerXOqlaOgFU3txv70sbGxvSPWk9uovf2bX1rjrHaDH0z9WqdVa129dO34TppfIpreh73c3TMOjrh/+FDnHijCo+z9+ClF4rAGkWAfsPpCsnPzS9j9bcrUs86BdaoeqtbOQLlK2myzwyXE/7OHgwfycHoUACOsjxcC8/KvfgLvygx9uRkyBemxeVVhgkJEeByYBSBe2OYN4gMr4TQ85MhgmEXAw+gPdG3EbtxcwT3hiYlT7+n/3fQEiovNy142bolran1Al4vP4Jo2l4cPXUCL751Gq++WYdQ9C8cys/GK/sOgDVqIf2Xa4pRXPKMgD7B+7TMs4ZxIkA7YHyrq9t/EHmHM7BHc2B6aALrDx7D7dqHdGcaso4eBmsUGfrP5eciOyNdQJ+A8aNyrDHChHjJQ9D3yzBCE4uYuDWER+MP4R97KJuffRSG78febQ9B1nPUibbve0FwAWPiqvFgZZwI0LhJjq23+FmkZzlReaoCaa69OFZXDu2gGx7P9v/usJ7g2sbXjoGjTzBHMJ8oEAE4uut/L2N6fgmlf0TQklOAckcG1oNhZKQ7t3FhPceeb4O8yZhgjpa5RIH2zgffyBM9emcaVdF0HKp9D8ebPsGv1+8if3oNkfEFsEYRos8x5zHg26CqVzla1qh6q1uttLTU8fGVO5uoO3PGsTXHWBGhb6ZerbOqlSNg1c3txr5EgJXJAT0eu/GHrfI3RACkG9shDGO314YA+cL73PmvcPHrDnx2/pz+/tmzuiST/CICuNIAV2Y+PEV5KK84LqCf5NyFngggnis2BeLb6BITwKbk2eeYAPRsiv8IMDc5i5vXfQL6yaDJ/3GICRCNSt2FS5cc8ZBkkl9iAmARiM7Ajj8bAtiReozzvwI8WYhlbHaNCbA6g+hq4v5ndyc9iwmwk9+Q4GtFgGjEYGHPAYAIsL+o2kEYMtjuJQLYjnUc4ZQAcWLY0k1NgC3bHkc6NQFxYtjSTboJMNvFlABmFUu2+tQEJFtHzfJJTYBZxZKtPjUBydZRs3xSE2BWsWSrT01AsnXULJ/UBJhVLNnqUxOQ6B3d6f7/AQAA//8RYg5wAAAABklEQVQDAE+cs58uRBE/AAAAAElFTkSuQmCC"}],"source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFFklEQVR4AexY3U9bdRh+esY6OiBlZFhggwkWxmQO5Wu6LSoJF2gg8gdoTEh27YVXmswLl2hissSLaUyWLTGTKy/A6LJhKrhlJoyPLUgJETpE2PhYJ9BSKOLI8Txv+WGFC3dCQk57Svqc9+O8P/g9z/v+Tlu0gYEB/cbFdwW3LrfqjNva2nT6Csxh46ehoUEnamtr9crKSp2WcTyY2yi3vNE6OzsxszgvuD8TBOO+vj78GV4SqJxiEgqFUF9fj5aWFnhLSlBdXS3wer1wZ2VBrNutyi1vta6uLrT9HMWX383i828n0d7eDr/fjy+uLQh4j7l4Jnf7+0EwV1hYSAO3QbqqpkYsRZJkAly0YDAonWMnGxsbpZvsZHNzMwh2NJ7H2tqahLkeD7xlZZiamkJgdBQFBQXIzMxEIpEnES03N1eIqE4G5+YkjkQiGBkZAWNFmgvM1nONlaFxc+xaOByW7rGzzLGzJM/Y6XQytQmz9ZsLLeiIAOw+x5jnmL7aJ880Y+ZVjpY5M/VcY1WIAOw2N8hzTJ/k2H36fNjxOcH7CszTf9p61loVIgDJsts89/Q59oyVv/UIMM/7T1tvVfLcl8bzHBgfR0dHB7q7uxFaWkIgENj0jQ9B8tbGYsJsPddYGZrxoccxODjooPX5fI6tUHlFgrGZerXOqlaOgFU3txv70sbGxvSPWk9uovf2bX1rjrHaDH0z9WqdVa129dO34TppfIpreh73c3TMOjrh/+FDnHijCo+z9+ClF4rAGkWAfsPpCsnPzS9j9bcrUs86BdaoeqtbOQLlK2myzwyXE/7OHgwfycHoUACOsjxcC8/KvfgLvygx9uRkyBemxeVVhgkJEeByYBSBe2OYN4gMr4TQ85MhgmEXAw+gPdG3EbtxcwT3hiYlT7+n/3fQEiovNy142bolran1Al4vP4Jo2l4cPXUCL751Gq++WYdQ9C8cys/GK/sOgDVqIf2Xa4pRXPKMgD7B+7TMs4ZxIkA7YHyrq9t/EHmHM7BHc2B6aALrDx7D7dqHdGcaso4eBmsUGfrP5eciOyNdQJ+A8aNyrDHChHjJQ9D3yzBCE4uYuDWER+MP4R97KJuffRSG78febQ9B1nPUibbve0FwAWPiqvFgZZwI0LhJjq23+FmkZzlReaoCaa69OFZXDu2gGx7P9v/usJ7g2sbXjoGjTzBHMJ8oEAE4uut/L2N6fgmlf0TQklOAckcG1oNhZKQ7t3FhPceeb4O8yZhgjpa5RIH2zgffyBM9emcaVdF0HKp9D8ebPsGv1+8if3oNkfEFsEYRos8x5zHg26CqVzla1qh6q1uttLTU8fGVO5uoO3PGsTXHWBGhb6ZerbOqlSNg1c3txr5EgJXJAT0eu/GHrfI3RACkG9shDGO314YA+cL73PmvcPHrDnx2/pz+/tmzuiST/CICuNIAV2Y+PEV5KK84LqCf5NyFngggnis2BeLb6BITwKbk2eeYAPRsiv8IMDc5i5vXfQL6yaDJ/3GICRCNSt2FS5cc8ZBkkl9iAmARiM7Ajj8bAtiReozzvwI8WYhlbHaNCbA6g+hq4v5ndyc9iwmwk9+Q4GtFgGjEYGHPAYAIsL+o2kEYMtjuJQLYjnUc4ZQAcWLY0k1NgC3bHkc6NQFxYtjSTboJMNvFlABmFUu2+tQEJFtHzfJJTYBZxZKtPjUBydZRs3xSE2BWsWSrT01AsnXULJ/UBJhVLNnqUxOQ6B3d6f7/AQAA//8RYg5wAAAABklEQVQDAE+cs58uRBE/AAAAAElFTkSuQmCC"}],"animations":[{"uuid":"da03ba93-62da-e7bf-f8d5-2d09e9738c0a","name":"love_machine.stopped","loop":"hold","override":false,"length":0.25,"snapping":24,"selected":false,"saved":false,"path":"","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false},"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"eb82dd54-5d75-c50d-1f98-79129ca3cb5b","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"0bc52f8e-b758-fd07-64ee-a7373404fbcc","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c3c9894f-141d-8bb0-6d13-b1ebb7c99f71","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"a7662fa0-ecda-fe83-dd4d-805ea3e75bfc","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"8c700df7-48cf-3a43-e8c8-47e4222f28a7","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"4466ab4f-e8ea-7ab2-3fc1-e5b66c130dd0","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"}]}}},{"uuid":"9ca507c8-13d1-68ba-6521-bc616afb6ff5","name":"love_machine.stopping","loop":"once","override":false,"length":0.5,"snapping":24,"selected":true,"saved":false,"path":"","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false},"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"db405416-38f7-568e-555b-68f64cdb023a","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"6b0ac586-3f78-3f2b-62ee-21f6d2332062","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"b47069fe-74d9-5885-8d87-cbbcc4e5423f","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"c9927200-7f91-eb2e-90a3-fd83ab12d140","time":0,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"9a419448-d859-dbcb-f12b-07bd60e4aedf","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"aad07836-22e7-3fe7-620d-8f557ebdb671","time":0,"color":-1,"uniform":true,"interpolation":"linear"}]}}},{"uuid":"b5c61ef9-4691-d0af-513b-9e55bc10a83a","name":"active","loop":"loop","override":false,"length":1,"snapping":24,"selected":false,"saved":false,"path":"","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false},"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"9776a262-9216-3acb-e8fb-0769f80b2126","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"79e83591-bd14-9fb9-43aa-0ce457e7dcfb","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"19a70cc8-a21e-0dfe-d874-242103976690","time":1,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"3c35e1f9-0b50-5cf5-edd0-b6fd14e80b7a","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"f46bb98e-99ce-d746-2f28-c7d2e5368ad9","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"61fecf56-b9d1-532d-8985-fe585558b4c2","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"a077e058-0477-472a-f9e2-19ab9bf1a385","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"529220c3-a776-c3cd-93b1-a15ccd14db3e","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"8b9b588a-c0ff-4077-e681-8bf6598bd12c","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"9e5c9ca2-a868-0042-4ee4-fde588540149","time":1,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"d40c4074-4c39-815f-1527-2080a666253c","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"6533e95a-776c-e3a0-7789-24d72838b65f","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"2c61db98-c890-3899-b2c7-f8a992dcbc7d","time":1,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"c4fa98d8-765c-456a-58fd-7bbcaeacc3ba","time":0.75,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"14b66b63-9ea6-36fb-a5ee-ca0e7a292bd5","time":0.5,"color":-1,"uniform":false,"interpolation":"linear"}]},"effects":{"name":"效果","type":"effect"}}}],"display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[0,2.5,0],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[0,2.5,0],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[162.6,66,-171.79],"translation":[0.5,0.25,0],"scale":[0.5,0.5,0.5]},"firstperson_lefthand":{"rotation":[162.6,66,-171.79],"translation":[0.5,0.25,0],"scale":[0.5,0.5,0.5]},"ground":{"translation":[0,2,0],"scale":[0.5,0.5,0.5]},"gui":{"rotation":[30,-135,0],"translation":[0,-4.5,0],"scale":[0.84,0.84,0.84]},"head":{"translation":[0,6.25,0]},"fixed":{"rotation":[2,0,0],"translation":[0,-4.25,-7.75]}},"geckolib_model_type":"Item"} \ No newline at end of file +{"meta":{"format_version":"5.0","model_format":"geckolib_model","box_uv":false},"name":"Love Machine","model_identifier":"doll_247 - Converted","front_gui_light":false,"visible_box":[3,2.5,0.75],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"geckolib_modid":"","geckolib_filepath_cache":{"animation":"G:\\OP\\EroticDungeonGame\\src\\main\\resources\\assets\\eroticdungeongame\\animations\\block\\loving_machine.animation.json","model":"G:\\OP\\EroticDungeonGame\\src\\main\\resources\\assets\\eroticdungeongame\\geo\\block\\love_machine.geo.json","display":"G:\\OP\\EroticDungeonGame\\src\\main\\resources\\assets\\eroticdungeongame\\models\\item\\love_machine.json"},"resolution":{"width":64,"height":64},"elements":[{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,-1.925],"to":[5,10,0.075],"autouv":0,"color":0,"origin":[0,5,4.075],"faces":{"north":{"uv":[0,12,10,22],"texture":0},"east":{"uv":[0,0,10,2],"rotation":90,"texture":0},"south":{"uv":[12,12,22,22],"texture":0},"west":{"uv":[0,0,10,2],"rotation":270,"texture":0},"up":{"uv":[0,0,10,2],"texture":0},"down":{"uv":[0,0,10,2],"rotation":180,"texture":0}},"type":"cube","uuid":"fd3e3a99-bff1-60d0-0cef-dec677875407"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,0.075],"to":[1,6,5.075],"autouv":0,"color":2,"origin":[0,5,4.075],"faces":{"north":{"uv":[3,0,8,2],"rotation":90,"texture":null},"east":{"uv":[2,0,7,2],"rotation":180,"texture":0},"south":{"uv":[3,0,8,2],"rotation":90,"texture":null},"west":{"uv":[2,0,7,2],"texture":0},"up":{"uv":[2,0,7,2],"rotation":90,"texture":0},"down":{"uv":[2,0,7,2],"rotation":270,"texture":0}},"type":"cube","uuid":"d51c05af-cba3-c129-6244-53f87af9f8a4"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,0.075],"to":[5,10,8.075],"autouv":0,"color":4,"origin":[0,5,-0.925],"faces":{"north":{"uv":[0,2,10,10],"texture":0},"east":{"uv":[0,2,10,10],"texture":0},"south":{"uv":[0,2,10,10],"texture":0},"west":{"uv":[0,2,10,10],"texture":0},"up":{"uv":[12,0,22,10],"texture":0},"down":{"uv":[12,0,22,10],"texture":0}},"type":"cube","uuid":"901d8692-bc79-bd9a-1326-a0fb7859dd59"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,3,-2.925],"to":[2,7,-1.925],"autouv":0,"color":4,"origin":[0,5,-1.925],"faces":{"north":{"uv":[3,26,7,30],"texture":0},"east":{"uv":[3,30,7,31],"rotation":90,"texture":0},"south":{"uv":[3,26,7,30],"texture":0},"west":{"uv":[3,30,7,31],"rotation":90,"texture":0},"up":{"uv":[3,27,7,28],"texture":0},"down":{"uv":[3,30,7,31],"texture":0}},"type":"cube","uuid":"bb196c15-6055-91c9-3fa9-c443280c214e"},{"name":"cube","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,-10.925],"to":[1,6,-2.925],"autouv":0,"color":4,"origin":[-1,6,-2.925],"faces":{"north":{"uv":[3,24,5,26],"texture":0},"east":{"uv":[1,24,3,39],"rotation":90,"texture":0},"south":{"uv":[1,24,3,26],"texture":0},"west":{"uv":[1,24,3,39],"rotation":90,"texture":0},"up":{"uv":[1,24,3,39],"texture":0},"down":{"uv":[1,24,3,39],"texture":0}},"type":"cube","uuid":"79364c8f-3955-ef7b-e037-4bc9a7e4dede"}],"groups":[{"uuid":"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a","export":true,"locked":false,"origin":[0,24,0],"rotation":[0,0,0],"color":0,"name":"p","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"uuid":"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4","export":true,"locked":false,"origin":[0,5,4.075],"rotation":[0,0,0],"color":0,"name":"ac","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a","isOpen":true,"children":["901d8692-bc79-bd9a-1326-a0fb7859dd59",{"uuid":"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4","isOpen":true,"children":["fd3e3a99-bff1-60d0-0cef-dec677875407","d51c05af-cba3-c129-6244-53f87af9f8a4","bb196c15-6055-91c9-3fa9-c443280c214e","79364c8f-3955-ef7b-e037-4bc9a7e4dede"]}]}],"textures":[{"name":"doll_247.png","relative_path":"H:/Download/doll/doll_247.png","folder":"","namespace":"","id":"2","group":"","width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":true,"sync_to_project":"8b3c4cf5-2d9a-6882-33cd-d32beeb815a3","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"28ae3426-f9a5-6d13-5579-4d9930f92440","layers":[{"name":"layer","offset":[0,0],"scale":[1,1],"opacity":100,"visible":true,"blend_mode":"default","width":64,"height":64,"data_url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFFklEQVR4AexY3U9bdRh+esY6OiBlZFhggwkWxmQO5Wu6LSoJF2gg8gdoTEh27YVXmswLl2hissSLaUyWLTGTKy/A6LJhKrhlJoyPLUgJETpE2PhYJ9BSKOLI8Txv+WGFC3dCQk57Svqc9+O8P/g9z/v+Tlu0gYEB/cbFdwW3LrfqjNva2nT6Csxh46ehoUEnamtr9crKSp2WcTyY2yi3vNE6OzsxszgvuD8TBOO+vj78GV4SqJxiEgqFUF9fj5aWFnhLSlBdXS3wer1wZ2VBrNutyi1vta6uLrT9HMWX383i828n0d7eDr/fjy+uLQh4j7l4Jnf7+0EwV1hYSAO3QbqqpkYsRZJkAly0YDAonWMnGxsbpZvsZHNzMwh2NJ7H2tqahLkeD7xlZZiamkJgdBQFBQXIzMxEIpEnES03N1eIqE4G5+YkjkQiGBkZAWNFmgvM1nONlaFxc+xaOByW7rGzzLGzJM/Y6XQytQmz9ZsLLeiIAOw+x5jnmL7aJ880Y+ZVjpY5M/VcY1WIAOw2N8hzTJ/k2H36fNjxOcH7CszTf9p61loVIgDJsts89/Q59oyVv/UIMM/7T1tvVfLcl8bzHBgfR0dHB7q7uxFaWkIgENj0jQ9B8tbGYsJsPddYGZrxoccxODjooPX5fI6tUHlFgrGZerXOqlaOgFU3txv70sbGxvSPWk9uovf2bX1rjrHaDH0z9WqdVa129dO34TppfIpreh73c3TMOjrh/+FDnHijCo+z9+ClF4rAGkWAfsPpCsnPzS9j9bcrUs86BdaoeqtbOQLlK2myzwyXE/7OHgwfycHoUACOsjxcC8/KvfgLvygx9uRkyBemxeVVhgkJEeByYBSBe2OYN4gMr4TQ85MhgmEXAw+gPdG3EbtxcwT3hiYlT7+n/3fQEiovNy142bolran1Al4vP4Jo2l4cPXUCL751Gq++WYdQ9C8cys/GK/sOgDVqIf2Xa4pRXPKMgD7B+7TMs4ZxIkA7YHyrq9t/EHmHM7BHc2B6aALrDx7D7dqHdGcaso4eBmsUGfrP5eciOyNdQJ+A8aNyrDHChHjJQ9D3yzBCE4uYuDWER+MP4R97KJuffRSG78febQ9B1nPUibbve0FwAWPiqvFgZZwI0LhJjq23+FmkZzlReaoCaa69OFZXDu2gGx7P9v/usJ7g2sbXjoGjTzBHMJ8oEAE4uut/L2N6fgmlf0TQklOAckcG1oNhZKQ7t3FhPceeb4O8yZhgjpa5RIH2zgffyBM9emcaVdF0HKp9D8ebPsGv1+8if3oNkfEFsEYRos8x5zHg26CqVzla1qh6q1uttLTU8fGVO5uoO3PGsTXHWBGhb6ZerbOqlSNg1c3txr5EgJXJAT0eu/GHrfI3RACkG9shDGO314YA+cL73PmvcPHrDnx2/pz+/tmzuiST/CICuNIAV2Y+PEV5KK84LqCf5NyFngggnis2BeLb6BITwKbk2eeYAPRsiv8IMDc5i5vXfQL6yaDJ/3GICRCNSt2FS5cc8ZBkkl9iAmARiM7Ajj8bAtiReozzvwI8WYhlbHaNCbA6g+hq4v5ndyc9iwmwk9+Q4GtFgGjEYGHPAYAIsL+o2kEYMtjuJQLYjnUc4ZQAcWLY0k1NgC3bHkc6NQFxYtjSTboJMNvFlABmFUu2+tQEJFtHzfJJTYBZxZKtPjUBydZRs3xSE2BWsWSrT01AsnXULJ/UBJhVLNnqUxOQ6B3d6f7/AQAA//8RYg5wAAAABklEQVQDAE+cs58uRBE/AAAAAElFTkSuQmCC"}],"source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFFklEQVR4AexY3U9bdRh+esY6OiBlZFhggwkWxmQO5Wu6LSoJF2gg8gdoTEh27YVXmswLl2hissSLaUyWLTGTKy/A6LJhKrhlJoyPLUgJETpE2PhYJ9BSKOLI8Txv+WGFC3dCQk57Svqc9+O8P/g9z/v+Tlu0gYEB/cbFdwW3LrfqjNva2nT6Csxh46ehoUEnamtr9crKSp2WcTyY2yi3vNE6OzsxszgvuD8TBOO+vj78GV4SqJxiEgqFUF9fj5aWFnhLSlBdXS3wer1wZ2VBrNutyi1vta6uLrT9HMWX383i828n0d7eDr/fjy+uLQh4j7l4Jnf7+0EwV1hYSAO3QbqqpkYsRZJkAly0YDAonWMnGxsbpZvsZHNzMwh2NJ7H2tqahLkeD7xlZZiamkJgdBQFBQXIzMxEIpEnES03N1eIqE4G5+YkjkQiGBkZAWNFmgvM1nONlaFxc+xaOByW7rGzzLGzJM/Y6XQytQmz9ZsLLeiIAOw+x5jnmL7aJ880Y+ZVjpY5M/VcY1WIAOw2N8hzTJ/k2H36fNjxOcH7CszTf9p61loVIgDJsts89/Q59oyVv/UIMM/7T1tvVfLcl8bzHBgfR0dHB7q7uxFaWkIgENj0jQ9B8tbGYsJsPddYGZrxoccxODjooPX5fI6tUHlFgrGZerXOqlaOgFU3txv70sbGxvSPWk9uovf2bX1rjrHaDH0z9WqdVa129dO34TppfIpreh73c3TMOjrh/+FDnHijCo+z9+ClF4rAGkWAfsPpCsnPzS9j9bcrUs86BdaoeqtbOQLlK2myzwyXE/7OHgwfycHoUACOsjxcC8/KvfgLvygx9uRkyBemxeVVhgkJEeByYBSBe2OYN4gMr4TQ85MhgmEXAw+gPdG3EbtxcwT3hiYlT7+n/3fQEiovNy142bolran1Al4vP4Jo2l4cPXUCL751Gq++WYdQ9C8cys/GK/sOgDVqIf2Xa4pRXPKMgD7B+7TMs4ZxIkA7YHyrq9t/EHmHM7BHc2B6aALrDx7D7dqHdGcaso4eBmsUGfrP5eciOyNdQJ+A8aNyrDHChHjJQ9D3yzBCE4uYuDWER+MP4R97KJuffRSG78febQ9B1nPUibbve0FwAWPiqvFgZZwI0LhJjq23+FmkZzlReaoCaa69OFZXDu2gGx7P9v/usJ7g2sbXjoGjTzBHMJ8oEAE4uut/L2N6fgmlf0TQklOAckcG1oNhZKQ7t3FhPceeb4O8yZhgjpa5RIH2zgffyBM9emcaVdF0HKp9D8ebPsGv1+8if3oNkfEFsEYRos8x5zHg26CqVzla1qh6q1uttLTU8fGVO5uoO3PGsTXHWBGhb6ZerbOqlSNg1c3txr5EgJXJAT0eu/GHrfI3RACkG9shDGO314YA+cL73PmvcPHrDnx2/pz+/tmzuiST/CICuNIAV2Y+PEV5KK84LqCf5NyFngggnis2BeLb6BITwKbk2eeYAPRsiv8IMDc5i5vXfQL6yaDJ/3GICRCNSt2FS5cc8ZBkkl9iAmARiM7Ajj8bAtiReozzvwI8WYhlbHaNCbA6g+hq4v5ndyc9iwmwk9+Q4GtFgGjEYGHPAYAIsL+o2kEYMtjuJQLYjnUc4ZQAcWLY0k1NgC3bHkc6NQFxYtjSTboJMNvFlABmFUu2+tQEJFtHzfJJTYBZxZKtPjUBydZRs3xSE2BWsWSrT01AsnXULJ/UBJhVLNnqUxOQ6B3d6f7/AQAA//8RYg5wAAAABklEQVQDAE+cs58uRBE/AAAAAElFTkSuQmCC"}],"animations":[{"uuid":"da03ba93-62da-e7bf-f8d5-2d09e9738c0a","name":"love_machine.stopped","loop":"hold","override":false,"length":0.25,"snapping":24,"selected":false,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/loving_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false},"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"eb82dd54-5d75-c50d-1f98-79129ca3cb5b","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"0bc52f8e-b758-fd07-64ee-a7373404fbcc","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c3c9894f-141d-8bb0-6d13-b1ebb7c99f71","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"a7662fa0-ecda-fe83-dd4d-805ea3e75bfc","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"8c700df7-48cf-3a43-e8c8-47e4222f28a7","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"4466ab4f-e8ea-7ab2-3fc1-e5b66c130dd0","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"}]}}},{"uuid":"9ca507c8-13d1-68ba-6521-bc616afb6ff5","name":"love_machine.stopping","loop":"once","override":false,"length":0.5,"snapping":24,"selected":false,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/loving_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","markers":[{"color":0,"time":0}],"animators":{"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false},"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"db405416-38f7-568e-555b-68f64cdb023a","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1c7a617d-ec2a-4cd9-e05e-dc475ef844d0","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"30cd413a-e97b-5ee1-6cbd-54b556dcf197","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"b47069fe-74d9-5885-8d87-cbbcc4e5423f","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"86cdbd20-c35b-6cfe-1297-d0a72d6782ce","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"a9fb0eb4-0baa-bfba-6001-46661f5e4627","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"9a419448-d859-dbcb-f12b-07bd60e4aedf","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"3a2274b3-81a1-40da-838c-0ed921f71d04","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"d42d7896-021b-6f44-0d1e-f48ab72f61e9","time":0.5,"color":-1,"uniform":true,"interpolation":"linear"}]},"effects":{"name":"效果","type":"effect","keyframes":[{"channel":"sound","data_points":[{"effect":"out","locator":"","file":"G:\\OP\\EroticDungeonGame\\src\\main\\resources\\assets\\eroticdungeongame\\sounds\\piston\\out.ogg"}],"uuid":"5224a3cf-2692-c678-d39e-cff045b8fc8f","time":0,"color":-1,"interpolation":"linear"}]}}},{"uuid":"b5c61ef9-4691-d0af-513b-9e55bc10a83a","name":"love_machine.active","loop":"loop","override":false,"length":1.25,"snapping":24,"selected":true,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/loving_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"8fdc0cb6-ffb3-5184-9bb9-b8f29ddf6a8a":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false},"b72f4640-d5b0-ddfd-6ed9-18c4e85637d4":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"9776a262-9216-3acb-e8fb-0769f80b2126","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"79e83591-bd14-9fb9-43aa-0ce457e7dcfb","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"f46bb98e-99ce-d746-2f28-c7d2e5368ad9","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"a48450b3-a84e-5672-1dfc-a75412942363","time":1.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"33fa6280-e266-13c3-ee5b-869a2613e2e2","time":1,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"421e671d-db36-5f4b-7aaa-1da3fd9fb3ad","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"61fecf56-b9d1-532d-8985-fe585558b4c2","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"a077e058-0477-472a-f9e2-19ab9bf1a385","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"529220c3-a776-c3cd-93b1-a15ccd14db3e","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"99f4a94e-676d-fd06-ac81-11f0f8fe3fcc","time":1.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"993401f2-f232-5c06-f80c-4ccb9e723e7b","time":1,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"5f1ca0f3-8ce2-47b7-edad-c27895b612b5","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"d40c4074-4c39-815f-1527-2080a666253c","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"6533e95a-776c-e3a0-7789-24d72838b65f","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"14b66b63-9ea6-36fb-a5ee-ca0e7a292bd5","time":0.5,"color":-1,"uniform":false,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"93b4806a-cc7d-9fcb-0243-bc6573330381","time":1.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"b1713e47-1f5b-966f-4e18-2203bbce5bc4","time":1,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"f543ab33-87d1-31e4-0e8d-c6aaa43aa3c9","time":0.75,"color":-1,"uniform":true,"interpolation":"linear"}]},"effects":{"name":"效果","type":"effect","keyframes":[{"channel":"sound","data_points":[{"effect":"in","locator":"","file":"G:\\OP\\EroticDungeonGame\\src\\main\\resources\\assets\\eroticdungeongame\\sounds\\piston\\in.ogg"}],"uuid":"7522364e-ec8f-2799-cc80-3105a85665ed","time":0,"color":-1,"interpolation":"linear"},{"channel":"sound","data_points":[{"effect":"in","locator":"","file":"G:\\OP\\EroticDungeonGame\\src\\main\\resources\\assets\\eroticdungeongame\\sounds\\piston\\out.ogg"}],"uuid":"2fe9c390-2cd9-3ce6-323d-08b397c2c198","time":0.75,"color":-1,"interpolation":"linear"}]}}}],"display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[0,2.5,0],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[0,2.5,0],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[162.6,66,-171.79],"translation":[0.5,0.25,0],"scale":[0.5,0.5,0.5]},"firstperson_lefthand":{"rotation":[162.6,66,-171.79],"translation":[0.5,0.25,0],"scale":[0.5,0.5,0.5]},"ground":{"translation":[0,2,0],"scale":[0.5,0.5,0.5]},"gui":{"rotation":[30,-135,0],"translation":[0,-4.5,0],"scale":[0.84,0.84,0.84]},"head":{"translation":[0,6.25,0]},"fixed":{"rotation":[2,0,0],"translation":[0,-4.25,-7.75]}},"geckolib_model_type":"Item"} \ No newline at end of file diff --git a/model_source/blockbench/love_machine.geo - Converted.bbmodel b/model_source/blockbench/love_machine.geo - Converted.bbmodel new file mode 100644 index 00000000..337ff9af --- /dev/null +++ b/model_source/blockbench/love_machine.geo - Converted.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"geckolib_model","box_uv":false},"name":"love_machine.geo - Converted","model_identifier":"doll_247 - Converted","front_gui_light":false,"visible_box":[3,2.5,0.75],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"geckolib_modid":"","geckolib_filepath_cache":{},"resolution":{"width":64,"height":64},"elements":[{"name":"p","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,0.075],"to":[5,10,8.075],"autouv":0,"color":0,"origin":[0,0,0],"faces":{"north":{"uv":[0,2,10,10],"texture":0},"east":{"uv":[24,0,32,10],"texture":0},"south":{"uv":[0,2,10,10],"texture":0},"west":{"uv":[24,0,32,10],"texture":0},"up":{"uv":[10,2,0,10],"texture":0},"down":{"uv":[0,2,10,10],"texture":0}},"type":"cube","uuid":"5145812d-fbfc-c0f3-cbdf-acac670d7539"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,-1.925],"to":[5,10,0.075],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[0,12,10,22],"texture":0},"east":{"uv":[32,0,34,10],"texture":0},"south":{"uv":[12,12,22,22],"texture":0},"west":{"uv":[34,0,32,10],"texture":0},"up":{"uv":[0,0,10,2],"texture":0},"down":{"uv":[0,0,10,2],"rotation":180,"texture":0}},"type":"cube","uuid":"30b4ea14-2b24-f7c8-929b-de36d8fb1c3c"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,0.075],"to":[1,6,5.075],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[2,0,7,2],"rotation":180,"texture":0},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[2,0,7,2],"texture":0},"up":{"uv":[32,8,34,3],"texture":0},"down":{"uv":[32,3,34,8],"texture":0}},"type":"cube","uuid":"1ba7ac49-aefa-6633-6acd-6f58bdb6ddcb"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,3,-2.925],"to":[2,7,-1.925],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[3,26,7,30],"texture":0},"east":{"uv":[15,26,16,30],"texture":0},"south":{"uv":[3,26,7,30],"texture":0},"west":{"uv":[15,26,16,30],"texture":0},"up":{"uv":[3,27,7,28],"texture":0},"down":{"uv":[3,30,7,31],"texture":0}},"type":"cube","uuid":"fd1c1f48-08b6-a1ef-1e63-ba6389852072"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,-10.925],"to":[1,6,-2.925],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[3,24,5,26],"texture":0},"east":{"uv":[10,30,25,32],"texture":0},"south":{"uv":[1,24,3,26],"texture":0},"west":{"uv":[10,30,25,32],"texture":0},"up":{"uv":[1,24,3,39],"texture":0},"down":{"uv":[1,24,3,39],"texture":0}},"type":"cube","uuid":"22dda551-9dd0-0742-27df-d7c496bad6e7"},{"name":"p","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-24,31,-11.925],"to":[-14,39,-1.925],"autouv":0,"color":0,"origin":[-19,31,-12],"faces":{"north":{"uv":[0,2,10,10],"texture":0},"east":{"uv":[0,2,10,10],"texture":0},"south":{"uv":[0,2,10,10],"texture":0},"west":{"uv":[0,2,10,10],"texture":0},"up":{"uv":[22,0,12,10],"texture":0},"down":{"uv":[12,0,22,10],"texture":0}},"type":"cube","uuid":"b0063d6a-62fd-7755-f276-69d9482677bb"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-24,29,-11.925],"to":[-14,31,-1.925],"autouv":0,"color":1,"origin":[-19,29,-10],"faces":{"north":{"uv":[0,2,10,0],"texture":0},"east":{"uv":[10,2,0,0],"texture":0},"south":{"uv":[0,2,10,0],"texture":0},"west":{"uv":[0,2,10,0],"texture":0},"up":{"uv":[12,12,22,22],"texture":0},"down":{"uv":[0,12,10,22],"rotation":180,"texture":0}},"type":"cube","uuid":"8a43a1c0-21f9-9ffe-74f9-16a02380af3f"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-20,31,-7.925],"to":[-18,36,-5.925],"autouv":0,"color":1,"origin":[-19,27,-8],"faces":{"north":{"uv":[32,3,34,8],"texture":0},"east":{"uv":[32,2,34,7],"rotation":180,"texture":0},"south":{"uv":[32,3,34,8],"texture":0},"west":{"uv":[32,3,34,8],"texture":0},"up":{"uv":[23,8,25,3],"texture":null},"down":{"uv":[23,3,25,8],"texture":null}},"type":"cube","uuid":"91497ac7-eb4e-ce53-f496-67c1df9e31da"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-21,28,-8.925],"to":[-17,29,-4.925],"autouv":0,"color":1,"origin":[-19,25,-6],"faces":{"north":{"uv":[3,26,7,30],"texture":0},"east":{"uv":[3,29,7,30],"texture":0},"south":{"uv":[3,29,7,30],"texture":0},"west":{"uv":[3,28,7,29],"texture":0},"up":{"uv":[14,26,18,30],"texture":0},"down":{"uv":[14,26,18,30],"texture":0}},"type":"cube","uuid":"62041924-21db-a73f-54d9-9c1d4884d1a7"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-20,20,-7.925],"to":[-18,28,-5.925],"autouv":0,"color":1,"origin":[-19,16,3],"faces":{"north":{"uv":[1,24,3,39],"texture":0},"east":{"uv":[1,24,3,39],"texture":0},"south":{"uv":[1,24,3,39],"texture":0},"west":{"uv":[3,39,1,24],"texture":0},"up":{"uv":[3,24,5,26],"texture":0},"down":{"uv":[3,24,5,26],"texture":0}},"type":"cube","uuid":"d941fc52-130e-ebe7-5771-7eaa198a87db"}],"groups":[{"uuid":"005148cb-f3e3-c623-b776-a0ac5841043b","export":true,"locked":false,"origin":[0,5,-0.925],"rotation":[0,0,0],"color":1,"name":"ac","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"uuid":"60584140-e9cf-8320-53ea-4bce3c15567a","export":true,"locked":false,"origin":[-19,10,-5.925],"rotation":[0,0,0],"color":1,"name":"ac2","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":true},{"uuid":"2ebcac2d-4f34-4039-49c7-45b121d21cfb","export":true,"locked":false,"origin":[0,24,0],"rotation":[0,0,0],"color":0,"name":"p","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"uuid":"03e436f0-4baf-2b4d-a8e8-87d5ba868c3a","export":true,"locked":false,"origin":[-19,24,0],"rotation":[0,0,0],"color":0,"name":"p2","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"2ebcac2d-4f34-4039-49c7-45b121d21cfb","isOpen":true,"children":["5145812d-fbfc-c0f3-cbdf-acac670d7539",{"uuid":"005148cb-f3e3-c623-b776-a0ac5841043b","isOpen":true,"children":["30b4ea14-2b24-f7c8-929b-de36d8fb1c3c","1ba7ac49-aefa-6633-6acd-6f58bdb6ddcb","fd1c1f48-08b6-a1ef-1e63-ba6389852072","22dda551-9dd0-0742-27df-d7c496bad6e7"]}]},{"uuid":"03e436f0-4baf-2b4d-a8e8-87d5ba868c3a","isOpen":true,"children":["b0063d6a-62fd-7755-f276-69d9482677bb",{"uuid":"60584140-e9cf-8320-53ea-4bce3c15567a","isOpen":true,"children":["8a43a1c0-21f9-9ffe-74f9-16a02380af3f","91497ac7-eb4e-ce53-f496-67c1df9e31da","62041924-21db-a73f-54d9-9c1d4884d1a7","d941fc52-130e-ebe7-5771-7eaa198a87db"]}]}],"textures":[{"name":"love_machine.png","relative_path":"../../src/main/resources/assets/eroticdungeongame/textures/block/love_machine.png","folder":"","namespace":"","id":"0","group":"","width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":true,"sync_to_project":"915f7e10-9d9f-9cdb-3b8b-fffa4b4ca1a0","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"4a1c29e5-3b5c-f51a-64e2-c7780e2bd047","layers":[{"name":"layer","offset":[0,0],"scale":[1,1],"opacity":100,"visible":true,"blend_mode":"default","width":64,"height":64,"data_url":"data:image/png;base64,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"}],"source":"data:image/png;base64,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"}],"animations":[{"uuid":"f5daa543-6682-263d-22a4-512b3020c804","name":"love_machine.stopped","loop":"hold","override":false,"length":0.25,"snapping":12,"selected":false,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"005148cb-f3e3-c623-b776-a0ac5841043b":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"da55c125-9141-a235-cb4e-ea2d32446c43","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"8009f0ad-ba36-a542-4f00-206090e413ec","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"9f7a3e8f-69b3-a88e-28ad-3ad1c4db9536","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"febaed58-e2e8-7729-e37a-c878e18b3061","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"293c4030-1484-d665-0542-73c56e51e671","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"6f72f3a8-b378-7b9a-94da-a7d986aa4109","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"}]}}},{"uuid":"db50b1a9-8716-2a0e-0501-46ee486144af","name":"love_machine.stopping","loop":"once","override":false,"length":0.5,"snapping":12,"selected":false,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"005148cb-f3e3-c623-b776-a0ac5841043b":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c468d6c5-78cb-f8b2-1639-696ba61b42bb","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"d8475a9c-aae9-f8f2-10a4-4d676d0f27f2","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7ea356c4-83b1-1eb5-19f6-b3b7e8fede86","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"434f8c0b-d959-a1b0-25b1-176f4e4f654a","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"9e0f30c9-a49f-c025-7302-cd4a4a1564b2","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"18400c07-64cb-7c01-1403-8069830b0f9d","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"e20177bb-f790-5f3a-3200-b707f769e660","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"ca43c25f-94f3-d258-d27d-8ec411ceda5f","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"1c29a251-b6ef-4b38-0fe7-7bfc0d8c3ba7","time":0.5,"color":-1,"uniform":true,"interpolation":"linear"}]},"effects":{"name":"效果","type":"effect","keyframes":[{"channel":"sound","data_points":[{"effect":"eroticdungeongame:out","locator":"","file":""}],"uuid":"7cd848df-8a5b-8d4d-bc31-f5e45d64a13c","time":0,"color":-1,"interpolation":"linear"}]}}},{"uuid":"fd952d2f-cd2a-0419-ef6b-a74dec827c72","name":"love_machine.active","loop":"loop","override":false,"length":1.25,"snapping":12,"selected":false,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"005148cb-f3e3-c623-b776-a0ac5841043b":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"967c4fc6-4b06-ab21-7f40-fa15ae6b2dde","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"651908a2-712a-ee51-ecd6-a8a7144473d4","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7d49dd89-ce2f-5ef5-b891-d4a942dc2b95","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7dc992b8-c467-cf09-4427-1457d645f67f","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"f00981c7-e69f-efea-668f-2c9e8c8917ca","time":1,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"f870f445-df38-44bc-4360-a2cdc3d2c42b","time":1.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"8e54ed46-a6e0-ff32-2ad4-1a41c3d8257a","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"61178596-6818-1f88-e445-75f6f271fe02","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"de153d95-f7b4-ca4a-c853-c2e4c61b4e95","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"aca4dac3-ff41-4828-ac33-608eca990290","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"38ba5274-e993-2b17-243e-8844a4854c3b","time":1,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"2005067d-1c82-e83b-de0f-b345e55f8f6d","time":1.25,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"f3ee06f3-84e0-1fb7-bc79-8d49c224dd26","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"283bdb8e-3aed-5cbe-81d2-e2e8162ae49c","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"08604260-b8f3-35ec-fa81-4133bdd77050","time":0.5,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"05b921c6-34e4-2b7e-3a52-2d0244eaefa6","time":0.75,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"647a7b8f-cc9e-d7f3-c1a7-aabb74dcdef3","time":1,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"e97f665b-26e3-ee30-60db-4c8f21287256","time":1.25,"color":-1,"uniform":true,"interpolation":"linear"}]},"effects":{"name":"效果","type":"effect","keyframes":[{"channel":"sound","data_points":[{"effect":"eroticdungeongame:in","locator":"","file":""}],"uuid":"eee80f0b-e653-dfa7-648d-bec95fe78b2c","time":0,"color":-1,"interpolation":"linear"},{"channel":"sound","data_points":[{"effect":"eroticdungeongame:in","locator":"","file":""}],"uuid":"8ff6572c-7e7f-3088-6b86-4200705ef6e6","time":0.75,"color":-1,"interpolation":"linear"}]}}}],"geckolib_model_type":"Entity"} \ No newline at end of file diff --git a/model_source/blockbench/love_machine.geo.bbmodel b/model_source/blockbench/love_machine.geo.bbmodel new file mode 100644 index 00000000..91c319d3 --- /dev/null +++ b/model_source/blockbench/love_machine.geo.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"bedrock","box_uv":false},"name":"love_machine.geo","model_identifier":"love_machine","visible_box":[3,2.5,0.75],"variable_placeholders":"","variable_placeholder_buttons":[],"bedrock_animation_mode":"entity","timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"p","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,-2.925],"to":[5,10,5.075],"autouv":0,"color":0,"origin":[0,0,-3],"faces":{"north":{"uv":[12,0,22,10],"texture":0},"east":{"uv":[24,0,32,10],"texture":0},"south":{"uv":[12,0,22,10],"texture":0},"west":{"uv":[24,0,32,10],"texture":0},"up":{"uv":[10,2,0,10],"texture":0},"down":{"uv":[0,2,10,10],"texture":0}},"type":"cube","uuid":"6c3bb0cd-0409-02cd-7a3c-8e9df2a7a9f4"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-5,0,-4.925],"to":[5,10,-2.925],"autouv":0,"color":1,"origin":[0,0,-3],"faces":{"north":{"uv":[0,12,10,22],"texture":0},"east":{"uv":[32,0,34,10],"texture":0},"south":{"uv":[12,12,22,22],"texture":0},"west":{"uv":[34,0,32,10],"texture":0},"up":{"uv":[0,0,10,2],"texture":0},"down":{"uv":[0,0,10,2],"rotation":180,"texture":0}},"type":"cube","uuid":"010afe99-a94e-9998-a4aa-334dfc521e91"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,-2.925],"to":[1,6,2.075],"autouv":0,"color":1,"origin":[0,0,-3],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[2,0,7,2],"rotation":180,"texture":0},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[2,0,7,2],"texture":0},"up":{"uv":[32,8,34,3],"texture":0},"down":{"uv":[32,3,34,8],"texture":0}},"type":"cube","uuid":"c9a375ef-9739-907c-6280-a65e9966bdd8"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,3,-5.925],"to":[2,7,-4.925],"autouv":0,"color":1,"origin":[0,0,-3],"faces":{"north":{"uv":[3,26,7,30],"texture":0},"east":{"uv":[15,26,16,30],"texture":0},"south":{"uv":[3,26,7,30],"texture":0},"west":{"uv":[15,26,16,30],"texture":0},"up":{"uv":[3,27,7,28],"texture":0},"down":{"uv":[3,30,7,31],"texture":0}},"type":"cube","uuid":"9d7136cd-5d52-6704-da31-25e708091f2b"},{"name":"ac","box_uv":false,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,4,-13.925],"to":[1,6,-5.925],"autouv":0,"color":1,"origin":[0,0,-3],"faces":{"north":{"uv":[3,24,5,26],"texture":0},"east":{"uv":[10,30,25,32],"texture":0},"south":{"uv":[1,24,3,26],"texture":0},"west":{"uv":[10,30,25,32],"texture":0},"up":{"uv":[1,24,3,39],"texture":0},"down":{"uv":[1,24,3,39],"texture":0}},"type":"cube","uuid":"b52f42ef-86dc-d258-d773-e359d4c784a2"}],"groups":[{"uuid":"833d62b5-df4c-b0da-9bb3-883aadac44cc","export":true,"locked":false,"origin":[0,5,0],"rotation":[0,0,0],"bedrock_binding":"","color":0,"name":"p","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"uuid":"d9873a37-9136-475c-7614-ad76aca9ec07","export":true,"locked":false,"origin":[0,5,1.075],"rotation":[0,0,0],"bedrock_binding":"","color":1,"name":"ac","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"uuid":"ea22e810-9b8e-e90f-50a2-c03bbb230d1c","export":true,"locked":false,"origin":[0,0,-3],"rotation":[0,0,0],"bedrock_binding":"","color":0,"name":"VoxelShapes","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":true}],"outliner":[{"uuid":"833d62b5-df4c-b0da-9bb3-883aadac44cc","isOpen":true,"children":[{"uuid":"d9873a37-9136-475c-7614-ad76aca9ec07","isOpen":true,"children":["c9a375ef-9739-907c-6280-a65e9966bdd8","9d7136cd-5d52-6704-da31-25e708091f2b","b52f42ef-86dc-d258-d773-e359d4c784a2"]}]},{"uuid":"ea22e810-9b8e-e90f-50a2-c03bbb230d1c","isOpen":true,"children":["010afe99-a94e-9998-a4aa-334dfc521e91","6c3bb0cd-0409-02cd-7a3c-8e9df2a7a9f4"]}],"textures":[{"name":"love_machine.png","relative_path":"../../src/main/resources/assets/eroticdungeongame/textures/block/love_machine.png","folder":"","namespace":"","id":"0","group":"","width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"ec0aa354-4566-6f08-5b5d-8a273b804a0a","source":"data:image/png;base64,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"}],"animations":[{"uuid":"6a20febf-574c-254d-e7da-47133bca3c39","name":"love_machine.stopped","loop":"hold","override":false,"length":0.25,"snapping":12,"selected":false,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"d9873a37-9136-475c-7614-ad76aca9ec07":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"3a2689f0-91df-0c0c-17f5-a8900f25489a","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"44d502df-4a65-99a4-aa1b-a9259f0450b2","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"40fae50c-b817-d5ac-ad25-3e10ed90de09","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"271d4a7b-124d-f0a9-47f5-1fe84c0cbe0a","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"15c3aa6f-f6f8-ff60-a8dc-b5a3ab73cdfd","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"1d398190-0864-2c0c-0553-0b121cb5ed06","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"}]},"833d62b5-df4c-b0da-9bb3-883aadac44cc":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false}}},{"uuid":"59e609e6-233b-478b-af69-0cf64767801d","name":"love_machine.stopping","loop":"once","override":false,"length":0.5,"snapping":12,"selected":false,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"d9873a37-9136-475c-7614-ad76aca9ec07":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"6cd4b427-25ff-86cf-2a3b-52f5324337a4","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"002be1f5-609e-98e5-2f15-02385142da42","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"5ae4804f-23e8-a424-4a9c-5927d8e7d553","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"4fde9e51-3d89-586d-6824-1cbe1cc0b891","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"b4a9fdfb-73b7-3c81-a2a0-d8842cbc24cd","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"a2a618e2-29bb-3872-3580-251fa118fc83","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"37372dc0-7cfb-9625-9a2a-0366d3d5d51d","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"5454db19-110a-abef-563d-545378327ef5","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"dc58ae6a-e584-1878-db59-b231019d38ea","time":0.5,"color":-1,"uniform":true,"interpolation":"linear"}]},"effects":{"name":"效果","type":"effect","keyframes":[{"channel":"sound","data_points":[{"effect":"eroticdungeongame:out","locator":"","file":""}],"uuid":"f7874582-8162-8012-c74f-e2e5ed3be139","time":0,"color":-1,"interpolation":"linear"}]},"833d62b5-df4c-b0da-9bb3-883aadac44cc":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false}}},{"uuid":"ce64641c-cb59-a221-d358-f64ecf6c8e51","name":"love_machine.active","loop":"loop","override":false,"length":1.25,"snapping":12,"selected":true,"saved":true,"path":"../../src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json","anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"d9873a37-9136-475c-7614-ad76aca9ec07":{"name":"ac","type":"bone","rotation_global":false,"quaternion_interpolation":false,"keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7445e2a2-6cd0-462c-11a0-090ad37cff37","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"76a168ee-752e-e60f-dc62-cf2a60111841","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"a4b088d7-d93d-1902-3cdc-1868aa321b26","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1db83345-4239-b51e-85eb-5a075e58e4f5","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"93d01f56-1f07-6c0e-f9cf-883563a382e2","time":1,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"9b52ddec-44bc-d7f8-5e90-72101fd1f844","time":1.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"eaa353e6-2ba5-48df-7cb3-27ee3a92ead2","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"d2bf71a4-f6ec-82e2-7890-b71c89ebe959","time":0.25,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"adddbc20-c95c-70f5-776a-3e8401320a66","time":0.5,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"ff294aee-c2a7-1b62-2300-b928bad7bce8","time":0.75,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-5"}],"uuid":"0326be5f-7bd9-cc62-6e62-d7bef8bd044f","time":1,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c0c1bd2c-11d5-e4ef-6fbc-df347078b284","time":1.25,"color":-1,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"655e9315-1524-4ca3-49f0-565ebd1090ed","time":0,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"6d6aad4b-572a-f20e-c907-70e580984aed","time":0.25,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"74d8b31c-bb71-baa5-3115-12e486eddfed","time":0.5,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"54cd98bd-8175-e8db-6428-3ff55017884b","time":0.75,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"7cada730-3adc-5859-d5e1-f6001cc3af76","time":1,"color":-1,"uniform":true,"interpolation":"linear"},{"channel":"scale","data_points":[{"x":"1","y":"1","z":"1"}],"uuid":"d727f726-d4df-4bee-d3a0-a91a07cd70b4","time":1.25,"color":-1,"uniform":true,"interpolation":"linear"}]},"effects":{"name":"效果","type":"effect","keyframes":[{"channel":"sound","data_points":[{"effect":"eroticdungeongame:in","locator":"","file":""}],"uuid":"acb7ef4a-1e23-5842-e22a-ca8fd59492df","time":0,"color":-1,"interpolation":"linear"},{"channel":"sound","data_points":[{"effect":"eroticdungeongame:in","locator":"","file":""}],"uuid":"1292bb51-c357-7143-6c2e-bbb16713687d","time":0.75,"color":-1,"interpolation":"linear"}]},"833d62b5-df4c-b0da-9bb3-883aadac44cc":{"name":"p","type":"bone","rotation_global":false,"quaternion_interpolation":false}}}]} \ No newline at end of file diff --git a/model_source/blockbench/love_machine.png b/model_source/blockbench/love_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf491f74e57c0096f4423b7c5cfc903c82052d4 GIT binary patch literal 1538 zcmV+d2L1VoP)$R2!8{^&27M@kvKvyXyOCUMqif9nCP1i#u)c7vlxwgF+P|r z@}kB^eNZD0Bf2bt16*(*3>umIDbQw&w$K(fcD>(I&fRSbTRNAu_4bo+d(OGPd%5TP z`*Th&SVl%h6yLySAo+3_=-IZu>6p*-5>BqCr$@B^7#>E6(1kEcDop_sHni)+?=p?Pffue4646- z0KS3iNEMd;{(jN8=g}qcfMa9#jQsxZVlLvuC7e_s5D?eMHt!{2gdA;c71vOpx`qZ6 z6ch+SX6NTs3oBBIg`rqiQ-iv?x)@Ks(9t0bCMG7Jripd|MIzGk^r+sReLXV#dEVpk zXyR~O-ixW1D$LA7dWGI2(o1V=Yhv>3%LgUN+7o)8=jeGN!e14F(XnWLPSluGVdjAk zBSV*-CDOC(^Fj3_YtJ#Blc_?%*k_ydhDA432m$C#dPU~3gt^Opd=-BfdqTnZ!$^=R zbE0Y?X2p5jSa^_m>vFlYFqW{*I-w_7d%0Rr2w6aznwpRfhzQ_A(|gQg8OH4I7ShSs z%QTT9$u@-}TxL^=MO1y&V_cGC=yH9QYq@@0oJ-Q4ZLT6LjI@)>ZFC7#_Z{X=96H>s zwtA5YQnLF>CoC{Hmg(tf<*Scg(*|BSc@9Ntp6bV5fA4G5*Vl_^N!C8yvGBpI$6eS{ zQi##t#<67T!@>`fIP~&S^bd^U#ftKn$+6w_d^2tag82E@2}G{O|(;8$^Q#t=3ly};99X`MV-jH zS*_L=2jQ^hs(V(y5G5XZo|BhtJ#su#FkQKPS-Eue6O66|QQ2ILLZ<^tU=5dkx`G2W zPBevc(cJMajJw%$J7v9N$0%YPEf`FF9$Y=Y<74V0>1 z&KLoCITqL}pAtn*!gg(0iIxUW6xhY*AZAc#%hPN!1=H!1$Hg0-rSiRq1UIpzTNoMs z=A|%7)xk5pzYC8_d&%<3y4Kc*zqC(x#B{4`O0mzSzNMMDfx0907{5A&`h&HYU%UyY zk^{xF9&-`x$;{tgymX=|p$Kw3QxK~FLwD=;Iy`C}sQ+gTJ;g3Gnrzte1z^idEP}LW z8c6T6FUMpWWC|vuZ-lbn1z>Q50HN8Dn981C*^{Tba9~eQ1QILjjM1$Ra*? z{|h)P_lpzDvr9O4;X*BFD?>^AOdD|1`Wc4D1!@9c`sdXhPMi}Xh@Qe})DX>~$Qh~wPj(}CwRjV)}*{!hF zQVW+6i3*_Z0>gJ;NU|xwLwF5_CHq1I1}FL-B4^&#zT^ZqZsEY$Zw&TA1ks5HHg2OJ zcQ1^DCIBZthc7mZ(r?DYCe;q%MiWK zhu&%O;(RC~e%2!!+Gn+^REWVpflv@a0eQZ?xfTlnZ-Nl%h!B9D`_ny(H@+X-(NnvP z@5W!vwFP4P1}7^33{F-67#zb3@Gk%W o0RR8GErIO-000I_L_t&o0Np+W4OVn}2><{907*qoM6N<$g3KA-eE new") public static @NotNull ResourceLocation rl(String path) { @@ -71,4 +74,21 @@ public class EroticDungeon { public static Logger getLogger() { return LOGGER; } + /** + * The type Mod info. + */ + public static class ModInfo { + /** + * The constant VERSION. + */ + public static final String VERSION; + static { + // 从 ModList 获取当前 ModContainer 的元数据 + VERSION = ModList.get() + .getModContainerById(MOD_ID) + .map(c -> c.getModInfo().getVersion().toString()) + .orElse("UNKNOWN"); + } + } + } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/api/event/LoveMachineTickEvent.java b/src/main/java/top/r3944realms/eroticdungeongame/api/event/LoveMachineTickEvent.java new file mode 100644 index 00000000..c7490471 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/api/event/LoveMachineTickEvent.java @@ -0,0 +1,48 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.api.event; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.event.IModBusEvent; + +@Cancelable +public class LoveMachineTickEvent extends Event implements IModBusEvent { + private final Entity entity; + private final BlockEntity loveMachineBlockEntity; + private final long tick; + + public LoveMachineTickEvent(Entity entity, BlockEntity loveMachineBlockEntity, long tick) { + this.entity = entity; + this.loveMachineBlockEntity = loveMachineBlockEntity; + this.tick = tick; + } + + public Entity getEntity() { + return entity; + } + + public long getTick() { + return tick; + } + + public BlockEntity getLoveMachineBlockEntity() { + return loveMachineBlockEntity; + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/EDGKeyBindings.java b/src/main/java/top/r3944realms/eroticdungeongame/client/EDGKeyBindings.java new file mode 100644 index 00000000..e1f70f70 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/EDGKeyBindings.java @@ -0,0 +1,36 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.minecraftforge.client.settings.KeyConflictContext; +import net.minecraftforge.client.settings.KeyModifier; +import org.lwjgl.glfw.GLFW; + +public class EDGKeyBindings { + public static final KeyMapping KEY_QUIT = new KeyMapping( + "key.eroticdungeongame.quit", + KeyConflictContext.IN_GAME, + KeyModifier.ALT, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_C, + "key.categories.eroticdungeongame" + ); + + +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonCheckBox.java b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonCheckBox.java new file mode 100644 index 00000000..e46bd30d --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonCheckBox.java @@ -0,0 +1,82 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.gui.components; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractButton; +import net.minecraft.client.gui.narration.NarratedElementType; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +public class DungeonCheckBox extends AbstractButton { + private static final ResourceLocation TEXTURE = new ResourceLocation("textures/gui/checkbox.png"); + private static final int TEXT_COLOR = 14737632; + private boolean selected; + private final boolean showLabel; + + public DungeonCheckBox(int x, int y, int width, int height, Component message, boolean selected) { + this(x, y, width, height, message, selected, true); + } + + public DungeonCheckBox(int x, int y, int width, int height, Component message, boolean selected, boolean showLabel) { + super(x, y, width, height, message); + this.selected = selected; + this.showLabel = showLabel; + } + public void setSelected(boolean selected) { + this.selected = selected; + } + + public void onPress() { + this.selected = !this.selected; + } + + public boolean selected() { + return this.selected; + } + + public void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { + narrationElementOutput.add(NarratedElementType.TITLE, this.createNarrationMessage()); + if (this.active) { + if (this.isFocused()) { + narrationElementOutput.add(NarratedElementType.USAGE, Component.translatable("narration.checkbox.usage.focused")); + } else { + narrationElementOutput.add(NarratedElementType.USAGE, Component.translatable("narration.checkbox.usage.hovered")); + } + } + + } + + public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + Minecraft minecraft = Minecraft.getInstance(); + RenderSystem.enableDepthTest(); + Font font = minecraft.font; + guiGraphics.setColor(1.0F, 1.0F, 1.0F, this.alpha); + RenderSystem.enableBlend(); + guiGraphics.blit(TEXTURE, this.getX(), this.getY(), this.isFocused() ? 20.0F : 0.0F, this.selected ? 20.0F : 0.0F, 20, this.height, 64, 64); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + if (this.showLabel) { + guiGraphics.drawString(font, this.getMessage(), this.getX() + 24, this.getY() + (this.height - 8) / 2, 14737632 | Mth.ceil(this.alpha * 255.0F) << 24); + } + + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonSliderButton.java b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonSliderButton.java new file mode 100644 index 00000000..6f7729ad --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/DungeonSliderButton.java @@ -0,0 +1,43 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.gui.components; + +import net.minecraft.client.gui.components.AbstractSliderButton; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; + +public abstract class DungeonSliderButton extends AbstractSliderButton { + public DungeonSliderButton(int x, int y, int width, int height, Component message, double value) { + super(x, y, width, height, message, value); + } + + public void setValue(double value) { + double d0 = this.value; + this.value = Mth.clamp(value, 0.0, 1.0); + if (d0 != this.value) { + this.applyValue(); + } + + this.updateMessage(); + } + + public double getValue() { + return this.value; + } + + public abstract void updateMessage(); +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewControlButton.java b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewControlButton.java new file mode 100644 index 00000000..65e54767 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewControlButton.java @@ -0,0 +1,108 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.gui.components; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.ImageButton; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.EroticDungeon; + +public class PreviewControlButton extends ImageButton { + private static final ResourceLocation TEXTURE = EroticDungeon.rl("textures/gui/3d_controls.png"); + + public enum ControlType { + ROTATE_LEFT(0, 0, "gui.eroticdungeon.preview.rotate_left"), + ROTATE_RIGHT(16, 0, "gui.eroticdungeon.preview.rotate_right"), + ROTATE_UP(32, 0, "gui.eroticdungeon.preview.rotate_up"), + ROTATE_DOWN(48, 0, "gui.eroticdungeon.preview.rotate_down"), + RESET_VIEW(0, 16, "gui.eroticdungeon.preview.reset_view"), + ZOOM_IN(16, 16, "gui.eroticdungeon.preview.zoom_in"), + ZOOM_OUT(32, 16, "gui.eroticdungeon.preview.zoom_out"), + TOGGLE_GRID(48, 16, "gui.eroticdungeon.preview.toggle_grid"), + TOGGLE_AXES(0, 32, "gui.eroticdungeon.preview.toggle_axes"), + TOGGLE_PLANES(16, 32, "gui.eroticdungeon.preview.toggle_planes"), + PERSPECTIVE_TOP(32, 32, "gui.eroticdungeon.preview.perspective_top"), + PERSPECTIVE_FRONT(48, 32, "gui.eroticdungeon.preview.perspective_front"), + PERSPECTIVE_SIDE(0, 48, "gui.eroticdungeon.preview.perspective_side"), + PERSPECTIVE_ISO(16, 48, "gui.eroticdungeon.preview.perspective_iso"); + + public final int texX; + public final int texY; + public final String translationKey; + + ControlType(int texX, int texY, String translationKey) { + this.texX = texX; + this.texY = texY; + this.translationKey = translationKey; + } + } + + final ControlType type; + private boolean enable = true; + + public PreviewControlButton(int x, int y, @NotNull ControlType type, Button.OnPress onPress) { + super(x, y, 16, 16, type.texX, type.texY, 0, + TEXTURE, 64, 64, onPress, + Component.translatable(type.translationKey)); + this.type = type; + } + + public PreviewControlButton(int x, int y, int width, int height, @NotNull ControlType type, Button.OnPress onPress) { + super(x, y, width, height, type.texX, type.texY, 0, + TEXTURE, 64, 64, onPress, + Component.translatable(type.translationKey)); + this.type = type; + } + + public void setEnable(boolean enable) { + this.enable = enable; + } + + public boolean isEnable() { + return enable; + } + + @Override + public void renderWidget(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + if (!enable) { + int disabledY = this.yTexStart + this.yDiffTex * 2; // 使用禁用状态的纹理 + this.renderTexture(guiGraphics, this.resourceLocation, + this.getX(), this.getY(), + this.xTexStart, disabledY, + this.yDiffTex, this.width, this.height, + this.textureWidth, this.textureHeight); + } else if (this.isHovered()) { + int hoverY = this.yTexStart + this.yDiffTex; // 使用悬停状态的纹理 + this.renderTexture(guiGraphics, this.resourceLocation, + this.getX(), this.getY(), + this.xTexStart, hoverY, + this.yDiffTex, this.width, this.height, + this.textureWidth, this.textureHeight); + } else { + super.renderWidget(guiGraphics, mouseX, mouseY, partialTick); + } + + // 渲染工具提示 + if (this.isHovered()) { + guiGraphics.renderTooltip(Minecraft.getInstance().font, this.getMessage(), mouseX, mouseY); + } + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewToolbar.java b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewToolbar.java new file mode 100644 index 00000000..2e4ce4dc --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/components/PreviewToolbar.java @@ -0,0 +1,177 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.gui.components; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class PreviewToolbar extends AbstractWidget { + private final List buttons = new ArrayList<>(); + private Consumer onButtonClick; + + private boolean gridVisible = true; + private boolean axesVisible = true; + private boolean planesVisible = false; + + public PreviewToolbar(int x, int y, int spacing) { + super(x, y, 0, 16, net.minecraft.network.chat.Component.empty()); + + // 创建按钮数组 + PreviewControlButton.ControlType[] buttonTypes = { + PreviewControlButton.ControlType.ROTATE_LEFT, + PreviewControlButton.ControlType.ROTATE_RIGHT, + PreviewControlButton.ControlType.ROTATE_UP, + PreviewControlButton.ControlType.ROTATE_DOWN, + PreviewControlButton.ControlType.RESET_VIEW, + PreviewControlButton.ControlType.ZOOM_IN, + PreviewControlButton.ControlType.ZOOM_OUT, + PreviewControlButton.ControlType.TOGGLE_GRID, + PreviewControlButton.ControlType.TOGGLE_AXES, + PreviewControlButton.ControlType.TOGGLE_PLANES, + PreviewControlButton.ControlType.PERSPECTIVE_TOP, + PreviewControlButton.ControlType.PERSPECTIVE_FRONT, + PreviewControlButton.ControlType.PERSPECTIVE_SIDE, + PreviewControlButton.ControlType.PERSPECTIVE_ISO + }; + + // 创建按钮 + int currentX = x; + for (PreviewControlButton.ControlType type : buttonTypes) { + PreviewControlButton button = new PreviewControlButton( + currentX, y, type, btn -> { + if (onButtonClick != null) { + onButtonClick.accept(type); + } + updateButtonStates(); + } + ); + + // 设置特定按钮的初始状态 + if (type == PreviewControlButton.ControlType.TOGGLE_GRID) { + button.setEnable(gridVisible); + } else if (type == PreviewControlButton.ControlType.TOGGLE_AXES) { + button.setEnable(axesVisible); + } else if (type == PreviewControlButton.ControlType.TOGGLE_PLANES) { + button.setEnable(planesVisible); + } + + buttons.add(button); + currentX += button.getWidth() + spacing; + } + + this.width = currentX - x - spacing; + } + + public void setOnButtonClick(Consumer callback) { + this.onButtonClick = callback; + } + + private void updateButtonStates() { + for (PreviewControlButton button : buttons) { + if (button.type == PreviewControlButton.ControlType.TOGGLE_GRID) { + button.setEnable(gridVisible); + } else if (button.type == PreviewControlButton.ControlType.TOGGLE_AXES) { + button.setEnable(axesVisible); + } else if (button.type == PreviewControlButton.ControlType.TOGGLE_PLANES) { + button.setEnable(planesVisible); + } + } + } + + public void setGridVisible(boolean visible) { + this.gridVisible = visible; + updateButtonStates(); + } + + public void setAxesVisible(boolean visible) { + this.axesVisible = visible; + updateButtonStates(); + } + + public void setPlanesVisible(boolean visible) { + this.planesVisible = visible; + updateButtonStates(); + } + + public boolean isGridVisible() { return gridVisible; } + public boolean isAxesVisible() { return axesVisible; } + public boolean isPlanesVisible() { return planesVisible; } + + @Override + public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + // 绘制工具栏背景 + guiGraphics.fill(this.getX() - 2, this.getY() - 2, + this.getX() + this.width + 2, this.getY() + this.height + 2, + 0x80000000); + guiGraphics.renderOutline(this.getX() - 2, this.getY() - 2, + this.width + 4, this.height + 4, + 0xFF555555); + + // 渲染所有按钮 + for (PreviewControlButton button : buttons) { + button.render(guiGraphics, mouseX, mouseY, partialTick); + } + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + for (PreviewControlButton btn : buttons) { + if (btn.isMouseOver(mouseX, mouseY)) { + return btn.mouseClicked(mouseX, mouseY, button); + } + } + return false; + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + for (PreviewControlButton btn : buttons) { + if (btn.isMouseOver(mouseX, mouseY)) { + return btn.mouseReleased(mouseX, mouseY, button); + } + } + return false; + } + + @Override + public void mouseMoved(double mouseX, double mouseY) { + for (PreviewControlButton btn : buttons) { + btn.mouseMoved(mouseX, mouseY); + } + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + for (PreviewControlButton btn : buttons) { + if (btn.isMouseOver(mouseX, mouseY)) { + return btn.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + } + return false; + } + + @Override + public void updateWidgetNarration(@NotNull NarrationElementOutput narrationElementOutput) { + // 无障碍功能支持 + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/gui/screens/OffsetConfigScreen.java b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/screens/OffsetConfigScreen.java new file mode 100644 index 00000000..d1b9b2bb --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/gui/screens/OffsetConfigScreen.java @@ -0,0 +1,763 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.gui.screens; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.entity.BlockEntity; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; +import org.lwjgl.opengl.GL11; +import top.r3944realms.eroticdungeongame.client.gui.components.DungeonCheckBox; +import top.r3944realms.eroticdungeongame.client.gui.components.DungeonSliderButton; +import top.r3944realms.eroticdungeongame.client.gui.components.PreviewControlButton; +import top.r3944realms.eroticdungeongame.client.gui.components.PreviewToolbar; +import top.r3944realms.eroticdungeongame.content.block.blockentity.LoveMachineBlockEntity; +import top.r3944realms.eroticdungeongame.core.network.EDGNetworkHandler; +import top.r3944realms.eroticdungeongame.core.network.toServer.OffsetConfigPacket; + +import java.text.DecimalFormat; + +public class OffsetConfigScreen extends Screen { + private static final int GUI_WIDTH = 400; + private static final int GUI_HEIGHT = 220; + + private final BlockPos blockPos; + + private static final int PREVIEW_WIDTH = 100; + private static final int PREVIEW_HEIGHT = 100; + + // 预览相关变量 + private PreviewToolbar previewToolbar; + private float previewZoom = 1.0f; + private float previewRotationX = 45.0f; + private float previewRotationY = 45.0f; + private boolean showGrid = true; + private boolean showAxes = true; + private boolean showPlanes = false; + private boolean isDragging = false; + private int lastMouseX = 0; + private int lastMouseY = 0; + private int previewLeft = 0; + private int previewTop = 0; + + // UI 组件 + private DungeonSliderButton speedSlider; + private DungeonSliderButton offsetXSlider; + private DungeonSliderButton offsetYSlider; + private DungeonSliderButton offsetZSlider; + private DungeonCheckBox enableOffsetCheckbox; + private Button applyButton; + private Button resetButton; + private Button closeButton; + + // 当前值 + private float currentSpeed = 0.05f; + private float currentOffsetX = 0.5f; + private float currentOffsetY = 0.0f; + private float currentOffsetZ = 0.5f; + private boolean currentOffsetEnabled = true; + + // 标签 + private final Component title = Component.translatable("gui.eroticdungeon.offset_config.title"); + private final Component speedLabel = Component.translatable("gui.eroticdungeon.offset_config.speed"); + private final Component offsetXLabel = Component.translatable("gui.eroticdungeon.offset_config.offset_x"); + private final Component offsetYLabel = Component.translatable("gui.eroticdungeon.offset_config.offset_y"); + private final Component offsetZLabel = Component.translatable("gui.eroticdungeon.offset_config.offset_z"); + private final Component enableOffsetLabel = Component.translatable("gui.eroticdungeon.offset_config.enable_offset"); + private final Component applyLabel = Component.translatable("gui.eroticdungeon.offset_config.apply"); + private final Component resetLabel = Component.translatable("gui.eroticdungeon.offset_config.reset"); + private final Component closeLabel = Component.translatable("gui.eroticdungeon.offset_config.close"); + + private final DecimalFormat decimalFormat = new DecimalFormat("0.00"); + + public OffsetConfigScreen(BlockPos blockPos) { + super(Component.empty()); + this.blockPos = blockPos; + } + + @Override + protected void init() { + super.init(); + int guiLeft = (this.width - GUI_WIDTH) / 2; + int guiTop = (this.height - GUI_HEIGHT) / 2; + + // 计算预览区域位置(右侧) + previewLeft = guiLeft + GUI_WIDTH - PREVIEW_WIDTH - 10; + previewTop = guiTop + 30; + + // 创建3D预览工具栏 + previewToolbar = new PreviewToolbar( + guiLeft + GUI_WIDTH - 260, // 工具栏在GUI右侧 + guiTop - 10, // 工具栏在GUI上方 + 2 // 按钮间距 + ); + previewToolbar.setOnButtonClick(this::handlePreviewControl); + previewToolbar.setGridVisible(showGrid); + previewToolbar.setAxesVisible(showAxes); + previewToolbar.setPlanesVisible(showPlanes); + addRenderableWidget(previewToolbar); + + // 速度滑块 (0.001 - 0.1) + this.speedSlider = new DungeonSliderButton(guiLeft + 10, guiTop + 40, 150, 20, + Component.empty(), 0.0) { + + @Override + public void updateMessage() { + setMessage(Component.literal(speedLabel.getString() + ": " + + decimalFormat.format(getValue() * 0.099 + 0.001))); + } + + @Override + protected void applyValue() { + currentSpeed = (float) (value * 0.099 + 0.001); + } + }; + speedSlider.setValue((currentSpeed - 0.001f) / 0.099f); + + // X轴偏移滑块 (0.0 - 1.0) + this.offsetXSlider = new DungeonSliderButton(guiLeft + 10, guiTop + 70, 150, 20, + Component.empty(), 0.0) { + + @Override + public void updateMessage() { + setMessage(Component.literal(offsetXLabel.getString() + ": " + + decimalFormat.format(value))); + } + + @Override + protected void applyValue() { + currentOffsetX = (float) value; + } + }; + offsetXSlider.setValue(currentOffsetX); + + // Y轴偏移滑块 (0.0 - 1.0) + this.offsetYSlider = new DungeonSliderButton(guiLeft + 10, guiTop + 100, 150, 20, + Component.empty(), 0.0) { + + @Override + public void updateMessage() { + setMessage(Component.literal(offsetYLabel.getString() + ": " + + decimalFormat.format(value))); + } + + @Override + protected void applyValue() { + currentOffsetY = (float) value; + } + }; + offsetYSlider.setValue(currentOffsetY); + + // Z轴偏移滑块 (0.0 - 1.0) + this.offsetZSlider = new DungeonSliderButton(guiLeft + 10, guiTop + 130, 150, 20, + Component.empty(), 0.0) { + + @Override + public void updateMessage() { + setMessage(Component.literal(offsetZLabel.getString() + ": " + + decimalFormat.format(value))); + } + + @Override + protected void applyValue() { + currentOffsetZ = (float) value; + } + }; + offsetZSlider.setValue(currentOffsetZ); + + // 启用偏移复选框 + this.enableOffsetCheckbox = new DungeonCheckBox(guiLeft + 10, guiTop + 160, 150, 20, + enableOffsetLabel, currentOffsetEnabled); + + // 应用按钮 + this.applyButton = Button.builder(applyLabel, button -> applyChanges()) + .bounds(guiLeft + 10, guiTop + 185, 50, 20) + .build(); + + // 重置按钮 + this.resetButton = Button.builder(resetLabel, button -> resetToDefault()) + .bounds(guiLeft + 65, guiTop + 185, 50, 20) + .build(); + + // 关闭按钮 + this.closeButton = Button.builder(closeLabel, button -> onClose()) + .bounds(guiLeft + 120, guiTop + 185, 50, 20) + .build(); + + // 添加所有组件 + addRenderableWidget(speedSlider); + addRenderableWidget(offsetXSlider); + addRenderableWidget(offsetYSlider); + addRenderableWidget(offsetZSlider); + addRenderableWidget(enableOffsetCheckbox); + addRenderableWidget(applyButton); + addRenderableWidget(resetButton); + addRenderableWidget(closeButton); + + ClientLevel level = Minecraft.getInstance().level; + if (level != null) { + BlockEntity blockEntity = level.getBlockEntity(blockPos); + if (blockEntity instanceof LoveMachineBlockEntity machineBlock) { + // 加载现有值 + currentSpeed = machineBlock.getSpeed(); + currentOffsetX = machineBlock.getOffsetX(); + currentOffsetY = machineBlock.getOffsetY(); + currentOffsetZ = machineBlock.getOffsetZ(); + currentOffsetEnabled = machineBlock.isOffsetEnabled(); + + // 更新UI组件 + speedSlider.setValue((currentSpeed - 0.001f) / 0.099f); + offsetXSlider.setValue(currentOffsetX); + offsetYSlider.setValue(currentOffsetY); + offsetZSlider.setValue(currentOffsetZ); + enableOffsetCheckbox.setSelected(currentOffsetEnabled); + } + } + + // 更新滑块文本 + speedSlider.updateMessage(); + offsetXSlider.updateMessage(); + offsetYSlider.updateMessage(); + offsetZSlider.updateMessage(); + } + + /** + * 处理3D预览控制按钮点击 + */ + private void handlePreviewControl(PreviewControlButton.@NotNull ControlType type) { + switch (type) { + case ROTATE_LEFT -> previewRotationY -= 15.0f; + case ROTATE_RIGHT -> previewRotationY += 15.0f; + case ROTATE_UP -> previewRotationX = Math.max(-90, previewRotationX - 15.0f); + case ROTATE_DOWN -> previewRotationX = Math.min(90, previewRotationX + 15.0f); + case RESET_VIEW -> { + previewRotationX = 45.0f; + previewRotationY = 45.0f; + previewZoom = 1.0f; + } + case ZOOM_IN -> previewZoom = Math.min(2.0f, previewZoom * 1.2f); + case ZOOM_OUT -> previewZoom = Math.max(0.5f, previewZoom / 1.2f); + case TOGGLE_GRID -> { + showGrid = !showGrid; + previewToolbar.setGridVisible(showGrid); + } + case TOGGLE_AXES -> { + showAxes = !showAxes; + previewToolbar.setAxesVisible(showAxes); + } + case TOGGLE_PLANES -> { + showPlanes = !showPlanes; + previewToolbar.setPlanesVisible(showPlanes); + } + case PERSPECTIVE_TOP -> { + previewRotationX = 90.0f; + previewRotationY = 0.0f; + } + case PERSPECTIVE_FRONT -> { + previewRotationX = 0.0f; + previewRotationY = 0.0f; + } + case PERSPECTIVE_SIDE -> { + previewRotationX = 0.0f; + previewRotationY = 90.0f; + } + case PERSPECTIVE_ISO -> { + previewRotationX = 45.0f; + previewRotationY = 45.0f; + } + } + } + + private void applyChanges() { + // 发送网络包到服务端 + OffsetConfigPacket packet = new OffsetConfigPacket( + blockPos, + currentSpeed, + currentOffsetX, + currentOffsetY, + currentOffsetZ, + enableOffsetCheckbox.selected() + ); + + // 发送网络包 + EDGNetworkHandler.CHANNEL.sendToServer(packet); + + // 关闭屏幕 + this.onClose(); + } + + private void resetToDefault() { + currentSpeed = 0.05f; + currentOffsetX = 0.5f; + currentOffsetY = 0.0f; + currentOffsetZ = 0.5f; + + speedSlider.setValue((currentSpeed - 0.001f) / 0.099f); + offsetXSlider.setValue(currentOffsetX); + offsetYSlider.setValue(currentOffsetY); + offsetZSlider.setValue(currentOffsetZ); + enableOffsetCheckbox.setSelected(true); + + speedSlider.updateMessage(); + offsetXSlider.updateMessage(); + offsetYSlider.updateMessage(); + offsetZSlider.updateMessage(); + } + + @Override + public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + // 渲染半透明背景 + this.renderBackground(guiGraphics); + + // 渲染GUI背景 + int guiLeft = (this.width - GUI_WIDTH) / 2; + int guiTop = (this.height - GUI_HEIGHT) / 2; + + // 绘制GUI背景框 + guiGraphics.fill(guiLeft, guiTop, guiLeft + GUI_WIDTH, guiTop + GUI_HEIGHT, 0x80000000); + guiGraphics.renderOutline(guiLeft, guiTop, GUI_WIDTH, GUI_HEIGHT, 0xFF555555); + + // 渲染标题 + guiGraphics.drawCenteredString(this.font, title, this.width / 2, guiTop + 10, 0xFFFFFF); + + // 渲染标签 + guiGraphics.drawString(this.font, speedLabel, guiLeft + 10, guiTop + 30, 0x404040, false); + guiGraphics.drawString(this.font, offsetXLabel, guiLeft + 10, guiTop + 60, 0x404040, false); + guiGraphics.drawString(this.font, offsetYLabel, guiLeft + 10, guiTop + 90, 0x404040, false); + guiGraphics.drawString(this.font, offsetZLabel, guiLeft + 10, guiTop + 120, 0x404040, false); + + // 渲染三维坐标预览 + render3DPreview(guiGraphics, previewLeft, previewTop); + + // 渲染简单的预览指示器 + renderSimplePreview(guiGraphics, guiLeft + 165, guiTop + 40, 30, 120); + + super.render(guiGraphics, mouseX, mouseY, partialTick); + } + + /** + * 简化的2D预览(用于对比) + */ + private void renderSimplePreview(@NotNull GuiGraphics guiGraphics, int x, int y, int width, int height) { + // 绘制预览背景 + guiGraphics.fill(x, y, x + width, y + height, 0xFF202020); + guiGraphics.hLine(x, x + width, y, 0xFF505050); + guiGraphics.hLine(x, x + width, y + height, 0xFF505050); + guiGraphics.vLine(x, y, y + height, 0xFF505050); + guiGraphics.vLine(x + width, y, y + height, 0xFF505050); + + // 计算中心点 + int centerX = x + width / 2; + int centerY = y + height / 2; + + // 绘制原点 + guiGraphics.fill(centerX - 1, centerY - 1, centerX + 1, centerY + 1, 0xFFFFFFFF); + + // 根据偏移值计算位置 + int offsetX = centerX + (int)((currentOffsetX - 0.5f) * (width - 10)); + int offsetY = centerY - (int)((currentOffsetY - 0.5f) * (height - 10)); + + // 绘制偏移点 + guiGraphics.fill(offsetX - 2, offsetY - 2, offsetX + 2, offsetY + 2, 0xFFFFFF00); + + // 绘制Z轴深度指示(圆圈大小) + float zScale = 0.5f + currentOffsetZ * 0.5f; + int zIndicatorSize = (int)(5 * zScale); + guiGraphics.hLine(offsetX - zIndicatorSize, offsetX + zIndicatorSize, + offsetY - zIndicatorSize, 0xFF0000FF); + guiGraphics.hLine(offsetX - zIndicatorSize, offsetX + zIndicatorSize, + offsetY + zIndicatorSize, 0xFF0000FF); + guiGraphics.vLine(offsetX - zIndicatorSize, + offsetY - zIndicatorSize, offsetY + zIndicatorSize, 0xFF0000FF); + guiGraphics.vLine(offsetX + zIndicatorSize, + offsetY - zIndicatorSize, offsetY + zIndicatorSize, 0xFF0000FF); + } + + /** + * 渲染三维坐标预览 + */ + private void render3DPreview(@NotNull GuiGraphics guiGraphics, int x, int y) { + // 绘制预览背景 + guiGraphics.fill(x, y, x + PREVIEW_WIDTH, y + PREVIEW_HEIGHT, 0xFF1E1E1E); + guiGraphics.renderOutline(x, y, PREVIEW_WIDTH, PREVIEW_HEIGHT, 0xFF555555); + + // 保存当前的渲染状态 + RenderSystem.getModelViewStack().pushPose(); + + // 设置渲染状态 + RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + RenderSystem.depthFunc(GL11.GL_LEQUAL); + RenderSystem.depthMask(true); + RenderSystem.disableCull(); + + // 准备PoseStack进行3D渲染 + PoseStack poseStack = guiGraphics.pose(); + poseStack.pushPose(); + + // 移动到预览区域中心 + poseStack.translate(x + PREVIEW_WIDTH / 2.0, y + PREVIEW_HEIGHT / 2.0, 50); + + // 应用缩放(注意Z轴缩放) + float scale = 0.6f * previewZoom; + poseStack.scale(scale, scale, scale); + + // 应用旋转 + poseStack.mulPose(Axis.XP.rotationDegrees(previewRotationX)); + poseStack.mulPose(Axis.YP.rotationDegrees(previewRotationY)); + + // 获取渲染器 + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder buffer = tesselator.getBuilder(); + + // 根据设置绘制元素 - 按正确顺序绘制 + if (showAxes) { + drawCoordinateAxes(tesselator, poseStack, buffer); + } + + if (showGrid) { + drawGrid(tesselator, poseStack, buffer); + } + + if (showPlanes) { + drawCoordinatePlanes(tesselator, poseStack, buffer); + } + + // 最后绘制偏移点(在最前面) + drawOffsetPoint(tesselator, poseStack, buffer); + + poseStack.popPose(); + + // 恢复渲染状态 + RenderSystem.getModelViewStack().popPose(); + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + RenderSystem.disableDepthTest(); + + // 在屏幕空间绘制标签 + drawScreenSpaceLabels(guiGraphics, x, y); + + // 在预览区域上方显示说明 + guiGraphics.drawString(font, + Component.translatable("gui.eroticdungeon.preview.hint"), + x, y - 12, 0xFFFFFF, false); + } + + /** + * 绘制网格背景 + */ + private void drawGrid(Tesselator tesselator, @NotNull PoseStack poseStack, @NotNull BufferBuilder buffer) { + PoseStack.Pose pose = poseStack.last(); + Matrix4f matrix = pose.pose(); + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + buffer.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR); + + // 减小网格大小 + float gridSize = 35.0f; // 从50减小到35 + float gridStep = 7.0f; // 从10减小到7 + int gridAlpha = 0x20; // 降低透明度 + + // XZ平面网格 + for (float i = -gridSize; i <= gridSize; i += gridStep) { + // 平行于Z轴的线 + buffer.vertex(matrix, i, 0, -gridSize).color(0x80, 0x80, 0x80, gridAlpha).endVertex(); + buffer.vertex(matrix, i, 0, gridSize).color(0x80, 0x80, 0x80, gridAlpha).endVertex(); + + // 平行于X轴的线 + buffer.vertex(matrix, -gridSize, 0, i).color(0x80, 0x80, 0x80, gridAlpha).endVertex(); + buffer.vertex(matrix, gridSize, 0, i).color(0x80, 0x80, 0x80, gridAlpha).endVertex(); + } + + tesselator.end(); + } + + /** + * 绘制坐标轴 + */ + private void drawCoordinateAxes(@NotNull Tesselator tesselator, @NotNull PoseStack poseStack, @NotNull BufferBuilder buffer) { + PoseStack.Pose pose = poseStack.last(); + Matrix4f matrix = pose.pose(); + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + buffer.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR); + + float axisLength = 30.0f; + + // X轴 (红色) + buffer.vertex(matrix, 0, 0, 0).color(1.0f, 0.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(matrix, axisLength, 0, 0).color(1.0f, 0.0f, 0.0f, 1.0f).endVertex(); + + // X轴负方向 + buffer.vertex(matrix, 0, 0, 0).color(0.8f, 0.0f, 0.0f, 0.6f).endVertex(); + buffer.vertex(matrix, -axisLength, 0, 0).color(0.8f, 0.0f, 0.0f, 0.6f).endVertex(); + + // Y轴 (绿色) + buffer.vertex(matrix, 0, 0, 0).color(0.0f, 1.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(matrix, 0, axisLength, 0).color(0.0f, 1.0f, 0.0f, 1.0f).endVertex(); + + // Y轴负方向 + buffer.vertex(matrix, 0, 0, 0).color(0.0f, 0.8f, 0.0f, 0.6f).endVertex(); + buffer.vertex(matrix, 0, -axisLength, 0).color(0.0f, 0.8f, 0.0f, 0.6f).endVertex(); + + // Z轴 (蓝色) + buffer.vertex(matrix, 0, 0, 0).color(0.0f, 0.0f, 1.0f, 1.0f).endVertex(); + buffer.vertex(matrix, 0, 0, axisLength).color(0.0f, 0.0f, 1.0f, 1.0f).endVertex(); + + // Z轴负方向 + buffer.vertex(matrix, 0, 0, 0).color(0.0f, 0.0f, 0.8f, 0.6f).endVertex(); + buffer.vertex(matrix, 0, 0, -axisLength).color(0.0f, 0.0f, 0.8f, 0.6f).endVertex(); + + tesselator.end(); + } + + /** + * 绘制偏移点 + */ + private void drawOffsetPoint(@NotNull Tesselator tesselator, @NotNull PoseStack poseStack, @NotNull BufferBuilder buffer) { + PoseStack.Pose pose = poseStack.last(); + Matrix4f matrix = pose.pose(); + + // 将偏移值映射到预览空间 (0-1 映射到 -20 到 20) + float previewX = (currentOffsetX - 0.5f) * 40.0f; + float previewY = (currentOffsetY - 0.5f) * 40.0f; + float previewZ = (currentOffsetZ - 0.5f) * 40.0f; + + float pointSize = 3.0f; + float x1 = previewX - pointSize; + float x2 = previewX + pointSize; + float y1 = previewY - pointSize; + float y2 = previewY + pointSize; + float z1 = previewZ - pointSize; + float z2 = previewZ + pointSize; + + // 绘制偏移点(立方体)- 完整6个面 + RenderSystem.setShader(GameRenderer::getPositionColorShader); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + + // 前面 (Z+方向) - 黄色 + buffer.vertex(matrix, x1, y1, z2).color(1.0f, 1.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(matrix, x2, y1, z2).color(1.0f, 1.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(matrix, x2, y2, z2).color(1.0f, 1.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(matrix, x1, y2, z2).color(1.0f, 1.0f, 0.0f, 1.0f).endVertex(); + + // 后面 (Z-方向) + buffer.vertex(matrix, x2, y1, z1).color(1.0f, 1.0f, 0.0f, 0.8f).endVertex(); + buffer.vertex(matrix, x1, y1, z1).color(1.0f, 1.0f, 0.0f, 0.8f).endVertex(); + buffer.vertex(matrix, x1, y2, z1).color(1.0f, 1.0f, 0.0f, 0.8f).endVertex(); + buffer.vertex(matrix, x2, y2, z1).color(1.0f, 1.0f, 0.0f, 0.8f).endVertex(); + + // 左面 (X-方向) + buffer.vertex(matrix, x1, y1, z1).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + buffer.vertex(matrix, x1, y1, z2).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + buffer.vertex(matrix, x1, y2, z2).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + buffer.vertex(matrix, x1, y2, z1).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + + // 右面 (X+方向) + buffer.vertex(matrix, x2, y1, z2).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + buffer.vertex(matrix, x2, y1, z1).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + buffer.vertex(matrix, x2, y2, z1).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + buffer.vertex(matrix, x2, y2, z2).color(1.0f, 1.0f, 0.0f, 0.9f).endVertex(); + + // 上面 (Y+方向) + buffer.vertex(matrix, x1, y2, z2).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + buffer.vertex(matrix, x2, y2, z2).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + buffer.vertex(matrix, x2, y2, z1).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + buffer.vertex(matrix, x1, y2, z1).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + + // 下面 (Y-方向) + buffer.vertex(matrix, x1, y1, z1).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + buffer.vertex(matrix, x2, y1, z1).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + buffer.vertex(matrix, x2, y1, z2).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + buffer.vertex(matrix, x1, y1, z2).color(1.0f, 1.0f, 0.0f, 0.7f).endVertex(); + + tesselator.end(); + + // 绘制从原点到偏移点的连接线 + RenderSystem.setShader(GameRenderer::getPositionColorShader); + buffer.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR); + + // 白色虚线效果 + buffer.vertex(matrix, 0, 0, 0).color(1.0f, 1.0f, 1.0f, 0.8f).endVertex(); + buffer.vertex(matrix, previewX, previewY, previewZ).color(1.0f, 1.0f, 1.0f, 0.8f).endVertex(); + + tesselator.end(); + } + + /** + * 绘制坐标平面 + */ + private void drawCoordinatePlanes(@NotNull Tesselator tesselator, @NotNull PoseStack poseStack, @NotNull BufferBuilder buffer) { + PoseStack.Pose pose = poseStack.last(); + Matrix4f matrix = pose.pose(); + + float planeSize = 20.0f; + + // XY平面 (绿色) - 在 Z=0 + RenderSystem.setShader(GameRenderer::getPositionColorShader); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + + float alpha = 0.4f; // 透明度 + + // XY平面(绿色,Z=0) + buffer.vertex(matrix, -planeSize, -planeSize, 0).color(0.0f, 1.0f, 0.0f, alpha).endVertex(); + buffer.vertex(matrix, planeSize, -planeSize, 0).color(0.0f, 1.0f, 0.0f, alpha).endVertex(); + buffer.vertex(matrix, planeSize, planeSize, 0).color(0.0f, 1.0f, 0.0f, alpha).endVertex(); + buffer.vertex(matrix, -planeSize, planeSize, 0).color(0.0f, 1.0f, 0.0f, alpha).endVertex(); + + tesselator.end(); + + // XZ平面 (红色) - 在 Y=0 + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + + buffer.vertex(matrix, -planeSize, 0, -planeSize).color(1.0f, 0.0f, 0.0f, alpha).endVertex(); + buffer.vertex(matrix, planeSize, 0, -planeSize).color(1.0f, 0.0f, 0.0f, alpha).endVertex(); + buffer.vertex(matrix, planeSize, 0, planeSize).color(1.0f, 0.0f, 0.0f, alpha).endVertex(); + buffer.vertex(matrix, -planeSize, 0, planeSize).color(1.0f, 0.0f, 0.0f, alpha).endVertex(); + + tesselator.end(); + + // YZ平面 (蓝色) - 在 X=0 + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + + buffer.vertex(matrix, 0, -planeSize, -planeSize).color(0.0f, 0.0f, 1.0f, alpha).endVertex(); + buffer.vertex(matrix, 0, planeSize, -planeSize).color(0.0f, 0.0f, 1.0f, alpha).endVertex(); + buffer.vertex(matrix, 0, planeSize, planeSize).color(0.0f, 0.0f, 1.0f, alpha).endVertex(); + buffer.vertex(matrix, 0, -planeSize, planeSize).color(0.0f, 0.0f, 1.0f, alpha).endVertex(); + + tesselator.end(); + } + + /** + * 在屏幕空间绘制坐标轴标签 - 不会被裁剪 + */ + private void drawScreenSpaceLabels(@NotNull GuiGraphics guiGraphics, int previewX, int previewY) { + int centerX = previewX + PREVIEW_WIDTH / 2; + int centerY = previewY + PREVIEW_HEIGHT / 2; + + // 计算标签位置(基于旋转角度) + float radY = (float) Math.toRadians(previewRotationY); + float radX = (float) Math.toRadians(previewRotationX); + + // 计算标签偏移量 + int offset = 35; + + // X轴标签 - 根据Y旋转计算位置 + int xOffset = (int)(Math.cos(radY) * offset); + int yOffsetX = (int)(Math.sin(radX) * 10); + guiGraphics.drawString(font, "X", + centerX + xOffset - 3, + centerY + yOffsetX - 4, + 0xFF0000, false); + + // Y轴标签 - 根据X旋转计算位置 + int yOffset = (int)(Math.sin(radX) * offset); + int xOffsetY = (int)(Math.cos(radY) * 10); + guiGraphics.drawString(font, "Y", + centerX + xOffsetY - 3, + centerY - yOffset - 4, + 0x00FF00, false); + + // Z轴标签 - 根据Y旋转计算位置 + int zOffset = (int)(Math.sin(radY) * offset); + int yOffsetZ = (int)(Math.cos(radX) * 10); + guiGraphics.drawString(font, "Z", + centerX - zOffset - 3, + centerY + yOffsetZ - 4, + 0x0000FF, false); + + // 在预览区域右下角显示当前坐标值 + String coordText = String.format("X:%.2f Y:%.2f Z:%.2f", + currentOffsetX, currentOffsetY, currentOffsetZ); + guiGraphics.drawString(font, coordText, + previewX + 5, previewY + PREVIEW_HEIGHT + 5, 0xFFFFFF, false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + // 检查是否点击了预览区域 + if (isMouseOverPreview(mouseX, mouseY) && button == 0) { + isDragging = true; + lastMouseX = (int) mouseX; + lastMouseY = (int) mouseY; + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0) { + isDragging = false; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (isDragging && button == 0) { + // 计算鼠标移动距离 + int deltaX = (int) mouseX - lastMouseX; + int deltaY = (int) mouseY - lastMouseY; + + // 更新旋转角度 + previewRotationY += deltaX * 0.5f; + previewRotationX += deltaY * 0.5f; + + // 限制X轴旋转角度 + previewRotationX = Math.max(-90, Math.min(90, previewRotationX)); + + // 更新鼠标位置 + lastMouseX = (int) mouseX; + lastMouseY = (int) mouseY; + + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + /** + * 检查鼠标是否在预览区域上 + */ + private boolean isMouseOverPreview(double mouseX, double mouseY) { + return mouseX >= previewLeft && mouseX <= previewLeft + PREVIEW_WIDTH && + mouseY >= previewTop && mouseY <= previewTop + PREVIEW_HEIGHT; + } + + @Override + public boolean isPauseScreen() { + return false; + } + + @Override + public void onClose() { + super.onClose(); + } +} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/model/block/LoveMachineBlockModel.java b/src/main/java/top/r3944realms/eroticdungeongame/client/model/block/LoveMachineBlockModel.java new file mode 100644 index 00000000..f332181b --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/model/block/LoveMachineBlockModel.java @@ -0,0 +1,36 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.model.block; + +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.DefaultedBlockGeoModel; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.content.block.blockentity.LoveMachineBlockEntity; + +public class LoveMachineBlockModel extends DefaultedBlockGeoModel { + public static final ResourceLocation PATH = EroticDungeon.rl("love_machine"); + public final ResourceLocation MODEL_RL; + public LoveMachineBlockModel(String type) { + super(PATH); + MODEL_RL = EroticDungeon.rl("geo/block/" + type + "_love_machine.geo.json"); + } + + @Override + public ResourceLocation getModelResource(LoveMachineBlockEntity animatable) { + return MODEL_RL; + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/model/item/LoveMachineItemModel.java b/src/main/java/top/r3944realms/eroticdungeongame/client/model/item/LoveMachineItemModel.java new file mode 100644 index 00000000..a17fb963 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/model/item/LoveMachineItemModel.java @@ -0,0 +1,48 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.model.item; + +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.DefaultedItemGeoModel; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.client.model.block.LoveMachineBlockModel; +import top.r3944realms.eroticdungeongame.content.item.LoveMachineItem; + +public class LoveMachineItemModel extends DefaultedItemGeoModel { + public static final ResourceLocation TEXTURE = EroticDungeon.rl("textures/block/love_machine.png"); + public static final ResourceLocation ANIMATION = EroticDungeon.rl("animations/block/love_machine.animation.json"); + public static final ResourceLocation MODEL = EroticDungeon.rl("geo/block/end_rod_love_machine.geo.json"); + private final ResourceLocation newModelRL; + public LoveMachineItemModel(String type) { + super(LoveMachineBlockModel.PATH); + this.newModelRL = MODEL.withPath("geo/block/" + type + "_love_machine.geo.json"); + } + @Override + public ResourceLocation getModelResource(LoveMachineItem animatable) { + return newModelRL; + } + + @Override + public ResourceLocation getTextureResource(LoveMachineItem animatable) { + return TEXTURE; + } + + @Override + public ResourceLocation getAnimationResource(LoveMachineItem animatable) { + return ANIMATION; + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/block/LoveMachineBlockRenderer.java b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/block/LoveMachineBlockRenderer.java new file mode 100644 index 00000000..bc051064 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/block/LoveMachineBlockRenderer.java @@ -0,0 +1,77 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.renderer.block; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.Vec3; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoBlockRenderer; +import top.r3944realms.eroticdungeongame.client.model.block.LoveMachineBlockModel; +import top.r3944realms.eroticdungeongame.content.block.blockentity.LoveMachineBlockEntity; +import top.r3944realms.eroticdungeongame.content.block.type.LoveMachineBlock; + +public class LoveMachineBlockRenderer extends GeoBlockRenderer { + + public LoveMachineBlockRenderer(String type) { + super(new LoveMachineBlockModel(type)); + } + /** + * 重写 preRender 方法,在渲染前应用偏移 + */ + @Override + public void preRender(PoseStack poseStack, LoveMachineBlockEntity animatable, BakedGeoModel model, + MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, + float partialTick, int packedLight, int packedOverlay, float red, + float green, float blue, float alpha) { + + // 先调用父类的preRender + super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, + partialTick, packedLight, packedOverlay, red, green, blue, alpha); + + // 应用偏移变换 + if (animatable != null && animatable.isOffsetEnabled()) { + float offsetX = animatable.getRenderOffsetX(); + float offsetY = animatable.getRenderOffsetY(); + float offsetZ = animatable.getRenderOffsetZ(); + // 在PoseStack中应用偏移 + Direction direction = animatable.getBlockState().getValue(LoveMachineBlock.FACING); + Vec3 vec3 = LoveMachineBlock.adjustOffsetByFacing(offsetX, offsetY, offsetZ, direction); + + poseStack.translate(vec3.x, vec3.y, vec3.z); + } + } + + protected void rotateBlock(Direction facing, PoseStack poseStack) { + switch (facing) { + case SOUTH, NORTH, WEST, EAST -> super.rotateBlock(facing, poseStack); + case UP -> { + poseStack.mulPose(Axis.XP.rotationDegrees(90)); + poseStack.translate(0, -0.31, -0.32); + } + case DOWN -> { + poseStack.mulPose(Axis.XN.rotationDegrees(90)); + poseStack.translate(0, -0.32, 0.68); + } + } + } + + +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/LoveMachineItemRenderer.java b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/LoveMachineItemRenderer.java new file mode 100644 index 00000000..759b984f --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/LoveMachineItemRenderer.java @@ -0,0 +1,27 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.client.renderer.item; + +import software.bernie.geckolib.renderer.GeoItemRenderer; +import top.r3944realms.eroticdungeongame.client.model.item.LoveMachineItemModel; +import top.r3944realms.eroticdungeongame.content.item.LoveMachineItem; + +public class LoveMachineItemRenderer extends GeoItemRenderer { + public LoveMachineItemRenderer(String type) { + super(new LoveMachineItemModel(type)); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/EDGDamageTypes.java b/src/main/java/top/r3944realms/eroticdungeongame/content/EDGDamageTypes.java new file mode 100644 index 00000000..8cc667f1 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/EDGDamageTypes.java @@ -0,0 +1,106 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content; + +import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageScaling; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.EroticDungeon; + +@SuppressWarnings("OptionalGetWithoutIsPresent") +public class EDGDamageTypes { + public static final ResourceKey FUCKED = ResourceKey.create(Registries.DAMAGE_TYPE, EroticDungeon.rl("fucked")); + public static final ResourceKey WHIPPED = ResourceKey.create(Registries.DAMAGE_TYPE, EroticDungeon.rl("whipped")); + + @Contract("_ -> new") + public static @NotNull DamageSource causeFuckedDamage(@NotNull RegistryAccess registryAccess) { + return new DamageSourceRandomMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(FUCKED), 2); + } + @Contract("_, _ -> new") + public static @NotNull DamageSource causeFuckedDamage(@NotNull RegistryAccess registryAccess, Entity source) { + return new DamageSourceRandomMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(FUCKED), source, 2); + } + @Contract("_ -> new") + public static @NotNull DamageSource causeWhipDamage(@NotNull RegistryAccess registryAccess) { + return new DamageSourceRandomMessages( + registryAccess.registry(Registries.DAMAGE_TYPE) + .get() + .getHolderOrThrow(WHIPPED), + 3 + ); + } + @Contract("_, _ -> new") + public static @NotNull DamageSource causeWhipDamage(@NotNull RegistryAccess registryAccess, Entity source) { + return new DamageSourceRandomMessages( + registryAccess.registry(Registries.DAMAGE_TYPE) + .get() + .getHolderOrThrow(WHIPPED), + source, + 3 // 死亡信息数量 + ); + } + private static class DamageSourceRandomMessages extends DamageSource { + + private final int messageCount; + + public DamageSourceRandomMessages(Holder.Reference message, int messageCount) { + super(message); + this.messageCount = messageCount; + } + + public DamageSourceRandomMessages(Holder.Reference message, Entity source, int messageCount) { + super(message, source); + this.messageCount = messageCount; + } + + @Override + public @NotNull Component getLocalizedDeathMessage(@NotNull LivingEntity attacked) { + int type = attacked.getRandom().nextInt(this.messageCount); + String s = "death.attack." + this.getMsgId() + "_" + type; + Entity entity = this.getDirectEntity() == null ? this.getEntity() : this.getDirectEntity(); + if (entity != null) { + return Component.translatable(s + ".entity", attacked.getDisplayName(), entity.getDisplayName()); + }else{ + return Component.translatable(s, attacked.getDisplayName()); + } + } + } + public static void bootstrap(@NotNull BootstapContext context) { + context.register(FUCKED, new DamageType( + "fucked", + DamageScaling.ALWAYS, + 0.2F + )); + context.register(WHIPPED, new DamageType( + "whipped", + DamageScaling.ALWAYS, + 0.2F + )); + + + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/EDGVillagerTrades.java b/src/main/java/top/r3944realms/eroticdungeongame/content/EDGVillagerTrades.java index 904efbf0..d03b1ca8 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/EDGVillagerTrades.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/EDGVillagerTrades.java @@ -19,31 +19,53 @@ package top.r3944realms.eroticdungeongame.content; import com.google.common.collect.ImmutableMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.entity.npc.VillagerTrades; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentInstance; import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraftforge.registries.RegistryObject; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; -import top.r3944realms.eroticdungeongame.content.register.EDGVillagers; -import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; +import top.r3944realms.eroticdungeongame.content.block.IColorBlock; +import top.r3944realms.eroticdungeongame.content.block.IWoodTypeBlock; +import top.r3944realms.eroticdungeongame.core.register.EDGEnchantments; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGVillagers; import top.r3944realms.lib39.util.villager.TradeBuilder; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class EDGVillagerTrades { public static void init(@NotNull Map> trades) { trades.put(EDGVillagers.DUNGEON_CRAFTSMAN.get(), toIntMap( ImmutableMap.of( - 1, new VillagerTrades.ItemListing[]{ - TradeBuilder.createBuyItemTrade(EDGItems.IRON_CAGE_ITEM.get(), 10, 5, 20, 10), - new SpanishDonkeyForEmeralds(10, 20, 10) + 1, new VillagerTrades.ItemListing[] { + TradeBuilder.createBuyItemTrade(EDGItems.WHIP.get(), 3, 1, 10, 1), + TradeBuilder.createSellItemTrade(Items.IRON_INGOT, 2, 1024, 1), + }, + 2, new VillagerTrades.ItemListing[] { + TradeBuilder.createSellItemTrade(Items.DIAMOND, 1, 1024, 5), + new RandomWoodenDeviceEmeralds(3, 20, 1), + }, + 3, new VillagerTrades.ItemListing[] { + TradeBuilder.createSellItemTrade(Items.END_ROD, 4, 1024, 2), + new EnchantBookForEmeralds(10, EDGEnchantments.CARROT_AND_STICK.get()), + }, + 4, new VillagerTrades.ItemListing[] { + new TradeBuilder.EnchantedItemForEmeralds(EDGItems.WHIP.get(), 1, 5, 20, 1), + new TradeBuilder.EnchantedItemForEmeralds(EDGItems.END_ROD_LOVE_MACHINE.get(), 1, 5, 20, 1), + }, + 5, new VillagerTrades.ItemListing[] { + new RandomWoodenDeviceEmeralds(1, 20, 1), + new RandomWoodenDeviceEmeralds(1, 20, 11), } ) ) @@ -53,18 +75,17 @@ public class EDGVillagerTrades { private static @NotNull Int2ObjectMap toIntMap(ImmutableMap map) { return new Int2ObjectOpenHashMap<>(map); } - - public static class SpanishDonkeyForEmeralds implements VillagerTrades.ItemListing { + public static class RandomWoodenDeviceEmeralds implements VillagerTrades.ItemListing { private final int value; private final int maxUses; private final int villagerXp; - - public SpanishDonkeyForEmeralds(int value) { + private static volatile List woodenDeviceItems; + public RandomWoodenDeviceEmeralds(int value) { this(value, 12, 1); } - public SpanishDonkeyForEmeralds(int value, int maxUses, int villagerXp) { + public RandomWoodenDeviceEmeralds(int value, int maxUses, int villagerXp) { this.value = value; this.maxUses = maxUses; @@ -73,13 +94,90 @@ public class EDGVillagerTrades { public MerchantOffer getOffer(@NotNull Entity trader, @NotNull RandomSource random) { ItemStack itemstack = new ItemStack(Items.EMERALD, this.value); - ItemStack itemstack1 = new ItemStack(getRandomSpanishDonkey(random)); + ItemStack itemstack1 = new ItemStack(getRandomWoodenDevice(random)); return new MerchantOffer(itemstack, itemstack1, this.maxUses, this.villagerXp, 0.2F); } - private static @NotNull Item getRandomSpanishDonkey(@NotNull RandomSource random) { - return EDGItems.SPANISH_DONKEY_ITEMS.get(WoodTypeHelper.SUPPORTED_WOOD_TYPES[random.nextInt(0, WoodTypeHelper.SUPPORTED_WOOD_TYPES.length)]).get(); + private static @NotNull Item getRandomWoodenDevice(@NotNull RandomSource random) { + if (woodenDeviceItems == null) { + synchronized (RandomWoodenDeviceEmeralds.class) { + if (woodenDeviceItems == null) { + woodenDeviceItems = EDGItems.SEAT_ITEMS.stream() + .filter(i-> i.get() instanceof BlockItem blockItem && blockItem.getBlock() instanceof IWoodTypeBlock && !(blockItem.getBlock() instanceof IColorBlock)) + .map(RegistryObject::get) + .collect(Collectors.toList()); + } + } + + } + if (!woodenDeviceItems.isEmpty()) { + return woodenDeviceItems.get(random.nextInt(0, woodenDeviceItems.size())); + } else return Items.AIR; + } + } + public static class RandomColorDeviceEmeralds implements VillagerTrades.ItemListing { + + private final int value; + private final int maxUses; + private final int villagerXp; + private static volatile List woodenDeviceItems; + public RandomColorDeviceEmeralds(int value) { + this(value, 12, 1); + } + + public RandomColorDeviceEmeralds(int value, int maxUses, int villagerXp) { + + this.value = value; + this.maxUses = maxUses; + this.villagerXp = villagerXp; + } + + public MerchantOffer getOffer(@NotNull Entity trader, @NotNull RandomSource random) { + ItemStack itemstack = new ItemStack(Items.EMERALD, this.value); + ItemStack itemstack1 = new ItemStack(getRandomWoodenDevice(random)); + + return new MerchantOffer(itemstack, itemstack1, this.maxUses, this.villagerXp, 0.2F); + } + + private static @NotNull Item getRandomWoodenDevice(@NotNull RandomSource random) { + if (woodenDeviceItems == null) { + synchronized (RandomWoodenDeviceEmeralds.class) { + if (woodenDeviceItems == null) { + woodenDeviceItems = EDGItems.SEAT_ITEMS.stream() + .filter(i-> i.get() instanceof BlockItem blockItem && blockItem.getBlock() instanceof IColorBlock) + .map(RegistryObject::get) + .collect(Collectors.toList()); + } + } + + } + if (!woodenDeviceItems.isEmpty()) { + return woodenDeviceItems.get(random.nextInt(0, woodenDeviceItems.size())); + } else return Items.AIR; + } + } + public static class EnchantBookForEmeralds implements VillagerTrades.ItemListing { + private final int villagerXp; + private final Enchantment enchantment; + public EnchantBookForEmeralds(int villagerXp, Enchantment enchantment) { + this.villagerXp = villagerXp; + this.enchantment = enchantment; + } + + public MerchantOffer getOffer(@NotNull Entity trader, @NotNull RandomSource random) { + int i = Mth.nextInt(random, enchantment.getMinLevel(), enchantment.getMaxLevel()); + ItemStack itemstack = EnchantedBookItem.createForEnchantment(new EnchantmentInstance(enchantment, i)); + int j = 2 + random.nextInt(5 + i * 10) + 3 * i; + if (enchantment.isTreasureOnly()) { + j *= 2; + } + + if (j > 64) { + j = 64; + } + + return new MerchantOffer(new ItemStack(Items.EMERALD, j), new ItemStack(Items.BOOK), itemstack, 12, this.villagerXp, 0.2F); } } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/IColorBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/IColorBlock.java index 0b27d0e6..18547b31 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/IColorBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/IColorBlock.java @@ -16,7 +16,7 @@ package top.r3944realms.eroticdungeongame.content.block; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.util.ColorContent; public interface IColorBlock { ColorContent getColor(); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/ISeatBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/ISeatBlock.java index ecb0f0a2..beed0c66 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/ISeatBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/ISeatBlock.java @@ -22,6 +22,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -37,8 +38,9 @@ import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; -import top.r3944realms.eroticdungeongame.content.service.SeatService; import top.r3944realms.eroticdungeongame.content.util.FurnitureHelper; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.service.SeatService; import javax.annotation.Nullable; import java.util.Map; @@ -90,6 +92,10 @@ public interface ISeatBlock extends EntityBlock, IShapeCache entity, BlockPos blockPos, BlockState blockState) { super(entity, blockPos, blockState); @@ -95,9 +100,31 @@ public abstract class BaseSeatBlockEntity extends BlockEntity { } public void passengerRot(@NotNull Entity passenger, @NotNull SeatEntity seat) { + // 固定身体旋转 passenger.setYBodyRot(seat.getYRot()); - passenger.setYRot(seat.getYRot()); - passenger.yRotO = seat.getYRot(); + + if (passenger instanceof LivingEntity livingEntity) { + // 获取当前头部旋转 + float currentHeadYaw = livingEntity.getYRot(); + float seatYaw = seat.getYRot(); + + // 限制头部旋转范围(例如 ±90度) + float maxHeadTurn = 45.0f; + float diff = Mth.wrapDegrees(currentHeadYaw - seatYaw); + + // 应用限制 + if (Math.abs(diff) > maxHeadTurn) { + if (diff > 0) { + livingEntity.setYRot(seatYaw + maxHeadTurn); + } else { + livingEntity.setYRot(seatYaw - maxHeadTurn); + } + livingEntity.yHeadRot = livingEntity.getYRot(); + } + + // 保持身体固定 + livingEntity.yBodyRot = seatYaw; + } } public int getPlayerAnimationNumber() { @@ -165,15 +192,17 @@ public abstract class BaseSeatBlockEntity extends BlockEntity { super.saveAdditional(compoundTag); boolean hasBoundPlayer = this.boundPlayerUUID != null; NBTWriter.of(compoundTag) - .string("Lock", lock) - .uuidValueIf("PlayerUUID", hasBoundPlayer, () -> this.boundPlayerUUID); + .string("Lock", "3944Realms") + .longValue(LOCK_CODE, getLockCode()) + .uuidValueIf("PlayerUUID", hasBoundPlayer, this::getBoundPlayerUUID); } @Override public void load(@NotNull CompoundTag compoundTag) { super.load(compoundTag); NBTReader.of(compoundTag) - .string("Lock",this::setLock) + .string("Lock",ig -> {}) + .longValue(LOCK_CODE, this::setLockCode) .uuid("PlayerUUID", this::setBoundPlayerUUID); } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/DefaultSeatBlockEntity.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/DefaultSeatBlockEntity.java index 01c5f04e..bc3dfb05 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/DefaultSeatBlockEntity.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/DefaultSeatBlockEntity.java @@ -18,7 +18,7 @@ package top.r3944realms.eroticdungeongame.content.block.blockentity; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.state.BlockState; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; public class DefaultSeatBlockEntity extends BaseSeatBlockEntity { public DefaultSeatBlockEntity(BlockPos blockPos, BlockState blockState) { diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/IronCageBlockEntity.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/IronCageBlockEntity.java index 9db8cb1a..992831bf 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/IronCageBlockEntity.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/IronCageBlockEntity.java @@ -32,7 +32,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; import top.r3944realms.eroticdungeongame.content.block.multiply.AbstractTwoPartSeatBlock; import top.r3944realms.eroticdungeongame.content.block.part.SeatPart; import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; import top.r3944realms.eroticdungeongame.other.geckolib.AutoPlayingSoundKeyframeHandler; import top.r3944realms.lib39.util.nbt.NBTReader; import top.r3944realms.lib39.util.nbt.NBTWriter; @@ -94,7 +94,7 @@ public class IronCageBlockEntity extends BaseSeatBlockEntity implements GeoBlock @Override public void registerControllers(AnimatableManager.@NotNull ControllerRegistrar controllerRegistrar) { controllerRegistrar - .add(new AnimationController<>(this, "main_controller", 0, state -> { + .add(new AnimationController<>(this, "iron_seat", 0, state -> { // 优先播放过渡动画 if (shouldPlayUnlocking) { shouldPlayUnlocking = false; // 清除标志 @@ -115,7 +115,7 @@ public class IronCageBlockEntity extends BaseSeatBlockEntity implements GeoBlock return state.setAndContinue(LOCKING_ANIM); } - // 默认根据 isLocked 状态播放 + // 默认根据 hasLockCode 状态播放 return isLocked ? state.setAndContinue(LOCKED_ANIM) : state.setAndContinue(UNLOCKED_ANIM); @@ -132,7 +132,7 @@ public class IronCageBlockEntity extends BaseSeatBlockEntity implements GeoBlock public void saveAdditional(@NotNull CompoundTag compoundTag) { super.saveAdditional(compoundTag); NBTWriter.of(compoundTag) - .booleanValue("isLocked", isLocked) + .booleanValue("hasLockCode", isLocked) .booleanValue("shouldPlayUnlocking", shouldPlayUnlocking) .booleanValue("shouldPlayLocking", shouldPlayLocking); } @@ -141,7 +141,7 @@ public class IronCageBlockEntity extends BaseSeatBlockEntity implements GeoBlock public void load(@NotNull CompoundTag compoundTag) { super.load(compoundTag); NBTReader.of(compoundTag) - .booleanValue("isLocked", this::setLocked) + .booleanValue("hasLockCode", this::setLocked) .booleanValue("shouldPlayUnlocking", this::setShouldPlayUnlocking) .booleanValue("shouldPlayLocking", this::setShouldPlayLocking); } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/LoveMachineBlockEntity.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/LoveMachineBlockEntity.java new file mode 100644 index 00000000..33d6ccd0 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/LoveMachineBlockEntity.java @@ -0,0 +1,332 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.block.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.core.animation.AnimationController; +import software.bernie.geckolib.core.animation.RawAnimation; +import software.bernie.geckolib.util.GeckoLibUtil; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.api.event.LoveMachineTickEvent; +import top.r3944realms.eroticdungeongame.content.EDGDamageTypes; +import top.r3944realms.eroticdungeongame.content.block.type.LoveMachineBlock; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.other.geckolib.AutoPlayingSoundKeyframeHandler; +import top.r3944realms.lib39.util.nbt.NBTReader; +import top.r3944realms.lib39.util.nbt.NBTWriter; + +import java.util.HashMap; +import java.util.Map; + +public class LoveMachineBlockEntity extends BlockEntity implements GeoBlockEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static final RawAnimation ACTIVE_ANIMATION = RawAnimation.begin().thenPlay("love_machine.active"); + public static final RawAnimation STOPPING_ANIMATION = RawAnimation.begin().thenPlay("love_machine.stopping").thenPlay("love_machine.stopped"); + public static final RawAnimation STOPPED_ANIMATION = RawAnimation.begin().thenPlay("love_machine.stopped"); + public static final Map ACTION = new HashMap<>(); + private volatile boolean isActive = false; + private volatile boolean isStopping = false; + public final RandomSource random = RandomSource.create(); + static { + ACTION.put("lightning_rod", ((level, machineBlockEntity, entity, pos, state, ticks) -> { + if (level.isThundering()) { + if(level.canSeeSky(pos)) { + if (level.isRainingAt(pos)) { + DifficultyInstance difficultyinstance = level.getCurrentDifficultyAt(pos); + boolean flag1 = level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && level.random.nextDouble() < (double)difficultyinstance.getEffectiveDifficulty() * 0.01D ; + if (flag1) { + LightningBolt lightningbolt = EntityType.LIGHTNING_BOLT.create(level); + if (lightningbolt != null) { + lightningbolt.moveTo(Vec3.atBottomCenterOf(pos)); + lightningbolt.setVisualOnly(true); + level.addFreshEntity(lightningbolt); + } + } + } + } + } + })); + } + private float offsetX = 0.5f; + private float offsetY = 0.0f; + private float offsetZ = 0.5f; + private final float MIN_OFFSET = 0.0f; + private final float MAX_OFFSET = 1.0f; + private boolean offsetEnabled = true; + + private float speed = 0.05f; + private boolean movingForward = true; + + public LoveMachineBlockEntity(BlockPos pos, BlockState blockState) { + super(EDGBlockEntities.LOVE_MACHINE_BLOCK_ENTITY.get(), pos, blockState); + } + public int ticks = 0; + public static void serverTick(Level pLevel, BlockPos pPos, BlockState pState, @NotNull LoveMachineBlockEntity pBlockEntity) { + if (pBlockEntity.isActive() && pBlockEntity.isOffsetEnabled()) { + // 获取方块朝向 + Direction facing = pState.getValue(LoveMachineBlock.FACING); + + // 计算偏移后的碰撞箱位置 + BlockPos offsetPos = calculateOffsetPosition(pPos, facing, pBlockEntity); + + // 获取偏移前方一格的位置 + BlockPos frontPos = offsetPos.relative(facing); + + // 检查前方一格是否有实体进入碰撞箱 + AABB frontBox = new AABB(frontPos); + if (pState.getBlock() instanceof LoveMachineBlock loveMachineBlock) { + for (Entity entity : pLevel.getEntitiesOfClass(Entity.class, frontBox)) { + // 检查实体是否与碰撞箱相交 + if (entity.getBoundingBox().intersects(frontBox)) { + // 发布事件 + if (!EroticDungeon.EVENT_BUS.post(new LoveMachineTickEvent(entity, pBlockEntity, pLevel.getGameTime()))) { + ACTION.getOrDefault(loveMachineBlock.type, SpecialAction.EMPTY).doTick(pLevel, pBlockEntity, entity, pPos, pState, pLevel.getGameTime()); + if (pBlockEntity.speed < 0.05f) { + if (pLevel.getGameTime() % 100 == 0) { + entity.hurt(EDGDamageTypes.causeFuckedDamage(pLevel.registryAccess()), calcAnimSpeed(pBlockEntity.speed) * 10f); + } + } else entity.hurt(EDGDamageTypes.causeFuckedDamage(pLevel.registryAccess()), calcAnimSpeed(pBlockEntity.speed)); + } + + } + } + } + } + + } + + /** + * 计算偏移后的位置 + */ + public static @NotNull BlockPos calculateOffsetPosition(@NotNull BlockPos originalPos, Direction facing, @NotNull LoveMachineBlockEntity blockEntity) { + // 获取偏移向量 + Vec3 offsetVec = blockEntity.getOffsetVector(); + + // 将偏移向量转换为方块坐标偏移 + int offsetX = (int) Math.round(offsetVec.x); + int offsetY = (int) Math.round(offsetVec.y); + int offsetZ = (int) Math.round(offsetVec.z); + + // 根据方块朝向旋转偏移 + Vec3 rotatedOffset = rotateVectorByFacing(new Vec3(offsetX, offsetY, offsetZ), facing); + + // 计算偏移后的位置 + return originalPos.offset( + (int) (facing.get3DDataValue() <= 1 ? -Math.round(rotatedOffset.x) : Math.round(rotatedOffset.x)), + (int) Math.round(rotatedOffset.y), + (int) (facing.get3DDataValue() <= 1 ? -Math.round(rotatedOffset.z) : Math.round(rotatedOffset.z)) + ); + } + + /** + * 根据方块朝向旋转向量 + */ + private static Vec3 rotateVectorByFacing(Vec3 vector, @NotNull Direction facing) { + return switch (facing) { + case SOUTH -> new Vec3(-vector.x, vector.y, -vector.z); + case WEST -> new Vec3(-vector.z, vector.y, vector.x); + case EAST -> new Vec3(vector.z, vector.y, -vector.x); + case UP -> new Vec3(vector.x, vector.z, -vector.y); + case DOWN -> new Vec3(vector.x, -vector.z, vector.y); + default -> vector; // NORTH + }; + } + + @Override + public void registerControllers(AnimatableManager.@NotNull ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add( + new AnimationController<>(this, "love_machine", 0, state -> { + if (isActive) { + state.setControllerSpeed(calcAnimSpeed(speed)); + return state.setAndContinue(ACTIVE_ANIMATION); + } else { + if (isStopping) { + isStopping = false; + return state.setAndContinue(STOPPING_ANIMATION); + } + if (state.isCurrentAnimationStage("love_machine.stopping")) { + return state.setAndContinue(STOPPING_ANIMATION); + } + state.setControllerSpeed(1.0f); + return state.setAndContinue(STOPPED_ANIMATION); + } + }) + .setSoundKeyframeHandler(new AutoPlayingSoundKeyframeHandler<>()) + ); + } + private static float calcAnimSpeed(float speed) { + float minInput = 0.005f; + float maxInput = 0.1f; + + float t = (speed - minInput) / (maxInput - minInput); + t = Mth.clamp(t, 0f, 1f); + + // 指数映射 + return 0.1f * (float)Math.pow(100f, t); + } + + public float getOffsetX() { + return offsetX; + } + + public float getOffsetY() { + return offsetY; + } + + public float getOffsetZ() { + return offsetZ; + } + + public void setOffset(float x, float y, float z) { + offsetX = x; + offsetY = y; + offsetZ = z; + } + + public float getRenderOffsetX() { + return (offsetX - 0.5f) * 0.5f; + } + + public float getRenderOffsetY() { + return offsetY; + } + + public float getRenderOffsetZ() { + return (offsetZ - 0.5f) * 0.5f; + } + + public Vec3 getOffsetVector() { + return new Vec3(getRenderOffsetX(), getRenderOffsetY(), getRenderOffsetZ()); + } + + public void setOffsetEnabled(boolean enabled) { + this.offsetEnabled = enabled; + setChanged(); + } + + public boolean isOffsetEnabled() { + return offsetEnabled; + } + + public void setSpeed(float speed) { + this.speed = Math.max(0.001f, Math.min(0.1f, speed)); // 限制速度范围 + setChanged(); + } + + public float getSpeed() { + return speed; + } + + public void resetOffset() { + offsetX = 0.5f; + offsetY = MIN_OFFSET; + offsetZ = 0.5f; + movingForward = true; + setChanged(); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + public void setStopping(boolean stopping) { + isStopping = stopping; + } + + public void setActive(boolean active) { + isActive = active; + } + + public boolean isStopping() { + return isStopping; + } + + public boolean isActive() { + return isActive; + } + + @Override + public void saveAdditional(@NotNull CompoundTag compoundTag) { + super.saveAdditional(compoundTag); + NBTWriter.of(compoundTag) + .booleanValue("isEnable", isActive) + .booleanValue("isStopping", isStopping) + .floatValue("offsetX", offsetX) + .floatValue("offsetY", offsetY) + .floatValue("offsetZ", offsetZ) + .floatValue("speed", speed) + .booleanValue("movingForward", movingForward) + .booleanValue("offsetEnabled", offsetEnabled); + } + + @Override + public void load(@NotNull CompoundTag compoundTag) { + super.load(compoundTag); + NBTReader.of(compoundTag) + .booleanValue("isEnable", this::setActive) + .booleanValue("isStopping", this::setStopping) + .floatValue("offsetX", v -> offsetX = v) + .floatValue("offsetY", v -> offsetY = v) + .floatValue("offsetZ", v -> offsetZ = v) + .floatValue("speed", this::setSpeed) + .booleanValue("movingForward", v -> movingForward = v) + .booleanValue("offsetEnabled", this::setOffsetEnabled); + } + + @Override + public AABB getRenderBoundingBox() { + BlockPos pos = this.getBlockPos(); + return new AABB(pos.getX() - 2, pos.getY() - 2, pos.getZ() - 2, pos.getX() + 2, pos.getY() + 2, pos.getZ() + 2); + } + + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public @NotNull CompoundTag getUpdateTag() { + return saveWithoutMetadata(); + } + @FunctionalInterface + public interface SpecialAction { + SpecialAction EMPTY = (level, machineBlockEntity, entity, pos, state, ticks) -> {}; + + void doTick(Level level, LoveMachineBlockEntity machineBlockEntity, Entity entity, BlockPos pos , BlockState state, long ticks); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/PilloryBlockEntity.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/PilloryBlockEntity.java new file mode 100644 index 00000000..0c565990 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/PilloryBlockEntity.java @@ -0,0 +1,35 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.block.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; + +public class PilloryBlockEntity extends BaseSeatBlockEntity { + public PilloryBlockEntity(BlockPos blockPos, BlockState blockState) { + super(EDGBlockEntities.PILLORY_BLOCK_ENTITY.get(), blockPos, blockState); + } + + @Override + public void passengerRot(@NotNull Entity passenger, @NotNull SeatEntity seat) { + super.passengerRot(passenger, seat); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/SpanishDonkeyBlockEntity.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/SpanishDonkeyBlockEntity.java index ab263b3d..cabdcfc8 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/SpanishDonkeyBlockEntity.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/blockentity/SpanishDonkeyBlockEntity.java @@ -32,7 +32,7 @@ import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; import top.r3944realms.eroticdungeongame.content.animation.EDGAnimation; import top.r3944realms.eroticdungeongame.content.block.type.SpanishDonkeyBlock; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; import top.r3944realms.lib39.util.nbt.NBTReader; import top.r3944realms.lib39.util.nbt.NBTWriter; @@ -140,7 +140,7 @@ public class SpanishDonkeyBlockEntity extends BaseSeatBlockEntity implements Geo @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add( - new AnimationController<>(this, "main_controller", 0, state -> { + new AnimationController<>(this, "spanish_donkey", 0, state -> { if (isShock) { if (isRoute) return state.setAndContinue(SHOCK_WR_ANIM); else return state.setAndContinue(SHOCK_WOR_ANIM); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractCrossSeatBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractCrossSeatBlock.java index 3136c75c..c27ff6d3 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractCrossSeatBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractCrossSeatBlock.java @@ -39,7 +39,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; import top.r3944realms.eroticdungeongame.content.block.part.CrossSeatPart; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractThreePartSeatBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractThreePartSeatBlock.java index 73df2784..5a9ce8a6 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractThreePartSeatBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractThreePartSeatBlock.java @@ -39,7 +39,7 @@ import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; import top.r3944realms.eroticdungeongame.content.block.multiply.horizontal.HorizontalTriplePlankSeatBlock; import top.r3944realms.eroticdungeongame.content.block.part.AdvanceSeatPart; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractTwoPartSeatBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractTwoPartSeatBlock.java index bbe4c4e5..2a135cee 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractTwoPartSeatBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/multiply/AbstractTwoPartSeatBlock.java @@ -38,7 +38,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; import top.r3944realms.eroticdungeongame.content.block.part.SeatPart; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/CuffBedBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/CuffBedBlock.java index 146fe463..ca750dbc 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/CuffBedBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/CuffBedBlock.java @@ -28,7 +28,7 @@ import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.content.block.IColorBlock; import top.r3944realms.eroticdungeongame.content.block.multiply.horizontal.HorizontalDoubleSeatBlock; import top.r3944realms.eroticdungeongame.content.block.part.SeatPart; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.lib39.util.shape.ShapeUtil; import java.util.EnumMap; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/DungeonCraftingTableBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/DungeonCraftingTableBlock.java index c26e339f..d613dba9 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/DungeonCraftingTableBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/DungeonCraftingTableBlock.java @@ -30,7 +30,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.content.menu.DungeonCraftingMenu; -import top.r3944realms.eroticdungeongame.content.register.EDGCustomStats; +import top.r3944realms.eroticdungeongame.core.register.EDGCustomStats; public class DungeonCraftingTableBlock extends Block { private static final Component CONTAINER_TITLE = Component.translatable("container.eroticdungeongame.crafting_table"); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/IronCageBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/IronCageBlock.java index 3900d59c..4f6ad8c8 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/IronCageBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/IronCageBlock.java @@ -40,7 +40,7 @@ import top.r3944realms.eroticdungeongame.content.block.ISeatBlock; import top.r3944realms.eroticdungeongame.content.block.blockentity.IronCageBlockEntity; import top.r3944realms.eroticdungeongame.content.block.multiply.vertical.VerticalDoubleSeatBlock; import top.r3944realms.eroticdungeongame.content.block.part.SeatPart; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; import top.r3944realms.lib39.util.shape.ShapeUtil; import java.util.EnumMap; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/LoveMachineBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/LoveMachineBlock.java new file mode 100644 index 00000000..4039760f --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/LoveMachineBlock.java @@ -0,0 +1,301 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.block.type; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.util.ParticleUtils; +import net.minecraft.util.RandomSource; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import top.r3944realms.eroticdungeongame.client.gui.screens.OffsetConfigScreen; +import top.r3944realms.eroticdungeongame.content.block.ISeatBlock; +import top.r3944realms.eroticdungeongame.content.block.blockentity.LoveMachineBlockEntity; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; +import top.r3944realms.lib39.util.shape.ShapeUtil; + +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings("deprecation") +public class LoveMachineBlock extends DirectionalBlock implements SimpleWaterloggedBlock, EntityBlock { + public static final Map SHAPES ; + public static final BooleanProperty POWERED = BooleanProperty.create("powered"); + public static final Map ACTIONS = new HashMap<>(); + public final String type; + static { + ACTIONS.put("end_rod", ((level, state, pos, random) -> { + Direction direction = state.getValue(FACING); + if(level.getBlockEntity(pos) instanceof LoveMachineBlockEntity be) { + pos = LoveMachineBlockEntity.calculateOffsetPosition(pos, direction, be); + double d0 = (double)pos.getX() + 0.55 - (double)(random.nextFloat() * 0.1F); + double d1 = (double)pos.getY() + 0.55 - (double)(random.nextFloat() * 0.1F); + double d2 = (double)pos.getZ() + 0.55 - (double)(random.nextFloat() * 0.1F); + double d3 = 0.4F - (random.nextFloat() + random.nextFloat()) * 0.4F; + if (random.nextInt(5) == 0) { + level.addParticle(ParticleTypes.END_ROD, d0 + (double) direction.getStepX() * d3, d1 + (double) direction.getStepY() * d3, d2 + (double) direction.getStepZ() * d3, random.nextGaussian() * 0.005, random.nextGaussian() * 0.005, random.nextGaussian() * 0.005); + } + } + + })); + ACTIONS.put("lightning_rod", ((level, state, pos, random) -> { + if (level.isThundering() && (long)level.random.nextInt(200) <= level.getGameTime() % 200L && pos.getY() == level.getHeight(Heightmap.Types.WORLD_SURFACE, pos.getX(), pos.getZ()) - 1) { + if(level.getBlockEntity(pos) instanceof LoveMachineBlockEntity be) { + Direction direction = state.getValue(FACING); + pos = LoveMachineBlockEntity.calculateOffsetPosition(pos, direction, be); + ParticleUtils.spawnParticlesAlongAxis(state.getValue(FACING).getAxis(), level, pos, 0.125, ParticleTypes.ELECTRIC_SPARK, UniformInt.of(1, 2)); + } + + } + })); + } + public LoveMachineBlock(Properties properties, String type) { + super(properties); + this.type = type; + registerDefaultState( + getStateDefinition().any() + .setValue(FACING, Direction.NORTH) + .setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE) + .setValue(POWERED, Boolean.FALSE) + ); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.@NotNull Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(POWERED, FACING, BlockStateProperties.WATERLOGGED); + } + static { + SHAPES = ShapeUtil.createUniformDirectionMap( + ShapeUtil.builder() + .addPixelBox(3, 0, 3.075, 13, 10, 5.075) + .addPixelBox(3, 0, 5.075, 13, 10, 13.075) + .build() + ); + VoxelShape shape = ShapeUtil.builder() + .addPixelBox(3, 0, 3.0749999999999993, 13, 10, 5.074999999999999) + .addPixelBox(3, 0, 5.074999999999999, 13, 10, 13.075) + .build(); + SHAPES.put(Direction.UP, shape); + shape = ShapeUtil.builder() + .addPixelBox(3, 6, 3.0749999999999993, 13, 16, 5.074999999999999) + .addPixelBox(3, 6, 5.074999999999999, 13, 16, 13.075) + .build(); + SHAPES.put(Direction.DOWN, shape); + } + + @Override + public @NotNull InteractionResult use(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand hand, @NotNull BlockHitResult hit) { + if (!level.isClientSide) return InteractionResult.SUCCESS; + + // 潜行右键打开配置界面 + if (hand.equals(InteractionHand.MAIN_HAND) && player.getItemInHand(hand).is(Items.FEATHER)) { + return useInClient(pos); + } + return InteractionResult.PASS; + } + @OnlyIn(Dist.CLIENT) + public InteractionResult useInClient(BlockPos pos) { + // 在客户端打开配置屏幕 + Minecraft.getInstance().setScreen(new OffsetConfigScreen(pos)); + return InteractionResult.SUCCESS; + } + + @Override + public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter level, @NotNull BlockPos pos, @NotNull CollisionContext context) { + VoxelShape baseShape = SHAPES.get(state.getValue(FACING)); + if (level.getBlockEntity(pos) instanceof LoveMachineBlockEntity blockEntity) { + if (blockEntity.isOffsetEnabled()) { + float offsetX = blockEntity.getRenderOffsetX(); + float offsetY = blockEntity.getRenderOffsetY(); + float offsetZ = blockEntity.getRenderOffsetZ(); + + // 根据方向调整偏移 + Direction facing = state.getValue(FACING); + Vec3 adjustedOffset = adjustOffsetByFacing(offsetX, offsetY, offsetZ, facing); + + // 应用偏移到碰撞箱 + return baseShape.move(adjustedOffset.x, adjustedOffset.y, adjustedOffset.z); + } + } + + return baseShape; + + } + /** + * 根据方块朝向调整偏移向量 + */ + public static @NotNull Vec3 adjustOffsetByFacing(float offsetX, float offsetY, float offsetZ, @NotNull Direction facing) { + return switch (facing) { + case DOWN -> new Vec3(-offsetX, -offsetZ, -offsetY); // 向下:Y变Z,Z变Y + case UP -> new Vec3(-offsetX, offsetZ, offsetY); // 向上:Y变Z,Z变Y + case SOUTH -> new Vec3(-offsetX, offsetY, -offsetZ); // 180度旋转 + case WEST -> new Vec3(-offsetZ, offsetY, offsetX); // 90度旋转 + case EAST -> new Vec3(offsetZ, offsetY, -offsetX); // 270度旋转 + default -> new Vec3(offsetX, offsetY, offsetZ); // NORTH或默认 + }; + } + /** + * 当周围方块变化时检测红石信号(电平触发) + */ + @SuppressWarnings("deprecation") + @Override + public void neighborChanged(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull Block neighborBlock, @NotNull BlockPos fromPos, boolean movedByPiston) { + if (!level.isClientSide) { + boolean isPowered = level.hasNeighborSignal(pos); + boolean wasPowered = state.getValue(POWERED); + + // 获取方块实体 + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof LoveMachineBlockEntity loveMachineBlockEntity) { + + if (isPowered && !wasPowered) { + // 红石激活 + level.setBlock(pos, state.setValue(POWERED, true), UPDATE_ALL); + loveMachineBlockEntity.setActive(true); + loveMachineBlockEntity.setChanged(); + // 播放激活音效 + level.playSound(null, pos, + net.minecraft.sounds.SoundEvents.LEVER_CLICK, + net.minecraft.sounds.SoundSource.BLOCKS, + 0.3F, 0.6F); + + } else if (!isPowered && wasPowered) { + // 红石失活 + level.setBlock(pos, state.setValue(POWERED, false), UPDATE_ALL); + loveMachineBlockEntity.setActive(false); + loveMachineBlockEntity.setStopping(true); + loveMachineBlockEntity.setChanged(); + // 播放失活音效 + level.playSound(null, pos, + net.minecraft.sounds.SoundEvents.LEVER_CLICK, + net.minecraft.sounds.SoundSource.BLOCKS, + 0.3F, 0.5F); + } + + // 如果状态有变化,通知客户端 + if (isPowered != wasPowered) { + level.sendBlockUpdated(pos, state, state.setValue(POWERED, isPowered), UPDATE_ALL); + } + } + } + + super.neighborChanged(state, level, pos, neighborBlock, fromPos, movedByPiston); + } + + @Override + public @NotNull FluidState getFluidState(@NotNull BlockState state) { + return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + /** + * 在方块被放置时检测红石信号 + */ + @SuppressWarnings("deprecation") + @Override + public void onPlace(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState oldState, boolean movedByPiston) { + if (!level.isClientSide) { + boolean isPowered = level.hasNeighborSignal(pos); + + if (isPowered != state.getValue(POWERED)) { + level.setBlock(pos, state.setValue(POWERED, isPowered), UPDATE_ALL); + + // 更新方块实体状态 + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof LoveMachineBlockEntity loveMachineBlockEntity) { + loveMachineBlockEntity.setActive(isPowered); + loveMachineBlockEntity.setStopping(!isPowered); + loveMachineBlockEntity.setChanged(); + } + } + } + } + + @Override + public void animateTick(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull RandomSource random) { + ACTIONS.getOrDefault(type, SpecialAnimationAction.EMPTY).doTick(level, state, pos, random); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(@NotNull Level pLevel, @NotNull BlockState pState, @NotNull BlockEntityType pBlockEntityType) { + return pLevel.isClientSide() ? null : ISeatBlock.createTickerHelper(pBlockEntityType, EDGBlockEntities.LOVE_MACHINE_BLOCK_ENTITY.get(), LoveMachineBlockEntity::serverTick); + } + + @Override + public @NotNull BlockState updateShape(@NotNull BlockState state, @NotNull Direction direction, @NotNull BlockState neighborState, @NotNull LevelAccessor level, @NotNull BlockPos pos, @NotNull BlockPos neighborPos) { + if (state.getValue(BlockStateProperties.WATERLOGGED)) { + level.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(level)); + } + return super.updateShape(state, direction, neighborState, level, pos, neighborPos); + } + + @Override + public BlockState getStateForPlacement(@NotNull BlockPlaceContext context) { + return this.defaultBlockState().setValue(FACING, context.getNearestLookingDirection().getOpposite()); + } + + + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockState blockState) { + return EDGBlockEntities.LOVE_MACHINE_BLOCK_ENTITY.get().create(blockPos, blockState); + } + + @Override + public boolean isPathfindable(@NotNull BlockState state, @NotNull BlockGetter level, @NotNull BlockPos pos, @NotNull PathComputationType type) { + return false; + } + + @FunctionalInterface + public interface SpecialAnimationAction { + SpecialAnimationAction EMPTY = (level, state, pos, random) -> {}; + void doTick(@NotNull Level level, @NotNull BlockState state, @NotNull BlockPos pos, @NotNull RandomSource random); + } + +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/PilloryBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/PilloryBlock.java index 7f798ea5..9b6b1ff2 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/PilloryBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/PilloryBlock.java @@ -16,8 +16,10 @@ package top.r3944realms.eroticdungeongame.content.block.type; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -35,10 +37,13 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.content.block.IWoodTypeBlock; -import top.r3944realms.eroticdungeongame.content.block.blockentity.DefaultSeatBlockEntity; +import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; import top.r3944realms.eroticdungeongame.content.block.multiply.vertical.VerticalDoubleSeatBlock; import top.r3944realms.eroticdungeongame.content.block.part.SeatPart; -import top.r3944realms.eroticdungeongame.content.service.SeatService; +import top.r3944realms.eroticdungeongame.content.item.DeviceKeyItem; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.service.SeatService; import top.r3944realms.lib39.util.lang.Pair; import top.r3944realms.lib39.util.shape.ShapeUtil; @@ -82,6 +87,7 @@ public class PilloryBlock extends VerticalDoubleSeatBlock implements IWoodTypeBl @Override public @NotNull InteractionResult use(@NotNull BlockState blockState, @NotNull Level level, @NotNull BlockPos blockPos, @NotNull Player player, @NotNull InteractionHand hand, @NotNull BlockHitResult hitResult) { + if (player.getItemInHand(InteractionHand.MAIN_HAND).is(EDGItems.DEVICE_KEY.get())) return InteractionResult.PASS; if (!player.isCrouching() && !level.isClientSide && blockState.getValue(PART) == SeatPart.HEAD) { boolean value = !getClosed(blockState); BlockEntity blockEntity = getBlockEntity(blockState, level, getPrimaryPartPos(blockState, blockPos)); @@ -90,22 +96,28 @@ public class PilloryBlock extends VerticalDoubleSeatBlock implements IWoodTypeBl List entitiesOfClass = level.getEntitiesOfClass(Player.class, AABB.ofSize(blockPos.getCenter(), 2.0, 2.0, 2.0)); if (!entitiesOfClass.isEmpty()){ Player player1 = entitiesOfClass.get(0); + if (blockEntity instanceof BaseSeatBlockEntity baseSeat) { - if (blockEntity instanceof DefaultSeatBlockEntity entity) { - if (Objects.equals(player.getUUID(), entity.getBoundPlayerUUID())) { - return InteractionResult.FAIL; - } - if (!entity.bindPlayerToSeat(level, blockPos.below(), blockState, player1)) return InteractionResult.FAIL; + if (Objects.equals(player.getUUID(), baseSeat.getBoundPlayerUUID())) { + return InteractionResult.FAIL; + } + if (!baseSeat.bindPlayerToSeat(level, blockPos.below(), blockState, player1)) + return InteractionResult.FAIL; } } } } else { - if (blockEntity instanceof DefaultSeatBlockEntity entity) { - if (Objects.equals(player.getUUID(), entity.getBoundPlayerUUID())) { + if (blockEntity instanceof BaseSeatBlockEntity baseSeat) { + if (Objects.equals(player.getUUID(), baseSeat.getBoundPlayerUUID())) { + return InteractionResult.FAIL; + } + if (!baseSeat.hasLockCode() || DeviceKeyItem.isMatch(player.getItemInHand(hand), baseSeat.getLockCode())) { + SeatService.releasePlayer(level, blockPos); + } else { + player.displayClientMessage(Component.translatable("eroticdungeongame.message.quit.failed.locked").withStyle(ChatFormatting.RED), true); return InteractionResult.FAIL; } - SeatService.releasePlayer(level, blockPos); } } //TODO: 声音 @@ -167,4 +179,8 @@ public class PilloryBlock extends VerticalDoubleSeatBlock implements IWoodTypeBl builder.add(CLOSED); } + @Override + public BlockEntity createPrimaryBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockState blockState) { + return EDGBlockEntities.PILLORY_BLOCK_ENTITY.get().create(blockPos, blockState); + } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/ProneBenchBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/ProneBenchBlock.java index d801d226..d9058191 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/ProneBenchBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/ProneBenchBlock.java @@ -21,7 +21,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; import top.r3944realms.eroticdungeongame.content.block.IColorBlock; import top.r3944realms.eroticdungeongame.content.block.IWoodTypeBlock; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.lib39.util.shape.ShapeUtil; public class ProneBenchBlock extends AbstractSeatBlock implements IColorBlock, IWoodTypeBlock { diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/SpanishDonkeyBlock.java b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/SpanishDonkeyBlock.java index 402e0d5c..cfe26bfe 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/SpanishDonkeyBlock.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/block/type/SpanishDonkeyBlock.java @@ -38,7 +38,7 @@ import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; import top.r3944realms.eroticdungeongame.content.block.ISeatBlock; import top.r3944realms.eroticdungeongame.content.block.IWoodTypeBlock; import top.r3944realms.eroticdungeongame.content.block.blockentity.SpanishDonkeyBlockEntity; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; import top.r3944realms.lib39.util.shape.ShapeUtil; public class SpanishDonkeyBlock extends AbstractSeatBlock implements IWoodTypeBlock { @@ -84,11 +84,11 @@ public class SpanishDonkeyBlock extends AbstractSeatBlock implements IWoodTypeBl if (isPowered && !wasPowered) { // 红石激活:设置shock为true - level.setBlock(pos, state.setValue(POWERED, true), 3); + level.setBlock(pos, state.setValue(POWERED, true), UPDATE_ALL); spanishDonkeyBlock.setShock(true); spanishDonkeyBlock.setChanged(); - // 播放激活音效(可选) + // 播放激活音效 level.playSound(null, pos, net.minecraft.sounds.SoundEvents.LEVER_CLICK, net.minecraft.sounds.SoundSource.BLOCKS, @@ -96,11 +96,11 @@ public class SpanishDonkeyBlock extends AbstractSeatBlock implements IWoodTypeBl } else if (!isPowered && wasPowered) { // 红石失活:设置shock为false - level.setBlock(pos, state.setValue(POWERED, false), 3); + level.setBlock(pos, state.setValue(POWERED, false), UPDATE_ALL); spanishDonkeyBlock.setShock(false); spanishDonkeyBlock.setChanged(); - // 播放失活音效(可选) + // 播放失活音效 level.playSound(null, pos, net.minecraft.sounds.SoundEvents.LEVER_CLICK, net.minecraft.sounds.SoundSource.BLOCKS, @@ -109,7 +109,7 @@ public class SpanishDonkeyBlock extends AbstractSeatBlock implements IWoodTypeBl // 如果状态有变化,通知客户端 if (isPowered != wasPowered) { - level.sendBlockUpdated(pos, state, state.setValue(POWERED, isPowered), 3); + level.sendBlockUpdated(pos, state, state.setValue(POWERED, isPowered), UPDATE_ALL); } } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/capability/AbstractPlayerDungeonData.java b/src/main/java/top/r3944realms/eroticdungeongame/content/capability/AbstractPlayerDungeonData.java index 041b7b70..d8d5c8ce 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/capability/AbstractPlayerDungeonData.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/capability/AbstractPlayerDungeonData.java @@ -16,14 +16,13 @@ package top.r3944realms.eroticdungeongame.content.capability; -import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.api.capability.IPlayerDungeonData; -import top.r3944realms.eroticdungeongame.content.device.SeatType; import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; +import top.r3944realms.eroticdungeongame.core.device.SeatType; import top.r3944realms.lib39.core.sync.NBTEntitySyncData; import java.util.Objects; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/capability/DungeonDataSyncManager.java b/src/main/java/top/r3944realms/eroticdungeongame/content/capability/DungeonDataSyncManager.java index cf8d3f20..beda43a8 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/capability/DungeonDataSyncManager.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/capability/DungeonDataSyncManager.java @@ -26,7 +26,6 @@ import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.api.EroticDungeonGameApi; import top.r3944realms.eroticdungeongame.content.animation.EDGAnimation; import top.r3944realms.eroticdungeongame.content.block.ISeatBlock; -import top.r3944realms.eroticdungeongame.content.register.EDGCapabilities; import top.r3944realms.eroticdungeongame.content.util.FurnitureHelper; import top.r3944realms.lib39.core.sync.CachedSyncManager; @@ -57,7 +56,7 @@ public class DungeonDataSyncManager extends CachedSyncManager { private final AbstractPlayerDungeonData instance; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/command/EDGCommand.java b/src/main/java/top/r3944realms/eroticdungeongame/content/command/EDGCommand.java new file mode 100644 index 00000000..e6557f4b --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/command/EDGCommand.java @@ -0,0 +1,20 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.command; + +public class EDGCommand { +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/entity/SeatEntity.java b/src/main/java/top/r3944realms/eroticdungeongame/content/entity/SeatEntity.java index e6cbbf14..c52baa52 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/entity/SeatEntity.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/entity/SeatEntity.java @@ -26,6 +26,7 @@ import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -36,7 +37,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; -import top.r3944realms.eroticdungeongame.content.service.SeatService; +import top.r3944realms.eroticdungeongame.core.service.SeatService; import top.r3944realms.lib39.util.nbt.NBTReader; import top.r3944realms.lib39.util.nbt.NBTWriter; @@ -112,9 +113,31 @@ public class SeatEntity extends Entity { public void passengerRot(@NotNull Entity passenger) { + // 固定身体旋转 passenger.setYBodyRot(this.getYRot()); - passenger.setYRot(this.getYRot()); - passenger.yRotO = this.getYRot(); + + if (passenger instanceof LivingEntity livingEntity) { + // 获取当前头部旋转 + float currentHeadYaw = livingEntity.getYRot(); + float seatYaw = this.getYRot(); + + // 限制头部旋转范围(例如 ±90度) + float maxHeadTurn = 45.0f; + float diff = Mth.wrapDegrees(currentHeadYaw - seatYaw); + + // 应用限制 + if (Math.abs(diff) > maxHeadTurn) { + if (diff > 0) { + livingEntity.setYRot(seatYaw + maxHeadTurn); + } else { + livingEntity.setYRot(seatYaw - maxHeadTurn); + } + livingEntity.yHeadRot = livingEntity.getYRot(); + } + + // 保持身体固定 + livingEntity.yBodyRot = seatYaw; + } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/item/DeviceKeyItem.java b/src/main/java/top/r3944realms/eroticdungeongame/content/item/DeviceKeyItem.java new file mode 100644 index 00000000..d679ad12 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/item/DeviceKeyItem.java @@ -0,0 +1,189 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.api.workspace.Services; +import top.r3944realms.eroticdungeongame.content.block.ISeatBlock; +import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; +import top.r3944realms.eroticdungeongame.content.block.multiply.IHasPrimaryPart; +import top.r3944realms.eroticdungeongame.core.register.EDGSoundEvents; + +import java.util.List; +import java.util.Objects; + +public class DeviceKeyItem extends Item { + public static final String LOCK_CODE ="lockCode"; + public DeviceKeyItem(Properties properties) { + super(properties); + } + private static final int keyLong = 9; + private static final String[] keyString = new String[]{ + "║","╒","╓","╔","╕","╖","╗", + "╘","╙","╚","╛","╜","╝","╞", + "╟","╠","╡","╢","╣","╤","╥", + "╦","╧","╨","╩","╪","╫","╬" + }; + + public static long generateLockCode(@NotNull LivingEntity entity) { + long base = 1; + long result = 0; + RandomSource randomSource = entity.getRandom(); + for (int i = 0; i < keyLong - 1; i++, base *= 100) { + int random = randomSource.nextInt(keyString.length); + result += base * random; + } + int color = randomSource.nextInt(16); + return result + color * base; + } + + public static @NotNull Component turnLockCodeToComponent(long lockCode){ + long base = 1; + MutableComponent component = Component.literal(""); + for (int i = 0; i < keyLong - 1; i++, base *= 100) { + int result = (int) (lockCode / base % 100); + try {component.append(Component.literal(keyString[result])); + }catch (Exception ignored){} + } + int color = (int) (lockCode / base % 100); + ChatFormatting componentColor = ChatFormatting.getById(color); + if(componentColor == null) componentColor = ChatFormatting.WHITE; + component.withStyle(componentColor); + return component; + } + + @Override + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player player, @NotNull LivingEntity interactionTarget, @NotNull InteractionHand usedHand) { + if (player.level().isClientSide()) { + return InteractionResult.PASS; + } + return Services.WORK_SPACE.tryToDoIfInDeviceAndRet(interactionTarget, i -> { + if (player.level().getBlockEntity(i.getDeviceMainBlockPos()) instanceof BaseSeatBlockEntity base) { + return keyBindLogic(player.level().getBlockState(i.getDeviceMainBlockPos()), i.getDeviceMainBlockPos(), player.level(), player.getItemInHand(InteractionHand.MAIN_HAND), player); + } return InteractionResult.PASS; + }, () -> InteractionResult.PASS); + } + + @Override + public @NotNull InteractionResult useOn(@NotNull UseOnContext context) { + Level level = context.getLevel(); + if(context.getHand() == InteractionHand.MAIN_HAND && !level.isClientSide()) { + Player player = context.getPlayer(); + if(player != null) { + BlockPos pos = context.getClickedPos(); + ItemStack itemInHand = context.getItemInHand(); + BlockState state = level.getBlockState(pos); + InteractionResult success = keyBindLogic(state, pos, level, itemInHand, player); + if (success != null) return success; + } + } + return InteractionResult.PASS; + } + + private static @Nullable InteractionResult keyBindLogic(@NotNull BlockState state, BlockPos pos, Level level, ItemStack itemInHand, Player player) { + if (state.getBlock() instanceof ISeatBlock seatBlock) { + if (seatBlock instanceof IHasPrimaryPart part) { + pos = part.getPrimaryPartPos(state, pos); + } + if (level.getBlockEntity(pos) instanceof BaseSeatBlockEntity seat) { + CompoundTag tag = itemInHand.getOrCreateTag(); + if (seat.hasLockCode()) { + if (tag.contains(LOCK_CODE)) { + if (Objects.equals(tag.getLong(LOCK_CODE), seat.getLockCode())) { + seat.setLockCode(-1); + seat.setChanged(); + player.displayClientMessage(Component.translatable("eroticdungeongame.message.key.success.unlock").withStyle(ChatFormatting.GREEN) ,true); + level.playSound( null, pos, EDGSoundEvents.UNLOCKING.get(), SoundSource.BLOCKS); + return InteractionResult.SUCCESS; + } else { + player.displayClientMessage(Component.translatable("eroticdungeongame.message.key.failed.mismatch").withStyle(ChatFormatting.RED) ,true); + level.playSound( null, pos, SoundEvents.ITEM_BREAK, SoundSource.BLOCKS); + return InteractionResult.FAIL; + } + } else { + player.displayClientMessage(Component.translatable("eroticdungeongame.message.key.failed.mismatch").withStyle(ChatFormatting.RED) ,true); + } + } else { + long lockCode = -1; + if (tag.contains(LOCK_CODE)) { + if (tag.getLong(LOCK_CODE) != -1) { + lockCode = tag.getLong(LOCK_CODE); + } + } + if (lockCode == -1) { + lockCode = generateLockCode(player); + tag.putLong(LOCK_CODE, lockCode); + } + seat.setLockCode(lockCode); + seat.setChanged(); + player.displayClientMessage(Component.translatable("eroticdungeongame.message.key.success.locked").withStyle(ChatFormatting.GREEN) ,true); + level.playSound(null, pos, EDGSoundEvents.LOCKING.get(), SoundSource.BLOCKS); + return InteractionResult.SUCCESS; + } + } + } + return null; + } + + public static boolean isMatch(ItemStack stack, long code) { + return stack.getItem() instanceof DeviceKeyItem && stack.getOrCreateTag().contains(LOCK_CODE) && Objects.equals(stack.getOrCreateTag().getLong(LOCK_CODE), code); + } + + @Override + public void appendHoverText( + @NotNull ItemStack pStack, + @Nullable Level pLevel, + @NotNull List pTooltipComponents, + @NotNull TooltipFlag pIsAdvanced + ) { + CompoundTag tag = pStack.getOrCreateTag(); + boolean isEmpty = tag.isEmpty(); + if (!isEmpty && tag.contains(LOCK_CODE)) { + long lockCode = tag.getLong(LOCK_CODE); + MutableComponent component = Component.translatable( + "description." + EroticDungeon.MOD_ID + ".key_content" + ); + Component keyLockComponent = turnLockCodeToComponent(lockCode); + component.append(keyLockComponent); + pTooltipComponents.add(Component.translatable("message.eroticdungeongame.dungeon_key_02").withStyle(ChatFormatting.GRAY)); + pTooltipComponents.add(Component.translatable("message.eroticdungeongame.dungeon_key_03").withStyle(ChatFormatting.GRAY)); + pTooltipComponents.add(component); + + }else pTooltipComponents.add(Component.translatable("message.eroticdungeongame.dungeon_key_01").withStyle(ChatFormatting.GRAY)); + super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/item/IronCageItem.java b/src/main/java/top/r3944realms/eroticdungeongame/content/item/IronCageItem.java index 10bb2977..12f6a2b1 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/item/IronCageItem.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/item/IronCageItem.java @@ -28,7 +28,7 @@ import software.bernie.geckolib.core.animation.AnimationController; import software.bernie.geckolib.util.GeckoLibUtil; import top.r3944realms.eroticdungeongame.client.renderer.item.IronCageItemRenderer; import top.r3944realms.eroticdungeongame.content.block.blockentity.IronCageBlockEntity; -import top.r3944realms.eroticdungeongame.content.register.EDGBlocks; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; import java.util.function.Consumer; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/item/LoveMachineItem.java b/src/main/java/top/r3944realms/eroticdungeongame/content/item/LoveMachineItem.java new file mode 100644 index 00000000..447eb614 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/item/LoveMachineItem.java @@ -0,0 +1,90 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.item; + +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.SingletonGeoAnimatable; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.core.animation.AnimationController; +import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.util.GeckoLibUtil; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.client.renderer.item.LoveMachineItemRenderer; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +public class LoveMachineItem extends BlockItem implements GeoItem { + public final String type; + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static final Map LOVE_MACHINES = new HashMap<>(); + static { + LOVE_MACHINES.put("end_rod", EDGBlocks.END_ROD_LOVE_MACHINE.get()); + LOVE_MACHINES.put("lightning_rod", EDGBlocks.LIGHTNING_ROD_LOVE_MACHINE.get()); + } + public LoveMachineItem(Properties properties, String type) { + super(LOVE_MACHINES.getOrDefault(type, EDGBlocks.END_ROD_LOVE_MACHINE.get()) , properties); + this.type = type; + SingletonGeoAnimatable.registerSyncedAnimatable(this); + } + + + @Override + public void registerControllers(AnimatableManager.@NotNull ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController<>( + this, 0, state -> PlayState.STOP + )); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + + @Override + public void initializeClient(@NotNull Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + private LoveMachineItemRenderer renderer = null; + + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + if (this.renderer == null) + this.renderer = new LoveMachineItemRenderer(type); + return renderer; + } + }); + } + + @Override + public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List tooltip, @NotNull TooltipFlag flag) { + tooltip.add(Component.translatable("message." + EroticDungeon.MOD_ID + "." + "love_machine")); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/item/SpanishDonkeyItem.java b/src/main/java/top/r3944realms/eroticdungeongame/content/item/SpanishDonkeyItem.java index 8618404e..c25c5c16 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/item/SpanishDonkeyItem.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/item/SpanishDonkeyItem.java @@ -29,7 +29,7 @@ import software.bernie.geckolib.core.animation.AnimationController; import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import top.r3944realms.eroticdungeongame.client.renderer.item.SpanishDonkeyItemRenderer; -import top.r3944realms.eroticdungeongame.content.register.EDGBlocks; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; import java.util.function.Consumer; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/item/WhipItem.java b/src/main/java/top/r3944realms/eroticdungeongame/content/item/WhipItem.java index 398dec6f..884121bd 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/item/WhipItem.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/item/WhipItem.java @@ -49,9 +49,9 @@ import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.client.model.EDGArmPose; import top.r3944realms.eroticdungeongame.content.EDGToolTier; import top.r3944realms.eroticdungeongame.content.enchantment.CarrotAndStickEnchantment; -import top.r3944realms.eroticdungeongame.content.register.EDGEnchantments; -import top.r3944realms.eroticdungeongame.content.register.EDGParticleTypes; -import top.r3944realms.eroticdungeongame.content.register.EDGSoundEvents; +import top.r3944realms.eroticdungeongame.core.register.EDGEnchantments; +import top.r3944realms.eroticdungeongame.core.register.EDGParticleTypes; +import top.r3944realms.eroticdungeongame.core.register.EDGSoundEvents; import java.util.Map; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/menu/DungeonCraftingMenu.java b/src/main/java/top/r3944realms/eroticdungeongame/content/menu/DungeonCraftingMenu.java index 86c58153..8bd6255c 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/menu/DungeonCraftingMenu.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/menu/DungeonCraftingMenu.java @@ -31,9 +31,9 @@ import net.minecraftforge.common.ForgeHooks; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipe; import top.r3944realms.eroticdungeongame.content.recipe.EDGRecipeBookTypes; -import top.r3944realms.eroticdungeongame.content.register.EDGBlocks; -import top.r3944realms.eroticdungeongame.content.register.EDGMenuTypes; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeTypes; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; +import top.r3944realms.eroticdungeongame.core.register.EDGMenuTypes; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeTypes; import java.util.Objects; import java.util.Optional; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonCustomRecipe.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonCustomRecipe.java new file mode 100644 index 00000000..e8861cba --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonCustomRecipe.java @@ -0,0 +1,47 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.recipe; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public abstract class DungeonCustomRecipe implements DungeonRecipe { + private final ResourceLocation id; + private final DungeonCraftingBookCategory category; + + protected DungeonCustomRecipe(ResourceLocation id, DungeonCraftingBookCategory category) { + this.id = id; + this.category = category; + } + public @NotNull ResourceLocation getId() { + return this.id; + } + + public boolean isSpecial() { + return true; + } + + public @NotNull ItemStack getResultItem(@NotNull RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + public DungeonCraftingBookCategory category() { + return this.category; + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonKeyCopyRecipe.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonKeyCopyRecipe.java new file mode 100644 index 00000000..234f57a9 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonKeyCopyRecipe.java @@ -0,0 +1,90 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.recipe; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.content.item.DeviceKeyItem; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeSerializers; + +public class DungeonKeyCopyRecipe extends DungeonCustomRecipe { + + public DungeonKeyCopyRecipe(ResourceLocation id, DungeonCraftingBookCategory category) { + super(id, category); + } + + @Override + public ItemStack getOutput() { + return ItemStack.EMPTY; + } + + @Override + public boolean matches(@NotNull CraftingContainer craftingContainer, @NotNull Level level) { + int emptyKeyCount = 0, tempCopyKeyCount = 0; + for (int i = 0; i < craftingContainer.getWidth(); i++) { + for (int j = 0; j < craftingContainer.getHeight(); j++) { + int slotId = i * craftingContainer.getWidth() + j; + ItemStack stack = craftingContainer.getItem(slotId); + if (stack.getItem() instanceof DeviceKeyItem) { + if (stack.getOrCreateTag().contains(DeviceKeyItem.LOCK_CODE)) { + tempCopyKeyCount++; + } else emptyKeyCount++; + } + if (tempCopyKeyCount > 1 || emptyKeyCount > 1) return false; + } + } + return tempCopyKeyCount == 1 && emptyKeyCount == 1; + } + + @Override + public @NotNull ItemStack assemble(@NotNull CraftingContainer craftingContainer, @NotNull RegistryAccess registryAccess) { + long lockCode = -1; + ItemStack result = EDGItems.DEVICE_KEY.get().getDefaultInstance(); + for (int i = 0; i < craftingContainer.getWidth(); i++) { + for (int j = 0; j < craftingContainer.getHeight(); j++) { + int slotId = i * craftingContainer.getWidth() + j; + ItemStack stack = craftingContainer.getItem(slotId); + if (stack.getItem() instanceof DeviceKeyItem) { + if (stack.getOrCreateTag().contains(DeviceKeyItem.LOCK_CODE)) { + lockCode = stack.getOrCreateTag().getLong(DeviceKeyItem.LOCK_CODE); + } + } + } + } + if (lockCode != -1) { + result.setCount(2); + result.getOrCreateTag().putLong(DeviceKeyItem.LOCK_CODE, lockCode); + } + return result; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return (width >= 2 && height > 0) || (height >= 2 && width > 0); + } + + @Override + public @NotNull RecipeSerializer getSerializer() { + return EDGRecipeSerializers.DUNGEON_KEY_COPY.get(); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipe.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipe.java index 57505b01..138eb3d6 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipe.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipe.java @@ -21,7 +21,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeType; import org.jetbrains.annotations.NotNull; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeTypes; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeTypes; public interface DungeonRecipe extends Recipe { @Override diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipeCategory.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipeCategory.java index b0e52822..efc97d89 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipeCategory.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonRecipeCategory.java @@ -21,8 +21,6 @@ public enum DungeonRecipeCategory { MAIN_COLORFUL_DEVICE("main_colorful_devices"), MIXIN_WOODEN_AND_COLOR_DEVICES("mixin_wooden_and_color_devices"), METAL_DEVICES("metal_devices"), - OTHER_DEVICES("other_devices"), - COMBAT("combat"), TOOLS("tools"), MISC("misc") ; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapedRecipe.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapedRecipe.java index 515340f7..c3025f59 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapedRecipe.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapedRecipe.java @@ -39,7 +39,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeSerializers; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeSerializers; import java.util.Map; import java.util.Set; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapelessRecipe.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapelessRecipe.java index e0b70b84..37000248 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapelessRecipe.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/DungeonShapelessRecipe.java @@ -35,7 +35,7 @@ import net.minecraftforge.common.util.RecipeMatcher; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeSerializers; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeSerializers; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/EDGRecipeTypeCategories.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/EDGRecipeTypeCategories.java index fa7ff206..64aa2854 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/EDGRecipeTypeCategories.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/EDGRecipeTypeCategories.java @@ -21,7 +21,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.registries.RegistryObject; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; import java.util.function.Supplier; @@ -42,7 +42,6 @@ public class EDGRecipeTypeCategories { EDG_CRAFTING_SEARCH = RecipeBookCategories.create("edg_crafting_search", Items.COMPASS.getDefaultInstance()); WOODEN_DEVICE = RecipeBookCategories.create("edg_wooden_device", EDGItems.OAK_SPANISH_DONKEY.get().getDefaultInstance(), EDGItems.OAK_CUFF_POLE.get().getDefaultInstance()); METAL_DEVICE = RecipeBookCategories.create("edg_metal_device", getOrDefault(EDGItems.IRON_CAGE_ITEM, Items.BARRIER::getDefaultInstance)); - OTHER_DEVICE = RecipeBookCategories.create("edg_other_device", Items.STRUCTURE_VOID.getDefaultInstance()); MISC_THING = RecipeBookCategories.create("edg_misc_thing", getOrDefault(EDGItems.DUNGEON_CRAFTING_TABLE, Items.BARRIER::getDefaultInstance)); EQUIPMENT = RecipeBookCategories.create("edg_equipment", getOrDefault(EDGItems.WHIP, Items.DIAMOND_HELMET::getDefaultInstance)); } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/SimpleDungeonRecipeSerializer.java b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/SimpleDungeonRecipeSerializer.java new file mode 100644 index 00000000..bbd737c6 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/recipe/SimpleDungeonRecipeSerializer.java @@ -0,0 +1,51 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.content.recipe; + +import com.google.gson.JsonObject; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.NotNull; + +public class SimpleDungeonRecipeSerializer implements RecipeSerializer { + private final Factory constructor; + + public SimpleDungeonRecipeSerializer(Factory constructor) { + this.constructor = constructor; + } + + public @NotNull T fromJson(@NotNull ResourceLocation recipeId, @NotNull JsonObject serializedRecipe) { + DungeonCraftingBookCategory craftingbookcategory = DungeonCraftingBookCategory.CODEC.byName(GsonHelper.getAsString(serializedRecipe, "category", null), DungeonCraftingBookCategory.MISC); + return this.constructor.create(recipeId, craftingbookcategory); + } + + public T fromNetwork(@NotNull ResourceLocation recipeId, @NotNull FriendlyByteBuf buffer) { + DungeonCraftingBookCategory craftingbookcategory = buffer.readEnum(DungeonCraftingBookCategory.class); + return this.constructor.create(recipeId, craftingbookcategory); + } + + public void toNetwork(@NotNull FriendlyByteBuf buffer, @NotNull T recipe) { + buffer.writeEnum(recipe.category()); + } + + @FunctionalInterface + public interface Factory { + T create(ResourceLocation var1, DungeonCraftingBookCategory var2); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/util/FurnitureHelper.java b/src/main/java/top/r3944realms/eroticdungeongame/content/util/FurnitureHelper.java index ee79990f..ff931f51 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/util/FurnitureHelper.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/util/FurnitureHelper.java @@ -31,8 +31,8 @@ import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; import top.r3944realms.eroticdungeongame.content.block.multiply.IHasPrimaryPart; -import top.r3944realms.eroticdungeongame.content.device.SeatType; import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; +import top.r3944realms.eroticdungeongame.core.device.SeatType; import java.util.Arrays; import java.util.Optional; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/CarryOnCompat.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/CarryOnCompat.java similarity index 66% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/CarryOnCompat.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/CarryOnCompat.java index a93c538e..bea55a19 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/CarryOnCompat.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/CarryOnCompat.java @@ -14,11 +14,15 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat; +package top.r3944realms.eroticdungeongame.core.compat; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -27,10 +31,14 @@ import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.ModList; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.api.workspace.Services; import top.r3944realms.eroticdungeongame.content.block.ISeatBlock; +import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; +import top.r3944realms.eroticdungeongame.content.item.DeviceKeyItem; import top.r3944realms.lib39.core.compat.ICompat; import tschipp.carryon.common.carry.CarryOnData; import tschipp.carryon.common.carry.CarryOnDataManager; +import tschipp.carryon.events.EntityPickupEvent; public class CarryOnCompat implements ICompat { public static CarryOnCompat INSTANCE = new CarryOnCompat(); @@ -53,6 +61,7 @@ public class CarryOnCompat implements ICompat { @Override public void addCommonGameListener(@NotNull IEventBus gameBus) { gameBus.addListener(EventPriority.HIGHEST, this::onCarry); + gameBus.addListener(EventPriority.HIGHEST, this::onPickUpEvent); } private void onCarry(PlayerInteractEvent.@NotNull RightClickBlock event) { @@ -77,4 +86,22 @@ public class CarryOnCompat implements ICompat { } } } + private void onPickUpEvent(@NotNull EntityPickupEvent event) { + if (!event.isCanceled() && !event.player.level().isClientSide()) { + Boolean shouldCancelled = Services.WORK_SPACE.tryToDoIfInDeviceAndRet(event.target, i -> { + if (event.player.level().getBlockEntity(i.getDeviceMainBlockPos()) instanceof BaseSeatBlockEntity seat) { + if (!seat.hasLockCode()) { + return false; + } + ItemStack itemInHand = event.player.getItemInHand(InteractionHand.MAIN_HAND); + return !DeviceKeyItem.isMatch(itemInHand, seat.getLockCode()); + } + return false; + }, () -> false); + if (shouldCancelled) { + event.setCanceled(true); + event.player.displayClientMessage(Component.translatable("eroticdungeongame.message.quit.failed.locked").withStyle(ChatFormatting.RED), true); + } + } + } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/DungeonEmiPlugin.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/DungeonEmiPlugin.java similarity index 80% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/DungeonEmiPlugin.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/DungeonEmiPlugin.java index 6a073965..4d8a027e 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/DungeonEmiPlugin.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/DungeonEmiPlugin.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat.emi; +package top.r3944realms.eroticdungeongame.core.compat.emi; import dev.emi.emi.api.EmiEntrypoint; import dev.emi.emi.api.EmiPlugin; import dev.emi.emi.api.EmiRegistry; import dev.emi.emi.api.stack.EmiIngredient; import dev.emi.emi.api.stack.EmiStack; -import top.r3944realms.eroticdungeongame.content.compat.emi.category.DungeonCraftingEmiCategory; -import top.r3944realms.eroticdungeongame.content.compat.emi.category.DungeonCraftingRecipeMaker; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.compat.emi.category.DungeonCraftingEmiCategory; +import top.r3944realms.eroticdungeongame.core.compat.emi.category.DungeonCraftingRecipeMaker; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; import java.util.List; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingEmiCategory.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingEmiCategory.java similarity index 91% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingEmiCategory.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingEmiCategory.java index f9f82fad..90fc1c8d 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingEmiCategory.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingEmiCategory.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat.emi.category; +package top.r3944realms.eroticdungeongame.core.compat.emi.category; import dev.emi.emi.api.recipe.EmiRecipeCategory; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; public class DungeonCraftingEmiCategory extends EmiRecipeCategory { public static final ResourceLocation UID = EroticDungeon.rl("dungeon_crafting_table"); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingEmiRecipe.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingEmiRecipe.java similarity index 93% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingEmiRecipe.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingEmiRecipe.java index 05321e01..0660dccb 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingEmiRecipe.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingEmiRecipe.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat.emi.category; +package top.r3944realms.eroticdungeongame.core.compat.emi.category; import dev.emi.emi.api.recipe.EmiRecipe; import dev.emi.emi.api.recipe.EmiRecipeCategory; @@ -26,8 +26,8 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.compat.emi.DungeonEmiPlugin; -import top.r3944realms.eroticdungeongame.content.compat.emi.widget.DungeonCraftingNoSlotWidget; +import top.r3944realms.eroticdungeongame.core.compat.emi.DungeonEmiPlugin; +import top.r3944realms.eroticdungeongame.core.compat.emi.widget.DungeonCraftingNoSlotWidget; import java.util.List; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingRecipeMaker.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingRecipeMaker.java similarity index 80% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingRecipeMaker.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingRecipeMaker.java index c5551e23..3e2f8a0e 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/category/DungeonCraftingRecipeMaker.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/category/DungeonCraftingRecipeMaker.java @@ -14,19 +14,20 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat.emi.category; +package top.r3944realms.eroticdungeongame.core.compat.emi.category; import dev.emi.emi.api.EmiRegistry; import dev.emi.emi.api.stack.EmiIngredient; import dev.emi.emi.api.stack.EmiStack; +import top.r3944realms.eroticdungeongame.content.recipe.DungeonCustomRecipe; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipe; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeTypes; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeTypes; import java.util.List; public class DungeonCraftingRecipeMaker { public static void registerDungeonCraftingRecipes(EmiRegistry registry) { - List recipes = registry.getRecipeManager().getAllRecipesFor(EDGRecipeTypes.DUNGEON_CRAFTING.get()); + List recipes = registry.getRecipeManager().getAllRecipesFor(EDGRecipeTypes.DUNGEON_CRAFTING.get()).stream().filter(i->!(i instanceof DungeonCustomRecipe)).toList(); for (DungeonRecipe recipe : recipes) { List input = recipe.getIngredients().stream() .map(EmiIngredient::of) diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/widget/DungeonCraftingNoSlotWidget.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/widget/DungeonCraftingNoSlotWidget.java similarity index 93% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/widget/DungeonCraftingNoSlotWidget.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/widget/DungeonCraftingNoSlotWidget.java index 03cf770a..786874d2 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/emi/widget/DungeonCraftingNoSlotWidget.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/emi/widget/DungeonCraftingNoSlotWidget.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat.emi.widget; +package top.r3944realms.eroticdungeongame.core.compat.emi.widget; import dev.emi.emi.api.stack.EmiIngredient; import dev.emi.emi.api.widget.SlotWidget; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/jei/DungeonJeiPlugin.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/jei/DungeonJeiPlugin.java similarity index 85% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/jei/DungeonJeiPlugin.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/jei/DungeonJeiPlugin.java index 3534391a..0f49718d 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/jei/DungeonJeiPlugin.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/jei/DungeonJeiPlugin.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat.jei; +package top.r3944realms.eroticdungeongame.core.compat.jei; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; @@ -25,12 +25,13 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.client.gui.screens.DungeonCraftingScreen; -import top.r3944realms.eroticdungeongame.content.compat.jei.categorty.DungeonCraftingJeiCategory; import top.r3944realms.eroticdungeongame.content.menu.DungeonCraftingMenu; +import top.r3944realms.eroticdungeongame.content.recipe.DungeonCustomRecipe; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipe; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; -import top.r3944realms.eroticdungeongame.content.register.EDGMenuTypes; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeTypes; +import top.r3944realms.eroticdungeongame.core.compat.jei.categorty.DungeonCraftingJeiCategory; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGMenuTypes; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeTypes; import top.r3944realms.lib39.util.ILevelHelper; import java.util.List; @@ -56,7 +57,7 @@ public class DungeonJeiPlugin implements IModPlugin { level = ILevelHelper.getClientLevel(); } else throw new IllegalStateException("DungeonJeiPlugin doesn't have a level"); RecipeManager recipeManager = level.getRecipeManager(); - List recipes = recipeManager.getAllRecipesFor(EDGRecipeTypes.DUNGEON_CRAFTING.get()); + List recipes = recipeManager.getAllRecipesFor(EDGRecipeTypes.DUNGEON_CRAFTING.get()).stream().filter(i -> !(i instanceof DungeonCustomRecipe)).toList(); registration.addRecipes(DungeonCraftingJeiCategory.DUNGEON_RECIPE_TYPE, recipes); } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/jei/categorty/DungeonCraftingJeiCategory.java b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/jei/categorty/DungeonCraftingJeiCategory.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/compat/jei/categorty/DungeonCraftingJeiCategory.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/compat/jei/categorty/DungeonCraftingJeiCategory.java index d2b9eb10..72153525 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/compat/jei/categorty/DungeonCraftingJeiCategory.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/compat/jei/categorty/DungeonCraftingJeiCategory.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.compat.jei.categorty; +package top.r3944realms.eroticdungeongame.core.compat.jei.categorty; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; @@ -36,7 +36,7 @@ import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipe; import top.r3944realms.eroticdungeongame.content.recipe.DungeonShapedRecipe; import top.r3944realms.eroticdungeongame.content.recipe.DungeonShapelessRecipe; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; import java.util.Arrays; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/device/SeatType.java b/src/main/java/top/r3944realms/eroticdungeongame/core/device/SeatType.java similarity index 97% rename from src/main/java/top/r3944realms/eroticdungeongame/content/device/SeatType.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/device/SeatType.java index 90069f6f..c589597b 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/device/SeatType.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/device/SeatType.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.device; +package top.r3944realms.eroticdungeongame.core.device; import net.minecraft.world.entity.EntityType; import net.minecraft.world.phys.AABB; @@ -25,7 +25,7 @@ import top.r3944realms.eroticdungeongame.content.animation.EDGAnimation; import top.r3944realms.eroticdungeongame.content.block.FurnitureShapeType; import top.r3944realms.eroticdungeongame.content.block.type.*; import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; -import top.r3944realms.eroticdungeongame.content.register.EDGEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGEntities; import java.util.Map; import java.util.WeakHashMap; @@ -39,7 +39,7 @@ public enum SeatType { PETRINE_CROSS(FurnitureShapeType.PETRINE_CROSS, "petrine_cross", PetrineCrossBlock.class,0.5d, -0.2d, -0.8d, true, new AABB(0,0,0,0.32,1.85,0.32)), X_CROSS(FurnitureShapeType.VERTICAL_DOUBLE, "x_cross", XCrossBlock.class,0.5d, -0.15d, -0.8d, true, new AABB(0,0,0,0.32,1.85,0.32)), SPANISH_DONKEY(FurnitureShapeType.NORMAL, "spanish_donkey", SpanishDonkeyBlock.class, -0.5d, 0.1d, 0.5d, 90.0f, false, 0.75f), - PILLORY(FurnitureShapeType.VERTICAL_DOUBLE, "pillory", PilloryBlock.class, -0.5d, -0.2d, 1.05d, false, 0.65f), + PILLORY(FurnitureShapeType.VERTICAL_DOUBLE, "pillory", PilloryBlock.class, -0.5d, -0.2d, 1.05d, false, new AABB(0,0,0,0.4,1.25,0.4), 0.65f), WALL_RACK(FurnitureShapeType.OVERRIDE_VERTICAL_TRIPLE, "wall_rack", WallRackBlock.class, 0.5d, -1.5d, -0.8d, true, new AABB(0,0,0,0.32,1.85,0.32)), CUFF_POLE(FurnitureShapeType.VERTICAL_DOUBLE, "cuff_pole", CuffPoleBlock.class, 0.5d, -0.1d, -0.3d, true), PRONE_BENCH(FurnitureShapeType.NORMAL, "prone_bench", ProneBenchBlock.class, 0.5d, 0.10d, -0.7d, true, new AABB(0,0,0, 1,1, 1)), diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/device/SeatTypeRegistry.java b/src/main/java/top/r3944realms/eroticdungeongame/core/device/SeatTypeRegistry.java similarity index 97% rename from src/main/java/top/r3944realms/eroticdungeongame/content/device/SeatTypeRegistry.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/device/SeatTypeRegistry.java index 67e00d55..1239d8f1 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/device/SeatTypeRegistry.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/device/SeatTypeRegistry.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.device; +package top.r3944realms.eroticdungeongame.core.device; import net.minecraft.world.entity.EntityType; import net.minecraftforge.registries.RegistryObject; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/core/event/ClientHandler.java b/src/main/java/top/r3944realms/eroticdungeongame/core/event/ClientHandler.java index 75aff8ce..96b3fcab 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/core/event/ClientHandler.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/event/ClientHandler.java @@ -21,41 +21,55 @@ import com.mojang.math.Axis; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.client.event.RegisterParticleProvidersEvent; -import net.minecraftforge.client.event.RenderPlayerEvent; -import net.minecraftforge.client.event.ViewportEvent; +import net.minecraftforge.client.event.*; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.api.workspace.Services; +import top.r3944realms.eroticdungeongame.client.EDGKeyBindings; import top.r3944realms.eroticdungeongame.client.gui.screens.DungeonCraftingScreen; import top.r3944realms.eroticdungeongame.client.model.EDGArmPose; import top.r3944realms.eroticdungeongame.client.renderer.block.IronCageBlockRenderer; +import top.r3944realms.eroticdungeongame.client.renderer.block.LoveMachineBlockRenderer; import top.r3944realms.eroticdungeongame.client.renderer.block.SpanishDonkeyBlockRenderer; import top.r3944realms.eroticdungeongame.client.renderer.entity.EmptySeatRenderer; +import top.r3944realms.eroticdungeongame.content.block.ISeatBlock; +import top.r3944realms.eroticdungeongame.content.block.blockentity.LoveMachineBlockEntity; import top.r3944realms.eroticdungeongame.content.block.blockentity.SpanishDonkeyBlockEntity; +import top.r3944realms.eroticdungeongame.content.block.type.LoveMachineBlock; import top.r3944realms.eroticdungeongame.content.block.type.SpanishDonkeyBlock; import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; +import top.r3944realms.eroticdungeongame.content.item.DeviceKeyItem; import top.r3944realms.eroticdungeongame.content.particle.VerticalWhipSweepParticle; import top.r3944realms.eroticdungeongame.content.particle.WhipScarParticle; -import top.r3944realms.eroticdungeongame.content.register.EDGBlockEntities; -import top.r3944realms.eroticdungeongame.content.register.EDGEntities; -import top.r3944realms.eroticdungeongame.content.register.EDGMenuTypes; -import top.r3944realms.eroticdungeongame.content.register.EDGParticleTypes; +import top.r3944realms.eroticdungeongame.core.network.EDGNetworkHandler; +import top.r3944realms.eroticdungeongame.core.network.toServer.RequestQuitDevicePacket; +import top.r3944realms.eroticdungeongame.core.register.EDGBlockEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGEntities; +import top.r3944realms.eroticdungeongame.core.register.EDGMenuTypes; +import top.r3944realms.eroticdungeongame.core.register.EDGParticleTypes; +import top.r3944realms.eroticdungeongame.util.EntityUtil; import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Optional; public class ClientHandler { @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = EroticDungeon.MOD_ID, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) @@ -130,12 +144,31 @@ public class ClientHandler { float pRotationYaw = (float)(Math.cos((double)player.tickCount * 3.25) * Math.PI * percent); poseStack.mulPose(Axis.YP.rotationDegrees(pRotationYaw)); } + + @SubscribeEvent + public static void onKetBoardInput(InputEvent.Key event) { + Minecraft minecraft = Minecraft.getInstance(); + LocalPlayer player = minecraft.player; + if(player == null) return; + if (EDGKeyBindings.KEY_QUIT.isDown()) { + if (minecraft.level ==null) return; + ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); + if (Services.WORK_SPACE.isInDevice(player)) { + EDGNetworkHandler.CHANNEL.sendToServer(new RequestQuitDevicePacket(itemInHand.isEmpty() || !itemInHand.getOrCreateTag().contains(DeviceKeyItem.LOCK_CODE) ? Optional.empty() : Optional.of(itemInHand.getOrCreateTag().getLong(DeviceKeyItem.LOCK_CODE)),Optional.empty())); + } else { + List refLookAtEntityHitResult = EntityUtil.getRefLookAtEntityHitResult(player, minecraft.level, 6, Services.WORK_SPACE::isInDevice, i -> i.getBlock() instanceof ISeatBlock); + Entity entity = EntityUtil.getTheNearestEntityFromHitResultList(player, refLookAtEntityHitResult); + if (entity != null) { + EDGNetworkHandler.CHANNEL.sendToServer(new RequestQuitDevicePacket(itemInHand.isEmpty() || !itemInHand.getOrCreateTag().contains(DeviceKeyItem.LOCK_CODE) ? Optional.empty() : Optional.of(itemInHand.getOrCreateTag().getLong(DeviceKeyItem.LOCK_CODE)), Optional.of(entity.getUUID()))); + } + } + } + } } @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = EroticDungeon.MOD_ID, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public static class Mod extends ClientHandler { @SubscribeEvent public static void onFMLClientSetUp (FMLClientSetupEvent event) { -// event.enqueueWork(AnimationLayers::initialize); event.enqueueWork(() -> { MenuScreens.register(EDGMenuTypes.DUNGEON_CRAFTING_MENU.get(), DungeonCraftingScreen::new); EDGArmPose.init(); @@ -143,6 +176,7 @@ public class ClientHandler { } private static final Map SPANISH_DONKEY_RENDERERS = new HashMap<>(); + private static final Map LOVE_MACHINE_BLOCK_RENDERERS = new HashMap<>(); @SubscribeEvent public static void onRegisterRenderer (EntityRenderersEvent.RegisterRenderers event) { event.registerBlockEntityRenderer(EDGBlockEntities.IRON_CAGE_SEAT_BLOCK_ENTITY.get(), context -> new IronCageBlockRenderer()); @@ -176,6 +210,24 @@ public class ClientHandler { } } ); + for (String type : new String[]{"end_rod", "lightning_rod"}) { + LOVE_MACHINE_BLOCK_RENDERERS.put(type, new LoveMachineBlockRenderer(type)); + } + event.registerBlockEntityRenderer(EDGBlockEntities.LOVE_MACHINE_BLOCK_ENTITY.get(), new BlockEntityRendererProvider<>() { + @Override + public @NotNull BlockEntityRenderer create(@NotNull Context context) { + return new BlockEntityRenderer<>() { + private final Map renderers = LOVE_MACHINE_BLOCK_RENDERERS; + + @Override + public void render(@NotNull LoveMachineBlockEntity loveMachineBlockEntity, float v, @NotNull PoseStack poseStack, @NotNull MultiBufferSource multiBufferSource, int i, int i1) { + if (loveMachineBlockEntity.getBlockState().getBlock() instanceof LoveMachineBlock machine) { + LOVE_MACHINE_BLOCK_RENDERERS.get(machine.type).render(loveMachineBlockEntity, v, poseStack, multiBufferSource, i, i1); + } + } + }; + } + }); event.registerEntityRenderer(EDGEntities.SEAT.get(), EmptySeatRenderer::new); } @SubscribeEvent @@ -190,4 +242,10 @@ public class ClientHandler { ); } } + @SubscribeEvent + public static void onRegisterKeyMappings (RegisterKeyMappingsEvent event) { + event.register(EDGKeyBindings.KEY_QUIT); + } + + } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/core/event/CommonHandler.java b/src/main/java/top/r3944realms/eroticdungeongame/core/event/CommonHandler.java index efac8f18..a55e26dd 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/core/event/CommonHandler.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/event/CommonHandler.java @@ -33,13 +33,13 @@ import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.api.EroticDungeonGameApi; import top.r3944realms.eroticdungeongame.content.EDGVillagerTrades; import top.r3944realms.eroticdungeongame.content.capability.DungeonDataSyncManager; -import top.r3944realms.eroticdungeongame.content.compat.CarryOnCompat; import top.r3944realms.eroticdungeongame.content.recipe.DungeonCraftingBookCategory; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipe; import top.r3944realms.eroticdungeongame.content.recipe.EDGRecipeBookTypes; import top.r3944realms.eroticdungeongame.content.recipe.EDGRecipeTypeCategories; -import top.r3944realms.eroticdungeongame.content.register.EDGCapabilities; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeTypes; +import top.r3944realms.eroticdungeongame.core.compat.CarryOnCompat; +import top.r3944realms.eroticdungeongame.core.register.EDGCapabilities; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeTypes; import top.r3944realms.eroticdungeongame.datagen.EDGDataGenEvent; import top.r3944realms.lib39.api.event.RegisterCompatEvent; import top.r3944realms.lib39.api.event.SyncManagerRegisterEvent; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/core/network/EDGNetworkHandler.java b/src/main/java/top/r3944realms/eroticdungeongame/core/network/EDGNetworkHandler.java new file mode 100644 index 00000000..73ed0d5c --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/network/EDGNetworkHandler.java @@ -0,0 +1,47 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.core.network; + +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.core.network.toServer.OffsetConfigPacket; +import top.r3944realms.eroticdungeongame.core.network.toServer.RequestQuitDevicePacket; + +public class EDGNetworkHandler { + public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( + EroticDungeon.rl("main"), + () -> EroticDungeon.ModInfo.VERSION, + EroticDungeon.ModInfo.VERSION::equals, + EroticDungeon.ModInfo.VERSION::equals + ); + + public static void register() { + int cid = 0; + CHANNEL.messageBuilder(OffsetConfigPacket.class, cid++, NetworkDirection.PLAY_TO_SERVER) + .encoder(OffsetConfigPacket::encode) + .decoder(OffsetConfigPacket::new) + .consumerMainThread(OffsetConfigPacket::handle) + .add(); + CHANNEL.messageBuilder(RequestQuitDevicePacket.class, cid++, NetworkDirection.PLAY_TO_SERVER) + .encoder(RequestQuitDevicePacket::encode) + .decoder(RequestQuitDevicePacket::new) + .consumerMainThread(RequestQuitDevicePacket::handle) + .add(); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/OffsetConfigPacket.java b/src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/OffsetConfigPacket.java new file mode 100644 index 00000000..b2380a0e --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/OffsetConfigPacket.java @@ -0,0 +1,77 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.core.network.toServer; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.content.block.blockentity.LoveMachineBlockEntity; + +import java.util.function.Supplier; + +public record OffsetConfigPacket( + BlockPos blockPos , float speed, float offsetX, float offsetY, float offsetZ, boolean offsetEnabled +) { + public OffsetConfigPacket(@NotNull FriendlyByteBuf buf) { + this( + buf.readBlockPos(), + buf.readFloat(), + buf.readFloat(), + buf.readFloat(), + buf.readFloat(), + buf.readBoolean() + ); + } + public void encode(@NotNull FriendlyByteBuf buf) { + buf.writeBlockPos(blockPos); + buf.writeFloat(speed); + buf.writeFloat(offsetX); + buf.writeFloat(offsetY); + buf.writeFloat(offsetZ); + buf.writeBoolean(offsetEnabled); + } + + public void handle(@NotNull Supplier context) { + context.get().enqueueWork(() -> { + ServerPlayer player = context.get().getSender(); + if (player != null) { + Level level = player.level(); + if (level.hasChunkAt(blockPos)) { + BlockEntity blockEntity = level.getBlockEntity(blockPos); + if (blockEntity instanceof LoveMachineBlockEntity loveMachine) { + // 验证玩家有权限 + if (player.distanceToSqr(blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5) <= 64) { + loveMachine.setSpeed(speed); + loveMachine.setOffset(offsetX, offsetY, offsetZ); + loveMachine.setOffsetEnabled(offsetEnabled); + loveMachine.setChanged(); + + // 同步到客户端 + level.sendBlockUpdated(blockPos, loveMachine.getBlockState(), + loveMachine.getBlockState(), 3); + } + } + } + } + }); + context.get().setPacketHandled(true); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/RequestQuitDevicePacket.java b/src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/RequestQuitDevicePacket.java new file mode 100644 index 00000000..d5a8df69 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/network/toServer/RequestQuitDevicePacket.java @@ -0,0 +1,102 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.core.network.toServer; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.api.workspace.Services; +import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; + +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Supplier; + +public record RequestQuitDevicePacket(Optional code, Optional otherPlayer){ + public RequestQuitDevicePacket(@NotNull FriendlyByteBuf buf) { + this( + buf.readOptional(FriendlyByteBuf::readLong), + buf.readOptional(FriendlyByteBuf::readUUID) + ); + } + public void encode(@NotNull FriendlyByteBuf buf) { + buf.writeOptional(code, FriendlyByteBuf::writeLong); + buf.writeOptional(otherPlayer, FriendlyByteBuf::writeUUID); + } + + public void handle(@NotNull Supplier context) { + context.get().enqueueWork(() -> { + Player player = null; + Player sender = context.get().getSender(); + boolean isSelf = false; + if (otherPlayer.isPresent()) { + if (sender != null) { + Level level = sender.level(); + player = level.getPlayerByUUID(otherPlayer.get()); + } + } + if (player == null) { + player = sender; + isSelf = true; + } + if (player != null) { + + if (isSelf) { + Player finalPlayer = player; + if (player.isCreative()) { + Services.WORK_SPACE.tryToDoIfInDevice(player, i -> finalPlayer.unRide()); + } else { + Services.WORK_SPACE.tryToDoIfInDevice(player, i -> { + if(sender.level().getBlockEntity(i.getDeviceMainBlockPos()) instanceof BaseSeatBlockEntity seat) { + if (!seat.hasLockCode()) { + finalPlayer.unRide(); + } else if (code.isPresent() && Objects.equals(seat.getLockCode(), code.get())) { + finalPlayer.unRide(); + } else { + finalPlayer.displayClientMessage(Component.translatable("eroticdungeongame.message.quit.failed.locked").withStyle(ChatFormatting.RED), true); + } + } + }); + + } + } else { + if (!Services.WORK_SPACE.isInDevice(sender)) { + Player finalPlayer = player; + Services.WORK_SPACE.tryToDoIfInDevice(player, i -> { + if(sender.level().getBlockEntity(i.getDeviceMainBlockPos()) instanceof BaseSeatBlockEntity seat) { + if (!seat.hasLockCode()) { + finalPlayer.unRide(); + } else if (code.isPresent() && Objects.equals(seat.getLockCode(), code.get())) { + finalPlayer.unRide(); + } else { + sender.displayClientMessage(Component.translatable("eroticdungeongame.message.quit.failed.locked").withStyle(ChatFormatting.RED), true); + } + } + }); + } + } + } + + }); + context.get().setPacketHandled(true); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGBlockEntities.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGBlockEntities.java similarity index 74% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGBlockEntities.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGBlockEntities.java index f6f4f98e..a809fd56 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGBlockEntities.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGBlockEntities.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.eventbus.api.IEventBus; @@ -22,9 +22,7 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.block.blockentity.DefaultSeatBlockEntity; -import top.r3944realms.eroticdungeongame.content.block.blockentity.IronCageBlockEntity; -import top.r3944realms.eroticdungeongame.content.block.blockentity.SpanishDonkeyBlockEntity; +import top.r3944realms.eroticdungeongame.content.block.blockentity.*; public class EDGBlockEntities { public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, EroticDungeon.MOD_ID); @@ -47,6 +45,18 @@ public class EDGBlockEntities { .of(SpanishDonkeyBlockEntity::new, EDGBlocks.getSpanishDonkeyBlocks()) .build(null) ); + @SuppressWarnings("DataFlowIssue") + public static final RegistryObject> PILLORY_BLOCK_ENTITY = BLOCK_ENTITIES.register("pillory", + () -> BlockEntityType.Builder + .of(PilloryBlockEntity::new, EDGBlocks.getPilloryBlocks()) + .build(null) + ); + @SuppressWarnings("DataFlowIssue") + public static final RegistryObject> LOVE_MACHINE_BLOCK_ENTITY = BLOCK_ENTITIES.register("love_machine", + () -> BlockEntityType.Builder + .of(LoveMachineBlockEntity::new, EDGBlocks.END_ROD_LOVE_MACHINE.get(), EDGBlocks.LIGHTNING_ROD_LOVE_MACHINE.get()) + .build(null) + ); public static void register(IEventBus eventBus) { BLOCK_ENTITIES.register(eventBus); } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGBlocks.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGBlocks.java similarity index 98% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGBlocks.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGBlocks.java index 1250ca07..f9b4bd0c 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGBlocks.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGBlocks.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -27,7 +27,7 @@ import net.minecraftforge.registries.RegistryObject; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.content.block.type.*; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.lib39.util.block.BlockRegistryBuilder; import top.r3944realms.lib39.util.lang.Pair; @@ -51,10 +51,18 @@ public class EDGBlocks { public static final Map, RegistryObject> PRONE_BENCH_BLOCKS = new HashMap<>(); public static final Map> HANGING_POST_BLOCKS = new HashMap<>(); -public static final RegistryObject DUNGEON_CRAFTING_TABLE = BlockRegistryBuilder.create() - .withName("dungeon_crafting_table") - .registerBlock(BLOCKS, () -> new DungeonCraftingTableBlock(BlockBehaviour.Properties.copy(Blocks.CRAFTING_TABLE))) - .build(); + public static final RegistryObject DUNGEON_CRAFTING_TABLE = BlockRegistryBuilder.create() + .withName("dungeon_crafting_table") + .registerBlock(BLOCKS, () -> new DungeonCraftingTableBlock(BlockBehaviour.Properties.copy(Blocks.CRAFTING_TABLE))) + .build(); + public static final RegistryObject END_ROD_LOVE_MACHINE = BlockRegistryBuilder.create() + .withName("end_rod_love_machine") + .registerBlock(BLOCKS, () -> new LoveMachineBlock(BlockBehaviour.Properties.copy(Blocks.PISTON), "end_rod")) + .build(); + public static final RegistryObject LIGHTNING_ROD_LOVE_MACHINE = BlockRegistryBuilder.create() + .withName("lightning_rod_love_machine") + .registerBlock(BLOCKS, () -> new LoveMachineBlock(BlockBehaviour.Properties.copy(Blocks.PISTON), "lightning_rod")) + .build(); public static final RegistryObject WHITE_CUFF_BED = registerCuffBed(ColorContent.WHITE); public static final RegistryObject ORANGE_CUFF_BED = registerCuffBed(ColorContent.ORANGE); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCapabilities.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCapabilities.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCapabilities.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCapabilities.java index 7c35fbd7..19e3048d 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCapabilities.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCapabilities.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCreativeTabs.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCreativeTabs.java similarity index 82% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCreativeTabs.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCreativeTabs.java index 5bd172d9..c0bfa8ac 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCreativeTabs.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCreativeTabs.java @@ -14,11 +14,13 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.EnchantedBookItem; +import net.minecraft.world.item.enchantment.EnchantmentInstance; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; @@ -32,6 +34,12 @@ public class EDGCreativeTabs { .icon(() -> EDGItems.DUNGEON_CRAFTING_TABLE.get().getDefaultInstance()) .displayItems((itemDisplayParameters, output) -> { output.accept(EDGItems.DUNGEON_CRAFTING_TABLE.get()); + output.accept(EDGItems.DEVICE_KEY.get()); + output.accept(EDGItems.END_ROD_LOVE_MACHINE.get()); + output.accept(EDGItems.LIGHTNING_ROD_LOVE_MACHINE.get()); + for (int i = 1; i <= 5; i++){ + output.accept(EnchantedBookItem.createForEnchantment(new EnchantmentInstance(EDGEnchantments.CARROT_AND_STICK.get(), i))); + } output.accept(EDGItems.WHIP.get()); EDGItems.CUFF_BED_ITEMS.values().forEach(i -> output.accept(i.get())); EDGItems.RACK_ITEMS.values().forEach(i -> output.accept(i.get())); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCustomStats.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCustomStats.java similarity index 97% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCustomStats.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCustomStats.java index 6e36886b..2c337bfc 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGCustomStats.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGCustomStats.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGEnchantments.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGEnchantments.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGEnchantments.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGEnchantments.java index 0c82f4ee..2f2c746c 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGEnchantments.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGEnchantments.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.enchantment.Enchantment; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGEntities.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGEntities.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGEntities.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGEntities.java index c60f3d1b..e819d361 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGEntities.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGEntities.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGItems.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGItems.java similarity index 98% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGItems.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGItems.java index 025aefc3..74116f62 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGItems.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGItems.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -25,10 +25,8 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.item.IronCageItem; -import top.r3944realms.eroticdungeongame.content.item.SpanishDonkeyItem; -import top.r3944realms.eroticdungeongame.content.item.WhipItem; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.content.item.*; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.lib39.util.lang.Pair; import java.util.HashMap; @@ -57,6 +55,13 @@ public class EDGItems { public static final RegistryObject DUNGEON_CRAFTING_TABLE = ITEMS.register("dungeon_crafting_table", () -> new BlockItem(EDGBlocks.DUNGEON_CRAFTING_TABLE.get(), new Item.Properties()) ); + public static final RegistryObject END_ROD_LOVE_MACHINE = ITEMS.register( + "end_rod_love_machine", () -> new LoveMachineItem(new Item.Properties(), "end_rod") + ); + public static final RegistryObject LIGHTNING_ROD_LOVE_MACHINE = ITEMS.register( + "lightning_rod_love_machine", () -> new LoveMachineItem(new Item.Properties(), "lightning_rod") + ); + public static final RegistryObject DEVICE_KEY = ITEMS.register("device_key", () -> new DeviceKeyItem(new Item.Properties())); public static final RegistryObject WHIP = ITEMS.register("whip", () -> new WhipItem(5)); // 床物品注册 public static final RegistryObject WHITE_CUFF_BED = registerCuffBedItem(ColorContent.WHITE); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGMenuTypes.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGMenuTypes.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGMenuTypes.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGMenuTypes.java index 794e9475..6efd6b7a 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGMenuTypes.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGMenuTypes.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.inventory.MenuType; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGParticleTypes.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGParticleTypes.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGParticleTypes.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGParticleTypes.java index 65eba0a8..4a058b48 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGParticleTypes.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGParticleTypes.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.SimpleParticleType; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGPois.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGPois.java similarity index 97% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGPois.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGPois.java index 9f5029bd..6fab9377 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGPois.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGPois.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import com.google.common.collect.ImmutableSet; import net.minecraft.core.registries.Registries; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGRecipeSerializers.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGRecipeSerializers.java similarity index 80% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGRecipeSerializers.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGRecipeSerializers.java index 953a1b59..3e390328 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGRecipeSerializers.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGRecipeSerializers.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraftforge.eventbus.api.IEventBus; @@ -22,8 +22,10 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.content.recipe.DungeonKeyCopyRecipe; import top.r3944realms.eroticdungeongame.content.recipe.DungeonShapedRecipe; import top.r3944realms.eroticdungeongame.content.recipe.DungeonShapelessRecipe; +import top.r3944realms.eroticdungeongame.content.recipe.SimpleDungeonRecipeSerializer; public class EDGRecipeSerializers { public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, EroticDungeon.MOD_ID); @@ -34,6 +36,9 @@ public class EDGRecipeSerializers { public static final RegistryObject> DUNGEON_SHAPELESS_RECIPE = RECIPE_SERIALIZERS.register( "dungeon_shapeless_recipe", DungeonShapelessRecipe.Serializer::new ); + public static final RegistryObject> DUNGEON_KEY_COPY = RECIPE_SERIALIZERS.register( + "dungeon_key_copy_recipe", () -> new SimpleDungeonRecipeSerializer<>(DungeonKeyCopyRecipe::new) + ); public static void register(IEventBus eventBus) { RECIPE_SERIALIZERS.register(eventBus); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGRecipeTypes.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGRecipeTypes.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGRecipeTypes.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGRecipeTypes.java index 1c6a1403..d5b502d2 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGRecipeTypes.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGRecipeTypes.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.world.item.crafting.RecipeType; import net.minecraftforge.eventbus.api.IEventBus; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGSoundEvents.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGSoundEvents.java similarity index 85% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGSoundEvents.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGSoundEvents.java index daf6f1a8..994da88d 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGSoundEvents.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGSoundEvents.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; @@ -28,11 +28,15 @@ public class EDGSoundEvents { public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, EroticDungeon.MOD_ID); public static final ResourceLocation RL_LOCKING = EroticDungeon.rl("lock/lock"); public static final ResourceLocation RL_UNLOCKING = EroticDungeon.rl("lock/unlock"); + public static final ResourceLocation RL_IN = EroticDungeon.rl("piston/in"); + public static final ResourceLocation RL_OUT = EroticDungeon.rl("piston/out"); public static final ResourceLocation RL_WHIP = EroticDungeon.rl("whip"); public static final RegistryObject LOCKING = registerSound("lock"); public static final RegistryObject UNLOCKING = registerSound("unlock"); public static final RegistryObject WHIP = registerSound("whip"); + public static final RegistryObject IN = registerSound("in"); + public static final RegistryObject OUT = registerSound("out"); private static RegistryObject registerSound(String name) { ResourceLocation location = EroticDungeon.rl(name); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGVillagers.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGVillagers.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGVillagers.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGVillagers.java index 9612733a..c4dc1b74 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/EDGVillagers.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/EDGVillagers.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register; +package top.r3944realms.eroticdungeongame.core.register; import com.google.common.collect.ImmutableSet; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/tag/EDGBlockTags.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/tag/EDGBlockTags.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/tag/EDGBlockTags.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/tag/EDGBlockTags.java index 41f08e1d..0f52e942 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/tag/EDGBlockTags.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/tag/EDGBlockTags.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register.tag; +package top.r3944realms.eroticdungeongame.core.register.tag; import net.minecraft.core.registries.Registries; import net.minecraft.tags.TagKey; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/register/tag/EDGItemTags.java b/src/main/java/top/r3944realms/eroticdungeongame/core/register/tag/EDGItemTags.java similarity index 96% rename from src/main/java/top/r3944realms/eroticdungeongame/content/register/tag/EDGItemTags.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/register/tag/EDGItemTags.java index 3cedb314..1f7ff849 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/register/tag/EDGItemTags.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/register/tag/EDGItemTags.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.content.register.tag; +package top.r3944realms.eroticdungeongame.core.register.tag; import net.minecraft.core.registries.Registries; import net.minecraft.tags.TagKey; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/service/SeatService.java b/src/main/java/top/r3944realms/eroticdungeongame/core/service/SeatService.java similarity index 98% rename from src/main/java/top/r3944realms/eroticdungeongame/content/service/SeatService.java rename to src/main/java/top/r3944realms/eroticdungeongame/core/service/SeatService.java index 3634346e..36d6d54c 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/service/SeatService.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/core/service/SeatService.java @@ -17,7 +17,7 @@ /* * 座椅管理服务类 - 统一管理座椅绑定、释放和动画逻辑 */ -package top.r3944realms.eroticdungeongame.content.service; +package top.r3944realms.eroticdungeongame.core.service; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -35,11 +35,10 @@ import top.r3944realms.eroticdungeongame.content.animation.EDGAnimation; import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; import top.r3944realms.eroticdungeongame.content.block.multiply.IHasPrimaryPart; -import top.r3944realms.eroticdungeongame.content.device.SeatType; import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; -import top.r3944realms.eroticdungeongame.content.register.EDGCapabilities; -import top.r3944realms.eroticdungeongame.content.register.EDGEntities; import top.r3944realms.eroticdungeongame.content.util.FurnitureHelper; +import top.r3944realms.eroticdungeongame.core.device.SeatType; +import top.r3944realms.eroticdungeongame.core.register.EDGEntities; import java.util.Objects; import java.util.Optional; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGDataGenEvent.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGDataGenEvent.java index b476a2d1..7a5fc14c 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGDataGenEvent.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGDataGenEvent.java @@ -19,6 +19,9 @@ package top.r3944realms.eroticdungeongame.datagen; import net.minecraft.core.HolderLookup; import net.minecraft.data.DataGenerator; import net.minecraft.data.PackOutput; +import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.data.event.GatherDataEvent; import org.jetbrains.annotations.NotNull; @@ -31,6 +34,7 @@ import top.r3944realms.lib39.datagen.provider.SimpleLootTableProvider; import top.r3944realms.lib39.datagen.provider.SubProvidersWrapper; import top.r3944realms.lib39.datagen.value.McLocale; +import java.util.Set; import java.util.concurrent.CompletableFuture; public class EDGDataGenEvent { @@ -54,12 +58,17 @@ public class EDGDataGenEvent { gen.addProvider(true, new EDGSoundDefinitionsProvider(packOutput,existingFileHelper)); gen.addProvider(true, new SimpleLootTableProvider(packOutput, new SubProvidersWrapper() - .addBlockEntry(new EDGBlockLootTables())) + .addBlockEntry(new EDGBlockLootTables()) + .addEntry(new LootTableProvider.SubProviderEntry(EDGChestLootTable::new, LootContextParamSets.CHEST)) + ) ); gen.addProvider(true, new EDGRecipeProvider(packOutput)); gen.addProvider(true, new EDGPoiTypeTagsProvider(packOutput, lookupProvider, existingFileHelper)); gen.addProvider(true, new EDGAnimationProvider(gen)); gen.addProvider(true, new EDGAnimationLayerProvider(gen)); + gen.addProvider(true, + new DatapackBuiltinEntriesProvider(packOutput, event.getLookupProvider(), EDGRegistries.BUILDER, Set.of(EroticDungeon.MOD_ID)) + ); } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGRegistries.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGRegistries.java new file mode 100644 index 00000000..f070d6e8 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/EDGRegistries.java @@ -0,0 +1,11 @@ +package top.r3944realms.eroticdungeongame.datagen; + +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; +import top.r3944realms.eroticdungeongame.content.EDGDamageTypes; + +public class EDGRegistries { + public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() + .add(Registries.DAMAGE_TYPE, EDGDamageTypes::bootstrap) + ; +} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonCraftingRecipeBuilder.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonCraftingRecipeBuilder.java index 5810334a..195c1ac1 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonCraftingRecipeBuilder.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonCraftingRecipeBuilder.java @@ -27,8 +27,7 @@ public abstract class DungeonCraftingRecipeBuilder { return switch (category) { case MAIN_WOODEN_DEVICES, MAIN_COLORFUL_DEVICE, MIXIN_WOODEN_AND_COLOR_DEVICES -> DungeonCraftingBookCategory.WOODEN_DEVICE; case METAL_DEVICES -> DungeonCraftingBookCategory.METAL_DEVICE; - case OTHER_DEVICES -> DungeonCraftingBookCategory.OTHER_DEVICE; - case TOOLS, COMBAT -> DungeonCraftingBookCategory.EQUIPMENT; + case TOOLS -> DungeonCraftingBookCategory.EQUIPMENT; case MISC -> DungeonCraftingBookCategory.MISC; }; } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapedRecipeBuilder.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapedRecipeBuilder.java index 23beb3b1..52ee39e8 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapedRecipeBuilder.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapedRecipeBuilder.java @@ -38,7 +38,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.content.recipe.DungeonCraftingBookCategory; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipeCategory; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeSerializers; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeSerializers; import java.util.List; import java.util.Map; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapelessRecipeBuilder.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapelessRecipeBuilder.java index 51ea6c64..2225cccd 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapelessRecipeBuilder.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonShapelessRecipeBuilder.java @@ -35,7 +35,7 @@ import net.minecraft.world.level.ItemLike; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.content.recipe.DungeonCraftingBookCategory; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipeCategory; -import top.r3944realms.eroticdungeongame.content.register.EDGRecipeSerializers; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeSerializers; import javax.annotation.Nullable; import java.util.List; @@ -114,7 +114,7 @@ public class DungeonShapelessRecipeBuilder extends DungeonCraftingRecipeBuilder private void ensureValid(ResourceLocation id) { if (this.advancement.getCriteria().isEmpty()) { - throw new IllegalStateException("No way of obtaining recipe " + String.valueOf(id)); + throw new IllegalStateException("No way of obtaining recipe " + id); } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonSpecialRecipeBuilder.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonSpecialRecipeBuilder.java new file mode 100644 index 00000000..a633f4bd --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/builder/DungeonSpecialRecipeBuilder.java @@ -0,0 +1,60 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.datagen.builder; + +import com.google.gson.JsonObject; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeSerializer; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.content.recipe.DungeonCraftingBookCategory; +import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipe; + +import javax.annotation.Nullable; +import java.util.function.Consumer; + +public class DungeonSpecialRecipeBuilder extends DungeonCraftingRecipeBuilder { + final RecipeSerializer serializer; + public DungeonSpecialRecipeBuilder(RecipeSerializer serializer) { + this.serializer = serializer; + } + + public static DungeonSpecialRecipeBuilder special(RecipeSerializer serializer) { + return new DungeonSpecialRecipeBuilder(serializer); + } + public void save(Consumer finishedRecipeConsumer, final String id) { + finishedRecipeConsumer.accept(new DungeonCraftingRecipeBuilder.CraftingResult(DungeonCraftingBookCategory.MISC) { + public @NotNull RecipeSerializer getType() { + return DungeonSpecialRecipeBuilder.this.serializer; + } + + public @NotNull ResourceLocation getId() { + return EroticDungeon.rl(id); + } + + @Nullable + public JsonObject serializeAdvancement() { + return null; + } + + public ResourceLocation getAdvancementId() { + return EroticDungeon.rl(""); + } + }); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGAnimationProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGAnimationProvider.java index a3c13988..9efc5031 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGAnimationProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGAnimationProvider.java @@ -94,7 +94,7 @@ public class EDGAnimationProvider extends ACAnimationProvider { GenericAnimationData crux = AnimationDataBuilder .create(EDGAnimation.CRUX.getDefaultRL()) .withName("crux") - .addCamPosOffset(new Vec3(0, -0.25, 0)) + .addCamPosOffset(new Vec3(0, 0.0, 0)) .withCamPosOffsetRelative(true) .buildGeneric(); consumer.accept(crux); @@ -102,7 +102,7 @@ public class EDGAnimationProvider extends ACAnimationProvider { GenericAnimationData cuffPole = AnimationDataBuilder .create(EDGAnimation.CUFF_POLE.getDefaultRL()) .withName("cuff_pole") - .addCamPosOffset(new Vec3(0, -0.25, 0)) + .addCamPosOffset(new Vec3(0, 0.0, 0)) .withCamPosOffsetRelative(true) .buildGeneric(); consumer.accept(cuffPole); @@ -126,7 +126,7 @@ public class EDGAnimationProvider extends ACAnimationProvider { GenericAnimationData pillory = AnimationDataBuilder .create(EDGAnimation.PILLORY.getDefaultRL()) .withName("pillory") - .addCamPosOffset(new Vec3(0, -0.4, 0.7)) + .addCamPosOffset(new Vec3(0, -0.5, 0.7)) .withCamPitch(90.0f) .withCamPosOffsetRelative(true) .buildGeneric(); diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockModelProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockModelProvider.java index 74115e2b..635eed36 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockModelProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockModelProvider.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraftforge.client.model.generators.BlockModelProvider; import net.minecraftforge.common.data.ExistingFileHelper; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; public class EDGBlockModelProvider extends BlockModelProvider { diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockStatesProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockStatesProvider.java index 514772cc..d7090455 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockStatesProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockStatesProvider.java @@ -37,7 +37,7 @@ import top.r3944realms.eroticdungeongame.content.block.part.AdvanceSeatPart; import top.r3944realms.eroticdungeongame.content.block.part.CrossSeatPart; import top.r3944realms.eroticdungeongame.content.block.part.SeatPart; import top.r3944realms.eroticdungeongame.content.block.type.*; -import top.r3944realms.eroticdungeongame.content.register.EDGBlocks; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; public class EDGBlockStatesProvider extends BlockStateProvider { @@ -68,6 +68,7 @@ public class EDGBlockStatesProvider extends BlockStateProvider { generateProneBenchBlockStatesSimple(); generateHandingPostBlockStates(); generateDungeonCraftingBlockStates(); + generateLoveMachineBlockStatesSimple(); } private void generateDungeonCraftingBlockStates() { Block block = EDGBlocks.DUNGEON_CRAFTING_TABLE.get(); @@ -119,6 +120,34 @@ public class EDGBlockStatesProvider extends BlockStateProvider { }); } } + private void generateLoveMachineBlockStatesSimple() { + ModelFile geckoModel = new ModelFile.ExistingModelFile( + EroticDungeon.rl( "block/love_machine"), + models().existingFileHelper + ); + + getVariantBuilder(EDGBlocks.END_ROD_LOVE_MACHINE.get()).forAllStates(state -> { + Direction direction = state.getValue(BlockStateProperties.FACING); + int rotationY = getMainNorthRotationY(direction); + int rotationX = getRotationX(direction); + return ConfiguredModel.builder() + .modelFile(geckoModel) + .rotationY(rotationY) + .rotationX(rotationX) + .build(); + }); + getVariantBuilder(EDGBlocks.LIGHTNING_ROD_LOVE_MACHINE.get()).forAllStates(state -> { + Direction direction = state.getValue(BlockStateProperties.FACING); + int rotationY = getMainNorthRotationY(direction); + int rotationX = getRotationX(direction); + return ConfiguredModel.builder() + .modelFile(geckoModel) + .rotationY(rotationY) + .rotationX(rotationX) + .build(); + }); + + } private void generateBedBlockStates() { for (@NotNull CuffBedBlock cuffBedBlock : EDGBlocks.getCuffedBlocks()) { @@ -335,7 +364,6 @@ public class EDGBlockStatesProvider extends BlockStateProvider { ModelFile model = (part == AdvanceSeatPart.HEAD) ? leftModel : (part == AdvanceSeatPart.FOOT) ? rightModel : middleModel; int rotationY = getMainNorthRotationY(direction); - return ConfiguredModel.builder() .modelFile(model) .rotationY(rotationY) @@ -392,4 +420,13 @@ public class EDGBlockStatesProvider extends BlockStateProvider { default -> 0; }; } + @Contract(pure = true) + private int getRotationX(@NotNull Direction direction) { + return switch (direction) { + case UP -> 90; // 向上需要旋转90度 + case DOWN -> 270; // 向下需要旋转270度 + default -> 0; // 水平方向不需要X轴旋转 + }; + } + } \ No newline at end of file diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockTagsProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockTagsProvider.java index bddb5b00..e3a3c4de 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockTagsProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGBlockTagsProvider.java @@ -28,8 +28,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.content.block.AbstractSeatBlock; -import top.r3944realms.eroticdungeongame.content.register.EDGBlocks; -import top.r3944realms.eroticdungeongame.content.register.tag.EDGBlockTags; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; +import top.r3944realms.eroticdungeongame.core.register.tag.EDGBlockTags; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGChestLootTable.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGChestLootTable.java new file mode 100644 index 00000000..8df0b931 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGChestLootTable.java @@ -0,0 +1,97 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.datagen.provider; + +import net.minecraft.data.loot.LootTableSubProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.LootItemFunction; +import net.minecraft.world.level.storage.loot.functions.SetEnchantmentsFunction; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.eroticdungeongame.EroticDungeon; +import top.r3944realms.eroticdungeongame.core.register.EDGEnchantments; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; +import top.r3944realms.lib39.util.lang.Tuple; + +import java.util.Iterator; +import java.util.function.BiConsumer; + +public class EDGChestLootTable implements LootTableSubProvider { + @Override + public void generate(@NotNull BiConsumer biConsumer) { + biConsumer.accept( + EroticDungeon.rl("chests/dungeon_village"), + LootTable.lootTable() + .withPool(prepareDungeonVillage()) + ); + } + private LootPool.Builder prepareDungeonVillage() { + LootPool.Builder dungeon_village_pool = LootPool.lootPool() + .name("dungeon_village_pool") + .setRolls(UniformGenerator.between(15, 21)) + .add(LootItem.lootTableItem(Items.IRON_BARS) + .setWeight(1200)) + .add(LootItem.lootTableItem(Items.IRON_INGOT) + .setQuality(5) + .setWeight(1200) + ) + .add(LootItem.lootTableItem(Items.EMERALD) + .setQuality(132) + ) + .add(LootItem.lootTableItem(Items.GOLD_INGOT) + .setWeight(1100) + ) + .add(LootItem.lootTableItem(Items.DIAMOND) + .setQuality(32) + .setWeight(600) + ); + for (WoodType supportedWoodType : WoodTypeHelper.SUPPORTED_WOOD_TYPES) { + Tuple allWoodItems = WoodTypeHelper.getAllWoodItems(supportedWoodType); + Iterator iterator = allWoodItems.stream().iterator(); + while (iterator.hasNext()) { + dungeon_village_pool.add(LootItem.lootTableItem((ItemLike) iterator.next()).setQuality(4)); + } + } + + EDGItems.SEAT_ITEMS.forEach(i->dungeon_village_pool.add(LootItem.lootTableItem(i.get()))); + dungeon_village_pool.add(LootItem.lootTableItem(Items.ENCHANTED_BOOK) + .setWeight(60) + .apply(() -> createRandomEnchantment(EDGEnchantments.CARROT_AND_STICK.get(), 1.0f, 5.0f))); + dungeon_village_pool.add(LootItem.lootTableItem(Items.ENCHANTED_BOOK) + .setWeight(10) + .apply(() -> createRandomEnchantment(Enchantments.UNBREAKING, 1.0f, 3.0f))); + dungeon_village_pool.add(LootItem.lootTableItem(Items.ENCHANTED_BOOK) + .setWeight(130) + .apply(() -> createRandomEnchantment(Enchantments.SHARPNESS, 2.0f, 3.0f))); + return dungeon_village_pool; + } + private LootItemFunction createRandomEnchantment(Enchantment enchantment, float min, float max) { + if (min >= max) throw new IllegalArgumentException("min must be less than max"); + return new SetEnchantmentsFunction.Builder() + .withEnchantment(enchantment, UniformGenerator.between(min, max)) + .build(); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemModelProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemModelProvider.java index ccfad2b4..708be88e 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemModelProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemModelProvider.java @@ -23,7 +23,7 @@ import net.minecraftforge.client.model.generators.ItemModelProvider; import net.minecraftforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; public class EDGItemModelProvider extends ItemModelProvider { @@ -34,11 +34,13 @@ public class EDGItemModelProvider extends ItemModelProvider { @Override protected void registerModels() { generateWhipItemModel(); + generateDeviceItemModel(); generateCuffBedItemModels(); generateIronCageItemModel(); generateAllWoodenItemModels(); generateSpanishDonkeyItemModels(); generateDungeonCraftingTableItemModel(); + generateLoveMachineItemItemModel(); } protected void generateWhipItemModel() { @@ -47,6 +49,12 @@ public class EDGItemModelProvider extends ItemModelProvider { .parent(getExistingFile(EroticDungeon.mrl("item/handheld"))); } + protected void generateDeviceItemModel() { + getBuilder("device_key") + .texture("layer0", "item/device_key") + .parent(getExistingFile(EroticDungeon.mrl("item/handheld"))); + } + protected void generateDungeonCraftingTableItemModel() { getBuilder("dungeon_crafting_table") .parent(getExistingFile(EroticDungeon.rl("block/dungeon_crafting_table"))); @@ -57,6 +65,13 @@ public class EDGItemModelProvider extends ItemModelProvider { .parent(getExistingFile(EroticDungeon.rl("block/iron_cage"))); } + protected void generateLoveMachineItemItemModel() { + getBuilder("end_rod_love_machine") + .parent(getExistingFile(EroticDungeon.rl("block/love_machine"))); + getBuilder("lightning_rod_love_machine") + .parent(getExistingFile(EroticDungeon.rl("block/love_machine"))); + } + protected void generateSpanishDonkeyItemModels() { for (WoodType woodType : WoodTypeHelper.SUPPORTED_WOOD_TYPES){ getBuilder(woodType.name() + "_spanish_donkey") diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemTagProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemTagProvider.java index e1e86600..715429be 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemTagProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGItemTagProvider.java @@ -27,8 +27,8 @@ import net.minecraftforge.registries.RegistryObject; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; -import top.r3944realms.eroticdungeongame.content.register.tag.EDGItemTags; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.tag.EDGItemTags; import java.util.Collection; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGPoiTypeTagsProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGPoiTypeTagsProvider.java index 10bb58d4..f76bed8a 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGPoiTypeTagsProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGPoiTypeTagsProvider.java @@ -24,7 +24,7 @@ import net.minecraftforge.common.data.ExistingFileHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.register.EDGPois; +import top.r3944realms.eroticdungeongame.core.register.EDGPois; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGRecipeProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGRecipeProvider.java index 5f05fa41..75eb0f69 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGRecipeProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGRecipeProvider.java @@ -32,11 +32,13 @@ import org.jetbrains.annotations.NotNull; import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.content.block.IWoodTypeBlock; import top.r3944realms.eroticdungeongame.content.recipe.DungeonRecipeCategory; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; -import top.r3944realms.eroticdungeongame.content.register.tag.EDGItemTags; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGRecipeSerializers; +import top.r3944realms.eroticdungeongame.core.register.tag.EDGItemTags; import top.r3944realms.eroticdungeongame.datagen.builder.DungeonShapedRecipeBuilder; import top.r3944realms.eroticdungeongame.datagen.builder.DungeonShapelessRecipeBuilder; -import top.r3944realms.eroticdungeongame.datagen.value.ColorContent; +import top.r3944realms.eroticdungeongame.datagen.builder.DungeonSpecialRecipeBuilder; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; import top.r3944realms.lib39.util.lang.Pair; @@ -49,6 +51,7 @@ public class EDGRecipeProvider extends RecipeProvider { @Override protected void buildRecipes(@NotNull Consumer consumer) { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, EDGItems.DUNGEON_CRAFTING_TABLE.get()) .define('#', Items.DIAMOND) .define('X', Items.CRAFTING_TABLE) @@ -58,6 +61,25 @@ public class EDGRecipeProvider extends RecipeProvider { .pattern("Y#Y") .unlockedBy("has_diamond", has(Items.DIAMOND)) .save(consumer); + DungeonShapelessRecipeBuilder.shapeless(DungeonRecipeCategory.TOOLS, EDGItems.DEVICE_KEY.get()) + .requires(Items.IRON_INGOT) + .requires(Items.STONE) + .unlockedBy("has_iron_ingot", has(Items.IRON_INGOT)) + .save(consumer); + DungeonShapelessRecipeBuilder.shapeless(DungeonRecipeCategory.TOOLS, EDGItems.DEVICE_KEY.get()) + .requires(EDGItems.DEVICE_KEY.get()) + .unlockedBy("has_device_key", has(EDGItems.DEVICE_KEY.get())) + .save(consumer, EroticDungeon.rl("device_key_reset")); + DungeonShapelessRecipeBuilder.shapeless(DungeonRecipeCategory.TOOLS, EDGItems.END_ROD_LOVE_MACHINE.get()) + .requires(Items.STICKY_PISTON) + .requires(Items.END_ROD) + .unlockedBy("has_end_rod", has(Items.END_ROD)) + .save(consumer); + DungeonShapelessRecipeBuilder.shapeless(DungeonRecipeCategory.TOOLS, EDGItems.LIGHTNING_ROD_LOVE_MACHINE.get()) + .requires(Items.STICKY_PISTON) + .requires(Items.LIGHTNING_ROD) + .unlockedBy("has_lightning_rod", has(Items.LIGHTNING_ROD)) + .save(consumer); DungeonShapedRecipeBuilder.shaped(DungeonRecipeCategory.TOOLS, EDGItems.WHIP.get()) .define('X', Items.LEATHER) .define('Y', Items.STICK) @@ -217,5 +239,6 @@ public class EDGRecipeProvider extends RecipeProvider { .group("iron_cage") .unlockedBy("has_iron_bars", has(Items.IRON_BARS)) .save(consumer); + DungeonSpecialRecipeBuilder.special(EDGRecipeSerializers.DUNGEON_KEY_COPY.get()).save(consumer, "key_copy"); } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGSoundDefinitionsProvider.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGSoundDefinitionsProvider.java index 709b765b..deeb5ec1 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGSoundDefinitionsProvider.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/provider/EDGSoundDefinitionsProvider.java @@ -21,7 +21,7 @@ import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.common.data.SoundDefinition; import net.minecraftforge.common.data.SoundDefinitionsProvider; import top.r3944realms.eroticdungeongame.EroticDungeon; -import top.r3944realms.eroticdungeongame.content.register.EDGSoundEvents; +import top.r3944realms.eroticdungeongame.core.register.EDGSoundEvents; public class EDGSoundDefinitionsProvider extends SoundDefinitionsProvider { public EDGSoundDefinitionsProvider(PackOutput output, ExistingFileHelper helper) { @@ -50,5 +50,15 @@ public class EDGSoundDefinitionsProvider extends SoundDefinitionsProvider { sound(EDGSoundEvents.RL_WHIP, SoundDefinition.SoundType.SOUND) ) ); + add( + EDGSoundEvents.IN, + getSoundDefinition(EDGSoundEvents.getSubTitleTranslateKey("in"), + sound(EDGSoundEvents.RL_IN, SoundDefinition.SoundType.SOUND)) + ); + add( + EDGSoundEvents.OUT, + getSoundDefinition(EDGSoundEvents.getSubTitleTranslateKey("out"), + sound(EDGSoundEvents.RL_OUT, SoundDefinition.SoundType.SOUND)) + ); } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGBlockLootTables.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGBlockLootTables.java index a57ff129..71233b71 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGBlockLootTables.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGBlockLootTables.java @@ -17,7 +17,7 @@ package top.r3944realms.eroticdungeongame.datagen.value; import top.r3944realms.eroticdungeongame.content.block.type.*; -import top.r3944realms.eroticdungeongame.content.register.EDGBlocks; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; import top.r3944realms.lib39.datagen.provider.subprovider.BlockLootTables; public class EDGBlockLootTables extends BlockLootTables { @@ -58,5 +58,7 @@ public class EDGBlockLootTables extends BlockLootTables { dropSelf(hangingPostBlock); } dropSelf(EDGBlocks.DUNGEON_CRAFTING_TABLE); + dropSelf(EDGBlocks.END_ROD_LOVE_MACHINE); + dropSelf(EDGBlocks.LIGHTNING_ROD_LOVE_MACHINE); } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGLangKey.java b/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGLangKey.java index 1701d96b..a0af2a3f 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGLangKey.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/EDGLangKey.java @@ -20,9 +20,10 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Unmodifiable; import top.r3944realms.eroticdungeongame.EroticDungeon; import top.r3944realms.eroticdungeongame.content.block.type.*; -import top.r3944realms.eroticdungeongame.content.register.EDGBlocks; -import top.r3944realms.eroticdungeongame.content.register.EDGItems; -import top.r3944realms.eroticdungeongame.content.register.EDGSoundEvents; +import top.r3944realms.eroticdungeongame.core.register.EDGBlocks; +import top.r3944realms.eroticdungeongame.core.register.EDGItems; +import top.r3944realms.eroticdungeongame.core.register.EDGSoundEvents; +import top.r3944realms.eroticdungeongame.util.ColorContent; import top.r3944realms.eroticdungeongame.util.WoodTypeHelper; import top.r3944realms.lib39.datagen.value.ILangKeyValue; import top.r3944realms.lib39.datagen.value.ILangKeyValueCollection; @@ -51,10 +52,11 @@ public enum EDGLangKey implements ILangKeyValueCollection { } private void initKey() { + LangKeyValue mod = LangKeyValue.ofKey(EroticDungeon.MOD_ID + ".name", ModPartEnum.DEFAULT, + "Erotic Dungeon", "地牢游戏", "地牢游戲", "牢戯" + ); addLang( - LangKeyValue.ofKey(EroticDungeon.MOD_ID + ".name", ModPartEnum.DEFAULT, - "Erotic Dungeon", "地牢游戏", "地牢游戲", "牢戯" - ) + mod ); addLang( LangKeyValue.ofSupplier(EDGItems.WHIP, ModPartEnum.ITEM, @@ -76,6 +78,16 @@ public enum EDGLangKey implements ILangKeyValueCollection { "Whip Hit", "鞭子击打", "鞭子擊打", "鞭擊" ) ); + addLang( + LangKeyValue.ofKey(EDGSoundEvents.getSubTitleTranslateKey("in"), ModPartEnum.SOUND, + "Piston Sound", "活塞声", "活塞聲", "塞聲" + ) + ); + addLang( + LangKeyValue.ofKey(EDGSoundEvents.getSubTitleTranslateKey("out"), ModPartEnum.SOUND, + "Piston Sound", "活塞声", "活塞聲", "塞聲" + ) + ); addLang( LangKeyValue.ofKey(ModPartEnum.ENCHANTMENT.getFullKey(EroticDungeon.MOD_ID, "carrot_and_stick"), ModPartEnum.ENCHANTMENT, "Carrot And Stick", "恩威并施", "恩威並施", "恩威並施" @@ -84,10 +96,93 @@ public enum EDGLangKey implements ILangKeyValueCollection { LangKeyValue dungeonTable = LangKeyValue.ofSupplier(EDGBlocks.DUNGEON_CRAFTING_TABLE, ModPartEnum.BLOCK, "Dungeon Crafting Table", "地牢工作台", "地牢工作台", "牢戯製物案" ); + + + addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "love_machine"), ModPartEnum.MESSAGE, + "Right click with a feather to adjust settings", + "使用羽毛右键方块来调整设置", + "使用羽毛右鍵方塊來調整設置", + "以羽右擊方石,可調其設" + )); + addLang(LangKeyValue.ofKey("eroticdungeongame.message.quit.failed.locked", ModPartEnum.MESSAGE, + "Failed to unride the device / release player: this device is locked", + "退出设备 / 或释放玩家失敗:设备已上锁", + "退出設備 / 或釋放玩家失敗:设备已上鎖", + "离机 / 釋人未遂:已鎖" + )); + addLang(LangKeyValue.ofKey("eroticdungeongame.message.key.success.locked", ModPartEnum.MESSAGE, + "Successfully locked the device", + "成功锁定设备", + "成功鎖定設備", + "機關已閉" + )); + + addLang(LangKeyValue.ofKey("eroticdungeongame.message.key.failed.mismatch", ModPartEnum.MESSAGE, + "This key is mismatched with the current device", + "此钥匙与当前设备不匹配", + "此鑰匙與當前設備不匹配", + "鑰機不契" + )); + addLang(LangKeyValue.ofSupplier(EDGItems.DEVICE_KEY, ModPartEnum.ITEM, + "Device Key", + "设备钥匙", + "設備鑰匙", + "机钥" + )); + addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "dungeon_key_01"), ModPartEnum.MESSAGE, + "Hold key in main hand and Right Click to lock the corresponding device", + "主手持有钥匙右键锁定对应设备", + "主手持有鑰匙右鍵鎖定對應設備", + "主手持鑰,右擊,可鎖對應之機" + )); + addLang(LangKeyValue.ofKey( + ModPartEnum.DESCRIPTION.getFullKey(EroticDungeon.MOD_ID, "key_content"),ModPartEnum.DESCRIPTION, + "Device Key: ", + "设备钥匙: ", + "設備鑰匙: ", + "机钥: " + )); + + addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "dungeon_key_02"), ModPartEnum.MESSAGE, + "Hold key in main hand and Right Click to lock or unlock the corresponding device", + "主手持有钥匙右键锁定或解锁对应设备", + "主手持有鑰匙右鍵鎖定解鎖對應設備", + "主手持鑰,右擊,可鎖啓對應之機" + )); + + addLang(LangKeyValue.ofKey(ModPartEnum.MESSAGE.getFullKey(EroticDungeon.MOD_ID, "dungeon_key_03"), ModPartEnum.MESSAGE, + "Hold key in main hand and press designated key to exit device/release player", + "主手持有钥匙按下指定按键即可退出设备/或释放玩家", + "主手持有鑰匙按下指定按鍵即可退出設備/或釋放玩家", + "主手持鑰,按定鍵,可離開機/釋人" + )); + + addLang(LangKeyValue.ofKey("eroticdungeongame.message.key.success.unlock", ModPartEnum.MESSAGE, + "Successfully unlocked the device", + "成功解锁设备", + "成功解鎖設備", + "機關已啓" + )); + addLang(LangKeyValue.ofKey("key.eroticdungeongame.quit", ModPartEnum.MESSAGE, + "Unride the device/ Release player", + "退出设备 / 释放玩家", + "退出设备 / 釋放玩家", + "离机 / 釋人" + )); + addLang(LangKeyValue.ofKey( + "mount.eroticdungeongame.seat.onboard", ModPartEnum.MESSAGE, + "Press %s to Exit", + "按%s离开", + "按%s離開", + "按%s離開" + )); + addLang(LangKeyValue.copyOf("key.categories.eroticdungeongame", ModPartEnum.MESSAGE, + mod + )); + addLang( LangKeyValue.ofKey("stat."+ EroticDungeon.MOD_ID + ".interact_with_dungeon_crafting_table", ModPartEnum.DESCRIPTION, "Interactions with Dungeon Crafting Table", "与地牢工作台交互", "與地牢工作台交互", "操持地牢造物案" - ) ); addLang( @@ -95,6 +190,21 @@ public enum EDGLangKey implements ILangKeyValueCollection { dungeonTable ) ); + LangKeyValue loveMachine = LangKeyValue.ofSupplier(EDGBlocks.END_ROD_LOVE_MACHINE, ModPartEnum.BLOCK, + "Love Machine", "爱机", "愛機", "戲械" + ); + addLang(loveMachine); + addLang(LangKeyValue.copyOf(EDGBlocks.LIGHTNING_ROD_LOVE_MACHINE, ModPartEnum.BLOCK, + loveMachine + )); + addLang( + LangKeyValue.copyOf(EDGItems.END_ROD_LOVE_MACHINE, ModPartEnum.ITEM, + loveMachine + ) + ); + addLang(LangKeyValue.copyOf(EDGItems.LIGHTNING_ROD_LOVE_MACHINE, ModPartEnum.ITEM, + loveMachine + )); addLang( LangKeyValue.copyOf(ModPartEnum.CONTAINER.getFullKey(EroticDungeon.MOD_ID, "crafting_table"), ModPartEnum.CONTAINER, dungeonTable @@ -110,6 +220,370 @@ public enum EDGLangKey implements ILangKeyValueCollection { "Dungeon Craftsman", "地牢工匠", "地牢工匠" ,"牢戯匠" ) ); + // 偏移配置 GUI 翻译 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.title", ModPartEnum.GUI, + "Offset Configuration", "偏移设置", "偏移設置", "偏移設定" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.speed", ModPartEnum.GUI, + "Speed", "速度", "速度", "速度" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.offset_x", ModPartEnum.GUI, + "Offset X", "X轴偏移", "X軸偏移", "X軸偏移" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.offset_y", ModPartEnum.GUI, + "Offset Y", "Y轴偏移", "Y軸偏移", "Y軸偏移" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.offset_z", ModPartEnum.GUI, + "Offset Z", "Z轴偏移", "Z軸偏移", "Z軸偏移" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.enable_offset", ModPartEnum.GUI, + "Enable Offset", "启用偏移", "啟用偏移", "啟用偏移" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.apply", ModPartEnum.GUI, + "Apply", "应用", "應用", "應用" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.reset", ModPartEnum.GUI, + "Reset", "重置", "重置", "重置" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_config.close", ModPartEnum.GUI, + "Close", "关闭", "關閉", "關閉" + ) + ); + + // 偏移配置工具提示 + addLang( + LangKeyValue.ofKey("tooltip.eroticdungeon.love_machine.config", ModPartEnum.MESSAGE, + "Sneak + Right-click to configure offset", "潜行+右键配置偏移", "潛行+右鍵配置偏移", "潛行+右鍵配置偏移" + ) + ); + + // 偏移配置消息 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.hint", ModPartEnum.MESSAGE, + "Drag to rotate 3D view", "拖拽旋转3D视角", "拖拽旋轉3D視角", "拖拽旋轉3D視角" + ) + ); + addLang( + LangKeyValue.ofKey("message.eroticdungeon.config_saved", ModPartEnum.MESSAGE, + "Offset configuration saved", "偏移设置已保存", "偏移設置已保存", "偏移設定已保存" + ) + ); + addLang( + LangKeyValue.ofKey("message.eroticdungeon.config_reset", ModPartEnum.MESSAGE, + "Offset configuration reset to default", "偏移设置已重置为默认", "偏移設置已重置為預設", "偏移設定已重置為預設" + ) + ); + + // 偏移范围提示 + addLang( + LangKeyValue.ofKey("tooltip.eroticdungeon.offset_range", ModPartEnum.MESSAGE, + "Range: 0.0 - 1.0", "范围: 0.0 - 1.0", "範圍: 0.0 - 1.0", "範圍: 0.0 - 1.0" + ) + ); + addLang( + LangKeyValue.ofKey("tooltip.eroticdungeon.speed_range", ModPartEnum.MESSAGE, + "Range: 0.001 - 0.1", "范围: 0.001 - 0.1", "範圍: 0.001 - 0.1", "範圍: 0.001 - 0.1" + ) + ); + + // 偏移模式 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_mode.linear", ModPartEnum.GUI, + "Linear", "线性", "線性", "線性" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_mode.sine", ModPartEnum.GUI, + "Sine Wave", "正弦波", "正弦波", "正弦波" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_mode.circular", ModPartEnum.GUI, + "Circular", "圆形", "圓形", "圓形" + ) + ); + + // 偏移方向 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_direction.forward", ModPartEnum.GUI, + "Forward", "向前", "向前", "向前" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_direction.backward", ModPartEnum.GUI, + "Backward", "向后", "向後", "向後" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.offset_direction.bidirectional", ModPartEnum.GUI, + "Bidirectional", "双向", "雙向", "雙向" + ) + ); +// 状态指示 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.status.enabled", ModPartEnum.GUI, + "Enabled", "已启用", "已啟用", "已啟用" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.status.disabled", ModPartEnum.GUI, + "Disabled", "已禁用", "已禁用", "已禁用" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.status.active", ModPartEnum.GUI, + "Active", "激活", "激活", "激活" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.status.inactive", ModPartEnum.GUI, + "Inactive", "未激活", "未激活", "未激活" + ) + ); + // 预览标签 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview", ModPartEnum.GUI, + "Preview", "预览", "預覽", "預覽" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_left", ModPartEnum.GUI, + "Rotate Left", "左旋转", "左旋轉", "左旋轉" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_right", ModPartEnum.GUI, + "Rotate Right", "右旋转", "右旋轉", "右旋轉" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_up", ModPartEnum.GUI, + "Rotate Up", "上旋转", "上旋轉", "上旋轉" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.rotate_down", ModPartEnum.GUI, + "Rotate Down", "下旋转", "下旋轉", "下旋轉" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.reset_view", ModPartEnum.GUI, + "Reset View", "重置视角", "重置視角", "重置視角" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.zoom_in", ModPartEnum.GUI, + "Zoom In", "放大", "放大", "放大" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.zoom_out", ModPartEnum.GUI, + "Zoom Out", "缩小", "縮小", "縮小" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.toggle_grid", ModPartEnum.GUI, + "Toggle Grid", "切换网格", "切換網格", "切換網格" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.toggle_axes", ModPartEnum.GUI, + "Toggle Axes", "切换坐标轴", "切換座標軸", "切換座標軸" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.toggle_planes", ModPartEnum.GUI, + "Toggle Planes", "切换平面", "切換平面", "切換平面" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_top", ModPartEnum.GUI, + "Top View", "顶视图", "頂視圖", "頂視圖" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_front", ModPartEnum.GUI, + "Front View", "前视图", "前視圖", "前視圖" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_side", ModPartEnum.GUI, + "Side View", "侧视图", "側視圖", "側視圖" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.perspective_iso", ModPartEnum.GUI, + "Isometric View", "等轴测图", "等軸測圖", "等軸測圖" + ) + ); + // 坐标轴标签 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.axis.x", ModPartEnum.GUI, + "X", "X轴", "X軸", "X軸" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.axis.y", ModPartEnum.GUI, + "Y", "Y轴", "Y軸", "Y軸" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.axis.z", ModPartEnum.GUI, + "Z", "Z轴", "Z軸", "Z軸" + ) + ); + +// 方向指示 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.direction.positive", ModPartEnum.GUI, + "+", "+方向", "+方向", "+方向" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.direction.negative", ModPartEnum.GUI, + "-", "-方向", "-方向", "-方向" + ) + ); + +// 预览相关 + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.3d_preview", ModPartEnum.GUI, + "3D Preview", "3D预览", "3D預覽", "3D預覽" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.preview.coordinates", ModPartEnum.GUI, + "Coordinates", "坐标", "座標", "座標" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.slider.min", ModPartEnum.MESSAGE, + "Minimum", "最小值", "最小值", "最小值" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.slider.max", ModPartEnum.MESSAGE, + "Maximum", "最大值", "最大值", "最大值" + ) + ); + addLang( + LangKeyValue.ofKey("gui.eroticdungeon.slider.default", ModPartEnum.MESSAGE, + "Default", "默认值", "預設值", "預設值" + ) + ); + + // 输入验证消息 + addLang( + LangKeyValue.ofKey("message.eroticdungeon.invalid_value", ModPartEnum.MESSAGE, + "Invalid value. Please enter a number between %s and %s", + "无效值。请输入 %s 到 %s 之间的数字", + "無效值。請輸入 %s 到 %s 之間的數字", + "無效值。請輸入 %s 到 %s 之間的數字" + ) + ); + addLang( + LangKeyValue.ofKey("death.attack.fucked_0", ModPartEnum.MESSAGE, + "%s was fucked to die", + "%s 被艹死了", + "%s 被艹死了", + "%s 尋歡卒" + ) + ); + addLang( + LangKeyValue.ofKey("death.attack.fucked_1", ModPartEnum.MESSAGE, + "%s was killed by being stabbed", + "%s 被插死了", + "%s 被插死了", + "%s 極樂卒" + ) + ); + addLang( + LangKeyValue.ofKey("death.attack.fucked_0.entity", ModPartEnum.MESSAGE, + "%s was fucked to die by %s", + "%s 被 %s 艹死了", + "%s 被 %s 艹死了", + "%s 與 %s 尋歡卒" + ) + ); + addLang( + LangKeyValue.ofKey("death.attack.fucked_1.entity", ModPartEnum.MESSAGE, + "%s was killed by being stabbed with %s", + "%s 被 %s 插死了", + "%s 被 %s 插死了", + "%s 與 %s 極樂卒" + ) + ); + addLang( + LangKeyValue.ofKey("death.attack.whip_0", ModPartEnum.MESSAGE, + "%s was whipped to death", + "%s 被鞭打致死", + "%s 被鞭打致死", + "%s 鞭刑卒" + ) + ); + + addLang( + LangKeyValue.ofKey("death.attack.whip_1", ModPartEnum.MESSAGE, + "%s couldn't survive the whipping", + "%s 没能承受住鞭刑", + "%s 沒能承受住鞭刑", + "%s 鞭責卒" + ) + ); + + addLang( + LangKeyValue.ofKey("death.attack.whip_2", ModPartEnum.MESSAGE, + "%s collapsed under the lash", + "%s 倒在了鞭下", + "%s 倒在了鞭下", + "%s 鞭下卒" + ) + ); + addLang( + LangKeyValue.ofKey("death.attack.whip_0.entity", ModPartEnum.MESSAGE, + "%s was whipped to death by %s", + "%s 被 %s 鞭打致死", + "%s 被 %s 鞭打致死", + "%s 與 %s 鞭刑卒" + ) + ); + + addLang( + LangKeyValue.ofKey("death.attack.whip_1.entity", ModPartEnum.MESSAGE, + "%s was mercilessly whipped by %s", + "%s 被 %s 無情地鞭打致死", + "%s 被 %s 無情地鞭打致死", + "%s 與 %s 苛責卒" + ) + ); + + addLang( + LangKeyValue.ofKey("death.attack.whip_2.entity", ModPartEnum.MESSAGE, + "%s collapsed under %s's whip", + "%s 倒在了 %s 的鞭下", + "%s 倒在了 %s 的鞭下", + "%s 與 %s 鞭下卒" + ) + ); + + } private void initEntityKeyValues() { diff --git a/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinClientPacketListener.java b/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinClientPacketListener.java new file mode 100644 index 00000000..dbffdbd8 --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinClientPacketListener.java @@ -0,0 +1,57 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.mixin.minecraft; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; +import net.minecraft.world.entity.Entity; +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.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import top.r3944realms.eroticdungeongame.client.EDGKeyBindings; +import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; + +@Mixin(ClientPacketListener.class) +public class MixinClientPacketListener { + @Shadow + @Final + private Minecraft minecraft; + @Unique + private Entity edg$cachedMount = null; + + @Inject(method = "handleSetEntityPassengersPacket", locals = LocalCapture.CAPTURE_FAILEXCEPTION, + at = @At(value = "INVOKE_ASSIGN", ordinal = 0, shift = At.Shift.AFTER, target = "Lnet/minecraft/client/multiplayer/ClientLevel;getEntity(I)Lnet/minecraft/world/entity/Entity;")) + private void cacheMountedEntity(ClientboundSetPassengersPacket packet, CallbackInfo ci, Entity mounted) { + edg$cachedMount = mounted; + } + + @ModifyVariable(method = "handleSetEntityPassengersPacket", index = 9, + at = @At(value = "INVOKE_ASSIGN", ordinal = 0, shift = At.Shift.AFTER, target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;")) + private Component modifyMountMessage(Component old) { + if(edg$cachedMount != null && edg$cachedMount instanceof SeatEntity) { + return Component.translatable("mount.eroticdungeongame.seat.onboard", EDGKeyBindings.KEY_QUIT.getTranslatedKeyMessage()); + } else return old; + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinPlayer.java b/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinPlayer.java index 78d9fdf7..ce17d165 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinPlayer.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinPlayer.java @@ -36,4 +36,9 @@ public abstract class MixinPlayer extends LivingEntity { Player player = Player.class.cast(this); return Services.WORK_SPACE.tryToDoIfInDeviceAndRet(player, data -> false, original::call); } + @WrapMethod(method = "wantsToStopRiding") + private boolean wantToStopRide(Operation original) { + Player player = Player.class.cast(this); + return Services.WORK_SPACE.tryToDoIfInDeviceAndRet(player, data -> false, original::call); + } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/util/BoundingBoxCalculator.java b/src/main/java/top/r3944realms/eroticdungeongame/util/BoundingBoxCalculator.java index 6a4106b4..32ba755b 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/util/BoundingBoxCalculator.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/util/BoundingBoxCalculator.java @@ -19,7 +19,7 @@ package top.r3944realms.eroticdungeongame.util; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; -import top.r3944realms.eroticdungeongame.content.device.SeatType; +import top.r3944realms.eroticdungeongame.core.device.SeatType; public class BoundingBoxCalculator { diff --git a/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/ColorContent.java b/src/main/java/top/r3944realms/eroticdungeongame/util/ColorContent.java similarity index 99% rename from src/main/java/top/r3944realms/eroticdungeongame/datagen/value/ColorContent.java rename to src/main/java/top/r3944realms/eroticdungeongame/util/ColorContent.java index 544dbed5..55ed89f1 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/datagen/value/ColorContent.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/util/ColorContent.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package top.r3944realms.eroticdungeongame.datagen.value; +package top.r3944realms.eroticdungeongame.util; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; diff --git a/src/main/java/top/r3944realms/eroticdungeongame/util/EntityUtil.java b/src/main/java/top/r3944realms/eroticdungeongame/util/EntityUtil.java new file mode 100644 index 00000000..8eecde8e --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/util/EntityUtil.java @@ -0,0 +1,133 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * 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 + * + * http://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. + */ + +package top.r3944realms.eroticdungeongame.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.*; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Predicate; + +public class EntityUtil { + public static List getRefLookAtEntityHitResult(Entity looker, Level level, float distance, + Predicate condition, @Nullable Predicate ignorePredicate) { + if (ignorePredicate == null) return getRefLookAtEntityHitResult(looker, level, distance, condition); + Vec3 startPosition = looker.getEyePosition(); + Vec3 endPosition = looker.getLookAngle().normalize().scale(distance).add(startPosition); + + // 使用VISUAL或OUTLINE作为基础,然后手动过滤 + ClipContext clipContext = new ClipContext(startPosition, endPosition, + ClipContext.Block.VISUAL, ClipContext.Fluid.NONE, looker); + + // 手动进行射线检测 + BlockHitResult clip = manualRayTrace(level, clipContext, ignorePredicate); + endPosition = clip.getLocation(); + + AABB range = looker.getBoundingBox().expandTowards(endPosition.subtract(startPosition)); + List hits = new ArrayList<>(); + List entities = level.getEntities(looker, range, condition); + + for (Entity entity : entities) { + entity.getBoundingBox().clip(startPosition, endPosition).ifPresent(vec3 -> { + hits.add(new EntityHitResult(entity, vec3)); + }); + } + return hits; + } + + @Contract("_, _, _ -> new") + private static @NotNull BlockHitResult manualRayTrace(Level level, @NotNull ClipContext context, + @Nullable Predicate ignorePredicate) { + Vec3 from = context.getFrom(); + Vec3 to = context.getTo(); + + // 逐步进行射线检测 + double step = 0.1; + Vec3 direction = to.subtract(from).normalize(); + double maxDistance = from.distanceTo(to); + + for (double d = 0; d < maxDistance; d += step) { + Vec3 currentPos = from.add(direction.scale(d)); + BlockPos blockPos = BlockPos.containing(currentPos); + BlockState state = level.getBlockState(blockPos); + + // 如果不是空气且不满足忽略条件 + if (!state.isAir()) { + if (ignorePredicate == null || !ignorePredicate.test(state)) { + // 检查是否有碰撞 + VoxelShape shape = context.getBlockShape(state, level, blockPos); + if (!shape.isEmpty()) { + BlockHitResult hit = shape.clip(from, to, blockPos); + if (hit != null) { + return new BlockHitResult(hit.getLocation(), + Direction.getNearest(direction.x, direction.y, direction.z), + blockPos, false); + } + + } + } + } + } + + // 如果没有碰到任何方块,返回终点 + return new BlockHitResult(to, Direction.getNearest(direction.x, direction.y, direction.z), + BlockPos.containing(to), false); + } + public static List getRefLookAtEntityHitResult(Entity looker, Level level, float distance, Predicate condition) { + Vec3 startPosition = looker.getEyePosition(); + Vec3 endPosition = looker.getLookAngle().normalize().scale(distance).add(startPosition); + BlockHitResult clip = level.clip(new ClipContext(startPosition, endPosition, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, looker)); + endPosition = clip.getLocation(); + AABB range = looker.getBoundingBox().expandTowards(endPosition.subtract(startPosition)); + List hits = new ArrayList<>(); + List entities = level.getEntities(looker, range, condition); + for (Entity entity : entities) { + Vec3 vec3 = entity.getBoundingBox().clip(startPosition, endPosition).orElse(null); + if(vec3 != null) { + EntityHitResult entityHitResult = new EntityHitResult(entity, vec3); + hits.add(entityHitResult); + } + } + return hits; + } + + @Nullable + public static Entity getTheNearestEntityFromHitResultList(Entity looker, List hitResults) { + if(!hitResults.isEmpty()) { + hitResults.sort(Comparator.comparingDouble(e -> e.getLocation().distanceTo(looker.getEyePosition()))); + if(!hitResults.isEmpty()) { + HitResult hitResult = hitResults.get(0); + if (hitResult instanceof EntityHitResult entityHitResult) + return entityHitResult.getEntity(); + else return null; + } return null; + } + else return null; + } + +} diff --git a/src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json b/src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json new file mode 100644 index 00000000..c5dbcbc2 --- /dev/null +++ b/src/main/resources/assets/eroticdungeongame/animations/block/love_machine.animation.json @@ -0,0 +1,159 @@ +{ + "format_version": "1.8.0", + "animations": { + "love_machine.stopped": { + "loop": "hold_on_last_frame", + "animation_length": 0.25, + "bones": { + "ac": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + } + }, + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1, 1, 1] + } + } + } + } + }, + "love_machine.stopping": { + "animation_length": 0.5, + "bones": { + "ac": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, -5] + }, + "0.5": { + "vector": [0, 0, 0] + } + }, + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1, 1, 1] + }, + "0.5": { + "vector": [1, 1, 1] + } + } + } + }, + "sound_effects": { + "0.0": { + "effect": "eroticdungeongame:out" + } + } + }, + "love_machine.active": { + "loop": true, + "animation_length": 1.25, + "bones": { + "ac": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "0.75": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] + }, + "1.25": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, -5] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "0.75": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, 0, -5] + }, + "1.25": { + "vector": [0, 0, 0] + } + }, + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1, 1, 1] + }, + "0.5": { + "vector": [1, 1, 1] + }, + "0.75": { + "vector": [1, 1, 1] + }, + "1.0": { + "vector": [1, 1, 1] + }, + "1.25": { + "vector": [1, 1, 1] + } + } + } + }, + "sound_effects": { + "0.0": { + "effect": "eroticdungeongame:in" + }, + "0.75": { + "effect": "eroticdungeongame:in" + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/eroticdungeongame/geo/block/end_rod_love_machine.geo.json b/src/main/resources/assets/eroticdungeongame/geo/block/end_rod_love_machine.geo.json new file mode 100644 index 00000000..54c36b1e --- /dev/null +++ b/src/main/resources/assets/eroticdungeongame/geo/block/end_rod_love_machine.geo.json @@ -0,0 +1,88 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.end_rod_love_machine", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "p", + "pivot": [0, 5, 0], + "cubes": [ + { + "origin": [-5, 0, -2.925], + "size": [10, 10, 8], + "uv": { + "north": {"uv": [12, 0], "uv_size": [10, 10]}, + "east": {"uv": [24, 0], "uv_size": [8, 10]}, + "south": {"uv": [12, 0], "uv_size": [10, 10]}, + "west": {"uv": [24, 0], "uv_size": [8, 10]}, + "up": {"uv": [0, 10], "uv_size": [10, -8]}, + "down": {"uv": [10, 10], "uv_size": [-10, -8]} + } + } + ] + }, + { + "name": "ac", + "parent": "p", + "pivot": [0, 5, 1.075], + "cubes": [ + { + "origin": [-5, 0, -4.925], + "size": [10, 10, 2], + "uv": { + "north": {"uv": [0, 12], "uv_size": [10, 10]}, + "east": {"uv": [32, 0], "uv_size": [2, 10]}, + "south": {"uv": [12, 12], "uv_size": [10, 10]}, + "west": {"uv": [34, 0], "uv_size": [-2, 10]}, + "up": {"uv": [10, 2], "uv_size": [-10, -2]}, + "down": {"uv": [10, 2], "uv_size": [-10, -2], "uv_rotation": 180} + } + }, + { + "origin": [-1, 4, -2.925], + "size": [2, 2, 5], + "uv": { + "east": {"uv": [2, 0], "uv_size": [5, 2], "uv_rotation": 180}, + "west": {"uv": [2, 0], "uv_size": [5, 2]}, + "up": {"uv": [34, 3], "uv_size": [-2, 5]}, + "down": {"uv": [34, 8], "uv_size": [-2, -5]} + } + }, + { + "origin": [-2, 3, -5.925], + "size": [4, 4, 1], + "uv": { + "north": {"uv": [3, 26], "uv_size": [4, 4]}, + "east": {"uv": [15, 26], "uv_size": [1, 4]}, + "south": {"uv": [3, 26], "uv_size": [4, 4]}, + "west": {"uv": [15, 26], "uv_size": [1, 4]}, + "up": {"uv": [7, 28], "uv_size": [-4, -1]}, + "down": {"uv": [7, 31], "uv_size": [-4, -1]} + } + }, + { + "origin": [-1, 4, -13.925], + "size": [2, 2, 8], + "uv": { + "north": {"uv": [3, 24], "uv_size": [2, 2]}, + "east": {"uv": [10, 30], "uv_size": [15, 2]}, + "south": {"uv": [1, 24], "uv_size": [2, 2]}, + "west": {"uv": [10, 30], "uv_size": [15, 2]}, + "up": {"uv": [3, 39], "uv_size": [-2, -15]}, + "down": {"uv": [3, 39], "uv_size": [-2, -15]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/eroticdungeongame/geo/block/iron_cage.geo.json b/src/main/resources/assets/eroticdungeongame/geo/block/iron_cage.geo.json index 54f469be..3461d843 100644 --- a/src/main/resources/assets/eroticdungeongame/geo/block/iron_cage.geo.json +++ b/src/main/resources/assets/eroticdungeongame/geo/block/iron_cage.geo.json @@ -3,7 +3,7 @@ "minecraft:geometry": [ { "description": { - "identifier": "geometry.unknown", + "identifier": "geometry.iron_cage", "texture_width": 64, "texture_height": 64, "visible_bounds_width": 3, diff --git a/src/main/resources/assets/eroticdungeongame/geo/block/lightning_rod_love_machine.geo.json b/src/main/resources/assets/eroticdungeongame/geo/block/lightning_rod_love_machine.geo.json new file mode 100644 index 00000000..7a8731a2 --- /dev/null +++ b/src/main/resources/assets/eroticdungeongame/geo/block/lightning_rod_love_machine.geo.json @@ -0,0 +1,92 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.lightning_rod_love_machine", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "p", + "pivot": [0, 5, 0], + "cubes": [ + { + "origin": [-5, 0, -2.925], + "size": [10, 10, 8], + "uv": { + "north": {"uv": [12, 0], "uv_size": [10, 10]}, + "east": {"uv": [24, 0], "uv_size": [8, 10]}, + "south": {"uv": [12, 0], "uv_size": [10, 10]}, + "west": {"uv": [24, 0], "uv_size": [8, 10]}, + "up": {"uv": [0, 10], "uv_size": [10, -8]}, + "down": {"uv": [10, 10], "uv_size": [-10, -8]} + } + } + ] + }, + { + "name": "ac", + "parent": "p", + "pivot": [0, 5, 1.075], + "cubes": [ + { + "origin": [-5, 0, -4.925], + "size": [10, 10, 2], + "uv": { + "north": {"uv": [0, 12], "uv_size": [10, 10]}, + "east": {"uv": [32, 0], "uv_size": [2, 10]}, + "south": {"uv": [12, 12], "uv_size": [10, 10]}, + "west": {"uv": [34, 0], "uv_size": [-2, 10]}, + "up": {"uv": [10, 2], "uv_size": [-10, -2]}, + "down": {"uv": [10, 2], "uv_size": [-10, -2], "uv_rotation": 180} + } + }, + { + "origin": [-1, 4, -2.925], + "size": [2, 2, 5], + "uv": { + "east": {"uv": [2, 0], "uv_size": [5, 2], "uv_rotation": 180}, + "west": {"uv": [2, 0], "uv_size": [5, 2]}, + "up": {"uv": [34, 3], "uv_size": [-2, 5]}, + "down": {"uv": [34, 8], "uv_size": [-2, -5]} + } + }, + { + "origin": [-2, 3, -15], + "size": [4, 4, 4], + "uv": { + "north": {"uv": [1, 41], "uv_size": [4, 4]}, + "east": {"uv": [1, 41], "uv_size": [4, 4]}, + "south": {"uv": [1, 41], "uv_size": [4, 4]}, + "west": {"uv": [1, 41], "uv_size": [4, 4]}, + "up": {"uv": [1, 41], "uv_size": [4, 4]}, + "down": {"uv": [5, 45], "uv_size": [-4, -4]} + } + }, + { + "origin": [-1, 4, -11], + "size": [2, 2, 6], + "uv": { + "north": {"uv": [9, 5], "uv_size": [2, 2]}, + "east": {"uv": [15, 43], "uv_size": [6, 2]}, + "south": {"uv": [10, 46], "uv_size": [2, 2]}, + "west": {"uv": [15, 43], "uv_size": [6, 2]}, + "up": {"uv": [3, 51], "uv_size": [-2, -6]}, + "down": {"uv": [3, 51], "uv_size": [-2, -6]} + } + } + ] + }, + { + "name": "VoxelShapes", + "pivot": [0, 0, -3] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/eroticdungeongame/models/block/love_machine.json b/src/main/resources/assets/eroticdungeongame/models/block/love_machine.json new file mode 100644 index 00000000..660f4e6c --- /dev/null +++ b/src/main/resources/assets/eroticdungeongame/models/block/love_machine.json @@ -0,0 +1,129 @@ +{ + "credit": "3D Model © 2025 LeisureTimeDock", + "parent": "builtin/entity", + "textures": { + "particle": "minecraft:block/cobblestone" + }, + "texture_size": [ + 64, + 64 + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 75, + 45, + 0 + ], + "translation": [ + 0, + 2.5, + 0 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 75, + 45, + 0 + ], + "translation": [ + 0, + 2.5, + 0 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + }, + "firstperson_righthand": { + "rotation": [ + 162.5999999999999, + 66, + -171.78999999999996 + ], + "translation": [ + 0.5, + 0.25, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_lefthand": { + "rotation": [ + 162.5999999999999, + 66, + -171.78999999999996 + ], + "translation": [ + 0.5, + 0.25, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "ground": { + "translation": [ + 0, + 2, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 30, + -135, + 0 + ], + "translation": [ + 0, + -4.5, + 0 + ], + "scale": [ + 0.84, + 0.84, + 0.84 + ] + }, + "head": { + "translation": [ + 0, + 6.25, + 0 + ] + }, + "fixed": { + "rotation": [ + 2, + 0, + 0 + ], + "translation": [ + 0, + -4.25, + -7.75 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/eroticdungeongame/sounds/piston/in.ogg b/src/main/resources/assets/eroticdungeongame/sounds/piston/in.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4133761098c1b8fe356e6344a67a6ca05222d876 GIT binary patch literal 15353 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/eroticdungeongame/sounds/piston/out.ogg b/src/main/resources/assets/eroticdungeongame/sounds/piston/out.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b07587f1b71997e5d0960e8afc165fc113e96885 GIT binary patch literal 6059 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 Lgy1@U5>WaZL`E|P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/eroticdungeongame/textures/block/love_machine.png b/src/main/resources/assets/eroticdungeongame/textures/block/love_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf491f74e57c0096f4423b7c5cfc903c82052d4 GIT binary patch literal 1538 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 Buk8Q; literal 0 HcmV?d00001 diff --git a/src/main/resources/data/eroticdungeongame/structures/villager_str/cage.nbt b/src/main/resources/data/eroticdungeongame/structures/villager_str/cage.nbt new file mode 100644 index 0000000000000000000000000000000000000000..c7466a2ace34bcb8f7e90c2736c284b3c40b15c4 GIT binary patch literal 2175 zcmV-_2!Qt=iwFP!00000|Ls~$j2uT5uIZ|totfRW*Y?IC#(u4m0EBeizB>#O&^@4Z)5Pt(&tsE$ZrU11m@B(G|E)lrSP z!V(q>8gQ>Q5O$lQf%IjcT5bc?9OiHzM&-Q2XG32s_rGR2ED+T3U;-F!ED7OT%}~T9 zNEMM~8nDHC5Q+iy^W3!B7W1R=3P$w{9`mWNxGV3c5!u{aUzJm@zx(#gw;w(I;~zaq zu0Q^-yPm0{>XO4lS6ut`%SYU|-(0I9@*s5>I(m`1CU;H+9__iOn%oTol#YGUv0T>j zXtbyu6)Ht!iebvq0t{7~{qr=4hXzrz*+!91hOtWH-L)HJP#WisXdXRo|| z=IQxwrBmkPDNz9XM#rby@OJ=yquu^S#{Q`f(sKAVb6~a+c#N5-f@ap;?a+on+O!$m zH`b_aui1Ue?LheJYus-!bEy+?$LP=o_XV|AIJZsSld(iPnpPqw| zj$Z@K+g9^SUs-_sgOa}6GQcLSqUq>?$wSbxSpW2UZ+-mxZY_BlK*fNjS(CMCXbWST z+94EYEgG~U(w`^jkWEvQB4QSQFq&#fWz3KLPq)HAa3^vL(RO9DrxME*MA|l$(bFRz zFd+(b`W+ zWug z4R9o2wjBfKhrobQ!?RjjHcPP;kf~kv;?01BF&R*J*n?HU&O_QP&xZZtzH=}B9itgo z9W9I68*(ttf7N6TXiw_cXFckhr!RZbZbshB9?Glilz00O=!K5AWw}NGOE@?<3U3<% z9cJ?br|;MhXv$?|!vdVJy1iU}mBQuc@E|anHg9bWm+D01RrgRH-YIV`v;4Suh1)~i z&5{P&bnPM+QP&ck4J(^J$4P%9_u+NHoVbOOkLH$qXq!fk6OtY$=~YK~g9p*J|A%M9 zYft@V?ajr97NhNc@%jIp3}%l$pdqpbXU+TX%RWom9QYwI$5}YVH(+<&^v-cEK*7u^ zi@Ks!X45{32-RfY7N6}kG?(-_5@U$I$58#N8%qyAXq-NC2DGfF$9&qo)uP$~o@wuh zBfmfZ=z9tM#k%&A^XIGR{XXErZi7BcMRq?HrtLIn!{#zHf!jgryzy zUh=8OuP43D-t>}>ZT^I-Jg?mYy?ImYU{<8Jz;;@&T{@d$cc=%`0 z!4}PrD2sST)(DDIr9)F9SmH4cqh&Ca0t{BbkP=^74xdpwDMnMUgB38O#8=t}l<`S1 zWqeXh8J`qW#)l~6E5(%ME5(%ME5(%MtCHZx)ejkChbY(~3U&sc3`Q%!WPRZRjHZCW z3K*h*(K8rQuy(S#^a4!QPPL%s%j{?hcCdmStYC*I*dYpb^c*`=1(4)RFyrcH93QN} z2P^Qw3VcWopS=1RmoJjTrwB8yey~FQ;1NDY3NTm!Gp>F{`5Z04jH{nfK1CQ(;tMPA z!3un^0w1ivhve|dtDkZCA~}4DFlF_F5?uCNK30Iqa-J{15Cx20;;WLw=e7b&Ha^D- zFjxVT<#T&Zjg4v_wWH_OyZjlRLe-c z-UyS}@`s2?Ha+p=T{Fq`KGmgeC)y!*L_71^%ck-t4Q~FPhz0ld<@moL$GbdzbG?!1 zeU+r6kQVs2xtDr&cdnG^NzS^-OZt!pHAd5`RM3ayuVCcQwq}2b{s-uICg-Lw000<3 BR7(H= literal 0 HcmV?d00001 diff --git a/src/main/resources/data/eroticdungeongame/structures/villager_str/dungeon_work_station.nbt b/src/main/resources/data/eroticdungeongame/structures/villager_str/dungeon_work_station.nbt index 3327658ded07af0a3ef8d34dab11e6e6cf6d0dbb..8567ac1c73b9761bf8d877826e8ec5683164d353 100644 GIT binary patch literal 4535 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 literal 5397 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 diff --git a/src/main/resources/data/eroticdungeongame/structures/villager_str/iron_cage.nbt b/src/main/resources/data/eroticdungeongame/structures/villager_str/iron_cage.nbt new file mode 100644 index 0000000000000000000000000000000000000000..003bcecc3e610f6e7d50b49ef8af27e9c874b4d9 GIT binary patch literal 1138 zcmb2|=3oGW|3_yX%)9L-;@Un(a@M5Tu7M?2|G93?ycR3w8nEE5lya7e;6h6#OScRE z9PM}fp47YEN#oIOe$FUvfs~W(#@{b2E@yO(PBuH%`*!|CspMzB@0NW3{P@_FjpuXo z9%nqeeJo_Rp6UBzZ@)Zw-@Ea-$s^y^p9R`$J|^>7+UPw=>%f}=O0GY@*e(1y=36KoQ0MCy9Tt-f(u>)WQTy>pWEm)|(8`EA!7 zai7AYF?rm}ViKo4KfcajY12loW114{6IQW44tw_M(%tn2r%P8&jZ|M7taWW;SLvE0 z+2s+(HLrc_D&3Pb_ti10a_uvpdai2wtV~$bRLFHqd&bh=&yHE@th=*a+h<{d7i+R; zPq0DU!4RfkjXMWL4*g+NJ}YK$DF;l=JHz{|@7_e9cuHQ(^PQ&k5pt_fB#TzAQR)wU zQrKnVH}SaUCkt1(^(P+ZKiN4iIbn$;tJ|zV5Os|EGkedIIL$i;J&d_}OcozNqMqc< zv$xN&n|?%=XZCs3LiWSYiaqZf-0<@ZQ1QD2m2!hg))FUWd!F#MolSqn=T^k7yt5hT z2#DMo?is(AhKuw($rFtWdzdO3=lAfb2#{cP`!%}>qAH@^5Mc&Hd*a`tKpXxgy-NT~ zuGv3h_rb+YiGNc&ttGC-PutN9VpcCKU_bn;dnb?sRlW3(EYEBGXMAm6#f!mG@#i{# zx{lsid+4;*o;8O~Ywno?A`ZZfUXO0XRCFU|KmUC2*J;6WgEjkQfPRNEXMo&s24S1N zD8i`_DdUMSM>HqO9tZlSFBz!hIMAzW9)oljp1G@yCR)7|=o+g&pobtDeqX80&e?yu z^=FmM(&c&ow{h41nKP?Aw|-7r^4-4AlXuLo`}a)wL-c)H<*k~x_x{x5)7*ac-%9&q zSL6>T*IedXS)Xyp@Y=Dn-ZS3v+wZIUo6U3g@s3abCp|UYF@MJH;ulHh3jf_Y9e&wp zzt8Jg`SQ2z%$zNrnET#(yUXI)mE$)bznyTdaK?Vq;Mu#Kug^OloKw$n*CKUCz5QD2 zl9v@RdtRJNJaKGp(v9oOtXk5{irz0*%?@6^tkP<`_$`HoCsneC=Q@=eT-AFzM=spy z$48NK7w;@z{<56kx!UHb>kNrwH8+3#p8byhvT1hvNA7Ryj@z_Mzwu++miLz@`0FRW zJ+67-^qW8bE!M|;5WoEI`{8f%^Y{EsxO?>Q^SHu*^>#s*U&ou2@@dA#cbuPVb?wf7 bk)j{Ae95z`lH>lS{$tz~H9;y~gMk46A7@e* literal 0 HcmV?d00001 diff --git a/src/main/resources/data/eroticdungeongame/structures/villager_str/pillory.nbt b/src/main/resources/data/eroticdungeongame/structures/villager_str/pillory.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7b00c8fcee917630a0112856a021d9aef760fdd3 GIT binary patch literal 1122 zcmb2|=3oGW|3_yX%)9L-;@Un(GHTN7)ND-v}Cb#oAA%k ze#h^ij`gRsp6ur5mEu-liFP;se&TR>qJwqvwqw0#s`NF^7HiPYdJ~NXWuz; zF-9&r`0eeGdWrJO{PnrLZ!dS4i$43jc*C)N%O^kn^rpGLL1cCe}O7={Fqnp}B%@biL@%c`L$^#oVM@_H^+c-V+O{!?M<bKes58$rf5&7f#1Oj*5I=eyN!&WzsqZ#x&CqZvl(0bRz@7xy0)>abWW1&@`&Tw z*FJWYu4*k^C7M=u>|NN5po0;tk41XI4T`^?J!GkqcW1k{&%y*R)@0G1V1u}WAxyy< zcMggi`opMvR?Og14w#yEhWA;Y-$bBzO5UAkk+bY|`a_>=?6L`)cwFm~g{$216OTnI z=P31uKl#XAnfF{mBGavLVwwnu`Uo;d)Xv$@f484~K50jD;^&13 ztUYvEYtNcPr#1J?0TBm0>VqMwcwXy2Lzn^4zGnXnYl&;|XJo;WZC}NU%`3tT*6i0Q zWIz1tv`{&isW0*_A)?+8#DS>Z8v=CV-=jc>{7V8$eSa+(2$KE%b(Z07(Y8{V;{Er& zFX0BME(Dov@r(~7_#No&HII=*<1~S0^d$q$I1V!Y@r>P-cJgZ;%K&Y+IwuGc0WvMFNs*cIe+NKUVg8k6~)Df&DSX zr_1bYN|(>r6DEUGZz-jvB_ar1J}HXJySV z^6Qr_{$ChXnsNE12>&s8XX|5Uw_LaUa`DdcwEv!g^*uHD(sZTUy8eWT}G!}b46>Y3YFFTV)UU|;|M DshcWp literal 0 HcmV?d00001 diff --git a/src/main/resources/data/eroticdungeongame/worldgen/template_pool/villager_str/edg_village.json b/src/main/resources/data/eroticdungeongame/worldgen/template_pool/villager_str/edg_village.json index 69c59d9b..4886d1f6 100644 --- a/src/main/resources/data/eroticdungeongame/worldgen/template_pool/villager_str/edg_village.json +++ b/src/main/resources/data/eroticdungeongame/worldgen/template_pool/villager_str/edg_village.json @@ -12,13 +12,40 @@ } }, { - "weight": 1, + "weight": 3, "element": { "projection": "rigid", "element_type": "minecraft:single_pool_element", "location": "eroticdungeongame:villager_str/dungeon_work_station", "processors": "minecraft:empty" } + }, + { + "weight": 1, + "element": { + "projection": "rigid", + "element_type": "minecraft:single_pool_element", + "location": "eroticdungeongame:villager_str/iron_cage", + "processors": "minecraft:empty" + } + }, + { + "weight": 1, + "element": { + "projection": "rigid", + "element_type": "minecraft:single_pool_element", + "location": "eroticdungeongame:villager_str/cage", + "processors": "minecraft:empty" + } + }, + { + "weight": 1, + "element": { + "projection": "rigid", + "element_type": "minecraft:single_pool_element", + "location": "eroticdungeongame:villager_str/pillory", + "processors": "minecraft:empty" + } } ] } \ No newline at end of file diff --git a/src/main/resources/eroticdungeongame.mixins.json b/src/main/resources/eroticdungeongame.mixins.json index cbe0e830..3c79407b 100644 --- a/src/main/resources/eroticdungeongame.mixins.json +++ b/src/main/resources/eroticdungeongame.mixins.json @@ -6,12 +6,13 @@ "compatibilityLevel": "JAVA_17", "refmap": "eroticdungeongame.refmap.json", "mixins": [ + "bendylib.MixinBendableCuboidBuilder", "minecraft.MixinEntity", "minecraft.MixinLivingEntity", - "minecraft.MixinPlayer", - "bendylib.MixinBendableCuboidBuilder" + "minecraft.MixinPlayer" ], "client": [ + "minecraft.MixinClientPacketListener", "minecraft.MixinGameRender", "minecraft.MixinMinecraft", "minecraft.MixinPlayerRenderer" diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b2b5365e548de39ac94189e022de00fa28568e GIT binary patch literal 298643 zcmV)EK)}C=P)%DL7 zC26JAea?OLRrR{1UF~S5r>AG8XEf64i?c}GUww7VsJ?%HUv(Ay@0SQjCj_Lwr>dUr zmrTl;?q$)8EZdxeWYzM*R#$-Xg&w`snu=GWO6A$!D`dTeG%+uOtVdu`ixtRB*47JK zZ+d|$KNYdkLKQIFK-P8*uMuWrR7EkLrb5*pbu>eVHq-)+L@5}2WIOfiZARhABcZB% zZW~>l(I&111S#?-Xr$qV#vk)Y7)y9j)Jh9gz;FXu8!gaqE=b78rhu#nzjXyT^v^*g zXLmJ!VUO(ejgVqKLoZGQxyC{u##qhXN)d*4z98e8A`F=Jmts{~kOGDq$j)LB26Dl1 zMm`OO-};?OD4;-5gaU;Y^lq`SDU+`mbhA~Q(Fcv9Z6ghNJ z$>k;{Bt zg3r79Oc$RpN*yms@S`l5PcY}tE?K>VgBd!JC+pK~ct!o|orzvxfZ3kE?- zjX%IVd{~*QTfF=+FN9%`jqL2sCteh*`bCTv^ANhoqt=oLX5<`t$<$Q%?F8T`ghwwn zd=w(=p;^}wh~!hgn1PT*8Mrdis^JYQLARvC^x}?QEcmoYX?$>bQbk&W87}Fo6DIwy zz6KZ?$w+r+4saxj@$gaPoJ*P;h4nhc^=(TCl8cmD6r?oyBe(J;8^9$#JByBHah+}a6c;CMOnbNW2OM}by*WO+Y7S&V^@qWQCHE(EgR_@ks; zln%S|6JRe^-Nnp|EIzy_4htHVG+7{!G3U4MOaq7E5ruioxn!_cBCf886tVyi{t)*{ zHX(&BA;v+qK0sA%!hs&C_c;>0h#U>b)h)(ZrKt>}6_{eRkX+allEK!J|b?0vB8b*);d@h7c zox*2-KxjL){10H+YCxH%uS(e8C3OCPATzV_W77Gb0WnT@JcKIN%_smYfKV?v{}>d* zN}QwZp`2SVN9Nmg&8cg#;6-sl7fWoBuljsLhVikM*&fNjk$9tcD=G>JANm6`S_QKe z9fcPGg)Evt$YMf}{67>DxFACVK@3{{Vd!3wbQgyQ`Qr~OYGRma{}5e&b8>k;NX~p0 zMh3vzF9KJ4E>55X0vM&`!*bC!s%RFritqsy;d3bvSY%POU>Or*AtO%)N(PQZF*dKE z|CvlrwT9>M?2*}80SYg43Mq6TWML=8K(P@d!(UwZ66yRFvDTxtUz}MPdReeYqN9Me zL35eV_oCSIG~IX$)ApcpJw65P^>bE+I&F0LiD8P|;V?o15E{jpJts`gSMwBd+b1I7SD_sP+ z_Cg>@wUEB2$;dv~`XH>@o_HOP9~OI_V%B{D+8g*YKbA(`xg6m@jCl4(sAfB=+A?Qq z;(YMP-+{8#WYwRhn}-%t0AqngFG?YFF~6V1{N|?$6U;CWGW1oLSHs}A0$lD~`Pqn@O^3qXoWkNaj&yWzj?#qC2CR{GKlw5wKRPkboEecaE zvlRn_84C+C=3MyxG;kQ@=?#40rTCE#Eel!S$lJ0JB@5!K<~JO&5Mm(Fn-VQ4)64lE!cZ?+ z^Ce)ZGPap>YDxa7U{x5YYDhV~h6)W9h5i&uohl3s7Zn3C3X{jlcBRN=;7F8tgO4Jl zU9x$}R*#e%h|DX6EFp;T_VwA#%f1-H`@aS&uZJuCF!>f1ai|{$`=H4M%T_?f4#YSP zUL?^`Xst$ND`DzRU)_&G-x;!229D}{8kHy|@x+{88w&T_Y@~f{dDLDww#d_R z2|`9LVT>%B1i$}#Enl%f;ltR~rrF98g(MoC2MW375hOd~Sit-K2dvx-SA5EV26X)d z2D%jB$oQg48YziK=R6v)phFi09sGi_MahCivZ(@l^u&850vU6-=Lf$}NvUM(>^Tig6E@+XqHiLp0#e|Fk1y?QuN0JoJ+3RrdM!}G-_N2FdO@u?{g+i`1 z1Sx?KNRoZh{R`qd3p+jzUCZ+_js+5xHj3Mw80{|pw{o&m$O@zku_u# zdW{GK@R8RNJb1RQMNPk$%RUT&51sAFP8Jl16zEBPVNu9J41^dq6hcHg`7jYe^wxg> z$dsdT-VeHe4q~Hl)inX@WIgb#gpa+M;3Na=+`mMA3m(uG72Jn#zceHOLckLq^;M5h`}wVV{a zAR~K7_b*|~eaf-1YUk8vC8drROKf3q30>t22o{AN*n;`>k_uyF#2xsej4G75 za3O}b7+{g_2gA#hU7bPU-?mj@R3b{1q>o3mXtAkB#pN@$F|O^ zd7I6-j1Y#szk=aQgbNUY3F`v1l@Lf|?2r)zndF&+2vJ}zr?2}nnANsjVoW;zA0Rpc zX%<2X5>YwbjkYK$Te(spq)bV)jX2wI?JjI@U2u4@#1=V~&{cjhfQ1f?jNZLCk&NPm zF*I6|033;u)q0Dpf*+*~ANs4ywoK`R$h8;_DHw&6P%efjfekqN78==2q&RUbCl#B4 zvkkCUPkbdj(@?y zN19d`Q)Z!pNGVasLWzaUPcDXt)WAz{^i9ILrS?w&Tb;}RX_bYr*#A3m@GWSmU^adQ zGPVr1`Ji<6Q4+X-JZq@s9|C5N#=Hb0{q*1qDAYwSQWEL zQ;rm4`k$eEC$W1CzwCpmOF9;k7c|;*$x+2(MT#N}qjBCn`R2S6Mpo=Tw+-;eyRS|o zrRDnz6aUESAh-DhkxXR_^Lz#HqsDsBYmh>W8bHVg=+6Jdlu7FNV`8q*Ur-u9!k>Bs zRc$n_`lLEZ03dY!K$_}gmfcA;-Enzd(UaU2!*t(MwErZ({L_+q^+Jl?8)~|=*rHe? zX)IV6K86MkpplSKm_$jTk~Nx?GY2@5q|p4au;3$ey&3B>s!*{&KW)H<}E>U&4WmZQb>W5Suk*cKK}!$^&wooIX7#PzneSu zO;oYE5MPDC!WvvM<&0Ob=6s|P{~%7SVV{YB@oeH zg@!3KwijJ`T3YutVyT{ULkQzj--N7-NIZ^B!m2IQvU_CsNHi%yZTBUrCC({i>I6CWD6HBB+ukq#LBh^&lJX6p{gNhcVg26 zV&(SKN*5bj6gaS7f?%pl_%$cOF$)|?qRj#G75|v8;D@eeWUp<2r!1(uUC=?15*wN93K>EnQXHN80gR1G z*L^MV1)O10>CK5k30fB<{6r{6f6*F(C2QtzSuZ&^+#YjtssAiG)^t z8dh#l(Ga85;P0r3cci9!rRtlsx-`>;yl&^Lt5v3?9Ot5?iiL<=I-KsjdHT{Io2$T) zB*w49(1!xr_2yh@KG36CXLdejiAC~KFC2&@JnKjPo zol1@)QN*Zp{&C57o`@WBwKD7e6woOLs!e}YxUQ%9kpq@>f5de@hHN#KjenM?lIS?a zlm86@J<7rK_9k@Q7XX^OEjqzy;5lmi0I*gI9e)B6mz^$R-)V%cc^jOCOBF>NmYkh^ z;Swb|6GmRynT+c{9^X4>uFWSKQlKb^!RtWtu2EYS4U`zN^=eT^qmVeVfccDIF!U-I zeuE$rXu1nJT7kKo2odZ(O-A6>vSa|zu$Xbiq9>C`xg{%YB>;z?N0P6sJ5C+b{iGwII0LnK>%N_)&r^ObX zDhzR)aL)haXC&);`RJxCVA!w}4zo&lOymVu z)hVTbBc;nCMGuXXE{GUA6cPu<50UYMB<=-_1JG6?@;EjD89QpY71eAL2j38TU!dFW zr|Q*n9HO@?a`c<#w)b)ue$BSrVeWXpdNVkmxc~1^Qu*N+24ceyzyy58YuNJu>f}c;4M`K}KK+MAR>3X90%>xnuuDc~-G& zKdq`K1qZ^1{)4I7APn!5fx|o(I4%nWcM~f#sdzf8h7-v`@yB^b z1r}l7iO7uZrv0Z0fRd$-P!<@U0MSwGUM1D;0&H1=0bLEk!Asn+Z$Nv!dGl9P)uljh z=+HOJ%WmVkpEI@HZEn9mNo{795ih+W^*&3t-cL2XJ44q}XE7`?Bd^fjW5iNPOcnBd zDn5e5uu!&vtJi7a%E?OJ2AvGLIlakMCoKUlPl&7iw-H^z`OhM1;{{>fHBn^}BGx zo!K@@n(E|_e;3;8%-8?5s=ny!3LW`x>x%csI)7$ry2Y~k!|H0iFG`nQq#JIbmS0&_ zs{0`o1-sb3UrJRwh3Xq;;xrI*rm@#ezQclRU9|rGITrG8Dhr(|uJ!JhCQ%iPFmeoF zJe6 z_#;E@8LsA`XtZy>=5S>GSj32+2r>2l8U@bB*8I<_dwmiKhWm-78crO7Q^)X%&m`?B zo}tSG$KUx!DKTJJ(c#%da@iKgJe_Ey}2?Qy62qfopPe#dyNERZF zEI<|^5Qvaq1n{gG0+9S4hP3=|)@?DizeM)FQB%(&*i^|cOGs)&htSk9sqQw^{e*IM zTE`y&M5nhh#~@MOW$lh1{V(|^s%EQc%_me9!$-d@#r@7LUy7XkF^+p3+rA1JTdJBg zaa=h42&5Qh)hE#0ea$nv8M^;j6dxCsy`P@g2WY2~Sh>Ikz$eZgo=Jf7h7rpj6$Yk(wa@E6#i=eoViXT zNT7CM&eak@5M3bD(hpaqu@W?43dseeka=p2Nh>}m~{-Id5L8!a^>c#LNy7XIOsew}`apRq&dS_OZ z@E3k94!j}vly1Jw)c(Ls$)vLWH~xxpG&(kaA$sQL!q^GNwyz*-WvVG0xX2&ro^s_j zp=H}m<*iW}II3@v{c+;=5e9o;Yz#X)lx?-Htbx#zc_fk1*uj5Ot{}$L@qW5?TdF>e zP5EB`YiqmmHY_*zcI?7$>>EDIcsf#hOvG6Ht-pjw9yiRc`4p<%e2ezk`IEKCoFNR`#36=6a2DaJubi4sX^;RvY#J(c954NuB0fg_f2*ye+c+;lu6b!CRm4niW) zIKoH)J9ohrzX+v>1kF5M9srq zRl7rV+pesfkZI^e)6_e`b^ib$ohMbK5n>gFDk6uh;s{G(@@MNeuMC;mVpNrY>;y6@ zC3Lhy#x4fL%_Lk6E>?qH8}!MT5`mrpux5y~%ixmE+PrvKoh~+4tTg}Y?o`mOP9N(>3e6|t@gTi1xRQ@3rk>Qajl ziM{wZhz#;;zcwd$pxsWj>c!E6eD|{e(d_d3V<#UmEq@=g>~wQ$+4H;&1%?THZVN3TTfVM=J ze^$%LjB=KKh{Dmb=y3?Gs~tGdBB9GQUL=PI$Zt&+Vwo?GW^Yy>gwBO4V10wf5C6=1Lx9HNO31@?Y$ofkAnK;OF?`W$w;Qnu(h zXZR@1PXWw_?CZmhO(Nq4Anm$}Y=<9)dYP^t3yt^U@=e+9`8`_~_Fs%2eHfZtrt3Z{ zj2x6H!My29lxtaP5ghkVz5Z9$w!5q=?wh$HOmv10|F`YBPnhbrUv5%j6>%?j@)5{d z+0~yA4*wg$BD3NlRIwf)jd@k8$&B}idEjZT{%*eF29P08p(S$*5k?9+qMhZD0}x1} z5|>)*vu?m@!Hlf@P{vYFiMMq(!!zY*Oax39-aJ57%p_SZD;UtbOpVA+MP08X(mL~= z)5#dX(Czi}ie4C$?wPr#D|DfQEmSYT-yYJOU5%v>qjNENA&3#6b5$WHw_Ri?DRP*k zm_#yrL7vdvaI6uWae|2;DH{PD0Z`2Yi@F&@`juh?5uW8nEzxu4SRWx$+|nAec5voK z)#V);cG7)?>At5xpa(bHiIu}sQc^eDP4D3l5GPr6x4Mo z2bFmalNjDFnKqWe({{oiomT}NB8`a36f%$ie76aDc30vqGAvkVsiMX~3=6dZS zy6lQky7QZ|I~SYpCuOVkw++YrV(&}h_+e!h`mw`i7 z@}!WorAvlFG&-mkL9%L$4ly!VvhblKt4^^Xz5*Tez@aHz+f6pdfJ49Cg5n4*c+KH+ z*1%zarI>Ab)V)nKU3uFg*Utz>N8sSg(BFkCx02djAZ0m4QYjLfk|s}ymtG}Uq-wS@ zEq6i2CWQuLN56%f&DM>d18S>b_|ap*qu;l!{*YzauEgt7c+|h=|2Q^&hOJS1@s(h{ z>nU;YZOgX5M)qp?S84DKss9y-SX8-zYP@B-wP~j*`34ljXyPC<_7*W$3Jv#Q$Fg+F ziKR3|CO=2;pd)k?P^Or*-S4_VpxwDWjT`QC%^kub5m?;!u(gkvO1l4cxwn`ive1%LLkvRrbZ6oFDfVl$Dma9n? zED|9?Vv~6EkT`yv5Q%cP(@pP&?pDRN#B*nVA&ecfZuzq6>J1r9LdSl{k9T@*{eO_P zC*2Jm_%DcP+q#cYX1B_aU?KX>KU2;|w&M?=$)#B1L%91l*na_H4tZ9g+MUo+1z6|R zO;I5MVhjpFG zQnuVc%DyZZ0!jH@c{!F+HuzGKWjX@NX&MUwX+ft~Q3o-k4+?j9Ni|9DSPV=A=xknA zbr(4-QOp$~s=nXA%!o#lH1Iq#TcjzU4_oLNcGcS9vqv=NdEH5b`JoU!?muH)c_K*W ztNQP&>n#Q-DI}3p!GR{&X@ap{yl#ZFCcf#auRDYxQ3fl!Ntz`uEBTfEMhUMR!Ac~c zY&Lp%zfsw>aFmOqDml86r`;Huvg-@MwBR)bPO;&0vO(UyigT`!SWo7Hs(&V+hRoq}_TV8z zFlTLvI5zO6Is#F~R8FGEcwv&f^0&e!jajgl#xWZ3G9S!rGfEHzAT2?Y1kLgnBZ|u9 z|2XInpjG~SvwDb^A*K=zuA}y`knfbX4dUgp1)Yt|Yu_rZOF5{_bHqixIzxgk+P**k z)uTE>7bUp0M#id>?!ae{s=ry7VGh+74#|Q-bULI=_2v)=(eO#Cma=l>3xG?C0wpc~7Zu!x(hpZpQ%k>qyEV9cm<0;vfIK)AVG)3X4Tq_UEJhF+^IYEt<-%k*VtqL<9x{Yw>WU{ zn?i7~Z2MnO_UhCw5HaR^{coAFR>$Vg!r2#e6Gwtb@gv_L(MfjoN2!W6bMA8i66hhJ zOCUM|WXO;>83Q0~1!fPlR1wb_Vynw8urXJZExclvY`*>G=tbVv5_N8j+g6a2)wOer zq+Eg6B8<7Y^Dh1Ziz86k{f!YQH&59W(1g^??9Tv!1rb@n3?cx^0LX-?nlP%GqFN(V z1)dve%h(qgowv}h$y__l9Bsg;;6zEmgi#Aijmq7mQOeB?8-^FTrbSAJEmW_<=Z;>U zNpyOV{KFv`9d>ppk}FqpppYyoGAPoMp0FH%O$jsQ?cw41UW%T864|Chh<;T zgV&FfCS3-UXf?6oNsrXy68dNo=b<%3)kUEvMwQ2rC+XeDq*l?gYvD#L{D3vyi=>E% zYysPbh;^leta^KKs0lHsSE!7U$?Zr$G+;pbaP0w>&1BQYxZ>?VQV)hUZ2$_aX)wNm)LiXUG-7AW{Zl3 z%5SdfXj9V-?5bPb6qw5uxj&OdUtL zH70KaBn$T0@q`19+R3C7kBi9UN6lkYhZi;L?}#1xw^F~i!@vRQ&Iw$XdKybXU}8~{ zgh7d$4C^{G)}q7T8~);}MqM-aGGt72SkVTHbQi7yM>@$DMD)9A11Tg^r3M5-boVQr z6fNaZJTA%05$dWn@jeUUtEmGnFnJblnIsLDL(mz%9>hv~9)+ZW3|hNC*N^{&@n$#xOvl zZJFd;A=+CBJ!iRVwjYF6`-voaySNL##eB%R{xizb4T#h-H6(cK5g|C}-0&&Jy)5@_ZZvkpX`woQ{qN}6Lf5V z!g0w|DVeJ=ZO4pLWXeVPS9;DCTWQP_voPk4op!~}V8lkuEkX0j7*iuby_=C!LQ;+-*H8xqXgVeCm?AY9i)0WZV4`S&7F}8f zkwjL6WK`&)sGDl&_~3G6i(J1{@cCour~Mp~_c;Yc@?jB;yiAVako+?;X-(%;D#?H$ zjFQPt;W8j|isT0j_s^yLfn;)x3JJcVPJKoOdiwWU}h$`TDE|13aT zh^`MXtrFC=V}x?TsuXgDj@ZMeM9733n?uem8h?6(NT%Rfv-beSdkK~#$UuoF%F%Jk z>2YLwbt-1uf@h;xu}uX9GIlRhgZbW<`GGx{k66}yg04~@G+DUO6M-Y&cdYw}rE$mX z5>!>={P5w>@gLh(ywB36cC^ZLIUFA4j(-bC9NlyqyX-cN4N_A@S7d^SY~YM#>K!^h z2BC5Q&df3m$7c+GnJ{)7}Zag zBAi>iArL~$Z3`V6a-DRgk92w;(O#6mAsNfI^H)JwW1TIO}ky>?M~42-Am& z%bY=!Ew1Crd9XMxYf1!0>6#$Z7BsbD**#=#KW6!{vdNbyF%q?|2$bKNxWU&fR8ic7 zb!smY?&htnoNJ9}Z6cHv5Q&OUP{FgbuM_YAY_5=j1BEUshlF|7O76A9TBk)Y>24(7 zCQ{%MKk$|?dJLLe=G70;-8=u1nm({z zb?(FA5x(;=5*Y83-x9EG)b9A@1_0s`E>`iU z?0A$00#x#33=eHGu*%4V(jW}vM9fYT!rht7-Cj!D#l(}g+`dbpN)rv;t6gjb%D zcIau$Wdqqe-lZH(W-V>JF!X&_t(N4S3Mm>`q%HKqaTWKTi&xNBEPoKmnL_5=$>>Eg zCS`PwQ4Wq=$9)yO9HSld>F4$V<6rFB4lwzjdpQG5AP`N|&tfxlz z!caHhg2Y^ftG8o&GhiIbyC*62YBoxVFW~5eIJlP|K0qV^xmwH}_fxK>)Uq?b5iEo| ze;w=J>)QNTQ_Xc5dOa7{QPapx7uob$|}{62>LjoB8TpbZpo<_#4UA9Id@mGOMH^SZ>%e_Ox6)Sn=+d zeGYFyB6(ct(cU-A_18OAKbUk-i+Y=<|BdzU33vX=w)_rD+wG7_ z4`)JHnm8r&y#n|kqAkeTKvk@V_Bv=TQ+kBvbm!_EMKF-!PzXcbk0JvoI*j5Ia@UEu zQgW`8oNbtKAt7k*{V`$7qV@M-Q`*;zX~F9re~A{Rrs_W`GM9I1heU9Nj<|zw^K9Kj z`CS67av~j^^RsdeOI>u2T^uBc4KQt9^J)&cB&hXTjk2Va_^a`SYTV6&SQu8Gp>B&q z2bp#(=_d3tIKGX3IZB*+#d{NjB1!rb5^plUQBF-ni7k#T78GZpFeug^Qg zJxt#VZ41Ro)9BJNC{t6UZ9t7X8ZF&bog~ARFk^qU!(C9j=5teUD1>Blj68zSJd2+@hp3YMc4RC zY@{dR*%5JXn^Cci{*DcH2Ae-2nku#HhC+zx{wZeNV%tZq{EcAc#nH$J@Sg)yr-&pH z#3=i1uufp91lDS3DkHQ_Ardi8;$HbbnKN+QE5*D(R+fv)-pNh+YxF z-{;%+pOmZ7bNv?}V@d5@`j$(f<3HucPuV)|v9#Q(u5)GJNpxJe^co&L0wIC2&?d;b zpxKRN^03wb#x}E2*z_h~a>s{2d;*C<$cLd6m6eITS*pCASgHu?zJgrD(*GMe)E(*g zJZ2o)K8%eIm5n_on5qMnw@Z`~k8uSKxPto#?Hs9kXy%GWarrj~f3ZID7AyG!rjAkT z4b!i#q!BeoVkN!~@vSm25`|^wshj+;Hhpcf!y{|az7}+5zjW8Q8e7lk*U^JFSzhlG zT90vCIAS)#_0A~*U-jYgF$iM9%FS@BdDRdzEsOVE_8p|A0_cyC$w5G@7* zw(I$M$+QFJ)x72 z%iQ8v|53I)VLKCjA1W5Y!9(AZLW8aye?hw%GWaQivHzkt@H+8bK&)NnA!XTa+z*5x z#JoZwGm9Q52AJH?bO-SSuuIo}gvmt{DOFHK7r5Nni9G~?qj z}T&YatK8flOb|-f_nRvHCq&H1JDfh>T5un5?NJ{$wE3EZQ#(5{EHb5BFQRQ z=4JAwkPLO`ysxf0&vcT1r&7GT69ulf>>m)C&-0hrV!Qe6DO_Gp^_}Flc=4QE_-ri7 z3PS6sw=jW+@LlP?;bc03yMz9Y7OlGxM6c;+-1i$shmPJ~u= zqarb{FnU-R*aOYwO#ODcZkwJX?4_93ci_8HWV~$WR~T2?dbLIH^@ff=1`)Kc`zYhN zj4ax|O&UFfhxe24AgbF&*X^7>+6@9Bq6{!)n!^@zCDAI1jaqshm|yBc>3 z&~k)+fSX>2l&;wus5cv7_c6R{W-G8%aU%bnmgfefW;+ZW<+ppWk}ayGhHo^#ahSXQ zqL_9!ylj0;kr<-z0Fk+1%GJEsLVwUA`-nv@(Hgzhbr{LEY|g-;A;n~oT(UC;f{5;h zYFCji8*NCyWkCt~JOO;p7yW$#W^|2fx+7?}tjdsGOHn45Mu*M2}_K1uqvC)*~NpF9^h^j*eLZ@=y% zbON|&xB+FkNw5!(9VXF9WUYXn70BJLWK~o-No_ht(IHFsV_fqCqHER6bt*Q@1kVB5 z%9U*8;Xz8EPSGOm%()6Q=ED^igw-=S z6dMfRZGE;=xbBRwHp>R;YJV1zQy5>pE~64O>6MniBBv6%Ef)efG$fbG3I-w>gA*E= z2t6&yEx?eWkWqk=cYY^ZI!V$kL*9+1!{_+b!=n15f2wT{99skTh=e{xZVrR8B&FFO zop`jB-$Mc3k7`4xPJrexsuq;3HQ*fOEMd_czf>{xiioUZH6JADLnbrIi1#}NpPXKn z5sZ7Tk5}E4+AAo`3{kUz|kLZqo-(RgKNtl(KhvCY_*3fVOWWG@4rc*A;#V8 z-2542PF~-Tb|S+f_MX9GM@Zlzax^G=v3piRyVfhgvqEv>rmn|?+FfGB)|o4oOTVJT zFdZKWH-AX9&*8Qib9V3BR{tTS?9?HRH~)#s(v7*TMVPDiJ!j>IM#}C8npdb!|N7@> z7DOFn(n9=p;;q5wWfD40-{*&EH~6xE(7Wkh5 zhA1t7$d(>5S<8(r@&$`5$*ed@5M!m-z>!WC5Qt<%fqVuuXGSR|pcq0Yb`;!d+CL)I zo#R!Wz*4KQk-$2%hX(N|ahxVM^K;)SoYhA_Y!}|JNn=1c6~#gbp-5c*H-aih*v+x& zw-$5G<=K^UN8gNEJN%woiP|H0qGdLC);j#6Ty?DGcHW)*im9wg1%nn9bT(0yYbnnP<-inueVfq|LnDEs zj|ssc85Eq?ec0NpvItlISj{vyK71tH`D?<5DO;uM`p;9=imUfP(vNB)#qs!Y;_m{! z^MJ9+odWho=xkP2$fi3CMdHleKY@sfw|{EJJRRzr|f!#j))(Pjkk~I=kGfv-T5?IFXFUOY4bs87Ir^^!aMPslMcpAr4tJX zx5J}OFd<(K5mzVJm3RPsqOKiJwDE5Uz&uW^j3N&KkS1}L*k>1pCCCh#cc$)?puh1D z3l(EeAt^RheShj2!{m$u7VLdLg`785d#B)@167x!Adw-a`{(@f4--ojfQ+)kM6erP ze1?>-Cr!6s(Ii0Pff$>42?fL^m6uRrULr)57fEb&l&1sP>!Hb|eK=WaI|W~Fr0ZpF zstZi-GUB=6i;QzlrXXYdZ@QDozhOQcIPycm-;Zd9aWz?&-@$lVQ}r|_K^YapBr-|@ zUBKT1aa=hZ&RnhpJghaq!wA#(St8gJ@kkTQ{QLxPVs%jxcZ^!MBA-`d4FS>Vo`Q=2#UPJ0QHv zkM$l$oYG{20HTQD2Ym*zXoq&tB4fv|O{&n41ppixl6BK_4vOTLn#o*5Z#(j{kXXOa(|qC%Sn~03e}ElW@=_4fe1% zN6}SB0s*m$gZ0rp9CBT>&v}D?S1tfJAC64|A&P~lvNBXu4ypy_3RHC+V!cZRs2+}lEwjnV=+Ct0~&|0Ou70lR~k=;~$ zRC2G8JnNAVWTp3 z)R>y5|L=Sk=knZS<;h-8vR1OQvyuHvkn_9g%nE)*JBx9AcH$y>AcshcYjVx6rmTu} zbkU*Xt;%DdeZ1u=c%#$fCc?K<$QCshP;i!fzkQ0Jy&jkA9z2dzb<-EQ>we7B}O-;J!CFsXc&~GSRj3v7ifCeqv_acSDw=C;!GISrb8bM!u{2zhrDFDvz(2bSDLO)K`#kW?wiB#( zJS#i?y}R?laCVUe_;v$eJ=Wow5GD znxgKStmxT&CWu57B>p6L{gZg8re_-lZ6||E2V(4VK?iaQ|M;()HeZvf&`LhvKa)Ov z;$aDSaCtrmBwKyY)?&ZOF%ON6Hy?aSpQHDGoZP0` zu6d^Ga)O=PKZ6&TeMG|qZBWF+k88mWd=%lv320O(&Hu=4&@e0k$uG3}SFeDNXNrxM zk9f^qPY^i#gcX-kSw%W*4_#zC0>FpFNh|s z4jd9ok1T9aSWeQaMb-6!I~4nODz9CWWlfU&9 z&K%8j5X7t&dgO3ui>4Z25D&0ek5p8w3lt>bwI}n7oICtokEug3o40}lPRDm%edyR<#p&TWu!R4JY4{PeI-Di%NAbmIWpTWf3?fvLl zlE%%(57?$^VE{sG_h&6ShtG~qJGHSsE2(1*8fdWc8@^jr*XW8*d}I#mMfOK(R6GEyZ^)Ei(CNOM^HMDZ+x2&L6MA%&BjWP1_#Q=%k6&`y%jwKTwtBAtjaZo(UT=oh ziwNx)zj0eoqV#;|c6#&NmNc^L8JBG*Jjk;@M~AkA$!nqol4OtfU!RJ-*Ltx-2#uV- zI7nJjQPJH`ZG*GMTgE2w>rX-s5j{=vx_g;Fficu10d`4oVT#L^k9Jbx;VB2qR$J13 z*bp@$H~2p?2>b9kcLKbQda*GaCVqy5s6HD0Ack$ns*gSF;9p2|%#q;Vp4VpgCM#^~ zN3!M$r>SxL7D;4#WAaY8w9Q7LIPQg##U2^L5xnXfLcif+wFNakQ=v*gsM5a<1K61C zbYeTPZ_8nqVudoY2Xmo?HR@`)KFR6Cj;`GzD)8&JVo+OxZ2&!@GV?^Mc%TjDousCZ z2&e>ZF+F8Aq*fJ*tCCX{Ln9eIrNb4Mz!$IIj%Q)=5vVyeE+(O;*#-rUtNwbQwf)-z}S=3Gy`N2m` z&9&J1^#M>1Pnu08vi~(-BIwH2&ppfc{-N5#0+H`9DJ-s?pH678$`955w-6^iVg>j* z{^JO=v~PF~Gh;()7b8M?PQbN%owN<(UvU1+C0j;XWNJv8!yuCB(vJK$4VNyaPN_i4YZ51zrDKTu?k`AHIW&kg*zd5J)=W?8TDD=nyT{fc^ ziCQcR7yjaIz03{~jeUv0Z|)mZARKVEkvs5HY>aa8S>n1Au6yh*Xy<16{hdYp0gq%n z5T#Hw&*=2w)L<)YBoaP|sh4WRKhizb{2AO-P3%|!hlrcWdvEc9_w`GjC}2(W={ZrK zS_+9)e1xHm$F5q#z4mLs?kjW^t1`Ua^Pop26-U6NR$*sXIYu_-+H-BE>s$19H?I5! zB~G62>AscmP8_$iZC~GN!ULAz{v=-YO(4XOMfEEajHTse|p#Yz7OEm-NQ{|dV+63t#OU$_F+K;}a zCoY=L$BHl-j&f~(%%b8+XXD&AmiIrVlTv7c#=RsO!Fkmi3?l*OBdL(~*d6mwOmsBjmhM9JV}+n z*{jT`1p1tmeWn-v>8!65F@~I+i>7692aoZXpiI2-L=lxOYC?jUg+U_Kd)6e zd{(r6-5gxGKp0E-36b{vc@;?UM?}oQ-ucQXG%Wl&*tt`^F4y=139-0at0mjS;Y8^)x5*oWMhC(OEAPxp z&S~qA3NyUhtBIRU!xqym&%z)AE7J)IzwjZ+xo$ZV9k(xJP|3RYv)fV@v9&pf$)!NW zj}Ol2hL|I@2wZF)5Z@Dr!Rn#ZM+4Yq@{@)lFj%I3cdCU>bpV|3hE4gdiRGHG=7dTs z7e&(C(}n)}uNF1CSENLAlo&{_N61$M4VukuyjI1k=C5gcF^SnsUAAVPueGDHJNIj7 zUG6=L4V{*QZ7KG_^hfV_UM1hf^r_UdoMD{^obwpOi_vz`*o0z z$5<1u2!)KdJd%jGWPt&S8~9pqY6t?S|1J)y zCb8_cusNxjO$}$4k3M9n&i`7YUBhy0Ni6AwW)yP26(R|l6M$8LwQj-6YE`~81l6UW z=V;tKNkActhQ&_`G^WyAR&z9(PH&Kh>wR(mDRk}p%w}FkU9KCG7@ZLk-Ly&#o(@BN zpK{-)Ge3OYuq7y@qo3gzgOE7VM&mJmpeOP;yE#nEKa_iVXE9n*;K)IyV*c5F)4=E% zC)w3*R$cB#b7xI2ohtZ?;S_AqxGd`Ad!-HniEkN`*_nXnU({#lu$`L9(NYyg^V} z88&$(xe6~+w0XSAvT;Mzu9fvfL^Y!Q2ls?1T|~HV{tf(O9k*6-SBu0J(+IWh>uI9? zF19sb;#{R|_LGFZ`?Gp(PRiQU`fx^}afUiUT$s<>Cx@X;edp?|&2=W06(sNlz~PgP!%G+@ zLDd*drEgcUE6jtFGH8!_@1$MtD8>l$$Ou*|NPI_!XwdnJNv@0T_C?hBRoD7QZ-@D0 zjzF?5lHfg92${TU0#!1d=7l^h??$O1aT^u% zYUCwj-~yhx1m{DE(2|W!-QRJc(#bR;Ypw!1bqT3FbD23}#Xr1Xo>m7~MH=<{>=!m* zlD<=m>uK|ge4i*KRXu0kDn?q1!xl_yjJLn)s*NW+MLN_niv+E2xWI>gY|;_6L>67c zL6Ab>U+=jq3u2kDBPdy;3sM!S>l25OQN{hod9+wkuO-~Y`C-pQqC-+8zDc@7!ppX8 z5t?$pC%|B$zHkt3dciO4-dN6zF6!q<+5BMW;` zgb!7<@ts)h<*K<3r4`z(IsY7n#ov-pn9_=%Mcd#@=a-?&dcNIbRAOT!*B~R|g&T(_ zd<8X7WK^nJ^+ea5V(MDa+tq>dY#-K!@oo;}9u*g|7)86Sdg)_7Y~i=m%+(ztL1}?8 zM5NeGH8?I*`C0LT0!jSa#JLra>+`mmMQi0+ciXl8rJG1eYo!GkOJUTl72QgI#;D?= z{w5RT2tDoKRAp}@Aq_n=bKF9{ZUh7qGrm<>i=;iqurxX!uqoRR{`JH(&uiR6MoGNQ zW0U(v!Bd?dc?!xbG*bR_arvZ6+ylYqqV?(oU=UgV7k+gUk>N72nW#5OX^2Nn6n&vb zJ`jyC;*V)hAVn3Qq7e55mq}n(j>F#AHlemRp2*673@hSh=Fjg>My1F-9#n4WXg0Oo zq)V+vGe&NA@HpCfE>A!FoFBpAS6k_zWA*ZT?qjGMQ?2eE?6!e5ZJ3CSlzV`9Lx5nw z69TO4+(@jPAw&RMx8xbhpXx}%!iLN7=Qm?X4h0q6RP$-&O)86I=}m40SIFa2c>w`N zDLpjanht^}AOxVoNa7MgE}%~Qlp^`1cqz3crZo2;Mja*NO=lTCix|9kuJ$SQB$nZt zGF`n}PZ;1HWv@gr%piHXST*rorv0CUowR)|A%D5?sR+eT`-6P#EPo4MG*G_f@OV#k z3YSSE+R~0E(V~4TMP!fLlV5H&w@PK8 zlMd^U%nC70aj6YoUQW;-f|D>A;co_et7_LN zvw9L=O?S1+ixWzMJ6G)<`fC^99j0C%FZN>mqGXLzbtt8IcD_Rd$ouz1Bn5&|Gsr99 zn&ug(#n00uwN93wz|h0Hof43UB= zG*%fsEf^6(BskNhz3*$2?GPrNJ}%xt{G^=a(?=6_N0M;bprwD;0AZ}+(= zulrFu*S*@knr)$z5-rU0?~&SytC zG)w^#|Fiyj%nBxyQal%^QI4VZdn`Hv(iPR1U=&@yg5fW!PTIP*9P9mk+eBbk+NydH z+HnAJ<-8pRW<63+oo9g_hB8_9jVK957$)ocsBBb#dUKD zn1IlD{;Ik5s~@(JLwGj(4H)=zJ;Pl9B>a--mNh3bwi|riav3*f6GPIbw%^xdhIjl= z-quqc0L;A`I^a0T$ zUEEVHzd>8Y#Si$lgSP8*4|}l3%Y=<5@~F2MwI$3QM2`v1t6qbp-uMb6vBbGN8ko{h zFu#uLs-CEO-?g`ri60dN6~2IFncq#Hy9O>p?dM(x~_DNH8XWPv_HKV8xaD)lK~Jud^?1?5f$D!jOFkfUge; zzSeU>7Myh|Q7RsN@dqD_HxI_6U%UF)Fi`=o3iDI?GBV7*it+DJqrCzV`uW;;ou+xD zYGf!hGkdWxyk7Nr$et6{AZLW<1_gTJ^i)_l>Oe8P(bd@91LKkAR~;=ct5413dA~W~ChtE^$cs4mUS=?2UD& zC5_#59T1Je89s@Ozw5ypS-A?jG16kiG(-&D?{|`Qo!sn@;tG{}e=&qFg!=ZPg$)al z-2C$$_}vW!51S1czx~vfDB$5q*@Q29HLG5T?8U8i4 z17C!->$PWtQbg5fuoONgF$7@yGsqXg=~}nhgBd}uz# z9bxee2T9ZcNJ3q07vh`cSf}sMBM5ioK8COgVio}kNg9I+Xdi3KoJ5Fc=O|o zBlf{+7bd?SNDr@D&uHQS^;bQA<<5fM)R=08Ha#|*4f;pL# z*oX|sU@hvqx>2{-r; zH2o{qM_rKkY_mWYybxvq{0oVE*_{%mkP+}9J&aDaE?a_{DPGz`wLAyO{_L=;_`O7_ zYdwyOBgZtY)mqwTGfL7Xk<`@1aKZEeR^Uo|p1FwkTb0j&n4^JK7IK9n>~Xn@tL*y@ ztKDIPF;8gw0dvmB1!Oe2`bnEv>E%@uQ5Awq;~61h#36<%ZreuXI+SU95ca`!C}Ft; z5%NGe^J&qEu_m{Y(QHBVbBA4N_-jfxyPXEx?N{4#jw_8;E`&rR=ok>GVid4_q8K3Z z*zis;@fQkvF6_WOM zurIO2aIvpDPVM)kVk6+}@PrhauUN*Hywk=GmMvd***wclVz=G*+A6DS+_S>fpW0hLsLLBWIf;J|e zvy(Me{K0S|Z3nR?Ua!-FZ3|(;h_0{Q>2{vQ7Km9^v9y(DVI^10+@iT^5T8X9^tp7? zi+GJZQ1AND@mAZB``j?Iz%5@+nqMKhB3d#88u<=L>7P!QR@2^|H^*Z*KkJKR;AJ|` zKd(uzubCKGqe6-{L$M4l&*J(6hrG%?2vu+QQpv+^L;1%oIQqC%glU^yjF&ka zj=ff^)2n|$*ScjqsX&?{R?5Nkh8)WhB)qex#sxQtZuK_EYtIOt}83PY}nr%y%>28aZC~ZJ^i1n7grw-bBgaK>X`m(lCzgYVB z(V$6<9#|DAWusU*kR z`|s(FUbJ1K?RkAaKGjdr*8zk5|fvA^c-4c zd;wk6j2Uw9=YceG>h_Kk8K&W^!~GRJAGVYQYq@ebRfuBZVk~FeFjAso(T^m)z?VQp zM-ufJ^3fiDYGugamfUR~|IcB6rA%W<*Opw13&utGj?=LQ@yw9eKU7v`Q-(Gn-y&DH z>;1k_2H#&VidD181UzKW0Mr7M9LpHR7-M7!)~FRXRa&oqaNd!Ci)xWSD6spkbN6be zNg{ux47z+}-jb#qMa(wW>yyV{f(_U0d$LAh6{frnR(JxJo6&77qs+)6Q%%f*0^gS4#7(J-N3GT! z!=J(@NlxS{#+mFt$NOhYytyHN-4@ta>2@tC{YsLKPHsBi zTox6d$0M%<$BF@RXpOHp{k8Jo7@$kf>$=Rik7x0I2xiRu*H&zzM^(hI`o@nke#cd-r;WvZ8(4XP65WPzQuJa83WRj}=& zNFgHR9wl+KozmaQ_hAdL9znFeXIA&xxu&eGYOC|EOc0G=< zwMONFvknka>86uHj7r`Nu04cigib5taL1jno)=S`%yvE)rmnGDvudswP<;bZort4} z^CxX(q(T%U)fdD^+v!~R>_)~KOYCVYY(J@6bcAdqt%$EX88_%ju_?32xx!{eF=vj! zOE7h=M5_&U!uFhR|9cZacTaK64oVkKf?0_CZ6uli$mT%;fIAfjr0^1{M|sl-pQg;_ z+LI^0VM46@smOa@or(QrVl%cxs^P@Uny9Khs=)hsG28X8RqcC*krg=EYqT8KpLz-+ z%!Dn=l_e;OFhpj?yoR!w*=RJLj1JgWj&dodcf?)7YJuV)#^|E;MO`&7gI%>w4&77+KO1738jwelIEGJ}gt~Ilm|KVe? z??{4apfbg4A2)DCS;_oUIj*PxtpzGWJ)$BR&o^8_;EHv9zPHw9bX?Df}?VZA9eB zNNU41n*tt-+3Ry)u)g1G=4ef?9ERL4c1|ajty*#1NDC!g2;__nplF~inh_ZR5+QDA zBmpPSGVh(@_E~W>!`GERh<^E^cPhZC*lmlrxh-P@gQpu+1aw_LE;^Yg- z1txPBO~K_uE3W76_PZO+&NyaGJ;lxcx+U3O>#W8LI{p1q`;&FCY1L}SvrI%)Y8e;9 zIYc7^9h!39>+?|+4mf-Mr0?oK9Q=Ao-e+>(XTJ_!5OVU@dNK*~y1Ucah zphMgtB$W0-O@-)Toalj0^*R8DALSM!rTqTCWf-)dw^RjQ)5y%vm*%OO2Mt_#_h)Fw z;>^twbSchTL`{`!c_3C-e9QNB11^8De?Fx5f+ZQwSBc@kC8gC*i%Ov}BH2YSdF(yq_-Pi0`3ZC4T!HgQ*q8bgFH zDG>(8q8W$WxP+#MrRj|z2rz%e^Vir;+=JVK;N-7NeM3ToWmZ8Um=i6Kv*`+qmu4=b*HIjD!ZtTj8HR-C@emDWw~m@JD$%&EvLJl#25@22QA9||&!DugmEH;onie`yzlVe3IfpUh;s z9@25kuLG5Xphz`;YOAD(g$%C6*W=V14LK1ZA#9zGbgx4jlXrhr4eFj_$1#3uK~M(g z8}LtGf3%KJ&?#6C7^|dOO3gt@=&aaH8zfofq*;;pki~?tMwoV8qrrAa5!X%CqC$Z^ z95=eiM4F4Li^zz9Lr0zN;XT%*X9(9V*ps>Xj3*^fq(ZC1Xrk{ht`U8reBt-F&D0He z)N#CLOYyLPZa+;4z#l%BFXh(V9~{3Dv^`hTi!3Dv?*v#QETtE#zA^@qKGvk_ijp8tC=AC8+Q>#r(mSOu;D$l)$; zu(cM#RO7Vx6rDaN{E2qQPv5+c_fKtf{^#^_>25N)Z{s#Akv{5UeWjk^x8RV^Va3@9 z4R}5la`8h3B5vBR>V1cOK4DHb`>lHG!MI^}K8ZwH5SPlFUkds!j3ot#a%O zZ@@Gk_oqsRuA7al)X*!uDB6uQD~cu+Wf`|A=n7}a@l@{?+iCYp`g@m`RN$VfPb=;y z5lUj}gvM!A>I7&oSBg_qyUukDy+`BCe!KU|l^VFrpcFhsK(d%pgdD$MKx~ppNaV`v zeOn=T57$psT7K68@6p`82V|Y*4l-(U^N8BU$RVuA#DHg6C5kuh&24n&Zr#n+$BV72 z)EBjG!@oj-4K-99ROexK6v^py~eC)}1T%p&E3>G16mlW?5@;i3g&hksCW- z$WuqY*k=p1eqtE15?0dVmvKu~jYYz8x%Ai_MD!uF6lK{C03g-SvC^W#vv=YmI)Z?Z*aRt?k71Mn%Px11(Le8r-jI_th;b z%Z_WcN1NS=;@E$BAZ`xI(Z&cz=YDI`hp zM>?cWWDZA-ha)ipr&GQ#>ph-_YyzK&uLB!qcPO-dR`rn0I4 zUJ^PUau&0YVyG5donF%iX^$XbMKhFny3IONua5p1xGZdsIlJ;T3Up%3M1CS2pwRRVf!MLD;v9t!^er6)hrabCpYa>1VsKaf-rA%cj(28IJ$K=4HH{y@v`qFruKTF2Na5m{L@)BY0?zTX5;gHOG2X z_dTuB`MQ2AnDVSvhd&2+Bdh5iq6`b|sq3^Jq=EG;OGuU*kWY=o&4kTMkYP&@6n)0; zysxUlrq5}Z)t3-Mm4#7rGc%bQiMAn0bq6ldj6qa+X<#slDAAT|P&5AX&xQ!9gjQi(5W3dm2s%$|=Qxpe9%4(&mh$`LDozV{yTAtWpNOlG8l3_rD17dsL+~90B778{7<%q& z=QgN{>8fMosp+WYKu{^)+7liL32~tnWQcwOpu{qbY)DlBDz&)vc9AcQ%mW~sU3aFAGSwbo*zFHRJwWu2AlO+(ZyW~cl^}yUq`*;Z_})vXFHpDzBf$TGXtkBi4C-w<6RVBFp-HA5rLF1 z2HYm_%0HnsEI7|-*RiLFs#7LpP6S$AKBN8WtH!!yuc~`VNG6K*4b< z9E7PiulJia;X4to$3_Wj$kt8`(c{q+&yiAta3on&LVAKW9 z!II3zcOg->Ba!4TP^N5gUWcHlwy+XbgF z(1Aw8IkItFn#{WmlJnImy&tD6j-ocjb5wp&Re?O15sA~X9$%l!Zy)Zx zs%P}UuNq;dn$%co1{61-G;lqLN10_KSF4Xl9ot4T54wn;Uh+9|Rhl=%QSzLdYMDl* zQ;(;_d>W*!pUcP2S3Z(u2GF;|x~dQpe?+ChAAi2mml>^tIZ~!~18Pu-g2Y1I*N_H~ z7`Z)u^roxGl354{$#JyeI$PXjQCD-c7B@cZRh3d~O6Wn?A=-yCpBcg^0!KLF73o(YAc>jr64qszZIV`IE>5K9`k38b zV7`ANNX()3CzFIp!G#aVu)VMVT}KG9zdgGx5*oL@Af2tY+K(3l@C?;~lt2GI6Gb`t ziZqxmoJZVtB1vHFQ$GIrbUXRbJ@0nvpEGe!j?k}$_T*wcbch_}vT`kc~>MMtgqr{+$`-x06^+Nzz+N&yqSm9Nf z$PFq;ZZHF*qf19UUFo$ z>CN#3il`_WjAIHgav4xbymrQMqPT=R%V$zkjDoOZ5Ad$m(1f(bCGp?|XV*%#+JiKA6r(jrQ1TM=d!_tK}`7JC%> zb(gr6%V%KZff&9}C8^Z`MutO1Q=FA)W3&}{u#@|uqyEH(sYm)+lyx(omXO7^*RT|D z14`Tlz!X_QrQuRy5OrcgnarW^{as`GE=2FUs``z0V)lbzI#Htdh+TOmC>WX;^Vx3b zPBHExBq}xohA#NrTs9rfb_PD)Mxz78rxcu7P>zI((#JPNqaIx9a7DtY;q-R!57NgO zjlL*-y=FHRo8VFjSAmt7LzKzTUKlZ2(P)m1$;M;(<_i3I?b~>~OIAxUq=>w;@r1j_ z4{{P=Nf;plQExl4nJ4h=&TU}%=09q|eX1lh5k)+q#zZ5ci1&(-92Ao3);M0(QXuVg z_jUiO-a2V?2`x4uilDZsT#8Ct&Khi>N!v@o$!GyVS|8bOB;=vzOPP`iV<{ooA5OF3 zeS#CBJ0BR!1ind`$0Qli1pa0(i?w?h0bUcoL#fq&N{L0l7#^kb&0^kWB$qC`--wxh zJ9lbmYBj#@8d_$i{yN64hnW;yQg$02e7at(cb|-FUys|qbf(N-Wz%PpDC~MzJYxpZXJbum8;MM zCGdF^bPETP$Z9mO1%`5;BGj`Kez(^Wu}O~ZhGuhx{DkYfEtDwH2-H0$Av8ns#6-fZ z!9#HTMCO8~Y{7^72s(k2olKfMUx*AOjtrmheomkHW9$zs~0j?kLzVO?G8PG@aFr2aFO zq5;i^9NNW_EGb5VDGPji_J_vnRkdpWyOqo`+KDlhNH90e<%FtyE8IQ~nc9G{(~T78 zQswqt9)7-mfu8PsghEZmKW&Y3UNJ_cPNT>zs~5}a8BUNYVBx+V1$wUL#3OWV%AvIs zh_Tspiqc5b?iKTKk0^4zttw0zQ6Ua0DtrD3(1Mrfl`4CXsnC#iC^W%@_QF_n&1S1? zHZ_Lp{VnIY((N>852A&qV7(AT%Fh7shL7#7i=s0Ce*SXWQCUy;=k0a%zMLA$*Igip zv-!}%G~OXDvrI3gX=wFE*kSxzFFA1 z)AYBVi+oa;6z1eC43sp08i|~kdT<}BsZ1xz`!S?Dw7PvjewS|07$}M=D*r?H5WE7< z3fhL8bQ$~uwK(iBquJgJxEhy(sN))}NL-PjD2j77-bv>YST2Y+fCRqz6m@K{wJxz5 zzkjD%bn@!to z^Ep1`*c}8#r+#;*EF`Z?LYUx0ImvL{l!G;&uGjDtw)2z0&SS%+(e%H*ip0$J$L8!x z*~ncU0po$Hg_{6HK#VY;MK?zBG8YJlp$?PiJlo}MmTz3IkxOW zFyT9I9Q~29J=fFXKc8*g2Sjl1Vjy3{6hw{kju(&-sNwz`2c9%A z8WtRZ<~4A&J%6Rk=iR}c5~b^iGy7HINrNff`}y^k z7yDBX$sx)1T9RskML6xqXmhiRiHeBZNRHSM$Hg83W*pW)z3<^jXKkBSoa~K1q&$v6 zzgYM{A&7Sr;WJ>5jFDrgh5`*%kN*TSj@w;pag8H6q3tTw)Y;A-i`ba3I{!MI=EbRf z^-0=DR*0_O^Zo^KJ%+SLkm4FET{TSfpo4Oi%D{NR)hkXn-jdz zc{1(1=gGJnn|Y;K^h8fRDKK^Q=K`GVKuSe!B_9Y7?Ai z)9S25mW__7=nk5QQl!D$rs zNzs3z5IQv2U;PTm>}wy+yLmNw{QiOR3(!60h9qn5Jrz-!A?BpicA{HLW%ZY%xh?(= z^dGP4K|4sC(!eW_ywVBCHO>;j3;+W_N(tmi2MuCTLB4LK`+nli93zOSI?5MC6030{ z>9Tx$tfJDcq!201VmT`g+bi;0liE(#MaP8RjSnuW2pRk>ExQaNz(uJ?CC}ls)qo3VgkJg zi4~#Q52g2nfY;7~nG&C8TG_BzEq=$*>e*=@+5DB1a=Ge4mayVX+ffVG;K%(`^V~fD zYud63a`L_6E>BZdIGi9=>SkGriJsGr-j`Q@4?ZE`R~{UJrZWxKPdu}6weHi5V48vc z#Ou?J8~quu!{in5<#W{YC8d&-&@dPh#AhZTtmHZRbU|5~G4MNV)8Y8O^a1;_&C#p1 zquZh>B7L<7_p4adYS>Z7l+IMClCYhU(zNQi0F6bN!2RmfF8}UA{}1Nl(eop1B3wL5 zR^qK20O?># zl9CN59zu89ZLfz=%)3hl4H=+abFsK)^3hov}RzUwc*4lPdub zhuT#0O%-KU%xbpC0}P?@cXgD+#l&Z)C^~B6vM%h^TFp0!z2kynQWF8A;CC7KO)eHi z^_eCW{i4(rwk&^d0$Y0D-wzgMQ2y5T^I>zM0e+HH5ENkjN-kw@aa##2%B&te%`}WW zx;Df888S$hUfcecI6tDYQh61p2mz}m#+48|g5nx%`3C$9+KG$QN3Ik!f-?6IN>O#v{{ViMIYOI=#~US$o&;B22T^kW2aG^-zb~!fqcg0PN3kpgPZo=W&vp?@0xJ>IlR#!P zj0w|P>g$egTzvbYH49$}T#v>wA1K5&m}X++MWZBgh8Nk*&7-EDF>r}Wsr1{gevL+o zNi$$Z!96R)zkG#x!X_IR_gzXDs=ZhYwKTWBO{Vs*zd(RtI#m}%9xGU^i59jRql zvw&y1@#jAWP6Hf~=Vre7#&->9e1`xzRgw+KG5bc(ZwQ54&xN1+2cR`+eN=-nsZQ;* zgLOn0x)<6WMV$`-QuGvYV%P_YH-%flDYHd z+;Kk$8!#tOVPGnfj1OImK{&Y>ci5(*q{mFN-@5eSw;M+W;duDwzq~T%S%YRE`b-685vvH zEMNmd;ff$ZC>)GC<7_Q4xKkZCv)_H~8&ae}yaI|11RN|KQYxaBN5DB07qQT6Y8ZWT zzyI?+|HhyE+U==;!?tJx_!tP#L79nK#)gMvAnc)>a>jn3-}nOI_{kSO<5ygW2@I)D zWeL^5b#1bhmJCNb=G-s7xd(S3yf}N-oSAnQy9$hI5S~EPI`M=PPdxif-RW267iZ0$ zf8QfgtV7Mg#PH?M2gg&25iP`g`3-oLVpc*@H1%VjKgjwk8&|HpAj{48Odd$g;b9rHbbJ6KA}U)XpjElp<-c=;0qAv@%=feCGhFWU`BZ_w8)~i z6W^B@vT4i0*>j${C>W}VeBtdOc0BMC0g=ZiDP9QTp_0CBlLQqttbipgg;FuZB_CCs&c=zSpFFf;b04_( z$-myl7eP@vQhZ0Gtg3)J_KC`4Vua(EvQg(vdEv@M#awUX2RLSYuoAqK<`J!e4X^+} zgX@PuczB z_bx1K?*+e}l&a}jEXilg0gqQaK??c^NBz{!x^ewx^MOBKw`|^vMs;|IlP8vxWRVyi z(?f_Yu_DG8i>lsw`gjrZUg34Gyn4qamjjOkX@}!wcubL}X3JXIH`1cYx6~$j^F+O& zzaOHMFI;!g&x8^JM+RzWfWf3D$oZj&@k1cS0Vas1nrNy)F%!zfGd`u-BaEcKJ8@(X zjvxPjpTU6)wlytxB&z~l4H;?7jX3zfO04j}4m@bYN+I!&`iD5Ff9Ug{Hj>tJcg@|jcs&Uqs?ii=gDIg%M$8x065>lsl|x*P zB{c0*!*(Kln?(o+KtCl*op|=JIifE;{q*C1xgA_4cV<$fhLcnT#**U!v=08# zgV3^l`YBFR%ic@On|Ieth_f}_doI}zrFAN{g->mE%^I{bc{43-`~ zp3)mBd<`*(*o-Q4WiMcjCF$Lkk57jdRM{<@Ax4y z5*ZbV()r1W+n4Tq?$+6Ese~h{VvA1@Knz>(jPg8aQvxibDd+x^IHYs+`ip+nvt^Hg z(-zn`Rxc3?^VpZ0-B>9Jv{E;AT*q-EjHg`t-#-fqk&5iTt?X3d5D6h3eS#zh@T6iY zj{ER5#a8={zxCI@+w$rf5POFYem5vshZ_+sAVUSo_9auG3eHZPmT2vt>gBucmEZn8 z4ycanpgkdgQ}`t!U>nsP?~0ySh^2V?KYohJ!?J__^grL*vGz5%L|SeKPH(b|Vo;_B zqRd18C`Ni`y3!kMcyUc%Y80QXjdY475Hn(yi0K0Rhk&*1{b#Y^3sS9JwBngN9`(wu z5OQ0m+M=11blW)fU;nM|fM@P{eC>LrM#dJ z(p;?dP^%;-_;yQ5(rKQ$ukeFrUGdFtVqdnZ6xIQYLHULNeM^1;$tHYI%oWuDu?S(2 zSw_oQW9MBmuk7YQ!>Azf;a6e_k-*GKB*R4uAS9kp9{+(;vYo^Bpk6rVsR#aa4Kzqf zZU;LIMwqXKYUGdxl3x^L;55;w>8CkOZ3Cxl-?-_XMDANc-n|MTlY8Ck48SU%S7pSbPrrE{N^V$C8Aw%nxSBomeD zqR)pS#+4`tp<$Wf8cES`q_hA12Y=_&epo81%UF&m+T$j^|b$y5*WzUwBSY%wtYIUQdoH)3X+`^~kJUjC-1zF%`K)7W= zLlFt03MiYBbnOOg*D1QCGDXwI4c`8}mtD7Y#adags{Sv_iJIbxdagPs3&BUwFzKlJ z@x#V|@4o!1ZOb<5I1TI@!UBotn8b*8Z{$JcL?y&3n{>{3Xm2*+Ef@c0$J$L$G2k>1 zZ9{AXawR27efk3qLrz$orw)rbUVd)g)j$6>+_EMm6b8|xBw)czssDVzf2A7U;zf-P zj-8udyY&~B;SeeT4ie(X20m?gZ-+#6y{}$D1;SB`SurA&F{hlJYChmv3ybH@n|s>> z+?~@5unnE06=LxvPxx*uVA{aIRj}+~HNp%DgqrR3jVCoMxaEcQFD;M#kgt`39SGWh zpYUg-7e$>nV4|(PZR%hYyLr{xyMOmb7AYpq@M%Xh4S{mi=JJkZK`F-&iJo@u{^KcI zR<3{Qnwd0IszZ1Qo)<}UQGuYU2+<)ozBJBG8QVCe{|3v2;vX*fFC0pI;6~ykK*pLt zy-4kb3sKW&T1*r&_5&ZIa=)f5dw$_#f4LQmsY&XAa6p&{v=ZwjLCr@}F~E6GEOwqW zqjB7@)cQhi&!zwQWf}2R*Q$N;&6bprtbpkemIQ=R5a7nMS{Gcupjhe-0w0(eaC9gc z2_m()rDnFrj7UuxO)~}up7Oi%%V)p3ef1WvT=Xh@t)3wEAWl&&dB*u4ZkfPuGrynj&6l(ErZPHfO8LO`Wb3$!>OJ%ZjNCCX|l zR!n3zwWh}IJ1OS5S+kzL>mjgX5NyDGai)m*j!RXU4-f?s;PKQ1ITZK=SJ64D*>}U2 zW-j29J3>(s4XrANi1&dNV>$1Wf{XHIQ{6G=?3*cd>u)bvw|IGVIn*}3IvGh2&?7C! z!y&DLfXb_M%7_1vuk*MUbMCos(W7&LO4_t3ApyxtGDffl0$GZsN=$vEk|`fKb07jf;HB}BChZa9?k zKF<4MdHiXoW=D;@q{lv(bq0W?W|MzCqZMXXo61!xgzb z-Hd5KIIKkK6JPvl+qnMD>SnUnA`Z^^1 z5Zbm-U4A2n)Iv<*_VKjy|NTHkRZ8U>esr-=0#28#E_uQ;jTqJlW_)#L5uRzKIvbfM z2_quLh>bme5?I^^esa58DvA-|lOwPL5g1R?g9hj6pFUQE_UZ5Mn+w{92d=tt^DC=? zt%C5Fe89^BCyMnvGV@p~gYZxd%(@W|@;ONuX0EA_@Q&mtt6PgTLJZ|FE_a4(n} ze|l;6mhB1{Q`*QEPa_VMF?jAO;Q&p6H{y&>{a-YE1^tD8d+L$vZ-h|K;VWIX8d4Tm zm!1}?6R^3L0)m!4x$c=i%`TODgiv6D3T^<7iQ|~sV5!T%P9!6CMz^IVOmXx1?#(-1 zTfQT=HSoO(Pz~2Dx^BJ_6oS|lDL&(~A8()Bud4T6`j_0cZW<{XN&poAfhU6Gzj!q{l+$Befp7m@4V_aaS+$(qZ`f1X|0o|mh;i#Zg8A(s$$e3 z-KKWiXrpDAB72p}wcr0)RE(?f3EzVno{L5ke1XyGc#0@{e4Y^yM?S|@41L`GiLp!X ze|5u4%L1=IV@V|mED~as`Ko$y&I5BQl&7BmY1JB*a$6~tF8T78`i2qtpf(VCmaLkl z93Sdcfq_M-QJu}l%osRj&$b=6{_=OoC4JjBR;ysCCwu-aYGl8~Bpn!<=;3)n`Xn)(_dDvUn!G}Z1OH{Y;q(vb)o}0Y?DgSTN_Y8-Md-Sv2aj(GA8#_*JLx!?AR8$kt$eFc`#U*Mj}r|ED+trYADp=ohYc%VjlzgBskw8It99?%@z6CFI|;*1BqyKt2{ZNPXZ@9Og?v|cu4_*e`c5VT zjbo*UO^Cnir#F4}dw%t^cRmi!ND{Q_ zOmDu&4M~8jD`2BSwTQ@M?AhlJ%x>MXa{VJ$|5fyz0fPV|rGV5D&*tefzLN)s0IvM+3(LC; zdUZED5LAWONI)P70&rHnQcb%Pn~s_0v<@bhT=AdZMIO?`q%Ac;Xbvs`$pwf9z?Vd< z7~oRd)Ds)VPT8mF{(9-JH@~_TSXxqQv886-g{d*c25m%$;3yJ7QIHwUyXlc~xfhrj z2s6+AAx_LkG0H#-m{}cPXChzK(iMt%R4QQ4^?k4Gx`ncrhseZ_%56uDn|ju1iA=u? zY+t|S!QbCPL#7~G=T9vS0uO5ScPXP;)Kjqq%4n-hR*j>M6Dje_!K_OkEcEWd0X!|I z%4}>w$@4iNZ@lqEt(w^*1x?4ESl2O_FnHh9m-xkPu5R{9BAN=db zyix_&cD*q^tB(U4%di?_k63vn?V4H9Oh``KXtinb&=a3~=*gEJn=eJxY;nF+0pEc| zB3iZkIe;LF&!X1?rpG|6fn{S$Z~IWoT*(BNL{noYIvxE99IF<*^60fU zSG!bsy0_x>$vCPekDY#Qy7gd7 z1RY)+0fb}KOACMh!>^-INb8+Er%4~{$c?642VTJofN*e^fUTUG_KiAGvxwO`POX1q zS-WnjJoBm>3p;a6Mv9I`Pd#q(`%fKuz;!?Q@$U88d9S8k2~%NM~2@7+ZY_c*f`*v zz3XhR*I|=4CuvvGYFBAAc{rN3{8uYB#D7YZA-klwYEKx9n7q|@hQi! zVTO@VQ05|Jp`KMr`zbD)x40CRQlNEVv4C0qg!f$%scW6`ikqK)Zv8!vi&#_XC^Uu2 zMg>OmRB$g{AZ568(PoM;wP4PrSc;L=#UEY7N!B8VmXqHvXk{Nf zqoCjSi(8y5vD<(jkqUB11hxTRxlkW53!DRlFKG3c#Y->y5GR(+`+N58yZMJd2G!s5 zb!^r6dbk$Nn=nm6&xe_q4^X_sww?XKG2@awFK=D@`#WfxRcTL&XGz2tHs~1)sd+3E zDc)UjakbT9I+?usYu^x1Ak5c?J&zk89H8ovz-S8G9Ai6d?dgr#k>sPlyS124Gg#2L znvm20k{lsg2pgPd(8tM$Vv!ez2j{XlU(kzY#x!#VNqmrRTQYai=_kkPCU{uf@#AYo zdWMO26={4DNDvywrQG8lj1HSYN?wjQTAT;M!3k3MWOCxpKX)D4wZE9l(heh{0JJ2? zUQWxC)I6`h@mWo0No*2o_PHM(iwCo7!%I)y`TN>LC>T_hf8Yu&HeGbf$+-LaUp;lt zZP>vPkV^qzQO(5G0dXwwr&=>q$A#iju&!QhA9sQqIM~1DH+N#-%5DHUJlQ~GG>(y2 znlJgMP%O|jlZ3}m5zR6V#fBHvhh_!t{N@eWT#|NZnTbF@35s>V0Ei{KnuAW_F#5c6 zE>R=Zk+QD&k8c(R^BO~32Z*Tz8*p8Rj}rTLnA(BU@TxHL%!|fEQ)W2z=kNa(S+qn2 zVMr=4B!Nvz23(5}4sTVdcJA!frQ>(Bd(-B7$bL#7Oj71HYeKC+?B$^|WP#)%*`j%z zn7^QIUU@~tGR$9o^=ody1!)_D1jF)!P4NIK_JpXG#ci?;Oe@Ks;?xEvqM5X=;ENaIZO_eR59c#5k}D@IUbc-8j?FR1DlOpZpbJWhyx)d(iDd=CNmS+ zezHjXN|miY@hna*kA(iN!;f5j8;B2)jL$eo5S|Gz6zvKm$RHak%3&;OY_O>*GIxA4 z`;lvJ@7lbbwi%fTmn06uh>Tp6;sv$FDJ3q6EjW`?j+Joic=@FVe}8>leIOK;7oBlo z)7;nXZS?d#_iTTDgCa#WMdoD2ovM-KGd|ErsLSC$bduTj~H;=q%l1lP4} z%5t!7(FKPE4cPJs2eI6tA+0rK_Z9 zS@>>v;H5p!Zz9VfSdrj(;p z5Qke@V=0Mj&pSHFe=EVm&0~pdX2;svW}Y;z7C(8{ozLHQKXIw>5_+jzt;7W|sQyY8 zt|f$AF~C4)h|Mo=d+FKYJwN+>W^jmhIE9Xo00wX`h!bLYE)3cmXoqH?zHY{<>ZD&! z-F5fIN1ld83wgURWY%XywFZkJ;%!bboXdzaE}4<(Pu=uCKPlu#SS$vGx~McG1X?&N z3lUQQG3_ndW11=&PA+eyvsPXoDj2C?BGk5MPRG)PyjUFqeA{y`ulw_(ltqh_LW0M@ z4YEO&7D-~ZH!v7!xgZ3cK!lYw*&B>?$?e&J&3ZOJWa@e3Ff5h?AeCGeDKL$_?#2fO zAO?ZpBdxKac466(A)n6N`tu*rs2C2*GZrjfbmoU%=b)i7BgyZ4;Uhp#8O+4gHmJA9 zqEv=PfjTqX$VX}wH7G|Gt!BJM`}E=Li+_41H=LqO3T9{$=#LG7Rs*t;1YvY-+cjvx zpk-6gFo_z#v$n&{xVYWYjX(X*uM0ppTpk#9$@P@cvOKZ+Dk2e1VHTWU9b4?xb?Y9x z@mA0ZLR=ll;Szfw{x5+n7c7b)n84{!V{>eN*|Y*QhPBr{Fx+*RwRvESP(4B&C>o?6 z31X&@RV9jb=U;Gt5s1#?y@lY!%ObqGOnpk|4)8t3;_x$9>?8p#fb5J;0bm2iW zQCOaa0djoZ_?0J~c>MO;6Lo4hF3(+gM*H&Wm7#YO-UWn%@YrV^o{ZDR`-3$d~nR_BYIuRQQ{J~IMSCPxWg3|5sx z0?lD1Q4BWVaDtaLE;w@;AFhstJSF;jdhYn;uaRSfVnV#W_M9vJ_1IgrgcsL5w(kB% zf^uCzj;V@3v$SDag+jqFb&PEqrg~N)x$9_^qa;u_X@@0o>oLb70km5$VHHUaYa?Q! z?@B2U@x&fYFdG*wtDiH4eU_dt-1mz=nj@BgRUjNNNf4tsMxwm{xHh&ew`k&mN#$(d z9K3@$)PBmG*{g|z<-r}hZ~5_0pc=#nPiP5=4Jsd})f^uxh#^}FGNLBcpI&x0+5ddk z_9r$JvMFr3Kz~W#7FOdBZ@VTR&5I#ZinvOc54E*vGfDVVOSd-Owc+sI17<;I9iD_` zq=O`I1uc*~za;o$h8Wz*1xhq9>&|=s1!{DB@BjBd`flgutuPJO$g^Tn8&r%(BGIr( z^-MX8B#n#BUnJEMWy?04^|!9;-Mzbz9ic2N(i(}B!)iP*yqcU4)rBC4SR9+PDAGE? zT(pqQ-SD5^r%l$&^+QZjV3OlyO!7R35Rg1fb8<^G$I{(xECaKlY|BeMaHmv{6cfN)l3Py2QY6yyTUJ5r^khn-A z8>>?_&?!V!jMt?P+efyibD1HtSVVSd%_azQt;iDHx}0N{E@GYpCgwGlkr>2sLQS;s z)F#WYuKw3==5tBb1>%^9O061SBgITHrbEACWjEN^(6IQ7s=EE|Kfj$H$SHIfczJ0d zkf$YA%rI(R2pdwEk^-bR%87T7ybmdrV?%Ct}DQj;1)4B&Agjz*O zj>ef#F=zq83*{W}PbGptV1_$7)Mm29Z{@9*ZhxtF->zJG*tHzcaL5KO7xCgfsvuxN zX?(rixOdC2O}lPOh{xyf~W3df#k0jBeoi4WKF0!aWx}~*u_ITlKY-Lm>NEmP9G^0QkH2j zUiJZU7A-0UXpE2!smbLOYsW#wqwK(zw|la zJ&{05I8Y-8_?q^{XlsI#1sB@MbqkqXek7afO{Tiij4qOB%18xK&X6A#C@k4Yae*Qj z7A_DIeI-MJ5Cm+sR-1eFWtG~rQk&x2w!M4U^eirOM%GH4V=?) z&cIm`7EW;6SIt{;Zdozi{M<9Q|LSKPB|;yFOS8ga6Nuo_q(YXgLad;QiBnHD(uMw4 zhkLg6k0g6@*&)ZYI4sLd5C{j4BnnYnC@+L8HHwrFADTTYFk?n>IJzyEW`1@ZD3Bt6c%z=Aan}JMM|*cSa|-q6VfLC;GaG<(l-Pho=|*gCh>(~B}yc= z!$5|hmr4O4aq4L_$2z9dxu&;oPxsL9fpqGKW$3`(Nb(erq-;Q`F#`1t)J@Xpngu6| zkqMf>+MDm}d}*hE1KuuP4TyM_<~hxP+Yy6^5gCf*>sHT`yogNq{_Z!=Ja{{D;m#9r zr5!{;P^?!qQH?v$r9tVBE}bpazP7z&^6=2pH$AGSb4D>|6bg=Q^GH^>i03Y$L7m^w zV5C5GaRil?6oKb?Z1Z-3vvtlii>_k=okb)>Y8Fc*SpM-fz8qmhm90PR44UI?)7<>v z+P;6#6O%wzzd3;DhX<&P6@?SQB<%k z8yO*&%@y)V$FxiFf=Ro9vcZU+xhP4(La{|G7Px@LsTlMrO!KwNX9b&yoV@BA|9+@* zCxeBcP#2fHhZsd#gC)l(F+kVMTN$s>NoQRWKkqhHl;9#M;KvGcOnrxNH8I{Y3a(^_HlEEt?Sl3 z@VgsCDi{$O!a{SIJ$Nqh%&3Wd!{TMN9pk55|AYVDw`mg`StEDU$TLZJTt;;{5l2@zJoA)jQW58R{JzN_LGT4;70k$_33#fia>IKm3TS@oMb#b>o4az6XAD zlU~fTyvd2y2R{Afnx^Rj6224g?jRggX^Zh*vc;(I(TLm>mKsal4mbyffey;6OaiS0 zYuR9ohtY@_kixY}qFoMG2SrH_4j*{6vu8^WHnC${FiI^aQ*=`G9WCd5^6#q-?%B8Z zhHw85bo7$bmr5=wLziWOS)}ACp(w?IOJ8T`h$rs3_1+tPjcp8yQ6exqDzyNK;bd2? zEe7i;EyhDPjht{gjG?L%AG!JWn;%{mmuErehEd8hvbR@S1ja9k2DIf=0TMGS!bdQ@Jq=rWh43G5c#S{p1ke(jr z2oQfu&gHbC6n4n?Q3a(TLGx1XV4;{{^C@N|-8-B*m^X)qhk9YArYTOORgnWVT8z&` zi8d)xt0+Msbi(^$crvvoL-H5UFb6|-;b;UD0iKCzIfmsFOsAmZJgugMkP%4m zi#~XX7^voyJv$C=eRQLhwm}rKuE4nx+%=7O8Znr1Y|65+Vc@*sW{Wsu;-br1OV2%Z z(dpxR#@k+6_uKD%ou`$E*i@r*M5P%4KFZ6q5VU}B$U%}66d}PhxO_@Tjid&W`_t*e zrcq=lo}^qMiGNj~cdYCX0T(6(iK@gY!Caq}OLCc!Y&v_SkWVQw)#$h2V7OW0oPubF zFKO6063J9_Tb7@gXrEyD^v%D&I5(Ukb7}zQyji6+MZ}v-K$pU{5@sdP$~tCHh|hLq zQ~mVFP--j)fh%a2t2gmp3dvn@A&`V8W zqHsKmM4Go)Rfk^62N5kYyr#9DSzag4rc(d&xy#L>&LJ@-x5kvVh}0YqYk~<%t3yhJ z4m8KYCsbRcR-tcC@AkD@t%9ZJv$@=m6yXo<+D^H&!~{XMkemr@5Zd#&2cv~8=tvC1 zlcjQ2ASQ$)B87vA*M^OW_l9G0WNpa{j(I$dFNc6|aN4X^jHn}fI+Fu~nOribkErqR z`Jejo^tb<-*u3tkJAZQ}hI+99fmMm&Gp9(rCW{eOiHg9a5NBIPv6wcD0_`v`YeGMS zMuS-sPA`SuFuf!!h!75w3t(Cx6tw+X~680mY#Ae`7 zJqMknX5mRv_*hXyG(}uB!iown#bOkzB=;55 zeYluU1M#J8M7tpOSi&}->7{hpwpto9O_C0^sW1veoZh>NQ9m|)Ve(AA#E&K)X zt|1(N+pqb_a}VDOYNNu3;L)l)SppSVl|cf`sR-0h(N^O)Si_Pm0}?~g*m7*d$(Z3e zDF}l-Gnmc|=3R@$4(B=)C%87?xv2nqh%}!GO=}$%38&?Tw{) z5FDkr1wcwbUzfv34skLN174zBv6$m>DLgpRIgs3!&K~v>7l{%V4sbBALp&?80v1D# z0%9&e($vvNa4~PeESO_5xd9Z`=bSn3#_xVNn;xPZ3<3xQH}P6j_=XNS(Gm#8 zrJOu8^!y*!7W<1l2}iAgN=@uGXb#a7(ac<3cd~|^(d|6Y4x2Kih&}t1c})vW0NEr4 zG(DFqq;o^v$$`Ct*}g1gQ?$hZMMDnFVrY4q@+6y085X6JbM<4%~Q$>c%oR3w@PN@P)i zG;zcrc9CfLWuM?Bxw39Q{Ff{GIy(hgtyMeXo@3JiKFNGLEVZ8L^cF`fxTmIC!Wjl?5AdvM@ju8c36$I5Y(V%V1Zvj~V{m5Tzo zgmX(CUM^j9_zZ9kMm4;tnvJx#H7uT8DnB(m^sUcaO0sQYHY&Hk53t5qBVW@hg=^%* zqE&Kj*{N;#U~>JRpU#X77W10KQhGlJ?;fatO0h8Ky%>p zo`*l_jnS6oIcJ<(*-+Pf=W9D&UJoi(joMzL%mRYw8L{y+Z}S014k0NZ2(rMig6nd6 zk;$g>C5{A*hGEIkA_twChCatjL8OKmNngS zqef;e=3^5~Ngn>~pSm{f5Rn$(Y6E7tpofag*OD2L}iiA~1{HHG@R z_N0f0K;DrAa$H2=V$fV91(XN`jA*EW1e23sT3jxl8_ph_aa!|+CmuVvXD0|6P+8!X z1450&k(q$yI5PjKG$*oTn~<>0FOUfE+CrbRr>)4G+aol$q$7r%0x{ez-@ z^3~6d^bd#C`Z@Dgt^B}QH8aZFYL4aPhI0pA*}wm#-L7F%Ktw5lLlVrsAWvZe2EqXp z6q>PUXP`ZG7|C{lB4%bpn+!%oNflXEbZo&f1j-RWKf@Nx+8|&-nh|Fdm`%JDb$D-E z*syTX+fT`3&Rlr<$tPbhbyB+TefjSOdb&XY1brQ}c1Sq`uVH=kKn3=KeophYCyeP&W{!3JDk^ zGK|1N{WK)13_NL0;4#G;CRcQGi!Yn6MgkAsc*C;~-h~|(l>UG~v^QA@C)$*n22G2F zYZola4i*l*ni}fqBQ8`XBEfd)An20Nb1-d`@?wB0&q~CXvg3W{3hIQwR(D_jt0(Wh z71|nlbx5j*7E^_&ss>`se7IJW0#G+K&^SX3#pO^WpGuK^v~)f*kU6;dAR*iwu}rcZ zLrI7yUUn+Ovd=$q{~cHV6qI0*)nIA|W#%{rBZ9$5>CkNoW=glRP(E@&v;r#-iB$?C z1M`5%o6N`9cChhA8lMl4{7r}lsiqgLTux8wPX7GQd_EYPItTjkLC+WVZrs|nZD(d= zq>#y2hOGnw(L|l3DsxXCX&oq2sg}9;`Lfhdt3eTm4#$_Xz$SB?b&Q*FqP`d zWcst&LEXqA(kTKm7xdzp1_fZ}ydnok`b^-yFfjF^nb${5BWK$tMIHf7c}w6hHh~c$ zxgdlspv$vQIkoA8@t7hTo_g~B>wd!m$p@jw*OJ9Hnx_zQC=BF~P|H!R3fWi=x>PV(437AS4Is-|p#c=S9V2p4Q!wDSFHq&7Y%jr0;E#5-xf$smq zZy&$&ChQ{U#+q1jjNLdrkm}s9&#{3$nV?S=jFFm_+DpIiMfRO-x-o`#8R4M3P%}^5 zckAPK-3;TKV`U;k841QS{BS^c84_V^_y+oh`b<^ z34?WYH#=i>OZ&>X`?qer_S;_vK>#EJsstkePK488`U5h@a4gM&qJTUZ=^L0F$?6LF>DE5uPJu8nk00xI4ql z6|GF6m^$I)WoLc(!^hX2CG>Xgx$0a029*!0b)i6gC|uXn-hx~{b6AH-+R_c%(1G6& zsfb~YfX+b!s{o+{+!VNiMHLM@r&}4~ie?osg;|ytI0b~7BxP7sw)8Ggz-{Z=ADYY5U?u(};tYo_yryE58TRCvdy4+z1U0jYj$~ z%QHOB3LGo&pdm-w!t>5t0Cxqa{O*6hx&5W*K_G%g4$o8(qJ$JeB{_+hFNweoSx_E< zjEXhfDSvy`gV+3_bL%#^Sy18$!6FZj+^kKRv}mYN`os@jG;>LH;)cP)z2E)P$6(H5 zDL$+;5)(o`3QYk+jDgO_@^DjLKVpIHbCR&&g9}25vZ2E*SN?FrGiw-%CF^8DEFi@d zF&ayRf)R~DvRROIy->)d9K-Zth6aIfK*fOFVSxm|posg1L5sE$kIgx2ia_!&KJoA^ zzxuvoS}^gbA_+w=3n57eMiN4(281=wu(WN%4C5L)whZL;G=`K;7GR8dn?Q>r3m+5=jqB%tc+MU^7{p zOF2T?CFzHp$c*OsXH|PAt-b5!dvE+T45ENo6O!wLQmrD#fR%=$8ZXM2l7QUXCRZpV zM>2;4_0qi6i?936e>s)~O-eKF?@H3 z^^8MEHnOEK6^M!FedcqOfyJ)--nY7TYy%AhbW0GDEZG}n$o3Fr*~pYajusOy{PMr? zqEvYcnUUo8zVf%lY@VUGh};yE>Y(QU`v(E*JthtY3eB;Mh)CiuhFN&t;`%w|#T!Jq zuRQtCAAj{D%Xl5#*tQU;HiktafEjjn;c2T*JnuY)skSY9$Ku^bI7%=LeaD9NufF)) z-c6ev(;-^B$2J&RfZrbB;27_R_6SEQZW4@AOmtm?*SOXN?X#CHjwY%zA6DXyYkslm z*~g(XdG=7m(i*z2*9#p7S%|YQ{Pd?!Sb6-JlVHf*_xr10jEY=9<)ft;Ivfo)&IIWk zshKrfjwf=%#(@oe!@Y+Jxe?1WD3>A{Iou9|iSe1nth(g%cvIbumtM+eGayR?;Yhrp zzNWFP+24EPRZragC#by4hrA&gf{_W-0cH%K;G7_Gq6jnTii=m*w3M3yB=6lf{DP*~ z@+ksYMuI^D(%HK%j2sH8Fk{i2lP`Wh%sZ8Llo=Vm@20C?SaUy+Ga?K4ASf;{Pb*3w z7*!TyN}c~P8}cYb)jqL)|-C*zd$lHxkgiKRVgO& z8quDC3s|NNKc?w87Fpl+vTI<<#=t&+MbN~|Q_%Q%r!JkbVD8RWUf#2LV}ExqS;*yN zfm2D-kv_nXoob*Nr9};pvT&XkT9GJH$X27lIV%>=Te(7ugkQV56!r6Oe6e%qt3aJq zF$R4AC>jtBn8SeEu{;-Us9k>EY4x+lIdL{Ma^ugwwP(u)5N%$c36fnHP9hJ-KA z>Y+@Qte|4h6NoT{hX_4^1}%;y#6HwebH+!`9ZQBs5kCdIW!*E6-g;9$nJrBT&<#{6 zB1>V8l|cF%dfw8B|CB^)BoqO#c_f1liqs5A%&X*)7ofd)*{ZsZsW-ES4j;PrrmMC* z{}kCSm@IInr({g}pTZub&)u<0FPHEy&qaQH;o! ze*UwO+BYG6*I@7ABb|qgOd%M7HVnktnmJ+WRr=K6;I&`>Z{jmT@;j1n=41heRZ0J4;N z;8pD>wa;2YmKI)qa?NeO{t}1Bpf_gawe6pqCO=7akLW0S5z54r`}fetuos_$XH0Losu6I-_rS z`ME>;_tS6?5^Y-~CRsGmGiX6LFw$JzjU63sP&aeY`qh-YmYcP1DXDum1K2|DH(>ftZ5{p2%f68c-9pbSUnMr0Te+45lP^j*iRHSyDo+?F?qYqy0c{Qy+gp>&ckP2$R zqTD0W3YD)sKBX{!v_#@_*lsTsbhdTdf8*D6$Uh+z2l^p*U(zYCV|T_C*3%|;{r)u{ zmUxh-Q)BvW)BO8f2KRfF@ADU^S~f7|PxM3CUz6r6&3J!!PZi(QX`0e&%{lkZVd8^A z9PJ;cwce{uXUoFTUXfeW!PsCjDrL4#8n=J#7IplbEoRpp7#pS8XR z@u`(SF4u~223m(h8qU}H6!=1$6xx%lPgI;!vlRY2qa*!%vHN)qVS~~42g`V8QX^Mu zjXck50qi=q+?W!+2jj~95x&HH+;qe;pHi=qI$!hhR8GYwd)g|y?B5qE@+qo~P=jc$ zV>7|>KF?34*F4TCWy8z3Ra$FQ@x1ll-_aX~%oY@gJ?1df$_OESjMqWFz@2%-i4%&B zpwh;kGoVS}adP-2@A%bWc|h&*+A&Pfz3raQ{^YKW-P)f{(wn2DpVL)f+m)#&eqGs0 zy^)Agu&;cBS#+}4P}xm>e)?{r>e*X(sAi2DE3ax3g z=1+|i74FUT&3t^68fI{^Z>+geYZw!G##~B%v?vYNs@+T}R8b~x%g-;+&+fKe_eC%+ zr|3b1C`u^u;Pen5Zy72m2(Zv{c(oKqR#98|><96`pO36v!d@+smAQv^2apra&``kq z;-pTZ;kwy_v1vxdv9=0y-%CBsF+|}p%JJhrndvH7+tGg560$sR|H=gyi6m!vcj}2p zO!gzcIaBd!d(y{v`gpdeJ*W?c+qUfh#Ov|!MFSLnB{iE_56PfhUSo59y)QM%;gxDU zu{a-fV%jjKQ&XRFmT~@*iR=vr7KDwUL+}-wA-q5J(8@c%`&N51DXN_3)LlbHWe0ThgklmDCuNS`8GU=QsYy5Pr znvXdSyp-tM6k!fwvGw>kg2x=o33{vx%zbC;a-)@esjvi`D9N<2PWzjaFvICuON9eS zl{bkU@dp-CWZ!p60Bnd6ZMK;O2Y$rDe24QlP=u9*(L-TW$1~S#z_2#gZfdk?gBT|3 zuk6BL|L^EKQAVuAjU`8Bndi0?qR=qcDG2h2Dzo+Cx9YOf@NUgA9rDWc*_cROB3doq zw~$U(VsUW5S_y}#STZofSSENZzO+%P2TyN$nN>F-lK`r!-~$74TwgNv-WyGYOhcOq zzr--d;e}1gE2b*esgLP@Orf^G?0iqYUt}8I&Ux$Gqv}`}@)EoCj6EcyMGwNKh5-k* zs0*z#e)en9XXw- z4!}+ISH3>jDnO}{EYITx2KQ?n9+FbT# z%yAeQE{Zkf5rd93HDh$D+r!o$@glmYdarE6h?3U3cIVI6+k&5=0ew!=KMsV+5a)vv zsxiaG(8i+>nOB>er0f4&Ufp-k-DP=SjS?e?4kU((_ojHj+19DcdYEt6(`i|0Ik^jg zb{6SQDtbIj8Eic7ho38-t$kx)2A55zU#m_wbcKEvR0f2li&7zq?9EV}4?m}fmP z=E|*UAc_;9{irhyNrG8(Dd&VLL8a4d^`tZJRsVtSdMpq>yE+uSzEXqE0zO`D?~eQF zQl2h18y6SxXTwelvtUPvYHCg^V_K(WdL6%6Rw7^LeSDdSZB|06=9}KDxUheXlvnjO zl*A#B>RB1Xj@9(`1k%dV63ZPJt*CJ=E=)=KnCDhjC(DowhqsKq3{SrRQ+KhVvL5Xhz{t_+(nSgHtGCvsl{q`p7 zs|GWn=t)}d9pW}nTSc&EtGwVe|JQQU%PGaW);;u}*5cm?UFr< zOT3R-2>wK@4S68GKg$siob!H3#4(h_U1qgL`vuE<(JnP0F&!_n-h83fHF;|+Ooftd zNQH}WgaQf;Ewmb8Tl=z#J+boYW_p<}=Us0&JkvFV_s8|)@Cm@@`RIxUTz_~gvwau% zavl`J#u|dN+FKJyUII>Hxl*ozE@&ub5;t7-e$fU03zPUrKMhHGc@E^nwnY4hy`BrHl| zm-=T#Sg5#!7rROcL&m^W)IxW{a`(u8al;+dSfu+)AutfQ_2mn0zWJ#*=~>-CAq_d2 zbp`*QIJq|{+e6+UQ-anTIki{cqW$6(@OqMIfK`T8)6O+@DU!#|APmeso*?E&`v7QS zdOrGL=*u<3ma(W7FN(x13e)OUo4lbacdPxS%j5mO}=S06eDUe2F3& zE{`|<7eh)u9bW)}EiujPV^5dowfy2nwlmlj0YUWJ_!D&<05;KWnaMJo~BHNwOJ&ENjZZ~@ZVp^bCtcd?^|F?qlHLgY9+A1|-Sw>;h-T|(Np$V4N`NZ(Bv z0OIw-InCw40klOOF<0P$j-BoA3D22!P9c5%q5eFy`hke)qpQR1%*x$DwD7AF@BOA6 zZ#oy2Pn7}YzmeD7*By}8^28NnN~XaZK9P}!3)H?DrMNSG%w}0-6Q@z=<$yf`qK55n zdiIuoMASxl&D)j5%d5=)6Q@P&yydKvKz}u=lsQ*2f_%OoXHLC??H%Gm$#N*#`(d2=h`=b{{mff(i&(X8197&p_jmE?2c~qL>D@hzS zy7-hdX8as|tNC%XVcb^xl1gt+>%zg{eTqX8Jz4@g5r0L@1FUE7c3(&gI}HD061DsN zxpJVou=(e*sJrnqQ}1)|;G77O0l)R5PHWx)Pw0B%Me=1Q{o}s}>Dtq>tI}6vG1~6E zBgX&}zBk1w_#l$?^?(kq=reg;Oez6%VT~`w1%)*VnN%As$OKhz{{uz=`>mnLuB#Sl zCX8Pvy%qt5bLNs!G(jA)kiq(?B7H;Ljd0<$QM4hXbF6?tZQ${>v1u0BpYU2_0-v-0 z!59nrO$&F`^T2}BWSOFL{B9`#%{9TOuNT`jSRxXP<_GR2Zr!=Rl3E2=X^w1C=J$NzkQc*g%^ zrVX^#D9On&paVr1SS!uywQ_wx)?-A^KXmx;!;qLJz(0rl3$mW=`;XKV09EIy2}H$T z5!UgfF@n2YC{_ zC*Oc+yk1o2jYX*B9l(QMbIL5Lqif%GkZ!AkUd{1zR1r0gB5@Rlw!`ySy(GEx(coib z=VqeZz+8Vo`$;1Gcm2}Z8C{XV3*&ZCjD!-J!eje9wZ2^p>{p;7YjIeUwu0Xke9Qu* zT(L|Gr`SdI&Ph!n4)sLeqwjZg90K9FKv~YG2+=%>SoXOk3BwHc_Q3F14mRvTcpTnB z15$+qA&96<6-F8ml1RKP!E*p;aO-!{oVpIxd8nXa5-xqg3#LjZ9<4(!Z!~#@5XQBU zHaL;C+b%{xr#6mALddOpTGEKH;eIqG!<#`pqa?j3=;ATNwf-~4mz--bxqKNa)0vZD z0@){vdfvffRU9;IwdkN}*)y*_SsavPsw_bTl`fE&LrZq)VrY+UQ=j2tF-Ma-%O^7= zAu_Qlb}K-xA`vSjoi(L&XPvg;q-$8hR$;CH$BZj#Z|E(`}hbHi5#Tlxud4 zbd0d5-7OP~Xvj80-@Ar012Y~ho z1}hC?;MeT*Io+#By9bgv?l%$yg;X!AKilbfZ@Z6!H)OiDy0F`@Zc~msn^|EJ7|(>7 zm<4}L>x5gRC17SdOOh)xN1DEUq|trz^jx63Ginu18NNcePG)A6T`Re!(bmYCPRSI% zzy1_o{70Bvp%pUydyHx#4mU!S5(UdPc)eN^qm3^}%kWmWSixNY=O^a3)UU7MIM%_8 zA}}!v1uug+1!4I{=?hbNivVj9SJ6ljxIEJs{(>-)FHuN{d-60d%6t>k0<0s`l4HII z4%ZvGu8R@+e0IKSQTJC(mQvEdeU<~9f@e}%GqG}PYRD8u5MI55?d&g`hc3zESAouDf#(#Qdo8!O?N)@2J(6;S*YL}O{ zXaLS&pnHPy;q%h}p8SCXe_59O-`E%90;slLIk5r=B23MwT?&V9R<#)# zK~6d9i;f+L7W(po0WcmGiN3c7OHx{no~v=L&J}KmDcZ`08OK{`eQm+Q4_m>MK0yr9@kXduN7Yi8D$aN+|n*3aG9I) z21dKK-`I2v``cpQww+W>j{C0qFG|bXix+=y+xj(^FezldEnQzM9y4cNg>=E+Bl*d3 zZ0NST1wx?i%GXI2tEh)1zR&&|B}&6#ZKv|#9yak6Koa6KyeLC#A8C8XI4HoV9jWWV zr$>mT)|{0Y*M-6!$=wdm4AKlLxNoL48ZJgf63SHAEnXBY*ndjCOX>SjX65fYDi)Kb zVPLVQYd;q0HTJo_7t?9(<2O}8`cCw+it0*bw3fMQ+FFcOfNCPL?>AN0>9Boq*q=D2 z?x#Xk)ri!~{X1bYL3Q-+qN%T+R4si6?XHEE&mKl9%KoIb%uR2j&!%`yqCdG@_qa1| zOq4JZQtpRqiI8{+%Q@p7dH35ZmeaD_81bQG6|!(xzN0My4G5VmF(`uUAu_~tz3TM` z$RJiTLnk>^!dbxmuvhL_oX?(&lkDxyQsc@!nH;tTcD6I33nI4Ni!)Jdh*=7RQMFgU zMPmm%mn$O^m@gdYeutkmhN^>c!Pb$JpwN~bMa@>S>D*j#;OBofAeC#zTkAqaw#qlW zDcM5kZ7rw4S@I1R3e1yc!pZo3C!#x@Cz@vb(G6B;VOr1dz7zwq&=3@fTd$ah&wxQ* z<`{H#)J#MhBr29JB&8fAa12SZP!oV^O_Hnc6_eZzrzHK{kx<=aBxW4NjSn%=KX z&E%VM#p1Y>-_3rL$?=hhO=zq&o&GHOh3K|J^t-->Bj-s_qb=3c@}|vZoaoQQqB-oZAQ8>UGkweW(j6Y& zkrwHfVSgi8W79J?-*mTg4igxhAYHu74YNdLecqWCR?p13TeM|Gf9{Sx&VdDmLoFxP zx4M+cD!Xn`j6yz^r+lcu|1)fnYWy+zpm^kuRjCSU^4O(3(Bo_cYpFSGD0_dUmWZN9~g`)H^yN(UE&~zK7`& zh_C*%S5b5}x-lSEa(?zSz>5tZ&OQK2e*A)i7i~aOMlO zNFv^Hj{jbCKh>vomIzO&n)*`l7k@4O;cpWPM+{VeT8Uh;GU%wn%7G@L-VNsTo+ zyEe(hd$Q@6Lhy9m1}$kU3QDRRRf^5;4&2jIeW!DnGI*Day+N&p=sHf?t5)iR7136H zr!8X=W^5~sLe{Z7-hfD}%}U3~#6cB;E2Q2GxlI(SRAkT|Oq;rZ-{QbtPVj!xug^!D z*FP1Rl`7I?P~Q}25KiTsDzWC07iy(p=jH11?dl~t|7@>qG#sBgq(~IjnruSqn8Bu0)AE3HUl_se-0wY^ zL_;xW(5n?85o<+prRf7#|7XwF+G%8lDOTaepM#5nz$f3fcL9^5q>pzd1T5ZpDY=jr zvzQw51&W**U+FdLs(crRrkD51q_1F2Ft}MjvAC3fnRdblsgK$HB*ba9=9=^3UvMe` zV^DajA5=he#2goS5PC$vi-BV@$ zGstM~zEU7m#Uz9Cs&Z{R$yRYy7S(_m#OE;99?SDP87esb`-Lf4R02s=%Zx9chuLC0 zi4HD~+)HuA;k6LVF{WBop>&v^wPik#mt-hJ@6Dmu+Sv6#f@M_B=d&|jQL_DQq~(E* zRuQK}X#EVvM#aIDt|3tF$2pWr8`Z*;4TY0@y3>SX&>>Qr$AvzoPbRRzk;2$W{z9qw zwQsJN7lsN6nBkJ$o*RZmZ<0z<@>Wo={GIdcG+V__DMnJ|-~A9);eGKFwUp7NY?NYbcbc6F z9~*%G;c6gmaF%@rw8!v6?f~nRJo1D$CIq)GT*tAJmX%C8-s(9OA z#R<`C zN1#4~cg*sxG6kNtSvWM2*3>V0&zToJ*+oAA6t0Cm^T10!-T~P|3%HXE_PDgmXUksl z{E{`tICYPERW3!@(s;`|6Vg)Y@l6(b!Lm_1wB<@FR4nsLT$(nKG~=4t?G=+2p^t>C z6ARn2hu&;5krwA|F$J9TDV+fWt^8audxT4?6g+l~Ast1*CL3`jSHdYIU*k|n0(#I( z(^T_-L|BCD8{vHa1d+`*?>$?B3$uUVXbA00?&TlLHw5rr$h3nKkxPdFKoF=0%x2uC z$0%Muf(Nhv2~8vT?niEg^$ld8C7U;JBbWaM)B)#Wgz2$_#0_s2Cq)T7|k|-MGEfI zFTU?kIK{!UgQ0{}w+7!cz*HfJC;MSbOwg;Sd} zV%tQp3W$&vCpr3kbld0=l~cKNOb_&9Vjgm?XtIY`DW6qWIPp1(nTEouK?^WyPSgb) zkKnHyBoBO_B_^Bh0nWeSJc;WaDlG=Ds?O0qb>FgYJX~iileB5cJx8LH7m_bI*@rY9 zAa#6R6O(qvJVWgvT3y;hq`WCuzAH0g}AiYut>`q4wN4EW>0j&(Rs| zWWA1~HWNszG;u~X^(c14!dVigeW4)}1$E}kJ}*^zRJ8cWom%mLO=jQet3~RkDz#qB z?NV?nuHUkse!Us5ygAht)848!5I+*e$Vtyemy?bI!oj!u0`N~O7 zm)~p#pUo@mN{L5{R+ishCSdZv7F}OOmtIQr(Z6RRvnK^tE_kcnrBpIsUeitoVbv&B zJGM)xazKwscU2r#TaqNwBRQ?Qi&mszWjH`n%OrRCMW6b-90wa?QL|c$)gcevpYhc0 z=M19pQ^{zrR$mV*FGi$PCUKGxi)d|;XG2nEDH-~!f>f8{kt(~08n5Hy&!lSG@N+dj z5e-h@FJSsu?L_HQcug%m!1C|Xu&wZA^jSAzU39>+W=RZ?3*Y@{Bj}0TVu{r1gAK`o zd@>PBYW0*qds6B=GEhr4I0JnodA9%RJ-bmoj7K>i^P#m1kP7bg>3mP91Z|Qv9=dUq zo9qPvRHsW`RU84_%fShbuH>oc74T_p4z5+pT>&wZn8!)7+S{Ok4VkB{%So9SCFUz8DTg;2|bnRf+!`Oa6>pX@f&iXr4(9pGoba+E; zt|)N{$sRW6B2BaECo{+@vOpk2(Y*0J4_#o|z)A~7Is~^nTicy%!R~80V6@XcZK?WK z#AHf!QlQSw)M)q8(xo&x8?KD*F;F^vO#;!T09>Y6|1J=CAewrlb23*kc-@S}xcLsS zEoP%i`v}aMrAmFGM7x=A5BP~bCwUi`3f%lMR- z)~8?|3Y~e-HE#9!lr_z}2i|!5w9XZ@RMDaDKas$(&|?T9mSYP`-|>7_ss4N<{ZRN; z5hJ>ywn*2S9p?a80mh_AHDDR6T$ujs`&nmG3+Wq9VHn}cK-n4e8a@}Xd> zK+%$|U@8ShNStgj+Z3injT;hMi&uUk4~RmSJs%+Ppfn7$;e#K*Qr%b2LFN&cU~F<$ z*$?UGbT-0G;x~g?8M_4k{Kx8Vjq&r}8sjc)unMp>OHdOHFGEZwJ$QX5bpExRwK<}H zD3O@7B?Kiq0TS!v$J|P(#=^usR;yn1jl@}Cgt~EhsCr7@NAAhto`{KF#sJRD)ec*q zNx3+VCFlhD@_UvlAIY|PmF>F1)YE3HYQE++^R5Xd4J%M9Q5iq|Y}L(m7NTzA_3(;h z+~5M9ov|Dx%O@Iz2O0u4vSRIf=W~MR^g8vu0!4lZpOkTxP&o4wD zh&)g{pV?=lKZUmz4IiK`7n^(P2T0b*RuXS%sruU9 zd(N*QnXCQ%%JRT-%d)&UvC06`UALW=@g2aZt@i}Ut-6S&29<^-wjw9MB2+uDAMfl9 z*~V5R++Gl!SNZiPI#oy$7E))oxs%_0-B&j%TfFA(DZaczsF9kMB^q*hu~CIuxc&XU zz5&vOc;$13D{CZ{sVg*b*u~>7+APgs_{;laPr&(|_`iH!_P^`}f|PtdR*jOZXO0F3 zd6Dsr6?$bGGhViGbDr6VimZlj%|0JR)&%0t(+HZjIDQ#gK58d6V^E#~w>Z|~@Ny;J z@hlHW+riMx?_pMEnbOYyPPABKmYQI|JSPl80^Qz>6T1R+NR;{uEPs3Jrit=u;W54T ztCjtGM2p`P@=d!RcV;k#C)_P}}VCdKM;f z7?E>55vnrw5kS}-_#PW(Ry$%|nfMNGJHON;YgTP3f{hl;-%`!HjxiR>LUMPARvwXRyX`o`_#5l?$3=skD{Tj*A7OAb z7P>6?OxMNXMuK2>Z>ACI?S0t;4XkbC`tAMnWZg7tm^41n>N{p5m_Dlf_nuPg0ujrG z9YNYgn~H{p%J&s2I_nBtC-al4@X$~~*b(Av8X`%;=S&Hvl-Kiz)75vk4Tp;iviK-S zviJu}z(l&oIp<-f!y!-BgIm`ARvo{jBOMdyo@+m+^5)(3KvQ2KdDAt^7ISr?>uLy% z*YzW{w?6F4(NX1^jB8Vqp>y;01UH~QGYVd0S}u@Ym0ZEUcg0}ThqMCCl|9rVz_W)O zMk_NP6mye4yIsjR7n}G|0_7E6D=}JBY%lt980l`chl&ns?5|<@BEQ)pw0Bc2lcbIN z-6=ZT*blS5%sp*}#52}AdENxv=-&B}obw+0yl8=unY?xPmf6PQyv0ph%O&qVKhwR| z^`1NVnX(tDja_+lQ?}=eb}~O)y8zrKVF;clPirmfCkjCJjhA1?*JGXryp2Cb^NtGY z+VTq?J(R$F{yG^d*_Ky>$g$1zJ|DT_eCwj1pztay>=zJz{E#yRA61iG&CGIxN>QyC zCwE^R7hRLvK4g#m!_O`@2j(ZLyNQ`f`$*4JNl#W;awbVrX3w`H!;AOK&1?82xs&TW zbmY78ktv6V1yN_G^w-kFfuup|v+JRAF&iz%GmjA6M>kN48dZurDtvZSZ)K4%E%(KB z8st9Znjv6qOEuV!Gx{oUdQ~5z{R&UOiQ}`EuEf=_tnPTvT~DZj?04ZlQ8xTH`1GL? zhC%T?^c0344XSMGAo5lU$xcNDg${)OmQgZP0k!|CZ#`6nB+@xr&66y_P=-31Be&WR zYMQ3+`jtaS`T_Qc6EyKvCd#%sMlEi6pvt#H<)JDDoWEnM_iIx*lFjPP=&I&Kv+G3A zT`!RWw$0lWg$Mo9Y^)42ed|HhuB+lyr{1f}U3ajXT08Z!*Fj_()rAgxQEIve-Kf2@ zewH23aP->HLXcY|=Rz$cVCF5`ogo@~0H}Z}6>C6OW2-OXX0=ESbmvY>9VPQf7D7`g zE-u!E&g~WuxnoiSU`g~}U!xk*#;6S7#k9>&N8i}M@|HE<40pRIc2FmrBB%)aiQMx% zIk{4%+uiB0tDU>=v2{4U=x!x=mK|@hh^Wjo)9N}q zmoq-dT5Pc}DGJhA(!*U#*Ju`%SISfXXg$0pCRD}Og;?v$-NlU{M@CKR;?WxxIce4Evb-(?Yb>B*2KWs1^)Sw)jjAjfErM@dq+*@nOqAy zZ}gv#y-WnV9%7l#HR(rTy@UwunNn~5yex_dOIU{GK3gdSG=BnOSkz){+{&vTnrbuC zdh1UH}SW?RSp>-Pze@^pY%x3@+X!U+%%B|MP#p^OZ1`|=8k;c10 zz`@#J?Z;qcDpP*7GMlK3!5Ez>;3ACvN}qsyU}4Nx;IKMTgXnyA=j1v?mRNlXMmV9c=tBil!oUndwhuq zh4a^9lbFBQmSK{LgZAam`R~FIi$3lxDD2b1!wU2UE8`!AoBKY~YbK7PyFne3VHWn= zDi>Cjr#`2v7E)D&Cj;w~)ilT?rXAJ-t0RkpM0m5{a=CqPf==qMdyOgvcDc7AbQK42 zlGs7C<{e}K1IqURY?x;{SV*W`aTHfSTjBctQ?r&!Ig|lxEHD)-5RyL^0qI>oYBYYY z^Cy4UpHYO;lMm*dBhuhV8s!A*H>eTVp8?8BB7Y%{Wp-|`tZ#DtWVK;!M@pD=Ul~4V z-Lhgw-u--8hgxrT&1{SP!QEt-HC#&frt@HA`|yJPVw13FWhGJP+ws>)%3lu^SP75| znDKY!IhC_w+qWeS2&vEjgjBccJ$=E1FF0Jq;l}ZY8X}d?_{tiJdtU)+GFxDx4A#`T z-#+IO6O<)ELJDM=W`{soa9(Fv}7{1mk7yXMEA6g9rZ|I@jUB$m>+sPOo z(QJt2ZS#KH4_bUtsdcb(s9TTmma@&#Te>?uBvvIa|nT9EXZCc#{Eh;lD;g6ju zg#8%9sSJMY(zBEe(7F89Phlh=u`XX&H>yFUAl~^KMNoJBl#f z{+);ZQXJi)A%FIFrEiTbSu{!h zlb?DrOoVd~&G#{N_X{vEnSRGGQ{3}{gFF?L!-x>JWWr4_kC0|d6b(;%(n)))4k}pQ zD8;timd*TTz10+aV}|A%_a{JdfIr9r940;GP|nWw!wUQO+wMlneBABnVCKtFppd9a zHK+`Nk({Wcqbsppk3B3-+7k!Rh_LR020f?)R*}n}k5YUta~^~6kUhz`eN2DV zoML?pL3ncD4q!kQWOfpVvD3@!m|O`ibdKa?2%t0R4h~is9H3e^4zf}JE?k`=X1H5_ zMKwJayg29EI8v(u+8-n+q{K(oW9phg=wbIe-pxK*WTF__j zO0l8=r6cxlD@HcNI@vBpTt@rN8B^H4C-hjqevD7JYPc|GvvQ!?g<05`Z@i6jyjZ>q zkY4GsReL6Q(mZUbl5?al=(h8>0E3z7X4%?G3FU?4@P#&VGr&19`V?{zGL8~u!T^K& z=L!x?vws_BX){=Q3X-T?;4q}DO|8r0Rm#q|SXSp>;Bn$2wveWk7>=}Yhg|KW^C?*1 zYSKWYxjo(K#0r1K)tcboZ~C#HAC^+gRQZ|vgU#PwkuN0?(on_GRC0(0lvd?l9t!X+4px8f3 zg<#$BASGEVVw+ZW(CXD@f^ZSsS5Mc*(zf;T^+t&jn4W#!>=oNcfwl<8%LM#ozb{q! ztbvkz1$}bv#;o^qm)b(p7bfcg@0LgYjRPNcY}i3S{Y&4Z*{ zKtaWh-I=Z&xEkfzf55tMgzamnX&M=3tv*N>bLRf2HM;qT>a5uhQl1<*Xye;-*sx@} zNnG^F3ZqRfVGs!S*%IW4?=zgaVD>JZ)j{0)4hP7aU&mCc)t~f!CJE`hf@#Vkx{!V% z^-#eiBMczycE|Txr}ghpgw3HI-C#Y*a&lq)VMPlU zj1`QMPR0M}HUk@o&~f?GRP~_Z&+buskL>bIr{3m3g#F~PsK--D9jVM|D3TXzDqn%1 z->y1K%Vja0nCC7MJ_g5k7w>(VPC_CFVbrjV(49E^Gfo-uY3$iA#)dK`(d59r8A-OF zB7K}_{U6Q2gyH_76UZ5JNX=0)k%K9(pOw^Fut(;gMu6o2>-zpx`lz&66Fbh~7{DpKCXTIZb3W~O4m zy)q&Ev@3?1WG-cd|IER)z3WvLk3;jrhTF;Kgs{*s?`^kZikl_2>yDSyJgnBiGd z;Y@;40vcCufGJhK8}&`AqFr0_SKok&qRFXDYh~u}zvRqnS^_*;2ic2axg*=*55{Gg zrK&Uk)9aLrB5y>gP@9{=v922iO`lXBE&)5}p1%2b@*D7FqTckf$JXoRrg|!tfplY& zRnbNKx5KHN&pqWgqRscWuQL;*C@@-bI;ftLQMn8mKe@GLXFYLcSTg{Ec{E488}2=K zio>Dso*zKNCHfC-Xt~CuB|CV?*p1W7(Wuclz)5TVgdJ~H4lHg!c7XvAc;81G$*`>c z9I+qhI(Fz_PmFOh%lI0C=sWZFTMx7^Q_Vl+Fi%wUpA_xq2rC^0%9aCEn!JsNhnUSS z+VohdNO?@v3A}ZkN3seB&`Sn_D){bV&3E zQ`$4-+L&37jiXVPlo8m?7CdcMG}Ek9U@?D#B2f7Zqv;o50sTM8nSj!GJ%h!JhBJ~| zADzYCW^yezDi687M&IGhQbk*NY;kv#>CL(iQt2wIN7sGsYr}s!_b;=NuAj^}=u4JG zj?WcN<52V=%kQ@He0mg9#eu-)ui1*~Yiidgpm`Z@!(0sh<5pG8ch&R?stsv-d$2NR z5V+PM5%^Uj-g03aC#hx`e%Ndh<&c;XdS$2W18o0NG+yY~!doP_YFeOrQO2Z7ISBs& zjV9=SL*Q~Q8g%r*2YujG_`NyjGJJBoz$sf%e|SaE+Q8J_e%f#mcZ*JQ;eGqu0!7W0 zsMCKf$P#aBC~67~6^%AW!B<-=>bo29-h}DxeGKpQj1PL!0U-ghpZPrOupb4s;B)(H z(+M84@3q0-Sm~dPD8$f3f{l?6YfiL2=&#~&J)YwK?K)X%qR5Q)vJw1s7Rh)ui;F*o zcoPqE=Lu(-qOTngq=D5)-;wPJJoIbmg5}XtM9Uamtf$q{@tNF{UhFf@mQE8&LGSaU zE_(QAT@-9l%lEh#0mdQhXUjQyYpLj_$2(T{9JeACqc2%d;_-IIv#^uLU?kxd$CC&T#;Mv>zmfv(Z04{i~a;a(mDU%X-<53F^3MTcyOlyP{l*UD9%!#?ipvaJq zvwYn9GU!NCi9udn`AhS!oyPeEe>Ist)cw7=zxJyJpj=6{B4jbN8Z*gzy?9l zr=GT~p>VF)j>4CdJdqQrS&(dg){o6<)soFA;sf1}i~oBd3nE8qAY)#L;mC-@3nLUq z;lUI>5{H4z18@u$5V8d;^uaT4TWrT0q(c1^ItN$~1yIuU(;>rzxT4h_yzUKV!V(=L zqH>ctHD{?_3~>+*g?6@mp#+l6L~tQ<^jqRx_WyX7_^Sx~_WV4L`VTl0fA{<4b%vPF z(xG|q?EO?4O_UQr{0yKkuz5XZ8s&=qKK=EskAP0)p-3Z!YzkF0-@2UUnzuqi19O*2 zk1@7C>gbgaUEFJy1S}-$M%U%05RH?%RD0p;y{FX0zJ zDb2*i@Br?XOOD+xElABceaakM3~=1@BT(!I4#xmQx7`_cCVx*|ZfeC}H98$ffP;=m zvk@Q7mnY!dIShy#(D$l)0AP5R@Auldv}JOIh(CATKDDq%pA69IL&-+61Mw(GiSUxV zeA&VZxXS+}s86XS#hmW_MS~%OU_CMrvBN4{Ly|H^t+(IWcpVSNa=HbK+{aLk?wugF zLXp_dzQ`^g)=T0m%eVbvIHVQ))(LYne=cSqd_L=kZfK!xlqV@;8j9``Ni7H~57 zPfkmVGxB0Gw{+4mi z#Oo!nNZH`^@r2sWAV|7|&>_1lU|PjoKt!_A@wqfM zlynAXGPy&ypD&g6WPlICeKH~s0kzi^fPh`yP8;N0y<}EUbuDJQ=2j~kW^w<&$EEl} ztoq=m?sB2&Gbj})e?M$w9J$rq2j%DXS!Eyq5RpMFA6}C((;w{%4vM`ku%#h*m*J-Q zHR?tiQHQVi8PUf?;|#)f)obUu>w&pU!rKa)wN4e=3f!>lOi{DcIVL%Z={@{E-8cVM>-W>3X>btAr^Sp}2kNAJK zSqKigt^XzQ=Nnp=y%Jm67j<`gKf^EjKcz#z#pW{trPF{ZHLtkySe?!XOLZKJD$J$y zsK9PHi8zjEc+b=G-~`dHsw(}R=jrB)-1QpH9n>8|i`*+oWyX&?U?tjDJ*ILmEX5`t zdj2SOJaKt%B_GT@u7iPu#l;w|j(|O;&8_3}~9v11qsago& zEKG#rhVc#XVWdz5-=f^r40fHF&-!4s`kkFVZH6bbm@!RpLT-grL*1( z-g)5cQeC|7X!z*ig)hqv=P2Y2w!|$A1pDrC2}4PL_1OdB$0~#c(4So2U+T1~+MkLj zyvdd8)c+X9Egsy1T+Cz>xUl~n2!bX4tERi06;K+M6~(mu^qh6NlkwVPwjtt z&+WFup@fcht15o5dd73*Adb94bKpCZOL_{52M4&Ub&4-11dh_6`iP?hi=|Ap&j~tl-GhZ6Wd1VCz}#!{fc-Z|Hjy`=Wvj`04GBD;Fl@$bk3=~JHR|0=Nt7u6y`Ty@V zW6oX|Icnz{)i87k%)clv&{DhY6idC=U!xKPbpzoiK%W4e7jF2VTJT8`^+2KVLSSjo zu6m|n9z(tLWNj>S`xNr7)g>I{k*JjG>rrw7I<7qzxq|&moZC*#>M$EFE z9^YN1-iKEXU$Z)3-yzh}jr$lJ#nqOuIes{aNh!u&u6DDR&Z=6G0@JdRK>))&G{o|waGwa*R+A6GRh;N|@fu~9ji z!+;70@>^RtmC-3C>awsL*Uc!hH^Ba->2wzJYnYGt`3Tvqui<<^1`%Bdz8N#*748?{ z$#^N-?SBCU0M!6+)!6m^SFAiS`al0o{Rr_z1uSNH!vt5jrjD-Zi&qAIeI|_ne2!Fv z>B#LLIQoDw(s!|sxW|0_{ygK)fWYka_PoIXti5-G+!8-ll+xT)XA_=;*%0xo^5FBY z?mTFB;dic`2()mH_=nUVMn`YRdv|(gsk-S?dw>4{_i*4o69Z~`F5B#~BS;r7+ltn5 z!9AmZ9W3H-^=phUKa!+Uu}HQne{h)j2+Y6SNl7n6x{x7+aG+ii_o`}qJhdD3LK34$ zIC;VmW$u?LObWrLiE6Lw86ttavAtS=(x|`8DtYR?G?y`f!k=RYQ!5;8^h|ZOMN$gh%KAk=4=ri;}}!r-TEuwQq)^aw%%D4}r3BIVgAEz$77qzEJ$3hLOy2J=H4 zWPW9l1ipyqB0)LU-`|kw;r&CGKIQ2O$5A4HyV6fOhmI+(X-b5rK<_ z4lxlQfDK0Y#XZsd`?TyWloOKUxJxu1XoUF*W=iy-@Qk{TI?WO=SrRy)H_Ct7vZrU_ zIl9E0r47h#sCP7D~9K3x;{b1pYdl23Y3~RQy#2tK{oaTgsO$xU`Zw{1mOy zx2Bp>qWWtxHEk@Z)$XT4*UB=oc;d+*eaOA59{Tt4VU&X*-Tx1?Kuf>a8~m!Y_D!31 zX(|e5_?V}Po?iFb_qpE!j<+^upn1{@3~K_tL$ql2?9+Pj)mndnozs_(Lz{RxjaK zPu_#!7zgqLuJ5jR$2mLmdvAKzdtv3uvzFL~amDI$e)NmS4~~q@dxdr4z!67`Hgi&9 zal~cC93D8}4!bS_hl;@QrwVFW`>w*;y zl^;@;Ts`Akc$pVufhAXg!TAe!&*)zG3CkVlb{5)e@BZue!}1qD`u;Pz+U9h$z4`Ax z{mctn7F^~0(+BpP;MvXy9Kfeh6v0}NUMhqMJz98@d$7iw`$8l}jN~SXm zu!tyDibVhq*S2I$2YaWeD$oO9M9nZcQht(0|3{$d3D_GL95QR;38c^mFbW9)!R>%@ z96to!fc0Sz05Sl+Xu2MesFDBu-uEKH5KP0eu?_5C8WE{HapOm1Y+Z*EGSG$}Ra@R$ zO#dFP?D4Dr@xNU0M_pbdtEZj6*iroB3-kKeWNfoIn}cj4;uZ+_QXpLymtu=0W>i-S3X`Cx3<__{Uo z?|TvF*$Cjk@ZaXj*z*MoKpVguOanOJCWx}caU5(9Uoc!xfrILJM1g~fYBuPrAG@(M zzMnzDh-@GRQN$b*SpiEgNs{Zjp6`RrPNh;&7<#S)V8LJ%MFg)3l1$=5*~s@KO|O-T zil#Z9mmeGVeJ`OWV27Hjq7lMCQ9)G|3+xXGAO+@#(^68&lwn!2EaR)D#fu^=Tc+XI z4lDz6^etEj&zd;ZAqa=5hc8g|X3O zCL8#EwOj&&0WamUSqu;*u@Qa{IIg28YQ$n3D6BSXRYlV!Q6Mw)UZq@dT}RgwAqggB zFcZ?ybRCQnAPWGEqH3|{!L@B!Rscp29e4r5I|LqkfQ2E9mK9YEeD9o9=ddLA0i!yI z%L0QoaE65e9KlqYDB?sR3PK+CBZy}#T)5`aOS3I4EHTqDYVa|3kfUxK?fU&*^TTQA zmmj^R_D)XZBwdPQGNLdljG2`oM-sVQi`;Z?c!L`%zx-lQ9Z}}3Qs$lmYxd1MueqNv z2swTtc%@~D(Ruxv8ISm)f#c4vo+TF5_!OHfW8hFEz9Xx^vgi4gibdAffdlUwiN>KN zzo?E&6ga4;PCdQwi?1D^jQmJGzSjh&MKe{NfaH&^*smPh=ru0ka$_- zxKAnU2f)R$ELiVGQ4leUmo9zPD_F>g3 zW)u#$F34Q=c0SSKJAv=`u$iQZkyUgy-Vqdb_x$;v!@n7iyEDJ8;$DBeXM5*Y&*t+I z+_E@OCL%tk7&uf}=x$Fi7$54FiWpE52XNp9Y(3qG0teM`i2?@|)hVX6cYnqxkI7(z zBTP5t1U~Tn=U&)Q93Kl=&co^#Jecvobp=UuY#TiX0#^Ob(1X-EJ-JUC1b05Z~<%*qwZ0gOlsba*%CV-IvZQ2YP_Qx?x7M5HQ+fJHeU5c%f`p_iehb*8dCuhq~}$ z*YqN6cE^aS;BWhpe-MK<_(WpvyKl~1ab@UX6pozKn)`VXz_DY`cQ@YgCD!BkdhuB< zF6zaTM#D|us8-;cg84F%B6B3F7rqs6lk%D3YyWKX312g+(?}FJsHk2R8s4>*iK8Ql z1r0DlLI4vG#)D2`;9=Z9vTLnb8Nq=&3_Se+O?wo9y?=V`TGKSJx|am@T{KP0Hcgql z3U4H#9U(6WEmWfCCCxa0NGJfnfh>d3 zjbb+p01f)|{Q&k4M+dlp%~Vx^R~^R&Kyq2OyQ}N!tFLZrZ4C*tge3knz{VdFgu#=-2ut?g0Wi}>&BX$ar#MfL}iHn*8aPT~qz6bt+iwR%5YRw43&|Fx3 z4Ah>u!@A-<36+&TGI1|BfPd@#0t!4lNU?DG@G7(JE^x`t0025e` zoChP()zukd0whB!grb84CrZc+h~v0G6M7;6NKqIc16vNn0jGp%ELg2W@(Favl0>F3 zfEX}X1jqxpM-l~K8iss8IJ#?F5_&8E6|g24>^zsrEbNTQL^1_?fDPib z2!>?P#&xxMtV@Ot3tkXSqh`Zt$jYKK&bZ==E3`zSi4o11Q)W_BDHoGRqn%yMBF$}L zkB8}rJI7C&!{gUaz2?T!$Fe~eV=#+`4(2Z36B_1oAAmoMU z24eQ)`wa)DE&Q>a+zbDgaP#JMUx8oaDHWg%`&n$&X5?$WiAP=zGL6)(U@_#PNz5iBuQ0tFN0dH633MM)0Az%Yz>^!dWZ zP32NC#)2qr*+w?j6{TvLK7j^!S1y}{VX}ucIRp*UPaMy&(HnttFad)BrJQXVs;b(K zTP~ML{ZE7jj^xn7`2cXZz8@olBrEV)&^O_szXc1D@;m_=+{`Ap6XK~#30*&P=~6f; ze7ozwW&&^!&x?REWHN;`ev9Cv^P&i5I0~_o3+yVs4w|a@VPM&|2gs60tX#3;{PWLO zNC0D;UK=|+!WcE;`4r*^5#!WfG7S@wm*TfH{UTn(osYw z6~4dZ4ixPrNo{#LiGdP88|w5o!e`GLg^}uL{Hq`f;`;Bh{ZDy|uCud?tgR2UUjKKI zZ~6VduCBk=F&rQVxwCWGzkFI>w9x+cfAQ_@@UCr9^c#MEFsdSOM5H@SguQIwQwAhA zn#Fml2wMeXr`P%>1NOb*fJUmW)#thD-<+9%!*PB12MbN$xb7d;pZIm7I;}*3gNo`U z(e8D3kM6~$R&mybYumZD)({4?t{W0xMc}z$3`o&&fy6DKu{3HmSy5n3fMZjR*pI+* z5lzUP1yDgKh(fhgA{>C;5isFk?l*7VT&`4L%K#uo60!aUCakhx(J@;jiZDM`mULCa zQVQsJkioE+M$NHpL6r1l(!(%O3vef5aY|)$a4;a<+K97(kBfJ~p(PSkN&-tgJqd&% zkl7HQoIjd3-}AAKI&cG)H^=Jda1O0)Z42hj#qb45=D-kQTq2%>EMY}U(==hXasI92 z*ch=03`8PTfxUd!;jn3o=bA<`l{Q_^4uV`R_lnCe?_0PqAgIB!_4c;_J02O_$H}yO zGjy~$=R(%FaV$y0BLb?q^4|Q5EG+ixC$D=?;j0*`T45NM*=bg5zBg_MV>V7IUC^p0 z@hUN$a}U7{h8eAnHEAREXD~*dTl?S6@b+qIkv+Pz^}4^6I+wt!`3Jt>3}GSj^f@aR z{o{uLJDNLr>Y1k>-v8|`V|DBXi^voj8<%Kn^xGqxf%gb!zWjjW*s)y?Gcj$%MO_KG z#urkR#g3dVOq%*>0!OJ@^+*H>1rDm?6$K6|s*@>^3%!uzMj!S=pNttX{t+JX9w~I; zvn;^J3+vWdmZ``JjP(IDBn6{2wFJ5c!05+S#u<*6MX^>Xha?@5v|bY}(}X`)Rnr~U zAvHt;*r#PXVDIkohLEv>B>ZXxibvl_4J3CD5F zS~c(kF#c$Sd0v)f+p=uSteF-Veq@F)z_}8Zg*S>Ae@a{-g20g395_ls)4{OWwgvcv zlmK9%sOY!nIiMMiln`xgZRG_lONy}+u#JFN!VuB|5>gZ;4E$Q9lFVe$*MYS!15uKk zc>0O-oRbxqG?Vij%Yuu`iQ>H8-fOPCR!=0t*v~;wL!4A19T$l0jVD=RcStm8k|oZt zt>?V3tQT+_hmWsNcQXl=_juU*!9wj|(J=jJU(FLawp$Z4VWPI#B0ZG=_-GXVibFTt z0E>9SDT=Dl%!3{L&b#6TFEwAg=&fyY=D5S#i%zq$tmQ{V#H`RspLoiN0T#}8Y>jzg}?gz zqy2@KHVBt$mWcuf71c@5iq3H!Lk`fBkG75Y@B{K|Y|J<^+V0=K|GuC7jIpiIb#dYW zJsg}YN-(b15;&Xg2bhBj*4U_4!6d7)Y+-~4Z0>>;#{w9>FJK+d0N%oo`Wawgz>p4& zjMNMh7{zi>^-xoiw!y^n4k2KPhry?wOPa{nMf%r=5|6EA(bGWM*2iuMOpe6LpupA#@wn8My3Y>-{%dj;T8FOqEBT@s>!$lHEW(q(8gHt4dij~gsEwFRX za~U|aC<2uPo|jCfFy_?vZPyWbQbL|;a$Iu5ae~3&+Wx`nxEFQmqRd9FS1)nVC97?cg07cV{5Ak* z>>b}bK^uxNIheG%{-?&~hdovj1O?%mKezj^|Bn z+Xlda^KM<{1!sS_Tq?mgWdFf~3(kJk!WA>OiJ_uuiUJ4KsiX}rJh*r8>1w$+HrBu5 z%&dhB3E9{rwW{p|kx2lwv>TdoSk!_D9@ z6bx!{d`!_aFw&M$6BT?Bb5Lz7o_!ZZ0nCwO+3A+t=+Gb-WIdU5Z3m2LI+-#|6HKok zh5#Ax=m#rmnI>#dD&zw)8v^^VZCeo~kGMHTM@PX%+m;QdBr6IsPY@8-1y14+1PWc- zPNb5OB&QNO07Tr69?ZF_CrJ7$PV>vM95=i797hDy;8^Sl$FMwlJXk?ixO&G?2KE4a zfE?gDtRMn6a3okY1$zqu;2X=fC2aVH*UYvZ*RgD zkwSd4=q=Jn=T!+yn*(PIln%y$qPR{MC)fCj1v(a(Xm`Qs?$&uIH+D0 z+Op-bO*`&0YUTdD>&Nr`ANz-=Iy)9m+or$&xo>{s=Ar$2&^yjWdYde3(!#z=Zhq(g z`@Nj=%Feuq1IWlHR*fT-Ay~2;*Tk&10*RtsyLUhG$Rp))S%MM0=V^%qFa#`Wn$8JA zwOAlCDS-~=0aHC9EQ}#yatDSlfC;fMFEN?U*p3~~q@Y`Z)UOPEAdmpI!AR1;$0UN9 zA*re;OGdRC5_b!>mG}HG@L{OCW7kemR&682Q9 zR%K0NV{eUZ!PzI0Nlj0biiJ3gMNt%iOtn#{g-ZaR z*YR9d6nROW+uM85#TWPX_BJbn@r~$>*y?hP@>U_s?%uWQuJ3KmlVE{4aQ`B=b!VYmaT2PyXil=(kFEJGC+~!qw>wkl z#vyXO;K0FZ&2Zyi-~8<(xe#{d*M0u)z6PubSDOXI3Vcz~07l_1>xrbS$hxLsNN<4k z;^5mdz}+M7N@9ByfrtAZ0|(2-&JkvQS1K+%ZU8^kB;{5 z+jju8Z(p2q1eaPv@PzxwX{mN4(UQn?C0cs3J;U? zLgisu%!qB+xjK0;jA`4?{pL5%J^QTZI;t#3zR!?Y1bA>8hMB}d<5+7ckxIFiW!mVa z5P9_K=ZnQSxgeQHz}OV$T#{H~91L(AJ!+G@*+eo0YaBlSLk?qfO_6KW8p-{@#FI*? zh;f60=n=O;;0GHwZ%${kvLL_?v9Jfr38b2MR8JR$(SD?BdOVwwPA0(&!>MAuQH(j2 z6N!YX>1M4;Tmm8hf#-nruffLfQtYAtWRVpWP7mWU6b18dVMr}XKq^M13>Qqt4{HMV zU^!IR#ekB)S5>uIsRBe`6BbFdO$)ZiITSFESOpz3NL5Y6xs?dV*`yE%Y-XmDDIhH{ zb*AG0DgoJCaN&g)TyTLT2wtQ28{7_~Rs)O+$P5e9?9aloPd@qNJwN(Uxm1FK3ZmpW zHk{rS*Zk>OSG?^AUx1;?BR%T}&Z=BKWi1@uW~)W7#(TLO><>$u^D^Ij-M4(-Mi&^+ z#<-DhHcUY-(ZqO0W}1LGcJD30PrX%r{pT({!YNr^^{&mITl>u-e(`)DKRJk)z;!Ss zicpkgS($9MHP-@XCdtbF=q>;bj>P3K6HR&Rz|q~N5m#MgJ0!CjXKrw_7&xr7{ei!~ zKWgOrz#BGg+&FmfU?HCm9J^MjFl1`RBiUHQLl$6>dyJpv1M+3#@SDZ}j3#p3S~8dI zIa5uxrP}8o`R|VER2KyfstNt%{!bnle$J{IX01FrzBly3Pkv%;XZv(d!^zb*Z+rJ| zU%1nEVYCfHJ=V&jMPac@1>;l#tyNNUSgw%`M9=o!ng`E4_-7a4B|*|;Sy66y!>uHI zlF{@`YwKJ|R@>Va9(thR;hp>XU*O3=ZFpo?sWi+plBfyio%j0ref0(wV!z*}eOhk3KqHDlxvFR3t^yF~BqMU2Ns5 zD6$04UKneNibApmI1dvv(8m!4K71~0m&I|8<5WteY-?*Ooi2=x2_)h{QB{BmAFQ<~ zVbgg5t8TcirzP}Sr3wZZumAuCj14D>EU8W%d2UET2I0{UJGU)6nNGuUty%MWk?u?;}6KHOS;zaAX`s zDxgoT>ROJXNPfiFhSAp62782+*wI!J1IJO}gJVSyM^{xXk%TjW{V*ho0*+;xR)8hT z0z?xs_2YUz{0bIK)--`*Ylfkzs-kLOU*RfY7%a=yz(9(k$n$ZeYQV)MCpa>T#ljj9 zCwfpA>OrD6Hm+YkJUD1pD{zAdHE=6etN=O$URbd5RozRboB4GEfB5>d-ZyV_c~B0l zwG&O`u>wbpIkebDbGF4QU^c1Y8hgh3r|lEYLsWzrnWIv128OCjub;pCbqkLCr}V(~ zua}_-z2ELXa z#v0dwBgC0Iba>cl`y(HHC?uY|(Xp}d(b1vNQ6Y|oA(wY#bhI=w0vr3}?F_DKO4 z^o^1FayYq$jc0Ktk0-@zBP_|!C9*w|lG3xCiQIJ82-T@B3LI2*J^kbz|MiV`@*)f+ zBhLur6ffyQd+Qn5Y}fnWch5_A-2eH``yT)0cW?<^`Ap!zLkFJJ9Gr<~1%k|pIu9?| zWj}B+QxevAP5@6wDS;WK3(r`6{y8^b;3ONt(@s^vjCL$peEFdVdhWOPy9g7JWtN8r z_qgcKxAb&U(X~ZqT)h13SHm_VL%U(Xjz&(BI(ruL{Dh+$Q9}$Y674UNr?yWXxMHKh z2RydjDDnw;c((n-%&|GnrDQYGR2}2XlH!A$Kg68itth8~DV3gk~0Yfnl_s zJ2Etkh0cO7oz1cYp4MEv1}D5!mEm}RuJ*oj7o7LH`nPEC?_an4waYp$_8k`stck+< zf7{Crd5J(wgaj;RYCRt($pFDm3*DG3_HEmC@7V)n>{%v5>deAlX}MhTToZd>X{F6_9 zZ+K`om~*!lcxE7~yr6RMI0@b8tktVwA@HKNzwNe;wxi5#$J(_1k+G2-mT6YXqcFa@ z;jRCAxGlf;{SQ9;;I{~FG^#ie=PsOyRq)^()GUtCtuj247&#@txjEGU)+=dzCboe! zSpEh{OyJm6;!^3B-k#+>J=34g&#(VkwL0!PrsG(p(vV}g&nrEwZSM5 za6wgMw4lB(Dr!IiJ5AFf86})!*02aV%Q|3>^#p)ItyaZI2ti~+oNckN$_0#fBj69> znK0l$x~5kv6)?t%ilsl{B;i?)0TZ5AtyYq$lq^V=W%?v66qo?0WjsF)wkMSV?%}GH zvM2!+3OJtvL;6g{ckzufnPd?~2}ZX@r2^{#3osJY#vUtx5m=yuWW>VtfuCSkz`z5w z0B!*}CDR#2mP@4~FpQ$<05pIpaJj1GGJG}KySiah)3R7H76%N9d{2;Yq9;E-27sg{ zl6bkwvM&Yx=r-SPZFb5E6TQ*Wi6ln<^P9vT^fXl0C8eDKP1V?*#)hk{B zwl4w2BO^nD2iHHhe&@EWHPeh6(qfxH*CS>7IiPCz6F}EX z;PIkN98^eVa6{udBCzZCe(u4eerl>yNEA3ucWv7I(E5!(e)8w{R*FTAlxc*&c}`>j zICv356mV=qRwm@uzx~jIZLP;N&wBrlzA!e@50ASr3}gky%KDkhujuGm2*0*>P7GN- z@HdM*->Mc%yhMDtYy&v3-x%u}7}cnE$nfZ~itwBYm6TwYeK{>SWnXJW!r)nH&4qt1 z^BIN>JA3D^x#%s2p3MIJ8-|B=IF9MM7L2Kf$F|vS8J4*~Wkc!g^DcYl$vXnxD(A<0 z=PrNcrSBCLxuvzYwWU2|#8us6LZe|=oat&49|jjiajGcSXtHUOw9+S^cw*E&>UK%qEED*EKB}f>a=A*m%yX>cxM9S|vW(4G1OZGqFkm*Dg_8_0uYm_* z0OJHhXUvKuwI)R{8mbCL9nK0vH&j(u6s#*nN{PVRfivKg(&-E`lIy@KL6$=-q+tiX zD{E-=ts6JOeFO}ONX>RKDZvSsY`wDWJ!{Ur>Yg9p-QLx?B)5F+t-G6Fvo2Zf zlu2nXo>UYSr@K0u^~)JjQB)w|9oQAt@UdbTk<=-2N_}1?oxq^Q{43sGXWev##nIm`tLDtVBvh6!wQ?g z0o>?&n8f>@f4MvU=3~i|Mtk1a$rp#n#DzQHkuqK=?ApHl!TawY92fu$g72OviHayy zjhd<_;7x&#lcDe(1LgxJ_CsHk6wGwuxMZgD&pz~DNBz`Pr;sRc%r=dT?L08>JdA%Y zz2rzyZ?V3A``>Ne`t$Lz1NaMJi_pjDM;;rP!`LeV^6>3YP`G5G{d1q$c8urni+jI5 za&VX9Se|EvoQ*>t&aL?)U<{V^U3LB?f8+4VzEvGjA@;~30MJh zB(Q{lgoh4;DA@%g9-LC~3|~qLcF|K?M7s#UA&DwR#9y%LMj6J%nzm@cMJreS!BIZ) zcRske|6!*bFnqLV!Ky$0<4+Ig_kQae@9{%7Fu7cJ%j!#BcjltYFIja#ciIk_&?im{ zzEQI>j>h*JnU?jI=;YtX$jAc^JTN>y?%8%45J1-q!@wfaA(jf|m`K$US~3Avzfvl} zFb*qHgn=RmSfH|8Q56^+Ct;ioPk+aQdoGS60 zj}zg1+$_VW)$~LHcmdc&6cA8IWprc|+cXqCf%71q2U~i60J~xZaeVNgnoRZd_73dd z#{_|zOu~h%RH}|y6GS*gHE=ye)3C2fvCz`i27FK~6ym0@^$gX(PbZV6?FcMm!~M1_ z*S1rbqQYCIF>k@bTBTeV8wHz(q#}sEZRXM$Ka3n;0ssr!#<)>QN~P2A*;Q2&1i`Z{ z)3!wT3i1NLSxc@(Pw0kWA}3+%7N6&ZWGd--zU|l|7*~?);~IvCIlvAKncF(Ms?`eo z6>vPiZ~y+i{rd!-!}OfEy$BQW0*1m;i{!X`2=Lt3zWGg&MEGvmv}xz| zZAPVxMi)zrIMuFg?zV0i_ydA_wMg8X?Mcn;PR%>NZAqOr7$))RbmH1nybN2GA1g%F zu(YYv4BeO(u@Ty#JM6{FzPGo8}Hro;Kth( z()2D20!7E*Uw{U!ytd_U%8ge}6KW zbUjxfU2@={SjR;aVf%DCjYaKz-}SsDD=)wPZJ#{qr=~iEM1kX!*V9klv3C9c8!hfE z;k+q%hAO;g2CupP{Y%fh1peIj^gm7=aOq8lUKpV9&;=3#SSkqqkxODtK_)r9e*dlFyl; z1C--b@PUr0qY(q!!1xMI-Y)s@7EEJF@J=OAvVxvWWfSw#>8^BJHkoL-_VQbTQa-zA zWqxpbOLsl$bL$H~&uLkJ0H#AX^5yS;_haSCSQx^t1XWJ8clVAC?=R=aA}$1cY02f@ z@u#<3cHy;>B*R!uY80l7pP^uP-9}nU95EVaqkxrt@`)#QY}*FoZ+LFXOa$i2bKrxB zs;1}1#%$ZlC{3P>lpFfPK)v96DEE3>3dK|sCyC(8SS*#XcO4#AK<5w~#_Va_8Q?JNNdJ@jBx<*eed;3_~O$rd%n*4oM$7%t>Z> z;qzbqvZg4iEK6`7gJApS&3m?Ot5o1i98|OY;#e=Bk4+|Ps{72^kf#gjF0J*dITz;C z?1~##>6a&1l~hLsqiSH3WqGW;?}>fJCUkGin3LiRxPY;NTN>Z~zwlGgvRzlbUF~>W zN}&fu>ps6_)msFu?Z}UUN1y+}^S{^^_tJw82*<@5aS_JYkOFQD2^o%DICp7}v-1F{ zIU5&KX#fW=NFvvg#wIn`(U;Uxs~Bb+IvN8QZ2q&=9O#Il5bA3 zG*iS`lAR}Y&kx0Lqpx_=St;#M$&jS!zW!c5=^Hg6$MR~ z_UHE=7~Z;f-}=JPs1Fx{0RUpuoETIj$FGFg8O^`xPv8CaH@yc8jYFz+!GXobXe~~8 z)88yR*x3 zu>l)AT&uMz@#Jf=BEu)ev`jq_U@D6X#+AWp92f-xmR=RbA_-;SN#}Rhwi2)<%i5L& z$J0}3)3V^`h$D_83IcEpMu4(RwO9}oHI>O4@VyHB5R)yzxcM4E0e}mmR&8x>FBb~! zot^nY5p5Njcft7`QRGSb3@?ZoJ&`XKli4hsPtCMiTU&8(jB%fq<9c?jmQ1I>w3lmD z8&BR&Bof(77KYSFt_*w>5k6+QkcW#Cahz4FIly7rTq=>w7sde&EYs3;O;r@&RCMb& zc57F+Pi9Oo*8^;SJVBF6!^n7SY!nEowX*|w&hrDu!g&)tp{H{#u4THu5ATAFVH=zy zk`?%jV`F1*+A=9q2AmNWfCq2`zCk)fCk8Jo>YVQGzxm(?0U0sHmIR#0V3mD;>!wX> zpL!DLXTaXpn^=yni&Dufj+^<=4}|J~n}&gqLfV2)AIDq|le`SY- zaB}_frb6K9!SUj*pE%Y2cunthOVdk+<7Gi_YdimDrR^vw8xQRG`i}cdhCl#1ir{kr zmU^C|>mpW?#gcAt3xEL*j{bzp%lr|61B;T7V&^e%kfJYGi>2BdD*mfFJ36{LI!c8C zOM*g}29!5{?mKu8m^G>Eixw?{OFFNwFK)KiM3b;FBWWAP$nbFgzJ1%bZvE}E&*C-# zmecL&>S}3iNwvr{O( z@S@5Ae84H$WnXWXcp0C(knWb+*rE5`I(-g#^1OwJI=;f>2bnWTjjh86QyOl<6B9%WvBE)c!p? zJl_qlm~`lyjMfT6s#MJ=U4GH!AAI+RyV|=M;<|{FP2f=|kvM#g{2G_A6yuI+DZcOV0xHn5$lBBx1s1dKR&(t*8Jt+jP^5f4dVR>}d(0R+GY zE{%_>ipq&%ty+agd`Hh5Fi81)A(2e_BtjvT%fYYM4&E{%I30{njo>jIcVTsHr)HX| zY!=L8rBXpO(KIkMj_aC+3EQfYg!MaZ8^-RAX=bunu-PzPhc&=JFs!tU8jN~dJG;T6 z183AK6=0FJmR7?wZGZyT1#*Iu(Ishgd>r_uy`w`|&Vj^u5iodBR45j=ZQqf~q{A?>5u3m+s=x`7 zq5>8GC}8qr;KQ$gIB+Hgz=~-&w$s+u0)t`rEbzu8X3+T9=FPV2y<=EbmKD;K7Ms+d zTf%V^lCc7NfIkErQZr1oT*4$$mV_~S-jXFtZocIf6|5r~U}BWXE?80lcI$=>Tb^IP z-`LzOpQ)+ZuH8Es+Y2j z8a!}dUw{9WO`BvFd%gI%%uOH~&yzGK&b{}|bU}%F`t9eF1{GwnmL#!p> zhvbiu5fw~l6=clmfTs%3hF$WMv;c#7&&1)noWfd1aj79d1Wbr$#U!hz7NtWkbpC(# z-UP_9^Slnb`+ncn>#RM40Z0G@0gx0Ia2G;xmqdv&Et?iiEsSK@R>h91;&NO`$&O=N zv6FJ8%1g?2*;W$EwrE9bL`eh*0U!u~00Cm384PBh-d?}$?rYBZZg&&3HcF%`RVFS_ zQ{AuMyYDXl{l4>U=Zwj9ZN`nhQ*EsDeAj-$nDt7%SLs8|Bnu&e@4CLe7k&BKRkNoB zs}`UP>jHUe0qYb^zThOS=@8JUx&la%&nk8okoFM9LQN;7;p*(2Ff*lf|cznZ=)!Th{1-{Sm?bRb2qq_h2@BF)4Pn}wQ>zk*$ zia!{|CVWym%7b{8GKD_qT{wHuUm7|~_0^s28s@T!o3y%qQ+UOt)m7Zo zJmn-yZ#aUtn2vW~vb|m(R|fuDGa0aqsrVyKJH)+a{?;SY09%BO230V-H__+ikb~=x08o5oW+4>z2R{ zpbe)ZJP}sb3opO?fBxG4vZmgVYqPx@vvx;s;-0=A~vea4<`7^aB5)#O+s z)aEi@UkM!R>wqK6ip3(~b8!GT{1YF*{x#vzpH23pDY&n)MA!)3TmvNPdcGm$7(6y9 zE-oj4N{SQ;ZooCf^Rl+Se)PzZ)%Ep_jg9tzie8n5)BT?%1+uxhIT??)H*dUr_AG8U zzgJ==>_yQ`#q2x1<=*NoH@)tjZ@Y3n@x7gtoa-N z-537Ik6hn+ZZf?JA0JQV|MDOGG^If`wajUpby_yfCQT4tsf7NyCA@HI{0YHeRkSre zSf<{xnN8&lWdko>CAAeA0xa6DHrzHccjrhtA!Q$izslzy;HDwz4viH&k~epnqxRrv zP^1-NtSYVjTs^6A27u&_qBd@5YAtAEFG`=A?<8gk$D8g|!p+SDhSN9kK|mZFmEmYj z+4A4I&F2VjYmT3^tk(c=^p8709?4!w#sv!)h{=%mzWXnnIC|I9&wTEyU-`{6nYS_! zXL))GMB-{*AHnwMZEyaecxP6%`TBaOg#Gm8D^Gs$^J}-Rc^fCSOs{uS)lhC(xuekP zw9T*TXOqn=Z+55g;-edX`kAxOXoIFS;AYCoPUz$7^3K=XwKN!h^gSOxzJ5yS=s{)J zL_Np}R|kz6)j_X@eqa#eG=1=)hn{`@d0>JfNmhr$Rwg(Ek+2_AdMexHwRP+`j^f?v zrePbcqQkZMuA`e4DKF>M(TxpN(}a4Xs7ubd+MY-6F3pU1F^OV)-(YE(qk|;kD)H60 z!=ur#W37P0D9VCUueQ_c^#Fa6Xu;-2&cu>90pJ6egPH9_#KXws>vb(IKV}~er(UzNJy$C3G?b+5Qe>8G@B(!%qau7nW_}sR+E7; zT)yDPqO5>0Y}>JqY*Ah!Xe>$HlIE4(8Gn) zVn{VcHgpb2*8CP~+BvqRXnHi8lJGR_!EutyK~f#?c|}!_E0h{?206>VM9XodH>cxw!$Q&?fcFn@1e;toYa;VYO zJMetNsdv1bjpyZ8Hk?Xp$#tSsrsAEpb~!De}VFL67H=mC&(?CM{V)aSRyAiKMdY z=K^e6`))t*Q;PVM)DRYydf)Rnh*XvUrT{v?scgTM8;27l#K7KQOmrP6JY~NyA9O>6 zFw_*cI2(z&zq8E1QJ+dA|5 zcYg4bfAgC#*spH?KX0!Bjz7ls(C_}jSD*dtEV;D3{W4r>Hmh}$4dfelZYA0=Jq@8^~|N`FZ}k^%_q_*#*16qXW?~qWM+6S9 zEPl7uO`SD#gKU6^FH~W*oGc>U>om7JgQ#>Z8u0WCRMdSOfKc5E^fGSB6v0XBE}7hq zO~Ao+je-=BM}rkRQ*B+VW(czCp69F%{QW7<{ciJCOalVY>f+w?`Pr`BW0pcS)NESf zD-1R}wmAJNYrG{^Oo(#wwrf5Gw!n9Bbk);wY{^bx20&HBA0~wzsIPkWogd!1bZv9< zLRG`=mVHCtjT68Wr_?K7J$h>6=<=-tf2AQq1j68`O3TfyYms^t2No^zzSleX`rEWb z?e$JHo8!IRooB~S0feQyr86{cUb_u9Nc?Q6R!w?6{WCxE=RfqZPb~F^%0c^QH|8qC zzuY=zq;9THdqu}+H;QuU(xrzUd~k0viPCf{x|CP&yM7v{l~!mv>9-kpNq1hJ@s(tr z^p|^ORwhwq*`{e3xTmjKzTK@%d=Ib&T(uj7IJeEKSKYv0UR}dln2vX0uicLD99+!8<`erIZ`NV9M-pu8yw z;Hg1FWWXc`+1rKZG~%NrDrFU^sGJk0PJiV4zK*WRhUd!{90YPsNa7)z2}n_d;141QoM+jV^()Rf4%r?84%P&PlC?bm9MlRH z!;++VlH_<>UK1qEH|FcjpX$_n*lt`^ZV&)X08=)SvT|%Y;^0XKB$yn`(*y_)*n-ou z~{Zs|LR}=o1f{JZs1~JGpo3UTQ$X%;(rACaK;+> z1Y6zK;CjofDHc`Nk4ZI(jEKQ>^(JeR%k{q9lQf25$^&XLGVW&6h(9a@Ne#ZplzDxb z*K1m%jpEcE>VOf#xw8*12qs(|U#IFS_QO^Q;k>NUMjAF7cwaj(@JcuO!3o&9J<|4< zOWV}dSzN#z*oL;TI-sBlhXs^{UKdH7E%H)ti%?6;^8A%e!4nMtK@qV=?hFje*Sllj zI4jVMrLmix8Q3m}bE$MM`=5 z&2O@RhcsI;jjAncm5qo6HOY$rYe1C0i`UQ3=3{~709gmka6Orba;*}vc1CI=I4;|@^E4-^RRyofRR2-ynBCYx zkEsHf-RXF|e(X3R!o_5d@psiMuPnp&FJ{vL-Vy{+mgAzq^JQt8)DOYCf49 zIdPl}>m&e8vMlrbP?0(u-b@HhG@Q7$HC$cCUJ>J_Sq9g%*xQ3cttf#;mW9RMSS52B zTX$L^!=^?FMLjsE>H2|X+gsPJo;q_g2NKGXv2r7#wG4;bD_5>uzH&8}#u3NsNXe+4 z(y?*{y`E`OsSXF7C2`<;KpShr;UY=q!i;WFqNS5RRREPV!=NZ`O&V8R4rv7;qpPUk zl1z1FdHIu{`V;^Seo>`*q6^@#I5%5gICt*pr=BE&DJ$RiElSgsI7hq-Fbhr^XN0$1 z(|>pV>!+%^2^@p9n!c{~lxVXk^TzHQy<^6k-u#v~y=7m17SG_`cwTKc-bJk(7qkQU zw0`DaDEUO~zfn8#gVwF3ap%)o{^ARtd;8K&x4iLBpGhWpvX?KP>HQ%F3V`GOUw(pp z7`nzwS`>h5p6|_OGk^@h0^y3~9p5y5)jk(=YB*#oFA7{(Q}knf&l>hU4xVUTIHSzw zByv>_0mrHNYWah#Td4{z0zWGgPXN0Bc8!4ZR;pn5I5|VfYv*Xp*x{BbhAtgHX=d6M zuCpQ|G>tq(_{v(*utO{)95YtCE^HjCjOy~X$PcWw${_4HivXM74~V)^%PRj_wXkq84G=P)*fUjMEyB zi^`gIEsE8ewmzizXI|F1-7eO2nC;n($g|Bf&Qd)q^g5lEfHiRBtotN2&Rxi($rZ*_ z$FwwT%?fl8WoIjiDuEIZ39yJl!7W6VghBqQg+uLfIq!YlpD(nsR;r^%Pe1$MuS_mp z7!LY_H^04Vi@F6)DR@K$=_=z%T$R~$JVi*%h{zT~2$uj0SJQ92on7`1;%avY3|Itr zgiEgS zd~7Y!^#EeCKWgp-*$G#V|XvtP?)6{pF9OeTUSCyofqYFZ!heHE`5wLozHRPC4q~- zG#uh)v%6Co8sRqJ_R}~Tj+QzJx9MbzAb7aE>e=>v_uqf@+EuOdE>aV*1y{-NsxCbk zRYzFq^+E*T!{KQ2#tjl_IOL2n9T!M$Fc{RrhE9MbI0I2Qt{ZmM(ktt5gz&^SojLPo zKJ_Vw^C+fz(6pgT(?%=5;?{rl;fLcS2GqbY!_Ogzw>&?YPX~h`*<*m2v~%f0t5+w} zylU10JOH?^YO6L$TE%I#dROn%ttUSE(T~b0v_+aXRh<;o;+Z_Wv~OhEt(V&y_o>VG zs@`e;<3?In*S~One0BNe?>T<=hfe%KrU?s;8Yfak1>pG2fBT@OwqZDsTmpMpIIEK9 zIF~}^cumV@+qM2H&P&X2z=LyaDrW+t0~~|U?FWwhN$KWxCsQ(%OKlNrKuu06tI7xP zN)pEnCx${SSv;Jj$ogQB$edK;1)(N@B@>=j_WYQf>jvz=H6?8fRp2VywmTwrJlueU zxCMe2RlsYF`Caz1F=_%n795!}e^#3|yH9jUv5a?i0Ic75?&As zeckCBh9x}>QKjygBnyX`Ftw^|bSB{&{FTYY3ISqmSi0+*jIa#-Fm9$4f(&}}`_3Eg ze#_%qk7}*nGIi3%dr1-{I50T=x@gO+Zh$!~CQI-sd^^*m4Vx<1TZ&^?)TX8nQ`z*^aBg3_3-Bpf%;DW|SCeP~e-QTi zORH-zsk=M7%PT7!pqS5k!{K}p!C&IGS6Le8xkXM0H%}AJ&4#_Det&Cgo7|DU@3`)4 zLNc!2U;x9O%%*v(M6)?ONG}ZGN`cOpVUa1x(em=BKiJvbiQzDsb~qZscg{&AUJjR* z@$GO+2relV3y&Ryb09nT?6Sn0JzyjDXB2P`O<5k@*ueS5iv{sZ(^#&TMGGux)+P*d zGM(b4g~MTzW<)zO<%Hln#O#|5Zc)W9cb2|tF&Iy+V z9tNBvFjJONpw1LoSKb`LG~lRWWo0E1uZbVhEaT*D5W*pqX$rW8n`o1{Rb%l;#fO?S z&s@*%YLU0ye*2&Okss-j`M4cU*CMLn3DZ6NY;@0}zO}RS$U_fZzjz_&4|FNkBw2<( z9Xok)dutmD?(%(7}xVYg!9F1yK#>rX>gQF);eB?tP2HI$weUrQS$ijHJ z0WM_$?|^9(Xu~+hCx3B1z4WyD{-4+<>5uYik(IyKOfC7gWpKd)a6I^HUrXWza1m}@ zlHd>{7=giPiP;FlgkuKyfR7)?zhh3E?&F7mLzlejA>c4{rE5z??14+in_d=KKXdha znXxcTyuf*E+#^-P$_m49Hr@q>4#FNT7am1w8VjQrmJ3eV3;eG93+$K3*p5j}ACB*e zvQNo0jOVFBppGX<7|3+24cB!$SwuE0*A4r8f$wb#=&uIEmcj21Na1$$S2oPvda!hI zdE@SHpDTEE`?hVb0**g$`zQbC#~=REFHm1or%aWivLDk9jk;iwqN$WJtr1w;eZInK zNYlcpAIkMx{{nwTkltq za4GCiN340oKVmKoTDxqD(wUe=uBPc6Fv@c+y;a z?OOMy@}Rv#liWrUMcDJ@oeLMY&o*j<060%5v8J%C()22T^f4Nsn8{ZG!@^u1)H#VZWay>5SmR)=akQOm=qy-{X*oWoPjsibzPhvbq)o zOxkn0u_)6x@_ipZ12#S3+($fGUg_k;qxno_*D-}yMsAeK18~AC?J4#)=s+;L}H%qhO(#V(B;k*~~8GOGj+H8IhWL+zX zVZg^5mW?|_pY6KQe9m#&EQh!7d=CI&cf5;(4ElXtVs0RYRJ;y_?()nFdz#E0u#!a@ zRc-Uert5o^Fk}Fus6uHf<4(FM^ce8*_=zwI5xhZ;^&(AdkIjt2M%89gKrtmU#^u5z zhwFx;X(e-LXxfQWrvR!(qtP9A++j#hMwi%NZbQ@TuDk-wEX@!#Lw@bb%P)WROAqbt z?gE71dM>Rj&u23s4yn&gzMwpLJdLy)i#>q-BVOO{`*59kQaQ&`fEP9J-|&Vv-uBwt zx+>W0LU#3cXKm81hE7nKia>emX2t!Wv7cL*##LmUylbC(o7W^(Ik9HrKEzp&|g|oVew@2sliR9IHKK+eVM`+g69hh z5|`0&J;OBdT|l(#-oTUHG*}Z@p18%F>(0`$tF-~s8yr*?6y=Zs4K+yXuN7gqqXsSw#Y3} z;W8Nd=Fo89a&^_PVWSZiq|Q_cE5mNIYfd&SjComHn(s2KXO~!Ox_UM(aa0KX-6c~b zG1ac}f+GpnZMbIyaCcj4$?d@;nj@&Q*3~L$^sp^=^|H*9YmI9g{ajxJ_%3U;;K`Dt zNK>zDPR?r+DqgZfk5wD|z>n0--jO=?x@BLF>Wt%hq(1p|`R_^cMGeqq?5Imy#S znh#vN&Y2X+y|RBK$QFfy%TOq*!STjX@>yI>5^KpR%@)o~*{l(~=utK7>x+>Q70n`v zMFm4O8#T}@lBZW%5ZFban#-2%8mEt*`LiGT%$x6i$0LtCa{k=8PDQJc+{WR}H99CH zoBj&js;-SAKNwfh*aL6JY4qZiuZ`m^ctqSa%e9h43aC-$rR~|&^Gr*F-Jn_?(=t20 zgLlT$xM_K7Y}2`O?R9>DSU;^qtd)G@6#)v2@9Od6@OE$pl!Q$afDw2yPLLv!qoFSs zb4tG+JGBAdI+^UHX$BK(S&l^HIs$HZ?wr%EMJKSX30adbYGhdw&*}T~<&`BM8}e#o zDb8@Pyi&^?hvPWAn>Xl{2~ASR4{$AjRTQD)q;ywNQEkmMvD^7sKc%rE*RXPnhrK0I@DmdV-eZ+Fug4b*Wy^?6_;{8f?Z3|$f)eDVc|DDrcs5~7km=jq@5!hN&J zWVp11<$>>8L@_S@qN?KT{!pJc@n~b^?z`^3`%VVm z=l>WdZn$AAnzFMrl^p4Hhasf-7IM*C+FYXdkx;h|RRj zAPBHZvm(c*YRPHglE-mEy?c|5CO8Y+6uDzqoGKm`b`t}XC`6WWDl8lNJ^~=>(_&$= za|mzH*d1I}jTU8i95WNGvA6|cy;?$wpRhi*SF7p_J7=&zc8M@OzrZxE~O{5 z8}~>j@~9JWt6h1b({N{DyKhJnC8@zVBgXDXr5nwtay+SZdmvwq&1iMKGT68vQ8;`# zpC#$*gTYx@Ufno$dgJ(M$M&9h{QlkT8(s4izGdXNmPlaqQO($S3_l9JC<%%T0BkL zx?LXyt*4Ji3cQ$=DY~Pt>P|MvuII^aKGQn}bO9E2sHb~XBjg`A8+T-OCwa&18~whw zy)!%a()BKpW7Wp7(UKV&Q=dOpRa$R?HPX~CM6NA+O2uatT-uiUJ1 z3MIn-Ms2TK){0fsrDE_qL1~-zIcW>_KH{eV1>C-QNWj2`&R(e1f^GT!$^%oow zsVeDNZ8onY8SbWNjqZ>5z+zUEv8bHP9{ByR-_ulmA?XBsus0Yc!j0{??#||Q00_xO zr1aBRW)wnk;8t^{5a2rt1k;=gsOmUcXu1*fdN^*lY6S13HkW>4SYeK_NS?ry=%3sY z8kib<&5u6-O zgug*acXFmG{3y@i3(qry$=vpvXsl z;0I1^Y*4S(vJ?)7nq7aWeZcO;Sz^H)9r1>(?{8HX2gu-b2Rm@(pM31Gr=NbhmH`~N zOxJbi^TpJDA^p`A%NmT+?W@xlHhLRa9*F(ptO^1vE*DdMdi$NXHCwi|*SmR%*^9n! z!5yw0wU^#Q%z>?qQdJR(tpmVeSZ0ZvSbf7BY`3`<(U82yIKTJ!FaNX8;mCttAGf+K zOKAerGoau+=Y5x_U~=g`nHg?00%#dtZT2ZoI=}(6lM1-Os!H;V40s~m)~>vxC<@DV zLe4EWi^T$1lzr|x7J@z5+cnvT%SH?UFw5pBk7HX@)kzcF=uV}N%^P*u#+3Bqe)^AzA`E7q}Kk@4JEo`p>j{WU#{p`ChzVu`_ZHHhT zuD47{v1M`ugH;kNT=pS48a!(mH~GBcM602go*|%wwyjeXg%foKq!ov0ig$`^T4_Sr zhgU3LCl)c(LkbPHSw*$!>36KZX)QQ`=xSwk#q<1U9{=()Pdvu`;e);&`gT1qlt9;g zw!y=xWpf1kl^3;vVt9&vRZF(3c-=ky-nYE({DpJB^~kTXzuVNhnOJZhlcf{l~|S1tBl%cXWQx7y`4&H_Vrd60JUs` zt=c+m43C6k9k9CfHOH4%dV71(3+J!4m9k_7J=>X$Gm=ja65fHYe$~F} z1o~YGjQGhhi>wrC0r=Wd44kOV8G0>sZ__rDMT*z)&O9yF{3DJ*E+%{+i5KLj5@IXf z1kP!Y9J7%z3b=f~*Rxnb*gs~|cDk-fQm3<_r!MmBz;h51rD=-rSRh4K=7k#s;y79S zW;wudalbhWQWTZw;}z0PDas?vN5EbK8NiE_bWUtR1`eRWN>Kn7z~PCEs(4k{@(iEt zi-#>;&o!75Fqwwo;3Wf7qf3osDSL>>zEz9VDw{13L&Ntp5{BaQBp{c;nXY+ryuD>R zuBqb&sa=P|bUI~RF0|adS3)%^$wrkG7FEmB6hCO9;>r@fVH8XeWw?lNx7cUKN#M*B zr~!94n@&IdV?VaBv4Jp|eWQk~_iHQg)nr|uOBqRJ}jnvRA$Cf>uLb_BQy~omRmBYJRQx*2Zw^nbtHCSHbD%Cah8^t zw{K#56>zXQ^wQ-g{_)TKBpdxay+mkSut!0&SQEEGUC6n$DsN=AlZBEp6;_+NO(!Ks zBz(PNyXu5hspV|bc*8!?l@fv|r0Y}_wn=KF6|V~RiUI)?a}IClhH|QZ>+L7+#xsBB z%o!ZX^Ov4_X8eS9IDsy1ur8Zqn){Jzq_tC!@;5E&%vFFz-gMJ`Ob(D?*=zSR$Kq#DJqT98V)Q!eMYoRaJ(AVLvvCNfFO-+tgg!nrfvP7^nQ+NHf!> zwl(7kYi`YJz@AjAqgl4IO(}V{%5tcN*_VnWrLE-~9k{vUEhm;L@T+OGtN{g#8emV6dZ9(4YQ^d*A&*7#j}oNpprNDW!{7uH65HFC3~?2pkl* zv41)Dr(wIFJ1^2nQYi;BEC3u2J@z|W+t-V{bUeGF{z>EdPIYycylAWac$PRmyq%6W zaO#y@-nH#ooL<3U*k&<_j;)%cK$N4UArQi0s=%NKs+x*kyup4TPJ&LyJ8bnJYXt{o71CK2I5wPS z;Jc+H(n-+dc`(S8BnjY^=X+zz_0%rsCRyyZyQI8mq`MH>SmL%UiTlG*2R^WKKM3ZN zJZhV&zMix<~7ApKNm9r{<4iWeW?AARJJ&1=`lI-%;gO;2y% zr#^aX@WW4Uz1S9CJ8}B>ay=`wFjs1&nc9}6U zC#*VndLR;9e9!kZ89~ZY!X5I_=?3}bvkc3~4+CA2c35wv(9D>G>|Ex6<0gsP*es3} z688F~aJb=yO?P*Je6dupTp2v5!1rDy>k#Xh94d~@3XMOxNL4 zuDOejSLhX*`SB{hdZ#EGdAn(Cx?pm|1^ z$5cnBdfISk0x$)8E)v#ar00}$8lC4}_SfF_+IN*zdFs@LZ96cqzwzRKD6^^~`B1ag zUDQUQ1eyV7kt$7!u+}qR!$vK9c(r!oyZZe;&TD;r{lzQKeE#9zWNp<{o1!UV`V7%A z(N!vbYeHbEsJVJmGbrmecH5+_oxmFP$pos`%F)O!3{Jaxg${JI*KcyRYN{(^?UC!7 zX;m1tR*)Z+9A&HhUN)upQ%0S*>iC)EjT1|7z4Iq$fo&D5dU(`ZB+0W+UdiXR+tqY@43zOy#`VDAXFy{z3-{6U9-HxViQ>+E^cLx)i@Rt#yhiM zbi@hiHu5Ac%L?W%48sf-RvPO#@24A;Y%;`{F+l;#m?d2ks4B!5a!74QU}ZAJr5vUT z4hs`-GtqnoUtrpf&|!T8`L!+)vMG%bg^11K>;14-NV$Z6Yny1k@Pfc5&y^xBhqZ%_ z%^UAn3VVoT;lnuk*tS$Q(e~k7CR3v}dqh2so5m4oxU#H^L2+$XhQoOr0~OVR2IzZC z60RsRtpFSX|IrPv%E)UGrxeJQBuBvk3Jy=g`)gezf>auL1?WhG$h?zBSB0>l%+kR1 z@~Vo2OkEMeE;zg&|IBBO96#O)u)w8urEY?)#%^`p-e)bB3WfBF?gNnnaS&a2v2-D5 z>9)hV8y4Q#=b!uX{r9JF+z4suHS^KQwaC0Y4#O-SpZ! z*Is|u=+6CpRmymhPwnWAw|||4^wfLa;jJwHvCP{4{-qzQAG)<+7EKma4un^Fo)^M6 zv@HPh#q!@e=R($uh}-s?LNsCG>IW_W2XUTsMSLA_$dei$^Oy8@CyP1TTr68{YOJCb zaM|;luG6?EhJyj1hUvIm14%sI+QOcD{g6qnvUGjFmI54hm!}ziCH=Wnce0G21Qry4 zmG+XY!B`Jvl73J) zOGIdp2_9L%Ku8&|krV{uC?Yqmq|LAbspaPew!dsR;nIoMFQ0hbAL~ZEy8XV}cPQZa z?7#cj-~65bwIjsrls+m+U9h{NB^2mJOY9ywHson(It8*Kt`N#+vy%CYoMg@;#fbq| zvZ|YT&_xCXKWiK?(WF$~rqc=lMYl9KRCZk2)CbxBcCtZRUeEOc_a^I(+=vo=5*5?k z$+#{WS5Z;GzDaYIMmDdiv6_0tHjLPKs%ZXE}`7wRC9w3r< z{)I~j4>et>3o?@$uI2!!i5pC#I-i$b2Z`j4baNxotYeo}m_V|%WK5EeaLL36Kl$;W z`l0Xr^m0H)-W~vjO8(V532e!${?mW{&kuP*+XD|#y>cnM!Y9|S7-r!P#SK6GFKgccwlL>ORLuOEGiX2FddJ@mphh}BpNv)m{-JJiVX4kjtf+Jm@05&6lEV^ zF_5R`2skNILW3*!~7x2M5D~#qW z9w8X7I0|HE%(~YkkI&f9ia-6upZS^78yoweLePeGP(3la&d`GjOQ~ty4;|;*zRphP zgS(}5z(U&z2$!+~afBCNeDP~v`AW2yFUT+M+JXJ-;{Vkw#cP+;h1)*Y*ZQ?;E7cWE zF*H~4zUQ^?^KGB2ZO#Gs%Soo5T%37LEjlD$2OO<%sQi&;?Wt#;eeT8k7Yjd{&YHFX z`0E(AYUzf7@5fK`g|;_e(;bFwIhc&O#VtaeIJdrFFQ(FKM*E@daT>99%M~*sUe3UhIz(PrBAt zbvHA`z9`3mQOvS52eznd+w(`G;bgokJiqK6#>LUu;GDAQ*kGOv=8>pcQG>uIWo@2w z^mn-K_t(AAiKDN1HTm%;+`dBr$1nZIzw^t#`1d$kQWNWTu%qj-;AH8d>ZCOY5j@=r z^)hV?DMREDa098doSxw=o1~P8>wN+)c2cVVE1d7DSUaFsQJH4Id#Gg&Gd(aY$KW%P zcfF#DVXIDP5*d`RseD}(dI_=uLFN21cpFQ<13JZ8X2s`~px$&8l*`rkQ<< z?Njq=7-=R9f}?NS1wzhf7PBmB5&Gz=wx)VO7glRVWf?6o(H&-byOrg(l9)W%TNJ-Y zD)`Xilqs~Qiau}ks7{sv4%mE-$5Rwm+Ls^O%ska=SV1*yeaUfeT$>Ee^uwcUFVLS$ zHv`JiMVpCz%)I>#C-ABJe&ZMANtf%f7F#o4l5>|GiY9spTG(H^Pm6ux#)X2BE!wZ zcn2&Fm%=x;k>ZzWmN^KC5YkCr;o{dGzxd2oz4e>2@wKLue)v&n=B2?(1bsjS3yY(U zGvW`!BF#jb0aoGG@6D6I<5_7=NCT}X9)c>Jl}`6 zucW?^r(`Q{Wt#dhRRH75E)Cm8499}B5K>h_77bv*9z7v+W9=c!{V;%gz^(H=e{*w_ zI;?~=23@t|0S?08_WS)vMpX-8@xl)rIxPxaB))JvN28^M&|0ubb2yYL5Yy3y5S|uk znuxxJP>(n=o60l^xg*PJb!{!@@0IisCFqFb&~VBb!8xmwYe@7Z{pU-`mu z@xh^7H8P&bCM}dS^Uz3*AA#OPy3@~08Q-M@dKNGZh_c85^(4W_0xC;quYdldrdz zUe&GrX1DK9z;WUHFv3epUS)c?8e3)d3fXgRema7MA7Bxx$ARMiX>$YMu zslm6gFi}M0oTvaYq;CTO0~{*6J8LwQbyb{!$vM>p`Ex3TxWuw`#Zo)EPq;_CK{Hrz zN%zW*ghQm{VdT|T*w7JVHI=$ngwZrLRK4%p1K$DOPF$t#8){ECTqC=Y99fu_rX^Z) z&C0Q#<;w6%{dyj4jpsPG<-qOh7R<0#D6ywjLmhr>unlvg0(od7Q;TXpRqLpVg0{4j z)ge3qHDZo#8k>HHHFXP#>+D;uESj0H7divt^ahIaAX z-k>p775h1$l{kCdn@{2+kKX@co*|?#g3v3nda^g~uUdt0qh(Q@PT*+OaMkL}whRZi zs-q?ITE%q|!q!iJ;xGKjpZc-kU<5ChiHYx|Ts6TKm9PV~q9fl;698iTv!DO@t(_fO zjE>_=Rb9j@B3y2EqTLdkCPiVB+M&%!63}F#B;vd70`_aXnVf%e9%VoZo^1uLb?)je z3@(0{#|-6RaAPUDlP?OO$?e-!WE%?1>+Uq_2d-lIQN^$xb`v(y_dJ-$S`1<*7zWhP ziklw}28`JyzU;`68tK-|rJ1yo5kE{7z^{ivK#D3w?SgO44%DPbOX7qoD*I7vE#z^E zq@#7BiX`E%u5E{52m>9>XRy2gAPS2<2+kum8wuwlPf9}MuB&uqbyd0xft8!Va0JVq zCNbr~Y@5W@lHp))wW`^khhy!eItU4bDud*tOysoi{oUE=Dt9hXE^{qJKNdWnx|q+W zv#B5k)fCbZRd6B9JVCIo;~Tr)!0xV*dc4`^e3QD0bX{-|g4q{*Gp-xX=gcj)96NUG z!yowwPNc&b=0Qrs>JlE}TG+k8q9_v^uN-1J1R48n90%%RO-F|>@7E5%?(XjHqhEUP z#@2S4q}Pov&u%0qPM-+oXW-8ete%TH$UN~gy*==U>`gPBJ$WsTuD_n!Fr8Hp;r z(1x3bfTQ!Nnp_NpRH1pt4A#H-d#jZEGguggaHH*PZj!lfID+%e<0wfp2e3f+G#t+> zsw!QuLWd3e#RVxj6K?ip2)d(^1<4im<#IGgMll>W)mIAKM}_wn43s<^802mms9o?q1U z?)Darzc(C`fIm(2ZXT+xTpJIBm$B_92Vm=X_Zz0)bm>zzI$3}uj23VEgI+`goeo4viFTrMQ1!h`J;hXqh&!*zOW@yiGxl4T_Sm zHqChxa%hqUlWd+Ht(Goi=iT^8TPw*PdCi@HQKuAMY4QeM7S7mRHYsKn=;SIDC?jet zqUl=jo%q%7o1C2_m5$Plv^bv8XiA&6%ihrHnNePd4Bp#;TM- zW|UD;_4GQ_qOvlw)|{0d;xJV$SL`a#tm_5Pz}#r|hOHO3{sN%A&Rs1TYFS$!+tc-R zI}g>osE>M{=Ie-6oo7E@em)x^*%2U!aBfF$&Qbxi4$T{|!F+|y70hu`=OIJCfZCsD+H zHq+b(9IQ+mO5Nq4C=)|stLbFt;<+B;Emh47W$oC_<@U8~``YgA);vl99ekJB}BW27&1zMfUTT)4uC?970<)z&u6og{f6yyHtT5S zg;l{KQqiO_lqgZ@dO`_aWpI}bv$6niJ>dX2_@h#o1t;2&O zfB)%Ir*y#&Y-ukeSKb;Rzq2fq5X%a6@GH@~D$`hx*3W|3yRu6}^Eg99K3{q|#r`#1y~ zY?9GbPaZ9cO_zsxLnX=5LegE~$@gQ2s(?aVLyF-QEHq$A_@2vRUPsB#Q4)e_ynvNR zPWra7I4B!q;RXExe)WW;tC3zDp)f6g7xB)ntGc2BqB$B2sP#k4K)y0XZm3KNX*g_t zh01(k&5`3w76V~QDcZ|^7%~S|RV2<)RO+o%Wv|!AnUb6)BTb*zV`mBH#FH3iI{+y0 zT=M@WsqCM%Kdebf8MZk1Xt9X-?;NYk6QEyr52T0>=Tc5e<9OxREuZ`=|M-vTi@t-l z?_9v~bARun&pi1>c4nvw$5NzX!hTN)RqBGo%kfxAKj7#_>z+N)c5y ze%#SG;i9y4$>RU2K6G(QR;Cd**Nvj_RHxGVsp{1F)T!n@Wq`nZQZ*Y+ZSIp9Cp(cF$UElMWPyWTzr(fHVah*N)#EG?y zes8HcsE;TIrSx2q9JM5YXXEkj{MK)6ZEc-<{Lv`QmR|Sz-7C+B;b8svEni;&2>a3$ zZw@55Urfd@pcfu}Fz|rL%*Hi(t2e2$-DWXq+k8BW#mUhSH#VDd+hmFuuID>I9{6>- zNIl2w``p#$9%a)V+gv0Wo6u~pv!|`U;=mTRA8>3{zy}s`CuG$%+$rK1aCT*$0UQWF7mX)}VpyT56&XUQ z#pOtGoNc7Axt8Nnw?)^-JKOLOII6ahkrva!cQHw>8y&ZpF5=-eSs=;b;e{bS+9`z2 zXHy{rwOWxJq<{}6X*uA^b1Wz(0?~vl-hva4(w{FMi}BAG!7R+bhX! zI0wC=-M?LnPc8Yg!zNS6s%?(Gd+^$OSNB(}{dF8b z?s1QI8Q-MD`(O37FQ32s`E66HAHU<@9Hfog;Fi3mi- zO)m%l@qws;34}L2#B~$)x!fk-Zor_bC`^*wkv6v<2F#q56&!nA64X{gIa-Kv5Ecwz z0q!+GDja_;E6Q=4Zr&T;!Y9Kf$j+&9m@!*MAVNZ#M5eoOnt)20D9hmWJc)G?2bNiF zu5zq2ReGEWe9~-XZ8b?VouoK+k!5>3JG;BP07q$-&ZblLu2vNwb1>+4Z7#q`@A|%< zy7TQH`xAMj?}+U?7jXQ?U;Lkb{nvg@Xqwn;!BI@ki>f5c+AB#4zNovv*%=!9C?uy0 zcBk)3VrWmxMGV#sba#nTWUxtirPE_mx+YDLiUkm%4t2tz*?d-Ydr*WHu}WyWG)rx% z83LzD=;KpKl~5y_)0A*nHuD~hCqv72O(UekD-fh_=Q!SSoI9SGN7cvy zSmKc4-f7LZjhtgO%>Rdd8%`~mSmhe<0y9u3PHtoqpv&qz$~-MkJTsdJAdyd z-m3NRv^R^Z@%-{)$#;8iWh9MXr_;2;<1e-jPD7tHE3M^z7oG8q&BfkcqNVj~?pnu% zz53Dwdw>m??nEW$Ih%BW2et04*#5u}DH)+T+0k~Zj6tTM_ST&Dz5An|{`gOA96f_G zPn+h#<>&v&zxi40{IC7Q-#xK@x{E1c7hSQAjm#^S^2+^R{Nj^OJq0_J*U|3F&lS7r zmFbk)pfHfjgX0^w?`~h7j&IbPi{-xG8upFUu>HKRDPf~d<1{VEcL}(VWF-&={&&o3 z8gb;->S9WEfU0c@z)>?Nk2hH6)?@)+H4I(cd6vqn8s5(`rBT54)Nmc2tAq>#U;>W0 zsk*F&oeN4(qu#!m@m#+xHKwDQ`OGGPG1334Nsa=Mfn4s&*4Vg^LQXkxPVRjF* z1@QX})bdPY#|BFbaM;vX7iI-~oDHEev?BdGa;nQ9T^8hFw)1 z#g;H+8kDVP%Z&uv9Ck&tYF5%GpefzlE4fB`{Q=p-vXu0rMG^J~-EgL;ywn{BB_~tT z44?6(izS-PEXN7Lu#*H6YD-+YihZ74aYY7qJF@UD>9D%Cj{VOjdld5%4iD_JVJT`U zm5zb5C}v4&+x8pY@P>Qe|9$|DQjm%zNe&!vc`zxhA7nV{1DaYaGa#U@&Qcv@*E;8X z$n4UUx9GyV(Wh>DwkTeF@x=%3`#j=wYUb%iBxNJGF?{ufv*)TS{hOC=>!`qXqw$s9 zN8ftlt$S7b#t)sj`vb@KZC2m>eGJ(v0LSI~b}oH>8$Ue%n$NY$T9z}`hrdK*J{*qX zcyVL=>xU{T%0A%W1Q34qO~8A_^Mrua&@13bHk#}Mj_j0TPu}9;UWgd|Jc`(1Lm3o~ zy5L!>g|*fd#&L4>mQ^7Mm4G^b7ONX6fJ8G~Ugo4KTSsH8fnGlZ>;OywLP(OBv|Sv6 z?U6t;$IgF8v%5^0AGB84ilh zmo((Q<*3^%R6C~DurEO$Y=m(Cc~Lt(v(B1wH#bW~cMNrjlOQ-S%h5^WG0u#I>aAKz zkE6UWD_WtbCg~difi$0Ex^KAYU0?hBqc6R9cCyG$yzbc1*Aqijd6ms_C2!a7WZQh1 zS9x0C-^Hw8KZK(74HK5fKj|Z2oa`ldvuSC|$N1TFLC7+n#}{9^kNr99WBXU9nm~WU!gz5N&(jiUVVUdD02(@FAE{pwL z!K$WdA{yT;i13RL_sjK>R%Xs+m*sx9#LC)wBa?)M2&ja;zR(p^d{50}IKBu7M4If% zgXTLb;u>U9a9Y74w8%wi3mrl?hr%QT%Q0}?ET-&iZgL=zWgT4Q)^vF3YL>1lp&sQN ztZA7dmCX2(-Hq(^YlX7R==FN83kT-oZ%MSk&Vw+pTo=cI%esU(xF~RQif*2`ECF9A zry}F8h+?DZgov$a{QdwJYU}Eiey`_vp9d%!Lz1x}t%F(71`4cazDIJ&Zeukr~!W@py;%$4=$>Wba^1@S3MR9Dq zZhtWBdQHB1^>fwLKA!Fq?a4hEFn1Heo&TpdL`fxHlenwQZ4sL4Qks~m%fUUyj#O@8sm;O zM_!-LI8cpi1<;v^U`-}@0>}4pspG{0&KnCrS~87}7^WbPemh)Q1qc8#04`ii_R=hM zgAj&|jiqH};kL7FnN^!SO^+TshW*SJ3kN782uK*ew}%zw`FsjWB68eQB8*DPf|W3} zu-91Ag;RrMU(^pGO@8BfKHIm1sihI#TO9e?k)z~IPxd){4a(jdJUG*;WGymXnrCqo zn*yO&eB>fGr_+g{3BYO`4-U{ri>MN$7 zTK-Wl#WR(#xpnDvLwet)Rb5tM6-oaZV)+o`PqvdhDNRcsAcm|Jcgcyi)2go;1Jj^w z;n)j|Ygv#UC!XhUjt~F)v;Bd0=9brg?XibP$9k`Q&xRsJq%L3VQYb{rl5+C3J+sg% zv(2=|KjtEQ!SSyihut!gMIK#o8vAMPN_}K@}UV9S1e(>%;M}HthhvV^B%zRsR zR+B@LWTNEUT{*cjc~LQHN~}$@^75Qg4lWEHom!l7suON8$*3e>*KN z8=jQn0)r{U^PcCa(wRs>wf%MqFO>ieAM7gfZ1LNtYgFW(vVk<0!I{BeXgM}x#)Pvf zIBQRe^xaqr{(%L=iJ4TCXeq0~HVBj7r>VLqg~RaxPe8E0OD`bH=WY;CpoB85IXnal zF<2F?Dk8KKMaacP+Jd35Ov*GueW{7wY}W-ras=VR*rx%lXxZaVqD2?EwK5Z4GIE)5 zmLXa!@LlZI6fKg9(~m3_6?sRD<_^gPshBdd$i>$-96VujAKO!U{XX7bu}Oe*4zT_} zK)wguU{ct&EPz**R@dRzaTvHtc;9e1=q)Wz_x2PaMA0oPCliUjw6^x~k9}-ybyXF7 z&>p~ru1iBZ=+fvoYK?>3MtuMyi~|xE<$yJ=mFyE~9yG0MNmdUgS#nudds|yCKK0Z~ z=g-0U2?aP?A^=2;6EnA7EPXyrEAp(|Xv(>F^ix0jBj5Llcki30KLl_bNHae0-+rz8 z;r^xjR*tZ~i8YbLQ6@tonfhe_4qQ+&HMGTH0`K3_$(AwsrcWG z_b&FvUf5G)s)ei0^R};EPP2Tlw1g)BNRdEF=sqiEqZ&BirR8N7lBQE3w$(DKx)5%1 z*+}`iQ|G~Tim5Xvrd4h_9z^nuvcH>e%!Dt$>+0<^3X(Y)LHeU57GF$&7H>vw`B`1$ z!C-*5*=!ardu)?p6d=9Q8pl&QWgOEYhBl0hxt2`T4av~>We40f4c8UuSoqN^({{U# zBB}>tm1eNlC16w8!MT_M(E*I6?-yyJdn12%Y;@$zvDd!iPwI&Ni``xY9Dl_2fBe(W zeCdH-VD?)IsAWu=uPSQ*EV{A_#bafbRkz3z#=?rO3Xdl%HQj7Wm+(-iGo`ZcKxoAF zi7(qu;9e=>rW1Ds$gq2c9qRd_CKY%^0>q^xN3SvrIaU) zoon;elfyJlpZ@KO!z05teeX@WfpDbWy)rZQTHqT!Fq*Qtbl-Jn$*u!hQ#W9Mz%;UF zGI5etvnTg*vt7S?#c~ax4ICA|@8z>sIf^Kiret1vfxWh|6b^c`y~%tw%d@6$9ewZH zKV0g2iOtNgH9xA9W~IkvuuVI&yP}qQYv+oWw(vgJ21FY|g(+Md&FYbr-T2Zp+aecs z-CB;3ZO6@(MVysgxE6SDGbF)uY$J-$bxH`VW6#XL2srh6Zb+aG$ zPZt>gM>h+D5V=cWbUhs1);&vu!0~Mh$Fw_3aBv75Q)?N=PohtXfatwmpORXH45<)s zA%OF{Hngr2&9SVCs0eP+n(Xd&5~(`5I7pemE(fxA6{(1rs4^A8goMyYH{^4ekx+Pp~C@spP#iEWBa3vK)pXmKK8Y!1p;; zvzS*3@sO@CHH98?S&4(u>)a2b5phL6fp6xFmZ85q^g`^n*2U zn0_k`cx*LEndk?2cb!{;#nVMW{{P*& z`0k(jVd!XWcR}huld|~X2U7sV&XEANX;-NyI<5ZqwPQxsbsaT1h&-o z1|d5_%7goaMXQjCro}~%!$ei?RfWoZX=SB*-WukWSi-A{5*`;20sdMOf_TotP)#uJ zgre5g*Ak9Br_u{la~WgBT9&B7R-M#96h+)X>m{Tzv8m~(so}mH4f+W4Vp-*;q{y+BK1lHE|ED!tV`Cs$i`|N#&d(NGFZC~R7 zk9fc)%!VKcw4sC<7X;B2v>R5fQ0qRiz|RRjCS8iK;Y|K+{qtVW^31#y~t_8{cdD z-s?M^c~5Kl=ef`GetRDuo1s*(gl)WVZuZ%Gt$+Q)_r34)PS1lgACJd4ne}>QkodqP zD96{=6;34rWVh`+O|aPTjnX61oT(6N8c-?e%WP*hn*tx7o}P51<+VB?Q@52YOPazC z_yMzUfb$tK2QH17IZf)DWZETCiKFR3w7440E>HHpJU#nm!14d}dhfsc7ytXe`mcx~ z1XU>7P}PKC*@o%qP0<5?a9kx|>%Bz^KIS$MzPA;^GA9~4dSaLf`NbP+I5kScmf~*B zmJU{P09_nP$ktg$?N&<*7mll$@U$#@6ncvd8e4;f|u#4K0Wq+qa6e&X<+tTXx9;4fdhaTUFJp)6%ibgNG;j z!nPu-t-Gpda1~9d`6F|-7gIFkw91~?!b1lyi{pJ#M{G}WxSs9p?D$iwXyhHdVb=}u z*}g8B;H|FbsnhQ6jr^HcZtCsr^f2A5PZKKFht6acAKyy6(0l1?AH}}C^}_X|!=>l? z*DgJBb?23Zwkn*vUE7bU%Wy!gvu^#3QF}v1!CNEfj7b3>)opAbIY2I)39tn*lv|lD zpiIS+7x55X(~Bopu4BTIF1LBC`s{G>xd?TdhUb1()HsOd^(bH(J8d;)+BHEqO32u)&e+C0;i0FzcE=Zpm zXJDxc(X%oQSfH%`S$)A&Od>;;Y%SKC4b}a}m`^BQOet_ko`bb>A$vYEfDwu5fa+ z!p5O17AEp7T8dj;m0kGezK3ss^;dbOq9`r#1iA=hkk+$pg~)4QkHu%33UY(8a6_Jq zT81FV-6R)4Y7l`B(s0UaRg&UN*vK!jjN!>t-$r-Nu}u-tDDK%n<6hWVFeSx#O?C`K zQrE|oj>aQEv~U#HX@cOFbBQ+V?mqkn@D{@HvW!Qg-T54M?{s;Zrdb$A@VmH;n$Wu2 zL9{+T;-My!`E=%kQ3i*^1d{PLq8`q2A-?{`Z$Y|A;RetPyx_KnHcd(|yt^<>NE*1h$w zf6q7k&F}rw+baML*2{+eiAR35tLB_1;%pWz&Ryr1gXbo)$R+=v%4dStXCr?)lDX)H z&%%_Iit}UPqV1C1#7N$P9WH#<|r)3QxTDbK;&FNJ(Fa8pKUjQ)T(s}@Da}5 z_k+=Vj{RHa8R^?$Q#`K$CaYVF5 znx&}wlVzD@`xhQ~$?nBRcOQGlpZO#Kk8jrXROZc&}2rhH^WRLdt{*Ioq8yup8mr z)olZZT|7F)p>Uj=A3bztZanw>kZwCq$P5GobNAV0Gn)v9$D{?i|O9&Ty(!p!xo<2##lQ+>@}dJ8V$&h;aW-HS$D4m1LW9?t^uP8ymY z0Uz0?ckbY3`60(wu;G_Sr><|;MH7r%@}M*w;*P3p3B@FNG_cUmIb?vs?QH zqiIpG{2|GYO>H=qF?Q(dH#`8K1dTYXciB+dJKkei>i*(_A^)K07lJ?XeetH@pQ^rK zN_)K~9dOTPmw^;Kp!+$Zgrw z2(RJ5lFf>Fd(pftk}WQVDSbaAb1ROn33o8NX*mu9JdJg}fBA}xT-LdehX}>UfTwQ? zE&6)9H5@k#f|ox2_*>unW?NLp8c7_gyoD;S+=C#c1m(hP#s<=RxeZN~R0N=?1c@PU zuWrz^ef1B1&zt|+U-{FU ztY7;tKAg1mwr#TA7qormyId;Na1`j4^-BO8(lpabl8i=7mx<_U?A;GIRR0PdODUSM z?d(l#=QOl<%yos^h)>1iakgHuZ^H!`2mt9;rzd0->IagHv4y$flhusTcwD53Ev1$Q zdsI?x@a4iu2LwW5u4oh=T)MPAJq3DTQcz$DqANhplI@~7Nqa|QTR7ixX}`b$M-+Cc z$c#s!0G$mMOf%Sc#8{s|JU~Kydp5R;jerwl&l9e9v6E~!id}|{%vmOCwA|M{XI`j9 zj5Qny>n^Y<)>A7y`ik9zy;Hg&r2C}v;XrS%W!$P~$~!m>1OnKlFcy9g;zEH-dV+Wu zsS58IjmGZuVmQP9uKl?pP5(0B_>*3L@WikD*pGatnlx#$j+Ep*=VKKEdYgCN)b@MR zF0jhrSdDNNuqSPg-d7oxaG} z1b|q%ZwJH^ch{+I8vFRSV6J|21yv|Ol z;%VJnrl$x>^xfDqBHMd7pr9+2U%F`G z`(q-E<69f-cgM5+h!qC_6paQ8QD#|Y&14Y)wcup34P$6&CKwczHRo+i2Pc}Z(?Qq0 zzxyivFms@6{LJU&DCB#!t}}p;HuvkzVm3cET|w*rgTyaX=5; zZCJflV1e`onVqP=xB$ZWaH6Dkx@#$ zju9IpKjEF!rTb)%N99U7q?370b$sfdF(nSfP#8?08~xd3TbCsX{Oj)i0gky@ zEpg1Q79#d2axD|v5btCvh~jxwaGt&2oSY;@VFy5<{)K~sZ-3`I)!56uITTH5BB~E# zkl*X)6_$JRESjK){v2DVk7(!byf?Ysoi~Mi=Cg7aw%hH0|F6F~{#UG#X8yzd`njsp zW4C|gb*}*6c;?B&-gNV(yBJ^G6`K52wfgAEhm@H*Fzf@vQ9pm+w?Cu3^1?g*_2uI0 z;NWMI31Hr*+yB#lZlc&l)f?18!Vgz3@K(qk>F<490S?lY9=wAxK)^0RllpwNv)QaWY4LG5b1MqBnqJiv@dsyaD^Aj8sgU8;2$g_S0fS^> z)@@`r;X60>*?L>WDnZljliBKHY^Jp?zZ#d@9emzQWGJnJMX|V?h zCvS?3fM!~y;=?t~P!cxSbXl4L(_;VP8?naJJT`ewgMfq9mbF>03EzpXS#87u#yxSu z#eecc|NQggw7#%kUj`h1#Os%S^}l`L#SguB<0HV<%;B4QTlFG~N|jfj0qGUxG>WAg zVQsksXY>M5f5MJjTV2Ut^jb{PK3Xi2H)%xREXNpa-BB6N)JX-l>9h^@NXJ=Fk}PSl zN1ud9I~iIxvf(xBy3<2A7=zZR8_Zs}a&4+PlAI(4+88ws-WMbmgFgsOrzx7_O-A^# zAI1-b%(51ZA|_7{%jQm5)vd$0mffru_D9>iTy0B)WAVs!7p@&pLFVLkIu!ll;%IuA z_DH2Pcpu>V>Mk6+UPv={{Gns3(1S-Ka|T>86e(vqHm8(}#2wi=U`1wqoNMdaoyS%j z0#6)1d)qOotg`>;MUfh(EDitHary#pXzK*Gz03#43*c&Lh+uROEyNM*V75KQr7`6* z7_QJ2W!utrOx#akDRQrOk~Y>v@$6<%XM_=Kuwk;8i2b=s6+^LWoT*@t zRD*U9M%=K0HEToi5EP6Zw9nuVA#|c87d~%J3Jh8!;0E8qiUv-JsSC1Xxbib8oh9LX zCfBaZY`4ZvUH~c_Uy+6>W>0BoHAA2LW*iVelq?<&s}8XvU7bjIk;Bol_6`mxw98mo3d_3(;41V!|+S+4R;7L zpC(DVS%;(XNa&u9j}PN`WXTjwk!73J3Lb^eBM96u8jVKZ^v&N4ucKNn+|Mqu;1cR{ z)gJYv&XkAmV;UW#fn$&vTJ1hKqMc8#bmvkmiWpac&maDuUpxGSvlDd2C`?cDfa9NJ zqaW|@-8#~%=-~^|#g{E!7FsSoe7C**Gf)0+L6yD4@BldC^E^v=>05g%HrnLV-~4MA zx9`B&ZZ?~AyB$rZ8}q&1o%nvhVMxcXb`CgH$A+|#GEApPJzTikTzTpD9v>f9BD#hR z)DKh`fdj@}1%B|TrNVh7#AR^eM2!RK+5(`uuFaD~G+Ig3h3jOm17SCHtFcIeFs6Jw z;QnM%7CCMyXQ8)S&J78uE%KtS*qPzEj0*5f86-H)Y&3!aB^hW@q*;!|;7H?hQx-}M zv1Fetem|Pb=BcE$xR01u1E}q_UP&J|@pz1btHBc-4Oj=(!S_Sps$OVsvW$#`788Lr zZq|CW#0Cz+h+O!t3orpxbQWCEsyNc7onlepS0m93N>hShtUWAstn+lc5&HHDTU(c^ z6YgXX&%Xa3{`BY7iG6{-z6>}%>-GHezyII;=-WB|O3qyVMpY&78>PJ3x14pP5()r& z#7%DHdfby48TcG;T|}e7f@5e-DVZ|3N&ulh>kt*v<-uVI-aynGSoS(Cwnd!}Ehoyj zTTL9l0IcwhD0aTe<0&(Y}ubU##nDRU^WJ_lTxW z0=w;Kq}6l`{HZyrt1SWb!6Vc9xLW09Z_}vQo*C?V?%06|JGq@`(x5Wk2~}h1>VwOy zX)eEhH@?7fLx~`#rm0%qNt=_(8@m@@$#ClA11DMAL{||Y5`WzI@L{am*2JktymeO| zA#X>%;gp@_I`MR-vHxR5nK6BE{YYh(Yo`4>+jD2T2&@5a)-X!hrb#!F!tq*oOu9xV zV1S!%0X1+kwrc>L0825^l5+SKwn8um+aTe(ili=|-&R>u*6r>zs--DT^=+`<)3H=v zCkG%qO0aR*uWqFkl(Hzw&F7NI5bbQ0wHaX1q}go%;GlPDI=~lryNio4pj(nxKqNpX zc-9r~*w8v-Qr5Fkw37J|X$dhcYLWE9K_Yy~QoHEI>o-D9(NR0fam7PWe5GaMyn z#(T&>TbKR}Q)oT8GD{Xv)DQrhOk2r;+oCX1QZJ&CNm)bfd_&3O4Vt9OG?^!4e+DjJ zO3}nUFyaUp2a#1f8-#IOyx$U;6=KjzrlUnwT;>sUM44ni^8*IBhK^gL*jGh)nG6{s z7sp-#C!qR<>WnF~q|9^EcE__B0AgE-xwmZB_l5GIJ-K^ly0d#>f4?eF6>kE;Aeqm+ zuYT)WFJ8NLRv9^O3sqCEt&~(O$!D17lPS%8I>V~@)Re+Rb6$K=qI0dRpL;Z7s#v3j zZ}IoP`_4B^3VY{O-tkAvAgS)zrR^}uM=!e&@4Ra9ssOjbXP?N^&;3Sx{WG+o_g3JG-~CPDc+A10JSS7QHY}h2b)hfmKLa=o$sq=?YgektF_eo$TJ47zuBysx*1Pr+>)-F;Tt9QfVc#P!d4fO zU_o+xW;&f?kh?IsRe@FR*aXkwk>4xKgxzNZrUnjMPF4 ztZEfdsmQAK1LBYT`1nrU>WWkX^|wZ?{fqiBQ7WLhI~(*eCyuHL%{ z)r93K@9ebGNH)#UiFxb;&#w?!SiS2>o!vC%7en2K8|axxuR6r{)U9Pn5evG@Hg&UX znk|XTLX+CffGK0wJ;{r1YK#wpF72F&gMd*NmWaDAY!HzKhBd4^;F8|bb{-me7knV9 z;T@^b5ACuXn3mx4+k z;^{b~;I-aX8?q5w{$z)MqeydZ@3wdRP$_PdDf_zNb!U6DeSj3%HrEYndrBz-)9k#! z94%sesWx<*Q(%iB9NEz%tjZeimGnkSdXK8Z%}iE>7uc$2vAmhKYig_uXNHV7iXyFP zXo%r?UF<68v$EcsMqwNq!PK=aJWW`TfkU_D=A}|sF;v4x>x?L~Vp4tnY(bElS#R1iPIlWq?^YDZ(1?OItdi2#meCRz zCTHaP4M`R2qAV1hsCp@^z&=pAV+3@`DyHozQ-z~F{W=CoD8MKO5*p4JqgCj=5s z>fSn+^TwjjvW!#Al)7Sz{=mK;W=fdF5lszTApGC*M=GpzP(KF4PbAsPiR0?0WVjlts7u_;{O1{aq(^a#_dqC9xu0pD|B z#1UBvLX)zLX~LypHS3m*C+z4%07;VKN^O#Gk8v6ZD<{+Gcrrz-yFNZlHd}a$ARYx# zv^_mpOlG4vUT(L{`e5%N7>FX=uty(z?6t3bts%{xDjQ)4?@N20oX`YSSm#{k{rPN5 zD;&7)Idw-b7^OaE+*cAU`Z#x8hpumvw@Sws)ozI_2j#Bm6W=-Y-HGZ z5;^0L5FBArQ8tn^;?n9m_M&9dD|UB4Oe}pd%-MNp7Y}pfSVEtERk=v$$XMqKrkSUyUI$=B-6eUaB0;=L8J9~RU7-Cgy zx0|EGBdj+|uq;*>j=x@S0D!Qe=8HMjEjvkb7y)3{NENS-@80pksKPHjQUhWoGCwD( zgt!5o=K?BWh2U&~iJAG6=^RlyEIIQc#ZX~Fva#

GptK27+M*g%7c>$jlo8Y~im_ z9Ak@7mdJ73Fjn(fjnJqACSlJ4iBnnE4*&sKCx!d){VYv&w*LoT|K0!K!I%HJn4$f1 z2RNR8;r-WdeGCix9dG+vf8-nf;opDb?b}c4N7mr1#9 ztH#m&z}A|+GASU(8Ymn@4=X$v(r-$ZMMLLl;FmZJV4zNe`Hv7cWcA@TL%im?rtcBf zbhc*AZIvtqiekHE)q0uUZkjaZK>Q^1vaTt;ezG5Vp+%io2Edy10}R!&zV!GGf(CeW znR?TUq{>qSB;Cb_n7zoJ-u8!0W_Ht8O<}E=Yu%RJs%4e*!i21722M{YbZ9~BGgVt4 zl-LOt+TCfGb1vPC5b&~)K#|? zPbeEl$T8)|mP=C3aTwN$fan}CxbB(o3f)iJ$vBBax1>LCloE78x)AZ6bnN#Rb*!SUTnU{kCd^ropY2@;qo@%Pvbhju;15-n zWLYlWbc6+j^LgazwG!^D?JDsNoZ4+_KN`iO5#m(dOe&X-Hm4`LC?YBaukCsRA2^xK zqIguM2_j=GOFFJN21dJd>C&6t^d?)TB^7A6*O1{#(n945)Re3%?4tL`Jahpc_bbh| z=P+eBAFnme;RwU@dh;)T{3nk7?Yj-TDr0SWSl=^Br#aV1Hvfu?J6GQP(3^-hm>SUT zeC#uT!!icf92~O;n!fpXbv=IDXfiq2*};QJg^c9*g%3Z|oGJ3C4t1@A2~PO`+436>n< z3T%12YrS3@GCE7WR@>Po$$GUUkNAZ>tTgNkyn*wj(;56Rp2F(**mR^UD6Q0Nwzh5d zLAR8G(-@6VM@{GN>C`)>BYPpeZHg?PEEbl2=HuY+@zpZb)v&=x)B~_!P1?E+00qZk zT@N4^Xdp=}(HoK?V+SMxtL6KiE_YDzrUMkSot96!cY+{UtpJ+|PylP#*~IR>F!0FS zQ&&l$zR!Q@50D0S1;Z<{3KR( zTX(KG{*LeXN0%>u#r^MGt!`rx|L(v4sV6`7+lcw`wwt$}DDqSj1vRCz2EZ|fr>hLa zr3Yww7hag@mBy5`A(|0x#SS}?5*m6V+OSw*?qEy;H_z&%s8@B35D7jE zzSGe33J~1W-Pmz!%`I4lz)F|&qiR1pi;A>!mSuP3j2;L9gRyc!d zH@V2qU>sr~26e_zW|d-vAdP0(+M?(Xj$Hf`UhL%73Z`&855jRse)McxWTcaZZ?@UN z>cd{Z3c?WK(5xk zB=mg#*=IlbiBDw9NKimHv+lwlTC(>o%#fcqIthBD!>Ye1jWbc$mX=+m@4o6fJO zah_9mFYqHa>I-MHLAT5?efU=;)6j^xJb;24_pqdWl04{gjtJ8`q6ZdG$dBd0gpoa| zC2dy-P=HI>Zq{URcGBS5CRVUy@<^@#G3Ig=;WI}~D$=Ud> zvpPMc4>JtcGK;3!uD3YFcnnCnsNkm3g#6YKCu#F!Yq1q31Qb0zI%0xqG}<}1wB2q? zxJcnH%hT<_#ml%S$45uH^a1b*dckBm1ssH*c+(r+Fd2)0&V6I9y&#NxprMhviFRM> zhNdXOq#~o=$9=9|&)v8o70j~^4_xW3!xumDfe)k~`Bd`zpG>-L>JEW~C{?Gg3Ny6( z)`^|@D_?Wz4Rd?04s!G9e`6N6xnJyF5*ug6{HZtP{rtO%QsyRvt_=_P`1#*ZfJ2&q zxdc^m5rAVl^6-?fi?wqt6yGl%YG`8^q~0vdIAI1`4*XDVy z5*2XOK^y~=s4|oU-}%)DIou!=X?qUe0?USB zpl+99%f(V}q}3YdfG=%IW>~3oD4nVXn`l{w6$YJBbsXdU_$&pQ>xu_448H;4Cy{rXY{96$BbKeXE3p!{In zRVj@>?58(^DK|WO{I<7!-y;vd*-)$+y1rW9+@^Oe%bUap>+NmVjuD0ao1gr9FFgNI z!#28#BCbu|S+401p10{FMzNIXsm=Z%2wKNTX8P!e0dgmmltF0zbSdSkVhWZkT~=gn zvBiAda19gtZqVCh=_W&+HE>j;!1W#LaGP%t$hd|}jR(YBhKNRsA&~mKX6fq_zy2);bmQo}Pi6R$DNO0%X` zA9I#*{cKw2Z8Y`lJx7nsoe>R~DePON zV$mWL!Ofyof+w&oII@n@AVyX6G6TtA-u3M=uVJaMsc}kgdEH-l$D6*56BtZs^h)sh z3{Tvfn!usuPb%}FOuv3U==jt#&ph$*k5lt@^8zl%a!d|twEfv(7z@H&_DW&F3mlm> zWey3?v}-z?3=R^G{h50qG$YEb79|28;03sIn5dL>0hmpHXJ_Z+LIhx*5|1<_JAzVk*h{5-pI3jO60ccuamt_+$3^MR*VFEH$pm z!os5(j{zn&%hMQ!-}iI&FG(g&*imujVH5&x35j{{doGZR!2*1T=o4px;CQ>)hNC!U z1;i_o1gJrm=KmmylG9^fRLhCWs@msd%4Gl21IyJ4=prY>fmI~i2d+JY#e8^pD1?uh zB&>`mhUcKgCsk!2Id+RwCAd+6=in@H$Oo=o&61Se!C4BpgD1c;P)AL&$^JgMvx49) zZ+g@2&W>u%Sglq`mJR2b3EY$0H*ad^6_Y_2+><0xwH1X(aFR_`spixAe2hgq@Agoi zy_0;{tM;_IUw`zIH$L)-omT`4SFb*qCzX-t^I&l;UVm^idhIN_{ObL$RI{(s=l&PZ zB-HpE)A#&-v3l$qH`@d^cRZcq>2F5=&V4360~|v0NqIb?5o322_^t)Ov0jm^LIDnd z#3apePdY2O zvh8|!3UygwwE#MZ)G$8ln69hvN-GMpK@iGtyiR2s-LO3$dx0H7R3!=$QLLr#o3w6_ z0Iw_=lZ@k{sBk%)dDeLvGK1aVTi7VtiYx^=&Q<1;)C4MvE$AWA1U<+^Rac1?9dpA% z{@jzF1ISFDjmJO_o9$LqheAaFNXFix0Ah|uqk;43O<9$atFyuo6|LX{R4Z#-6w zO_P&8((}}iceQ!+)nEHf-}4VX@9ysl^Yx_(IIh3=@t^*gze`~xHY*@hBW+jL*Y3m^ z;CEV`B1G}b4vns_C@WT!ZPj-55KczZ_+k_;-ul+R+R>Rbj_unfb_W7(V|{w_r+(_c zKHhw~Th|@-f@H(UF4guIdUrE7%!qQxind(SL|Tg?EQVqX!*80jG1l#{=E#+66Q<)W zQ{Tf^ohHS`Xq^awu~`-f4Rom<8d}n+6s=`4O~RO`AIzGh4&DW~J#JvxC$6hajLyUHfU01m@Zn(w`K;Rbe1%g~(OO&1qN;fRwp*WY&=XZXO^T+``m;rlILi5?Xh zY*(@>SrD|Toe*ieV&>hc0>Gf{1HK3uX^18TZ9G#a$lE%o!9L^j* z|5j$Xq6|TJO9QjAA21q?1@cec0*tWp%uR3jMt)X<>y9XRzs}6ajpUO zk&k@j)1UryT9zl-^}I}kqlEvRWP;0uSAVYMrkxL`Xy=Tg_i`Bb##r?8 zH)!|uaCDz-udukAgHLJC?rgVo?Oj^j_zxe|P7fb`NtC>prXy!{J+d!+rB~f*>>0wP zS6_HtBcSEV&3}F`t8xFU>ibW8WA=gfU&M`CEatdx(aS#tz#&RdXMjU89V`VN?9$y9 zIY&~+LDCUG15uS#-TB=opPT6CVrjOnr8!wlIsu~mctGV8I9*mcTo0dY&#HBG$@MV7 zLDg#Eu)E_HRIkNG8yr7Owj10ExN0mIDNN{XRpK0?DBv84jMp;xAsI(3gUu;hg-8se zede0g6{+rBEK@+n$$U`>D955Y;{y#t>I4xv_d?5Ik1|b&P6nKvP@48T_cC}~|hNCgQ2>3b6C^~~x z$~s_OTdYB{PdQ^aQB(NQFu&=0e)!Q>z5V}(d;4O3eQ5%Y-}?_g_3Q8bNmyAxiY6QS zTC2OHwKjEK5LMWF(R6GFIw_;_R)DXt|7mPQ3%#8vm_PiI*TY7C%{%@^nIn*>6wT8A z^rPQ$e0trGuC(6Ky@}JOZF#FG&3?2O!Wi3{u3`kPq8?-1FuMGxDj@^m1BIC70u;}qI9A&-sAP;5{fO$>?#eGo=;!!zB96*bPzLBB#Y| zikAjE%vaYZl{vL--|A9$%F-V5tpF1^pW;(Vx~=wJIiEkoRP)pCzvahHF!3dwsErnJ zG-gVp%!<>y$GErgIA)!qrAas0g=ivF<MhuuWbZ@D~avK?fJ5Tl!EUXWRV#d3Z3;*|>Kl_t6p zMb^qPt=Zm%qq}$6c1qZh_6A%$k3eP{wQ@I~=t0;9ZMt?-_MOP97A4v13+ zZjiEgUE&5R)fdXP4HS(VO{a_L%(JZ9M@PUJlshLqd~H#d$e2tffDS-Q$!48yw~O7K zo#_k@^mMbq%`A!>PiQ)w7^a<25Ux(P+k=Ax1l({2@Mr8|aa^p7JmHAM1o&w(gOAi5 z$B!b_Z>XKm!F~>Cus-{rX;m>vBTc})$obK~GHSOnguF71Okp*I*I}5h*I)IfHy7zT zFER}=Mo}j>@20=?;m77<=Od;4x$45~xdwCq1e65B zJ@;cuTsBC6M%+=?>?D#A~XmQLa@#A0I`dXmUC^zZFu8AS4= zQKO@FP*o~Qe_Xh2nm`-4Zr}6xser9WSU-(mbajE)d7WT=$`p%y3^ryE;)#XiAc3(Z z89H`Hw%Kd|N^SXSgmu6fz!O+ng-o9B?Cca}nXFg%Bt-zyR0so2AR+AE|MDOI>Yv)P zebK+ZL;%MppMEd4_I!2~zT+4E?T?+DzL++5njrzCVDHXQk*Tog+p4S6&L4Sp!~{iK z%5X>C9b9?X(gMq~v>rQfW|=OK$IuxU_8-I!O0v5bE?oK0@4Tz}^!1@+uv{amHuc)q zTVrsNzK_j^{Mf1oHHavBO^S+;yNIGz!mk7yym7kB9Xc2LYOp=4+SJZ==-14!c#gFf zheh42D;VaUGH;G4!`+&3)^#dUEQ3Z>`q0{(7S+1ePg)wa>t{BQQ`jW^q>=U}>&>Sw-h?byS}w0twYTeyK`@Z$`N*Ef>^ z-?irjdx2%^n@??wsTu8s@sxWEE*4w2$~zeqG5yFLFE}w#yqWH90sy8d3Yy$c`HP&;~h3m^1+d&a;Wn5GtZj?nZ_B}2I~gwP{Yq} zfAhEfg|~bgf~i)L8IBZF?^RD!o}-pB%5YA~q^TOpeVF67e)BhP-M9hIcPD+m>a(^X z(R(!Z$-LEc3g{>o&ca#GypbC?qV)ks-FczYtKN`q*bg2srJ%3G)f6`1R{L0o5+HIg6}Fi7sGIIA zcBgYP;K__YCG4ooJa1N`$&>^S)Dh|6u5n^O4AXdw7CMmXl^2a3Bdp0aTP+ z*xw&bXE;5846>-fF~F&B)&MHw@i?4JSsW1+H(SU_)vCk)haetKXf~ZJ_77yVfx`{} zB}|z6;byaTITT?wb+b*jxcPW2Q5;#8t!fJE)q1j6RMN_d`1{U{>zZU$NOtFXSd||0 zRXU|wvvi=os7Ih}*=vqgnjRY%4GP3yle^8U9(w}<8KZ9qILKRBp1$t`^>V%Mc-7o^ z_U7h+z-a6lFozR7@X|2ws#|}uN&K0s4`7kjB4`5m`0&d%=F%k&)>P}r*?(tae>U>( zeJU?VQmEYn91kW>|K^@+Tbzhy>!=Y#gtmAJxVj=saWg3htPjn7RUKF=yQHC9;=Isj0TcAre>W5BPXSgi=Hyg(9fvTc=AJ$@rlo2dsZ_-Hg@ zdr%Z-2(9YMkrxN7ZL(=yxNsp6utmrv0?0BSF33sLg$m9~J5dxDvVDRmVmoS@tX6AV zI;Er@M3y;xT|64uQu+bfz-QV0Ln<&t4!YIr z)^K|Fh2Bc@Z3SCl5WB-F3|-o`$5?}g2-A~$YMSWrU@P86Qd3Je8Mli36X6&92EMAK z45Vh`Yc$I<4aA8_TApGDYaPBcT=@FL<^V|ESlq>$4%=9^DsHxgREkkWMX7XmFkstP zY0-3p7ZMh5Xo4k7;)}u@Dy=2R;Lc}Pfl&{3ruA93PAg$4FcsgFx}VIAYkIJ7or@lO z8V1V3u^{TP@f&ZbpDimupUBoNW4`Z}qD?PF9~+Lg%4uh-vV()OY=+T`iwEk+*Pps$ zQvpU3f*)K?zx(JOo>#WbRU3S^Ey|o}ig+5jzMUtPDse|scw(ci+wGFf*7zdZu@L^$ zh2l2B9`9whw}4-9IR370{J}@Ay`oY*8N*;qmd=S9~C>Xyo6GM+6rvQ82}5*oHgLt4$~f3LWu3MWD6T@F_B+HYk=aKJoJUGHChfFio$>hjI9*RUjXPj#5WkG2iqf+<`e>(y$uw};3T zhV|&qorfNMl*O7f0p@6=8MZ14zy%IxwOyK}Fs1CrXaKy%d-HkddUuygb|d0w4d*=( zwBZCVT)YVPLgucz0SbYQMmTt|*j)o0P>Z(CIG#FjT@P*+fqq$(L)TrtdIifUPZJq^ zbm1-Fm6FvdyaFTI(HO=$-LCN{Dd~Vb$s`Ziu>Wpynqf;%I=;LwpBGzm!iNn zCHENka-yx&6+eBx8@`QQhC?r{CY(eZP2){wceKhrTWU8C6|hKTbl5&b}tk(cY1B3@Ysc;U}E z`fmH|J`_}-^)-!(ma zo_V9{s;*tw7aN3e+^ZyN>d%;e&WXOx#^5-TAU%oH7n2EZ*Cy@f(&kvo5Sg}ghPIo= zIBl$A*aF`Gl-Q=?Y!J*e2xAgWtw{m}GmNdZ)oP*P_*Nr)TnZU;1^eOMNvd|B#Eg}|4cYg`G&sePM$o5#hG4=aMet5SZ0;hO{bfl@MT%% zWEZfYyz{ALlXq8My{j>XsFF1aMlW8QQUpXFYzHyDR^_=gezHqrb+m=8?~~@*>mS6O zM7#knCf(@9i%*}7=8;ld!|i3(z3;}0NGL};d{EaJ5lNe4QCiFw82 zulbH|_<>nGLquLk7^QkOq{K8RB8S zd;s3w!KGHD7Vu(0R}`%l`xoJlb5SX)Qs#bI7&4zMXKV(|Q_@t3*S~w`Za9izPs1=+ zFPE^G*B*Rmy;;{q!N89LcuW|0p3|_Aqpj)+Ca+_kgdN23#l-@@-DVl^o6PBu+jX-% zg(sNr?$YfDule!e;dDNaqi}aRKUyw}x+b{EQosd6`uPDDD!_%lzjE~|3^eCW$`ZIr zSVIN{7jSjqcnY%%oB?+dOlF-F7kJOhysB7OnNCKNon2`W=#$N+6jI1`I19kx-*G;x z)n>ch7I|^;%4K1E9}W-iDsfJ7K1$OrYa*+qE3B8ed!B^U@LO1ooQajI!czY%#9%Rs zRU%=43T%T_6s@EyotiSqp)3!*j;}nysb+^WNk!*{ z+G!pYbI37Klidp6HDAmCQb4W0sFNrBC;V&_KU_EdYhKNST$ypg6;I}9yZ+F}>g76- z0A_T-3O2NCBg=Ye5d2~DSk}1nMpm40od4n@uH@~dC0-k@%@Xob3GtwzNXW$HA1opO zj(e39^{Rw~tDQAZJTaTc@$qU^R@~h}(89rK+`S;6M$Z|8ExCu)tVR`&#{dCQ7%9aQ z$Hfhh@$Zl_@lhD!HUO!JDsrm?jae&Y2W35(PC3NUv3p}YndC*jJU*W9?$Npy`DVSr z$$Qj;r6Iyq@g(aejAN|2wj!Z;B`;IB_C?yB8iz{Ur^*s1h!__ERrj0^r?#*~{@h+# zv{X)lVnG2l2ssw(u!S3o15c1WNkpQ=9~R5g2Kn~u+VOm>bKF~Qz@98#rpBpY-2C}s zN0Zi{D$f+O?L|e1!r{C#q-1^jxBs25_^NODe7MIij@K6l;J9)9i4T3`XW#qlKhBg~ z)0a!w1=cB?m@@8d+1r6(NW8FomTDY!VD=rQ)ExM7-(>v3boXHSMxAu3YeA(I+oA&m zv3=*#!Q%iB1pPWYISdQdcx%0wWl5b^jW)B*iOnKNDj>V=!qXl=p^lB|RyS)sL6AVE zLSZUEBqHGAOa)#S83r=*>P_C%+ty#V6oWO5jvJpnnw%fejom0%rp0Mlq-HNFMe=#^ zlS;plO#zk;gx{~5;-q4|#WLtkJJxIPo>}N;Wpk1tl^?+`1lZ7;hs&c z`K(S!E^c3Xc#8L&-c1plGWk(fswE#@>c;!8TMKWr7jOAd6vwZj&R zp=kBN2x8Cim{8p=GuXy(><}SvURBGsRW$a-iN<4i{lNE@Cnr%H zU%Gr{wZXF_+f~(l1}n7E?#Om`$L%Dm5scysvpFJmSbw%y_5gA%tbejz!A%}qxzfwP zOkGyXlT+7q!qMo`?j9CGiYSxynk@iJ7=^90<>TP#X0v~A5JVAaJS5+1lE~G~k}XaZ zP$L}A$l{eG2nii8uv{0Xr^(H-T3h+(Q61CAElmt)ZW5Msbrs6IrF$*@d0)Ks7y1MILGBy%*5DDeVY_`dH@ zb&OC%WA!lQn*)vx!KdP{l-=c&rkACu8s?O54B%!oA=lC=(#y{pqHRWQZ>$q0%xWy8 zcs#)eU+wwsrHkf;3qw=&O*Ir%pOo{_I6XT4#IOGjPItj(tll+;ORjs-RZ{Y1(*ls` zfEs_;X8!!c4mLahjUmc>56-pIv>W@p?pVn0@oWnnxmPW}B@=ED; z$nk-pBY%R_*N1A$OeZ`yBt*h7;Eft@LiumYsAsXevQH ze(4mT4Y!aob={f$VjZNd+HF0YwEpGDorlzt?IUGx7Pf$8%$25tX|9it@Yl(F4ij8cTC)ct8IQ+t9PdtNt26;z zsG2riucC-{lLFb&APIbM;ov|xh{!7430V^iTp?J2s@&4C+tJe}mhGB=JM|fhR9j?4 zS!0!kfj8Z~z=TBC0c2#-L>Z1IXKYAysoFu(6wV@>?d&f0_Sh*>mW}k0P%dj2Mw6-M z@}b~VZ8kSBobv9b|Ko2mXVxy-m2FJcMY}aa2bN^et`+ zsUFYCXXple#`LNxfgj2|rSumA*&eH2@&M3<@y-uJJtlKyjUEf*2aXaPcU@ z)hWcFNeIsVP@87HL9$rw~_#$c9nuq1T=Ljs3_n*dZ%3QY*LdD%}uSzU)R zI)fUr;K~vDSJz>U63#5askSXP4({`V-`dQcdF629Mdy)6@L+J$yLDm?`ZSKKranHr zyL|q-b@#OCw9x4v4xL>yC@UL)1AFmv%%-;(>oe!+i%;TY{6eZ$7S6|m{o z(C-Hvk#CP9YRu(jrHZOpzr833;=F(JnamtQ1pL+gosXL}Ts_Nz+EAuIvjtUwMEb;( zd%^@$RRX7&0s=T=OgvXHZowA`;8WwWcr3ag6iWo+<;izSjF7B6lGjz>mWV$LNyZjM zcW&LJlxrB0HU`h7A4+*@u%wh98anvq64+l`ac=TC1RYQ~^8i%I$l%D2K;Q3Z`n$9muNKown$tl zQd2nEcUeQJ2GcXzf{migY6MJ;NHR~0M~lFl>pgZ74qoeaOW-Oq4is*!y4_nH1&t81 z$|ztS>#5uCl~zyHlMWlnCl8}$oHc>#s+uB1)1Rq^U@PTAyR!Nw)JU{tn{cB2sxjBC z(a1!;MXoJRnmlEEQB&QGWNsWZ(H_$S*Qty?aax1L6jC^Hz{E6gsP3pOmYikt9ICX) zh$#*@1g=%LeLvS{4~+nfbhb&e6WcTup$BDSy?~i;z!Yf_bv`rS*Hrepvku&jtl@?l z2DI3^aYmj^@vXjdgFv|i(`*o~q?_LmIW`V@gSJ3oLV6wV0PrNAHZ zwBuYENe}=Man-HJ5e${6V=EFOOFq)T&6~O(IS=kX{)7M7-wV9x9(AL--bPN{IoA_6 zgm79ZW~p(+d(4lWyaAr_7k>6gI4(hG)$jr?S~*5?fn~gUe)8?~jg- z6irh=DgsTidwu9StbMVkgf5N68rRvb*Z4x5KPLty1V25zTcl}`7vuT-?(y++&poGT zSQ&W>Q6srbs8GYs20tD((%~o#iE;v57%90_>Af5!&H^9SO4s3d!kiocP9&ZG_vaY6 zciP$wV|>vchZwLhsI(`6br43b@JwsM0fmomS4&3Qe9&@w(hj7Qa!H#8@F&u{K#-i? z#LAb+DcKH%sJEN&j?!CGu*IWg<75~F*mYDqm+oDm;pgZR$l?UPTKw&lL^ zm3@}A$ICbfB0s?GOY3szoArl3k=|Xkz4ln>&ict8Hlh1(d$l)>rZ2g&xmx@W|Ku0Q ze?|3IPO!h~^{t8Z0DS%@!ipA%t;xdm!6Nf?GX9o zX(l;58j&+P-GK~dY^oq7SA@$vE1GzoCXDadc8k-;;&(*PnTU#H8f4$6LW*$Ek$^+ZAXM>RC*sRsrlxvnWj3uJSL)YN4%bKAI89T&sPG_^ld`2!{*PrZMo9sXO;H$p& z^X*!{uwH-mfaCe=AN<%Kyo>G10Q_a&6eQ8s9S(VOuA%9E=RN;7+t?HrorL579JW0aaydq_26uSsdhOs#~#=(}Znou3v0A4{i6iOI0^*fWW zT?#AM28VW|m%V2pdSMY{#|zSJvCXS>SBnw_#SQ50WxCu@Jcb0=Y`w>h>)IP&e945EM|KJ1@G8A*KgXy&UvQ(&okkSG_0w*U0o ze&FlA>f6oxR*{HS%LNIXxF=VkNg1V)ERGV;QY_Sp6!PZHo9}zidrps!(>%GIKV=83 z$8U~P)euSocwZ^5HKSQ*dv?BMC0j_cO;`@Ow>GKSrTz^pH4hh$E?!o5XA11Rw{3$3 zSGBZ#cuceXgMq{tbKMV@xyen z13!gux$addquWrDivDB&@)b?V%=X=OyRC(PX(U5~_Z#DiagW80ILHb? zIoyfup1FBE_@i4lnN6wc>F(|b5X7;I&AJfN?^?DS#X22HfAjh0usBAu*`>>uH|sSA zTy5$gW8F`tQ-M5LnKB<<*7b)!`UjoV%i*mQs|O$su!YL=V;=%NXhOcus=1`Qfh<^A zq_Z(penJ;zS}MnqFpoJu+?Mfd&elK4F;KR&>yq`#4MOv*eXsu<#Nd;HiQ^92G##V{ z1Q&6hTC2$-SL2D#9BKEfv2%K!i7opRYjS5gO|ne!)4MK*Vhrgjz!^@bQ#>ze$u!i2 zh>%%v1{jXEDsn{W2-!1Hc%MurivIRBU-yWY?=`DUakG(20 zPjO>BC0C*{Iyj|K==^bj16bn&FLqCR?dqu`!ijD^HX82{x2)+fr3ZL;-z20D34Zvc+O$#$)E&q`1+l%oDW* z9A~v$I?`RC4?TyxOsgfHFUo?eB_IN}D()I;4wKTxG`H)O;0#msz%mUcMCl?(%VBaw z{UThJ`u6St9+A(`M6!`Qv_;Qp1DU3&Fj{Jgo?FQnI>G2r;E-}uSr zpZon@s|WaZ3LH?n5@t?=86P&=?cHs1vbuZH6mYPdsxw{6shf_j&_h@CH8D4PqdKar zQ6zybx}(rZoscLFzjsHbH?o)o0pM_{$5v2*-Bozi-&9@Rmbagu{wYu|kE3~GmUX-2W0|(bIYZ5louBo|4AnUWl24RDY;w$x8 zRqT;4%alfuU}Ue{p$SD7N;QxxrXXD_l6sKr3k8J4Jx+C(r0hGcnzcCj_?m2a8p%Ul zY^BId-QElg%aOdPfjE+b4W!$_O<6WW)~_}t4#j>^p*=lwiXtn=Rx*#o4B_0HK0G@o z+tjE#=CRQpyXW}!sw_BvA!K=;`g4&LO4e((x1)(tOtvnUQ& zB;On~c6SJ!2JA?dltm`RW0QsmQL5uvWt#f2qp*lnQXDB)F+Dwsr+@1||8E|-^4RAP zMJx4+_CDQk`}`Vu`B}tWslr8*DGC?2Zr=QV-t{h0RhHRN`%Ejj4bOL$hg+QI;$Xrx z(4Dn~YEsw^A`kCb9VNg_@G?bONveiyV>s>D9lNXOfrlPJ&@aS3Y!qn78JhI$AX}(J zYeP~a4*H+mxf8~Wt#|hiL>h|fGYIAng5Vm=8GD! z62mfklhPP4(|2#(f{U%`?;Xbj5MgH7iy{OCCnqP&lnmNKk3F_NK5FX<@p>4KSVHQ$ zJl$f2!&S7>@Igf!LT9GvKJfb=SuIa>A!u@hLJj)@=))(|xv$C@lBe*fG~p;te>}dk zOY51FGo_!&^j)`U8@S0vh~8LUVKXUr7I`P7-vWri6ZQ@whJk|yw#1}>>C-sIp3Nmx zy_aS%#cc$fQZ~zys{<113(;0R&5O-5|MVaK9QHSvxTIqB;7d-=00)V$YNgqR zx9=^;r-?U|m1qqzac3yHv~(~1=)WH~)MVF{T756j0sa-PU6&!3GqHuf!{MY%&4Jij zZW`Ve$D{I$Ft@@#Xnuu-R7iA4PaK57>U2r^3Lym-esL1a)Ka!+q;=P02L{Jjgu2rn zq(K#Tm==T;3a_gLDsho|s{F^nR6=sQr{x5O=YsFqkO4r@Qe&uTRo@B2Im5sLwzz$C ztOv>i31GzwpT+VRL=<;8*B!*~U5D!&Sg?@JP%@MV_bx%nKv2uFVpWHuQ51z$Sz!so zT?OR*poR}LQis?UeB{epP? zSptrmxBlQ0pZLwgThDh|O|a4ET{Wz?cUI~1MRV4G*43S+lqXb`0f@mSC?QE`Jy?N} z9W{M(&O7c={{dLU9b5IbtCAMKsnZTFH<;T(WG$+X-SE0szHPp{bGN!lTcCHNZEYPE zhfT3vl~~m7U@8(!g*j?N>lb$E4rN+TG7}EK+wt(WVBObkSL%JE4fsK6!uGbN+h+lU z3Jl=f&SowZsj#WT5i@q*H0=pOU(UOdk5r(qWN-Pc?2g0c2gVW_Vjzmi1-}?;ts%5J z!k$i9EZZourdu}EsB$*xDYTfl6!#LwKI=Z!lDeyyQb|K2w0-K~of4yV~yK`^>rz9B;=239K zwqZ1|clj(D+pg-BF!7fxq&@aWuY{z)*Q?HEhz0wpM#i0jZxehdTE`lR+{Zuz7cG-Fo-0{0bBPMS6Yn z#9(%_co&udU{{7y00VoI!jQfcPc%Fxmu}9vbN!~lxkvBfCqt`{Ae~mxOh>gu-vo20^~A+VGh`6d35Iv*%8QTXsc#b0);SyrAAx`D_>;U zBQJkBfI_z2;zqliX>?m^S#hv77){s|Nqv(AK1lyDXi8?Y$P2(D&V4w}cD2HB-uTwH zB}oGF`usCb!LZg}uD|%yQ%~V(1fI{SfQ}+| z(qu|0C+1uMI*>1u{ z!tr>V<$1DRb4oV&f2n)ZXxq~3I%xO(KK<=pQ}4ZMRgFqf$(9||#Ksn}Wyf)k6%1q$ zVjMC|aDWUF61rdl43ZxZ286^ALU7^%7+WNk?I?CxlGRv}t*%;C)qC~2+n;uy-8am+ zzH_dg97n-%0wXta<-U8*-DjV@zx}Pb)|zY1pb@?zPNSi%j~PU9BT2u|O{h&`h=DKJ zQDx}_;kAR8zVXgux8L&~O(eqb_$+T9YGL3G2Y@wPNattO`KhtnL!zLSt>zeSy>a82 zYu9KSmLs*di&y{SKk--C7c)(q41oMo4<}k`x?8{@k0&4MOS^nFW!8pX z!G%QPR*?Pu;o@^2<|DbYyGI-;BPX~ZB!#r9=uipFWz`6=cs`xkB;~M0Y70e!?QrZD zQV&7&wWK5lfM^IQhj^vylI6k?77M|U_z|*j5(HQLSqA^nISs1j45 zT5b?UL<}{KPVxI26a^9Wv%zo>g%Pf;lJgl3hfHQH+FZ0%b$WXG=4)TZm6RCz(Hu@H;ua_4woOdg8J7KKOz+Ui<8Ce)jLOrC%|T>U4Uc;(xEd@#*RO zmdXgY@HrLTDJ_kS{y*?U&%#ggMePl&e8$;V<%lA)(F{Uf-);(G?zZacyd|;2XKn=i zfd^*i^3LFzcW#{b7Za?i_0ihDnb$j3VQYiqu0rtWDvA3_4vTKDE?YP{-j(Jbrruau z;~3GvD|{BIWf+oWboJ3TuCP^`E~wtIkvX^YYFYWh$KDNs{50>%=6sba@eFdIasCd4 z_BxV6#0JAAQlWRHYjw!=MKcob<_{4LNj`0~uGd*krDNaK_H1v+*ovP|-&i5=>UfX~ z%_m<|KXMD|exyWPlAY)@zr}kOBJa_v^h~oms%Z_L9aL;9nv;WASg#wvF+W=})u6aI zQrMnN!4FP>-oJgSkpbEVvRBOohZIu3NO5c0$)&&&1Xfkr{Ws1`Tk8$|-jF+8Ro3}h zSQ?h*`Yg$;W(D?}s#rT7i7evfW+^211ApL;e(Srw&yu=Dx3#Fa_>yKDX&JRl#UOI{ ziv1_-jSER>O+=~h-n;krKJ=jlRmMwXuZV1eG2O6m{*=nlc@X4SLRAb9fe!E8!9`=> z?+;pGZYn)7?6U>pQj+M76GoJTYV$N%llO|f!wq9xtNDCEhmJgpha<$0-Mzh+U-%M& zkRODSma!;(c5)1qkgrn~eH}L*3@xlO(+Gy+`E*KJXwyvg_OL0x_QIFM^u!vBC(1r0 zTP?_Fb15IrF=$F(iK3WP_=N`7hQ4RWw8H7(A}+)QMXF!S6{1Rmw>~yG&Lo!Yae*; zH}Tc@;IWhsO~HoSuQ!)3{P{omR~2y#pZdx7t=un1icg>bhxBgwP#;W08B?s%un?B4 z>XZC{3wtMPsWVubC1fGL>pk5T;Vz(Y6ZGh469=87pmMT*Z)y4-#UQ%StYb z=Q(Ut6QI~Kid-l;khZRaVADTUOiR^;jOY;8c-#P-Vz*MBM`yvyj7SwkVl)!n%Ft_kR23N1k=PD2zvYm%qBQ_0P`NKS{vx z%4^TR`o>4zyz|*Fzxr{+ExU>FgibE)b&cL1?p!)}Dl3+!CvQCYmT!9Ok@qa;K!Pt} zDOYVl7)~E0V$tdG{aZJ`pj&O7*TS}J>!LMX5-*&{bVAO%)_G(5*c)5cTyqfucXVKj z!QKRk-kM@q3%sT#qpJf}=pk~D#cX=mkRKizJD!k5S-tr7M}O#l`rv=p?~J*fH&$!q zhDm-sJ&5(KOn;G9lZ8?A^x8K%OLtaHbgs<}Aq;RB(o~ISv*|c4Ca{R69&Hy(El#b? zmW9%e8s`-GH<$RNM$v?(6=OY!;q}6nGv=lG#M%n_p2#VMRhY`pwY-%>khQsln`|zRDXZE`8^ym;!13MsgG$gY0Yp6>O{d2N(rKq00 zejoSq_G@3p7K^>2(}fFGsvlF#5PRL~r~T-o>RCKLU6r5zVvI}C z?{`=s=Tqb9hmBFB2hIhP`vc$cevN}#1|Z=-xDNwx{0Be!-$=)Y^V`pC0SE16guA1O zvx#k+yFo9Gm#PDwIzvWYvDdH%k&4`V5bB24b9j7P@DXJl|P#l&Gi?T9A6|@ovtL9%yIc-kLDcufA z7v?e?&|=kn?&e$C$*d~y!P}v{dj~Vg&)!N5v2T} zAI9UIgGYatf&2f$g5pQ8t{l2Tp|;dU9O4kzK4x4uc@i z4p>vfHARodXHdo!!=uv_QSx4{^`=b3U~m`it+oZWimRjlcF7}=V>{PcYsVHkUgUE%Ec z)k6XHlw`Hi47^QOW@XEUh+ZrK)Z3`DM@@h=u{5#CX=>zzv_nqdYIMOYyGbw5R+U!C zz^7@5l-GukChr3LA-!iMbV+-9Lz%LQyR5!!%Z1rcpBu3O+uXXb*@0%Up{VKlVX1K( z!7h{7N3cIh(yniYJDwNP^t{Y!y3B0mittY#?H=cN6HJj$?`t0+s}cDhDzFeW#Iwa_1q)Ho}C#fGuxo!-Ak{qnfy80>QsBr%*&ZxL?Zj(>lX^8!@ zz+4JKh_{@pWVJ+6(z_NYtB*`W{M|B=7BZg9B`sc`YddpQLnR7kyXf^5@tAXOJ9YJ>|0fO+uI?c z7fRus6DyAA=4qx&Z-rwuo$y~;)*i4+_j)nzW09^o=PbQ8b$lt*H3qwRyxnTT0E-Iu z3z!MF6HCyv?S2^IILp<`%>mL(v z{F#6M?MZV74@0@8$!c;~;G){T$vxRO8g@>xIqPnWa20{)+bS{EJyVb$cv9;GfyF0!FbMs=F}<>@?1v*v4)bnug}Pme_Y` z^{!vLT|y~>DxcTE$bIG=&y2OJzwxub*wtMe2<1m_7iLvVj8?Bmt4!)*C4rxlUwWA~ zIN^LzyEX2igCJezb-KdFP(Qc7+ln)J**43OZbaCn^dhOsSw3mm$Z$lNi~SbU77nQ< zglB%_N-3RpB5&F$RXs&e5DR;$Er{n?CtBm1E8IC8_qAQ(;nLUjNH5YFrz9*E9<8Uj z?F{*HJzdhh(-Ku?lA(knLUF2*X+^f^?CC;Q?Zn?eS5*y}EZcmq9v5M#F*OPMZk8a| zw91?ron^WDmXjEd_o2C~>(%mYPd<%UyI8NW0b#$Kuh)uFSLQi|C|pm~=Xpoy z99Aau3UOu7u(AEXk9+eedl~6!iOtbAtxO64I9rz_eh1fKc7BGC9S5Nugt$e_g+D`PULC3WVts1e|sx4-in=;SWWDL4&0O<`{!5?dAmizVVKD?k$jP9)Hl<@^5r zm8)1kiMXTTQ^dVqi9EQ-Czr0^vP{p<0V4qIlCu*esyMk1{rrb4;hpfVH8s*WZo5(d zu(v!-+%!jIra0UY1PwqTB9^pHXz9{Yj8awImEKn?Nx9f`uq4hdi(oY%hQ(}_Wtk-k z+_iXjAt(``)Rishfov^t56A5+#U+H|dddn!D3hH~CN-&l6f$^%?+-3t$%PzP5!&Sl zy&`wLp*PSMmvS}4dyCmz6t37-Wcx^c3ULwxxEZ};QGL4i4RPeZ{q5%dKH}!_{W(so zuas2UIM$8(O)n0eaf1d-&@wwWG57)x5l4hn`K@nXozc zxryTl*{s4TRY_wwx<9Zej-HYLV&jh&^}lHAaI(kwcyhVKeb5ZQM=4O*Qs99M8HC_fu3xQx{bW5zFeB$GCYN~7whQmZQl=`e)ick!xpwYxpyaBrwCNz@g(lWhT{T2AT&LE^;#ji z;HJz(Bw5yqtYMa{$k6n@VuD5YRP3ROE<-Xc*@9u8`a;O1=I5tT5DbAlILX4-TMF=z z1xdy3@p!EC99f6!Iz__3T3OELCd*RVY_UMhS|{t>OP5BI3BfKB=yft*5GRHG0j0n! zGhfV=6a6w-w_--$7l*1xpL%AoT;Sl#B^BK1=DJ$ox?OwhiRpBTp9Aq=U1p1ULo&aP zw@^9<%jp@Q0KMo677}o+kb2>R5BfdCUjU#-pLhbhh%C}5Qdd1nky3}2Im*5Y`u2GD$G)Bl3J0Ln7-qi)oNw>^BcwJ zk$1h@>i4p|oSr377^|_#PHWO4!O;SbQ+aJEt$ow@zz=`_KWu*{>TdN{Zol|S{mVc7 zAASy--h18}%d|Lin?hK$G9sjp20;|CVMP98(J1c8Qa5^4VWte^wciQ8`{X z6BJ=4{i0EZh$VG_>nI9M>fx4ZOsV1B+?ZFE(pxb_>QuT2!hx%0+!SC)2rl@m9>R9l zQPf27W2g{7>jl|P8!0T>9*M>^FN>~IA%hhc1IrJ`r|4%!{fspp7M2Ms;RTWID`Yhm zmqk6S?n}iY@O=b~g7SAd4ycP#yDHE01_Qh+&4bwDb45UfYIb-pU~8bj;drDAZACSV zfM|EeSLhI9b4|fNfa5 z<&Qm1@ipC}h2K;ZH^iY9O+7cN#?#3S5j6p+B?zz(600GVxTa*(SE8Sqgv0eLr$V{X z4l#{#UAc^_x-!0}#$MXSo)g<%vPhSNc9ooMlO|S>Fj%a>%hK_K=Ol?Ib z7Y7J+16Q9V9nm;aGrGcKpn!=TS$1sWgW!(nJ=5v4L`T_@Qpq@0WiH2IrxU2(4q+{U})`Qe^J-ud;uSt4HySEB_w08TG^hYIt8Y1H0jBXo5df zZ9~&GvL%W=YHX#=)r&v!<)Bn|NW1AgtHqg4_m^ylhn{M%bXoEk_ugK!)(&&PR?4N?C(HT zrXaL>oz$P*-}*k&p~U!dk%d7o2nk+wQ%jO1-~pBZ{@LcK(oO%sAO6ALW-G7O z`q^j8;kU?CkoNJ@pZdu^`(b>vfBx-5c?voa!r;mQ;P6~)ZyYnlXBA1y^D4_L>Ic?r z`rLNYmp{ItsA@8hT#F+Ts~v`NDC$JqOC&k~{YA(QNm4A5XjpSHq{A#F5Dzvb{!bR9 zn&pw9Q(U4vOL3@Pzi(6fpWI|tSg=L2W{W+{P<}mL;2EZ^3M3B6H!Yq5zEPU#QYyn; z0bT*{o$6VbQ^H# zrA&-#$)fb57>`ff>j{BZ@@OEBFq}*#qupKQ24_m2SM5lf;bHloN}skrWXo?1`jBh-|wt&sff`tbY z;K20QWCnljw8%R10y@T@ipJO*Y703o?i zm$gWj3VLa@H1#Q)$TEw%HMXnGV+p+zk|;5oE?nykED$+NThuIr*j`vo7wJ^)a!s77 z$lICutgsecGB1!|_+&LHQ4Jos+g3A#X2-Ik?wYD^vtf)nh8x@Cha$Xh*yHYiwTFZA zO4jXqSy0s@u$N~UM_%i8F-`lUXy?*UEr!)>l_s28DDwK@Coiiq@5Qi*CbAr^0v|SQM^Zctr zVVI>E_6Xb*$9h)rz$zCOR984y@4g!Ja#*5=KwKM zxiu2fZ@h^y1%O2$=Yr>6)BxGcaWII}x<@2ESNCMhEM z!IdkcxEJ~U*?g9+shSB0g`;_K4;bj|=x{t5BV_o!0m}ecitB)ziK{f|5AnLc{F6V4 zk3dqe=#eOhCNu~kR7ycY)jtsGkdI=aD-jNYV0yL@eUs6`0aOka;J6R1k7;7L{kff{_*Cg9-d5eYD-lj=X7klL$1{A*R@dAMp>o+)gk37q2f z*Vt*ohhWc21mlG!M2`~s!t{Dd_)D}kYZ0@z$sn^#EKF`+Y8FEf8}1h;GP0}{AuL05 zjS%{&i^A(ns*`v$no&f7_T_4+7)3I0OHUJ3z)*T|#HpUI=FEXV@bG3y!m&~rFH%x$ ziomb@Ze-xj;usohevb0I=k>7YDUT1E3GJy6dn5ehV(h3Bt`%}VF9==SDsg2~@R6G3 zQM7}v-Ca{u}}mZ7iII=SQ4giQ?O@e+HkZH$?t0ef3M9E{m18J8=>yPjdjRYz=Hp zEaZ5uJPxj~P^I{R$9J$d-o3ti>G2y+{6qUPzss+G1mO78r~l?J{^EZk zN+WO9{*@XL zyDe6$vk!mpr|P0r*PZt9JU$<6uWvaaPzy1EqUhj_IAFG_X*H5lW&>wpQt3&j6j;iG z0F*cpm28B^ssSn?7Ui=F- zp6L&r)mbKm0W&?z+7+AGHj5=J;5&we9oQeb!N^V0VtPN(Y{L!7lDS|;vo+%=ikBd0 z>CVVH<@18mDDyf(a_d?+H9vIx$XPE6uELNLS@e9V071;UXvDjl==<)KcRcd%{_($X?a~cR=%4MjR$*@^O^Qx2UicIDt7{&bQvKS_#Hv38I{B67 zpTB$iHd*viMFph5dku#J&MCOwVm{}@qd~5Q-|JJYt1NZ#3`O#Utq@Q5<4--kSS-}+ zAGUA63;eAsI_?IY_4w8_Mo$uDh3ZS8LdqvbC1UP0&K?dCcZ+1z-`PVLJ3cxhnInqU zvvUA#K$5@w)tZxdzS=OP-MUPdbbV)PgLrI~!7S%aRmF?vF+{4h{m(I~4zV-pchF_t=(hQMOKY_x9K| zw{0STvYgGPxMgf!4@UhcI$bPSUjedMEpT}zMWN)ukLKRuoQACm? zJG^)~Jqz(+@xRfyshhLYli&Ew&n;xAM9q=1i^O8Gr&JSU=C-0nq)shS?Dfmpj032w zA4rmEnrez$SA!zDz7`7=Rb0dsXg5yHnwW+cYW$KuVKR}SOVxz8Pf8Ak#C{-XaXGON zDsk&=q4eT4oI*l`lf)Ou#-qOEmK&(+3I<8xzX6^rMW{ouEIE)V%ARDB$^{pDFzo$? z`lN*tB-J(3@0$CocY6J{ER9PC!*70XfcSSd<&u8&%f{aR{lEYB{YP&M-uru*1C*?{ zf8Yb(*EJ$dQT$b{ne(~3m294Z$u}3-V@qrG04AdZ+CXySCAdAp* zF7Nh;-5X^-sEH;O|6ei4Uw(OC4L>Ut6EZD0IZK=*wyLDm*fiQzY)Nt&l-wCL-2-3a z$On(=h(w_3ywHZyaS@N{Gt6-$LI>RJbhT2nQ-5oLi~W&vCG5U5s#CUJt!&rjXcbE! zf{r+Y!vcxW;JL@rbtqZO44}1I%=v(GzFqA~oifrSN3bgOZQVxA*-5@JW~)nf?Cnj&rVK0_nFV!eEs#K`}dJl*wMgtbYyzAt!G)~`?gfE zaZ_+n+06C4a5+DE^-G^5@k!%HD@lzaI>t|;$iY*E|B3iI_NChO&9Y!mz~>Awk%zR) zT*Nw6{}@iL0DN41`0e{w{z-bveJ#N8@BFd1%og`F@k9p{P_kNrE!a{~KJS|FI$3yd z+3&C%UP5)mI^{yPL!tpYG#U6cA@c~SW`F;YsNa9+p(l$nIXS$0a(w6H&LJ^`^y-}$ zAcOfC-&dqXaac}~1k;TWdvvC_86Y%hj|>t6s3t!^&a1u^Pbkdq8Kx&e-!>TaV8g;G|4rosOMmi;7+s z^)Va@=%Y)@xU$-T-Qc0K*ux+K&^MMPitEg7i~OWqmo8#b!zSF$Zp3j`T}u~*+3IfD z6?cni!UDKsZTJ>=Yz9yFtj zaCgE>!T4IQp+u>s21e4PbX)*wBVSiSQ?)41TD6MtdVFtzS6*~a(p7%{%~M_+*V;K4 z`r$@*NYyaNLRe?ZSqk7155uVE+cFRf{K0G|uUE%O>lz)E+O7T|!18XE<>K?FS<`&m z5B$)-{6~JwcRWLA8O>G)%Gee#nyt)+CNr^$?{cAEu2kAv*;etrEx-Ek^UvS8bEl=M zRn9^%o-pRV+%&VCpcVVzpwH^)!Ig(rYiw()9 ziy5;B?98Xr5_?{<@}n5r3I|>(FHvIm0V0W`2!R}k;o8HG^!j~-aJ+zn3Y0(E3}Ipc zu4H7CnWAWV>M{-*4~HY1Ru~?hoQSWcLv0{oB;r4-*>pJB8SU(*^BERWngcSX03zd^ zU2Go@?H{bt^?bR^r5?LpF5_OTyx$P<){A+bA$6;+T)B)L+zCS#N+F#fg(q5lV5{K6&v9k~Yolu-e8S02L$|YLovd*Ya9LcB!luey$l2n< zo44R4kSA0(Z6) zl{*nTFAAwkadl90njnMUaJp5TK`zRH>ZBa{epR;gci0~h5`ZRM16-C`4PVH@qtZ-W zlYb$!5|(7d!kG0f5meAN?FIsrfb#9O8o?C*^rC%$&Rht6XYf>&-R#xf*^_5(Z#dSb z)5$xYvvAE{d2MsOc6ZM*X6^2K-@UWjs|$jFAN;-_P`?a{|4MzM07scr`RsD}(ZgSV z_~uW4IvS29m%r|o_gZhm6PN6$X-TBm83dC-fa_3-_&_e+f%H*BLN&<0_=N%WxFjxa@fc@D6OHH^;yL@ta@CU&Mcm}vB}r$8solclk8KAkO> zt00aY$7YRC>~bt2Wo+tZO+&(jriXE4Ib08FrUttN1y&rQ5TFe#6?s@&Px#BpV#d0T z>&l#Vx17&Kie{60sAgr@8z3w2M7Ki~Jn->{BjgLa2mAXp^w~OB8{4u+x1F}rwyGY+ zcJif`$_LQ);r;uc`t0Y9&yLAbDr$k#ooP5geQXkPz2R{?D`^Q@vkduPU|BiLe)PkC3pj(Dc&>~F7z#+q6vajwA`MB zaE{+*(~9`RH_A1ww$`Uru)}1cE&vi47p=fdkDHyVyAMC{l4#4 za2&SHlExca$^+K)3{^^LWKhM4&7g1B6e$-K7L#sm9KH=rAP<5Pb0cI<&1}!ya3-m$ z%X?gBZF)|JQr!Q5wp8{;9C|ylfsI|Knz%jm{B_Ghq(AXWUvHev1S!W)a(QcmRwl(+ zZq4cv588l5+Y-yaZ2a1&+QwrYQbVHamrTBO*-WGB{_540zvJa6h1+v2c7Lqi(4)zy z!^`{PFW+r_%@MZ|gDJRDbu#hIdY^ZFB)EL-_jH+Nn; z4tu`i+O&@sJi)MotxB3Zt9g2Uv=Gv(wg1pq4V<67KFjW{%)D8TjP7nr9i0r#YSL0+$FwM(|JcV4 z4-eZ~ga_&x@vmbnT(KnSAR$|;F;SW?L_I~b$SQ1q&i>`g1*bL=5uGy;&O5O(M{?PxvAI_UB`Xn=1rVse>Bo$vjK#`W;Ys-v0u`mP3jp4JFEE|`^fI) z%h=S0alBkEvOFs*f{FDi=??~R3d4|6f0d=AivCHB& z_%Ph~EgKvDaPjGEK7jQkVm$X9S;WmBu%5i5W$#UsT3wHah{yX@B^i6 z5yf#SbP1-ySw<06saRl#13plq*OWb@Y-?MJFq(QKD-i)}m4-%Hs(i71VAE1MQB>C; z_`suA16j~EjDGaB7@&9JAIASrT;>_G18Ko95trnf=7{D-ZeQbgNLz~vYNRx|WqOn9 z5fZ?*1wuMmwvL-M>*o9OR7H4(H1|S!R@_;<@3XA@(Q`ppJugZ&s_=a-R!E z{pCu#aYGBkFSmuWPOrUr@3ptTb!=MZWD$mK z?lWJ%{Dqe<;a#r0^RDx1hhR5!12&tACa{X-xz+7hW{0=xqdWSz457m@OH5R zk%pC>gyc@Acql$;vRvRJ3`Qd*r$NsVHto!fduq##LwLL7hu|EL4B@^DDU#FO*qqWe zEsiy%ctJG}O9Tb5X*e~fGvG?6evHyW0gu)u-BsvF;tr(g+}lgf~~%u(ZMVgg#1)abJv zWdlTthA5Tcd*mmis+h)LIEs2bApU|XMBE$zJBX`5%J4wcDiOF)6&{e8hv@(a!bD z*Pngn9q+$*^k(Nw8_I%Xs2jV{jW?hs3@v-ScisGIBiyeAINo^eGe7YkeKVUNk;zQm zVo88jtE?7~w;}1f=1R37o7IT!>1kyJ>@^q5#_L-E5K0wPx-eQ(c1~axNfVEw;c&6_sCaPf;>gs=$FZe^&~|Q5H1^l6w&q2txYTqvv^t9U@^iWoa0UW0 zs~~n@RJk~*m2Bc*qs5VH{zTTBq2b)@z${lav0kI~{E!Y8d2QOv_>~uEC8W`Q&+qU0 z{j+W!Xjxr)r6Czri_^-h#;BR1VG{{$J9gdaD#K^Qy*8v8(MZy!yrXnoNph%9!^?5- zb(5pdO#u|}fb<{b4K@RF|7uTpqG}Ykn9Wa9&cP=2?A4X1@KNs zVMgBwN1it#FiFnyEU8ReI^migk3A=}fG7InfPSrKsUThBX#67DNgUP8tnQ`)Tihqemj42 zUK}PytpSh)5BJrdKlCWQS1#>d``5qcPmKq=>W7^SzE&49*TNXJMKILZ5;ZpM8SJ(f zqU#TQ;cv5|_~`Z(?`4 z{_rD6ZrHtEE)a|X4#@Q6EJhEHA8;04b9#2F%CpIWtoXgFS10}crSbT9I$en>D2G0z zB#RC4_}(2XhTXkAGG#2A4)VZ+XXn1}_2PJUJn2XA@oa{Tas^;PVWqkkM?xoLAq}f* zy#RnSZ#?z{g$KlA9ZR9;HWh=6w(`YzI3xs$d$fiDT1pZiq|x5~h5QC@&2o;Ay<@u-)hKr#UTDJ(@ zzux$hmF>nlz_w%r1An6gvSg@}WMzcUZp&6y5MP{Mlsc*=Bozh=N`UM7U^I3`OPkz7 zsdkv6sfz!TZhZIVy)S5M>*4)}ouWK1Q_XRvi+j4;0;u+$e)QVl_W**{zwmdExR{SW z{s(^WhrGqS`s63Z-@T&VdD|sN>FS8i?`ATx-N!!j^{b!z$u|&U9{IX+`;Mn{#2fi& z%J2GM(gWZSQ8$jI6e8no3s3h}{zxu77!lPlMUYCD;Z+iDvW!)tu-C)&%+oahr{j4% zGVYEc{Vq{Sp?RB3=}`=qf}V}z`|)7V2rZ*O7;=(4r++dI3p8U%BN9O0a~wR4h0^`3 zo01`)%>bKowyxrhl6mU;%k#5NI%q6Q_yNIvk?SHnYDgo7@-IaJ*nwY(qP(LFY+btI z`6-p!#k*KWR6HJ^`lkR5j%dI)qHIeA7LVw=k@g?f3swXcRS-liIo&Cnu!iBwP*ovG zLrYj@s-m4Avi8TxTSM&J1bM{c@#X#ftCucuw0m3gXfHY}+u45gLu?^{4tIq3%+Z*kn9*Pnd*5B%FQDNV}@Rf{R|)wb8IDu<$aC`MFD zZ9xhjxKYk{@5VoZ!||hk_)@7QEL4(5Nndy%2EYr;HzaOp8rtxu|8WS2>;XrzKa zShPT}NBk?-O}LAQ1c=ZCVH6JVJVv-Hhc}Op-Z)hqlR9ev8ptYj^^IqWp(%fP4m&g= zEVkg>iu9s1e`I-mo5Q#3M!jiMb+%8llD29AYj922JLt$@Rk8`dNxVvQb;ZVKSju&_ z)SGjCWAREbsH^;%WpbaGX+QAsE3Yy(cV7Ne)=ELB%?wI$8lF*xMz^Z8ylZWF)zNSYN;X8d$)2PDjPSv&i} z!f^F^U|2DBLjI6$XX{EqTHzp54Mp_^rK+act`+v(=}`huHP{RBM)(FuLS&2^1T!zR zm(wg7xJ9bQ*bHEiBCGN7yN-(E{c#*b8@D#qACVByDfd@AGVw6*Lr-n=hqq3IXKsdZ zsLF&)4$iV@p&c)h?vYp>=gPyA-}iOj{$1bn!;Zb_%d}fz@^0J9^n@AOZYN`LTPo?N zX!5=BfaKQ&+Q1g`(O>zMrHpc{7K@X6cgaZCNvFUjg)p`w1%&g(A{B}Tp3#+b(=~EU z=6Eg+E??1P=#f#jZD;4_`1>K!6Z~BmozLfhBkMc|IKT!s9*sDv&~E6T_!B&A*REej z(rddOr7V^ULkJm`>*Am5r|7f?XM6RAx$xGDR!XRD#wU zkx(&VVb`w2@Y~aq>eoMoBR(01ZxP1B?vHJdx&j>f zLi3*f4)I~az4jDDcRSL5$z}xyH4mf0$e5bC>i5$ ztr}r;BzByQfu&^yVK4`LmrD&CgYdjuELvPTMrNzg)F=mq!aChhGqJdNw#=W)U~caC zoG1Z!X=(VfE{hV|;_kr#)<2%Ld}G9eM`?zKLf8QsLeD_FT~ZnCE|u42+bB&l+0~JW z1>8~PgmoE>ne6W3B)=WEiB9BEY=A%f$PYq4iefP) z=E=>@=F9n#!Y_4Kuw)|R6-}o`R5bOyMlmtg$`P<_g97I`vS&0!S5c>w7@`w96&8^k zN{5l0L51T^^glGgJ!~+DC_?8AZGT8FHxAHR2-swq)G3y&QLor#K%$RV4tByTxqTer zecE2C$1PE_A^c5lH?dg^%r-RCAciIzmCC)TYfgZ^nGIpfX$?@*Np+}mbR*9yr#0gt zS#0^VMEK|PRcXPV*S{W$L}535b#Z#SHXYz`WB1X48*T~=`J%KVOR0jcrde?(pU-la zBQ1`5&5uT&B3r8e0&3L4#sFw=17@eZs`Pp=(j|S~W&Xv=l2XiC*{><{CRt>D;8?`_ zO;xbT1?XUlY=Fj;x)5y-0UzrWcalsa8%fWG^R+mir3v=)HtdCXGBp}_R*O4xXId9! zZ9g@1v)0MGf9ucu#MeFdRrWgStJ}g3YwJ*O@zrc`#ztWHfuE};3%13NKL0#|abDu8 z=I4j^m32k7PO%RHG+-U~!VsGeMK;omv-N|%69fpfhqvEEzA_vPNY{vZ>(#PYlLrdS zG2Yq5&fBPRyEhn5%5@^-gNk~cdBLp9v}#H3BF~jL zZLbib*Xz|{*&hzCKmNGtR;(!T*<{I5^q`4?X)qR3vF7yXkeYG`y6l5gnrPVY=@7N@ zLXqkPHvsqGe)W4X^`;DS!Gc7MKP2FAU0fM;Y_&1SEJ!1oS6w_D%8=?;_5_Y`Z1qJF z(K(PC%6Gw&tR$k92u&q#;kaJLSx40`pboF&abD*9Y+s*;UXDpnP$uc1_) zCc_~|V}t=J!w{aDiy^g42Bgy@p$9C&dk}IY5|@i=^eGO@_KKz^DcX&!gs{CxD{1l6 zEP?=!lc$L$ijcsZbh*HN!Kw?Qh%V=V09meyA(`U`qWx7OJR`h~Clh?1BrEYJp&}Vg z(mDB@YdhmR(g`1!ws({tbdozDBe z6M*Bxf8|wjZ~b6$aMPZ7ilWQj0VOK2LADoVL;wz~F{S3YI4IIvZ{Z0vi2Ak%&`g3Y zFL)|ox~>Y5b8s(~2q_CPq)nl5`qlMt@~im_pbF0yE>R;fN2ic$feq3PxGhlJd8@@z z7r7VpD0U)!FMwuzYCMvI(Fm_BsZz@@9{?rTcAl)Tj&O}CdQB&$jK)N9&l9l1sph&u z$ORq>f{;YkJhw!Y79jF`I=^@K4t)-TU@gT+0P8eMEw-F^%W&T<>F?McXLs=_M3q4o zX*dfffEDaXX^klbgCmG!dy-zLv2Mt*|fe4)B15-2_Ib1pK(VV z!#KEn`CxzFl1Jk7^fVQNIxOSqbgJ?z+y#0zZLfJNeP>NJ$-nu({v~DVi;pgS5K}2V zs@+s^1e%7b>Md2QIXuMO-qN#m-mm{2{9e*}Oq$=UlGHqFbK9&W@C1Y-!){qEwxO)2rGlXB8w}QW>{B(K~=U z&m=3NF%D|GHuOUL(`9#S)s4(9vBhJS5*LN(mM#mgliQ&4Cr#B@oz!fR2-5JP5!*JI z-tAPp?1CGi>6*=|rmw4K&R)lE-t9g&QWL6GQD-SuCUJmE?%k$)kSr1J5s=D3<5W}X z44p66Oa#Y{)e)~*LpwSMSn|Ug;*su3p#dN{;t7m5DsXzEN*aCc*6~^4br*-OHox4_DLU1jmp1!Eh%AaK`(- z_W3);9p|HZxCeSIsZ@gUl`=%*kq&bA{J1Z{bKa(1Rl9n>;eQ!1y} zK2_Lju>9SvjT050@_d=5WnJefMY7{4G=wc!$S6Uwm;CkPR^kRPSVx~r@GhaSS>Q}eXk2v`fkj)Lb%`3KJ7IY4? zY&9J~mLppd3;dI|u2r>Or+%O+vgDf0=d)U*lN^uT3Kf%7z2WTW&=hfFr7qrun5x4yt;=Tt`X{tM!_NPS>kth(lR+g>ft{+@{!kBj$4c2M9lidGr~l zx<=U>4%Hl4&RIuIDixg&N64w0PtVEN7biSn4^UX05=mUS zopG`?{siG9jH09a_bCy^nlop2kq2}1smPU=4Q&hY|(l1$vN`Q-Zk^z_8@>7Q(= zt^tE11-XTliwnJa$bW9U6B9E?zveAb{Pe>Q>*Mj+-~8{FFP`8rz43#;UjYv9JHIRZ z-tYbS-}s+D_n|wMl=^FT;ivbzQn7i+y>*dgiF&F?zVb=u9Vd&ZT3uhRUVH{i1)qJj zpx7Or0udxfK&o|yD?FEZ*aIL7q>hz|MTk@2J#93!GiMw50_##o#Li@j)S!q^=SafRA8NoIC3+YOaNieX>?r6*evH(aBUIIl^ni; zm1HY3YnLe!J`Xnb^jH8f-4>Horwmg7L%VjdSmL3ZEti?h&;nl?YSIOOV>HHssbr`P zcO3T!Z&_qKC;YQF8mZw{OH5p&z*kmqy(k*?dwEskX*j`5Cks}PDe7y=NU_&9u z3LQz%tB>n;ZlaX-4g4SZirQunt%_PIv0g&ZqalEY6UX@G+01iK&PyV)tV#f={~25 z{GI(Bk9TnV#9P04Qy`RWO$mf_8y$R;rAV2{SHIeTb74{HfA=@*dxtOl=I8(S+xLFs z^*4TNpswAT*aGp`lr8}47L@V?)M)9PPLW*dPx!7?nQdpwJcw{M0Z_g&fGiUq zLSodU(3*dbu0$nV>%7I37NTNvk1l)5=y!=V@{X#`{TEwGyM zMHTKkh!rLlo@aS6;IHTGSBI}Iv|PuA=7hH8i_(R#D@>8>)1~M{YF(ve%i0MHtXSM< z@*V+hOe4JS)O&VrwnznVhpBu@+f-Wtj-92EX4R$$)+vUjjK8whs_Pq4n^e?%ayXR2 z51;TDX)Xo7a3-V65wIFLPNeuyF4gv|Ek8l4XZ7jp^T4%7*W=F7f*sG|)SfZF#qhbh zxArPCX{sXZoE}mUqrOd~;2wDPz!t$I-H*9n7b(#OE-dZ^@I+m;(ZH?CHeD4})nIoG zB9{Qd&}8fYshhM;bUdNm`Ek0@!L-dw*EV>9`lo3{3bSo4&gW9A=YqNX$ewz^a<-bE za&&gI-;eu&;@91M{m6JdE9>@=XP$fi5BxCpK_yJSKvKd6-Ra} zCrp&d-X7CO>ROPF!!iadKuEqE;RNJ34%r4m9Z*^wwq*f4=1egyPERN=m8xa}%8(%b zDS3uKh!>AWqdT{5nvVFIGjth+=(|_a*QY=WGW(_?KhkkH1*&-Yrg?n#u7{L54DmAY zoTEOyMfozLEX19axjXN#+CWTkkIhBX9S0rn?&2CEkIzzMb*<#a4);rw#Isd=dM$Wv zFrW?x`KVR>^ixki{UkN2&wutqXFvP%_~wy6^#1IFKUX$7(8lNozUOB?^4DJZ*oo`8 z^Yin55Vj9}#(Oc1N-TBiq8tndJNpO6$H$f2M;wO}q^9LM zwsJ+&FO!q-M%Lv_YQ z8dcDSu2vmZrYrdaSv@siu`M8pWqBDx>u@zV%8Q%?+iu57PemR#d9vYFsRaQ#CMJvO ztC`n8W&xj41c|!~NmT zjmh2(Cf$a@he`@t;DulhmWzl)3`JihZv7X3{6{|Xx&OoOg~==_mNg;={;TL0I46H( zH6mMXdWJus9%#94>UEP&E832c%Az?#(n1Ya4@Nc>La{03Ej>yEQn7{6$IpQ-Id!r= zEe&y9;m30ri&~NXOwTIIlSSi^E+@RymOT*y5i_6FR5X_n*>Z*GsCxsEv70z#egqco zEOJZo%(pJDxOP}i^Rrp8!WO271L7CD)mQEEs5EU3(cp9WGDAzN7h6x~we68O!$}!W znqrp5!ijKB{Xr-mr)HHmZlP6Ky`g<`j#qab052?8fPkhG!SzPe*~KJCc*w-vI&K}O zx620iJP4FTE^n7Ia3?;IW1jV2hm@qzF6oS?ti8j@MQI?MTNw7MBvGTX^g zYvjBA{cv%fVtLcqJjNnx*2@A=!**F`s%09=7GF{pISgHOTd+#lLejNlQM8RF4V^aZ z15lV}hbeE9NnXp&!9<;2o>l!}psFM5)jCgeJpQ`WCqUmajrxd=(}y{?IT^@7+5; zJiKz_Mo8ZHR5keN+j(-_N*<3b5^)w7N?4x@jipEmLm@L(gQ;q&LJj++l7=E#6RE+{ z^Sy|F&R*|))2AR&5r9K!6zbB;QmF$U8xbf}tqQtSYhP8)amZFSWGib_O0B7GMcep6 zq?DR0K_ZF>iIkd}6G_6qVphtEf#U!^VKJ!!j0jSdGPK6IjPZCxPFz`S z{?L=+zknweGX(SiXBd({8p5TiyWa})3{^@MG$4~93d+z>551EVJJIz*Jb#T0I$jl#01K}hNxU@=Pi>G540}Q zT}6^;+tqTxqP-*fZMr@^J)unorw<|$QN^N77y5|sJei8&=+o2F-f)QUfGu*pUQ@0V zH&>2QihqhO&0T8d5Cf2)iU%*D<6VJ|Hrd+1bi}IgM4t*L(;p6{^i~yXgns7JECvKYzFx1QqpQI?qR_Q1Rnu)Bf8=oh4xD=a z+8h3*J!f}v^tXTR@NfStetYmk-@X4se-MD<)+f)fz>@YPxnCj{Mp0-bUs8ahC!`LX zW*AZ@UIBguI8ygn;##iTysgTNWMLNn_GO~#{QR8Vw~T6FjtqaAY|N8mn~4Yqj_dm# zFb552#G93qCys4!JkV-|3&P3dj)ka(O)k3@@edN=*ifr{FGyAiP(E%))bABph9x)I z*=1pDwM1G_$$ZOtG3RBbcc)3aKA{=mv+V5d4SGG_aZ+K7&X-FO+vudn&{2cTA*D2# zO-s^0?a6RZl=W=2TC7;`U=BcrtRuo9iW+Xj{XQ9^>Dm@qR!1he3~`yE)L5EX)Hp}L zFyg^b7sDFbXsp*64G6oP{k^C^!25D|biF=3KB|QyBE;%7-XIs{zBJ3@IC3ctG((2N zmgs0qlYuD0Qz@2mZ2Hh+Nbfk#L;qXr=Is}tdcR?Y_XKnO-07u1wL*T3v8}tuZLx8VgJ}LIYa@NRzM#6hCUBRU)FcO z?}u&S;BWMIRXsy0ONysdOW{NeYdFE7Kl=wBIlq6(B$Z*6F9pJo=^@RDsGUV2FI_7Z zwcE3j!$LX5XXmx)(NGP6*^QB@Y|0o#(&Y1sQyy6xjBS6+Y#V=zNR~}2)=nF}F=#6v z?vue#rZo_Z6PPS`2tS5$VcQ`Ko>JOap#cN~C*|Pi(`Y)=Fzqwz;)CGaUG)8=9ddPGTMT4RSMjrlC4nEKC8c#CDNX^E)eQb*qL; zUecDV1vtSgx^!Ncwbpy8mmlW69ltg^cd%hd6w4A|@A&4j(3<|GaI_yH#@A&#IfzuL zpd(2lRVWpBqLgWxxbKbkBS3-mvgFLXZRTmkd_A=B8Zl8cUC+!j7AKS_srVZM;kIRl z)o-;z`w+(yO=i0Z1OZlnLI5Vh*vZo_lje)I9WasTSS+TiGOt;OmPbg!XPqWl#hGts z|JoS8#bJ-{oENv(THZYNwrAe)?)PsRj4Fl+*SXy)g#MPV-{OjL@rr7z?sXw-P>C

c3UxrbIT(gC8d_`Hr;r|Y zwdwds_;gqa-<+VOlaY{dnx8aG#MjMcYM5a!)NyJXnxGY{N;+ z&d%_`v7gw&D@WAfO3>*0fOEW1;T#F)ZY6$it7Jp$@Pbf#pht#?A{hsM9_UgAXhi2* zjd#qtdLC)`hyiQ zC8eSYSwf|#dWWLOu3)h%MVICDOsRnI){C>9ess^i@nqmTO5hw{Pe1kaTc3GG7@(W5 z@mm4Mul}{yKXGPiZJHwk;a0#=?Mt8a?*>L=jzS9wl1+m@2Y7MWrm2~opFfnZaAgc2 zhW>Em$UHN0=#mp0E*59#`=;k7%VnpOOA3}5OsVPNmDxHm#6pN-CyvXINe@#pOaT<| z(e@7xL`*LwkyC&yjhc02`8B0+IMt#nd6mI<(hn%QB^~sRX2LRyg!O}4>~Th#wh-xZ zfuG_Q_afF+va(pG*=n6&&3iJr0c;JdNtb5RK-9-$J_9ZnuV;V-z$UCN{Hr(Un{I$* zHeW2Jvnd7iq$Z~_t|fF&1%uIK8q zUEudl5WV=y$4D|!#F45&n#y{r$B-TPwwj2{^Ln`~;@GvtXaZ0HIckOg(P^UB&*nR> zYu5?uK*OF;3+>dzX7778qB&j+@XUG>6;~YqBM~R{fh-??`u9Hm%zN?fi`g;h4xOk^ zv|FEag+Fv50ddG+q3=E=in+qmqoCH%vIADTsoWriY@{ff_sX746(pAT z3YGyp4wSM2T6HxuG`^`5Tbg*Fkhw```C5$TSz6%c8=B>`amHpgtp%?DYS3~8(4@{A z03F}}{8g1U=7x1azYr5x<+$#ut{=I9VKIH=C>#IwwAz7LR~Wjcmpdn|v)!0X|bu7aNXkC~tIAw~(gWytK~!TT|U`gTgll z>|HgdmDL(}74Gfi$=xO>mA+?_H#K19yZ{iy>Y2YVuhzUA?ty0w?DBp-c%nD|@-i5@ z?#Q9u9D-s}_Vxk}uGjOhI5MCEXHPObwA|!@HYCO2$DE#|j>q`}KX#IhjF>?(M=8>c zq$vm^QztsH9UY%*Fd4AO3Ea7+!mu|RhryfRMT>J zsrT*Q`=bv+2NmGkZLBi3IAaSjzJfv?1SRHI^GUUB&Epq;=4V`SQk2sX3^)k_ z8wlV)a9}tHoH&7F7_c2ivLs6)Es2&TiWDVI63IVL@4uPD= zzkavt)~z~q_S$=|y;e)V7%D_32v^vn9bu7ZEZ9)rnr0eovEoo7(r^7O`D1K7g!dn zzS3$Ygw=*j>MlTI{CQn#^t|ox(VMC;ZBO>=4tS?1E9cv9I3N3PxHrB6952Y%q6=-9NuZ_@p!z9elvJ$eETp|4ZAl7r!A&|H?2go zj!%T=arC+(oyqZVZk_|&DYguI2M6?76<$KefdfO@lwFqPG~dDf@OTV{jJevWS^TDj@Y@H&CjYcED2=*cRK9h9cb?r$q!dl0RvUF9Kbux(_|%3x)M0rwCOpI0Pz z@7{d}7tQ8VKqeD*9o*u99>%qzjZ497h{xldY$V=@y6Jens0BwQo-|34M!4A0-l3YP z%9`*i$WrhEyo^+sI=}beC7=f>Brw|%xjv2>IktiOiERc)pfXO|hapSx*kh1qVgtYf zEzhhDY=(cm^YrudVqBi+y0uzveBVO)Dr_Y3!*JP=uxO+~BUE@%0^AcKD&j5}rvLB% zh5rthe136%JiEEPd?!zr*qi4U_ps=)bl!`r4zA?GcV2Dkf`G&FX*eQ7C5GD1Hz&lN zzyuuMsQO@P=a-G;i@-!r)hyAP<~L2jIu9X;R4Mv~_9+#7Iz&DL=hig?HeOr$*POB`g_@eRGDbVl zUd}fhawkYw=i2#?}+@`5$@tc}K=WhfOmZSl2*3_j@}`SYK+`}(VaYm2fyiMuYn z=(Zcd+1u-)Y-B=}5xuGV$-dvnSZO?RFHbgmNAc=1KfIZ!@<7{kdDgHWl-6>q48`d2 zLx;MYZNFX=n-#kloR^E7{o|w|hm=H4i&+a`L6=N@ktSmerpy|=Sh>jR0zPCQR>S3@ zX;a=|38}gTey*rP_!QB|RmoFTG@PyN24E4~1=pi;BF&9DP0>yIp(X*h>7;^f$~jnP z4=w;fkSB*psJK225`c#reT8S#_=%tSD_5~x`_oko{W0IQ;V}-!RYhdj&CL#vCDUr2 zr4mT}ov(lW$|Ob2P$1DpB#o|fWOz?!vQF7e<#$DXs6-&;e?TW#?R&pe&!rRU ziSU;w%*;+rRT6M`UcK{1R~mMV#8s^t76I!MR5w>V2`a1V8WK}%y!gp1j#-c>$O_zS zQfctv33bF=(30e%$BT(D$aP==v=NO(HH<@XD7jq8WTJXBaYAW<(~}b^MOflSVN<17 z7pj5?>H9cgn(iR)%$0A5X>DEUue#&X!t&;4r=)6%W~GQ&3`h%1c~B_;O36!3Y?4JK zzr{|rA;LCn>TM>o>HfhXJ{P_RdO*e;#i3ZwlLp4y=Xg1?PcbiS#d?DRM@12h=^3WL zfh$QZPJrewWwF_0II~bxu5o%v7$Wu-)KiikHO^1Klq;rvGLV_;lHUX4ZPL_{SVa{f z!z}n!A~D6C3Yn^M1f!roZ4|{ZBG6{N3VolFYXfqR4ImCfJYH7~%|*$+#)#M2JLWvtq$xI-3DOwLCW1!3ohb=NJAwPrFVK}4lB=p1eCN0GfkD6dKHR8y@Aj7M; zPtj-uBv|F7TeWQGQ4da2gIZ!P%%K!IDzfQwc;kiwtSm}p`EoJ$=|L2EQH1+Dzr4Vw zF7pj_nMLEA<)xI)jsl2XmH@j>rd?REblInVpOt4f)Y(G8C zgo{e@GPO`i1GQQCXx$)GTqsT;J2oD`#l<-e?~(OFx)tFFfrXwVQBhQgajY70#)Mlf z?o1}_LV{pPh(7zHpN(Sgmw)A-zWUnBWHqq;O>YV;Lm)#6NCH@Jw4W!cEQEs4De_vj zyPl${9>EqK+$Wy-0M?pi2iI>uUu5$Kci&D|7q~er?Njof%@ne7UC(hzO}TOBeXGT( z7mS{J;Zq;@_>Z5Tyn%}x#?vfaXjF&t|H=RU-}u3(Di(%}t^u4C9BJ(JCx3WGPgF-A z+M&+-a!LKJV$nE)Lj0*+uK{P3-bPDxb3_`MimXzB1v*(5oFZXifLa=+XXY2gE3Hg_ zD1kftlX4VOrm6CdltMQNNBSn~-NaNzvbIl@(}{{Q@CtAMcE?X8w^F?;9BrvJ>sOZf zqYOv>kw5>VFE!t(7NsU}fjoE402+5+x|d$CP(0K_5R>SNgLGvt!iF4JWmhFrj6L8X zb{u59>-FEFUaW`9dFX}L zN#W#K>H6Y4D`Z{5)mdYs~vSGojK%8R**RCo@|=QK}ZC%Vs0FbU7(G8 zO%)Btqs-`LRk4m@n^oCxz__J08jg&(P+_HUfL3>a)f(iHooL_cO8Xr5T&7o;kmIV6 z#4z=S&Im`_uF8WqPsLK0gV1UamrRJuth}4yV*cb`{EMMCu^#J&TnU+f5BM;5Q?idk z5XrfRen;dcn?V4F8m9g3H@}&SC5k3m8Xfh2R1cf9tg@;+F=N}^scln3RSq;|6E6h> zafjN7fF#FzR0=X|o0OUiq7xj5l;E~!A@qxWc5p}^cGbrbiBcSIy_mO%Pf|ydV($=f%5tm6( z;xr!BOa|&g_Kt`bkS?8Vs-i+{z}Ao4QD}_SRQRfR)6H^DH~F@S#KIT9fA-+P?dvyu z-=C*xFKXqAXhQuD+eXM24k^npcnvPj>HT}YNCepi(^i~SkrzFcPlG5Sr9h<5Nqe*; z6@$l#fh;1%1D&(XT1tP8?6UCxWO}Y0&`n zEzpF=1;%S$*PiRnrqgLM-jrpU)6oxb(+7$bVhvk`^!usD)5&PMw^>{cvO#o%zE#mc zxDo+#qONSy(#R63~gAJm8vr0GG1O@ zitBH4aD<1kQxk2tEc-{txnvO>L(4Ou(lRexim8wZN=H5NM#YpBNP;wD$D$;KNj)q9 z;_B%jzL8Q;#R)IoFJ<}&v@w@~no6|tCX;c^!iFgYSE?`LtY}kEWTMAmP!d$;wzmGm z`c|h?7kxI|qtR@S1WxMEuu6i(i%TR5X)K%n{9pTP2YVD3o?o87_}xGG!f*caE3dpL zcwQ5o3`5PP%2=$3qjnVgVk=CBTpS@Ca&X=8f=5gRC-AK}DliR4bHUJOa7p zn+)gmP^Gju*__l)L~pio)oeKj?VzSxH8E5ZK7p>>)NDYLdCk_$z&Zz#W*h_%hZ?ss z&x2)sZF)Gh+|zztA*HOS7f$vvuz+g?hel`gR_Q8jP#k2nT)VpW_N(_fM`LMzVi$lu z0z`YxcJefo76sc1fg!?gdR=r%yuPWhEmAdwbO+XTtYX>PzF{GRN23rK!nS=+w7A@0 z$7t}esti~|-#-ZJv`OKrY7m|uHl0;HvW<>A*aEXQ=lco>@5o!FE<0QTgEZ!I0q@_btnDGBu~BZytB!)(P_ zS=Pq_M`S-5!Cq7;XvJ}UcEsm1PirMfhU4SsmXt$qWhl{M6T1KgHT14imdomVnx67* zmKrXnp1o&vts!}ZQhD!WujlK>d&%}Aymej`HIDCxzJw}XvGaSE_1zq={_KDJGn2_R z_p!kf!G2r(F+5iJP%jaF|GQtkBAM>M$M<~w$=ANN5hGTO6TD0{Iw6n;zVe@B8Do&8 zh22ExlAUTeBBB_=zSM+{pc*S;LaZic-hC@wl}Wf!*fOR+R3ccZS``R&>X_S)wxez0 zP2&kUWdZ9$h$98d4{EoS>c}7yACzlwoOPCoZ+fLl2*lBJH1rfaqEYQ=bk(rXD2S46 z*PFZ@wpx6Tklav;s!2v;%QWYUg^+t zAhOAffmJtr5XW}rmvfKm9YH)w9{l!i?|tfr%&+{e_sLHJbNm|t$J=kd`I}$(!r^2> z1S!`iCz#=Lh6{qXi{rShO6;VF*6C_#BWOh7{$vVlgsV*|Y*}LYM_~xmNoSmt)1El( zgKO8^Fj`%l>N13YotjfV*#=8`JQ=%T+zK6vz3hS03DSGzHD{rtppoAG{vJ8h2FvV- z`gmH^3^1NYR`>)o6T5CUi}`XinfQT^hwtLzydl%p0!m9$j-OOQ9FgH?USW%L3ZTZI zs!AnAMP7(d|I1x}O_Qz!4vxPVRM08_UX$qrpG#)r*@eX2@2Q<$82o%@B|~H^NC;Ph zLO$a$FODp^DqRg+ORT-&76WYnXbQ)IdjJq~D|v{NA+1^fI(}<$c>#noh1Pdz&Sum8=zr3CBr9oOyR;`HU0zWp1&{!1^u z^j%fw2tqr{IOU6wDkh&o{gSy#ee0gfU?P+Z+w`di>X?D=M!uI|*W9enG|KHd*KfZk zh$gnc0)ie1nRccIj2=Mu4_ov z>gb0rAa6GnQB;t`V0T8V^-WH)Brrj5s05SsiC}7*F1shHN}<%QSf45Ta@__qdv&h_ za8aC7QFCBj1lUehIF$Drok1dty%N{hNq@2&0;r*^SOW56eb@G|%|8G13*UI_4~^7T zndK;)K7H`~x6i)HY~E60fMf-yt29pw@ix>%B2DjWUeoNN!AEOrz&*x1+R%&SsO{oO z(X&Mx&Fss2m6w>ffH<1eIXb$uw3;y(?>Tti?OV_O;lnR^GdI61_CnVXH48Ff&nx|r z+l6^@Bd`+dZ#RV(>&@4y{Dw++2Gy?4I&$eXzFoiLiZP1^^FldbFYJns$d`cspp z=q^vQ*-_{PTWPQ5d5)bbOuY4Fv40!^WT>BSmaP2K^bc6UHXWI?25wOLT};Ip_1PJr zTZ)K|D7`n1=Cu@Sr60mGrF84rH*2?I)lR*0F3y$0aKBULgiNd)PejuXx`g z?da#(c%A#Bpz$8XbN*6BczFgjsx}*^3^}xf8&kIlauWMcZgSQG>S6G#(!BLcmz@W zIL$(d{UKpO=8aITi{!QpdTjd?*ekIs(UC#ZaeZCe#_oVkysYa?C|&9}Do86%14X!Z zAFx+%!8SpwbgQI9f%V2l336ZQo>W1IRFmTXI5CF`M@Wyh%^*W`DHMx^0YgkBWJI(P z6>8a1w{nEq4goN^oX%$SZI?3~4+ z$;^K^5H~Z^olYjA{VXqL{jpEejTgq0JPCZ!8sQKul4(F6Y&xxdMTWS$`^(y2b9(en#5WT)Wlb<~Pzz06@iBI4&5e5F<@Ac>B z_$K_RpHkPqtx1dd`~U0T8;?h}<&**lioC$v9USZjqcPI`)x`xav!5h5KYTizKi&t~ za}p=(l;ie5LJeg?OeJ-R?SWJtN}*Si*`7oBxB^R!^(BN@DqmPEF>?sQYAe93V!ckW zD;*pk1Fzs(@;CE*u~^`_!)x%NS_(g&i^?qkaa#%g@*H47COH}GvD+*cb53#d z7dg0uD@OS#8ZxqD0}#L>_iifz)+FHI146)!JUfgdB^u$n^yP7bNNkB4wKL$aQk~+k zG^dV1<8>=Y6b~`!M5@J{&aeBda6m!MG1}=cyjan+O=yNY3ZuLX&mz- zAN}Zm__IID(!tL7O^x#^@Nsr}^3u!S{`Ft|-0QEstY$Vj?AGAp;{h4etcu3`WLw#l zX*KbLGY$73V*j06T!>B9cS6f__K%-b7WVmOjYKPm#)e6cT$duGQ8YRjPj8pS`lWCE z%eP}aQuO`CjOpHEpyLsM;7pb zZfZ@|7xPBiD-uvE|rZfSkcr;qBO=F~=A)Tj3@@D{jU<))%Jde((g z+Y`NWIV(0N4H>&=fQs@?H9q=Q3&uQ2$78aN$ST>X=0;|n4_;zBVc;x`@cmA4Sk-4{ zP)6;tiUVXLR*^T(ZGEAwpVOYG+ijS+|LS6XmQzm$!P_zJJUyY)p0s%Gy|u(SD11;A z&FnBL^SYo}L3@0AQc|0WS8u$x?blRgJ3j?-ckzj$k(jL%v&X7>jp~Nq;EqOzyIz7T{Lt1xkagf=Ur8Z6-eHRE9}vWjf;x;wZ&lQ|b;QP{+k1huh$ZNy5x zW1il-+`O{FF`xhBC+|G*LcdeW+m5+YkZRi*`O{ipe+p_m{==o@yZGGrm15@@a__a* zmS<<;%&v~B`68%L(_~U#tygN_QNy2)AF>uUrE>O4XfZWlN8nFNst0x=*uWuA5=e~- zG1#(3ae^#%wOq<1w(iSh>D88}n3ADGi6Bd~k5k zioYe2K5VYZc%m8>z06CH`A>6H>W*_?liOy=v#z=az4Q(^py9fM&@9zt;MQkryHyQk zxh04gqI9VMff5LmAyrRVd&>)~O6VyKt#`L3u9{SR)V)!M;uLWpP=h^SPM;#3#U8Jl z)@VFN>dahFjU6UQDur=`BD(0ARFc}PQ|!ck#H$C$Qss#Kv_!;fqGW{6etCKlM`UH{ zrj2YE36SU5sq3nMSN5@>cM6X!|^23Y9i(IWu9>A^u5 z$2i;7<>m2>o3wqgouR1H+X=9(R8*4s1+w^K_Awyed*Vq zO+&w4lVA}=vrm8eQy=?SbaGO^^ip&8E^>Bre?R#ve^o!e-kzNe2+6MZkN)vLBv+k! z9?TXSk)S}NJ~+NXb&#ClyrX#~+k*(rSmF^UVf;a~K5XfW_n3}5s4cTXhQaR8bV|sTZjDLjB5tZVU#H4Iy@pmn;3wk zq`<@BPr%tmN}GgtLl4aD_@R_D#r;L3W7Xh{CTy*`X-Bgu{alcQnPwx@PKuR<+;eq7 zkTllOhSNun0D`Ng#f>9hij1O0RN#1e95WF%$|N7+fg!pHZqGsrMj za`TA~;vg@6^YiobN4DcFFYmK<)8WC*ln95i7Sa#ikI1cAu34=bI?J~ry5*ANNvX22 zrKlB(`&nTV5H&DB2c`8H_%<-4QojJyP!4UnjJE)taA-ENl;0cTeP8w7#LmP@o;hO= zn4uZ1=7jd`{k%6EU0r)X+`Yr{!3vF+Kd>)&|zvX)!nfn!bdJEN(+3ox6!S*%0|ND8)x zd%@M9Go$#1JYj_7L4ZXew9s@_j;4N@k(`a!9^aX$*W<+}U%qq?9cSvgu^o@Maq;qW zlcigH6OVm%It)!&uhkX(T8UeQmW(&zsH$fHA7FXmfR>20;~UXCrw~yu6%Go*NaV*7 z6h1*OI!|f(7u}3kgG#ayIUI-YaFVFL9H}|NeO0`9_||zgFLlS<-@Ea|&5x^p75%Vn#8Ni&TXM!u(M#KTsZ{cmI-)FDwyh}t z@HVe9?)wudHeh#7&(ALJ-bEgR-K3KpWE#hKi%gz2#fq?$pO8dlC6mRN>No%sg@j>6 zoO}!!Fr`xTh>%I4shTwtQ372q7LMminDLYw6E|Y9T=!%wQ?x-VZ0f7ksukl(nWx|4 zNKuVJ$S8WjG@kE|lB7{>9vrn=2wbZc5;LlTl)dvMOFovneDsVJyOqv=&l;2D#wT z&0FK~c!lh<;~g(HsUJqR)R}F4P_yXB{I(U87rsRGXhfX9xDe==>6u__3g;?d{{q@+br)|4j87_`{<@1&%(e{?jE4C_;(cD*jj z0thULqP@{%Bl5VM)BsMhEf#(T>`uj3zxYefFGK%m->K5ay;L6m^8VAmFkD`?uf6L2 z*pHjfJo|tBqyHlsjd$HWrkMzw>*Z=P8O;t35Mr@1OS-DAbBS=s4LEEa7n|6kAtpLER_@}*4J8bA<=}QByxz@6LPWR zk@+}7lhTwSI%!2)<7zk}?O@}4h@Fw(yOgXIzZ9}z05|s!_7np{p<%3_dYfjD0_=qm zo>GAxFC3$MM(!jPvpA_rxzy2HlEwC)140X>4J9e6K`nz*~${9|6 zesO;C^*{L6zwzszJ3V>S%V;FxJ8lkr+Qh#?C3<%3dV7y8Eu|5*Eu!eQ<%C`m`ibvF zHpL%Zr3S|DZ9E4-Th)*5efP$l_n)7<4%|LFIR5T8fA{eC&ZB!Ti?Ph0&z=p`KrHE* z1_iG)QTZfSqoO8k29lv(UO9WN z%;pTqblb)QKv|q;rV`cgZQx6TVNZ5hXHk#MCH=)JyT5HWfXoc zVjR{LKA;%5C=Q9F6uSe;6Gvse!eus;LncS~1VHFwVlAiEDA3&Rx?ZyRcH+U!ucPZX zgmi%ev!qew8MbmNG<2$OM^#Mx+z~5wEG&TTR=Q4$oa})h8ROSFmNY0#!d?r9IVq?1 z#M94k$_96U#-0sl=5M8^Ra3X0xpfCU_skXG0Eqel%D zt~83Y%9u1Kp2Cpj0YSG)?2fb;ZIJ03PP?(dHt^aq{8`vxXqo0x@XJ?T*Cbt^x_L2$OA}3Vwg%_9M_-Z0n5gNgNGFNff#QYQWLXBRjQt<$dm}O))9Dl^M9H$Uj3P3W ziJv&n#fqaXO2;gtxv@t1$`|5>lk*%Oysk>edwSPHI1rsRjB zR;_qWN>4{AY-nl#f-^R@pM(?7izq^B5quziU_D347)yAQE}whh(@{Km^X0GZA3c3} ze(&PsbzEuv<|oDg3an2Qos!T1yik6yfC~stVoa}>%T}Eho_9bKay%6)uF;yb(?cE5 zg#3?y<0?)>X-ob}KZFNPeo;H2-#z$_kW~(S)Qn6H5Hop2W+D9g5I+tv?b5OM&G7n|CJaye%&Aj>gr81n)+ATpm+rCe(97T z0GAHyXpE;+AKi%_{lR7Y-pEaC)vy47p!}NP099-d3}GZ=Pl8ro&=Qs>NOrN$P8FaA zu(dQnqzTvdVdC!Jh|@(W{w5AyAo`*G^cwwZfX}EgDr+%YS5@99WCrMfS8D7)6HN;$ zGK9?0Hx+=TjpvsOns*P$XvD>WfGT>~QeCv^tJ!smc24RXamKbT z#VyrT>N?bid&M94I=2=H;s&j_S;f~E(2}qc^kx_PDKLz7EW6+F_l{R!~6GS zXC$|bs%2u5(u)iRwt$h$l2ny4lWE0&ydOw$-&B-y)mRIC?0 zb+0v^N!?JND$futfH`bhxAZvwN~WyuJo7AL*{%)r`Cs`}chILdufOo2k34@ zpMRhE%(KRgo4W76@yg5NU;Lc&;Qmt6{#nJ1V^@|X!Yzw>6j_Otx9T7Q zaRcjH{FtNZ)V%Wi5;R~+rlBafYal-ilU_^(614o!W6v*m(agPB`2rf<@@p5@& z6sq5){4jabEnrwDWjQR5WHMD_-h(*!Ea(|49yGev?ncI0aH4A|Yge2CYuM$%LqmqC zjAcn~lheJLUZpBkj*0T)BcRfe$yFQfS2QG$M8=v~YANs-1 zewJhWc=kmik42p;AKD!se^90nJEvJ?uiZ-u$I$uCTVMXt7k~BFe(~)5EF6qc;9|3w zAip+;M^&l2lqKC}_S%*v(DW#O~_OiLAas>eiWSeQ1WjL7rs!gRT7SvZ>VsLPjZuaM=ZeN$Yupkr(i^ z3rzNG|H*EVZsPUGWI0(-`IQR@b`apZhgmo8@R<6ygS{t`tADz9ecdw@2V{FVW-Vhl>h*vNIR7wl5Y(xm-l>sqcD^`iUALx;HF9{h>MS90 zDi*D{rC=TRLVcz=3tpB?eH=VbE2K4|%FXpx6^&TQ^rZB%!!m4@(@fp*t$5;9d0UX) zY=tALv!qL)8@y&KxD|~&+{s3Uypd%p{c`cy*w%H@Rj$r?ycf+5VqD}bEg#+8&UyN2 ztkuK8hdzqeoV@;Z{N(u$e&$`4#*Vjv{4(Y2fE9W~U7OV%q?>AB)Q4itO2=EClD0( zFEv|X?MUOQ_V7L2NgPKPZJ&NOWZTfImh^H?e0ZJ`L2`u#`0(C4iY=iK0~;TY6*E{d z6M;)pCOAX@uovQ*4J1^)sPD-M zL({QL2KR=Us6tNT{r$t~Y!XEmtChL{s@I0kl1d*92PDK{M!o^);Uw^Mnndy5c(T}R z(mW^mcfE9Mn|5X5P*2WjmfN;3*tCP#`1udczvF(82?93;IdM*h3i6 z=kv?6<(u7-57*wo;irD+hkx+Xe-`l)fBo85zKq=Z^S}7HpR}w+-`_Kgcchz^+_}?B zC{@9t%n|&ys<_h8;554*goPs3=tdB-*@P3rQvfvV1R$!?rqlY$pl9gUizNV=#~v1y(>keSNO#Y{ z_Xm>+z+A>&6IFW2v0$N&t~#^XESDHh@FBEcHIizJrz<|)-roLlNz12@-f$zfiHbsC zF(0mcy_#RnO$ssls+4OB8Qgaq($Yn|_q}*IHw&Gie8c; zE%0L>>8#S=q6rBAt6OKAcrqzBc~fNvH=jAW^}K%b6C)AzV)DU`gC=7matN}D#7M;s zjJ6!qqzS@XOG$6NEqZ_qp@nkL)N<(ykHzLq$Sqa97|NN8u&MRrcA4+-oLNZ%`HT|&5*vB7G0xHEG;o_K0Cd7BZlcm}8S)@$G7inz$JSZ2PNcgCXv?}vC?A;p*sMp?II-Qdr< z?L5kAm_^AZ3s5Y@UZXwXrRd^rT1ml?L7ju|l5^X;%`Il?74S8h zO!2TNY0*M5NE%*y9wLPLp{1$PMK9zgUAh>WGP>NPsp9z}%~D(nRS8h1$KAYbr4=If zut_2d+f);+4cjPEnYB2M#TpDbAtf&e3+aP`4z0v^UN^Z=2mqv~Eth0k(Emk@UoC9M zoWoJ`#%h{O6vn*qcpOUU*pxE$I2lppFik!2uW6)~PK(z(i^t<+JV9_~$w)I6=jXWD zv%URs9OI@hR%>ErD%-B;Q67c5X(L9iSBosoL{9s_A5Cy4?!WowD2XY~9FG8BR*N~U zXM8^#jVYN;Sun(ve%LjS@PCdWy}WKHvlOswG~2JT4KB-OodW3Kc6ebV+M~KB^M<&X z%N3jMNab%o{WR`EBOiaYTog3swYTX4 zWfCKHLW#Kd@H^dVi#a~?sUNs_^ze;WUr{IA?fmWRC*sIH1aj5H8%*?0L{_(~#*?uc z&A^3H_YTKYMF?G`Pp*&m!cteayO(Mnm-N<^a@*A4<+99VGNt6@Fc1bi_T|}`jE}PE zKz~6Q62S*_sXnKT!U#w%E6dBvi$Q!^W-_1hWOG0#_5OGuI0kIPz(urF)rqa>#WIUn=B23UmCsTgxu5MZNqS`E#kGJo?{l(w= ztuK83pRZ3&$A%L*7C`VtS*BS{if^yQp}Rl?ay7c2J4(b)$q*`SF>J7!J$=-A)$Zl_Mb{i<)5_VF znmVLpm2%dbERC-2>rF=^w2NkR+oK*vXY1tl>TaZU;u2)KRPvC)dL3w^lx9b3$+}F@X!XXwslZdTBNJX@((&a7l;{;>M%RGCz6ajKykO1H5R8o>M&R5Dg*K zs9J=H=!O$Mqvh`)F1ffci$6GR3TBP7ksr)NJhazvy~Dluy`T7aUHZTF>;KH2x`Y}w zL%!ScZY-IXzO%m|T54-?nfiIKDSQMNny zp#uog@XW$9IYgr^LxTF>tLojnK-cq4MR;MGK}69C+chg0c}*8(5Ic%ELSGdrTHu(6 zHxt#7Vbx2zGk(mu#LcP%_%J9`SIJl}K@*Oq@U^vF5$HYl1fexm4;EG~5|5+-FRsv0Z9V}%D*0%4G*ug=vo&;M6-UDiEZ zSM4>NL@7$e=eJDjBR}I`d&d6K-?f!wVXd-2#}PAT7Gp#@eMu%M1w0&)j5JmIRd$7* zjVGyHXIUoPl2VY@WT=%Y zA~GrxkH)HsuA0PnF`Kpn&xn7ns zl>-nG`2L;an`g@fX8~mXm7}Cmn6V^OVD06b_3^Dcl(<-2s3)r45s|5PZkeL*$-A~( zEIXmi-hArmD5ja-hLlZd}A({mEz58e1X)d@M z?k9=6V{`X5;BYay@l=x$4N%D?2njRf*8z@Nsqf*sk)SSb9*f+DKf;UvbX5brlSUh&Vl4zOGAM=FI>KA{K0w38$s-^hHFyQMndiI< zTsgLb^I=mDSG#1+g9t1v%M@t_&Pvs65aY8=hD`v^br{8X+U8nB}BO5yN3C(k>*xNKR(?sVy zg6#QRdQZNk4_NVP5KLN}6oF&Og1ef*(k$6muB?jU`tk8!`pf^70vVbNxOu`%w?r60 z6*&~*SFDaJ!J~ecxT_i3VW)f4Nfku>M5!DBd3^3y{_z)o=kumRp?DU>I@_8HXIe3}L!EN17ya5SBQN??X zkm{xDw(csE(32V!NU0>W5fr+UzhK zA0yjfm=9NabmTQ5)^C2EA}eY1*lsOqgL3k1Ual`oT&>u)N2Xsd@}la}rq1;CsSh3Q z--@qd@cF}x4lFDU(9OgT?OlxFsK~om!l1r5pvLl|m|Y81KLTIbilYa>6WChAk*yjF zxI0I;#_BcrCmct-=JiK!uhL}+{NZ@!WIq_~1>!bGN&qfeku|s)N-9Izjy#rv6aXSX zC-{^8YMxbQ?5zaYzFad~B9xMmnx{znuFki`LuU%^>|5)~Osy=LqA62xLz*&mIRuff zRCkKJY!$vVjmdtj0LOZn>nfjqSm^6^QxtfXrb*~Kwpbi%K=$pf>X4Upw+n!AKmhUJ zVvSF8G>g^H7vN4Um_|fLSO!w{Dra`fu-&$lW~%4Q@OrNL4yMeuZ+CWKEvR-wNrx2K zVX15GD&nN#Nwu_?qPor?QV^OLYBZwsrH+Gilimt!wQ@U?vI=E+?8oSngLqJh%&1BK zYLy`w=H=!I8(`t?!_e7^on!IW|F@5Q|ILq;i{UT-jsG)!z_So-|W<&2$dfMUbpgQ$^Uio^?8 zX~hoL-0f?seZa9G`Mi#d>TJ2RN}r8l;EhsY$4TD0aU+c5P8c>xLJhG_Gn7til^3J& zXfzoEEwP!xX;tJa+)JtJRaZ$I0}%$J3GztdHiKk{!7x?D1s9{Q3bCrM5%Hrq8toq{ ze#~mQqGH1)4U+M8@Cus&*$fmrUn~~ub()Mva-b#ZU9vGrwgLULB;+qH&iMgd zuM!|jqNONQvL{8Wab2yhR$6I;l=r1+;%U1o0wO#2W1A*tov1z~qeSv@I&qLwCQJx5 z)hX`n6tG8p2Z*5niRZrc;5&G`X+Ocf--e|>IWStfvADo_Z6gc%PjxgX6d{-pk03T+ z>diOoUNt*w9^9Q=2C~G9E)eHcfGg4?WZ28bQ+RDUO>?$;XeBRSCX1Z5a3LdwO)XK< zRCdAaH_2SIL%YPyY_1R}_<9t=2?op0Ctb5ot?Oa7!BA z1OfIzrSUHVFLWWcOda>L6%e3Stb)AwKuEDE>!Rzd=hQTQ6OVO63VtM9ahSZU;_(=3 z5^D=9_U!Z#fF4K6#o55I*httt_+k<(#T#2Jh`AN7*YwRP%O(8|tx77O>?jLOo7ycK z)?M%}9KQ)esh;o&A|KqQ7D!bTwBi!UG62?EV6M&28UUQpNTFk$kGVlnDB6d@a6kMb zKl1&b{3I<_4CTTqg$;Qc@%FBoDH1F)2nsP35ZUP{;_Iyk4|>r(x;Q(-!-Aa-cSk`n ze6!m6w&?%hbAMMi2g{Z2357Gdro=AaJH0m2OwV!Bh_d57cCxJVvA#+sB&DTgde=Ey zX%?Ze6GbZ}QT^ycak%f)S!V~PFhS@uVu~3lVn4+;WEvLdnw{5Fyx?#taR9>k_?8E3 zK~U0A(K0-6+k*cTu|ccH;{XtPb$)@}fNhtm&sR8QkwwSbdAthl*lZS^5z)LJ*R9H0 z%QI=%#_d;YtHBKosR!#--a9@8srdQzL6tO|$PJQ7XpXRT6%FY>>x*pqQ3K0>vjX7@- z2N|$kD|GEOR!*W@iS7DkJn|-w4H2cQile9fAevY9)qsh@3YNUpIx{7 zSZEf#63e30pssW7QNjRgGi|FBwSzcOp_+3d@;qK;`O;5ll$Tf|C|`_o@ykzm$k zj=14_9%6v<86gGT7N{gAph>1HDss|V5)P?SdFN&=brGeHWGE(?Fn`&f?Y0m{8VjA0 zFp;9BcjMZ%D2`S4-l7$SA-ehGidI-uhJJkePRF?((J2{l`|#}Gs7T}+3PEvDix_CR zToxIf`QH1%4cAFUFm9lVe4Ti2 zH1r^)NF(V)h69AvB`XzTe@hW#&l(5uhCP=xe2=6pd;MMti0)qcDs_eV9gAPjZTs>&JFK{tH&u7+@?Ge zN9ZoaYN2JMBW{MhupDR^NRjnCQ=?dhR1giBpI7EPVpY`2P^+oN?$lFC@*sz%v(xy zh>I-kJZ5%RQ@Ja;#*zjVFHCE6G{!qwhTW8Pxyi6NEKggXR!vCqQ+G4shAU0a92a8oN#2d!|t@Ypc;KT&q>xO$-I) zH2Sj(-XZ~#H5eU{JFDw6HeG{}V^1Ar%BK=iHASMnmhYs?w=+F4qkYed9Hp;SW{7<) zB0AMPU-c4gg?CB+5ME(tX1FKFTy86XS(gST)R2C>dt)qU)|MYql#?n z_2Pf~^ zjTN`1r_e+7uHhNSIJaa{{8>;28{d#OU~MONWG^GBjl(IDrgK77NS(;1WhUO<&W?&$ zmM|D(>V)u$GIK!KtVSr$ccC?N>!Fei6_!-Y-bQ*kG1UuDY_&lQ$~Dn8Re!}l{n+2| zf8x2%-bjuEn`I9`jh9}&k8duU%fIutzM7_M{O;9=jXEZ_U~s_6hD7KO&&r9ETr_(8m5OTKCp(xVD9IGpg;~=Ds zZIx%Z$OyD+b~YB@`1;o=R7Tk5q?@#t`ZGc@3-x)<$xRc_S|%l*p(;u;6CG|5hJ-jp zDNtIFS6vK|U7<;@Do`QMZ={OjM+s+QarHD2DC2NVv`N=xo+Av?UzGk4OjT8J0+&wI zLEOA3#S3OYPA|j29M-s!vOoZ{#5L_|KttQQ7YHAp%IF3zav?Js9I)0GY)=NMaEuNK>@l@rqFQ?p6GNn3Qw3;sKnI8gmw$I_`I}* z*o$BdyDsyE%ZqcxcOf0P%$0LJ`}7w9y70VnuHpRs=pPpa&nBj!QZDa&d7Xwk92?%7rG4M}xXM6o4v$rfFd9!L&%Nh8#b$$pq}XR9Q6X(h`Gu^`X$(N6UNwUYU9N!Fxl~HAGyT!zoS92~2m&ou-Ln=Jstib?6{siMzL4O=InsdO@`yu(|&k(izfFV#)#Y*9~c z#QCD$i}pLeHe<^^8oGtyH;9>AAZEzkUaV_7)uYa7(i~xFu*{3F8f@Jhbf?gUDP`t{ zhKw4i7xhAh*kXcVD>bjBm$_LEf7g^M^F^?Cuusfg9cm`erCE%EKqdlN*tQ zf&M#x@BoKBdSc}A2sMC6Jf)OLp4NF<37#;NDyz)acFH$PdBCz7;ZXBKjA>fpA<7-n z^#&=FsE3)>uH(?uawSD`4tt$0voo~u>bI8&=?yk6r7$L?KJ77Luf)G{dnv-$R}zXs zq~Nc!xbV_~{X&X=^hL?d0$8D!ztV9{W@~AE{x~^9-I~X~Kb~#-S$O?r-s3})7-RUY zpoM8(jo^n!%%%L%8fE)YRaC? zlnklsxBf4p14fmRj@^ABx*}^AaK?Zt7IA{3$n{gx>3z3lHJiJgjg<}=#p@-541qy)yVV|RNqLE@h%*=LPgRx5Q0cnf3&;Xg5hD+`$TBsh$uS3>Nw(Gn$b^d?jmB5g8RQs=#Yi%q zNTuBZmJ($`f)%`}l%}*}5p_U1zh19Ycifb+zlcUyaU6@&J?~^DDXhXeh{q8{>PWhr zPG=iLT(&3N>1;|eW7h(%Maf7!w~QiPt=D9^I--ju^#)B8*vK};1_G#O@D9=x5I8Iq zCI^#aLrYV(W2jCm09HV$zxA+ye(uCEjvoLz)Af*UcdVJ%LNO-76XufWqA}`E_VzeW zAnGs6`6USgERyjV!U=GG_3#=F4n%`{RAd{h5Ru8@EH|DVRcOJr4T9kE{DL`>5Gq+q zQ1uKBxa1Z-WB=zEyPe8zp50GFr@3GuL`z3KRIRP z&UP-(&v6}sIAWbrbZh7~;IKuAYo!XJGIMUew)`%h51q{nqSI}i zo+<)sSo4e#4zUgC0d@Vi(%{RJ3ITF_&238VWkuS0iPh3j%?`p5V8ZpoTh5{LD7_ok zV_irq23bN30f-$8y(`m4DDAoBX@O*Ib?z(pt8Vec7%x-VbmElnuS*n9;}ulqvHji0BO~7Am?Lj+Fu0L1vr= z>514PHu3Hkzy$KEhi{!KFpEvblo(0(JJPgUF`gZYY>-BwF5#-Z0vw)?4cWm}!Y-{& z*bi9ssq1$0?F&tMC7g_%Z%i@?wwDnHsax?$vFM&m0vD$^+a&OkaI0?eXrAJSd!x{{ zwjJv_xW=l><^935dndL;hgiH?2I;Eq@Cw20b`Z3Z3|j?GMdZ}CwqATC>l~g~zU?F> zs6Qc&WfHkvk+$l#FP31V{v@&y$_TPsESFN)5=g%BPe`z2oov-PrCqJ7p%0ZW;QxN$ zKQUey9sJl2{>1cP|LR6``MSBdw>&?8?NQ|%KG_3op1yfztpCp6JC&W80UK$e_%jg- z3?f;^eTO0wI_q@1p0h7nxW@a+^YIb zwoxSwb=X*3MKnQn4rRO8>_9%fcX*9kb5-ph98eHtxnvezRY$jOTjF0sMQZwc=|UDn zUcsrb(Rf_RI0^m4T_>9E<1S>vrNF(L?e8Osr1LpB1y%jx%dZH`MS@k+qZqKSp=OLL z;;Pi@@B=b%Mdr(77lTf)z%lskB#IDnkb)OG13aWYtx#IRz!N}>$D|CR1lUwXbP2lQ z6`w==$;s@K2ZR!PuIH-VU=N>yo}%?~xsYf4-RTTXhz`;MV{t;cs)}9(V=(@2Je|@g zRo9awIXgWS4LVCfAH}#-B{u+$^=e6TR3KUz+)zwjy2)@9lXb!yH*c2m@$tJy$H$oj z*DPHt@qY0aZnkDMhLMcN90JFi34mbN0KaH(LKSPt6nYSWos_|FTdT6d`Qw5h^a60d z`TA?ZLJ1JzSc|gVT2$`}X&7hIS6)^6sLJx9dsmX=Sg#Wbl?bZpv= z)KwTrE-!qSdoy`cZ_JbIiwMeu90!lBakzzpMn#kl)?);b^oK zPs6`Tfs;mY4QtPel|uJK-+$tnXP$lTIVuK8(^fH})Yq{4&sMq`@&~q8dj~rdbq?R3 zpPs(;=9}OC<~Okt#F)lb{z}T7K$Ru)T+%Q2Cvlj(NKA<)B%JCC3s^8O}CW?`8Uug4a?)L>f;v zXCZ8I>g8zqweL%!sh=-c?2-s7Bd-;0P=-$A$sJt)%iu(&7XuHP(Xo?$HFqk45HGOu zq^%Q@*~yI9bX2x&*?D33r@s$n(M8--YjfI$k*wYV39uFev=NL+=&@)pW}M#xz|_V^ z&gPOThXW`6akGbD>Z~4BPrv6WtzUM&`$Hf4u+yG={b5%YYlE_krigfI__JAbexcV3 zvfIp&?HoDI$Tq}?wO-Y$7uQzJ8gh=sdQ6%H;xWtNb#EXxBcpn!P7ldxpad4s!@RVz zKFrMA8Jd~$^W~TiA8DYTv~@1K@hlwfI9HnpFhsv&0TlO&_Jr$f^8T@V&D%+Mv#79H z6!FBre0gand(mO<$6GG(cYf=gLhp@r=XHis0cD@tw{HEwwYKe);wr?(NZ{FESX@V z^lY{9<*zRKvWt9f&FhT6a$|oqs13g#&K4Wjv8Iuatv|1tvTl}}@?a8;LQe(73o_H| zz;h5BBA?yXN^_8FW}BRn7o&X@`?syr$Fwon8wTznzpO=Cr%4-CNMlUKHYVC7aPm$9*SFVeaN= zv9JB~UyYuwuf?|Wng8IYuAoM{I_vTkzQ0^mZ@zhAjSqp5>vJ~O-Zantm;dR6ajxr0 zk}!>J9Rm3u!?~!Z$rN-ek%j&Bt11-7^hL>w<9dS{*6&1PR3Qn^Q}7PQ=m-L)GtL6I zt|FWg(^$N=RO%E~7)u($Mxh!kDLyQ0gmJ92Jvac_)Bs-0`J%)&bg2^Zf3z$y*(`4~ zLv=Bbe9L<|ecLTA&z&H&X%ZFTqT%P~4*q=~bPE~g>>v5gnS`aqP^D&MW$^Q%Y|NC>#M7kTjE@ zktB#NtW}g$kEo>=6U7ndBMf72JUKl-7gra+Sx33`0xJj+q&dERy%g1RO;DFwqN0<{ z)*cdZ8ra&-WI9ci%D%4SR|=q{JX_7@v%_l&?UkGLV!o6?XonmHap57imoq6OWSF9$ zD$^E~7bVJ|MB7P>H=?BJ2ca+3{w&+b+zqDy+N#8r=d7<-ekcNjxf278ZjvmbLuAX9-rG%8S!eAT}=uX{@u;%Hxso z05)y9UK0mP=S~b+cwvA)NIIdhS%>Y3KK0_steD;APGEx-3tgKe<5iXc0^%I_j>7dO z(dYD(Br2JK7lH&kp&~xZStL$2VQG!%64w+t?n^SA;)39cz4h8F6sj+1i={J}(FKm@ zYFgftS$Yoqi6R+NJuDyqqECG42LQo&Vj^M35|^L~Yll3B-JYb0GqWMzD>-Ic7#q4c zw*m4jmdiI@e)-G)`gazWb87N(g2@#8sN=-&UbT4abutj|M*$G6@3FNCC?_*ntP;3> zkflPb@q;d(r|XBOT?-HZm}d)z*A-PKVX*PkkO>Et9a6E&PKPSZnxYbA$iQ%cZ1PGE zIitdXR^RHx!;5``qYov6NRF`M+iPy@a3+?mX#NCuHk`Tnk|R3FESel9+Nc}MuKN9A zST}jt=@Z>dkfKqal(~rkYpVH03^-*gv7v!xBKYp|WYf&C*0tc0duiEp zrPP{L^_r6?pDJ~nVl8RgwrLYUJ9qdImcFCbyNDq z2k~~!s9aV_YJ|3P(U)zg@7;M<;|pM--C6K;>$ZG#Lr%!Z@SlmJv7_FN0-)=1H1QXI zybNx{rlWZ~JNxuotJhvSL*74*JW1>SU$)*n#3)}PFXYVstovOO?eN%V8p}YOs zh8PEA+6f}TU?yHm|)-1C_4TkD*9^&09uUDd67>YP3N_HTV_t#5r_8{P=~J-_iqAp_alfajYm z3!(7X>fa_E_D=gI2Ax)X8pWlxoJH%9al*OTrfRcIN#PJqk#IPLesuz^IJL`1#la&} zQYy2Z9t`@!Z8moDaE=4k@AnRe$`Qfyn8X`=G%yy4n=0w6CJ(z&)#Z zQj5T%w<}|$@2;Ap3ImQ30aD;OnE`^9H5Y%?>gg~hKf+h49JzDfZk?9k(^jXYitJQ>IJ=0Bsep=oY!ncZy$;+ zP%yMw-pN3^VOB!;VEK_KiY_Ww%#16gBTJH!O7bRMXDZlC-DR4p1~n?LkPKoXB7 z#HvF~zpHe;qKVXKjQ9!^_4XUD<8~n{r51wiFfVVL`T2ziQjr_6iIev~{7{_#WKs!v z8xBmmTBGR{r>kTIMU66hX&|1de28?2wvsJ41nlv6hGt@=k>okTk_Ij8!a9wjTnA*; znN-(3fnS}p3{x@d!u1(Sc?R2=7AINI3mL6+&%Vu!Cbv_Gco*PRHr0V!XhD zp)$JkHKg_9=uHR2p+WjRa{>Xl6)wZQ=%boN%#eNF?)OS~vlY7>w8m!<{-iId)`yBrL+khOojLQR|^? z9>OzsjjbO7u7Ax6g!AIdue|h`<kcRDfm+i&<4P6mwjaJxnQVn7eP749IGf5fE$3 zZ0ouY9z1yM>tBE4+uy<&0ff@WE*j|Q9EXCkJPfJap(YO=jgY7|iw|91oFVKv=2mMs zy?oGgoL@VO6Y4Wr0K|aN()V+>d9%n{b5T(MQDQM*QR$d%K)wNxwU4~4G7Gy(@o%Js zOA+mrAHRbvK+17KcPB}g2+|hCYu9%*$2GZkB$b0FylT^Kt6$KtErMSxQ$h*bXX!RR zEfrf3t!Kd6v`6>Y1!cMZ=9&!%J2s#(NNQU>G|fhNY>{O|>P;;%ShyxaORuNx^01laD81V)lubf-@i$qsNF+#L7E zJ*BNYeQ?UWt|cur=y}}Vn)XU#bT|%sk&pK;a?Um20ImQB#Z*qRW>My4eKooQpm4>8 z=?CNt9?x09?s+cmd}jEL(Kv0Pq7qs%PysWU>o)cUb{JABxM=$7fr-oHQMY4jpJ;4l zF%A7?nHnIxR;pvI$^=&f9c($VKs6YTRZ-Er67>>=Y(uP7L-_W>0nc{b3FAHS&En!b zOJW@=p+9OA`kr5<8+M`SJlyF>k%}#zK6$cUEDmnpMv#*^)r1sC_Rx{fkv)TtP7+yW zRUtwG<{NLkfoOzip>iWh%9%r2dWMk}1+{Bdi^QreO4x{JR01Wnv#mv;Jq#n7Je1XV zG{QZa&*w-gc~yG^)2fhxz=oI#B(d3SM5lyXxr)#ONE#Amv|EQ0obK&uP{gla)ichI zpAJPmUB_N2g)S+d4v`jFB7Pq-T@|lo>6$oNan7TRQZ5Wi>4%oNSnA+nBIuG1T-T?^ zPZ9eNLJ+kWEO&yT%-!tm42wW3PM-qpSz6wbS$BXWx}v+TK9Nej#NpwVA+tvqL6*E( zuZz53X-66dqIN~Ubq(-3*K_jZF^vrA6~dt(VPml$r#fAi7Z*TgS}W4uqQTIvwc!Y) z6IbJclCPS7?7pOKQ6t43_6KXkcCJiMXd*!Hp`-_mETuM0GnEDjMdV)EHwc_G0l;f2 z`E=3O%7>$2FX{uq0dVvvPMXH+H4YrtoSGsjyLiBtni7a1ZH48p(=m8G&LvG#{A0h@ zOW9w-J}HhxOeD%Q-r(j|GFs0eYI($zE8~c+&$BPQ@WP8Pil%?3Rc3-b4Qa78;`iB#iJeaYWk<%% zSkdH&)_9B?Ru&na=qIP&)fq$VVP)AMi&n!gA~ug38#8$sr(n~>**;&5e2@LW^lZcC zc*j0=Z9M1*E=KnR?*fGXBR}=BA<#o3VFmnStTi4?wz*2h0I|2Kv zcxOIcPV&N?mp@3}9J-T0EzS_drSz#s#-31InPk=gi$heSV1+0r|@J-T|s$6s7{S=n^f;BzC(W5-H= z-Y_ud`-3oD7VES0@Uwf3Fw~o6wR|hXli_uxdm}LS9hSrb4o$I`Q87`rL>iTk>vUUG zDCO*WqOP%7gxH6M8Wtg*-d{B{zc5~IBbuggvhYb7i;Z!Dv5-%EcGuoBOYEf2FsS+tLsP6xk z&dsMoY6FhHEkfuxtBwWUdd2=9{_+p+1!L3gQ%7WTYy}aZI*+hOfG}EX^3H>kI8B@p zFvl70B0te{-|oj>_yx9Ou$xOuD^}Uie$+SF7BHm5(y3cpr94bgWWuLkoE)>h-Rn6) zAPwN6+m64=rk|1C=!)D{z>ILK93IBbFzTdjV-tUH%7c;^*M!Lpu|dhm7-(bw+vDtm z=x|du#&*qZ0l3wUMz0s%ymKc>Ii`VIj3_voOzD#>s-~qdMQD#gM%uQiK}n3=>`c%n z-c?JKx~wU#&**5eT}8f#*iTs&_idK$)2rqS`)IaR<@89CDKQ#4T5a*4%`4+_L( zaRbazRse$P@up8Z-Us^zp0wq1HNT*~YJVu8kV<8n{e#(Lx`$uEwvKa|9Uk3#{)NGC zXzrx9gwqxbqKK+Cz%ILfih>Mx=MbyKk5-5E@r^2%@66lI&(FW|2Y`H#T*}J6uJCSQvsYbR0QzK2vUI^^yYN$1LO%~Nd z+JSpM%mgMqx9dAWY5I*ptLQ)c@4upRGlmXg33EadxvHp69-JFi8}7SRhNPHB20W2n zR8EhoUyjEQ0iMupo170~9R8dV8iC~oj4kPs`*u99a1b1hO&UuK>qj$ht0z{9;cD7W zZUhGh$S%gm>lj;+eb5Exh_|gPcItxatURrd8F!1O*CD8yahmV_k-gVhdMiXjvUC z8+xx4&GI}M?@c6#QaI|$jBPZHW;cnba5o>nf3AQ-9%fH#72@vJDhlz**kI&l<18=5 zrItqvd{Hfn>|ui7P*lwjTZ-?NG6d#`EVnczXkLINotNzW;FX*_LVD2|_m0N+ttaOz z{5$Y-;JJ7QX|HUHCA9~@K^hMhJ+Xx-opV&e7Gy0Zw~am%?57fY`SSQR%~naQ7WIg& z;6&Kd*$1&GD`d8KtGc7Cu|l>~d#C)Uq|=YkjP|od501w~M;lMo$JLb=do)7z&;0fA zzcqc)jt(h!moJLn6jZz&A^}Y0bb>_p`KzNqvq2~6TJH<}hZ9E<$ zPEblRNk|wR^lQO1GJWHym^3nPQ)nC>uc~eAiW4mvW}d3GBI^PiknNcBw*{G@)p&1D z!5om#nksVy}iZdUCHNWiJGharzF|6W6B{!F5YUu^bU=k^O`a1laWW=~J29?pzt* z$g&K_sa8QLMcfJSI3=6JJ*lJU;b|ncq`$`DjvoEkw6!5ZI3#wc@jaP6s>{yV)e3-* z%@?FS#Ah_=z`bS8DS$hUc{hU~=nn=sh;*~^L(aVJR(e#YC2(yO0SqyzzwYD!DuwQapTVI+u9$|`8U9hVaUs_EYWVq?XXmSV+TI8 z;bO=%Y%6sR&A!w*_Vw?5_v>H#+PiPP4GfLl3-3opd^CtRo7urZn#2Xy1>qMKz{&Z0 zrkyv9r?A(@bcRjb4cIM}Q z_SLH`68HJ#8=w0Fhd=hq@BE!*vZ$6#Qf!heZptQKbBqPg7hBkQ=Y-a9>Uw?dnD{vz z8$~k|_#+syZc(N!aJCoP>7pvKHt5^grfy2gOi^RhG5x+Bjhtjfx2?%Ru(~MZsu>5b z>?eNSFDHIyx>U!LZllDJJTC23JFKvpNq|Gh$j!Fuo6~0ol;}RmdIR4a*zVgUg+ol^ z$tE6tX5{&{XxfWxVAYjx#C3#^wB5+bHf7*A!=r7!&H{jM&;P|d^&4~Q1Vayq(NC?z z)^BU};Z|u;SWT9@izZO5Nv+;3doS zO8)EQ{gvsN;nFA&g^|4k+l|vL?C_S)#J{GHm!S4Wre;`xN0dp{fF5nP^H|Zsl8E?P zf+{RZY)KbJi(TTc!!Ey4J;Z~+!b(b31>SZr4bnBX6m^cZqM;9nwpk*1LV^;sJM;Q0 zz!43C{iBf{-g=2`WecIM$Qf6FLw~6HG;PZioE?dC;N+N*Sq<{1N3+pt;zu{5rBQd2(5@q}P!|{AR|LtG@H6;3u z@8j)iQSbg(DT3n=ZL?!_i1rk71Of1>M`cJ|q_Jf;X(V?+><=14n2LynV{h4NOp2!L@tv8IH{%f;8ap&`FRn$p2e}~Vk+i$B_ zzo}Y)Cqklh{o$jFvbILm@?C%oK#lyv?>K{*Gd{#a{y+a8|NQd(tzRpr9;i>xy_j2e z6k_cJgCTd}EF+H{JHD{?_V)Mjn&o2dN)E^E3ocv*t z2%UH+O%Moset?X5yTKcR&)rIh3Faxn^h8A z_6iUz0UFq|;GhbD3*H6KXC=cytMyvx6kA1eya0h;IO7PtSiqrT2&N4b!*#TH!Z~o# zHFRcPM)^f1L2?YelAZXrYt%1T`RlM^*6Wok#3_aNDsxVIHj#KqSpY%n@q}}dO&bZ$nil&(qeJk;_YX+>4F=1x=5{IS3Esw%2WA+_^vG@E99 z@n+I3j9}#Cag|(Phc(ND?xSiNj@R2B3pbph%}B_o^G4@sMF5+*of}x`st&}bzK}LQ zB`-Zww5NCud0dZg_=u71y2FlvH?uP0PP1WYh!brPG={bNk($>2G zb{HDYfGI2RWb2p*bIS~zmGr z4)$#?YNb`rnm%Ir^oTA*xT6%tHZ>{(H_*m&{pM=&3=QS&F$ZyJu`6!F$m4Lqb5Zs1 zdvvb1WW-az7V+bjpCOGq{A-cbR}-*VT=n{{7qA{G(8TaV&Wr(J2&f{ToP3cKJ4;6^ zIKeBrj3i%g^OQXrqzbaI*i^+XdgUQ^cxxgUu1RASP`5bAbF{8=CHaN3=(8=zrCAkH z#AIUF=}a$RjX!tqKKq={W=gw%cyo-^FApHC%R*j3!2I#-z>pQ=?T8m-{Oe|eCtvTQ4vHM?iyN(*tKb{N)d*1XSC3V1ewhFikojJ zrea%3M5CST%~Tt^VL9QduA7n~>XXYQ-cg)Z@YV21M(Ju&-}y9RSCz20!O#BuU)}%A z^u^oJ5y@z{)SIVuy0U^v*8&>H_{Mbm`5L)YX14M1>G{+1)b7oUwz9`l%kR~zGuy@r z4-C)#uzc_ffAbxB+d3QpAaZKx|BmNPYCNryJg~!Fo}MCn4yRMH?uSGnWU9A~){b>O zaj9`zrPe~-nJRLp0o#>rXuaNudwh9x`}W?!L576BY3G-hqzATLM6(pXYPd^dr((;% z^JAovNFvRxMo5xUK|D(`{M+>Kh`Q0Pn{3v&O@~J}a#2-6qF;)CDm_^yQ@qb~e}A=@ zUz{9&>bd9l#*^dAOA$CRa+$q+{f##kt2O1Q#Uca|HxVIGP8E4>DW!7CKKj0@y#*2} zOEKC2s!*1tsHxWKaA<93Zb%eV?jexMmCzPH!uJ7rpFH}orFN4iM2d=?H!)tp`%m}w zYlhxJlm5YIjJS^LuQgEehv;g}8KQo_pTtQ{wkgwip{H-#8PeXusnF>cmls${rgd1r zP<022V~VjKi5*$09Sy}0Ip?wE7P5=si@CXSdK$##9Yu3St?H=YrgY4>nPILM!9PSX~IQHT8{@25BS4w_+M~qIOM`f!&bYq6iIW0} z`OfvGk@;|vg5~KGiF}T_Sf)<#)Zz<61rf@MFb`>{d(pP4>4}GkB(Q)FHPN9oYjjXn zBDh(Vx#Rkke9(6E3p*9L8XZ~KVmdEUx@@%Jc-1@)S9Nc1-;&~oVh;9a*(>m+$yG^@ z!Mt_n?lYfw;o#_oA+V#9d6r%fjDgNYoWtCWvFOmO4z}prY%SyQ#!l%=`q*3MJHC1J z;K7%_{N?X_Rl|5Q|KQOZ3>-D-jJ?p)?2+vi%S4tjnJ_49HrU@f&$Y16 zF~L%kcI@+Y13*PlCAMHl9~8`E>J8%Yu)?wJGOOHG7q2$U)5P~&N(5q`J1@K*3nq2m zvRPzte8g~Q@Meh{i#Y1BzRPNkL%OIJ+LefK0GA-_se>)mIO?vKMx z%CmB-TsQv6clLcVVu?nI>LL%7no(+Wi_+20F|E@qS-Z9Ela4UM&YIcDs7cM{X6AW? zxq8+r&g4!xG9JgHX4&EwZ8MS~L@A5xsd?^~WoK6Y7XMVW?Y+@x^Gf=8Lx z88Z*BI@JQ@d7%n1Uj-I1(=GIUaHEroy*cGD`Hsi@ro#i zVmHoCaF-f5wXsvD7)>J`{lyReWxydP-Ugx5lK~?9R*_Y#^sqbtz|kNeV+H-0AOB0w z-G9l^#`Tp7g?u9i*cI2lS8Sn(gQ!_v$~P3Wp)b(3gf!VU;W2{B|c5q+3_f? zmrD^2t%u`rG#F%?HKIe7i+q+2I+AFXD|-M3lTi{;c=sY&MJXyQ77mDVA0JM}uFMBw zbDW=_-M)KoZ#LVA^x=~S?+fFn7>!56(GW2Q=Z0{Oi+20wtxVv#BwI$DZK;&F8hGny zG}-drRQ$l=geRU3ldMoyED+Gb!LTIW;)HM>D**wdb7m2b1H%=jN0KaO4wXI0o&A;)1pq4$HjWlI9SDiC z;*vIraa^;lrm&DuOQltdCEM19_KC3YfKI6S;~-41dK3mdLmYodwGo~T?d$4>48)RC z%|yxMeUkwVoa%_o7Ykz?Fy4|)m6L?0m4!Yr;8hbtv2u6BkB|a0j*L&U{x2&~Wjv$~ z+GtnBkP#J;v}#4IwPy+hZ^Vh0&ofF>8s#HD5&mQUFj zDM{Y-@gl~Z$Fn%}-A~-wOQUW*?!3!3TvKi`dEU8_c#=qI%unO`tY}x%%|a-d;_ZDm z$*Z;5RQ=8yxHs;Nu9UlY%P-5|!>0ahSbsNNM|F4Ju7-8K>WbL7_vwMzV%c3rt-oV8}%}|RxAm+doK!Y@KD!hI$35EbhF`m;ZPso}S zMM=)E=u*O`%apk-q>Ak+06YN&t}dx`PS!D372jF0yI^UCT*QJ-x)Neox|7;;)e@ab zGRAK98plsovov>D+o&6H8Liz7q0Ccp-tb4GQ6w#S?A_P||J=__UW#6P{NDN> z{m%Q#KSWycF1Y^^r7cuX|wrF(Lb})x;Qj4Sga5CY3%tCPoh$g&&Kz*(9%^DlbV!1;6 zL!@PJ4T6(L4{`lJ`_jw!-LvIV54mKQs$t7O$T9uFKn*6;kP~l3@rmVfes&rT>1`I+ zGD_q5If+PW^Ytk;{;RD>71pM2_!3|81DX<97!zei;Hs{mLorDOIodh6@Q2e zJWCY3=`MXkln8}8qW*K(jHpPKCP4GRbJO8)l_aax(iGw@BaCPjvo9&D7Yi&&5?^#+ z@t?TQ(}+&qC)CbnNwP5g*>MU8;`Fz3T&l{JB?nv9D_n3BFi83aop4}<*U}2M;O$X? zc8&xI29TOZCsYkFruTe7lvML;q-IQIQ6L`jqI04`wakXwIi8G-t!S$^1!+7&B8|NC9H*f{%3zc;2W~fI$kB4WlZJrP0q8ks~huEVR@2Y zR7Fx$n-inv!)VQ(b)qR*dYX(a&QdQBnMTL7b|oxAmee)v9GH_kWWZ*aJk^$rBRc6i zyHe-g-5YIsiY6-c2q?`2M3N_!(A!yp_CvNvI1`(Y{^^GfAE;Kx*{J)jA=nb}Q+x^z zlJ&7=o~&sAi=|T(H4YKKXwZfL`Jy+wHNZ!REEt13-;?OI&1FBwZ#7l3oNtFybl}zy z#)F~_*?e1_yTSQO=hVaz;*fL}rYvd^Kd_2SWFJGkz*wH8KlSha7cbm@=?Xo3Uxnl9 zyR6k(%=WKBi)d9ly1V)k!{tVJ-5;w<-Y~dI3{q z-6CO<@(jI5M92N=%ax2!x}T*Xf8z3vW{28x%HmC#=cA$6U3S}t#3B^v)|;4;Cj*jF z$CRmPfoj#XJ!GA{@%zJ;G{)4SPPwsMt>{O;=49{DojX!L7-Z{ZnHS5|5|^+)o}L^Z zfB5jBBb0(x#ufU*kxnd2>DO$uH6*t00f`PSuDbN&O_ABCMO>Bc9<Gs*7hJ;Li%r7rRpTl;A#-+(IR+lXk zQdo^Ttf3lK5&08VvnwlFqCpqX6rNFY*dK_DXsvn@>JdM?ag+6crdE7VYWiK(xW)7z zX*()sh`Kz*Kz(1E8Y1?^{SlwYkz=IboSkNo1-oTlRse9~@=rFqZ`;3@vIb_(FBjt)>w@ z6;=Ke%}xGSQIMu*Yn_=a>`EF`+$*SS7X%`JSUQ5_@QoocLG~$wIE*^3rO9$^=SmrQ zIvL^CWI2!Als&8wAc>EtWOxnRYZS2%C2okq4`nxp-U$1%*(Y9nak{^6?5Z86I4X?B zW3Q)1yD~AWBQ{r>=sRUX{Vk=Bv?}zs(+eoG?438?{0IN!Z@=^I8+Z_HN`~-&l(eDw zry7qVUPOJb6z_|YO*|GnkdCEsHJp&|SXNE1M+kCpPP*~le&`CZ0sotS^gsHnw0Dhk zldn$Koh*?&Day2>`nYBIeJ8zS7Ov77ejf>|*xIzJ&@6VWyCKZB?0`|E_`w!PRZvS5 zyI~_nD$&Rd55j&l$=+MhPj2Wr0i)OAICaP$>n1(_-e9DuuuLd)Sy>fzmsf3a)S13@ z`jv|^= z##-F`EbG>II12oH(wTR5$)W_&)jOLM7-Q$?y*@F@4e$Es(7p3YkFi#6QJ&O6bRFD$ zR9cZxw4MDyxII5X2yCOFzjxS=7rX~TmEfrAU`!IVI;C-`NC`nHu4*nrRACa>DX=i4 zTPBPtE*a%RxXiunAYz!0S9oaMUgWJV(~`svi$f?i=YxP$kXTlt2j}^Ao^oyo;6Pg; z4X54^T>ZLouDm!-pDecLW|?6WNK2c84~1B{QXAU=0&`>(sMSFjzek-9A`h8%sz_$o z4y|C<_%lELpFVeQ+ex`z*!aG0YI*o;O%X&`*O3NFE&Y^hH7q_eW!D`)dGglxzQ-1K zmbF#2-4mHETRNSBpeTX|ZAm6q698VA=Hby1HlwGHA8~w9Mm@L6&`krlpj82nxx4F! zk@mSHL$4-H@ue#;IwDL$nk&RD=UxZ@l?!BrH+TNd#wsR~|q75O4L$CqIQy zwT$EKPDE1}8sW;u=SAX@O6L)of5Q&}Vu~!gI6V%+$P0QN^9@8){!e;exZLkMZl%$pqJVD`AfCV;R`xM*9aiyfwuojby_a9NK8C~J7X)Bs*a2^$U7M3jsXL#rgY0N z=&dLtK_1U=I+ZczP6sl@HLa1}4Rd>Z?qq)-w@k-UuGc4ua%)V8mz7c#z>RQd@xvMn z5RKK&b5pAI=VG61mNJ&4Egq$p z;T^EaU_IQqckkBG5#4~Lk>dzy2B$v|{AvlGR0TXZ#-f^}>IH~fyoKC`E^-pirXmOH5FO{9tG-iNTnai8YN~QZ@{y?}b({a_W@Eu&jub zZLw~ods5q;Me4?YU6rP6@hfGXY+i<+8Vrtl58s_jC&Cy` z0_5TY%XQyt`ayu5XWSNA|$A`Yder5%rsPy~xr{srpocSFFX8 z`u3-W?|voLSwURB7k{)bX}th~(&$gzYo|hL1!qHC@@HNDBVNeU4_6NDTif9@>O?#~ zm%4()=0>b!==>Y@J$1loCD@7v#8oCQEn zc(TDa!>R0#h(|&=6_F*{(*s+C18;er;*8c}CCoJ(M{IfU zfXT$iD`|o2XjOwg#dM&pMb@lrSO*d{Qrvf3Sl4s>(EI5>{h!~z{bDT+_m)74YFE1W ze$0V9Z>tB+AKIePS<8#<9sAnZ(V*t@`D?Gerbf&jG7qBeBF%DU&k@xo052LzlxZxU zrYb9rClkBE<;8^|ma3hIFzU0N$Yz=+v0nKtp@9!0wquSrBLd;A@UY-b`om$tNkU{S zR0;dZzkc{5H-2z0m@L=n>Dlt+Z1tI!?o7sg!HZjG?T#h@nMzrUr0*7LuzPK7T)%Kf z2k!nI!6T40WE|HkyA$4$xb!g$4& zC%#U#*9#HURkCcenB$)&;}PSKvCW4ZL2qo7xNfgMaH&fjiO{|!bF*E)$8kzr_CYuBSdZ3>0n%d)KM{(C(EO<(Hs0Gi zxN!>rc0h^0ugBZ277KwsykhBcG1=QYymjaN{2Z|)pbAqI&oA(hRHl7)divml_i#VN zUajhnM#O+UDo8dm0T~Es)RDMVkw6)X5EesAv>P)qc0TgM!Cv{xBbiCTI?RA; zY5h93#FPh%O1YM$zFR;FUY3_?jizd(mZU&(!|pG1QsY(qYfp~iA*3AxsX9`e>g<=i#bTLqUw~OC5|&NO%!cP zwoW_=SSD~J2V#p-aFq$r0Ju6nqJswXkFE8;P zVJLLyfC(L3Tm@9Ta%HQ%uP*|ZM0PcFZ#P#irTDJluav3DSuo0(|wlQYgRqC_ip!m^TEMl9!;mAm^0KmLyO%~3LfpY=(~j)mNZ#x`Cs)vwCtgo#@nxd zRk-Lp8#u-?wG;GgU=!SUxIj`Cf`OMl!Gad!&=Fq)&FP zXr6GuS0uOd){X4m#Ao(k`icQO)6&$ykr=52@bm92n#Ie zf$IeAcIKs{LCkQr1sr7Nj{*)KH=XEP)YAj9|448tn$;ZJDC;HBz?O}Dn%ER%x>Cw}r^g?}2&Lh86LgjQ*r2(PB0gt&Hj8P_|pva7*Y90Ia^ zz#~IVWtl?|@Rk|LP$IQy%AQrJBq;t0;QiBo`Y+!;dPbW+rgAT?aX2{2_^+yYP{3I7 zziu~Eu2E2V*M`jN|K9KY-eR@NilP%vBCxPc=Qc;xy@c^?MG_BA9zAjdYN+@DAqX{g zYyOtSJqwpl<;otr#eepNH z`@nadgT29YI*=_@HPQK1CX{TlJ-6euP9-IsMugaHe`E!FBh~x5{)JrkTi<^0eSm{E zW&gev4tBQFU6T~&$D7)q3I|TXpESSvTS>jMv;{W8w)phJ4-|w+U&8?4Kwy|(T!@7S z=L`1s_tjuRxi6gQK-?XVakEYzKLRp99u-7*Tmv?en#QwuJEk{o;iOipmBm%TV!!H4 ztN<`^}ya?Kfsk;C9F=Ew#9)=@qh(lBlhBS56f>{A>@Lv3nR+e zVZ2&(GUtK^)tA(-AeV^o0}Cll=x*N&dww*yGET$CQBj-Swu&)K;J4agK0Hv7C}*P*Yf(hIDks zlL;UUz%(vM-F9glW4YR5E5k`>4pcWfnzUT4YF(w&2CTM2Sca(+r&^;jWfq2G&nrRO zqLqgLrUSARYp*z4gqLmBYuxmJ;v$_6WptvgXE9T1OwQRhDy|BMKp{aPli{(#-I<@B z(wE0^Zrr$`yB>~hz{z%Vxn6163{N9T)Fi!jd=Nzb6*p1c?e9JJ{4>u!d-v{LW0!+z z#Rw1|;KmRpM{{M)q7y5-CX2NzaUMW~hfHlOwl#%|Lv5BDt|F&%HfQqVCiQUsjd}XcTqS`!6^QiSEUO1#O z<@BiEyqC4-RsOsiP5djDdHr(V%-gih=n+$|ay+)9HD<1N?-5;8VciriV$aK&Ff}r55~P@T_C^L4;@Z}y4=z& zfdT!VUUy3iB*=BbfrqFcukvJFsyK&KeVffZ*O4UrDo0z96_w;>Ino9*MJ)q|I@;^u zvsRZ`kukv#xmgQ`ssqq&;PfIFARtf5$qdhlwVvl&(;bP}O1mRga4mqFg3O>!dN=eM zsB+dV$cN(SVtoZT!oC|0xZ{!cS~OWqf(SmV%xbwcF12Ds9K4aPisaDUAR7LcfAPN^ z4LJ3R<4dKR*9z1ycOXM7>009obI2>DkR$zpZK^F`e0N**(fab2zdWA<&=u4@kEjQ zF*`V%9Ui5OE+sZ`e9)i$tFu4#?7xXuF4rj{BD|I)5Q(rxB4O9Ir*n-D^Z;L0F0P zcs#;hc<0&Yv5%i$T+kJ7M-HWuM^iuh!YA?Tj~_j%I3&{NPMvJ9_!@&5EjEbNVnHUs zYJqDq7*9FdnZ|m5!~T#IRMDJWZ77Ki_(ETZEThg{LEZdjH{l#mzq!4f&+*EQSc|cW zmZdnnenciLHf!L*v53AC$5WJ=Y@T?%t_l&ea-D|Ky(JFV5m6N~NMt|3hKd}z6Mg!R zwke9X`N%g#ual1+180$Q(O|cAx3ama_(^^!VTCWHCFa)Kxq92t-VHXOJOSXadqHnD z9)ILY@2RSu%KDS=Xvwgt*qm~rkH$AWDxl!-=4a=F;efg?j)&isZO8T{B#ZuLal8{BH zA$)(AV_$8jlJ|_X(#Is$!Q(ca?yc8r+jS5S}BkB*yu@!$cGI_-nNwmHQ z^h?pJ5nc#gbqwV{+A=C4QMo2LiKR7~n279{P2vZ;W_2s|Q8`)B$!gTu1fS3oZ3_IZ zCH`|%oXfKN&pv1C=~4ZKQ;4;wpJAcm9^o$In1P|G*ull76>E;;O7+4TjVG-D7hL_8 z!Y(AGs!|zps@u12z4Xc}TP+azq99GbKby^1AQ8ZUH@X^{wPaIO5ehAD)VrP5Q>usV zv;s=L_x5-H-!J^;um0Nq*_4eX6dt=Zf}XQp-Ae0s9n z;P(60bU1K4H}JLLXRM1FpFwKQymH5GZzScrZaX~LG%CqJNv2+Sy*I(HlA|2k>RfwP zhN)fNv|10hftAnsMNDI`q7BxRA@^VH8(Dk$-9_}t{$SSozPIuoH|9l!wN{j@7UEh( zpBq@=NAwFEM!Md1QYapZ=-XOnA0(GgisxRP?%ndPl(l*LJqz(wxBl#D<}YaqV}F`P ztVLQ~y(fTC%bFf#>Tq@Tbf$x zN0ciq!vV2ZnKw6{8OyL@qZ5USW}=br`ObQt)>V7+nK6Fl@|Zii}`=5RAFMg#z@?ZG$zEd?xv-!>6Mbbbb5H_Y@Fr-QWqNa=$R8kVi z;~2~J< z*#Yqe0U4nbLA|66*cj0zo>M4{FLRw9g`1>(SeG_Od8r%bi;T=0Z@dA3GMUXHb{wLU z$B&SFfBMzW4F2rPIlou-23mM$qBfl>6EDyzbj(wdAX&?gM3t&D^6l@6lg zmhNmMoR=YjZ?^hrmRix8JKkj_{_%LUn5s%M`0#_A(>*fgDzp-st@nc4 zckYS{Pl{9SxH-@xo{SSRi1R^zfWPL6WK^sSb9SbpGG5MnNXAv7;lL9WJH;G|qJ)Ks zUAhqY3s-4Off(&FE$JvIVyH=iWlO2o)Df6YjPFN-K7J2}ePc3w?#7I~G)ZYVaI{WN zR*9%86Qbc6HMe}>t(pZs=-}opZf~TIh}%(Jr!w3mRAnD{j_-Wy)*t*sf2iLd7@C#I zF@#|V95$IuuGG+*9mueR)gi8E+bph<@`fV?4^o3DT4tN-Yif8m|CzULKG zFTric8gErbmShe-J_yr!M$=s!Ch~1SN{%DswRz`*mwvxEQ{uiw4Nt}L5K*nsWoabtG#-e zS#%!qX7^)d33e8qq!4VYJvF{TYd*AjLrNtTKX z;#EOri3|Xj8Me(v4^?W0P0#QD+<*8t#>44#HfSaWY2B`|V(<7ITG;56y&-7ByjJou zuR(JC$p;^N@aCIu;+|oZh`grh@qHv_@Sc(a+_IA>koZ+xPFt5!b=@&L)JmE#M!4~l9Pp*FA=udq0 z8}GgI{_zie`u-1n_8DG;qQd{&h61mxYW33NwMsJKS(5|c80W^ee)$pL0Ms}=L&U+3 z`4NgWg~8A*pEfbcyw3R08O)4ICIFeLSW4rl&EBK)V14pnI`am%fE)5h^~3M{>Tt-q zeKDE@5%x?oSuK!EiE1*^p@>tcFvAcGz(7_bdt+kq@g3d@RSt58+wfTMFX2%nQF$A9pz07l~bWhp^~ z8fA#w@dh`}6h#Exy6`k%l{&tMqs50JZ%#P&MG6N4m2_>zXrm0J#UP5{9$%KGfP<8& z%?qi8FgANMWTrWy?Wm^=5syx~;nZ5r1d;TL|05Ani^A~y^b~L`2zsr=3HstvmW>UU zGRvr@D&oIt+^9uRATM!#r+iB;AO;Ut5cUQ@rh@^Kd*MXt1g}laG%HRL{E2Jj1>`bQ z^IfK61TB>@t|6(iRsgPuz-DCl8aqW% z!$7{+Y*#?${Nc zd!}?vypZ1jh_C>O>}Ymy_=!(^;`Y6Jg;p#qs}}o({mJBLf8P^4*X@Kl+FeGs&Fgl3 zmTvcbCuyFugB{oxKX~-ut6%)>U;O)j7YB8!M9G2TiJ-WfM)g8FwPxW8_jYn>0zVL6~{=T=t=Ppjt!&577NJYWc zQ|-I<-H#c`o;_KstmpQ~J!f`vn5U%}(z2YZQlxm?)|aW49|${2e7@n2eJyz49j*We zA95K7MO+6^pbCaZ(eWa!EEel*;oFOlXuxEmE~FK)or04;W$TqHW~X9bSaK!h>#hA; z1K=1x5K47G7=&-|&eXk-9}*#%8l<~uNL#hblNcESEms6s;5DAKLU3&3Sr`sIKrX&H zrE|?9Z>3(+sJ)ISNJ|C)%|gyG2zj&ORW3|#Lv&OfycN$>dyMq&y?@43)h%Z13W!Dd+qmsADbZd$A$0@ke}c&>v7BCGkJM> zf}h>Ga~E4iL6A|$%X!6VG)aJ1?ey`SujZF&5a2<;9)s1SZ zca#sJE*MX+%kAdr)xrbd$cyUqbot=n`S(8#x~_`Em_O7BHv*2)0iS+m6|L3t*ijIG z;*CD}j=gx-_m)yd~Z?n(mQ@_7L+?#nwP2u#;iA{E*68sUhrt%FCDh1)y>MAPeU2a*0Ox! z3XfsS8RR5Rf(N*ff0fDyz3js?$00zB#sI5wV z?trTKPF2=;=q8h~>$tecsc_64*CCm)%&7y0ry!;C9IFMkgN3)*Y+Q$WV(P_i2+0(? z1MUdBirdmui6@0CT-4Zb1gr=OFPo(@%H%t$n1?6y#*G_VHd9$r{vkXR00kARmf`b8 zMECs^U|O2YdwWwhJw?^6qf6^Yr)iiUeesC~B#UEuBpn{=zv2PBbN~KxpZXMwQsy=! z;E(BObo1a~Aobdh@;af8wmWe!J)K6U0s)#u%Guow*|s~R@|EBHov(i7|NHgd_!Zj8 z)@@c)p63V=OU6!g@N-!N9EUW_*^5yyaFpYz%us$t*#dkZ#B$`7-by^grfB^Ug)xvV zXD5XdnEu8IZMWd)k3GCUa6S$=G07~pH{1(9 z{_AG(Fk4=vlNU#bsd$sYIM{r1op^P0BeWdr@^quGw6dh-rR2IK=-sPD zWE?|D80SydGOF5W4i6x|S>#&Dkf?0R0wZt?`W~)Hd7c|tYt4MqrDi#qy&=u1q=C|k zvXt4XiYqxT;&U+$ZrmT4QmP^zYT1oqQ%tG29%Yhok%f)HDfIrxUoUc?4GzNiPABsz zB9q8+2>#lOTws^p06R;!ILj*O^0+>rJy#EYs1*@Ih_UI0TU9i~!-l-SkQ$sJFKc^! zq<^+FdWgmQ(eS_ei+^K0*w!}cop@KXBWIX96;UOP7CHp0rNe8Bz}YSR?V6B6AEL+? zzw{;S&XxFpur8e!*m^>N!XGO^$mpXhrWn{1*6TINTzzsUeUW)a=tAt=-`nHpLAgbo zIw`;xBaak|$l+*&Ekk4s_?}wWKz2wHfE1Uo%!@nUa6e#m4QK2x%mBF?m|3B`yINWaP= zpUe)i*(HlhY>1RDZrhWG4-pCWZ`=R~7>40;xmd22n&KB3sknzXZ(^SrNbUXn{1l-O z87T6+>2%^peJ_m8o<82JR-@q%_bwdM_%xZ5J906f<0sSo{lH_>_avSwzE;5{3-vwp1dA zI-E>s1uRM)_yehimNXo4)QVb!I8|IkL{=)K)p#*AWLZ$Hl~OI{w0xq=ii(_~l1GLk ziw!dCkBzAyueRGiIFMd5OA2^rJf00LYb$lM!I|P2H;Q2}$s<4|jXi1Dk{N`&fL zUpgaVO%jM$4#$r~!o1d3$_~>Cfr?QUYw7mQn`H3B8#x+>MGY}S22dt^0WhM_JLM>_ z5fd?3c3uF8#)iJ3Ox2n)E+^{4jtG`Fig@r>>CaX&jl$U$F=*xez^cGO>R9q~&pyKt zz^tQoq$k2kNk!?7jPqI9a5Tm(NRn8}81$^iKhaHBlv-BHh3p|6(mP?Fbk{M5+(d2; z(vb4>Xl+CgdBv@}cR%^cE1cp{gdzWm1%Ei3&Gz=3YqU!9+Qf?1JnUV8Imt5Q4+sVq zXJ%>ojpE9)F?zBK_rS>AxAd}^INMFR)Bf)bAxHB;BaKFbo>Y8V(j06pqhD<$3 zV#|2R-inxyFTc9XRz=>`_0V!gE@ED>E=LCuomRv~L~H)Y*Vl7AsE%EbJ{in{`t9tj z$@cCK5hEYId$|qysfqYL`Q&i3Dv)#Iqes(lH2oNpBUzVi)?9JxG-_J*N3jWE^5iiI zR=($$GV#$L1qh{p3rLUmj{1NO035P>4V7e-29?#H^sbcAH;Zg}`BAjMrnfv#X>^j- zV))K6Ayx>;pOQlB)4a(VYu`0`b`@7m(KyJkBEkaEu23k9l#aQ+by45_gNM_519o$& zCRvlYhWBBOQ>q}Mr@z(kkZ8xcri>I3o#=hR4N;U|>xiw+m!?9&?p}31Swq+9zJp4RQRQ}{L z3W8K3-S1{Ze7V>^(t`zv(f4w(tV zy!yLRHxnsrADOy~teUfVoTu-^NXZhcA)f%GXc?*?sZt7qexE##FyiF!hRzf&^Ifwy zn&4V*L?r@Xn<7_ve*2mHXMWMS=*@;yj z|9+J`>Gh*q_h0?RCqMuAR}KT=*Uy)QN#to<(O=`JKO7Y)#iNR;TLly0iMoGL{v@%|c7eD*_bKIj{w*b%+sVH1Ts$5`O z-)!)4{U{oEWY%J_RMzeM z{9H0x08oFcU?A>;gc@9|HWyB7WEnY<4bA_0fLv+@#Mw^abFnfZb$3$)Tahg*;0VJW z_JC2pk568#*C_y&Z7H=7&_oPaYKqVZCDRZK6+>o=NKBEu+!Wm~EieS4xheW6JN0oM zE&ENA=~Mv{0NHj*Mdm+Q<`GeRT++=3cgmJxkKu=rG_WWoSL77&w54ezm(5g@bW(2X zMyWimlykWIi4Ym5<GF4X-84qr!d^S2MGng*LU$A3Mj&9w$d+#2%N@ZsXLsVJ>s0xmegwt7voi5|_vT(K~%vKFu-oOjNzKdhoSV9O&pq-}X#@-6BG!9vp0VuYm%M{@N; zvLLUKPO750e18*7gLH*$o9<}Q2v3lQJunEpy1*i%oRsL4(+W}iH+ZOlWcK?pEYMpR5yQWu*>I^MCw;#n%D;)tlZpg=^6I!~!I+8cOT zTqdg`8uoZRqV#(HWKD&ZA)a;_d388equRUdz*&X>)on!5Rt~@)%PkqFity&o-`}E* zYS$&)tbsctG^-xsvPDAN+o`iyH>ss04t6%xb#rb(7Mjly`AYWG}Ej%^~BV?VM zgV6}P#rg3uu1hbXuQBD1xHWj|#j=#)3v6|Lh8YjB3cC*_z_C>ghIEA(kMS^Ho*pAv zK^Q}{@M-rDBOj%xk7Z8wXRaTp9~EVc<%4mUpZ{~&kKg+@bWW-&s8e2LMI*HnAPg_+ zxq(-aOJszTfeik(h&>;?_s(KY0L?+K>8W9&~MV>>|6D>-~6pv*zfbKegEwLC+y8*ZOgOspuP9m^WJB? z^Q-q>)vM~R>h9{Qj_nx5?j(?OCk`Y5nJ7*$$N@KC1Ofz3kl>Gih!Em$6y*>8K#_<* zi4;VHB@zWg(r&xmW%uZws=KB)-gk#H?|I_;*4pR1`(AazsZ#0Iz31$+$KU$aTHpG< z$B(c)oxSuDdmN+|+5{Y2M|iT&@88EMnjRhDaEC!KU(C13Rx_h4B?0B=)-62zw`Mb( zu1hfip$k{njVB{)Di9Bmt0zwoCWrXCFv1BewwtQR)|)L>_VH+h$bI|t7FLIIQCZmJ zbiP1#QtnfDU3>3WxpFZOo()i<8+EpynUteD%A^Yf~ z`|SQOpysY0st6cDj3KKt+et;aST1o*Reu^+8Mp;M>twGyP8{-agl{iX;$0XIQ}ObU zCyo(_bri>L)LXJ`cj8gR$_GcsxFN^m5zx@X2M-sEMGzn(nsKm-GZ&0Zj;J^of)}V_ zNltyO&Hrsmt}7+y$*JU^7OULyFtbAzMXE|Jj*O%st9u`f;)Wx991n}M(pbUK!B!3J zh;7Mcm24AH1H*bqC{UE;aL8$2IlYueI`$elBXmirD(xtKTQX_mKMwNv_!EL7zuBT?I$6E$j~hH-)If2 zsAu(G`l<;YbB|$$U_y9JST_+NYiU zL=9<~yUJ8HkSKn6b^e50V9!$>JZTCS>|gV$2ik(XefRF0Z@uNn#Es&W%gf7)^K*@4 z(5__|s8z z>;h8oJsthngnex0n{wb;Uf|}NN@jH}CpLrFcWuu?UYge9L!WY=7HJK%>aeZu#^|4l zbC=5^Fzw0fqZbxR1g-TPD6VvIZ>6nujjPxCw}RPQ;}_nUUgwR??qreF$9F~uu8S*N zb@S+KC^}tgy<_9z8I+y3skzDF8w7h#WG)-Ei8na=n#@l2u7j+&1hJz!8G1U}4|8+s zlxCZ-(g?ulk7nWWGLgv9yf8{5H2{?t;{&-}<(oy8C9EA;HWmV`S0qC`dVf)*wRu?? zRcD{lnl4Z91lG35zjaujg_hg8tT355aZ@$n2JNIZ%dQ>`x`A=~<;mn$l<|WNkO!`- z8`#(g%O`Ee;<43_SL@}#+e{&yXoUuFMCq==c%{>dFKrY~&~Qd(;D|;Fjct=sl{{MN z*VbO(j1NMfDEuBdHn5IREjodf)GtxDIqA-{YS;3{t8abjmwp{EB;7GXwYKpB&QL`! zW2bGW+T=R*sx2$UA3a6u22u3e-~KkIE6Z|yeT}D17BV}EBUw$XTF6$Mn~(yV<41Id zr>|J!@Sbef>y79ZP#$q|ct|iY9MY{p=#yENIewt#ko2MEP@nzw!yzRQ-~Z>amA~I7MD_4yiPXskGS{h%L0Z@aMX`Jd>^YS!T|lwnaY>RazT?Y z1e_=ihU4vKgG)xOFhqsU>YhJL$#;x(N<}$5C4fq^lQVS*!QzV;Ktr^o7Z}x#I6J;4 zUVsru3g3P21Df5?ysZ?KdfPUQU0K<5nNVi9zL})&Hsh+LIir@WHMw*hhu*eQZx<6B zr-#cj?ZSG7I0IM07Q(6U#NECXFD@}_!%Z5ECzF)k@pyJ1N7t$bIm^(40RTGU?Dh3xz1iUI1&%Q!jFqCB*$J^XBlo3ZyMz;N zeWVhvY-hb*i`+}+xvrc&auO7KDQGig7K{trjz-|K)>4k5IF;F8l2ob^P)u!F@t#5o zFjAE9sU{+&N}8Ioh{v;>Ww}YSG&<*P*DE%jINHk>X`y034-6E?QIV!m9G{$?735%& zfCO-c@EnNP8gA{1`%sE=FS{7q^%^MC4MXb0Nt*^iPG(*TQ+(tBN=gp#l}ZyaR9Q>8 z$;meFiN=HBXxvehgq5(<<73g$yNN^xHi5qIP z%R(w6VU6^h$x|*14uTyVRw6BqdmzKTw47sU5bYe&ucOfj_ZVrmhH-uV1cxi_q=BT6 zy#3G4PCxVZ=Z;QKakk%o|NV5^i}Blg*Ee}#gPX-1AJ}Zx+w}%Fz-q-&ZJevc^)(*A z`Sy|Fa6H|p*p9~@(POV-rCn=X6rB?nH}myBdCDJhKyoBYo*@n$0~vEL8Vl%x{eG6c z4ci}(#$lO5KHY3miU?JQK;D!jvalmS-c4x?EVnWy11~aM+~T9p&z=_-Wv-lT3Jy># ztM0NIROVHe`$ygrw3*$-7B?V7~O~6#I#<*4hSwt8+uf z!;$GdL`vhv0!C~;80=GJ^$NL3$jH|fpj0^a=1+OvXGdY4)HmONqb8xUsD~5Z^Pd$< zKKTA+v-4z($9^;vUm}tIeDLk7&3WqBBjmPCo#MK6A|{2~r#YaliFMIuuG${vavzzv z^_-+L8^b^Kk6)iqV54f}Q8fTK#s@*NDwhCWVty;KC`LHsBuTohbkYO+sU(&4HJQ?3 z4A3!9l@6JPHC3)d%qz(EY^Xz8F_=iVNbYMxEoXK7wUq;G#VC$CBGSHL7q8Lo58iCQ z{@U9_8`4SHlR(Ygzd8YH@yY2`WmIQIhrgfwEGJ<>m#ozdAf25TGmvp(cWE7Tq zmwCyb1FuXuUtoIM|q3AM#mw4`pn5DV?j9Cku(@k0+Q zTwRoI;3HzU$Oc%Rp4rZ;h!6F^eUcb=T&{f|ee~|{{LXLOdeg5LZ()V4gx=_~#$#Vo zL8LsEfaFQPNnywJ^;`_nrlC&`CQ_{xmS*wqKvIY`BaA{icnL1dr1!+x+NQbn^2^Au zlf~7ZE>P@xG|bl*bKE)y2UDO@ob8Ou?z%%Vm!^}Wqi8tdT2c6w z3|K$~nh@#`^O(*FlS}2XD}f7!;M5}7q*5Gm#Kty3vR+rS=`<}EODa($OMs-?)}b4_ zARA6m0a){gAPli5Lt!yfZHZ#iCH5wkaS2&(%aBSTl}c+2EJH=p4a%Gh)%cAHW}F)W z^jgV)n%xJ*Ts-_tZ<8-rGt(Ig88`6}j`(3QKvrI3sbc{wLoDJ3||tw4M&Igs(~I0_I04g|HA7Z;c3=Q_SSJv=n^ zIvQO{F*n1(Ll^iw9HHdn+i@dKW(S{n`|U@MpWwWyBF=I?$IU#PPLj=5XvNXh`4iwi zkuMWZX_M!qzrX|Y(fkjD_tB+EfwWvehB%*-u+nPoDYuGce&%02b!^vnqk-MKE~~=4 z%>GJ;MjVf-tPUJ2V(w>Y7!ZGOw(z$rC`Rum>oxmwTsIX z>%A2A#f{d};bco|8+rO%6|Z0Nhg_|^I=9hIt<;%X+r9W z#4_17*d01Wta9ei>;z7rcl%g|yL#b#uN7LNsx2hYGof(PZ+t5bjm{4Aa( zgcPF#AJOpo3DuKW5uwT~=TwWV7NU$L9T`JM%c{IlqcuYcKRPl_I%@3d$y6dL2TXF3 zu=G58|F-@pjJT>ufh&7Fj(VpaCATAoD0WEcB@CXx^2ycTAZCT+XSnPO| zpZ$mb+1p>*`@X8W7k(hgS6HGQ2M%eTV$gpz{pjHp{@c}go%Dk$rX5&LY`H`HvdJ!P z0ujp%+tzQo=g7|V#h@qiAg_$am-(BYJ27z%oL4RH0HMr~IDi%P8{hb?uYcpWnonFe zKX?Pz@z$+VM#S+H56nkDdKWu>cyPeF;K4DMo2O30|*!gg?XMO&mkOWfI?^;Gaq%!2#+SQZCxN76WLy}{*8~igM_t&pT zJ6Lg>Az8hf^{T8$p{)h}lw5&m3DhY`mf|9|YI2BTFb8F^^+t3NgfmXU1@51_ckWzY zTtrcb+Xe~UY#4JxWs&B^dby%x*>pOP^N9`OB*=Omencw>00Aa-go{C1JeymTHT~6BqMnqAM5lu6i%-Z#Fozwvg&HFdDzQA3mK;sIU`f#uuZa9CtavG`I zh$};(o6F3wl~CCCQ1&l!RaV8#?Fh~?CP(CU6j`-hTo@SqT<5T0wWVv3y`g7m!2^^%n)O(q)7jEhM53inHu8?FtyIlb;ZD}2T!u;L3HQkF`K^8=ZHD_TfhG1?|=2X zKm5RArG1NIfBCi7IM*kB4P{P_XESh&oq5W7euZ;+c*uNlc*vsT_2ng7%an!%zHlYV z_B&5)_5#3wl8)mM&dSh>hi=dx@)n>$3}ZR85&?+!Xem#(17SZbR-_R$)I_KD%dOkD z=&^3QxZv$*391it^r-PHE0Bp0e4g zb$MYYbTTE|iDqb}-7e{@vzoPqE-%glqIPbGBUB1lP35@!%14oHrS&2 zpp&oI5F!xCycVYx5q$t405x<_Uj6O|LZ6oVsS$YXBBHQ>FAi#=5=Q-R#>m!q^!TxW zgUXf6p`g`!FP)+jG&1K%;x;`a`Di!_>?~`bB@s<13kn8SVH9!{wkokRKDSS4EYX{^ zgqS6G2pbn)R$O8V(F!wHXGu7~oRTaY#luQ?rmR9V6kZ93!@(|`xWfO%ZGeSzI-MOH zOgot!VgU97tP8k3aW&)NXfhsOU0nhR#OyVMfG_jQ%c3k?dB!^dcGy}k4+t!qra-;; zE=w$Dv4G%&;8;rhEK4i)XPYL{q9t99$Ur>haE&dof~!SpGK_~uhli(UXSnZ@^;(AD z%;{tra$>)Dx>#zP(v@yhw-ZOl7G|^AK!%1Me)JJ*x0V$SujouHyF>Y1A6m! z{za3F4LjD#41zl4@`e-tg?FC+V3FiiIOPMYqb>}P^Wx;yalNV8Q@tpYN6FdekL~A` z$C7oS<0Si6x-Hz$k>9JMpglbd9T|$zHy|YI1VO);%1PVvSVbGOuM*pixj(1dO_6S% zfty!8b*MN7XXf(B#(cj-0=V2z$YnYT?Sam$8CyDX&=|>c23c8OuTt%+3~$GWuTP}X zU;@_Qy|`~_hZZ_)kIC4oUIQ6O>6BM7ocegP@KIDC+|b|=j$G_^x~6fa_Fsye6b(_h zHmAoiwtxSJ*HjOaJ`^sQD4J8NYB&q9M?e*NEEMq+L^3_5i`(U+4Tok!`-^}4U;l-F z@h=Tz-UMhPf1$P^5?%(G0g~--xB59N{k^k89(%N*uUdYCzhasDt*?A#BV#EU&^KEu zRb_g5`oU%-|@5<@^--|xuQOPnu0W7Z%Qr9~{VERWZ$0W3EgDc>SN zv9z(`TDua9Wd(kSwdRBO-^WJ|&(5gDBr78V7>jw+2_ACu*3&P2@$JKq4RWqbSyAUD zbEfFoEuEyr^?dWu!>bpc2UE2S25tRZ4}}$uCK>o6)An}1X|q-Gf>t`oY0N>9B)TW3 zG1l~J<5fSpH`{&lx4-qR5AQ!Pc3|S(r)b%@y}H@o!)!n4Xk2XgpeDfOt)*2`O^#mW;_6SK!(2_wWj6AL!{A{7f(4L-gd|l$vR}n z>93Kxlc?jUc!0Iq_C7p1l)Tv~s8zou!H7m{whV|PZSBaSz(thWhI|ko=c6|{JYIQ zoTcK6QLDcz8zVBFD!qG2nq~Gx6tM>BW^;Hzo={05q~QsRkG=Mkmk)8mi(>2#HlfC< z75zREU?`l5QWE#WlT$>UEzwn5q?rhA+mu?j1a6BOTi*ech$ylY4)bEJ%WM(6^4e<% z&nXi5G)0CQk67Usd(ygoHo)1+j7EL+^yxZHb-F}Jtg5+5KQ=KL=Fmai41@qd`!~vX zv)R!}0Fwf(h(wZR+n58aY@{RL0B46swB)RInFtO)2sno$SwbmxeYT|ah7|2`70M9i zjTB8=%T!k*yB84=t|fq)n#rkgE1z!1o=m0)?TC0;MknNf5J#|Vv596{2S-Otim2<4 zz|H{>ita2Igxw;ECJX)m=L$Hus_SSpv?zwQDdj8FXO=By(Icri1Kg^HdR_>TOzCCxmm>%2~@=rExBiD)A#;E=|D*E?m1=$y`E5@a|4 z8I~5?=^xf}1Xb_r`PmhrII!s>=B3KdO0SB++B$xF#8JE(FT~euTkf7KGaPzZQd&PQ zoKHojXCZNC{Ua?;?vDKD_0dVslq??`*VzhT&^`x2?tbFn=KmIeqi#nOjg$Lz{ftUuQNKs4JogV17}BuF7Q1MgZxl7uvvdva0IuV9z~+q zp~fi0JwO|HrwpOs0EtM%(S8t*eZUB1p5lM8&*8``^GetugW=4l!7Lv-++>vsWVnGn zIgF~JzJ9XB9^!ky`18N`FaJw_*^pvJEh3>J-l3Cm9L=};x>;`sWb8`mj{M%)u`~?% zD?_!0F*(J7K$G8o=N%+o!nLkUMkc=S2|M31D${ z`}V=%Q9&_71hH+M=d~0wjDE_T9f36EilOn=^?gJKGP5nFeHea0@$%Z z5#O}rKt~cmjlC%-r%9=2KyME}L|nl>(9YYj6>wZ%U6FGqq+Nti1qaj+6G|pR%hi0& zK03!uBN@>YYg5Wb`IX3T)IzzS?v{v^sdOfvK05z3oIBT%Z=puwz9+WuIOP~h7fHQ9 z9nPN6>ErnHELklyJm9`7sUvQML2!6-Mt#yW6`C^zvH+~l?%drduhw-%1(i*4DtQaL zf*v8(83s`U)Ojm%*ZZ*8S-BDz}+j*~_BGy#abzMcy| z)RnOa>hy>_Y%2!smP`~=S2XavT;$70PPZLjrn}WKgu|$wHylrt9!excaE~N=1k6DF zD+*|EeKn;Y%6W}63Btgk0bZq5B1D(5Q$$;pZ5+HMf$q9W?ZsEdyO$wVsw6VaZ`qgoQM86D|QUP%e3HaTp*C{=UCICi3z8M$G4wBZW(b1&YG$S!T<)jVm%jEHsk*OKueh^@S?L4gk>DCTRuO4aZ}p z+R$SK35=Y3>YvKe!pZ8cd;IVrm*|QN79ODQNfV?9quB9$<)d)Yn6%lz^P=G33NSG4X!DQ%>f62U8NRA)WcX^}xr63uX-|=T zTUsO#jeN5a7yC{u3YEiZaWVpDhrKt7tc6aIA(a^3O>6H{=) zXtT@*Pn)1N=!f%q=p8@TrRFlU?2GX<^@#8lb@p!J9=YKy`lX4AZl~63H$SDao>kiT zV|TO6=$~HJ`0UO1oZcDVoRy__PEti9KV9e8W*Boi^yZ{4{;I7C4m$`(M9_SD(?um7 z`O(M|wG6gEtB2XBayD79NqY0G9=e&9bNDjB(B%ibFcUYr7kR20F4Cf`K<2e-d^ME2 zsJ*}*P6M@y#m31>A>|W~bPZf00wjSnnCZ`g;{_=pnZ^!W?7nhO}VHT?z zKoYS4kTDxaV zi%2S$+Zf6h5@9YGPU$b1{#6Ll2u=9+4}S22@4x#lYa3X17uSd>jV$YybToC2KR}pC zl1C37I5K;JM-j_9){LhQ@B4o6sW(519a^r}*!66^V7FNGE`^BROplH@LmP&8c%NRJ z_obtTsW5WEqq8#vu6t)^z~*yN_10OnTGk6+iX2x@9)00g%|G|b7X_`i8Z49fIyx95 z!U24&)+ulX{xv@KlF>oy1-W$IPtVsm3?co~6Q?=dm?y0>apayIUH`UXj*i3#%Ns{_ z-v^Kg8E)WkS)k z-m9tPn#z+<^{o*=7}Nb{T@OoUG{Sh;N@O++l{R8cSVfmb5UHWMtMC|}pL{nI7HGm< z2sKhi5-1%@CY+xO!%;ooZ+=8HQN&_{f>azI0OH^dNb}wh4=(m8I5?1uMx!W-ST~kP z$+N2z=uZMUJw;S+>@MnDcv9f zT43XwH|x#j>grn9h{Co|#d<#w>$o};%NroD>A|5S_m!$=;skKbqTKgDjP6*J(xNq^ zxMNphK_>+u24JC@A_}-|r&^pfAKS^8UhP7f@r3-iA#fzjs+)Q~pF4tzw3Q@Cl;l$a zLvbQu402rQ&QK9mYU&+=?&;YrO7c^?qS|g5fR9ekhH<#2HVK)?0bQeA`mi)L;%J)Z ztSNSU{MT#h4u>*8&c=#V9YjAmg9L{VkvvQ5Nu9(8P z!)f-SSZGp}Y@DoH>?%b9g(;0*l$1LF6dT*e^8Lr~7|!)m)TL zZ3d3h*_JaLv=i&#)fdNT)dozzH=f{j?DDKm7Wv`rA>}bFla3y3cX-wl$LdlaTQX7b z+388hH#GPZsbDv^`~v+GugxlthQM@Hy2%lhhvVna5Ae!*k(JcndzOY07Z7PrNUu6yG45I6I0LwepAUg zx_JRYSrqqog${6cJ6!VM{{3%$>syFFcpjd7@IEK($5hHwCl0x>%!pa3{ooNLB@T{` zu(T`Uk-Bk{B^#WRv%4>26-$?MmLJ7&{_6Z3kNWKB$U_DY1W0bqpPmD|sCafE^+Q@+ zdrT9tkL%@v4{u5zn3Izutk-@#LKbrG=YQ~rj^4ZzpJ^9KldMjJ8*JCX0{Y4^Is4NjSoDtdTU+o*dt5VCP2pF~B;a%4y~ z8jY~!QpPv*iNk)fnzGPp3XSeLHrYL6b6`D1qA$X4U6rTn)dpvmofEF?%*-A>e56Jp z7-8 zo`g|Y(DGyO(n~M7l)>0gJH(+kQkHCGipyYxL#l1E1#s*39op<+=}$Ig-Rq7I42BjF zkK!mS&dGQ-lTq?kRt)CuWO9(G%bOW^rKhG+)@l<{{>sC8x>zhm)0qxFY$c#B=5zYA zd9G4h#IrX=P#lgYmCW4`_oukx0}-3m6^_q%t5PDOW7dkM0E^nfVYEb(4VgMVgH&7E zQXDSj`4^!u95tW@F5GxBQO6b)tzu;hD2l`amLAtzstPt@L8p9G5vOl-EE(%O;-Deq zsajqRxuP`4oy-p6Fu-Yyft07yRwnq*Zrv`~LOM^@bU(&TMg91qz=x-kX(A_f%fbjt zBNT>lJvF}-Pgj2<HAqoMRl zup6>8({d001>jIY8kst*mGg_You5BZb6(uTr?c5M%U0`E!Ko!g?MM~I#5ma|d6pId z%m+C64+LR77LR2o2yS2JO z>m9h0)99vE+b*p3VoYjehwUOo=Jy#r^Smmb1>k=D8owy&h1c>tu^dZuhFE)P#h7C_ zev!sO#fYL&YRG;g>u;?_pBw9l=6ast5+J{q8chGyvVgkO^0Un{Z&vd(InV5=vv2l? zu{WFqp5HS+RFeZyHWZz2Tv>dbAGpR11`2NS#~&_k?i9Fx3cM02$;8aGbT@W(BueC5TwP+Bk%9-y`i2ZH?!QnFGBU9K zBZx08o$krlm>wR{Y<9D=HDLNxQ8_+M5x`uLSipbFG+`-RU`HlWl3J<2eJrvwwz|@r zWb5W1Jb0kXE18lq`#=M*ntTpU$H?j@V4zcZi6mjORyown;DunQgD1^yNWtMCWk*zl z%(y6Mr{nqLb_@pF)e?Wdb^Er?0}i@ItQQGt9zJ-0^D&%Gk(aOL*SPw#qhs~6&C@Ls zL#*|P-|=|lAq3X-!^e*)`FeOr*)h%$q?$3uaV!PzXA2j#&nfV~84rizCs^fq2Hb#4 zKd=~afqp3QNm(5#bTRbjxgYqzE4kEHh$p(1%HQ-uh)9@am$GF0C=8|Io04rBghxk5 z%lS1R5w6BSWYK}(8T=X!C=nO3F6(!6Z7qai=_V}CXsOI+)ub$1QU1W!anD6sa<$!3 zpA7*o&ypnNz>5%!@KyIgm9WuT(m|w;fR(s5a%FMyIs5oHY5Ecd9=oDs1rkqOvx4& z&ScF(DPTu;_oXxHsbu-V@sTZL6p{Gk0LFI9dI|2&;bbhdn074cFnbPP)aMn`6d$sY?XjBNnxsxlXbvXVqPurSuh7wGon zJn4r>yW@-h&RfNYS!1`sfzKA{cM>ev18)%B4g3?|vaLM_q*cb3bm7$wRCgU)M<{X} zkyH~ll_}_V_hr3+NH}yI=S4f&oO(9Ren3t~C!(RdXK^xWrnvQ+$@8Z3`1WK~`k}qN z$_`E=eCc|T1(B=$j%Uj;TQKY$;1f^oFa6M^N4#all$3Q<4w6q%-snK7?y!qH+-CRg z;qPC(`uSToDX-WcZ0BZqLji{+vfr|NbM;WNh?abKDjwH^+9033Ydt~eqIPUWZ^Xm9 z5kLcwL^Qv(7)FDjib8|FChkh%OD&J4d2w)@#P_n1)18x}gkHz<@_W8-(DSws$ zV5)mHq-BWa6YmK?2hvDW7Hle!JXgoK;lu;#LRyuqgag`e)K<({s4M#K{e}PP^_So7 zp^IepjW`+`d;JW_dqTP0wM!z#K}II;GPhHCN=(=x{Vb{+njmmi=jtzq0D?;YoD8D8}-4b^aLZ+hjb#g{Cc8*CvZ=>@Sur z?DI^VnqNM93D4pAe2$fO4Jbo^$g}`AD>1+1$#usCA`?xB)7y9G3z}?@-T&ghIedNc z38#K;BnR zlFdAO{S#9U7(I9e|Gu;SKmO_8{h&$)LcOFJjj^j|?As-VP%jOcbj7hN0Si)?fk+JYCC(L0TWI;@bLsA)NRBQc3*iu~yO zd`ZHxP(Z}U-tz-GVpDvQtPbUGA#d9)ze}JSx zNO2tDhGVtCElvqCGShRO(gDkLo7K_~`O(&(uA13lm3At%+mUgmT8O2ygM-y-NkM$M z{qWn@UcE<)KQS5B`D9((sX?Ok2}AVq4W(8XdJmU6U@RRsdjB?cUx4ho5CA3Mos(o) zlBKoeh&fd#c;DhCmnjv3V*mwQJM7?ky>@psxl(kDTG51Eixx;c9_L9i9*ycoz4x4B zAYJJ@}N}&mdP#Ew>Guo)GrXbFC%SL7m5B0deUf59&raj_@YS!QVxn? zG+nQWzRS^RJ(^URxUuUy56LZ zKc`og&8L2HL->5J#zB%635CXR5`-~DR9Ek=Xy5tT-9IthJo0N`CNkqsaQi9R%jyb>p~n{f|o zrOT$Kh)htKisl`+USar0lq)~`4{w$?mh1Gpwc!aMEY*{Cfrhwm8& z#@6dqDVq|;QXn-EHtgvw?m9@$#Pzn-eM3IF7aT)eSN<5?FiNT~s0X?wTG4C74`I`N z_`&<)5^U;xN+Y&ya)|sCzM>W_QPmXYKm;&7#WpO}UFfu_DoUWzmoY^DnzJfm?$hFi zL-vfFY2~sHM3yQZ4k@=FHX>B5tee^K@saTR7ONE?2-agts|6uW>GJw2iXy-oI?Hd@ z;&$6aQ8*cnmYeOv$B)L7si^Alz=cZ4*-;9#yDaCdS1VKM|M)jz_$f3`P+9}RwoM2Y zq}vViTGz{IiNao1CSLLo+#?E~iqDD4aWz};i#ZwD$5B^ zE-n|MPlfX!N@=V;P%kdaaC&i~Cc|MXEhI{2Q@zbWh%`A<%3K!rUNofoNG14y_j5&Q ze|C{LHBd?nE&!?~2M4(2*o4FKA|~=Y6&+h_DLJ^Q#pVSC1{;oQQ?S30iJl+~aBw*# z=jl{3k(q6Z;>r`$N^_6}+S4vrQk-OL}$7=x{0ia4mq35wuYBaet z|Lm`RPNq&|c%g2SM|o$p!^2T z3P};711X;rVe8T@398s2g%;%4)u(=cityFLDK$^m*BK5UP=hTb3GhXVBO;MUwr{EW zc)FH_rqz);u8iXYJcqr^Mp00u6u-fDt>?6=#~E-1reHUOy)pO?|Bb)?$-8g$KyrUA zH01&AHHS0{LT7XU;bbAV_MxFM(p2j$w;FgQ?s&AyKPeUseQfQd1Y?d zhHBDFHA0pL3Yl=Iu3&dQj+L(8KO>YnDWvt=Aco=mGwLIUlg5W?@1=A?p*~V8hVR2T z2KYc+N$JPS2N~gWU)#W*b0S7+(Hu0T(`H_am;tgq>Ib-<5JFpRDwD%69wl1At2sVi z4~H>!9}(`+qeqp*2}``)X?WYV+A3D}`C9ZpRFp~b&QAT++C~kJyHc10oC08F$M!{! z3n{YWxnU6E5U}Wrr!X^hggUW@WtMw5JBY#{ElSSH))m1M`zA%U-2x2zo_lz5Vgaiy z=A_h#Jplzjla0;z=euEy%SW-3q99Q^PhA8*wqR(kCW1=*htmOq7=*@X$&iSl^yeUo z@nq;Y2~H+bG)=7O=XZUL10PN%2rpt1#wkC_O;#lbxWz0*roCi-kgm}c_8Is2!O00w z0x;fI6xDp+6TJ;8ERbs~-u7%Lv>eSt?8Ei}1f@jOdcwq%$=EIVA`T7_spbIB{=sCb zUekpzkw5zI!{vHIr8JGcjw5<7=`bF0YP7D|7!rFLdb#;@Y(aW4p3d-)-@bE~hm&VG zXR@FwW^+fYjn4vOqTsK;>1>~Xya>ITQF0S%M@ni!`)j~v|!Z=AG zF`i1>^YEuq2lrZlR|F2uMdPm#m3c35)vQ6YDemhK^{%1Ob$jiv)^J_Qe`_~Dl4S#_ zo%sv@)|-1d2T~RQfj4KPn8FxJHe{0qQH>JGjKrLz#p;vQhHcf`ijwd( zEt>(l`1~;q!l`fW{QQwWdvO9~KlgF-m8Z2)v^WPiZQ^Ld-1>#7*K|XTZ6j&6Wp(!I z1OYPHmSK!6#lD%TA`-hk?!^k}ewq}MnMj?mk5I`o&%(@h%`-cihV1*eHUcyDDli9b zXRV%O-aY>&jRRl0zA*&b$!w~eBD$z><*hh-CDU+(6ug>cQ@xi^@@p1`pNI#crFp+7 z>;d-x@3hMQP<1sX;ljgUT|tgrTUvco5NCN>`_doEa03T7QnulAcsz22`okv6W|fy& zt?H{lCwWpS5R{{~@cZF3kUP$mX)G|9yt)Dh;hx1j=6$v);rHvnve-&#FAP649{Ok>F-|eXti4B(u)C}xc9~z2!!hE zvDYLmh;^`r)Ani1no1W<7~8Hc7}WohUw`e`I{oOu<#L@GKk3!UgDAA>9VPZBjl2qb z)Y^X}H%1rsr!D8X24YnkqwI$O9Q)q@Z4}`hr|c(V{ln2fhONH;ji>8{&iCSK+DB*c z?UzS7w{qS-J+)50Re$Rr|IY;g0XJKTTB6hgl+|(d^a(DNR&Mw0q-S5+)Iws=N~4MR zI;OXHTguSrUZ?9OjkMo?F|a75<~*8C6$&(xnF%ql@97|OibaPFF)s${7r=qU5s5yT z4Z|T8N=`4E=6boro0UQ@+s_dNw;L?KxeOhcf%Jg1SF1^((#Y`&1D_WG8yt-gQxO!e zcbX#Hr@BVqVO3x4tFQoKw>v{jNITJ;YE+0>hQ3>+OVg!Y#58SIAer^jY@KV=bWhbG5zbOIZL(e=Kn78mtygM4#5$b3a6fa@ zMM?;()rwwU0JkM6z@s3*_u^b!U0rfwWhX{X?JOWL+d&>ba6HL3OYUH?*$fjAI0cY#XQ7h`*?78?H8_~x+m$6%{Ssc3!g7tDSo=isL$!fjcEa!Qe z0Rhku#SfD0W*o(Ul{!_Mi8{Cp<5YB5WDl!V&Le3wP0dya4kn23zgd#t*26~X{=!rj zSM!fP`iT4$Ny8Ct$EHRuTC9CSgzfP8!GWI1})U7r& z>1U7^(Qp`qq0Gfp@=99nYRqY|N$MLZ*Uc9KS>j*JO() z_Ql4HiU|NiAb779>2MU-oY!riW3XDL_@nNM2MA%0G9&9oZ^RG3cXjsWAq`?~yq5Dm zjaHV1{!&UihTI$o@>V4x?o}=-a827iDn@sr(Y?5DHnr+7Kzmig)Q(<1p~1`T0M&Zp zY);|@pcUTcM@|rX3L}B8R@a&1*~2MqV^>$y>KKmsy^^JM>=TI>xAb4=Cau6lv`K1X z$65ty(Xm*g*LK4POMHBG8he4m@{dgR0{Z;5U;FPq^ZHM}Sf1Kpj&8@*&@|YPaT|d#syNmlK@zZIX$T2p{s<$(bcX zak%qW%VkT74`sga?Abf#ReZ|s^Dz>s)`0dvGYJ(n?!Epxj{WlKQ>im=6G=G8&1wl0H9I`2^9+z=Hj1&6&CcAA4@6yU)2ztyI1T}(u|SZuhC3bs zY`gK9FGfTF>YPN)7RS|Wh zuF#)>ni6e%Tbj-e592uACR^MXWlqL407@fC1tTc+wj0(q+BTQ+Rm(Qe4mU{X0{&<@ z+LPka$Kwei)_O7bgzF>f46GsG?w zW}W$gbi@V{sHj##T@z+pdUe!&#S(l;ncB9sg;0VB>xa>JG&(ssW_M(>mZ}&h)NGo4 zP@$3ZL(9gMqUf+;rt5XX;jEhSx?cri!DSmK+?> ziD#9_;KPE808pYbdY(8K_v9fUrvZI)aG6-T!^w|gj$jL58i-m9Jq?WhmTAP-trY~X zH@`~lX^T*AfL5fa8kHV1``K6aRzwaFkEAMqnj%q(J&fqiLoO=qUL{ddsaZepv#jW% zbAE+wm7E_ELZ}dST6vH;oNST#Kys(hD)5FOuFIeM(&w^Ov3-)e!@>9@vR#YX*iAdo z*^N$v0hgTXuTm2R5sj3@mW|0iKN6f<-w@PN4O#{;WJ&g}zvGcc@aaGH(#KY3Hb*|b zYHOoQhc6H&i}ULAwP9h=IsNkS`smgOPe-~gv8>@73dk_eKU%em>h90>i#6K>IsM!G z*rk9~Sp#q&iGN}6#1H{*?}mm4#V0QF`Frb^|M=PEqt)~{CcEOs0d7`VwynD7!^ZwK zIf`?V+*u$~k|ge4pl~;`8}T$F#iyl?r;Zb|0+Ce7D%WY)aOfW29ucw-(Ne!0mp`8P zB1zsUhyg6rSM}_{&IKd`T`*g_W)!T~RN4J$A7w5`TF{JJwVfYgdKF zLN&5CL<1fx-hcXQ|Ltq9eA?Log%=7N#;&$u7`@)c-fm6b**-rC>&jnqz$P(r+t)%i zo6T>3`OC_wzIbrINVf50id7&JRnY#@)K#{j%L&q1JWIFl+~QQ*ZZ)cx6bqX$GY-Tpxc!TRjI;w#F2vJ8FB+*v1N$!JEb4MQHAn*U{n| zH!%m$hBuAO!E-oJNuw{_d(L3I-4&Xll12^T36kq4gL#3ZeR)P5h}Ci> z!U??SUeI?*ZqC!HXvbJE3Yi(AD}XB=jmCKMX1&%`m6B6Nm+wr-j2)j;1&)-$DM*oQ zVtiSQttsVQ=1}k+tgxirrRk%G57;lKYBA&&gA+Dk_E?E-`1CB%2 zRfJ4hG*~;HZIVk^KH;^_mFanKbc~yGu~<+DD^GE!UC$Q}A3kiw0c2onKPyldJ-mD} zavCHLxE7lC;}w(%Vb8_&J!(zRI*NzT_Kgh60I7VU&@5bY_mXFdCVzN9fE~>p z?pZFE*oshyn1#N4?^U%#&QtORW=F>&ZNiEphuA}$QgTZ0;A}RR)^MXvCt@W>vE#g` zU6E$!pNk!76t}|7<6;166j^U}=10zO?5PwR72MYZ7MiCv;vJ;i3+-wtjg+ddbg(0z z8@m_t<6V)~rX+jJ7}DCJQZqL=ItaChm8YeaQj{~Ud{UjoHHG0zUtB>O|IL5#w+?5= z&d0hW&tQjwWtm2*<-fR>y&F>}m^x^yOKmPE;!;_Pj zUU`L1^!ti85{UJ(lQaU4eH=%42C}lUL~WWv+I3?|R;{H@QN?!5-4l%D%p@%<)p#kM zF$^1Q&$Hd#i<1G1v@)|ku%BU2?JsP%q-1--Tg2k}r~cjWE&C6B{PI_TH|aAB?T@0t z^IVPn$m>(%wbVJw+Mue9Q}g{35T$OE&j5O`hH1Jsc7F1j*(b zgf7tKtJ%~pWgdYG41Vx-joOwW`bVI|Gm+sz`W@5J4Y!Ry5 z0O)Q=)hW)MHrw?I_oT>-niNHqX+cw-3lE4y8dbR{rva2ukDnpD^hhY-E$0tM403`p zIoJ|LY82pz4SIxgI2aV-%AuYbo{%y1*`bR^9A_J9bFtJXc80(lj(B;LvU*!GvY1kd zGL+=F*GA{e2!0uaI3YH5I;!n@gQaUYnd1I2=`^-MmXAa*27b*lv!#X&79!#d%N&o! zv*TmLoy~TeN+}ClJDAM?n&3ri}%)y%4WFebMCT6#Q(ZUV}+TuLsaAb+tYc0k-*s;aMMJ>7-1J_Nn z)M4?gQ4Jg1)ftoN91sNCRL2>e(=nyIhliAgbGQoOyt8t_IGtwEI*TgSp{6Sq90EGq zfyg?DBbca)|CwL;Y!JGnTe^rt)RaW7j3^6O<^=;J)}%v87hjx0rRd1C!_+#7wVNDK z1u!8WQEwDqnQe<^2P2fmXHcUi9M7KXPa8Wy@!spz>C?5Gx8q4kl!Ps+YTP@hMB1{{N34Zaxz#aY9fAw!3 z%ud{$PUt`DrD&s(ITW>lZ3RpiI|(mmr^8`LZza9KKvZS0uYBbzi|cFRhV%39yz>sC z#mVj4>lKTrcm|gwb8whyv)R!1=;+84yQWqsevFz`xgizbP&=YR7S_SeodK8H65T^x zotaN#$?>1vhd}ImNCapvd~9mDwg9R&Fz`tJT8Gp=_mCi?9=n@QF|1isM)nePZLY*^IS)S(SRiAang(l>pd;4xVv8 zv7#9?wO^|$x$JN);`s7VNQs^^BaXWt=h>6awH%^56N?GBr|O?F&w`{7*Bc2mq7fjr zOI{wkiMSdx2S!Tm*zssAzNwk2HIpRBUJ8j9mHd{gm}ovykAXdJ_SJJyf>Ohm(P(sW z{=^hZQf;zqDVIqRK-cv&A#iB4v2Q*CRPbm<|X07va)Z2?3oNe^g|!G<@voZ95lk!;?jz(!HzQemCyBlsai9>uOMX9R?? zt)5h!Tsv{5lbKumD+L`#{fG7O$+JX<1sf>@V&AZF@gnYY_@l@YWykZ>F}?R)Mh9i^ zvnh$Ec(GVWv5E>YQ54EdBtf=Gt3UQtbN@qWLQ?341~Ro2SY*zzU)FbHm0DEfm&+u) z`GvpyY0tOkKi<|r|9S0EtHH2lgW$w>0$V0HTFRO0c6w#*emF&B`b@!arm8~iKpS5; zr3I_n?agLHH1ZCPpDRQIZ6w=bb{M^2x02sayN9^#ar<{0Bw;h_`1Q%2c7SWQoTpLj zPLCqtCA2cI+?D4=6XRj9#Q~uI-XL~^A@0b^kL(Y=$7urKo;?Ls1;}kgUZ342>@$lB zGMh?iikhS_+=ubxxuEjicP|E_^rin>-cU?ufbr>Iht0aAS@>*xa2~bQrFI~0eaio! z0=irzOE~4OFkai8C0l=n6+xA5^R0^mJCzMWKUuV8M{Of=9Zyruh+>duq#bw#P`?EaL!AP09 zwn#D%C?M-nw;M4)DvL{&O9PU@3Q-`GeAn3t(wV#ekS;HPLpk|nAEgSJO=maS4}3gn zoJyB2Lo9>_-Dg%K2ewiT@Qr`sSM0a!&wc#-R9QhkdO29$5^=Dvb70L#tkcvv+gC5D z+Q6~L<%6@qht~5glC;IWh}7^|$plY0&`j4f`#T($+nvVl=*2omxl9(z{BQm3ui|Gc zmm~>BGTS0G41BE2`^?Fa0xTANc0E?>T1fubtkfrV!CuxFZPejh(aV%JQOxo=6IA9R z-W-Zn%FaAlL^ZVWp%e#ZY*->G`DI>TUDAeBD*xD;az9lWjOx)MK|xH3l!#JPwQ@gg z2_Yq?UP^UrxT!0O>{B~Cq}dBAHX!BR04lO{nx?6#ne8~E@d#hETr7Z25W{5nj*k^m zI=aIfCT_DxNc(h*t7~i%OM587wHEh96TRG}Ciebz{*ABO)4 zM6DdLc^JnC1A%zG;&hECl=5U$69+*lla%prh%^_c-nH$9%mWX=Ml*GpxS@`FvRRos z%8Z^L4h;dV?lQrK{pc;bQ3DZHk=iL)CPguvPFXln|MAWkg@LjW>55>PqKHaK(Ma_B zO>$04!Xt;MuHYeasuoWN#o7-JsP`&dNL&=eKLjV*pK^T~tXFG!7;WIQqtmmprc4&j zk|pCp_$8qKYPE6&2~qOPvhk%#lE51T3l^3T4nmHzvQ>wx{PHXJM4*NJ(^_JgN|?_V z%k!&i9pX@_O;0eNDXJc-35%;{N!vv^9}W)29Jm9kqqc{4d@wV_Ll_StPEkoMsDw(m zT{k^oWo5HomlR(KT9dd3fAl?<9jm5Iw_EZun@&l-%j+v8?G;i|4I--hQ-?#$fz$0~ zJe^{*E0Ul|>qJln+!%}g-gdnzg(BVVT7kx{uB?2!N?1Gi2??0~fiQyR&x{nha0#g~ zoE#k1I}Kctfz~Tlcf^HGpt6fcf+r9d*7F=8py0L#io*9&!(+2PJU!DK58L*JmT~ZS zJI`BTUvRY#m}66NEknFyGR(YJVxl^!smTeegMaduK0Taz+2cI>kOoWsvG1MwgV2%! zem_Pbr3;;VG54b@jYM=w0b9<7-1IToDT6I8`>HJP0TvAz1hs}E+_IdrSj};R)>TYE(>fH2z|lzHuktj=ZI>fj{0nL(aE zSe3;ykWt_0;NUf!hBC8?HOa}gWg(U&yyIO9Ku77N+B6{)B~7?h!B+ivuZiCEY9~8~ z#a@65>$5@!MihouRn#_uh$AY?%OsZp9A$$7Y>9XP(|VR$Sh^?#l(71u+f)*(R3919 zrzc3X#{bbT{|~cC&xZMUg=60+se4_w=U!U0(2wZ&>kDs42oC#${ouX#e)Pj1$^>cs zdtd$P)ARG|tE+){q#3=Yt%aOYTf(eZ>;TX}P!wz9Mahw4aj8}}BgJ+DI!Zb?hf*A- zRy6(1#oLp)>`ppx-|#6#LP~1R^sWqrj!=l^3Nd`!#$y)4)tX#Cg4GtwR&ZGS=`Wm} z0BS&$zgVZcquah;|M=DQy%&y}CX%d_bfrCA_-{7WbEQ6~ydGYC#Srx1P*U9@aa_0{ z``^f(u$9o(%}v13Z{K%ckQ~M9yVZAo<9}RePZN84ddi*DO2%qFS5+V7!yD4|s3cQ0 ztezyVO^u2Hm=zICgXo_jOQDeF9O*&uH^{}XW;LQ7twZ&dwDz&V7Y1SxQLysA_b%sd zunG^vfTI;{yM~3yO78#e*6llNUI%sf2^O)<61${EB$f0L0z?UMon6ka5zGLd051qQu<2BI5;9mJkiQ*xK6VXJu#-X# zw#=^fa7YO$cGer91l%+-@I`?Ni)*KmCaIRw0)bPwdns$NUI*gNI-E>~qY+{xurIcZ zpvy#`WA|hL930G;gGwnhh==qHk((2nLZD(R#1lgnSuT{3V-KXxY?!n0xL~V`I$C^w z{a{~JGU>zAf6O7ed-dEkS&B!I2%E zHwKpVcvMug=sNS_=~Fid)C6@kzdk*?#bg8UDA^*|V;$gJ&%xn1iavVy@PiLOpfQ{D zF8fT6if}~~4-I9@)>R~Q3Sed5;~Wk4*71S}Ac(T}7F#5&2|1#3fHjD2@0_I?j#y9; z*@sH11-Q62-TtV6o>I9KDP4_w@ACYK&NOjyqNWmzBUXiKK1WRuVPRwYYf5Z!DhE#! z$*)>omG+`&_OL9cZ4pHrG;foh9Ucm7v|lQFNf=68;PmHGz#EQ+yt1CJ%cCm^2Cme_ z#RZ8TPi3ruAa8bjLL0n;O=&L!vF{+?aZ_qUU^8LtYp5#I znuZuZb}(+Q(!ozO0lidG;Q z3sZPd2dx#3ocPU=kf)4iLx63k>RVt72;P~@0KN%hxyIRG^ z`zhKeQI-#o$1~NG-Ah096VXO0zOwrB{QCNvzyJFrvNg^3zWwdG?}9)0p%P;Zh?|eoZQo~h<#B;Ya2+r@uy_7E=2`MJ-`O?lnQlH zl_Ik+OZvG`O(t-T;?dXg5{nK{_cfVbI^Pm15#60I`|9o=RoQ>P( z$eYYXJ(AjT`*`KQu9#!cW^Qud&Cdr_&sI@*+M~eTZ-6<(7=2f|6Uz1rm;-=gFFC5O zq}_h`(eHlu@ALM+R>vacM6OKJXm!V7HC4t&c6}}t*V3PrXh!NNHRXne)EI>K&qYd1 zHOc3&NLTa~3l7w$T*Lu$ndMU_RW1CItH_0=z=8O(t2@m9Tsg!L&(folQ-&7m%mQ$1 zn2Z;t7OqrG>}DZkIArOxVX2F?R<(^~6+tw)IhtpfYIX%=p;8>$fHP(NWrAz=p6{v= z-bjSt%_G7a*f)}g*lKYR^AO}xF}kzGS4@*pj-pho2WU#c@WZ|j8yt=Vcq(*NrMl%J z%nwInAB&Y`vk4_PJX_j=)oBIa88}{plJnzIdi-+TTcBh{E^-cHq}q*)!Qlt`nMqZA zES$<(y7+2nqQX`1Ok4@1%-{;7Ab}(#1Y9I>D1r+rBqV`_4V* z8-Cw!uf6x$YsngOOl-Um$wM#S91e%`!=qq0lKTRoYm^ZDDg(!GOHv4`9kOY{j_hbfk8LhpnsHVx`$)G`xfd^DZX z*$!3blozBbK~p_AI^x72x-f$0qTygV9!t{w>tFc%dK)WqcBjIEr$8QLOhQd2%Nqbk zikkTI<5RiC0%;v)Bl6v|@elx7d#TV>1Jh!)Tt=)JNJbA*|7M+n+SN*c$Euf=*5R<@ zG`qRE5g5VcI#$k+TtjfHaU`VG?}oWtG`xE4*PRgz1lG_f^gOvrFlhCCO?7m08w`8P zLx{a{{$B1c&XaPbDk{or*ccG$cfp31y^9na9ioxjr;54|=YSu8-+w83{Xlqv7xS_} zUV#S>N?LNooFJ?w@75he)g-<^G?FH)ZQW`k1Wd}JouMsN~j>#}-M6iLImeA7Mf2M_}(iM&nL=*j&_8W(~UDpE&p*RDAzyGsI0o!XEE zfy0wGOV%-*_y@-W?ktG`X20u+k8UR@`r52n+jXnmc`I=TDOzUFxY!iLJ6y-@O=e2uaoy=i_Bv-ZX zkF|cBO=k1sLu9lc=-um}zax`qL$o~6<&wM84Q}N#0Z@>N4TNyR)w)ADy!PJ%{4$@o@ zgvR5MY#bm8*68elldlH|la5e@AR9Vnsf$&zUNIX$EL1$9dHDyni8wJ%+A{1OgCPd>7vR`VQWTW6 zLK^>KR0M9+bYgQ{c9$!gToAdN=vIJjTIEShAT?xR4DTU&Aol{IH0EyF4@=xONa;h_ zJUP94*G3G^*2_gjN2@Rlh!k2{rCTXgy+JmwCHADUmxfX3*-lO0IGZ}8lKMlYnmBC3 zDmRr6x)EK?in3fmOS{vmK);u&eh)_5T&2EpYys`1x~#?r2k={$3p*TLlghwR(@3)I zG~VKjd@Q^wOSjuC$hHBDMkF(Zmnh^P$`?QUGUm7BfMugjlYn$3I?({fgEZj7-vqYo z^1MZ%ss@9d8w5ofyJ3V2+hF(tl)47REk2up+Y2$864o~B&1$`#9UTe$l?w2x}t{^l3I_>FhoL4Jbm0{tNRlE9c3qFX_*xVc{4EQaH8M6J1ay^>2Yh(dW# zu_4w~5QKMMd@<+Pv0Q|7yXN$eFNf!%?p4eE75utc%2p%K$S53vPXl1xwu{B$(Zh!p z+ZHC}bji`ikO-V8OL2)VOuLy191fv?71M z<1k^Taw!f5_mdT5Tfz9G*F0&drND9St0b#}939CAv}{7j6M~{8tYyI$!7iGlkj(G^ zgS?^L9iDURk+m%_&cw(9$%UQPCMdnD${dJp^fs|}p0Va1`s3dNO1OOUJ4J_)Njze@ zVoJat`F1Nh^X4C&Y@Vd<#Kp$#n(1|M^Oco7cE&FZ1ZtE@ECt`Ivs~-obfENUB{rg? zlQ-H=QQ>QeooaUuuHsc2R_%Bi=6Cx2WpC^*D>N85lpr&-FeSKQOn-KLoBTn-|LQu0 zI91!8-k&(0wY*B}qUk#qd};4Mg6nV!rHc37UPvSkLDO+q>0*N48FDez6h=SakKA~j zudh?>vjm|#KOOGkx1dI~IN8l&5CyA@x}2M``CB=zQ6I;e_r+u_uKF`-v83!;D-C4{#i#< zTK=mRNS^yBc~8vYuHX5>7r;EPs>Sv78(;cTMu#U<7uV~CbNmKXv@!f`nHrCy2*qJl zEMPYZC}cE+D~cuu=5DY|WhA!n%cx13!`-6vfT2USDncp`a|ap$a$>D*2(F)UB6Lg1 z9h5rhx~Z9g4w&l{u6iZNz9t`=)2dsef>v1`{DGzO_E9@afAC}XpTiuy;K(3u|FD+B zFP|Bgy?6hPobT7a_6_6re#r(g44h$LInT^q$=3bk!uZGk>u-2;1m!d~)utur!V$Yu z0G3g-xMC4|Fqz182x&D5r!mVqfBXpCMh}6?C09e$NDH2?iJr^w9CKI!=)Q z4vubG+yq-V7NP&A4zXI*P}1nbx8K&OS{JGVkS3s5T5rz*rzrTX+auY>^L%l0gW7W4 zUnrFy#WY}3gHXbsuxG({cXeo)Nq8Zt{TUNGYV_jTdDd*oLr2tE%SC>P4 zB>b^<=AYeoHj@x8;aaf5gBM@gCKB5={MQm0CsJc~yIjs8Zf2>rRSpdg#47n@$d+_1 zy8!l>ms*`>CDDu_FmHfffW&$Xk|OOhB#>C#Hw8POxZ*hSi}Ixs*5$610xw*TH=mmnXr00C3E_4ue%JDcTK!mg$+6M&y1~gdl3^jQ%Sdc2H)c zr?jjSu&<5_XPQ%I*o3|%=N|znY*QJd7FdI}{JEs%YNzF51{y@gpZHU+bPVv@x07~@ z*lJp>6@c(4kx1ao>~w%A>zNYRm@`OXUBeV!F2uGA>u#GC0TOu2@Gbv^AUX(0hDCz_ zhq4n?+Kf;)e&TcsD3`qc9 z-(>R725u~+L=%YWjG(D~^=KnUcye#TUw2g1N&m&!dQ-p7-*e6O)H0^Ku30U z{8di&$+w=d`aHga{gL?_M*~7f2_-v$V?*f_YOZ#8XDA;cctsA+rCB--n5KKKrnR^3Z+PWG( zcPKr4Jk3AV>I1 zzx4kokyfX9_4=p)8vV0uTy_d|fLhNQfQmukx0)Uw&}~U?hpE)jT2)6$;E-(&@}Lwu z;mAIAG07KY8};d?hSmdg#}Q!Uynxtt(&O^}l*&kIs9_k-jKb?Sy8-AX=^0%jNR)?p;Z>x0`i8Q-eWGKTqNYwJR*$$-%)e z4AFYvqe0h*@q9X!1548c!YWOBcs!5Bv(0KLzX-rInKe)%*~D=&os16-=JH#Kq-ZE~ z^e0QH0TU>l-5k$#$~4Bw%8tjyDNh;}pX)Sjvs|v;dFPvJiTdmssNw~%bttO{$U`n; zO%Ax{NU*Hrb0qPUM_w3a@ON0EU9W(;&};o{1EEu zTDGKm4l@mX%wdq3C4(1pCwwZ<0B%69`o)0~RsjqSD6|!3CNfG;Y9knP3IF`R`3m@F zRioA?YAmb70r`m045hr$G?ZLl;;V!`$)r`w57i3+C{OS(1`-rs9yk-%+^MD;{b)=_ z16YoF+B)Ha%73yf+zz@9-q>%`s+Dj|h@-!VfDKP$mG>|epdiPk)VI-O;cN(Mm`s!D| z`tG~$rmzZbUj2>VkWD{@#CWX{S8|8~l6L)z9VAm3R-6L`cP{51s=C4u60n`!e0Kje zl$;_5QL<_nUxnnXSmZfFu)AggDv_ok5f7wA_6y{9r?Uft{1UJWnbLvK4#P0et>t8r zEk;HMlgS?6fRrHMDS^xsdw=dLKk8Y_K8UvW;_0#dBhDvP%zJ+wf-z*fs=R!EKjkAI zed(j${qncF?EBYy4v_(#V#paBSij$-z?x)*!@~Sd&Q`9i zyit=<0qEx5Qc2g^#-0bN3fvt#G7*awD!cw%ugFF6X{*$zW>lhqD8Df>v>iLPfH5SxA$83mScV zRORyo2_@?lCloA$e#Lnj4+qg;G_n0aR*St$7WbqI0Lmnd!r<`a*pHy&oTJFHM%iXC zV!BBy_O_GAd~tadXQ&c2e9|$D79f5L_)3y=ete9whh!#}Rlr{cK5(+$bSiaueJvUP zWCk}x2WdZuXtHYHVcVG{JBc=pAqP?PSB#sq7!>ctD3^ zFi%cA z=2iZU&TMyl38pt)@1tUIUJDs@-MK6)D?_nJNaN@*rSjeV5T?%Q@}&+B2E(LkKkTa% zJ#&-F6M|8SchmVtC+@_JS4A}R1Sqt$lO->#XSYch&eIAC5bLJ`U-I$QqkL$)&3)L) zCF|0o+@~5Y_L0U0@}P_mTvD^RTz?~$T|fHJz@aP5UPCMzc~_4%@uoODqb0-Aqoo;XtCpOwcDbDDuiOP6u|$W zky|hQ4$cn5Ho#nwzpWl7UD=ug$DE^kSYu7w2o--rHC z?7WR;iX~gWW&O~P&raRD@^$IWy4e*ZAYAk89IUcI|M0)|FMXRU{lPB@QRncYvmRgF zWMmqC?Tv?@d-$b?zu6t1p2?Mj-y?OSQHswb;qC?$1=9UaH6lv_5oK>^RU=>`b#r-H zkX{5<&>B6hlvY2ai zii3S0dus`^4%FCLMc6EE#_Z_lbz^GI2Mw55lGlK~ z*d%HCa46pc3GO73-JHrIP}**oqsv9cER~4^kk|okDWV|m0vbH@E2*o(3kR&3;V`IR zk#}SO2oNOeqF&rw%V9&bo2F>+Fe@wYqG@*y+F*^qGn!1HtV)g@iUf#of*>V-?bfUH z%OC!*#KIODT*-JcmVeF;k1A4e1^7t36bvCR$&7Apu66rsV74-wO~z%_Y{1XW2>oWPZCyODb*pKy3EU#vHnN~uvIvtb)+x;!NL7J&!{hevR4A+e_H zFPBC47L=+x_BZ7&$W?#v^2;fzN+78T#E~BkP{s5F=aRy)ExDXP-`RQ4lN`3ra`^N@ zJDkokCbcoRN-+*SL?19jGllV0vUQJaN;wkw5V?~UDLC_^6QtYgbsWdgJBbGJMaY_B zaH~gh=Hv0@#kuSiA!gBS<@(AxC}Dt(B2$v0&&DbXM^JQya}X~i8+yH36-3Ol!$X}b z(aWgwy$}it1W=9YJa=G5kJ7%9Gvu2B(s3x#?-{i084SmR@hD3(lWw}J<(M(LAKufuN zxCsm!)D7S9C(jfo1kcn($U^))&jD)YtB1_U*GM_jGSXJ!gW zd)GFT_GS8BkDNPU0Z3AEw;;B`Vo6PlxNrzjffDUqz!5NNJ44c;7ScrUrU$>|B5#u# zQx->1WW+g|T=*a{*;+AehN! zD!T@UB(?B^5Xd$se}Y(O?8aNNb6MT%^-2QG5eNDW(zHv6Jy^=c+0}kJE(XXg%Nu03l~0!73R*^*TI9EK zu-{a`k)tAoOWmjr7&cwlzy@$q9Z&=UgFlqx<*ChwwsMfnX*jvuY&OK48vb-n{x<4?w!e@75M^* zh7!?{Ko5q~@#ysMSl}cOWtK|#91RB&vt|3qW3o_v_w??4IoOmPmd3Pc8=lJtP9_t$ z5F2K?-Et1Xu$fZp^B_ofv))X`Bf%U#&5GsHC7ZSUT;eL)owTx)6TG~>j<+$|h=+5z za+g<^fOm9=E#T$@gI4wbv$0A;oi#&?Iik&J4#6xz5hic9`Z)Sjg~7lYxJ@7tqtqeM z$0QzLpQzX1=TuiDp9`E3mPw2PKj<|Db9NA@AHVyqhso`k>X$bduWMTlPqFn@ncRX` zo9*@WHGC&P(*bWoofAx!Y>l4(UQ;d%r4A(s<9<EeXf71Cy$wawKwz^@lJt+FI2`@@8UQfMTI76{FW~*ird0ED4zgW5*%=u|NE>#g0*l*%hnf%+lm+ zFrI~m31)BGH#$0Tyv& zDO$^@@4%l{{YxQ5<@cAP1Dft{-zAJMm4hhyS-(Dwjt(cL-~!j-?$8*MdT*2 zEb-EIXy~Z~w_Z z_ve4=KiHps_8i*S^C5^lY;NthF-Oh!YrDkU&AVDV9gg=ahRJUDxzBx0*@frl=Yl+_ zNSP=}E#N$QK?S|l0vv?_WxH5HXnkrcqP7XEEz^Zc4(2Iz##N(r&d*UjB}Ee*?IPq5 z*DF*+B<)k7Dp`nzp`~V}fr0~sx*cH$2K0$)aV?PfqqoVy|%nRwD^55K01r z1O!sS*ODOW8h=0C-WnN^jpb#S>$f=G`aua zMNFEkR(kO}=F@qWn52S_i1xtE&-0eiE>E_SX=44Cg(d)0bgfjt!=gl(&Cx>EW;!_? z5&)4p+p2v@*#H3-Chfsgd5mtQj+UiS6j3rAxiUF(=wTF|ot{AxlPsvi!}(x5mBZMs z7US_K8ja>b$xF;?`2 z)nc)dY+KOe(b?IC)lGPaCGmQ*Jvca!MQD4Tgvo6Z%cGZLlpTo^b?7tFY;B|O+*+8v zAvwvS{7%hLXK1uwxD>=7xf{uLD+|dVj2^xB-VoNZb^?Y9@@*ACk;@oyRlv-pfwC=1 zYpQx8V7DqIsPsbGT!Db;zQ0~B#*?XBB8l#97zyS;VXrLZS6G}tB?BTV^m`-Q%s|6Y zP!Zd-CRE;=i_6Ot8fZGd2`?BBpXCk299e>DncO}BH$DeUYT^~&_0H~`-GA_4dN4QX zTN{)2Mk?#p=E$@FQp@!+3X@CN7Tku8D#wx`%IkSmA@7BV>I$yDxJ0lR;G zJN9F-l-=r^Tj$XAB1eTK98wuD4*KkCb)Cv~m#uPh*&IpEF?Z9lYJD;pT}xd^CUY2} zz4z8a9?DYyrpaGtkYe7^k>diiox3Jc_0P`sg2jG@LQq*G|2#mYOQ zz*Cxlu>kI;@;0m|WG&3xR^YhoQ44&Ob1yPIV3#y5>5<{$@y?p=25)XX*6M4R2|{;o zXbT*$%hsX7#h?C*|K3mkyFar(HPt3BcS2s~ErYv##o{)GX!+*-4+RnzJG5c&pVn@Q zZ~yx2XFsb75VEI#`qQ7LW>=xZDG)Ry`Bn$bpS<^;Loq07#8oQ4Go%!^yjyb)lY5X) zu^mivndX+8*I+zyN!@3oU9)!J;k}qK)X-g5u?VPxyO~4WBbZ=;thm>mlt-Lmx;Pd5 zfBRHbwdh3!Kn}!UB-xH~Jg5kAGIq0q;uds;P4mzF%=he-!S=7FtnyXd?iv#qGcnB{ z`DcFM{~y|r*Kfb^yUUF>n~cv~{MHx#VWMPaj3z?;$yQ*oW@lYB3;>cqBeGdAKp#|X z-!-LEz@gv+Jz&Vjr*IyT?T;po6!}Ix)5^2jhguLp2bnHp6wIh=ZuD#qtS^2D+{{_w za|OA#b*(iCrHkqq%Tpn9Ok|*{#5T4vx6}@*Q{1Cm5XB+|-9{ixE?|`7OOjrrsYEoX zGb{#4lrU@~X7vX{xMk9QGfq;jH~;M3JuOp1`Y(wiNwwj@(J|aX%tnw%hiU;{G0^-=151^RGUqV z*%{A2Iy-GReVPMCKnK<)j|xGTQ_b>o*_=$6{T7$ki;T+jFhG$#gwiSU9*ifT>x(FZ z5njR2)UY`^n1gc~21iFnXD_@UXH?Noppx5XAYeDJi0(B1$+L93TtE(FIFwC50Ik|2 z$-l}y-7Ie8775_m#L$Mc2DFu?GZDymVNT7hBJq?^v4 zv4oJ2oW*7ND0ed>d@(YIb}KlGoJmE_V-SJ-v82f6V2mwwyGlpXU_1+NyPQD8 zk0D?4TDfXzobSa(4XTjMPe;nqc%QliOB8hjeTy2(CEPb_dUNzl3r?PMdUM1<#BE)l zvmIO?%+a0Zv$BS)m&RP8m;Lpn5N`8cfo$j`0o%ImDgH)~&z zUF$iBNwO0*6_!X_Alqn1w!jh8Auh}P;qNQ_Wn?vuA!x%cx=?% z!R9Qx&b7krmlKRy;q3a8BAKT5zorV&PO+_1!-9U@BBc4u!quxn{`=EE^UBOR@XTj~ zxoXK4H_0Az$Y%Y??|mhBpU3QX@>(pmuYUcj`sXZf|Nj5@xqMyhv6MwGI+X{|_IbX28w7~W}@E+J?=^N*UZZxPHNnU1y z0SX*T?wTP%TK*3{aK1Mgk1bk(=bU5oL&TDZrrim9TZ_dFJ=lV0))kW3mY$uc`ZCjQ z1&nUD8yd8_vX&e*S%6$4Xg(59am>)C-YU7Ox37bAKr7kr^zcZ~3_MY}7eit@%U*i< zBal*9F2Ss%%D4*ySqP9wq*L>B1A6djN5&|cP-a(yFza$`Ar%M-K){hpg&=bJB}!%m z27RYfvMggFw-)gXGr+$3*OYl$WJQM_6TC*%W*u~swy#U|N>CKUb6^qDN@k29LzQ{e z-j-lK=&9$Shh4D{xKrfX{2~E%TmnX5v{kN`Aesg`PB|E9XJ>VmDoiXvJ|k9dyNCsQ zx$@i1Hi?trWODbx0~p8i1xHy*!3s!dZC4P;W+TuR^&W$?Zq)y5z$O850yNou1F3}^ z&!IkFl(w`yileicB^NWiU8qp|XmnWk$O|69j2Gqfp*dFQ1;j)C# z(t^rl192NCSn#CpeBzUzl+QnZ_)u=$bT%7~$7I*xA+2-(mDSg()rN2jRoOhB9n3Zu z(2ZR`4B<=QLque=SuJkl!NH{1V6c`Owq7GlmX#{Y0e->2toqo;J}yheruma9r5dWr z2#{*FWWC5X$8Ju2oxFEbeKW5zu31Dzo9JwK z?hGb}Q9t+6!il4NGb{2EieN3Er{g)YZ+4ttjqXRN)l%{yJI~7$5qSOy5KH%4hB7mJ zj(C7U(qaljP1`5)&<`DLXJDRF2VSl^=g6wErZif0c!2^(MtkVCABhPgceO~1v4p%v(`h(AA;s}yJ^-58Qd@p(~S(Bo9gt?Ly z^IwKP^-SoEqJ{xU4+5aJ>Y9fLJnh(SLwuui2}uld6J>)52;HbG5g zFb+$iNX05l6bP;cRd$;pWe*PTnYP>Hak0KKdi39U11}>*Y0_W{h1r5y2O$h+5C=l` z{%8K|U-&?@QP4qH2XpP+aI8X#@)i*3b}lNnH8!3@8_&(QeCu1^dh4yX^pbw|v!8wR z=#j>W9J`w}9*GyrymWYFUs|KH2c}O z7c{-}QJl9??PqCvadQK8DNcfg1RPr1a6nDyt(DYm0UILMn2KC!RRFmHJJ7Y-xNu6R zp<%Rw57}f5CMB}H#_J6?K~($y_+PpAN%wh!*+#;KE&|BYsUXZClBe+cNqByotobRn$8IFSL|WA>F}JyQiAy@MA& z!Y0X|N*K5@+!=cdCDK_MZLX*{dc>Or*EB}Ij#YPq`8_s5$}@niOuDH0x*dV`;asoR zFv`d?K^u)WuuQ~49nzK!5zfFgrmC5YN~)Jq=R8dNfCFc^#{Q~7p?aC2%&_H_AM_xo00qJGXim}6YX;2}tX|a? zQ*9g57>&lJv9(S)#OEjagrtx`Xey)fPh4f z(tVL8SS`9&?pl6eOK`4LYZV!LD1ahnBaEpxVV92ndUU;b1u7VA1)b_Y$ht zW9vhS0S3HsmzDnxTB|_78f=nYtCV_0KlGzNsd1=M05My|VKg)czb0t{0fnCUhmeelFc)tE9izGKYn^hRo*D6HlQ$hk;+$?n`Kd#ty%P~4fjrHhTw|oAPi_9oS*^V zs8I)KBUULkHHrhSRgO`IaP!tm@I}=T(4xI8q+?p9LJfnqLk25{nhs(YCief2Exx!Fy&TWryoyk$C>36Xd}!!#xpdWbJAa+N{fZa1k)by;ApNwjq6`Hqr1lr55y zx@20@LhIMmd3nh-vm&)n;i85wz2#5$Zz#J_AYrI|y`hkH~T|YX1BIka1jB5Pl#YLm)?_o#@b0u2zFPlMk$hjNY;nFnW z2shp@AOOp??L}(}`VK;GCO|)>0EX_g`T|=MB6s;%YN%rmL3_aq?%usC!Co#GgG4Rg zCHd}nGIl5_vAnraRX5m`2|TJ`zm7wKA+t{P_tfxYyYUDa)$%7rCul^BNP4>qp^xo) zWw8w**G1`292P@DFX5FowZ-^guIgm^q;HnXa5w;dV!ER5iJzwPK*T&rsIpeMo+*tg?0W2iZMiC_H(E$f_ zEZdR=Dpy;6KATQj3SFS8Be$b01iSPs2S4adzG1r*(q4$0?X1WeVmtS%zW zUa6?BE{o?kPSz^qLoj(>)O(RG)H6Lh7{GE}E^xLj2P40NA3`6QI7C(}b{S1Vc|hcE zCkGLTtE%w*ZC=U)-Tx~pKkhTpQ$8mMQPOk+r>PqKitRGbQ|fCiF|TEftfmCi016?( zFeZ>UwO5TvfWsXaNqH_zpsZ zuA;2vzjFOY5h7gR*$jT&+fNqAT|!7z$>E(Zwq5V5j+6Xb|IIJ_@Q?lY2VRHUXv5l- zDB4{Eh2|Y<~x1v)mi{;Ik zfcl$sEdKQRm}r7n4E7xz%p3MNcfE<7AQ%Y~mWm589$^kyTM3%kKiqo&7lcsj`fEqPi^pjf?|Rgw1( z10ODHoH~w^7z6@}s_m{cDpM*mY_K1ptO8>fMg_-cf~(pm>&+H3gi$2xfo`k?yfbD8 zib2)Qi*#4GprO=USGo`4jHt38yGay9CKPLOl5$!d%B_hYvozB&jp2A4P+;-m$zutq z4ks0imey{xi60IJI?D0U?|DTcB5EFK+!z+;uT9SevkyWzg=}svQ^R~XnapGh9}Je9 zm4)vs$4TTv&~CqTM-@sW{t4jd=sY}|Octy4a=n6guIDWm3!0}xJ-VoBLu>WadL~B& zs1bd7MqKS9)R5l=Z$?c3IQj>oF2%6b%f{5_NOhvjU87opzXV}As96zt6?q)b=E$=- zOascuXfowwT`r4p6GJEDD3V z74^>{#||oPy4`Hm^cYsaO+A^;Y`RHHXita;wOrBBc|;v$HB%4RtJ2Aov1;vf7=o3{ z(~_;_`@u{1?rpOyPE!k46sy9d6PxxQWt9qY6|55t$8!DEa)`}Ae|dG;5ksJ>5=e}P zNLP`k4mmhzf>6bxs477nIfV^@H~1iEy8QA-K4Mw7Xa_o@N4}IgQ(7)cWdaUAiy^yPnLxZj5E|t=SPvO0C|F78%rImtgN=%c)ePD_#+=3jR8~k zRVAz?*@rQpj#?UB&0ED5m^!8$7_?tWqH&2AQRMq)|Bdh2zPYW}HU8de-GMW{7kLLh zjg{e=R-~2f+GSSzkpOKl&6BORZ(&!4x^#$1;K^Z#=o{E&(Qw45Rn2U3H^FFf_*R3J zeC&FWK{+&g-hE0p{ioJ$ppk;sj;RFOlz1O+3T1%KPe!;XaG^;a58W?h^tJEG{Y5<1sZVpH7f5B5kZKo$5rSq{8$$v{;rw0Er7u3g8H3 z^K5o9Dh?T-sONhwRL`k=1?CzYQe3!GfvRCvgh>z_G$cZ>wTQZEN$FD9+0(pZfXBh` zc=Z}^oH1W>diS2iiHy-`B-dxXUY|dCtScO{-?Wz13n^ zp^t(BCuETUsUbY?YUd)MG>AzrJs1Mx&o*THZ9AsBtZcWV$pq&0WGD+n29>z1mW!K8 zD?ltQ_*EN-slnjah<4I@dEO#$hcsET7bsg{08pfD$~ zT*D+yQTc>O3^aJ;1aZ+Uv@BVm2^|)(C6Sj6EjF{f$x8Hk?9d61qhpu3T*o9(;1-xj zWRKd`QyaCKn!nl|2TJ~ffAqU5bwW{Em?Y>4_WirxcPOv`q;w8qm}Fc+Zk;i{+u7C| z)WA@))8WJy2!fAkWr^E6S~@p<+KEY?;L-D43ksY)Ded6-Xr)HX4rDn%o#P;kEGDu? z^S;nR{}Gh7AVEREQPbqB%4-!KF=!bNbUX=2?(27OIr4DOGx8YW8qi0c-QV3ndH0e! zKx;f4c>chZudXqIi*Z?CwWiyCWi1B~j1J`c91PRe-0=uQY!H%RtOmaFO$>+yuvDiW>c^y+0a}*8&mwMTF zPh|(4MU0g!>1IB7JHP z%OhH_;VSXN&`gE0VL&qmOUu|eO;ztz% zlNGGKM5OOmH4e=bF<%P41-||I@te6`)#l5Alqv#+H1 z$7DV?Ie4NKcoNu6S29c2yS%(yTwehIIj+D;9apB-JD%JK6?GVG4F`kuYL(GcOrp4E z`Y33Fb=e#o%x$`ELhXPmAcv=Cs;p|lfEl$bS1Efoq+=y`$jw6)I*N{`v*l)^9-9e$ zU*)ulB%U9i$PLZob!(u&wpp!@PL9XJ;cPTsZMQJ*Cc$|$8W@%%dtXAP((T?HjN;YWE%hy5e0|Vi)m`bv<}$6P{PQxz(YsntY-)j<$PY)78MjQVcsYomXgLkpzxA%P!} zy_ms=h2tj>jA~lJJ?H1=0-lD$5ytmeYY}uJ&xn8nlolZP>jeY&%+YNaI>IIqv&;DH zVfdox81ZUK@WELQ;`iQWy^^bRd~z~~Ld^Iu(3#{9#c0QX$D_pq`Q+hv%w`iHvMfK@ zPayXWkZUOFm8U*UvH@S(|CNJ>?g+=b1nZ54C_`e&Ii7r4m1l$DNMbo3c|rGq>{_rt zl(aU4sa_6azq%^Qn01IS8VKqI{g$0&Fi~tr_8jb@*o`|`dxL18MC{$u1p4t~!+JED6O*F@~CFRX>v4YZ$=vJg3?wTD*a)2u8QUrq&WThDALP zs%#oJw#m8(7M)dC)q`gM2Op>oT@^#kM+`n}#_|FaC=~OsR6>JoX`7?!jZV`TY=6*# z#Afll<&c!6j%yTd#~+3hY@pgP)1XonPh&q~1wdM_6fPG*-UT5L&gQ5*C@_s{2TxkF z>f}OYq@4~zHlHkW5(RQaA6;#3HmFkEJ4R8iDC>37`>pGyPby+J41N1nc}#$ae4w27 zD0(`lun#o?sySQ5aaq^CT*h_N-{AcyiWQFS;T$FL#Y58B@QeTX-~M~w_rpKd?1Z`W z^?_)k`cbkX`2OnL5Qevm_(yuS9kzk6|UA<3n{-Oqpi^KZWSrUDBsT|gIz zXhUo4x?U+Ij@6c?Y0M-;OAa+>1r7GIwL8#pJPehXq6f>AqXCQ1FnaQYidG>zRS8$n zs%0MlWkE~R6@77TH#?Xq0&E2h?hSoa+M_`+A-d3Y@` z#rw>!eFp3a+ws}=t+@pkke#k@n$9x<@BzGbDGq?09g>tP-#$A$ls~9pz1CgTAm-xn zV|nB-uTKwj>VD-c2Km}8g&qUTT5>P;wGE=Tn)+R#$(bNYmnC79r%V!k1srdF{p(;3 z@(RQ8ntv#ZQbCa1Q%*eEP>-fAYNt~ZCaP;-|L|`Q=7%*0izMx)pG!SCn5!s=q<3YO z+VBeva1oGPw%hdzRS?e~9~|7{F29jPQ+9)fhO~pBL`sPVQz&MRFrD*anBpe&6AfsJPe84(7?ILX9sD2q85MC=E-0-hv42CZ+ihCv-& zq)Q1lDYZIOhMy^;2PaP`K^nCE9M5Kuez9bCisaUmP#}OanRWnsIbDG8n&k>pf+D<3 zjaFb+A&C|V^U&8J%jk{Jr9 zgXr2B^YK`&_%?|pfPvy5*)}Ur^1FhBRI*In)v=jWrKZ4=!3QXsggJjco6U4kNG_Bd z21+$mWpcbh+n1GKi)he~yVvlpGvVn?r3cnAIa^kls z&y|5LHz{C8PcErTQ7QR^dk z%1LrhVZozef_+lm-kFR+RIMh(O*en@5B{<5lFI_6UjYQ3jR{POkW`!rQkiD?p~P%~ z8h+?dHOw@3W-W4?d>_tg(a2NlGR<7_ZCTx7boLQ$;B>SRsgrhij=m$jOz*m8*c1Et zY~r{Njs^C}Zq?8l8XI+dnU-dIOZA+s7K)lB@l)2P03BHqVdRr#){Q4HoJ-@UlIjM8 zgPi9W2ON0m82~CSF8}ocbyI_ayUt2jod55;DqR((XrlR7|K{KM{_hNJJonm{I;vY}Am% zBH?wr1IqvCS6{c?scdBb^wXcV(R{>sh(s4SJ+i^Cd>E4zX6%EU9Hw}Af73`7%RMq% zr}INqMU+#Z5xl7k_Lf<)wyTs7BikWLN2misGSDSmKp$ZrD8bn=H}Nf+CQ9&@=qS56 zZzdI%O!LW;Cj~3#YKRrk1x=QL?s08D9AIgAK;9N_Hs~_LMNb}PNUJGnM#U%<%|qFO z4>g+ZuG<(r1y6NLz}Es~W^rxO!i!H~DAXhd>)b`lOo0s<}{J(PqJGD?1sCtEpk zIe_70sx@j4J{pGFP4eJd7u6_0Pk8|6$ET1MSV%O$*0JrCW4h6@j-LOtDhxm?-s5e48wGX)a$$Qe|e*QB?R z2l*^?-wfsnd6oxJD2oBE@!O5;3hD(YpuwR0Htpv7iYW~94(4P!H)?n!|AC_2AX?ol zUVP~#i^h1P$;5zhF@mlHd2NEo7W4S(O4dJlQGvQ%QNbcp0tbqiCZ_bG(MaBrQr`^1 z$90Vn-%9S6vk&lczJe*`-ype0j+X!&L7$`15Q^!DbXAgMCD5~tcqj9@e5ouRx%G0V@7#Mq9v@ioU0$v+guw-(h8wWF4()>pRUq`tScfoAOyD1wADR@B+w(%W55r zeHE5a6rqKUnw}$?XPex}TsXDDszdM!)G%d>Z@TqO_Wq616tuA{&2=-gJ(Rf(XPYJ6 zsq2iL=2`Qq$vjezb@_@cE{&UNkhtq(ITSMe4^y&wuu z1V;Y_hB7!h`CH^~a(Iol>5V({vBp{5Al7NGzA%{`{MG;B=RW$%C!Q17_)gHqej26a ze@&7=tzG@2Q_jc!&OX~xSudAg7KFh?c6omO`Okh<8?o9k3CPbeoJZB@c$|JFk5F~KW zr)lmQ@Y-hDEEme;&_al@Yj4SCE|$wo-TO$h4SEs-RIOT?Opsh`cVI2}Fv*K!3A*5> z2(*eYJAmvTmIyGe9#OtYqP%SMLx_o4a<*R}_I@hXUO=AMLVg==tHbe1P6w?1bbfZG2nGzwG{KZ>oX+P5gWOiV+PSsZO2{$5)hH?!qU5UHzkmPo;(W7S37i^?MghV1>gHM^tAru}C25wO zUtFMNLmZ$_hg?8OrsXXVkmaD3K0)%p^pYV(p<~HtuF;29PE5W9)5Roma@-opE1Ed0 zPe3??4YRsYBeRxNKRn@3g#w>_UJvL8KiPoi5qGB(SL_ zibKa>6#uC53F0$n$Q^R^cktxHNLjsU`-mX-i-whNMtorR=Op zmmiyibh)$0g=|L_6soF}BnhK|9JZW7lBBNsKO3qZV5(fNgscMgc#^z%v-!N;8DY)l zhbku{%Uk{25F#f#>T=(wDY0dFn z*zU0LDqv8+pKkTKwQA<3&vozo()Mj}{OeEt)FZ%7JYAZ|4+!wAM-1gr9UuI93{sfE)5{;Xmp8&aAAiIF_faFMX>M9Z$(j({j7af487G?LWmUHa^ZC#J!Y>}3obJ(vE zSB7)UD6)aVZfK|4qdMN9s+2mps=@=3RT;a2icOg#ZEQIU@eO1)C|VX4f9X`$KU;O^f801Tc`W>5Kt>Tdbi$3=6L<955M|WF5pPw z;)h>)X&qmkkN@BJ^Qf9=E2KwAXd-qx*&iZWJL{X98o3mJ1ynvsS>F#NM{HyiY23ls zB9-$^vRtzkrS0)DVwg~1hMGT;RnQ=kNve9QwlUJ-kj`SFOvss7iQjS}XZK%Vy#(I|T>_3jU>lT!N8Cq>vckY~Cg|k! z{{7|6jjWu6ng=C|Z9uftR=Rld*bBlwCV8lzapePl15vmbC^$a5Gl)Wptu;m6TA(C% zW!q~S42DC2YnXZnBRTP!Bw6h)CEHE1jb-skIxBC31w{@d19{FMh(;6j3Mep48wkdl z9vm#MuVsUjjUHvl}rgw&I_d!_zEF?#-4yVeB|AZ z>iP>nEK&17AC?c1gwLD}2qm{lT$igP%iIUC7ga#{c6nz&qGioOp!{z%oq=ttkEluj zz}6M_3-cYWqba8Y2M~~V)Cow7RbmhWE-*}N z1S7dYME>k5-fSfd2OMEFxPnUvp9ECPHX+=BwNPp2MV7iBgaQp)*1%zHkM2VqjYc6k zMy5_R=egWIT(&ThNBQjTJt9k4JPD}Trj@fBYq419&{sv$r}1bkACk#0$1(M=x(O9i z43ai(E-xFZup0z_$eetCHXh3%uLa6L`?XcpnojNN#>*!NqH}@oRf_aTcye7F}h2k86J&7FR16}*S4OE$U0W7#}|&|$y;nS;|V*rRPnw`&2Rpr;loG)4W;$>LI_ zFN&RNIGV{j3zhnfBu|^#Y0HT@xf2a10yFFN;+etJAOx-zpi?}~XI)@692EYLn^%$_ z$d|u-Et2kv7ov?y0(~(BQD9Q zd!Zl-6<`1kCBF1m#Mn1+%$`hY(n3PM7c;>WUDnz|)zlVg2gs^{gdkjvJw=t&jlGda z$J$1tttd=ZIV`3T*T7SyD)(pY(ptsqWs>Wj52T(rbl$RP*Fs)>=fLyAP{5(TI3d^M zum6>QrGG|tlY}4mG6f&27(eFRxkPBqWPmu5fBx0?t{1JKf&=y)~X3& z9Oc1uPp_MTiRJYb?cf91z5Qs=ko<4%e5!Jk93a_*N-`v_j?; zOwU*(%J6u@)Dj%VS%Ys~_TwzRM@`Wr@I<`w1rFQLzE6>6!_kmq6d3)Zie;+{m}Z_5 zL+jJiqhK&rOd}gUS|ZzxA7Zc;)*cpUSnvQ!lFeo-UpJc{aIdI0+cj?2U?6c9>SSC; z4Y8*D$6}em#xm|Nj)Wl458GzUfe1(0KDfypPr(8!mBCxiZaSIB^?&r9p!g@GPq?2Nz+77i$O-Y zeAmg*(RdiiQp4C0bam~5BB~Yb%~*-ZefG2DOcIH*Wu-zg<_=yfoiiK`;bvz;JvNQE z$7g5PmzQ#*ktjlJTH^9}yIupZ@^MhAxY~|@$Xw)m(d7B@kzhaVTFROwkcFV-)zy`t zjRB1(<$UFfPVe56Yl|V5EcJ(@-a3k}jHKg&3P$MZSl0bJcZX1^Z?88Sxj}t|7Ql^i zNMIup1H;SemE8tzKBl3dM-JWG4F=j24O`z_Z#NqNAbhj|k7(a7G67dxuyn!Y3gt8# zidJ=Gx;S8lI%;vC%e%g%?$Zxq{N%s$Nks$wECf^eJgpsq5A|zR!<62Fq=SMM4+}Yn zL~8*VDL@7a0DHf910c7tcby1*2@Y6(bzNA7H?t2;hMPr}B^W$WH(M|?p>EK-gB4#- zyc{Lpb)2_?It~O!SVwnylbn%PajMLSP1xlSqT*wXxI#F95eAu5(}CU0zI)kc(6fK?>9EYFRGY*OvW zK=@e}jf#M!d8K!}V3$R{U9R46GW)rI@QZ>r_P<*_3omXLB;JoFR8FDeZyC3opQ;ejz;%j_Ic1c<*j{lFfo!FZW3%bGs9Mb{W4*Rq@)NuL2IRD=ge&A;^kpTr7B2}l9QUZSXaT^nSfCw1lTF|Z+Zhc8 zisuk5s#1wEs*qvc(&UhB1A0U$q`e$SO}FZOqgPw*?=>1~?QTj4BR0@n3Zn||OoomQ0n^FmoUtbnp;EGt_=7YiYp zV#+t#@Wp`8H7IegpfV+yrs+>h$pkN?jH%qCJFKZxdA8nceEE9G4TlrC1@gNR-XPu; zhNq{ePaZu=lGtbM4HBZhuTlyU259tc1u)%~Jkawa$>!sZ6-v2-lBuIguXCrIJfikR zuDTaxo(6*v_7+(xt+8CM-+udToh@gz5{OLUQK`N6L`MlM z`MK*n%`pt(`{6_)LiNH6FGOJ=7e5uWm}UYCJm}M-FQb%OZIQtJbmz(o6{kE?RdtgG z59SS>6eN(#Mj`oupgUQLtJM-ja@dJSa((1(5(K23p{jSr{y|_{v!p&L-V8$kXs_Wr zz<8z6yIj>QNs}z2ma!Kn323&Yw+rH_310x#1;L}@2cfO2$B)tk=0QOioSvS^4TP_u zX|A?gs@9^q0n;Bi!NP_mabxQTn1k1_+_prkP?AUH& z!MGS&p3Vm25#++;O2sjz#3AT6a9L|XfuDHGFpPbr6W8I7{Q2+Al1ga`>glSC4eWa) zEUE9gUOK`Kv&o2bwvrC7vL-Zw$`RPdKO%y1|iO-LR@_apddnwrEg^$eTivT`2Qk%p@Tes23 zM+mD>o(Tu8?b>jD=VSvlPeErMOg!7QwhOs%l>_*0(b=^TETxqXQ^#$p7JDgVQd^cl zy8Jv(zM1ZWx!lZyQMf;Gd4~d#z0u&71&N|+N(ilXqX_fgZchd6KShvuzJn!%aTpU=zZFhQW~lL;2Ch=d6WY62DgruB&@ML-L+C<}wD!LC0e z4G7*UFQytv%He2fFNc>&J8)A8tQl)V;)`Kypc#k z-9gqJrSD)kMwY`Ve9i3?UK}4E%awoko9}=w7e%0&vhtyyED2VLDuN(cPPkZ>1VXt% zk;);XcI{0E1KHmt3(e6WFdDn(bBOjiJ%f}Y8vp~eep%XiX}9x6FGUv zqOb)iD^otfWQ3@RoOPDzoo~H+d38l0zQ&`BCLTLzRBV-yL3b7C>&TlY(-|gICDMX@ zT==x=Q2t6OI2-1=xZ>agNdWWV4v$$gDp<491H;c;HA7)y2vvYMPUK-Rsb|xv>jLQ@ z4H)7LmLUxT=L>1c^F8veyXE2#3SjWHK9#QZ@k_5++J=oABfsogYMSr8jqF13yq(=Ithy zZ=cP2(?__*DE*~{;vCpoGyswXFrrF2b1A6nqE(GHo}ey4!b5g~AS^48R6azXI$0|6 zK*|*mG%uM@hKX(gYS0}45o9os)uFH>B`MVh2g_4fsb{U^FdXym|Ce7L%|eOs-Oj7J z>y)q1(oz*ZsBEJc?cUhf+*ygDw`wZI;REC+S<+y6;F*o`oj0zYqln7u_|BNE5RA!a zY;N-A?ccgENA_*eZ1qXu&flS{g#tz}IfyRaTPK_19Qru;VQk;FU0RfThC{7exh9$w0tk_7L|FZxw5+Ii2*ocD!&Y!V?z!EGu zb`l7PBr<_)SvEBs4u?YyIh^<2yyfno<%PLW%&j%gUTRAC>Asz&ag#_2uIg1~U+beCHXx1IILZ z)3}{e{{z1nw&fdIY<4@ovm2V}V_RoB$(rTKSo)c1)!_K?<(p>x8iar2J8L)S}0kt_{ZA|$3YAZbc1pCXy_FvchE-o5qT{jY!b z;OLe`-;V52-j6n#+k`||KBMP_E#i5v-W#vY7L*j0?bsgK$}uOWrvMy81CI0f(WBq| zjo)w-3u35YMjJS=&EATIzB=x#wqgU%=%TwsTty|f_3qs5m!c|rIvV44wpz)jds}%S zUD3ShTWSI2Zt*POkSD#ece*1@IbQ=^mPSyOPf|;A4r~tG7B{U~*JyOuawLoXG`G2u z{Q>>K8y;pL-e&$%l=xHySLAsDn2vs<2VDK+&%a{*DbF>;x)>_0r-QzVHx?xF_udT$ zRZ<^j|MYk6#bKjtwF(mh!4PUkSC3Cu-f49{9uC-O5DaK~7cLR0yK%@?DFYn9rpz#1 zTp+k?sdu1IMg*tLnmu7eF4vOWZsBY`$D{0t+eq!yMiZMQp4notkji3nM;eu@na7}$ ziiM3Dcdizgv#aHbGac(S!=}2j3&2qr618-ZN^jgh#H}G4gE2Jsn!%7&bNZL2NrT%T zEvs{WmeyRpi!XU@FYOtzh+rlKvK?y9c} z0yAE+MdhaDmOeW$n@j3ti5xZ100M;+Nk7aA|Xz{)7?nP3VT&k4Tc)=u2W~q zxRt4zz(DrHAN{CE7wPr+SrTJsb&n1Y5Jb{^+^r~<&}gpW7%)(|Z0DVO4^Gd{SUxki zWXe|*h~(3R9qB4KvOv`Ca+tBgwW07p9L0t^JqayXT-nxAz*|uk=GczWQj|}r0}iF$ zS_P9^T!gIi%TpgsphOy;v8qfIL}5`tnKnbZG+I{L&>W&gl-8ci8Q1;PCqIdsV@+Te3xC?of1gehV_opW(_|nmsFTf_TtpkqfO&+vc%20AnMR9`ZFgc+2(DM57 zm5+W5Va94c>vcOA=VZKQ8DIq4ubK^vNjwq6EtpM?9PGI3WfTbh(1%~apDxbNOKC9! zc2dN$N1J$O3$tp#@h5)qb5fKMq)wGiMhj)6r zb&!4DDu&*9d3sZW)m{b&p8MtDo#AlWdG43*ed{VqZ#F~JdSCQH+Ky3=vH`s;DXz{| zKpVguXAc*vc|zdg(cle>$KI_$r|Yvm%SlR&5X<6p2d%+02JSX){w;nLK^So2s8kGl5BUXtdIdK(9j{xjm(&@L#N_me??csdfBYGfQ2FSuRL7(Y9pG_Z*hiqVhCb=}7FTsvFOVI2!t!AqoS= ze4jaI+1lht41ibNA2j5?-J(|J5F5-~5*18%Ne5&X)e|$Ru+~w86IX zh6#bxmRbnD=~=*KqTOXtpjr23I)C)1{m%~ms3k3)YlwZy*sxn2-k?-l@?-mYr zSXt@Baz9MH0_x@YgNKi>3kq#xifwB%ggm$NoYFU7_* zxy_F)rY8skHA`&ZL9;tX{%7ivX#2V$mV8p~C)N{g;rvy%y}G%l?f#!}()d;#6w+2tse&zALdV z<|lAZ!c}O=mBZV&H0Si*p?I zBOm`kJXsv%^7JHS-^+J= z9^X2;bqkndy}BQEL8ogP>FZ_EY&9_Vtq#J$kpRP&EDIOa zFl+C3+tG`j)AnThve_jt_KyeM{?nbcq6k{Cyp9*w&r&QM$FRb4zdU^~50}rIt+YDN z2jRnUr^u_t^&02);z#zv1@L=ly|0_J=#K+n1>uY`3NsZN$-4yTA;X!)bT{a=Oy&#d zg#Ijftp%R3#TrLw1DYferA~87DV9Nxb!se?G}k@d6iX8}VdW%@Q|$d#F1dM5^H|jpUd!C;M^b*_5PfO`wT4zc_Eq0&&{Ez+@ zzx+SmL>o8dL3e1Qp*_pl7Dvjhz=pf+Re27S*sFY&u~BVHD(04gHQ}|dewD%ox@-UU zKm3Phr>7kmf}5f!oi^nGYw3CnM=a~t*ViU(E(gcl+EQ${a72t3vp%c=hcvc50by%H z*eE;|ws4;#klJQ#bKc~WJz304d4}?N)(vPWF00)lio(J%){ENtLD>I@3dSOaV3wsXh;4SjyS&_ zeEZw@@AT-%QS%6?PGQJ$RjHn!25+_TY8%o+Q_yS;wC>gAMWps35o;)6KAubnKGX&0 zshI*7ZauVx;{KM;OT*%1_|UxO4JVpWxRGk_zxM#~i4DX?tuU|jsvQ^OB!N7!rJH_LOlB8OLWf7|^qg z7DWu{d<52+tY;kQUK2tUq^7bN!Bpz0iJ3OV#KUqpVUtL;T(4K*s-`GWfvRo9WPmdT zh1^PU8>;yBqqK1RTrvYm^%*JS9EMA6C$ z8fP};h_*qbmt{4mWicg^3t9nuX(X6<9ZE%wLaVq-7@x~kND~z%W~CJ?DG;8JP%84=f;I|+>l9F;qBwZcxvW92m&w$a@ND{+U3?^4~^lz3S#5vYy# z_7Gv`(oI2(zFIBXogN$gaMd{j6i;QXjn>FO_O|QQiqEzcSc9m`u5xP81G$k=!JgG> zq0D7LB~ucLjlb;a#^y?OR3w2i-&c_*;gp+=!Fq~YU}_KQ5!^vyPV zCAv}~N@USz`eR(jlrPJ+KFqu6kHsW5p^i?cI~bZEtSi=wEu^KYNINo>yRGZkESpTH z=2XSJa>L)2{8&jmynP2a*sTf^@WG6>NzFW5r-PMb@9;QdYc31omf9gpEKMepiQnn1 zh3aT~)NEwrfw3{8phH62{js0-giQY&co1|&AMZVb?US$%Zp`KX0 zraLpCV9Nt~5GRzHIZ2e8n3!#=yJQ9lGp++DgU=2p0YFc*%!oFy7SA^MDYw<0Ok0vP zpGk;pz}C#BeYU|iUKKoW?A>L09*lwGt{zlE@ zh}5Bg)dwHO_&3=PK$FjW{zw0-|Nd!iqoB2YWxLfbT~XbjcJ99DCX8@zn8fg@Y^)A`2X3nA{ zZ?i9h$mEax(&&@k4;ikNg3wb8{aihzez7M-Kltv=73Y8dJ70E7QogYgU}D_-6XJWB zmPNaVI}qTwK09@ca925vpl_H|f3>2=rZDT&$LhwsOMXdFLIIl4P|-g0P;t znHWM>dK3i2+A*)oipBe;@qy*_*V z2)81Qlj;7H5q2pcTNb0?$c8Rm$`E%dC6H73vFI?tQ%?aaO46yMDseZkp5USM@Y$kR zEfz@>j)nuAU|!WY9!U1<-+cRev9$Tibe%-8HWGfd&MZq*u$ECP<#57gl9(*(X}uvy z8L>EGbdfm}+_DxX!?Vf?L9Y6~RV|_65oK4jhHS*x$43wq7(l6cz6#K}^!Y%6jwRk& z6u*%uaH9bzRc)xa5yf#U=vs}5tcZ$0pQg3Elgtfty1mh8ba{TpcUlvW1o1FRaVYt% zkSoGOtL%kYhY~Lm7d{z}@#q)xncUqPqIS|;3@d_S64t5!I3%^cI6FDfqSP4<2ff|^ zW4_e&P^GO!UCu5mlT9_E)vry$F3_T?-Js03vY`M*ZA`LRXtjO)-j`el$DSEsQd%aq zc~rMYIn3Ye9Uaq$n_T0n)$M1JysPvDzEX@Bh`mmy;g+s(X=8F}ZH2V9WS>5W1)y80 zU;Pnkk_sy24H_PQzE@``nmxS##ZEu26P7l{9J;&{!LZjw-ndv@KsVvV*nz1RL zK~AV_-be$^fI@QJN6)Eg)s?BZFnlS>^@1$C{)i5`q@Cs}{Z%Z$M{mo;txcC8mIFoS z1P(LdQQM_gacW*`z!rD_`L^qI7MCT0=SDSZ8{eHMfnv9+B}FL{Ac&*K12e4WKglZ1 z@?OA>7~I)UeeMf?<*)y(PEZ%5c4Fj(0LShwdCxYdRL>GW9qDselEW0u+uJu+yB66S zs-rkmSAYNNH@|s#eeH<}|K?Y}`uc0HnUI$eGK{idd0?Yc8N9#@VK~}uTLfwOTSX3a zF~!1Y1O(<5!RaESxv#- zX0f*IwbtliE3eA8Tvf3po7)+dMHWX@yEROMcT#Y|sgjstM8my3Di5-^&`Z~B)xpyD zGk^J0lY;QN%8FAwxir#3=CYC+QQg(S9-MK^R z*_r@%x#WMl%H$hNVR9a!lKfK`_s~|&cV(tx<$Syk3(ooVj5%#ncGsFKaSN&v8A`B} zQDa-4UMsi3W{qYOh=0W2kxg9Ds4@WAiuVz;O zKzO)aNkQPM0fKu$aQD{jMHm(;rLKke9ku)7=!5aZbk$ro>tR##FHfHM_$+p7&mps< z+sAf@-538G4F>A<@( zB_l1gwt^Jp+N1?ns{f*`=T0IE0!JO6K6mRijyV{OEw^EfvN$ncSU^;A?n+IsZqK$J zD~xpjeQuOJsxdJx68c{+7U3%F0ZHM2gb}ONDx@7&?j$xaJf5y$N$($q7I{t|#jvvlWPaPQojP~|u(dj70pu9zE<6E zG$mLqtxif4H6o#gbO$nEg0Tdu{>k4};#28w1~**Gd@CI^Ef_Jlz_%RTU2X4FN>ZYZV)2L|W7!Zehw8 zsu+wrtf!=#<#k*bfB@uVpPJX{)B4@chqV$c{cUDkv9b}^uE^{5spdfPO3s?2+;Kg* zUZ_)sIZrL};Wxu7D>r1X{sh2fs2u!4ZB-2qC&SL?q}o#8ROP!`)OP%gYO5l8 zQ@q@HpA_kH8t3?fS?bk( z$fT@bZ7KG9Q{(555TSa9C!8&+Fy^VvdHdP^>Z?24QP#xWT3}nBr^T{^0T~;S@}fJu zVwEOuds9@taIIZ}dpYgM%@4^jY3k#nBTU6d?>$HuGj(jOG{qZ7@)fHE1D$NU%i_@8 zULPAyr9#*%KYjVb!M|zhqL`z8^^DHG+xMM6zzb07wcmg5{&&^}IPSjskuVJBY__c5 z0Knm24FxwSEP=QjfP=e7#AN<-ZE~sUG3kPfm|b2>M`PUBD9g*5S;A?B(+0StN=L7^=0|v2u(RS= z*XO6*!3ejAvLBvDyO>poWeqnFLzmwYE&)%;jA{q}?Du|eL;Ez6#?&mzn>0*EG+UG1^AGD^}1sK0ZD_JEa6juivwZMjTPJJ5B^-xOwv*3yY#7*vTLEmC<4m}4Vg%1-h&Q6rv`sUhR* z`ooc=a@naAsbkq(obas4MPQi{BVMAn4p0}>&q%)+kC(G+>(g|NB8l5xl;gcU^Ngij zJ(cCmF~FPd9h{$@=<<6lQIVuG)4X--7*9VEp2j(w8khle+TFF=hCi;)&oe0o(FW3M zZ1N1F^o0+-MDEUfPC`k-Mq-cDx5Q%;B0E!XX{pg>alh)MWoo;$gK@mh%wK&VTCAT{m3RsvLy%9Gi zp8{6Wqof%u=62o+8cDSATMf!&mCjSMRvENnx8C`_?q0Z4dq;iQX>BtcT($F?&T97Z z1FkMooO5yVOcgfRTH@#g)H71%NpWyz*dMo7vqXC2lqx3=&1Vh+@W_w~MwBIBC^yn@ z>3j=JaK!{n&?O?FVH?g?)D4P-NYmX+Gfb+4T_+DyCt(+LCb99Frsz7|XPKdc4&fA2 z9dV{^Rv?=yEj*c){bSFzWQt=UnpL~%nusxClk6y2OEmK$dns;*8em+anb0L6$SSWHZU zOfeZ*9f6wnuwCGtYr27BhEuV))#-U^FcGUfRWRzeloU1N^7rn)OHKuax?L;i8hk-` zw2{qYwI%HOYPC1!KNgxV{2Av5Tc5W-VFWZyB&ePP&u~J&$Ls8D_LbKjcuxQFI>93t z-g&W1B6izv54FtCHrJ%yG0~J|lj)QSLV2D@ck=rDj6LdWqNrQ9ju=RA{ML#cE$R3s z+ApQ+C0}0(oF`|Omm9gjTUI=0#n&H=CrZ_lKE^Z^J8~MW#i8rN7;F zxA=xBjSZ{v*56nvnU4p=5GBtClSwXLl|g@C23lB2_xJa6T6nUMF&s}!$`feF^@w;Yf~lQO*Pw=yYP?0n4ODZd-6}WWfKKtas5FWO1F|$s^UWR~87)kG0Ra&*I`&&%`O0e%1!py({8l&M zhK<{9_OJ%Kn^ql@wB=^|vK`&F_B@GA(xVX9mzY`I2#!>P@q6sAo`fa*fY!D4afS-v zN(L*`H)D!P1xl)gcgQM@O=tw)+v^`399&;r;(idevR8sRNE1}e#k-UgjZ2?1S(ccr zKA^^mzO1ZMm<2&0NilgNGuu-aRw!Yt<~wddu0csh=~Y+kSLQrqKy48bB~;VQ70HxY zQlTPW3LmMM7Hv$5O>PZ*)_+Huh2LH+=B=8LQKy81-XKfp;HA*c(@+mAKkO4OuqB;% zv@DnNIq;~=uURp~*Rd|iY+Qjq(TA2+J9WNoR}1!)PjZy}+Fg>X zvvjwB8euc&wCWh>hLKwqKLbthjet8w<6!S=uJi*|!)4Nt4ymWU)<&~&cz3wCVuQe7 z9MI)2C(bEf5& zR-)sl{@l<1%wPCV-v9CEY*Tixru4JFFWT7EN2k|DAV2APi*^e&ttw1#u8? z29_AZ5Cf@AkVdeTxW@dqx(s}nIKQPd9Lq=xE*Q43 zBuC4rnmVkz<%C+9!;X2AysN0Rl^QXuvN`8~7Y^QHgjY+4@8ViM56_4a4x!qeo3O6Jo8fWvbKZ?j0N`iG?|p zZ3NJ8O8wE;YDuoV-%P5~XDdO#r9>?!ls8x`%uBk~zt2(`0=KYX0PSJVVA8wk+i`Fv zvx{?eq?f(nkctwL8=8ubiMtQ)SxW)v&nkg{mcGS_f5?ZW|aTqh~XTBtfL^GnO1D0v?7Zh(Hw^UHVM$_8v zS3{c3IDX4thiiI%QpTXOn9auH@pLkY6G||UaMx<%k64!_Axd9U#Fv&LM#Kq#a(!`z zQCc%bF{}gv`Fz9oC9*(UG3G27CVMgTH5F15O z4K1-ly!6T|gW>4C_ujMlg;~%LVdraazG<=wBptK=ZljSLL~7cs6==3obywds(6B4& zT0YUp(uJ@QezvY`$yl?e9asTZ#3E>$rA!=THJ>RdQuPJ{BL`%0gu5yuIx)SJR9IYJ z4=0nJ1oat?o0GBcvv&zg5LH&WYnm3YqlQeZOQwrDJv>4riyKF-w+eZxmnD3xBFPqd zf<|kIk~CLFO`UgA#uf0wy)vc+Zo7FmVvk%)o=de?7h5>C6<`{yCuD(0%@Gg^8+@C3 z7~S#Se!k6`V3^OZuNU)~9ngBURtqvqsL$;C=4$4u$=@d6LI9hH1wn)CUB%)HU4 zM;Tv#Hm4i2?p}<~jwVw?Kkgs@=}%zWj+V0Rt@}l-!Om5^O37vOjP-ZE@Z66({Z_or zObaWGHqy^_Nc%{ZQ!1La*TonUCd zR5xr$cv{4bJ?aRT*n)1U2>f-R1_}cThB<0wT)nIsVzdwAY8VNwvDIL(w2DPVc1*KN zw(oMc)X{;Kq$FHA6yGYXl0vYeNzfAe1EJ*Q=_x)u+S_v#J>b7U6|CuqRVwv$*Jzmg?tqCDv}tO? z#*>_0bp3w6I~-zg`|KYMu+!imAs(3q6&C%Nd{t8Oa3dOSxmxiKWJx+cI0)2AkYS}u z5nlgyHCVHY43?#gsb{I5EeofFnSe<})5GXH;4% zst5P)Cqn1e>u4!M>nzhHw0Ax5&d#-K%i^?n!(o34=Vw96V`^cvHq{bl0W5eenlcGevu;^! z)!wkza&+m00b&l0k1?(W{XwCAkimFt@u%sm<9W@mu9zL~_eRq_N97wcEL<+;i{+Ax zT1ma7>lFo2vz#}vMfqLNq7|{HCEM?bkW1z=g>K8zdeKeD#O#Xb7sIkZVDGWT`8ni) z=@zY4cuE*ot!?5Eb5ivrk^y2ShO7Q$G8znSi^deHCT>wmZvD?VQNoUa`^WywC-Co} z*JPf6z9FSps8vIm4B0?5>MzdApxZS1DCU}FGK77d$^<-IXEjT(+1oh7d~Qo%RI5<& z9D3kzX*YIsIY}Bb-=C3+BElwjdcN6fxSf8x5(C3%m69lQffWFiD3q6xG<$U#;#&se zE;GSt5%m22i0vdvgvFqg=dIHp2ZIR>>#t5iJdxp)WUloh#b{*5Z@~nS#GsgNDJhqX zky@L`*bOP<(XFhf(~`~oMi+Jc`V41iX$b)2QD3FCyf6ZX+pr!E>b*IVC*Ntwb45$7 z5>pwC^mxzWhBDTzuo}ybk?Ft@FwyL+pzb|#;k|Ku0` zxcxF9g8W0H4M%iQT*H$m>G_D>&%)@Z>QIDFP-Q20Kt9D_~Jx{p94tm74N;xx~UZoKEeDa}gx@Nfip$GumW;-;&`90;J_>$SQ)x6xeA=U8(w%mRSOO|cHcrpvf{ z6^5KNo6Sof`3U=fX0uZ1#yDKHlrmAvi7RDG3cbfnm^1S?91KQ#2RO0SVwR+o)fxR%Mo#B{OW?&<#RyX729DhxV>f3LBb0e)h(+jq6Tn#n3WPAf_ov@d2z;`(hN4Vb@ zS7gvr>@${P1QjYRia<<{jo+G*lp>M}l;eqkTL3ozbTU;*e_+~5A-2aIh$XVu?e?Yz z2kan<;)1QzJw0gVxbPM1!17xa+ifeQsA;^A#C-JF5%HxYkfy-scX71UVi7JEX_6B0 zNN9xO7EU$n4-yfCxm8mzJ+_>dcm)h*_NUXJ9ZaRIM@f}vedom&2cvN*?JUa%kq;5a z)a9gVAKRm}{Z&A{cwR+WcWhv|Vp_*5&d4>@A0=?^HzMkNmEn4wr5SEZpngCVP!Ps* zg3`{HwHu1TSckk;MW6K@WrHNCaz*~>kRebe!rg9l6)Cl{MnCGCwN#VeuDq@^Qk!bz z!_FJ4wP(Dyw?7{54~K|P)^ZQVYJeXACfnUUPJ<;C;D&gebqDQeNwz!N)*Ez5wH^)X zZEUr`>SC<^?YA3L*9#ZLdooW-9{MDZtlPY(Cz#>dcXF$uMQEj5#FWR*xkC# ze~9%NU^_SIPlGioT)Dj=RUH8)@Me*Xyv22df3`b*Mcb$5tF24_Is9|H-{}LU#2XpsVwYha$fy3jo2yp^ z|D1nwnJq~!lSsLfh|RIP(#mPnZ9YOxK4G^6OlbkA?1eg9Y+nka)aoXd(#Vu1vE$%2 z{kfn2r9b}{|ML4cAwvVZp4Hv!Ike%b8-<76w$9p%$)0WUQ&Tc)m+b z?fbr7d+pn;p#SEZ%akcd$9lHnvd&}K<6Guu?pk@Z8!0OUMs2mQ5^$)z!fM56Z0RDd zy!15Lbh{mzQwT8aK5V_Z|NQkgJmpW@lmlmRx^^w0wMR>e6b%!DC)EQ0Ye1jLSj{pa z9YBK7bZY0AZJnZUoGV6kl<`1>x46Ep4c>a}O67?m4wEs;MmU2Sh-&dHT<`4klonHT z?vPd9CU1&Hmq}0BM9t~{B1tbwG|I_Em71=FYrrlQ1uOYQ)4jb+J9H*f6|BeP{7X85 zd0CosQm_u|AV&4<>WaI*aF!YC2%M2)(GZ(qHk)k>lCogz=Cwz;Y;tpwI?Xj#`a2HA zG)XdRMpA>ou$P zSqeuQE%@)%`8gFP0Cdz5?T9l(X<&KyO2pdilj|AHox!On&ZSo5+b_IeDxYg*DS#OI z{a&d}Ot~#T$}+_p_32Thu_!wIK0RUxmw9k*Pku8~2{o6MPm9^F6t`e99^spesfK_A z53Aeh&d$$=!@+1WKDzTlE+HK3&r_zs(SY{7XNS#YL^k$Us7dDZW=^WuxV(noyAYx!D?pH>{3e z%j0Dnlj&LO8Y%-9pl<{fu_ z8Aq$MCA|<_qsSkW9CcWR&$(hA^;mKWvn<}2oeHmuWLU~0;k-LN77>;Y*5M;oRXTyM zR`^2lLDjh530loGFV^hJsjRQH$$S(aKX3{D*=hTSlUk>BqtBY7>0OZmup|{(@laM{Gtq$E2NL{Qnf7Q5afWw?r7t1An!fJ-0a_0-JpZM2* z#Of*7`d#-anfed)`r4cKv6nqODK`%5_iSgVn3DBHN-#k5D0*YO`OxkozFz7!3~6(q zbfVdUbjNf$MI^@@Teu>1PJpA_7T4{1TY579hx&t<%-D7&KL4_)G*6kFm<%cXxnkX& zX-;!x2irpU^m+YwCS=2D25QhAofAYGLr-_nI2jwf_QF%h>UZK(^ot&P+C zIXHwG4M#d3h_F4;$Q@M-O{%#!<06mo|{krjWZlOR!j7$`D}($`pCyWj(~^maf=yK zCtGC>3VsUwQk8Shi{Y&&I^E$!>qO<|auy#P(TF91fr%W3%R2 zu3|*LV1b40A#F)(uwW-3D0=cn#81Z-C{{yK9u{boJ2!>E*SGJ!fCm(_yicZ8dXh_2t?wey+Rj4N@{`SrC3E`gO7eMJV2 zO>ku>EguQ+YR^l{BUXcua){HtHWMM2t`>G~AFdFF8k6h@hX)5EaYaM*4<}KGTZG{Z zbV6DEguEHUm+rs)Qy)jTzflh0=?24lU9;?&gdl^*2#=1X1+fuyX@usnT2WBskm}$* z&0`7Im@Rllo@+UyG3;~eCQt%)YoRKoLzN4`Z-QRS29YK$z2*TL){AsY?QpExVmwnb zj>n|~a4cusr3T|pv&C9ZMp6OuA3lBN8i6>WI1b+59|t(*{32FMEkL$M(t2J5a%(Hp zmVy&t38|zSSf24X(weKBt&tnu;QDk|;S#ah#P5)wl@denOif7RXgUa54IJcZ$#cVn zas@#sJfdc3kw&GoW@#(GyD!+E((Ea2aNMBXESt_R|MkE9`5*n4-@pAlRmgCj+RnJ* zZ9MIuz46-RDjHH0#S_nNBtO1udczD^)~nV1Z-2WI?E|m>^Vfep48w)EOQ!B+Gt{CJ zKmm&yt;*{txG_j^eSPh!qr@evnnv(rClrR zO{if%*!k2qWSidDy{RVgZ}EZ5k}^fNq}|CHFJBGt=T&|di76U4w|F8-4DGqeEDB2y>WInTgUzzZ#-Tn z?47gnje4Y}o+>5VxQvB5YBj&aNIW;utE zZ;xf&&{9XS&R1T4eN)%zTTX3H&zDhT3~u^T3N`J?o=a)z-a&i*-k%41{yyw&aFK`-X)bih``Y6yE{tkmc* zdtXv-NiKIS+}J0NAFrbbqqHk^@Y9Fy^#}b|f8gV*6=uLXSge;Y+Hf@%y@43aD%{ve^7 zHe*Z=bJ!Dcaylk5Q}rYys6rMF+ckdo;_C8f|A79t zG)$?ap|X)*X7lLw9aAQxHEWguvfwG-df~+u^;N5oB^a(+*h({Y+zd$8#G}M9udjRT zsrJT4$7}}C$j8@VLdB~EizzYvgj-Zlko_lppuASo^E+Kp>JuhHTJ6DTe0+3tb#d|d z(R;0+i(AoCBXOF<*B9r&dW^(|gOUoQ(j4M~Sy<}A6md%BjE!4{DS35y!D*riqJ{IXpZBY&t(X-H`MnN|OwtDT|IN)E^d%>E-$CdcD!uWp=+c zQF3}2Me3gA4aDwC0SSp~<(ty|5C8HHXDQ-KcAenKI<*nEBhte*Rn>HNsRgk&%HgyV zhne4Q#$jqQmYb~17Dccw+x_ll|M|ELk;(ftLmjrc*Siq_L2uAD$F;h8LhhIxL_?f; zE?CeoGZeSBjJK76Bv7`t7T6IJEMM)8Z(5}|t9G|(k{ft`xFD4kkOJS*Y&WuKvtFff z$dtzPxYv+bE@4Wt$n(a=Lo?qM;=?0g+6VcIrQ<&gP zN3|8o^a`U{wiAEK*_l!`1_!vUIC>Gy9aV4|fk*jPX^(qN*K2!5*UhMAxcMLc+rRxI zpZ_js!`TXR?S3{`XJEo!H&Fy@)%sy4Uj9L7!-UVPt-A^)*t_5Q7Kwo(ME$?N{o79- zJ+fko)OdYcK8z~CPt+&Nk7q&@{lwG$q%XT$u zh-HZ!=PEisal=gercjx=T9C}-Dn3mJccLfrcehzFI>)Zt-56q zv7`i>fthfGz83Dc-g*o7#NFO%`iLTs>UP_*2&tQ#nQW+NHZ8y*`q;+qxj{Mx7)3Fe zjLE<3baSzZ5uaf#J3PLnJ)@jmUZ^NuO!p?(5DQ5>HPjTdkp+3cFxAD+_wL=FFXo8D zjAhI&27O0Q7>nVx6t|@4>Qnhq%${&Q_uDNKv8AK0Sf#vs?RG;PG3g{qfukKT#g$1m zcQDieH&&-JWoS#<;VHAKO(BIgQ#kUPGr?5HOa#TY#-^si3OU^PQ@6wWgB?&_hN&kY zjtARm^Je0rSWSp%@OyN8Jl)?5f#W6Z&`}pv6xQx;fP+n%h&s6vZPeHx10!ysv!lQ#Ea2l*yLg2{;c z51>pgMM_?9uivFMhD*HF^4scYEE_6Xv2S^+gVNkumAYb4u%64uM51NT?IHf=uHd=c zBO6pHB_hANO5&)?CXu~8AqI!m8RKZZ#`nK8 zcmT&MDV9?DqO5Rww0#J}7%*sKO1R9YM$y^;D2)b#u4#wZ-QJV@AU<;P9)tUkfze0F|%n#2iHEi`^}G4`-fNEDC?ytv!eo!jbkJ(Zk$ zZNCx?w%V?-?lzz5{=_eSHkUvrRsolks8ae@j@4H1CxQv(KT0JP{8r5h#2%j|MQ7kA zYZ0_h({ZO?E)#du+#EEXai5Y**6boI-%sOcH-K6O;{b4;(l*@zZD8l; z(d;4$y3O%H*P&iep=8EJ9W;D|_+XLqe5|)+HJ205fH|dj4G_37?y9b?U@z{2q=-56 zGb)v_n1T^fY^k7)PNS5TrQ27igeS*<*=e+Sd#y=0m&6&tjUx+W$H7g&FTV%caBkp< zUE#y~fZT??!T!LokL32J`|iyTl+WsrV$^>7?YB3k@>Eq{|Jv8y_{vv|eu2qu+MUl) zH|#gN@`tm97t7_cD-&nqZP@N&>y8yu3?En{Vn;8=0V08#FsRww8&aXWrrux;FIGUg zSvoNehb2XJt4}Gf5aIwi9kh&~7*JIB@{D?pKk$Q}#Is$B{5Ze5Od=8E6`UO$?BR}^ z7Oq(%*r>*{L# z_8~b1$hK{ z^1^75yXTsKkX3$6DM7UnF+99l5+ev&8;f&xkAzZtzBqvVA>NKsM+xedx-@gSqI>F# zrvJMXqmARnQLQ)2i>9WG(p#ER-()L_yG8_{w#Jsrd`5ubG3fVKiv@nQe|Wf>&$-&N zoZnr|ukoo*eEQS))N;X{57*Eej#<_vJs105K4EhTRpZYdKf-qY;g5WDAqP~Wd2XCK ztA~dkF+swjZA(*0<|3QP!Qt`V-nietS}crzwjyg`W9_xTakpOl5SHd>ab36#465sk zi=f*b4hBbidzebU^-un>bs^b}+R->1qd`22IgAF5o!c1SwL7c$;RuDPgNeTmsDp`s z9=rSTox5hngaIHB)1)E}kdU|(M+f`B8Pr%)CTXJ-mqGl&kQ5?}{G;PrKmfSern~Pb zIe{p=H)K515>T^#1|S>2j=iG;z>)4?h^IWBPP28mUM{d80I3jDZX=4Ulv|T)u40ZY zKIZy{J^sPHcd@+zUJMmA;qoq?JOPM7=+Yew@Vv;%EH*J7xs-p|0oQ2eqE2FLJiK=g zcVIA?NI^BDqzzYJ7GDh4QV}&;V|md=<4CqHm;azI@28ICIV^=NQI)}bHk(~vr!kwn z`orOvMWu2>@+tYY)M%0OR5R$9`IO1AV<26hpW`$M-TdZA;JzhiWBhP+cG4CXhrjH0 zB;A$k1YU5b6Ry$*a7)K?YZIj^*8v@F(mco|o!0C1S{(6;NovfR_i+|ElWu8(5Or%(&v#^BJ zZp5caw#)%6yny|*Ob(U~zPdg1qg4jzfMvzNoUL8H&&a}DW`vfg(+c>djFAW#tn!q< z{8#?xAN~Bl@_o0Wn`pz5>L1i_vI7&(Ikdh14ZGL9?|f&eZ3*9S`sB$MfAcq)NY*NB zxea^KE@ZQrDLG$lWiYHC#F|a)PZs*@I#BF~wq907wQ7hZD%`E%h4r{vVYu9icMXR_ z>#(&tv7L{7%2*xQHktnvg2C1YO46`dPmWhfPwg=15dnx@gF()4?g?ve%}ZBU0?6K zbGe-RpZLTVe*2&N?)lYK+jDjgN=o)Ma6FB__EPUtz7nC#b71>aco7WP#2=B?o^rm^ zJ1`Fw?;7B^{h<$;;iqh~n5@Ik;bO*G^?Mfb;wFk>`n?4m(~G=1JvrFh+n?^4ovAh$ zX4Kz&>n%$scrw#U)T%&tJ%({4Z={O3SzA?4peq1s%nV1msO+J&(M2_?jd&i8MZHR# z5YAeSPc4O9?i-?;IMNKj1!l5-H7{H{H`(&BLARkJG?fEjgG`p0szgfdhjq8tr?;w7 z-~GW*3RIiv{((uh(eF;liDnN|OKQcYY_^Y__AGn8Qk+mV>cw*d6Au z8Es0$)~9AG3ENGD&RDjSj@It|cC;*sa6x2sbh>T1!$;xj#XEPE=b()J6dU<)ggq4- zEQZbe`Wm}3;Ke>M2g`y0+@W!4S*l6e9nxrey)K^A)%kh1%?w|6G{%%SP7I~(CKGJ< zfIC3v9^12fflo_0y75&`k4)YX=E4GCV!bLiWS(Lf+27y4_nmKJkMHz{GRRR&GVLGWt7y*7Fe7sO6+$!0T66Mf_~)IGB(KN z7L?5{FYz;A%9bw0kr*!KdOE&nc@(TI6pGNurq{ugE8WIaQazk{fBesWg0zWlGY<2n z6ei+`tWQD>B_~Y6o&C%{wX+NvC_Zo#1b&Nb;B-2DH|;VTfspz7Vm%lstf3*pQ_WCJ zX)8}i;LGm-Zc;m6oglgVSA%ArZq{?wXj&bvQP#KEPKPXSbsggC<%)ulGR1Lv9G1OfX24!oB(;2jM914k+D&kmf%8_Rq*3sc4!1h1C zh!$5dP7g?>$V+Q`v2EHs-lSMs>Q?cqfnabXW1Nf+x&R{4G7FcfiI+HAkx-K!Nkv3u z!p5=t?3yS@ReRSszx-eSFJJhfKl*+5p&i=Ty}mD)XgurCcJok=&dyTVRa{?QIttf@ za*}jJr1(d__G>$)r>Sm~Tiq?(=ZlLA%P3fh#2|vbhp9qw#0*0i&agl2f*}*haFi#w zsiNU-dt5EOfkRnl#rPt-R4x8HlrUGl|80fEcE`kvQUqm@Q8A^kE;vsFJuK5}G8pKj zY-E0Gaoi-az=t|W)l%PMVbWjH!Fk#3bUysTi_~0N)_#N~>#|xyfv;6YH8FsZfY}A#QU|F{!d(movJM__yf4tl6onKrmx0mDAfP)Pj12nNGwFJ3L#QQm*}@Vy83F>`ie z!Mm50O?M5kI}Bm@8;cewD&sJ+>QbJ&W)=Ag!KJnbU<_M4?zJn-hr zlN08vy1~(%yFjj(YfXuLAvm#w+1}xyul`s%+m#hYj^{irh^P(TJ$d*Z9y)GBXE-h; z988yk7A;_w*VpS+*y;q6{e!`1#14?vav@0`Kr!4CW6U6E!JThO*;69xX8;OpJZdz6 z6ig^=^EU%IKn(I&y>|)Xq(2v=FnFVFvI= zA+6OGX*!++Ww_ha)KsSUs#G;aiu&|9fE^1k*u}{jC)RPGt=liY$j03t|M|}ZT_5Wz z-5-*&Nfx#e!wQfY%5$X9svy-y=(i-QlWvmxQ3q4I?*}h;Qd9{OJneM- zj2^JL>20{C|0o?#sb#oa{5Q47cf)tBwS*~+l2F6UGiy{4YjUB`VZXoIqKuVBNk);^>=o~%Y<71;A~OytDQgT9QS_h51ljxW%Yn%`gv*MC zUQ||SGFi%KU?>Tu>x*;D&&hbyX$P#7mesBix+NM`7_K*5UwY;i+mU|2I-38fKmF>U zIr^TD^aEdyPa1hSJUn_~zF7R;KmFY_UOUdyB!^X1;>~Pa1sLVra$?pOaZxmzcAXbK z{1HCx<;x|$3KCs?)?1R0LSi6v;qyf*!N!h{V%8a29E*T6{YG}`BGU; z;ifee8)Cx}Pk`9%)lL~rAHlJw-o=LEAakt2PL^-=tX!o8)B_pOo4Xw}jJGiu;Js{K zNE7T9*cQos+a^}9ZJb?P-n;+6)U?QuV0D?Z*%Az;@PU;zfI>PHd*ET_6p=&eM z)KHiwk0NZp*e;@ovPj&PeBXR(Ov;){rfU4AylE5-CzGza>g5kYjnw{hI_mddJUm=R zQKG^k=d$=uf@pJWy$J5pby#z>*C8h9WIFA4I(H6_!z76@@hNMOBvCjVuzJgvd-uqUK0F-C!G|ib#l|->b)#uA zZh#$_!gRi59*-6(+I>ny*!Y$eD<;(F#8$mY<7l;_QXk7n9bPOm9WjCm<7@$QM3~Ox zjq3g+>BTh-x(hio5bn3x^&sn7VmJ)faJg_qr^S@(ss%k40~e9kPyW*980c>*ai(~)RPwBh zoq)X-TcDLrES-Q&Az5VJY%>Z1|ERS%S$A%AoSr=2MW<*}yQN7fE#{bOoXgBa=c(Qz z7n&Z?!*Z5H%S=l=IT@Wk@D3+DThb+?jy)L1VS>Hk)n=TPQ!50E`hbHR+#xbuT*gw! zaGb5ttEq`dNzjO!PMr=3nrW0rVb&B~6kol(iUB5gbl0Sqwtc-@WBN2=ylPBRwe64! z#!?Y`ig+@nI;aA^3Q4N7vwsc>$*lO6>;96-O6qVG-F$eH@8tKJ_R7RYHln*Pnd z_ID2tZha6NWB2+XwDIuKBS&I_2!%cA_E-^Q^(>^gd7Si_!_vuA?`Vk$ZCBmVP>QG`ZP}-djEOO@*gCSh!bT3NI@s+nBTdN%IfG!) zluegEJvdBM@W!2qNQFtThY!YMGqV5`bEGh~*^<@RfI6SEfs+m<0a;?22+YBhB~>hC z?2c;;vn%ccIMAiCE?DYpZ!`$a2>MmVE_2|a5C8&46g9hNhB=dBxbI> zKfqnRIC+fSn*SV*ae4@s!xhWh01CtY;CTOFhK(&vfjo%kBEQ9!^6H=^Z{G~hmmrV2E73V;jTa9`Fl zn5d<-o+6To7nyTW_BUSJYliK-b@T*%(IA=EsSQdxCSrjEz?LXgK*B zfA#NtU$pT+kmBO{+G_CZw3eWjDd*gLc^}N@aLhBB5@}s|JgS@H5mw4}ho+G%g$hY_ zN34k~$!#nVmlSfUBaxe%aec#zP2N;ED^sW@gBZNOD6k?6vJC&FAM6DI>a~ zdzs(b%8LOqHUKziv!WuMMZnnXiAX%D7?&kNSjrBu0L(6HY_4rui}dLDT5NEcBt~?5 zufP74M8uAbc#aLl1fGcWf@E$%^)OGODfvLUiii~kqcQaiBqwU41z^-v!mI_}v|`F3mK=_;g{SK<%X5J5!DNc3gFUPvjkitpG#9A;3o3x&qSlKUw)}%zx3efD zu97%fq^>Rm*7oK)ZBSKL*E1lRv#VL_2Ij!_jlW@`NY)_{K(|M=0Ni%1K2{Ckkmz;y zkB&#vJzLGj(#$ zv6Of)(x?^Iq=!1N4xan$`bq-r>Hg6XJ4(V;9Mf2lpj@|03Ml+1_835%CPLtD-kZ8fZwUnY-zaMzqPZOfyEZ z94>LgaVJaB=IHyQn@n=OdT!0%2M8Mza~Bh0CA_$}pwg(q5#=L2!UB^J74-JRZr~FI z3JD*q`$FBo+~e5m5u1DSM^8>pPEYFx!Nd|7lzL7+bX7UdQ<=aum6q2%Oo&PYT*?rG;pEXn znE?5L1bL~^vRX>3s#Iq?%QsZDY&O+RaNR=C++%8IG?`#_hpPql3D(G4^sj&M&Rx89 z9){TYuzO*bWq_+vNJ>jPid)>ddzaehDP@;Oge#3qMtpH3z%%(TG>QvjFWQuEx# z5J6zIq#EAs+sDA)fjCTS`m)eyX<`v=E&?@~Gq4?7G2gn=#O zzoV`ZZL<(A0xyG0nMPp1D*{NiUNXhVHEs(SNh z`Ry`1Ad6_1z^AkDpe$f7#>s$%~GmX zxWYiPlCO+@At$yvTVdqI{>Rr*G9MKZ#fvyJ8?fr78n8Yrx)4I_@XJwM!>o}psbdp+i z04pPYiJia|&x5jt3D)(5*?4VWV+nYlK75a=Xx)w}NBzK048E}cQ_tOhz>cc8updhO z@IkNB=;$muKJ2kWrdoP6W0uQw&j*lGDYQ8K&@8!&Jon>a?}SW0m%I<?w6HhG#d(P zidqwnEJ8rWoU$=J?kJv#JM*vMav?0`4aQ^aUfe#C7^ui3(OTU;0Zo=+n`sEVV7$>j zKFgY(qt($-&nI7L9N7#Z6^5c@T)T56qDJEp9ti?)pe2NlKq38JZ|~^1%#!|OdTY7| zl(c5fDyB0fc?MjPasJGFEazD64{zVa_}oaU6^}a?#ekVqmMz@zXe7~vYBrl^YVA3? z`@(o{Z+3lc*~cVYWwKF4=zRBu+pJc!iI&9oV5cblYvwq2Uw#?8Bd!r6-%-LfS%;W1 zcV2p_C0z%@9IoM*&8DG_A!_=$4tDpJ-vnmrj;EzQYpVqAf6MoGm}5BIXGf~4A@k)D zu|0EL<0(#ixme)qSPvRvQci9iAK&}VJ6D&NzkJuGlC{C^!4w!?J!2qX+rT%(8 z!}KSOrq&s9t-4o71!fwj7)Hdb#F5_+VN(!TVx!^K{pW^MjKT*I2akX4v^Nt=yt-`(Y>U2F%ygfg4@lANH{(8ki05)LuwkV~DL5~g9jNNJM z*C4TDwMcNVy<3O{*$9&*8@-7|}r`HtP*kojh#_QaZ$U23?eNQw`*U}6?OPjnjSyIQ+3{@4Y*~BzItc>C{WgjE$ zFPxi0V6-tKY)rl39>$z!LLi<5-Tk0B-tU%0d3t}rs#Ei63V#QW%$yG@jFq{hY)(&4 zEg4{bhVc#2i0}Hc41}QylULgL!ds%^X~UKJGL!)-cSV!BpD@pNxd)p$|371I)+@=H zU57xpO4DR`qQ8ODIWVT{PT-H zyjLet<72?Vz%MY=X$D@s&J-<>19_l~87~Ahpd#D9gtVpwQQTwR-XD{Q73< zYH*xg6%`LSr0Lp>H)rXQ|8W*3N#2*3oC47ZTPKw?n@uxpLq5cd>v$EN-r8*xMQ%06 zhsOxX$n$bpX`7E4;vWw9;o~P4mzTuBR%u9M`b2oOKl`(vrj&7P*U9|w)|w^*p5?|T zDxw*gaw0d0iI_KetJA9~&vV?JjzXhBA2=3hSEjddbaeFk)!9n(hjY>LtkCWCH9m(jgjbtiR?vl%ZJcrswtDq3Ri zN5YK-kKD9LY7Q080HDg+F0v+0Mi6y;@hiUq(1yddyBNTSt9Q8o?!oE8epyq2!9Ek= zGl?Sn2^seNCr`$E*}8?74gL1Dvn@nn2^!yJ924Lyz^vC|}e z74FT&^m=+TZMNEo{l?QY2!gfImr1?pYmtFLCC8*Y7+E*u?VC49#ap@o@o_DUhb+_$ z0aUV$qTTHqg~D&OYy8$TDqAEeo_uoueintmF&u@ZI1TR|94c_7@l}DjC}A!G8Y5vi zk}Je*h0LVg>*1pH1_Pui?_RyS|LD=lox3<@pho;?wU(2UBkV{F{kdRKTC4SoiFVyTh-iI=kv@@hBw2|}F-|;ji!!C^Jolw%W<~3U!_j6Sm z!6Mv}SzPYmMg%s2X-=uQ@}n2GtFZDi$2!tHTdW)BIdb$(-3dlP<8Cm!WC2HVShbz# zxTZq9Dj#($NN{Hm;J-9nU%d`ln5k*# zM&`Gw$B=JJ9W%~ovBJT+OPZJN8cskW0H_EVCSGn!r}AW~d|9zS z+V1J@6fY{eh9kgX5@FU%u^(j==~=C!>X;Zru#dJQthk~!9fJ?D9}R+BTwEA|)Wpa3 zr)sUdVaHFl6os+th!en&U8(*dSHmvDdg+{OZ5bSJ-)YFHp(KB)o=@>aHbE)ff%il* z$H6wm!eUpyiA4D(&#_(>u5nT8?~7FKVzJ!1>woy$|H(n{&~f*8GQXS@T&x^*UhomK zq@=jEc5Gf8*dP4C|7{@B9@rua`dT%lVSrSL@|xGzSM%8%zZo7L;yL39wankWI>S~t z7>=HP@g;t|x+aI?lYm1?tek8FJinS=|LdRp)ZAhn)hBACe|nUb5?ZGc|K6aGN=@5b z^{~3S-MqwVzHT-oX00?S4b)=%HLbB4F3@m1sW*J;9PE^!5Cag@u}^hIlU%k~9W~Tf z;i8bR)$8-~>3mj=lOP#oJm|DJOsH^cE=b@4TK=-#;#cZcGx;>`<)J(-!c0X zT#&8y;n5L};r#5Z#brZ-S+!<1aY#>5f((lFb<8=;Z+DGmWL-tzjLX-rT`>R8dNxnkUWDIBob#E2_?P-q}a2haK8b(#c}mpC#?5MmfmNGtGb1RMjvfYtW> z#bWJhMR|rOjC;NAaL{j$#+J^e986f?yJIizip^)so*a}qYeMq{12(SL!>7-TfqSbJ zLdUyiYacP-waeM8KN?}@!Czg~9Rm%90K81+^Cr$PCD_X4{xRlQB~foM!sWPo_wFi9 ze)boCj+>~}?(`&<#e4kq`C>MWBX+M2PEQBJAwXj^ohC_4eJU!nQmw>Q#qkoklz5sH zgCDc_fv-@FzXs&d_Sg@~GUUz7;6Ln!G+c)>JaT1iwc1a<^BvstHv5Vd-jdEN@HM^~ zkR`Vinj&>lY=i7c?WVdS0Lw@+B!Nw-u%UML5{Lch=`*}JqU`+YGGArLQX0(wP)0Lx z?4b|4ok#Z`q*)f4bUHR7F_Wa65n*rXkATlM@y_Rg5DLid`jXD+Ok1~9^$1$h1dBBn zjm^2W_3Dx?r0A2^2-x1y^uPvpt7^>U8NjwLLN}|5Y+*W7q>*k73zL3edSA9nQ-MSB z|8zB6rNBBBlaV<#5)y%0d)RL2n9?X+;|p>Zb`z&XaaiksTNP3R=n7Z3oKDFuv6~Wb#^wbt*4F*vhL3%5$C|+`Suh$>97B@+FL$55+ zCd$GFBDaNngd4nYb`b%cjE+0w<2Dk3Sga0%IE!hTEVH`rnRQD;vReAk@)!VjOd8c@ zP^DW+5Yy@TxWg}AF0$3e25Z->K$J798ezxv*|fTi&H&(!KbmZYBN7QKF8s2diKw#d z+~UN(?b0Haa`O#F-biWZW2k>WaIJQZ~h0r-Kc+n0IG)p4n|qz z7PFa+eptMuyuY?NM+7~$9I+`q+4pDPogFd4G8m&!SV*go#4QNoNMhWqGL0x|6Z2R` zTRDugv#{G_?Q<)~YWoxe991*LWWKCQ;i#MAh%0IzVb83DH>`GI1XARARV0geV}}im z+J9Sl!yY{`DwgvZZceO$KAQ+mvp4kQ5+_lL!dP$Z0sX_`(l)l>l#1h8*@m+%c|JZk zc<}HM7SoFtFUo?ASYR3FHM~xLPyqqjl$)8 zi3Qmk4sjk3JJM)LdwU$Gq%x*#Mz2M1FP$$l-K0M0-3)NRMxGkz8!7WLt2EaY&%-fr z`4wcVL{f+`CB0oivqw&R z^ngjX?y!zCXNkBJHdTR8Hg8_`8az{`?i5)<7c`X__#gd2MA`-#pbtw{`gE7tTsey+ zeBo}ErrD8BvPu*{0N1ZscRhVPXm%P&xL$G8mi!50TC5qfiEfi9m)5vz5*MZus=~I^ zFB0bZYIET7_(7|ds5rr5MoW{cIqt1u_sjAjzHulGoozE+G>|K z7p4_qm5h(e8+I^OmBIdqf4qM295-&S+a<}daOyz|=aZ5T+f57KqE_qn`{To7yy`}Z zs5t-c%R*%hqj>V{3v3qCo11I(AnfeO^9;zf#s049oSgem4iQHo?gu7$a+-~1)9U1#FvTX?#Wdp3T8*n>b$t)WdG%CW^$DXgU z6aWcKsxu;B_nU$DPp!YGr%US4K?iMF3pFD66&fp z`t1&>LWDkB6G2!>;SiXE@~N7vUXk+==5!Hh;SHyfHt`iRGKM!PSSnKt!=)#a6q^TW zsH$oF44h2d{>W7tQVPJSGx1!>05ZGY&_8NrnFCff8;gD1L>u>qzkYYHsxMvuwj=jnOzw49Gfd(Yh#WA(rk_;LFrYt=PbdMIG>^(WInUKEJ{? z=TJPO5V5pgvSr1Mt?3SD1*Hno?QVl`En085FPemCVK49Ykqmhi+Suq0HufvCpKROl zj+@@_g~L-%PRR zC-ObCj)s*t435~pv9DEb@>^LqIjW#k=)_9jj%psBs8TjnYly@ixK(VB(xOPk72Pjy z*r(WdWT8PR_UTmLUM$1S&N~ffeyDGEboU;T6&!jjg70}vw(P%YktM)^e37hb`gZ!c?9g^^iN)WkQ~b^gfQ=f3_v?R_MceN5 ziyu7sckdiL*4N?vO%lHPHs5v;|Kv}8{QUXzO_4nh|M;unU-wM7Q&{tKLh9v>oO^Bd z2ajp^-bT@Sz4%83ILPVy5O5rvo?=1F1OtHJgcb$HIAcWkzCx|OlR|4^CsBk>CRKHU0qxRQawUGAyy{E-8m+Q z#jK`@c&rX?bwsA6a2VcdJedG20#j2!j1wz$BdJh^ywlxif&-wcMqP7`k810n7(5=x z;OjoM+n4j%y@wC6wIU5f@`^8&t+L^e0`sJp6m%L3{3e2vZavB|BmCg-ETJsK)c_#K z2#X7ucwm*@rR7i(Q@2_YTSX3h(0=snbE9Wg(%s|%%x)NxdxN?<>&CrsxdDbWr|nR^ zEl?~RA*hE-d=MfKzB16B1!KoVdbVZ9q0-30x9#=^`1|q6@w?aO7w_J61|vXiTrb_% zoAc+-Q|nE1I=3(fc3uQbYlYy+!_jDZbp?2bmDXaprV7oS>;Aw#gE|>`3GlPBt=?c4r<%yTiI9fZOvMiO_`l>jiC*Eh0XwLre?Nq zHZAO!wF)DItFz?Ri+0budn>M31I)M%w`7BTJw6$Y_FrpY$k~-T_F1R58ZOQrh^ZPb zm4atQcC#j;K?JKV*pss?+qY!fD9v?utWT2=HPqtn#!t+ZzSv1!hf3@)h3RaS5C;rMvuOsDrGQhswo!;EZ=+t`!MibHM$ zYZ!=0ev3-XX6A0=j_Wketl=s(j=^w*Yn+)!J-WJ#;Vge%J%>VLJkSewDaI8MdFLQX*?d`WRClTQGfW0=gin+5-P@NCVhZ;S)iRMpi+<_5`4<-q4o_sWCuVHo!XBtX+}j%EE|? z3*AM+bbWP&w2by(1FEuKzCOpkc6@pVNgI|95FT$^hvJ*d+02?g<6aMdMXr`MU(MB3dR04UA_!p5N2@3h+s zB%QijB8{$aPF4EoIMGbXRX^2UR^Wt4_`HFz*X#F?fFdFu9!zjP?>~8Jm(}_pE?pWp zCrcYo$#vr^oWFRE@G%fQvmP|Dl5Ky$iNbnDNXHkvnNG1~;{*b8uo;2lS+BdDE<$y) zOAZ7L8h23U&Ye4he*fS8>p#I^<7#mlNVg2W%-dIIz)|sX;R}zl;9si;#C9!wSVa)I z)e1of$9FVIp+eH#z6NFYTOs?zReJxO1L9 ze268mzyc$yY2%1~3?xJ;UNud;T{pzlI1Ii!zzQ`;dPI2quid%1zK)h*maPQT2KdBe zF{5zVVo{T5M^EjHi}P15+oo;5-SHa!k~N+P;TM-_IH7k5$tYoH)n%!nukJs5)NHkp zFL48>FG0%gUK0t@dU|uc-AM(y!W=S9Qa{CY0VYiH-*s&af-Bw_qXFl!Y{tL>)VZ1{E8AF$vb4EO|Ba42z#<6V_zxe{>QP}#G!81A8}q}Yz@que4oq8@W<^*6VJt^G zH)YKWD^XO#SJg}GQ%ZpsDRAuDw%O;JTGwi4MPZm@&4ILSRlTs9Daz$W#-0WoaI+RhQ(2p8Vu6e-JL1KaG#b zekb4%Y2#x0zK_FZGlxDLq%25E7B|;1c`)_CfI*@?7$N$n;WA&*jN|HB`b)z;g%q2u zlY=9i*#F^w`X5Ek*iuXZCrv=xk*hex%e`8*yN(>0^W2=2vaBxAa`7%3ZQ;uoU;lzK zk*&78vUg)%LZ7&qE-o*7(u6LIB8{z36Uc+nq)#WUkdVjm$VkvLyZ8c~4ldn~fBI9b zfp_QUZH-N0PtUA=kY}z8UBr#2QL3*^pp;10N}?jV9OG!=-Do`e>@)h2u5-%RQ(`Bd z9E=Om?;ETY*M02rX$t&X*AOm=AZ*ela(<^s>srX$@CLIA)VIJTG1zoD!+>)b4a7?Y!VX30J84{l)&oB_FNqz^v(Y!yf8a+#z_ zrs)q)^^YW40+^B=^%3UCgg9&hIgR4paKKnR9P&H9K7aPbmj_43H%Q;35SWZZ$Vqy1 zblB^4tw~hdQe^Yq$*K9`nq8ljB?^hC@{Z^aZf%=Zb;FvD=JPm-0X=co;F~T)$VC$0 zr@wJfQA3DF3pz<**%&(ESq(YFYlYheS&!?^XiV*vG%ZJJsj!0NHaDTtit|Aorqv2( zprui-@iZ0j|Nzb%qN?qJi5kCv7M&P?NJ3gMjoY4!HF7^#g zII8qwx~PC4UY(uXLY5~%vrdLQLn_T*Y!pQT$~*RA&8RKpqEgg^(>gS8S!?pv>|pF8 zR4?KgX0>K{vU8PS4=U( z3ZbfkR%s~q%-if$l>w~%sS@lmY+;{n3%gUXi`o9z(7RQSjwb6~zI=)MpA=4&A4aBIaCMc$?1Lf$qa@<- z^*{Vu|J}D;(~lqj^q>Bd=Wl;Ja8Duu4r_w65UvITz>DehM$|cOxyX! zBj$&WSb~H92ylo_I2;(@I6XYZ*8D&J?(Y&TQn-_SV=F{$rE_3HintS8)k+I(PbO_n zQ8g)qx*B}tNH$Mt&Gr}US%}kA7U*`5N23n5Z<6^nL5*E2bckW@kml6n< z;Pm+8d#L;TX0s+&{VG-5p$b^T+jNfQnVbvjtXlgaq?%ag!*u zct{bs7e_}W{d0OvM#^f{>vjv0pPIO!KyrZHU;p`^55{AlJ%DfAbk~=cIJQcUYc!eQ z%phN+H z5&5pLfeSQ}>UPx%IXFE0?29icq7_G%ug{BogMZ@|LqJ9*Zqc2v_R4O)`b!g-L01(pw) zwFFF#jd~G)wpw8nr_mD2Ne%rz2fmZo$kDP3C@O9T(xxO`;Rxd-Eu;x%K}mTTiA@!S zuFCOnet_(OCPXad-KvD%lSj1f-<@*+gxT8d;n{ZNm}JGSg)v zc~i!0#9BJLnu(g!HYtyhb0R}-s0^Z#z2cB6pujp~14SXm_1kr}HnPq9lDmnfLmlg> zoBFuA46@-6Ap`&09dHW^S-rqnUIU{5eDudH7vMo6D2N3#OQZaV7|d0=!iH2~98YU@ zR0j0B(OK6>CpdmQ$L4h@s5(s@Hk|zOTTrW1HZjr(l?&z8Y9TlboXliN0)DFrV#hwbs8B`K;CFUqlKt6NTL#B$0g#Ps6RP`Y!&)##|1`9r*ydNrgC55^jEZ2f zZ@1>`07N8Djq1lrQPha2M#8^^Gwe|=)E#ewN)NSKr4C|!(|Arg1!o_8*7@V`y&)>{ zE$d{P%oimZ5S&_Vo8VaLw#>C@7Q5DoT^Nrp222UAY3^K}K#mT!?A;1?H+X_G&=ugg zzPZ6|X$2U(?b5!Ko)d207IPmzJbL!U-}v|b{lChkx5rO^`ltWbAODka{cfsZ&e4eW zsulNhN!fA|BN%a8t>Y5{4rD+)7y^!&ujG|^i~vV8pRJO}Rw)8~e=?zt#g^j4c*+0y z`@e5D8cEZ(1prEZC~(fsV57ksP>G|Oth(id8`#Pv(Cp&ykkQvvYg{EMUNW3a5MuEk za1t&7nQIZ}JN&@M7P$m+%2uP%2p6_J7?V1haEcL74__IH)q~S}KmN&2E|E=gj5$k^ zor-{~_CmfvB%rXPAE-)R_+^jIrL39gb%?SymVy)+P~I6JmF|^ zK;Z;@obJ9TrEPj45;0CA$+?owbBfZU1u>5@Fu=sl7Tdj7ZegF86{vTXOyeSJFx(&&__~sj2wN)IOk#dJr8@J(Xe|aCo!n`9A zsK?QPxZrS5bFCR&+S`6eT(w8-Bh2yT4}O518Xqy6PNl?(oo##P^rWD$3a3Kqtbui~ zLjfOnyWuiQb4uJ3`_Jg$5PM3XRvONgjj0=QN)|JGFVodvV}ic~ba>@$x8M2f8P@vc zY=$ccWRR^hpv5^^nKc_*wQ5b-eri!Y77HL;%=c?H*wcYI<~KJuRe1a1cvNgQD@1i1 zTbj1JeH_?eG(tqbxp>#dIhTk?zEd)7cy4?II%I=6|v%CKgn+@p8P}+$XHVqO7ZW)YQkcrVO@-IF8-F{u@uJwi(n& zTdD6N9F?g!l4?F`q}ur&0xf>o?gdWSO(1(COV&senr(6<3wo<=jElge-!gboJ=juN zuhv?or6gBPZma6&I_w0gQf{6mVv>5TZll%lfkMLBYMl{nni!u;&bGL6;} z0W-ouS^p9DVq2=0>LYBx#FfQ~YYHDV>hY~&vLFFgkb7^%*(9q&`?Nh%8y9O5^1LP6 z!-P7zqo$Em3gH-YYqJ3sLN2caG&}Q`t#L%yc+yCY3^!=uCP3zy@e1}L>kxTa*I!Tm z>hY%7jg!!@qF&$slkqKXJ)gsb2H|&r!(z5IN^YT?sz!2faDXjXD>AMM7zT8#nPNmy z2KXovb*@$H?AhEMud}OCv(+<9u&ZKbO}#oFRXa>)*WC@) z&ebtp)1jN8-6|Oj%#yOVk_xy_r*Zlp)KQ=-(# zscZHX&si?tvq7<;GvQe0Bu^F2_~aPBzcZQi<*<6AcPqzRvdq$A`*D%IaU)I*p4@*B zHP64TtMYsQ@_(uReY1G?!1>Dh&{U@oWdu>1#%Tf^qy>=E>JV^jw(T|m2cZT4N4{Py zr!#H`xJigp%en4Um49AwDRv+oY_Q9l8Q}Ooe(#@Qk84QyghrGcPH9zF(4o#vN`}he z(N^a5TIrl>*~)sYCeaR33I*NkgyZ3JgL~?hDUnt z(bBWY%&#cO-<0JeLKGrRv|J*!rOfq=ol*mvG>&*V$Ku4*X1Bj6smyH1Vq3~a;bQk?QM<1Jli#6*=963X!_(b<0g%li}l9Z5+py@Tzs8X zgtN4y)G0x;D#2{K1p)3;d~TO8i@UlBkJfe-$6a5Vuej@rBM{7@yhFow%N3?Ia$#jjm9wjoBCu z(r?y~Bv`@2u!XtL8~2k|DUxg#&85)GORbKoOI6MEQgaJ$!dp{H>`2P zA%9g$0Ts<_)T%5kRU^;T-N24KmgB=fqrZp>bF~tF^y~i)8D3&tVbP~c?weU*EMsQF zh{`}Dj^rtQNx$F70?qJ)5-iSMPL7Xpa8FN9@f;+Wh$2}g{|N9sJV!FJjF4;5h*GK)qcre6;xe^F4z=4e>lbsuv{+V@ z*y8W0gct-iPPLI5Pg|r>Yy>t$vyodmu!7H2INea9zRTK-<534TiSa2oheyYUh{&Dc z1d)9)y$Pg`?r{Nl@q7mCIv$UF#*;y$i}muw^ZsCHqf*P+)DD&31=|5OzHHTMwh&!7 zjOx&QD>0@8VQ7f`%Jf*BN)&}Dbu%Z~6JH|p8-7#P8$c(FsRRnax)fw#zK&fLIie;b z2qaQfZUBAiVhsn~UMdlBuhC@?xWc<}V8Me(V~9~J2VUxcdg z19GVG*M5JHtn+=Fw=2>+KIntsd!Bv$i@*=|F-I!L5S+~6WKwJRh^#jk?{I8ieeoqu z@HIbF<)z&us%exN)nk8WqkM%+iC9^hcO)oYYxRdXljPWHG?yfmAgJi5CYl)~NvAhR z5_-K3`+d?jyFIJ)>}!F9^uXg#v|$bt{yMxvHyN^t;|S3Mp`DG(UU`cAor-y;5gW@J z`#{It?wtn@5hre@Q?h&j%Veyxik7&_W=o5YlVx2OC!fZ%Thfy79L*@<+R-EyAY+?r z9Hc1TzI}%^){!;|zU<|j*9SPVlhcH~ln6)9<+Lp6i!tVkAyu6mws~m39B#@BFHLPn!{E>p}TFGV(gz zcr5UECcF(CK#$gOtJQ7T0BW(_A4O4_L9?c&y&>yV1}A#Wi%jGR%J^y@NNyZE%hvdz z-67Cl18=psA%#NqSBInr!kWVDQHFCAj?0FyWN@5;}$MVK=~>+Dr8KIV;9MT_eB70B2}8-`t~8VPnf3OkA`RJBy>V9fR2@*EcU;AU`{~dvAbBAd z#Bm*^je#x9Y=I|oX*nE?``zAZy`HICWK|Q%l$p;0Ppnm6u+|g~9VD9gI@G$BcKaUS z&~x_6HVFX-QIP-#n2R24aD+ z00PFEj_FPgvDC2zy~mFaj*sIR?N>bVGe}qwYCMkc`kwugMAa>u*)hM zebbiChcfE5M%|dF*wjr9WHFm9S!UP(DE9_^8u6v^Z1kkSBPCNUc9iq3*jB{zETIN5EzwOfJ*%UC*LGHSw<8vGIcUD zjmvQ#hD%?@vmD_r3geUFm)NP;`>5B6Ae${oSd_y9I$|3}703z5 zayT#%Hoa9u;ZDB^=zzq!m|fy6asZLR0p}H`?_v|@kfOP#&Wk&}h_fWe!MA(90x)&K z9NU{&Zt~=39MqSkJ=k@Po^`0ABb z0Es|$zqi1*iYf947u_2XOt*`#~tMjvJN(d)AiDIu_ zn;c9UO6YObvEfFu8^wvtDy5GeKXhmcKfv~Z==D~2^>9FUhDOi|G>REsU*aMl#;26K zXpY9C8fP-ywLCZqQJGfTy|3q%(4kQR4o=)SC6mKBI6m#EDzgtb@=dYInZBDcV6hue z3idcC`2Uwze1{+Z~>=P!}H7#D;MBSmWx)mgTqDu*k}Rp`a1G+*3cb^DfkGg^dkADCrF&8 zSJSyU=3p5xqdvb#JNpf+qNfzexH4;ZeGvj8`Oh>Zih+AYAz9fj@ zo3Oa-X6wyDib()NZA!^C$Pb``ONw{ER*P@?=IkZD5->+CXwtMZ3~L&RnjD?vQm0-l z7BQh2QQ3o$h>BnXjvWfrS3@{1p}GJ=e1BjfQZd`K-?Qnx54*I;>IEo60)( zF$YP$D(d3uCs70d_w4M(R8`Ws+xq6LX2~2a;23NsbLO;=jqjz&t8>dERagh+|<)4 z=Gp7vwBu#wS*TUfs^}LZm7{R{w5M66e!br7cCk?m$CH`ry8x7Bdr`zMN{1aBo}HZ; z-Cj0?AwVL+vL>8;)k~;E?#q>0zIV*=N(~jYqO6%qHi?XTJfuuyf5!47;T_)C^>j9J z7!WV5iOkn6_v%^@w5~2M-(6gs-n++kv!?eo6}82uGkqG3Q$+ODir6Jdab=0o@rjKF z@b2@MFQYV(%UEoKhggBWS!OCDrFXX+g^VYz@yr^aPlM$*SE4C}`yc)1ztZXXlD*p4 zT!15W3K1$9V)JZ60V@?YC?c+g2>vv`ia8T2;V-?!M6_IMF=XUDFg6=oGgqMH{EJM~ zn8(x4aJA8FNUMw3Q^sB7-e!(#9UeN}8|E;Na#AQ9957G|FvOf19^0e){dV79#rfhU z0ah@mWHeZshTo)H(NOC0vd3$2gtM#I$RB~o6IMtvu)(TKnrj!*-6h6}#$Dz2i z{9b}Y64)r`Z<|yT@ph9bNWXaAcF4xbDch_RT>LqpG;1D_`5`YlaYSgd=Lhvxap+|q zv>|O9GAPjNeNZiQcBsPIABG94Q2keV>=#Qac};gG-BHPE9UL4~JWxj^4aybI=f<>H zk{uP=oQQ?qs)U>!0prKk( zG}S_Ob?Sk;eR4{iUb}Um6n`co06RSVV-~&lh?lk_0no|42Y?jp?TcZW(IVLm=krjS zV5bir;2a+e1}(}|Z)QgIP(5iy#dPa#j7<}abM0y{^Ena499!+y@i99lozWOOI}+mA z)fHCbWIU!9GEfC&C^riN4#)goYKRAl5GJ1hNKxB^6#JLc(MY7neahXG6^DAMaxGMR+>C z|A1F1m(TPH(I-N1#Rh4OWa=Gx3Cxg{BmJk$O#lQ;_Ala{XS)@BD> z#3(BeUXbl!lSM*{1>>qEXIr_+f+19!pPw|Km~9Rx6EXpZ!z@82lul<0EV)3Exa%~< z2{M(u*?eIFfc;*V?xmyg+#=IrVRsV}-@d$C0fISO$YI4Kr=V&f8Ko_q%>_7!w%K_s zeCpTo1`L-W77~5qR!QA&V!1Zkt-JRgP<_&Io1`V>(`#e`t7sV^OTPc~DNE?c;Ab=B zgk1`s^AfMsR$$-{n$c{EGuIh$%p`D2=Ozowc$0dgVS%|UHbmi9KlmXc=;ie_-s9}+ zU*N!rIgSp2`D)E34)yBoYkbO&zVkhRZ7a*M&WCuZyuadn+`=3t`3iu@(WhFY?(oc1 zEsSsLgH)JaIW%zWX1D8J7Ni-Tyn!Wyf=a>kL7|&<9#1l;0gFUP`PIf&P zTzafhjplJm#ef&?j`Qc=9Gx6LeDow)vE*6xQ>yP?lOU;i0~wbHsXuTb_4s?elkueG z`!i~dFi}aeESAQB>C)mB7#$sZY^pBTIn8|lXR}q-?e|*EVB8G882vK}#?<1q)@C?%=T9 z>iUS0(|1uJw^gGf7+cdYhv`hXnx}Q;X(B49?Akpb*1D;3Wzs6uY-;IDt8&ezlr5LX zy)iMpnpr(Zmi7&$fUg?Ia8~Z)lFntay1lU_y zZG&SIb$1u#2&dSfsTtwJF_T{7@VZ&E79H&0d&N!y%XZT8j7h}P`H*{Ik4m#^|2Otz z%1(&m)cjV3T3`lM=s`SCe$&yAURHjK39BPX zF3x$eTk)-cV;wK?#Yq^56Fm9x6IN52UGn~_D{jPl+~hc5SB%=qx7yhO4r+yo|NrLg zTm16H*?BI96r=E#7sY*l<=SR#lO~ONquXxd#NxEzC9X0yuAev}fnYr0dM=87r)74p z6>ub>5UC*!K28n}CqM@6!Ps8Am4gprDo$pLf(NCOpUtK(!zF@Z6ouGmJH6hL<2FfK ztq|-Y*t0dQ!y#vyT=Y50$bCju5dj6@NHMv5^O|Bx2y6lhFzu;z;CUof(ce0Q^hiRTOQD&K)JSvi!5mBi1n5@=RaG~s`_&1GK$Eed> z^RAO<06W*274A_Ay#0s8Bp@o^;(<`qb@!!9DsOD)iS&9tO>HOABvN9{`_lv z$0yG|$E87plbnX)bjo@UV$%CL)zR?TqbImoB1Oasb6_n|_>%Sl1Eku~&g;u&VN65a z;7CQAAdK6|qW38o(qo-$yNTIlTerG>iFvo*zIv6$5o;1VFZ&8};9CR1&!h(rz?!71 zwZy4#Wga|!eD~h{Z@&4)CgW&+qw<5bK6OfW{YSjvP9~t&?P41O4#vW+aVTnA>5(K0 z(n715l%{OtR#AvknK8c9JH765K4+zAoi#bJjSZbHEjWO$zy2Di5tq16+u`8y^=mA? z?|k)DL+vCSnDtXw0s;D*PJ4qsqVKTV1x~ubw^PeMiJ1lr4-Wd>?w!d5o7F;o5xB&m zWJuKa*e++&R<}b5i-unhnt*jQ*VUeeWx-U8r zJ+wImQ(%FyMMuZlvS?azIE>qf0K8Q{f_2KWEK%0pfip~8+^p10(OfkX^_w_HPFvR$ zXRk0)Hk&5hL4c>tuao68MI6PCG;u8L{RwCTNflP}7qqIWK7n4mr};t4R>S!EExP)K1-O_t8eX$LHV|Z@!+bv#q|7 zMKT@(UMpsa*KG5K2imaeg~==it-5hBO2T#uc?nhLu?Mafa<3`$n(TkC&I1hK{Q*<5_^R?uiX7VMbPGim3A=DKrk8RT-?IP1H! zmw1PEOC!6k(;XiYZ7k=~awu-5EN>uOVYkQs-8(*YcLR0R)Jb@At&`ks=nU9+Dw~^P z=O@yxzVq-AsRo)UuwBed((^s^Q1L(yOa3O|0{(HKiTpM8)_graJn9aHW)Zx9`IpzM zmjEQK)lq)(^bv1_!MMJsOS=y^VloiBnT1kLXXVXSGh-f~TKy@NE<3VV((VEuw|ynk zR@V@+UFe1lx;y+OR*AX08RvpdA2d=<{J`h1Ns~G}@nSw4Pbgt7K5|*3l2p_xN%1r! zQvBk=7Bkv}Vhaq(a?n&L<%Wuax}|xJcQC#fpeuuOV^7QQ?aRT}nHfBn+p5n(dnUv01(~)@QP0%fM^+Hsn?6!6P03 zA>|uwfLjD(imhqf&u)RiV3^W<-u#ejc*$}RHrsThynFwFFR(6Q&B829)jZjJ?^k~W zctxd$IDY%;r2&znw{Ri<>8a3C#QF8B*fX{qT(KLB~Q1dAND#9 zmxPSno`I5b;GXAG^H9F@)Qes?}; z&-CimD;y*c9?(1%Hck$}^vT`3RPAd5jdYUbLaa|x_of#Y?OqS(gsn!;yS%!@5_D*2 z#Rc2N&NUn!4f;v8p3SC->LG|z!{NZkq79m}tE+H1@3dQ-oC4^~Ir~QM*_7(H`2Day zSS-VT^^>2hRxIHJ+TuK7ckS~HjvV3nawbY!8nZ%P+!TnXJ-x*`gkd^4Nw*!bu!`1I zVIv8%*#$*KI(r58^dXmuVmjUNer5~tM*VBwbLMxoZhWcb#^!nOBx zWM2Y6gM;Mssk%aWRw`#`mvH*ymYKS}J6qUbj)*%p+DZ^ZvzUgsqN>F3PT7=_)8@(2 z>^AU06eN8Ua(srgzp~UJv{4J%4WW%(yeeWHP5yXJIe=4|*=`H#%NHZ>snIx)@z}Mj z;DrfP*sZ>AT6POPm;uWEZ>qPl8j0;$_MRrIwg2Rgt0v~lTI>WvIiBab-ENnzLTPF< zCU}nh+xjLp(P~et4Am+ygyXR{sj!GW>__~sHD#>4VJHXh_ExF38Oh=a6Aop#Hmu9? z2JWsM^8ni@wgt+1-n)liP5S*-5QK3w1wP0*-;2LuF`S$pyW~;~am}LT0y!?;VKn6E z7w?`fdl1ph6|PL2q{e8OOvbnX;{o%IWR>0s$%U)c)-D zpMQxnkcNwOCB?zfl2YBz9+~{vfor-g@<6F2B{i-2f(3~vjIdVkJ$^jVl+D$}ds+q_ z%bP2Q0=@}SEu?xUnuhHRCkx4_ygGYnmU*?D$)aN_ zFYomSlcVFyi;E3OKYfbrP(H#zLTp?R({p5fVSaD=Sx7+5F#>s62$S7(FR|SpQ&GnQvH{C9P*YVM@bfO}F z14J^L1bO+hpCJVP;Me|IiZ8NQ+`M~B&$fvEL3i#^GLEHWmn38?|NEzRkV#NaMR)F0 z#3@J1c$FrC{dI&>QgFz9vW0b5eP<+8Y{r2z5_kwPSJB z)iv%-4yy4G=c959mMc!e$0SonOdv`|tMWSC0Sh~f!DxJl@3>szUZ_xxjn^I?9p8Wa z!_*`*RiQ(A^0u~lsH0RCYACD)1p-5(Ilqp2;Uz-&dMZf@*kMG@Mz7;NW zN*-@-E-rA7;G6&$9S#OW71$U>npveWvgB^BUD_ z+<}`dgi<6VfcRLzNJ0R_aZ6&+V$HvO`^J?TB=uTcD*u+UPuo(d5^tZcnNPOp;m~yd z?tlHGLIN1OVGZ^&Y|O+_X50uQRh#9S2(5Pq6ct(ABx$tn4x1+r`}lE6=H|xGhF5bD zyb)`o`D%WZ;B9-Orp?Mqh{7|b1*I<}*P(b^kXAx}d0N=xO_sA1Z-^%VrWA$w%5IDa zVLT6wq#A|O#bMMNzzQ6eVUvE;w7QEavYU7p@rwLlY4t+K$b7RdiKF=3-Vmp?zPL_q z-bJOatd!bKaeRKAXgy&!ZeVXqmYHE1E6G^K4pf9A$05;#cEj3+Z)hVSc6eXg5Z>C= zjmqI5Gk&vE#3O9ftcBF~?gd`oyhy52(=7mDpuzdnqw0DTdk!oWr1-crQgKA=VPmCM zW^nfy9)=_wbzbb>v<}%xff)#}c@rCQG15kB=hbP)Zz}0{zKyh0L_xB19UsRD!y=X$ZR3vZP@z7Jxn!e*)mZk3h9%Je#B|6;re0 zlhcFaV=Oxf#)TZXnk8@qz}LKHlH_hx`~H99=jjPxp_zLAI6kKmCb?hZ!cQY;bk z8f?!`r9i|9mr|A{OJy9$)Wr9L=ihu&(4S&t-r{dwogr;KJU+q4(S&(1=db{E3+Pp` zV?-5L`JCEqHCr8u*@Uwh=XW%rGrzgUDQyPL;b@#7@eG&!(HJLTIOyX{#Tu9b=0?;X zjmK#my?OcK&i(rjA3rtGt&3MLH)`dO@h}|wl=vFVuCHz`-aUKt%n$2ty1P3-( zDc;!=9rwjyvR@*>rQ*o-6+q1Uf&}j6(d1SWgd@{C%z;Z1)a!_p?JkXl7qe+!GxN8Y z7W?93w=hRkS6j z*U}}$zpH^1TwFTDlKzt1wv;37H*a@(g2YlB zbDCm5!Pc=ez~GVt4hZA8*XhjWGZFEMm6S#Ys^2^~Is!(oMsff+Lc1^I1&?cebb6=m z)v&g`h7Syzgdws(pd_5?{&@>x#oYyVH0Gog8+dOI0J|QFFd;6L!?jRe0h@?Wl}QXWN9dkTiZ;j zNni~Q2th(XkW1!vChfIOaWB}64a*5_X?0xH(Y8pCqOlsZup$^A{TDr7(I9st+sa6rGtR41u zuV04<%`GxpB@iMBc2g*~0Tzc96rv5Bw3~OdurICMoRZqQR_#LO+92F$;I5nNf+f4SA2z=8OL_-{v8~YsZDG)`8$q^6pf%o zNW^hy0;6a?qX((yPR8tuH+$sw;b^UkVUPj=#!{ABn8Rl+pMMS2+zC_ zrHLI;U{Nw~nO&@cZ}Sad~Mtm7=BCoqJ>% zlb)iD5`h^fo%+)@k;{L#5L_FAkGPo$FB)~gi-zCiFv#=2ew3 z8{nE!H7kj23ZoeS*ZEg(={WyT283}+kE*R(10>pLb~g&i^gNRMhAZJad_`pcSOz9P z6WwqkcRHP6VYjIK&57B!FJItDzWU-zfSh+4ipIT-D?v{<%8kU$Hk*c%!$SiTw(*)q zRwcygNrj0(rDK}|!SrH|%kkZ> zzK^@()vH&wZV`#|J&AO~9BgCJwkF3;$KoQ@l(rwwgW%mL>pmkcN7e!SH=j-eS=_~d zp}@{`zRArU6qndu>)3b~+kYH|#k#dV2u?D-(be0xCwJ~VeEh`ZhKV`2`k9qoy?I0S z@nq7$(rh#?uP;qNi1IdZ3fKnhaxfg;8IMD(3i4Q!6#zbf8v7mtq(T?x=YdFLey5AG zl*-t}RFeDsK5)$G!4bgdEQ*%03&I*ez{l0by7c4>xaQ<(ivO$uO^XBJcswDqDNgfy zOA}6hw*uT<)I6LofRLuLjg%82$7kpS)NCP-@!T3UV^*u0<*vW+Uw+>aNy5fb)WU**H+yX-?IRWFmn@5 zm)JN-LGGu7Q)_Jvt>AM>boH1aNrcD8{S5>&eHY7GYDKf}-v4CacYdjO z*DXFrZEw)g*)xx=o>1wUf2?$F2-?||MvQIBroVs!9@fYxfmf$v>Q8u%uUfjbLadom zRcH)JNS$-(?#Q8roT?uwbR&L-)lMpdx2dKxD!OY`-ndb6e>$09yT?sc5-Bu;+UAHN z%c@r1;6{rgYT{H&lrZMK2(C)%P3s?$HXkH5k_SYSAVshRW51pp1Zu#RJH zYBx92wZsO1FdT|23|!CtdtOzdx7q)W zY%fmkJ&-jCH9ZYHu{*n7fA+PKp?~k2}Q@lSL-0yh&!rbXAjYf zIs)}N0vo>a(`TQDc-m%*$V6`Jj(xEL%Qa-whNAWjYc?`Ku%axVHhENk}N`nsMYnG*Vvqn4v$tWBDuTM zON*B2j5&IDI7XNO?!l86qB}T}633l*@#Zz9dr8L619c5D7W$w_ab} zkiNQ)IS>(tQX)pk38@O0H{^K>SbTivp4Db5sdeL6wA-Dpe(=KzbI`sqi4ikAzlp0i z9E~Xc&1vNKLa6U&P&Gx*i6^87yq(!n?1_6}b!i;W%Gi%P>{2mCIi}a^o5p#0&oc5h zksXCmbZ~UU9kr|kZ#0}Z2kbsLIk7$nzTo=9K1jdS!mWCBbEO=trW?T>PsZ(_nbGlt z>LSLx84UUd2NRCa*XlUo>s8wCcBvH7A8_6{Tt;yWXo6pMhoeTlF<;C%96_O5#~6%O zJ*+t_3bNp_&S~`=1QZKqRUu{{f+8BQm@lYK*T#=uX0lZvyMioazUN}i$VQK3s?aGHM8l^wF)S^ zof^2L)omcwPT!HVLVs7kwpnjzz~-)035}ji(kewKtXqUL|50+biYgO34&|O5=Qb z!DBWTEY_GGxbM>h=_ApG>3vyyOERpI zM59W*XQhsvR9eYRIq*OKHujUkH_|Li^Zb) zUii(y0S9?Vzt6IEvw0{^>r`=Ng&Z-7v7vOk9j7z~=Bmu(nheBEhL`Kyd;GM)3C09> zW>rFXU#rk@V>h&M)*(}_dadEN2O|Wn`Hby(ijc+}WBL61KOh3rn1sF1RYYG2E6~Ta zD2AiKSXyBn%6-0{A(~!at0uod7R9ufx(g+%2H(0ZR|~xfCsx*q@ecbYDRyUsOH174 z>FlPY9FlY1>U=O(ZPQUJRhwy5+F{LU#rDK|b})&REb7z|!SLgZoQbu$CtzK$M!Ma; ze*GH26K9(#+A6iNdqhOqQ)&I+aIG!Fd0s<)l}0_|1iq@FQnn5HnmV?e9(P_> zvKeVOZ&C`ZiSR=>+wbojXk9v~bUL^YJg`*)I70348po;LzIn?z*iHwb3!gr{y7=OI zUjfh}j+(`f6wrSU%(OVsqfa4JTV17unb zuTDxyr!bPqc74$80XCh#d&io#Plcf@T_KuwdtIOVNNqNq9Uq@ehC^N&vQ-o0pgsqH z+X$TO)U2~xgGdf#7d3#1`~QxpVUf}>$7nKPd+6pG!BGSD#2iK}GfPh!9%1DG{Zuj@xHL?Zy;@&eMAg|briF>3V&h)tc@I&U_-RD0*x8xc zznM^ny-ziNt4!kqkx(`$5tYOd2L8Y%_TKsg#ybNy&ECgCheqScBo#N8f+_;%e+2j7K8YvCd@Nz+E-`1pv(vQLpZWJhEc zjaTwIn~d49Q=iC~B{dh2j3@Z~wrh@3!wNU@vDWwhtf! zdc-Tbmnxh#HLBT8lk~<42ihPHBim+@6U9Gl;KEXTqiQ0KuA;RREQnxmS1zZBNnS^i zT(okPdb(IrMXCR>EvpF4b{%h0Xmn+(F_tvq)oOO?j;2z>8O4chI@ggtx^Y7BCOCNW zZuP9B>)7yZS#rRa720r;C^KPlQ`b;&byE|$1p5YkTZ|4OvW3w^7&VDwv9o8uF8Y!8 z1%OxGFCA!|a?oZg!fDBq)tW0SFg0HiN8EEM1fmJsjdgZ}>dJQYsPVAwertE5*mG&W z^=N&R$5f9>=<}D4B5?#xg<5&T$@3LUXGOjZ5*`WhcG>GiNJ<8FCB;JVk^ zkYFEm4{cC7mZv88as^1XZe0Z5T8=(B$`ro z(~o!a$v_*pL~E)A)|x)iIpD)a9w!~9!ma9P@pT;LTbyd?t0RCNP2%Y5TwBy=FwEC0 zabsLLm9%_Wy5z1Wh}K#y7hb*A>XA=}Mb#e+=yk2M37pHsl%4Z;(U)s$RW)i|>AT_b#G6V#fLTnOV3cF`Mp_lao=e zH)yxtU0>r|spdqAQlr(zxw?3B-o*A)ula4>VyV@?vlR~7ulwD0`}z4feP09OqKzhu zIxS>!wN|&kio?NR#L&wdn=+>OBDhttmmN$F0L$buN(6?Ft4_O76W+dj5l11CV1hf3 z3c~Hdm_|atQVMls*tXlbTNA5{?XV{K!iaH0vOO*@5D0l@Rk|a9)~sn=ofHIJ^Czpj zPRN!SiyU~uXJ3AKaCr3ciA=Unc2J_X4m|YGxeOiQ`VIiHx(;Y_6!nGTpIT61&j7ZuimgF>u&Sm0B*6 zEK4NT>`G$>*YD`$w8+dtTcAtqmbIW|E)cfzW3e}Ifz+@b zQ<-K5FR*4vl8qzWk~rX+THf?WD@Zw_WKm8o-TB!WA|+OIrfMbK3VqsQvdjAS|Jz?< z=%p^uiZlqn*6fH9$bmZvd+Ug8Dny9JF*_0)LRs9Th>qR9-|SdBL(!C~f1asYS>MF8 zH)dBcUefCLL8~qz>PAu-CHu0{*UB|COG)y2jY0xRPLEkZ5H>;j{Gf1(bD!6wk?NXq zmt$rnb=s7qrF@8`R9=nT2vgCpn8I61vY}PLHGT$uC4G*%l`C9PfLvLeET^f-jGD(R zz(>Ajsly!Ca1N0KF~`*XfwwaC5m!h>Q$K~Kh?SaCn3YI~Xv0AikvZvRYqA`6o(l=U z2l=?R;k_r>;!l@4KKZDXJ@u^x_)k8k0u$9^pPFim&)v~Q>2I!~Q?6L;wu{BW${RMk zN>%AF1Txrnb~U99N6Gp=HZm)Dx^}6f?0hKsW!;l>XM-}COsu>Cd}H++tCU!I!`#1MEgP?`by;e_Cwsk~{U>Xc53tU1*c*JL@L8HTX&LK`I0^kc8IlKIp%Xa8c?a1niS zwJBZGxXrDz^0FQrPV6{sH}CbzO}tdxa>~o<*od+a>hzlZ^{U}w1rIhFNJt{`z%Spv zeM5O;b&hcB%B{3iTahD^YZVBbI_q#(f1-p`r%OenIOfctRaUJ7Wd|lajJ9(SgNG|h!n4Rh9C>ju zJfv;uklx=J>)5sWniGa$yVGt4{))N-d58r-Rb{?qFygkZ4K)j~j%43b%}!Oq&PS8g(%$ zC=dodae94~rD@x50J`0I@JQls(P~d;9l0_P>Q_JbA(l#|cyY@Kg~eAgpE;C-9e_$I zVuRYX1~f5+@)}DoytRQ6h^35pvD4}Z#7)MvMi2@$0qfWRYOhZc!|oR2Nouy3BX7APOz^u$w za_mK%5Ijih?C#B*?qCp7<}1-2lJ4nNNZ^6pm`&SO$7?l@X||^~9a9?GrX1OCZA+|~ z)ZI8XD_X9ZFvMxxtd<)7Z2(d??SB97|NA#8ly7Jtgd82=7SYiLG5l^r(V7|?I${o4 zFsM_%*xjuYTCCNa;k08-2ipitvz+>*JLY+H88QOOY?qu^Y5NVgR2pS>0|}{UH<@(6 zOm72!4f<5!eU9N7k%(RlVkpZ@cZlJM6MZ zjxA-+$}x3wt2mUk9BH9SP6PQ&?E-Bi`%K&vvqN)?R4by1D~4&4RgF?DeJ`}3jxP}l zb_(X4$;rwv)Gv{7U4v+YGcTojSZ;yp%zdOLwugJ%c}_@{;#VqO7L6`7Hf&pe-T`^; zA8Un;YHr1DUHiBCluK39qE=a&!D2lD0npw_;ylIx#qWVX@b73esy?D>msq8}!V?ua z)an-1@9l?{9{Azu=}GX}vkBe}RdJYD+h51yv01m+_R+36pJlxN!JG(tlgeKaS9Dey z{j1p}j9V@iXW0Q*6NK^Rf(p~rM^ul^W-GCZ(|WbW4l=!&nKC+d83e7>YI(`r#FmG& zl9yZMRvaMvI7w=~49 zMn^6G13MbK(4=jgJha88!bE)*uI z89k*bsYh&rfV|w-fHftnOa`Td+VE8744#L~jHt9$Cv4sA2GU?23djc2ng(*MkBXYdFy7JrY$}Nn}9j20*&|m)M{uRDywvTfL zn{>l?oZ~PCL2o)5&w(4#bSo)IeBVL8j~xWNNX$+=veu~8ZcVPHxK4QOVNd$7DxNvb zes>}Eu@>`>Hid4(5WjJ?k7HBj4lU<40Ibnuij&s$sbI|{Snjf(LkbikS)JeeP<_Y4J(j6w{a&>n{xi({%K9OO%-fU{(TDCQVwp~7*kD0F& z;z?X9ryK*ps=K*=iC6{jy_5KdExc&6#_~7J@xu>4uq@Z@B1NN7V!e*_R%voj@uGB{ z%|#J?jyZ505hCwizU&6w5Mi5!i^UXcv26-IR-zaD)}^_8c_Se3_kbbRVc1h?c8`Un zQ&Z~8Si$09f;OgAw8d>?JJ73@}9%;IFO#)#Hwim_tn;Q130hYcc`Ds(e6Un(*uk*V>%~!Yl<5zy5#DF<_=vc0l$RF6gy*^c`M-a$K1H)#&&}C2{~!JuBBz+h{R3GQsrB0r*Vb^eK_&mYAOU+TgW4cGwa2OqCuhVlm@f4^_)W-z%ebK ziWHfO7DsVMoYGvr>6_yTb-~$fp>Tx=5M4HX@Z@mGv*6J;u@Iu*vIC566Y+6kR^Q?f zai(DQYJgYmqg2fo3+igE2st=T!Aj8?U}r@1k%9zTJYPH&KrX zI>+;(g#`d3e3%MC^(U(nTt4~oH`V)mg;(g3)$MMy?b@7+S;*qejcH+4ZEi{btgwsW ziClWAtYH0`2a5gP${S`?Z$52DDJ8ffoEiqYx}q4Dl{c_(+PZ%-760oO-r~A0=a>U> zXO5*PoWFkiiV@E5SX;q9y~@4B*HbR2vDgY@P`L%0jyzyPb%^nEBGD+PWNu>jZ#GRj zB{aYxW~~|^`aQD~y`u>{aLz_8Qu81X;hhVw(+wIjA7_O2ys8jlRf>vZ@fF}8R||Km z)$~fRQZ+=(xgPt15kliHq}-YP@B|8wadbijm|}(&8TOGK@JuD3`Qj;+4jaXLPG`;B*`vlv(>_VfEdZfwkkKRRx{VKI16k6;qjO4)=|x$L9d4;`-!p^M^AF; z4O@Y(Q-}+Z3&{aIY_B+9tL2)UGx6g+vP@2he$(-YtEJt+fj#{Eb0Fr#U^v7+IREhB z#r^&D%`IIgj>lxTWzoy6Me2o7v6}?^*2BZkMn|*a|LoN(q_B6B$vTSI5ipxyPTkX4 z{^Q?%Y^cy}wm7@xJe9unK-8AEcP|mQ0HHQ~Eq%tD4WuZIlV;V@6Pf=>98YgwxKib} zg^-j|9AqOQxo>l92T7GNBxqsU4W!tpRix3FCJTxU^G)1Q&XTS$Zhq=?e1x#;7xxZR zQhanPOA~}QmS+1y>zf$Dp!Z6rFk#1Dhzq(}ttD?o_V@Muy&;u-6lEk29O7taUb4=Y z`kN#!lp2FRHF>+E>DADQt(QoSDOQVP1-8KT?T)9|xwh*yz6d@7xGjlxrc^PY zO-w@y85sZyrLwzy4mU~4cC}jJ(|f}qo`zLH=fy1j_WkesgW+<$M(_hNxST$KzKQaZUCx|r^#&A>vUevX87w)lTD69FAhT3+)3yF;M~9Y9hT^RyT-~%k3<#N z4f?=ULFZ~b8TAKCd`;m?><)mKp17`gjU%S%0r?Cu99GEH)pRiEcZMS@yr)keaia3N zX9Wp$m%^g*5p-LffI1veWCPo2k(?F}%^Dn&>=;EcZszN&Db}GW1fC^q$_5Fx(;DJV zq4!t~33DqrkeiXF84$&b*KZmsQIkKX8$`nm)ao$IN;e%k7@1sAj>%C$o#j#+erYu8 zh{5UMcq#{87zJf=X2KiTqnhfQIAvZA_(HvKQcSq4=rflb{h%>@fs^ZQmitse-AvSs zS5Z)n^PJOWx`wIT+ISKw^rH{zkJ~QGIR_)F8W6F@3Y!8Nas1Aq z%_Gj`svJ^zzp-Q$(WH|d9H$_(x;DvDqp6COh=SA0y2JFY>ONeA(!8Qp*xEAD4(FmW zkzdTsrWf1-Q@=1_Q0Lc1SAOGRoS?4~`zMrNKr%?3jNIB4HWG}BaPfqjB6I)ZwX2*a`E-IQr!stH(4qDTf*-tJ#t zQPK-`LC`%M601MkYzy|8OLm9}DK3^P>VV}Y*1@sZTFF-hF2P#?RhamhtDfRn1uZTx z>@59PbXfR3pI3{y=1BVlK=hZ= zNi%Z0+$ptRMcBBf8kWY{#R{4~K2p?qG^&YrLeY9!>xIMdq(2%bH19nFszzZLhv9TK z!}|<-z0C$$?v^V={XxVtq^gMKh?l#~+GeWnU*0uZO~lgW{BgTl4$ZW7JY{bMJM=EX z*PmQpBO5wMzzw@Vs_f8Y({PTc>xDh%obNU(9P0RbMy2X~Z2VSM@8leDvauuTQ1cOT zD3oZZ<#A8pXzO@_9UPwmgwa)MPLiz1G>&kp9A(b<NHl zUJj(O`h(cXxebPR=3j^E9>TT%b?JV~K1cFD3;l zqJ`V+{{EzK68o%55R8p!psp-6jZ|EwGn<|Z+)xK(3w7`A%^MB3M%9y3LWkI^d(;*R z0>BQ-J5f}js2bFV2i zXNHaAIh>ll*J#(VU>SGK^UQBZYPV4OYN`Q|CMQICTr*SNq_(Ci88mcF0VF*?AX$X8 zP2@I!I2uAxsQ`Br-@KqNSkFl<2BMZm(a<5)v8XE)F`gl+qtTCZ;Sh@;t;$M07&Now zjFpM)4&TU{FY%T${4 z#^-M>rxkhA(;e3>i|?$^q$PJ1TeDZAdYFUb%;J!;AJ$kY-DFfRsgtrwHfx@@+Koms zb&_@!mCvO&TV9&Aei=AE!;5CAU|q>YSAC7=X0y+GF}eij>R;<_RQRAJaY>WkFeL+1 zHLYr0mz5Q_R1UR1j{8hk)G0J=Dc9jh4i#IcTMp13^dK!%WDWx^R^H$nX4&H50k8Vz z`|ktkTVLv570MPIW@a%0zj*oT9w{@@87xQK3+vU=I+reI&ytF^DYfY@0yENmhlzV4 z7Nlb;nH88gh`{*y)aiY4DMDKR>!5^*`Q^nWt7;Y2YH>>P4L^ms#Tn^lF43oYQ37?o zfEeXfcWcGv#Od#LIz2T_Hrk1*T8llfH8h(1UQKbxZ9D`&ym;{f|1uG|Ko~~Ste8Cv zd$robhYvsoHF?c9rQXKPj^<2y8gCrmuBIJOTQmEBfM$kb3LJLbPqL4((%zW{3p^OW zK~J;I)}rln0{&NGmw0|nXWX=29PwwHvVpC0Ty|@vDddGg+YkB(DE{4K8YRg6jz$4d z*x3?QsO6cRS%|;tCKXNf0oi?FNT99uH6Kh%@v8Dn+{pPo7T4 zh|t(Qm!Cf3YdX>j#5oMtO9UjKCB%t(qp^~VMBQN#zCaDShrRqnL5qC~Ks4JDl_RV!`4^N!2{!IK%DL?B<*IzyJ90 zuGd#z*(Z&4Oy4qJG+b>K8)VJf< z1gTTHusRz0AR;kmHCn)&3rwh!embaf;HxoFvo_G#L4a2Q(vkJ78YoS^Fx}g%U4BeX zN*%@P1lkz2$xcNw6CaD(jBMe|>OyxKG z{8g2nm>~muT0%vp47=DR9H~CqDh=izTm9E`MV*VnhMfxIf;gq&3*OVlYZnU+qvM#( zI<9(i^Lk#-=fL|2Ie+-`pB@4IZZId+#MdhknVU-4gdSyIJ z1Jrt`iVa^qr~+OVNEjgwhmtIoa%PY)(HZ&L$+`G66;v)r1D7t z;5gB8i4pF^GHl@=A)BN|qxE^h<>BEM>_KP8#YM$Fh|5pnDz})tAp}Md7>>ELG!T0l z42PO<2ADgW&!mV=wy@BjFqb}_Snm6W>4e~^Gn^1Z zN0AB!C#pzEZJp2osWYxM)8O>_`igq*LC?^LdCDUoQL2bF)w)T<=90~pw*{rRhvP|p zq`XHkU{epPw=VPEPN$RN$}-ka^Km?$9-ko%kFF{_9HHhk7emOUpS+Wxyi1bH=^i4u=~>IR$xjPo0ka zZdVfT4mRs(!wZq@6D+6O+Zj<*f4Et%o*qBpMx)PP(8DU-EuRj$AA_J9V5xZY7Um>~ z`&-0|Q~t$4CaOSi098}F9JlHAjO=vT1i{hL#VX$8l)Qca9$5`O%aOIASf6Uu9S#kS zX9d*Qb)Czzx_o@ZrJ+c<-^S-+uLIn4IZ@asXdCr z3rwu#(?{IYfL}FS&X$kk$JvvhPksF~-)*)^Xmi}Ke+O5b7+vNRZ*c$s002ovPDHLk FV1jTmgX literal 0 HcmV?d00001 diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index 88493eb1..c743add9 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -38,7 +38,7 @@ displayName="${mod_name}" #mandatory #displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional # A file animationName (in the root of the mod JAR) containing a logo for display -#logoFile="lib39_logo.png" #optional +logoFile="logo.png" #optional # A text field displayed in the mod UI credits="${mod_credits}" #optional @@ -89,14 +89,6 @@ versionRange="[${lib39_version},)" ordering="AFTER" side="BOTH" -[[dependencies.${mod_id}]] -modId="curios" -mandatory=true -# This version range declares a minimum of the current minecraft version up to but not including the next major version -versionRange="[${curios_version},)" -ordering="NONE" -side="BOTH" - [[dependencies.${mod_id}]] modId="playeranimator" mandatory=true