From 8d08fdedf467cca5aea70de60ab41c3b70479358 Mon Sep 17 00:00:00 2001 From: Motschen Date: Sun, 16 Oct 2022 15:53:03 +0200 Subject: [PATCH] MidnightControls 1.7.0 - Fixes & Controller Profiles - Fix diagonal movement speed (PR #113, thanks @dogtopus, closes #42) - Toggle Sprint and Toggle Sneak can now be enabled separately just for controllers (closes #102) - Added button binding profile support (closes #107) - Fix button binding tooltips intersecting with chat on large GUI scales (closes #106) - Add assets for non-licensed (numbered) PlayStation controllers (closes #110) - Fix reacharound outline color - Fix pixel error in legacy icons (closes #84) - Fix creative flight being slow with Bedrockify installed (just disables the "disableFlyingMomentum" option on launch) --- build.gradle | 1 + gradle.properties | 3 +- .../client/ControllerType.java | 3 +- .../client/MidnightControlsConfig.java | 10 ++++-- .../client/compat/BedrockifyCompat.java | 34 ++++++++++++++++++ .../client/compat/MidnightControlsCompat.java | 4 +++ .../client/controller/ButtonBinding.java | 3 +- .../client/controller/InputHandlers.java | 20 +++++++++++ .../client/controller/MovementHandler.java | 2 +- .../gui/MidnightControlsSettingsScreen.java | 10 ++++++ .../assets/midnightcontrols/lang/de_de.json | 1 + .../assets/midnightcontrols/lang/en_us.json | 22 ++++++++++++ .../textures/gui/controller_axis.png | Bin 1065 -> 1127 bytes .../textures/gui/controller_buttons.png | Bin 3777 -> 3970 bytes .../textures/gui/controller_expanded.png | Bin 416 -> 479 bytes .../textures/gui/controller_axis.png | Bin 1215 -> 1274 bytes .../textures/gui/controller_buttons.png | Bin 4398 -> 4553 bytes .../textures/gui/controller_axis.png | Bin 2605 -> 1593 bytes .../textures/gui/controller_buttons.png | Bin 4207 -> 4354 bytes 19 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/BedrockifyCompat.java diff --git a/build.gradle b/build.gradle index 7c95d58..a347986 100644 --- a/build.gradle +++ b/build.gradle @@ -118,6 +118,7 @@ dependencies { modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}" modImplementation "dev.isxander:yet-another-config-lib:${project.yacl_version}" modImplementation "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}" + modImplementation "maven.modrinth:bedrockify:${project.bedrockify_version}" // Required for Inventory Tabs modApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") { exclude(group: "net.fabricmc.fabric-api") diff --git a/gradle.properties b/gradle.properties index cdab2cd..cae7193 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.19.2+build.9 loader_version=0.14.9 # Mod Properties -mod_version = 1.6.1-dev +mod_version = 1.7.0 maven_group = eu.midnightdust archives_base_name = midnightcontrols modrinth_id=bXX9h73M @@ -27,6 +27,7 @@ libgui_version=6.0.0+1.19 inventorytabs_version=inventorytabs-0.9.beta-1.19.x clothconfig_version=7.0.72 yacl_version=0.1.2 +bedrockify_version=1.5+mc1.19.1-2 # Ok Zoomer and LibZoomer are temporarily disabled for the time being, as we are currently using Reflection at runtime instead in OkZoomerCompat due to there being two major, completely incompatible API versions. # ok_zoomer_version=5.0.0-beta.3+1.17.1 diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java index 20aecd0..ed86533 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java @@ -32,7 +32,8 @@ public enum ControllerType implements Nameable { XBOX(5), STEAM_DECK(6), STEAM_CONTROLLER(7), - OUYA(8); + OUYA(8), + NUMBERED(9); private final int id; private final Text text; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index 35faa03..5048d75 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -17,6 +17,7 @@ import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; +import net.minecraft.client.MinecraftClient; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; @@ -42,6 +43,8 @@ public class MidnightControlsConfig extends MidnightConfig { // Gameplay @Entry(name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true; @Entry(name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true; + @Entry(name = "midnightcontrols.menu.controller_toggle_sneak") public static boolean controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue(); + @Entry(name = "midnightcontrols.menu.controller_toggle_sprint") public static boolean controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue(); @Entry(name = "midnightcontrols.menu.fast_block_placing") public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. @Entry(name = "midnightcontrols.menu.fly_drifting") public static boolean flyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. It can also conflict with some other mods. @Entry(name = "midnightcontrols.menu.fly_drifting_vertical") public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. @@ -66,7 +69,8 @@ public class MidnightControlsConfig extends MidnightConfig { @Entry(name = "Mouse screens") public static List mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen", - "hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen"); + "hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen", + "me.shedaniel.clothconfig2.gui.ClothConfigScreen"); @Entry(name = "Keybindings") public static Map BINDING = new HashMap<>(); private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?"); @@ -298,6 +302,8 @@ public class MidnightControlsConfig extends MidnightConfig { hudSide = HudSide.LEFT; analogMovement = true; doubleTapToSprint = true; + controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue(); + controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue(); fastBlockPlacing = false; flyDrifting = true; verticalFlyDrifting = true; @@ -319,7 +325,7 @@ public class MidnightControlsConfig extends MidnightConfig { controllerID = 0; secondControllerID = -1; controllerType = ControllerType.DEFAULT; - mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen"); + mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen", "me.shedaniel.clothconfig2.gui.ClothConfigScreen"); BINDING = new HashMap<>(); maxAnalogValues = new double[]{1, 1, 1, 1}; triggerFix = true; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/BedrockifyCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/BedrockifyCompat.java new file mode 100644 index 0000000..1f8bba9 --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/BedrockifyCompat.java @@ -0,0 +1,34 @@ +/* + * Copyright © 2022 Motschen + * + * This file is part of midnightcontrols. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package eu.midnightdust.midnightcontrols.client.compat; + +import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; +import me.juancarloscp52.bedrockify.client.BedrockifyClient; +import me.juancarloscp52.bedrockify.client.BedrockifyClientSettings; +import net.minecraft.client.gui.screen.Screen; +import org.aperlambda.lambdacommon.utils.LambdaReflection; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +/** + * Represents HQM compatibility handler. + * + * @author Motschen + * @version 1.7.0 + * @since 1.7.0 + */ +public class BedrockifyCompat implements CompatHandler { + + @Override + public void handle(@NotNull MidnightControlsClient mod) { + BedrockifyClient.getInstance().settings.disableFlyingMomentum = false; + } +} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java index 5b8883b..0a28703 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java @@ -53,6 +53,10 @@ public class MidnightControlsCompat { mod.log("Adding HQM compatibility..."); HANDLERS.add(new HQMCompat()); } + if (FabricLoader.getInstance().isModLoaded("bedrockify")) { + mod.log("Adding Bedrockify compatibility..."); + HANDLERS.add(new BedrockifyCompat()); + } HANDLERS.forEach(handler -> handler.handle(mod)); InputManager.loadButtonBindings(); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java index 17ecacd..240dfc4 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java @@ -88,7 +88,8 @@ public class ButtonBinding { .action(InputHandlers.handleInventorySlotPad(0)).onlyInInventory().cooldown().register(); public static final ButtonBinding SNEAK = new Builder("sneak").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_THUMB) .actions(InputHandlers::handleToggleSneak).onlyInGame().cooldown().register(); - public static final ButtonBinding SPRINT = new Builder("sprint").buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB).onlyInGame().register(); + public static final ButtonBinding SPRINT = new Builder("sprint").buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB) + .actions(InputHandlers::handleToggleSprint).onlyInGame().register(); public static final ButtonBinding SWAP_HANDS = new Builder("swap_hands").buttons(GLFW_GAMEPAD_BUTTON_X).onlyInGame().cooldown().register(); public static final ButtonBinding TAB_LEFT = new Builder("tab_back").buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER) .action(InputHandlers.handleHotbar(false)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements).or((client, binding) -> client.currentScreen != null && client.currentScreen.getClass().toString().contains("sodium"))).cooldown().register(); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java index 51ab043..4c830c6 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -11,6 +11,7 @@ package eu.midnightdust.midnightcontrols.client.controller; import eu.midnightdust.midnightcontrols.client.ButtonState; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; +import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.MidnightInput; import eu.midnightdust.midnightcontrols.client.compat.InventoryTabsCompat; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; @@ -254,9 +255,28 @@ public class InputHandlers { boolean sneakToggled = client.options.getSneakToggled().getValue(); if (client.player.getAbilities().flying && sneakToggled) client.options.getSneakToggled().setValue(false); + else if (MidnightControlsConfig.controllerToggleSneak != sneakToggled) + client.options.getSneakToggled().setValue(!sneakToggled); binding.setPressed(button.pressed); if (client.player.getAbilities().flying && sneakToggled) client.options.getSneakToggled().setValue(true); + else if (MidnightControlsConfig.controllerToggleSneak != sneakToggled) + client.options.getSneakToggled().setValue(sneakToggled); + }); + return true; + } + public static boolean handleToggleSprint(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) { + button.asKeyBinding().ifPresent(binding -> { + boolean sprintToggled = client.options.getSprintToggled().getValue(); + if (client.player.getAbilities().flying && sprintToggled) + client.options.getSprintToggled().setValue(false); + else if (MidnightControlsConfig.controllerToggleSneak != sprintToggled) + client.options.getSprintToggled().setValue(!sprintToggled); + binding.setPressed(button.pressed); + if (client.player.getAbilities().flying && sprintToggled) + client.options.getSprintToggled().setValue(true); + else if (MidnightControlsConfig.controllerToggleSneak != sprintToggled) + client.options.getSprintToggled().setValue(sprintToggled); }); return true; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/MovementHandler.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/MovementHandler.java index 5683d67..b7d45dd 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/MovementHandler.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/MovementHandler.java @@ -62,7 +62,7 @@ public final class MovementHandler implements PressAction { player.input.pressingLeft = this.pressingLeft; player.input.pressingRight = this.pressingRight; - // Do a implicit square here + // Do an implicit square here movementR = this.slowdownFactor * (Math.pow(this.movementSideways, 2) + Math.pow(this.movementForward, 2)); movementR = MathHelper.clamp(movementR, 0.f, 1.f); movementTheta = Math.atan2(this.movementForward, this.movementSideways); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java index a455dda..2497bc8 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -63,6 +63,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { private final SpruceOption analogMovementOption; private final SpruceOption doubleTapToSprintOption; private final SpruceOption autoJumpOption; + private final SpruceOption controllerToggleSneakOption; + private final SpruceOption controllerToggleSprintOption; private final SpruceOption fastBlockPlacingOption; private final SpruceOption frontBlockPlacingOption; private final SpruceOption verticalReacharoundOption; @@ -199,6 +201,12 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { () -> this.client.options.getAutoJump().getValue(), newValue -> this.client.options.getAutoJump().setValue(newValue), null); + this.controllerToggleSneakOption = new SpruceToggleBooleanOption("midnightcontrols.menu.controller_toggle_sneak", + () -> MidnightControlsConfig.controllerToggleSneak, value -> MidnightControlsConfig.controllerToggleSneak = value, + null); + this.controllerToggleSprintOption = new SpruceToggleBooleanOption("midnightcontrols.menu.controller_toggle_sprint", + () -> MidnightControlsConfig.controllerToggleSprint, value -> MidnightControlsConfig.controllerToggleSprint = value, + null); this.fastBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fast_block_placing", () -> MidnightControlsConfig.fastBlockPlacing, value -> MidnightControlsConfig.fastBlockPlacing = value, Text.translatable("midnightcontrols.tooltip.fast_block_placing")); this.frontBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.horizontal", () -> MidnightControlsConfig.horizontalReacharound, @@ -329,6 +337,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { list.setBackground(new MidnightControlsBackground(130)); list.addSingleOptionEntry(this.analogMovementOption); list.addSingleOptionEntry(this.doubleTapToSprintOption); + list.addSingleOptionEntry(this.controllerToggleSneakOption); + list.addSingleOptionEntry(this.controllerToggleSprintOption); if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.fastBlockPlacingOption); if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.frontBlockPlacingOption); if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.verticalReacharoundOption); diff --git a/src/main/resources/assets/midnightcontrols/lang/de_de.json b/src/main/resources/assets/midnightcontrols/lang/de_de.json index 0abd3e8..603b487 100644 --- a/src/main/resources/assets/midnightcontrols/lang/de_de.json +++ b/src/main/resources/assets/midnightcontrols/lang/de_de.json @@ -77,6 +77,7 @@ "midnightcontrols.controller.mappings.error.write": "Fehler beim Schreiben der Controller Mappings.", "midnightcontrols.controller.mappings.updated": "Mappings aktualisiert!", "midnightcontrols.controller_type.default": "Standard", + "midnightcontrols.controller_type.numbered": "Nummerierter Controller", "midnightcontrols.controls_mode.default": "Tastatur/Maus", "midnightcontrols.controls_mode.controller": "Controller", "midnightcontrols.controls_mode.touchscreen": "Touchscreen (In Arbeit)", diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index 2f09330..15f998e 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -1,5 +1,24 @@ { "midnightcontrols.midnightconfig.title": "MidnightControls Advanced Config", + "midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_LIGHT": "Default Light", + "midnightcontrols.midnightconfig.enum.VirtualMouseSkin.DEFAULT_DARK": "Default Dark", + "midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_LIGHT": "Second Light", + "midnightcontrols.midnightconfig.enum.VirtualMouseSkin.SECOND_DARK": "Second Dark", + "midnightcontrols.midnightconfig.enum.ControllerType.DEFAULT": "Default", + "midnightcontrols.midnightconfig.enum.ControllerType.DUALSHOCK": "DualShock", + "midnightcontrols.midnightconfig.enum.ControllerType.DUALSENSE": "DualSense", + "midnightcontrols.midnightconfig.enum.ControllerType.SWITCH": "Switch/Wii Controller", + "midnightcontrols.midnightconfig.enum.ControllerType.XBOX": "Xbox One/Series Controller", + "midnightcontrols.midnightconfig.enum.ControllerType.XBOX_360": "Xbox 360 Controller", + "midnightcontrols.midnightconfig.enum.ControllerType.STEAM_CONTROLLER": "Steam Controller", + "midnightcontrols.midnightconfig.enum.ControllerType.STEAM_DECK": "Steam Deck", + "midnightcontrols.midnightconfig.enum.ControllerType.OUYA": "OUYA Controller", + "midnightcontrols.midnightconfig.enum.ControllerType.NUMBERED": "Numbered Controller", + "midnightcontrols.midnightconfig.enum.ControlsMode.DEFAULT": "Keyboard/Mouse", + "midnightcontrols.midnightconfig.enum.ControlsMode.CONTROLLER": "Controller", + "midnightcontrols.midnightconfig.enum.ControlsMode.TOUCHSCREEN": "Touchscreen (WIP)", + "midnightcontrols.midnightconfig.enum.HudSide.LEFT": "Left", + "midnightcontrols.midnightconfig.enum.HudSide.RIGHT": "Right", "key.midnightcontrols.look_down": "Look down", "key.midnightcontrols.look_left": "Look left", "key.midnightcontrols.look_right": "Look right", @@ -99,6 +118,7 @@ "midnightcontrols.controller_type.steam_controller": "Steam Controller", "midnightcontrols.controller_type.steam_deck": "Steam Deck", "midnightcontrols.controller_type.ouya": "OUYA Controller", + "midnightcontrols.controller_type.numbered": "Numbered Controller", "midnightcontrols.controls_mode.default": "Keyboard/Mouse", "midnightcontrols.controls_mode.controller": "Controller", "midnightcontrols.controls_mode.touchscreen": "Touchscreen (WIP)", @@ -108,6 +128,8 @@ "midnightcontrols.menu.auto_switch_mode": "Auto Switch Mode", "midnightcontrols.menu.controller": "Controller", "midnightcontrols.menu.controller2": "Second Controller", + "midnightcontrols.menu.controller_toggle_sneak": "Toggle Sneak on Controller", + "midnightcontrols.menu.controller_toggle_sprint": "Toggle Sprint on Controller", "midnightcontrols.menu.controller_type": "Controller Type", "midnightcontrols.menu.controls_mode": "Mode", "midnightcontrols.menu.double_tap_to_sprint": "Double-Tap to Sprint", diff --git a/src/main/resources/assets/midnightcontrols/textures/gui/controller_axis.png b/src/main/resources/assets/midnightcontrols/textures/gui/controller_axis.png index e0b4c07e40e95eb4d6900c82264fcb3c622528df..607ac557322599baa8c7e6c605133c21afe18484 100644 GIT binary patch literal 1127 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58CaNs)Vi3hp+Jfy-O<;Pfnj4m_n$;okZf^~ zyA#8@b22Z19L@rd$YKTtZeb8+WSBKa0w^dH;1lBNUf^S6W2399o0pfjWy_Y7l$29O z3{fEcB|(0{3=Yq3q%klsU-Wcw45_&Fc4q9PRR#jB7q#wj9^Jzo?I1qk5^F}}&HrI} zR`$M5$6v=Bs*ry+M|^I+&Mw==f}B}u7ft5QikT!6@_E{y%}z5tSN;o8JD%Bfb;^46 zlWDR}GZ))Vde!~JLd&%Di@s9q#GLi_+l`d>t_tqlVV>+BUp~w2*P%%{)4Ec3%uzVU zd3E)Jvo}Oelrbk+R-ZXo`>`iOX=BXwiu_$nE29|0D>4`Gw|4Tlx(P`s6oJ z0bUCumPMD@LT)u&lf1dRaS?Nuy|8S+ohNp@cUqX&OMl?|kpAjiW35Pew6PCp_jdpAJ1QK1HGC>Sv?WC7T%UeXsDI*z(*;g* zb5=EdICuW3%FTy)Gwy_4Q@Qthn)Ec4uanHfJSRne^A5Uvu=>;73qiX@JX}bJ`z-_| zi|f7XR0La%(&p)ZH_Ggd)a_Ea-OHbP>*lKHCLJ*D!}>l%H*@6R57 z>Nn&Eh1z}2WJx{sj^dk5@!C;Lpq#4Ug2yGagvZf9vS` z=)mQ@vx=DSG3IT0B-7E_Yd!bfyg9*1@%iD^>&ovm6!NkJJ#X0Cmn<3Ox0~7P(ymss ztV{*vQa%%{X+JmR^SsS#+H&RM(G_jeHI>h;on=~(n&G{%N~F_po7CIti?f+l?i80O ze;;WU>KMhe<)%wMS4#Wt#G>fP$rbOjo6S`}&2$mj^HclhO_wioFEmMB{3bb3%vkB~ zOv#DggcW~HEY+Ggu})}Rn#-E&AY2o2slY~p-C)J1PY!>ic zZ)K_Py~=IjJeA$0U8(0>T!N?0Nney&^8d++2-V-O{WqR@WA`#t`Cor!$@JYin|CL8 zmURb7>Zx~>H>q{qI}_Xb##~{lwQywpL)O5)B}K{NdnC1&WU|&g+}fxqR(8b7NOnGovadwf%ru#o4mR*l}9X<66|61RP^(r^x|0_?c z+~HrlUhx0%%g^PL=e=uEy}4g_nNf_N!26bcfnT284D~oXSN`;usQACF;!hrVXqlHC zoW0R$R@edYIO!i9t+G3bSliyc&(=Nfzz;U1%;ElOI~c-lkc|V zNRNlCsdCUX4^d;K)V0b#dph!|_*T@oES|&sYJp^6iNb6_SN4jK$ubYrZZhV5@-<$x#piX8hVErW<3$D5 zo|AlA7BRDC7AMrc`q?PdGXGbN+m=bpX)a!8IE~${cw#3jUXz?yx8Ev;wV4}?GLJFh?`PX|8Cin^WF((C{L diff --git a/src/main/resources/assets/midnightcontrols/textures/gui/controller_buttons.png b/src/main/resources/assets/midnightcontrols/textures/gui/controller_buttons.png index 0a6f3cecdf5275f1d738df49dcd45f4a31cb1eae..4b6a3759127f0d242cc814c121f75af603226db7 100644 GIT binary patch delta 3694 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 M2uVdwM6N<$f~YjB9smFU delta 3520 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 literal 416 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58CaNs)Vi3hp+Jg1z$e7jy})P7mMu>=?^u+Dsl{SH~;rh z_o08rgDNnzV#uIRku}@aR^pv5) z6ro_Y6@`2O$M~*TlqXzb_-W~IC7Ipp>~V(L{AV(bf8-bJuaG%7hp|YK`H4;6gVY91 zcY}2gKU@8aJG`|wyW%H<{C~bZzlF9%#vdyG-(>POo}tS_P*cfuNr%WpB_;?JEnD*P@|>KUjv30wfQ%~%@(X5gcy=QVXjQ1Ei(^Q|t+%tz=1Ccfw9ZvHGEGuR zDRpY*FNO($OLBsrGEP_(sOD|9=A@ESigfQ0ZkLQ{Ym`1t*=jql`+vp?-n&ocoLwRx z`tIqC^(XI`qgvi-{^J6BCp^|hVO@;YYf%Ox?)`Y-P+ z%dFG2J2gpV=eJ28ewnX2V^LjGbHdHe=-iIH%9)>4&L7wOJTW0PcjoPGm7N~$a+f^y z<>W6ruG+IRRZb|+VbQ6QP3?)3Z0^iR(c<{;SaWD@-kzP`CVXIHTUDSgdOp6n%|}#{ z>yY%UPkqO(`+QDIoAg0cV#T2+4JyvAOPC+eU)0#6U%FeP$%j|yV#8a9ZPy#8%*v7V zSb6fXg+Z~5gcM)Eu%?(iY1>eN57w>e5dW!)}+bb z-rbIk(CeIDy>XYz?oHn(b@1_VNVm64yRpsV*T#u@dV=Y+nga_a8U=vuyW z{ueRs(6?E)uM~T3I2STA?%>xas(Y_5iuiKWJ^c3DZSPede$@}18U9h{nVnL7#lzHd z+q#e5Zu{x6VcjjGkaLQcIv-^&-cy+f4CDi0Qy=c%JSF~)!c>J-GUdBIE_<)|khf;l zq1|kDp^1)Ojup;-&L54QpLuVMkI+6QKjukOxz?4xRL?_LkS_rqh)o$jlu zr)KYmg}vCB4g=*wJsieLNDRMO9lKb6Pnu&SSo+i6XU2S%)vr|+tuq(&J>vc}YwN5E z&x*hI%l;L1*1UdSG4q|)`S;q-ln-jnbqRUr=`!`xv%X4?9gN!6f|4%&E_YrYo88&o zV*VlTIiqJy<%7B;b*0{x^#^v(?NIrssngI9C?O2tpqGa{` zg-0Rh-0CzXBac6^8>~ZQoz(Zw>`-&}a{;Bl|C2jF-e2zP(%!=R#~#_s&_Ga8A_x~v kR#W0=Qow~?M8D!cyS@31+3`Q;fTazCr>mdKI;Vst01|pB)Bpeg delta 1134 zcmeyxxu0`_O1)x$Pl#(61H=FS|F>+}Qc+QnmzS54lH%#<>Ez^OV`HPMtINQ^;P~8n z6_8>q3GxeOaCmkjje&v1$J50zq~g}wS%&$K3?$lg6_-rw?X|pVwQxslUha*FTv_#w zNB=fx^(1Qe&Y0o1(=T+lL*3JpeV-GLKRb2v%d~y(CtaRAxqe^&^}fHaf+a79T+cr< z#aFL>v;RqZ@2M+SzxsOCm#uW|s!-S9^J@2Yg`~2jMoyDfmwa=2)4i_n&_I!B^^fcS zuR8T+)$!x5U!N)MUbSk~-)S39FIrcwS}d3!nmhCFE{$tXXE*bl`uaF|r{+}i>Sqf7 z*hE&HSrE0RE9qm_q=^d6S@nwdM53=%Y%Ue}&t|sj!vc}>^Jlm9h(vO3iWgs;6#H(Q z&*!uZq5q;cRvdcLprY-%gn4)TqQjuuOY>UrBH`(~V<%*@7F{NTe?_si_5 zg1=s6&g9v|RrH|X-NlJX!dBli&fiw~qh}$rN^Ife`TMG7&v|HeW!+T0%=h~ax28@m zxGBEccZ>FK4bB%2S~e7VWpKuFOecpIUUbFzg+%gQNnzo`-h6pIb3bd(ndB=?{;|H{YJ*Cr(#CrSg7Ovmc#Gb#&EeB|`F{(a&dQU< zCIzP_cYN-Ac3^Fd-yL2PzJSS$)eCfOgyZ7;r6;{eIaVq1`StHPQZr7ni2wsiX|d7v zIiE{jDb#*^GWpGg2FF7(3HrG+pMROQeDWQ~Un?^*Hl=LwVVjue);gzUQ;$W^rIJq% zR5nkEU;gM$_TIt?6Lu^3st5lK*y>R~ZP}+M`9LA#J8ieNUQ&H~_j>rf9UeR0bYE3F zHGBW020lLy>E)9rFpJgiGZFl1@q0>5s?sY}!SuXGYv)bvs5<9jBDQ{#M%OXFNAdsN z&HvwUsrxFQe5@)kcK`7+u6w3NbZS^m>PUKemc3Y@o_SH8l2OOJjzxyqdn7?Y6@J%7 zp;McGPyg;t59NQ_1y_AtChZWqSbfLWMT#?H!E1-2D~&s5cSs3MW9O-7Z=1%feYi1C zDa#{5Zi056ijrqc=ZjjPT3*iLhHo~x>a#D*d#|>rjYUoA*Q=M!n>cE}-gOa~uPk_R zr@MQX?~6Oe!V?`2y>B|aFiX(t=UEpMyJDqFz;yJ}zVpPsh}=(GJ6}xM(70duP!ET( y(wPne1j9+mNy!I9AmFb{E-a1$gwXwZf}oxOH1>Hrzv&c@X-LY-XKti$1N=_AS!g=oH%muZsz9Z|CpixtGz6$D1?sK z|KO@4S~DsD0004WQchC4S*E$7X`rjk)8tI z(33y}GzQ;yYXx}IlX?VO0UMLn1V09R>AEjp(vuqn{{%jK_&$>!20jaW)Bs2^e^CIe zAFq>V1~CGDf3unfB?AFNlfVff5yyM(=l`bij^SG>Um3op^5B#52`~u#`*%?Q`2WO{ zDhhiB8}bJQzPXdD3L+Kl&!2CT0D=8Kuaf|`T7YlBK0Lo^li~^@0S%J{3s?;!c7jm= z8U?HXU#$QSlWGem0S}Xs3pf@Jpf7>YyLU)m0->*8k-h{%4-ZKH!IR(%CHmM` zR8ZvRr5C3NYrPSk&KVT9bX;+s4!bI)!yBTdJ)REB`U*?5WW?cqu1xrJSk`Yhz=*@c zWV)xrs{X>z?3i)bnoaX`SXHPS;Kbo_oKE$0*jWKi91g93)J}&>`!aXpu%1l#bXe~K z!8m`ccY%~ohb_^P7l#ooAzI>enA73J|&X=Vpuk#nY!!gETx5CFJ zS%``6{J-lR-Z%~mI}RIZ@K-(#2h*Tmp?nw)cOYW#@Krqx4<%k?9(bt%h5V})a~~S} zq<45_9A5GcUxf-pL)=jf&_mULP#g{{0F{4+!;_!)4vVmNSUl++_8M@}*Fc~F;&!`< zi3SwvbwFqd#Oxh@ZUvZWFth@S*%c6{ceuX?41w2Zz<3V`#^ERK0pEP_&agf>%gIV0}$Q?lZ?ZDmCl!?S3d^tH4c9)3+y)z|7(9% z%=gFAc!%*0;~n18JAA+2XT8I%Jv^u89Tv0R;m$g0iFO|S zjA1LqvwCEO$TT|?hP%LdfC{%p1ZN3C3UEvWOU-%~4BRo#_eW%MZMs+Fs* f{LIoou3_j8*b~P01fyO600000NkvXXu0mjfTE+>X delta 957 zcmV;u148`CBd#Kld4Hjxo^Eb#+}zw16&29X&{b4Ylai3~rZzM_h-74B;1Cuzv@*>T z94(eSOG`^Bb>HyO0JPp9^M08I@NVYj=Kq+Y0IR($swjkx*exwB z|KO^#bDOFF0004WQchCK0Lo_li~^@0Tq)43s?<3c7jm= z8U?HXU#tN4lWGem0e6#<3pf^cpf7>YyLU)m0--NokiG;$_xDKu-jm=9CL}2pLRv&eQu4XnWf^dY@9Mrhtp9?rxk;ij(9rk>NB%JOHmviuQe5)4!ip24T$3K zbg|ykVPC(A#_Ys#cy_hU(_vp>Xh0H&oBQQjPluBgki=nW1=Myr+|0k`NgNIrD?S|# zyMTWfhr=#V^Xc$x&{7tM8MMTpB~FJq9j-hM=S8eJ06ttC&dN{TEWP+W|6uNLiE%is z@U}@ByYQa>wR4BR9Ea^Z4o7M5*F6r4X)v$QJq*hoD0uGh#Xk*CC7xX#_^1KK{Z-AQ z7maN>clgCP{A}*<#ri-r#U0;(@XD1u2kaS#pU)j0 zcY!hRPB+02hi~LKys!&c>DssF4(}6(vkshwUjXD?u*x``SDCz7`sK&qqsHOQvcL*) zike*MKI}?;6mD`qgX$$!O(%XhE;1{%o{z*Y!jBouWsreXbnSu&vAoOd)k|@00000NkvXXu0mjfQkKLB diff --git a/src/main/resources/resourcepacks/legacy/assets/midnightcontrols/textures/gui/controller_axis.png b/src/main/resources/resourcepacks/legacy/assets/midnightcontrols/textures/gui/controller_axis.png index fccf05b888ac0a41d5bd553cde6ef728b00598d9..bc1ba2b4532552ae1e46f06a7ae4e6b51ea62ee3 100644 GIT binary patch delta 1537 zcma)+dpOez7{_->TDi?!>X;qrmywo{BQ2NVhb@~7sdSq{bPS=Iq#vP1%KS)E?m6sG zlC29mNewAIO_m(j4s+?|vdX<2r}Lbr{ygtrpXdGK`^WcrKks#|Y85_S2~n}<*7kHO zgLFU}TIs>?c6JSCkVqsO8yf@y!R2!O{rwjf7Q|w)Fr+ehafOWXboW9~hdKfg2&G&) z=-|!m{E)LHY=EMXH0bK-cI>Zq9e(dpWbM(_rD~}{b+*$Vd`Ad!PQk-=S~+gZk)xxG zg9GOZHd0g$1!@P2S}?08vwx-qI!|Uo^TSe$BIEWs@~&lmvJ?k(dQ^+JrO4jvrW)K( zXbf(E06GDfnEjO$$wd~YED2i{^d6!O1x#j2mg@#oKYipMm~~)ZR)CICtNAMn(O1Uc23lZw)%x2C zS2!dA*awvc_$WjzPGIaV&fuUo>}V|BYJ`YdJ$`0<$q)@mQVq& ztmas8MXLN_ZI6dm@wqx#awcq7`0n-H0p^E{Y3;ZrTG4Hg{H>8k4Q9^`LN+D70KHcK zAl}%dIapIzA3w2Vsq%%s1= zqQ{o+8^jDI#mJ44)4L8OY??zrbYJA!5S;a4Kf3(*8wn@8d!l55KEIrbO2Pk9U5#0` zDZcC38ZV+o6jf^8h;*R4XHd~D=zh!`3>fAj&$s^>tI zUgr`Ucqp#tv$!x$T2UIHpdCPYPYH_+3Tw{ZGLP2ncoKGQokrO_a2E1E9XcYu=z8Ep zK4&NG1zOKkvos(L&Q!@;c=?{_ziwVSjVaQBTZKti4&#>jIpAkxrbR0fxFvhYjG6i zpuCRKXzjs*+W=`CdH|!MCN&SPL!Y<%-6AsjNMdlqZ{4djtxLC5CNl5fd(K!P(~38< zkK1yL4aDz)vu$7j;-&366Pj?;kHhFyx(zA1ik2s?vu|FVU7$zd45kZu59#T^pB^-( zNP_>o3am{SmM_*YZ;zdBK76X`a{jd;V)@K>T$mx2FX-Y}b*durOm1>e+tIxQpw1F| z)G?=XJy>)QjcW}o*1AK+-tuCA`V6q=F(|7CWlVEy>?81#tp%i>!#1Qa$ykm7(%Eq_ zN2ZQTcPeo=7@^KtV^skTVO(?M!8aF-1ibrxhO>lho;w+vTO#051iYGbPRGA-9JXO+ zDgz`jzz_Sauq>96!VQl~KOi*IHHH5_v*16EjARzjyVaDZ7aur+?(7a$II>Uw E4MtnM4gdfE delta 2557 zcmYk8dpHw}7stn@x#TwYSd6($T3UrM#+uwREN$-BC1Nf$cNvD*TNuk-G`G}C(kN1R ze@TgQE9EY^z&x363p4ncf_ zwpA}{-SXhFA#c#fT!l3H*Y&S=te7ntFvQQiD1A2tz22Z0B#Mwg6r9naBe4+6f~E#s zwyGm(FqF!dM}eGpJ`MIh(j}&nlATJjU(&{AQwkOJPaoLoy_gbO#9M|aLt-_&5wj!> zE2r#;-D&_A)Fqaq$gcAg(m=2?+$NJ!uFkFlcue!M5q!KLy=gZFBqGmi5fMDW(9Vs4 zWx_*==irV-1EqU5bc#wN+c67T7NEn>M5P=*v*C#;H>t21q=;(x^=FUV!13Gh!?eNe zrYQ}F6py`3s`UzWOTDT0C~456iZDO**kD+Ds4L~QinYRqRdHam6fM+U*&Iz_;fF*PTA^gov)+O!Q2vxQZBK z2_mN@^aYSk2%PUQgoCYP6tDX+b^YHyzw4F2y=Yf^LZVFBOThw`>v0~&+^>1Q4q;>q zsJSriezoR;Hq6w_b&n0`?ooAx;H9Z?)g`Y-any9hbHd-9>ql3lFRgAp7<>T&?_-ai0AzX8ngtd&OXZK~YO}BfV2f0L{w}13MLDm?1{;an; z)?u|W%NE57z!t9MjOhvu6yLKG7vD40HV+}9l`eFeeU|G=WS@I!K%B`~gOt?5drU-{ zZZ20DEa!hWguRNVd-8J>#MWKp8{h~1+aZsdA$pREHR#BLtac{)M&Nb4NR6Z?9FC}xJ#XLD$`+2l0#2JCf?ES zBXJI8SW0?|);6m6%BC-*h`BfB2B^?a|2f+R%P1dW@fj64Uml_E4<>Cn*+rzvTpDLh zxh*xAl^baZ&}zxQr@J!vcOnIQ%5x(*SYPBHVU$V=l7+J>wjZ?9x|=<5+0=c?V6FL3 zew|48g;AF6`S-~iSKA;buXluk;@(zuzW+8Mc6f9saF8c5xjwax9yL=s}Vu3{g8;6E4S*Y01@4h}`XY zfB!MMPp~)BlA8un@NGBcei~u@;nuql1vziyLyN-}J^)(tLTMd(2_4lmFh_k-mg~bK zDIjt+>8T^cNa&NYLT}rn*Hvw@>w%Igb*L~h46I*>;b7MI4P5l>4a|aFSy}_{SreHW z^uUQLpYIH?76*D+alqpFGNX59X2|)|dAA0hsh`kqRWz#oSL$de`0l=x!V}f$w27Xa z4+W}|4@(H0;?S7I?o92)#yX1MBC>_6sh~a_Qup)LtM5M~{I34^VjfI&6{Y=rgYUFf zo}N_NML~BCg?T^_#d+q97W6Vqp}Bt+c7Y5*$dJu^RQqnEzbv*Xb6|OyGE*fb`~sDK zufadNuv0$w2rd-I%_ZeJPF2qEJSWd2%m+!7Z6Xagxx|wQw37q}gevc95Pd3_Y@lU= zZ5Eb{IiFX%D-}u5AKXkt$#2d-)d_(1SdJYTiib?xb*DQu954_d;cBT01$QwHg@S=`Zq_ZKXZ?(4xJfusHizaYCD^`lwZqce@LX8&0*11VZFU z9-nRm92TvS{xvD< zA>L|NKr>ep{XwR{g@ys$HvOWa_F0m6H~ zhz5PkE$JIWtb|N_Lfej_J&L#@A9U^)^BPFIKj3*JGJ?2|o*<@8ZVvxTOW(&G86N(H zdvB~BF)i$&yyF|zSjgxMnxgeZFAyx3j4EzUSB>X3YRhl!Q%Z0DC*L5!S>$Hy)-d@b zI3k@Iri*mkOOKLfPpg;-SS=r}o`2?Eh+}GGpWa|TLk+1rNS+^p!)M{5{qflG7 z@A)@EWI9lW{x<$+5%9gmLLBwmHlo&hRZ2d1p|xl&ABdcm&i&T$FKC`koYrOK8*yZ2_KIKvDa z?VDill5mp7-YF#BDNhrRt(n4|v>m%N)!KbUspX1?ON#z<`|mCjSW{%u-1i(Q&Q92q zRXc{r5c`+ny&vX6C841;73k$o9^mXOd;$&#WXWob~oV_&jQwifFrl)>27G7L$i zM0PSJQ89*uH1X5#`^UMTbFT9|_jO;-xv%S-vxbhA&hUUNEiIj0-1hhPwY0R-QnU08 zF)$cR>Zq)Wib{8Px2&w}`1p87M+cEe{QiA~PN(0#eLFild+ZtN%9SfJ7I`!p&HT1l zzK8%F4hw#dZfIyw4A?t!=1k**#w2BfKktO9X5@>D3RH5mU0p|4S65#T3^19@K<<;i z006*3oFMzN0Osq&6#(EnWNmKZjGJ1y$Q3!&B5-n|M;hPtu&h0xKA`UO?*2aYlflWX zMK+!O+avNPe+`R<4-GG?7m78@7dbm}sswvF#aGSR>Z@Gu<;h+UzzT(4oQ~`zy$}~_ z{Un~JM#m=X=qtK7^zuYw*2S@-eY9c6wBnh>o8l+gY%H<^CjBn&IjO$r0FdK2`^9JA z=w}1k%}@dkW@eFnSn?=-zmA{W#mf%R^4A7R|HQ|k5(-Ghm7P?%jdZE?C5p?E*|O|c z>|reOIr5tieCGw{ZZ4m75g5D9a*hNHDey9Zfmk34GGlW+=RFBYXjsj6=^?hv?Q+jT~mDHH_Ol z`j}0MaT`Pbuhqt}s*3~S4#3+gDt3jW511%iakXkmmX0FZUi(O8(1bddl z5H6_aFv{7UlO`pvVfHjGju-K^9f@IJ~XMcDDb@5*^UZx zlBg;Unsp=56bDA8)lEvCI5{?AmAl&DnKTar75gTywO(iTDzAFozJO1?iaS?T^6X9ZR(C{nL)_>1~;f#m5TlT^cg;4Q$XY2xRtTBAg z?3oonJE;9JG2lybxHiWfVs+u#1FaMB(Vf8EWuIDxOC}$VZb+Io6;xj$Y+IuS!}p z3fD3WCYx8hTv-v|FY3%Cf?sm0L2h59=Z-4!S&N&}Mes+1w;%*BI{vW=k%R|z&d9ux ziO_xOweW5*BB-+7!)|8q#mMzy`9DBZQX}P7y|q|9^6_#vJ>I1neUc&2#9q+E;9V7% z>8?o*3l^a8M7}c&MXb=_+G0wlF0W3?w37ygHVKd0ejc8XGi3xUyz4(URn>axd;R>t z68P8JwB!azu!E%P5JND@$s$#yOJOj2kzL%)b6L{`ED5aGDtgfy?XY%@d9gA|JMEj_ zpJM+<{XuG|t<7df1108nT~cYN9Exr^@a!9d9%A5@Jon)F!S)=#%;iQIT(p3v_ph)h zWoy1t0>Wx6{2&Ks;Gsx%)LYS&lG^VVI(zD$y&(Ryry&#WOJ$Vjz@6##q<;j4>ZO8h zFAjW^!e+@$9hE1Uja18_=A!OiewvM-b+rFv`h&-C+B|9hQQE7h4YR9F|2z4w-beEB zcMQKVj$hD`L&Yn+d+*;KZ4VlB_vE?Xn^h;*hTzI?lyjn~CEyJgyuIEH8Ba?{FJ+rG z?VanaUqpQDf-BslOUQKZi&FuF z8)dr4%%@$Q?+VeOY97Z&arD~h%_QNuM!b%Uoi=zYh+C;m3y90!;85^I*MNuR!M6nm z%@F&s5;D<@ycz19N92cUL;d7V`FIY{*rnE3;Ky89^dqYeq!EKhsF`t)U#{8{M5JUA zf8VAqsa?=+#LMStJ|dl6jpQJ1o8XV~?+)DO-iiMfRQKG@D@(zAY&c|xxViS%H%4_A zcNes?>3ei<-f(Fhry$GKCsEjWXwZg_mWJ6Qb~pp^zQV$x(C4R@_^${h-m;hcd^MMY z{BXd4_-F0zVP%;_4>8eu&+Le1{Lv!0xg7Xrl}OLA%tUhqlkn%$M%=$ z1p&>9A*@vQhdjqLua!hS*RL~!-T(DyMgyUSM=@)ugqk}ywcQ6$9@opugD&8uDm1R8 zL=s<`k=5vLG@uHMYhgv5+KNqPOf`meBkkd0#*pu<99d2L0bVpm*Wm~S}ng(sM`MG=K% zNN(7QgYSNhDT5#s-R!hwy1%{lS=yxU$PIkt?CP zGV1tZ7^_9r2syu6PHL}?*SUxE$Is`BIliiE>97-uYbDNjcd z8r~6s8IAmdb@rt>cv`xHgTot1_{4b`ELDik*~8S0-A?|F1rmQx^Q}vPt{OIpco%V) z>M^nnE3U(AuZTSBlj)wR`0Mrqkjz^EyDCZ@{;xa;i=VF5gOHw$&HQAw6#Pr1XN?l9 z2H4Q%*>k89IEASM?vUps@3;b*Yv)cOSu@ztD)V>aHom|y;jUK|_{Pb^HIC&xww9^# zvt(U<^54P-_*GO;LVAE4xV#n!XBhCo(X6JxU<$t0H|P}*hL|v#@05z12wMVV04rdB zP|&jhfV}2@qZi>>V1%6;t2ur~k-@|}AS4SkDgh3RMxjs=P*>dsdj7J5&4oxZm@B`H zjjwLQZh5{=%wd<%=t#2$h*tvRa@DEuS3CBM$&s~bj$RqD4FXod0uRb50D2FB*bv#FrHgS2maf5#eJ|>3R|A9~(Pu zY~l0gbo%)`<-ujHg8PjbO&cUoT1yCNJGEWnPKkUT=ypU5TpT4kP0dEfT-Ws68G+(Q=? z_~>=eHGwx)!V9V&G`B8(oDeOw9L&zLa^2ps;$w}?x>}hyUsY3p;F6mo6|#txJMPei z`wuk^oZ;P}D4xaW98+yKHhMPI`YniMz-T6|3A<-U6@oFLaN4dX%~Xyp*cFfw;UEQK z;VI#LRKfn3BQ34{83Nw0*yt-U0CY<6?zJH`GSsY7Md< zKSoqOI0ED35(#Y`Fj?Io0;i8+O1;azk(``EYbVoyTX0Po&@LS~!hQq>`j3d3UIv|E zqFPfp6jas|sJEhM>#<>2fJtRs48Jl2`;wCujvvBo)+b5#unOo_w#a5!mp+O&W)mA9 zjjInf-RX7YNxL5|Z?$7=oxrm{dab{&6J=XtxRPCtQ~k#1_>3wbAS7?CDYbuwd)Vq3 z$XI0@myduiH;X#bxRfmLcx{0R~;;ejAhey2l*mt$V^#*yfLzrY_f=IaDU3`^}rqyF@ zT#!uA)(DlMsmUIc2-h)pNJv^NF4;4jD5nJZAH^i%^ZPRlY6M}7rMLnF3nhkWYz8Hm z;q-Pow}yP1O+*t*lru=#spBr@(!=}vuaCWsk<81`a`Xxw0{a^u`c?C+ubQ`>KC#+H zu?*{NdG+;eFqgSX zy33h}3Ih|B+Kt{!QJ;X+>vH7_yDLFs!+CM72RwAa{XcDSzc&U7TqdZiZNYONHg^DXLrq|Vv;4>MkW|Du(Lzp5NUZr>B{Fc{6zCsJmp>S4cx;S#@m z=zi~7DYbx}aM5@s5L2ysXJQr&EHW&tZ`$CPnYW*O dYxRZgqR|C*dH#FH4t~pkwS~QTwW(+H{{aX@h!_9> delta 3889 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