From cf6b735026aa34899e9ce630b7ca875b1973ef94 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 14 Oct 2018 12:20:03 +0800 Subject: [PATCH] Removed JFXDrawer and JFXHamburger in JFoenix.jar --- .../java/org/jackhuang/hmcl/Launcher.java | 8 +- .../org/jackhuang/hmcl/ui/Controllers.java | 77 ++++- .../org/jackhuang/hmcl/ui/ListPageSkin.java | 12 +- .../java/org/jackhuang/hmcl/ui/MainPage.java | 303 ++++++++++-------- .../hmcl/ui/construct/PopupMenu.java | 9 + .../assets/fxml/advanced-list-item.fxml | 42 --- HMCL/src/main/resources/assets/fxml/main.fxml | 49 --- .../resources/assets/lang/I18N.properties | 4 +- .../resources/assets/lang/I18N_zh.properties | 4 +- .../assets/lang/I18N_zh_CN.properties | 4 +- lib/JFoenix.jar | Bin 628415 -> 592629 bytes 11 files changed, 268 insertions(+), 244 deletions(-) delete mode 100644 HMCL/src/main/resources/assets/fxml/advanced-list-item.fxml delete mode 100644 HMCL/src/main/resources/assets/fxml/main.fxml diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 5aa66fc8e..4c1c1c979 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -55,7 +55,8 @@ public final class Launcher extends Application { Main.showErrorAndExit(i18n("fatal.config_loading_failure", Paths.get("").toAbsolutePath().normalize())); } - try { + // runLater to ensure ConfigHolder.init() finished initialization + Platform.runLater(() -> { // When launcher visibility is set to "hide and reopen" without Platform.implicitExit = false, // Stage.show() cannot work again because JavaFX Toolkit have already shut down. Platform.setImplicitExit(false); @@ -66,9 +67,8 @@ public final class Launcher extends Application { UpdateChecker.init(); primaryStage.show(); - } catch (Throwable e) { - CRASH_REPORTER.uncaughtException(Thread.currentThread(), e); - } + }); + } public static void main(String[] args) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index 8c08326de..f1341c17e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -17,33 +17,46 @@ */ package org.jackhuang.hmcl.ui; +import com.jfoenix.concurrency.JFXUtilities; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.image.Image; +import javafx.scene.input.TransferMode; import javafx.scene.layout.Region; import javafx.stage.Stage; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.Metadata; +import org.jackhuang.hmcl.game.HMCLGameRepository; +import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.setting.Accounts; import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.account.AccountList; import org.jackhuang.hmcl.ui.account.AuthlibInjectorServersPage; -import org.jackhuang.hmcl.ui.construct.InputDialogPane; -import org.jackhuang.hmcl.ui.construct.MessageBox; -import org.jackhuang.hmcl.ui.construct.MessageDialogPane; -import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; +import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.ui.decorator.DecoratorController; +import org.jackhuang.hmcl.ui.download.ModpackInstallWizardProvider; import org.jackhuang.hmcl.ui.profile.ProfileList; +import org.jackhuang.hmcl.ui.versions.GameItem; import org.jackhuang.hmcl.ui.versions.GameList; import org.jackhuang.hmcl.ui.versions.VersionPage; +import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.util.FutureCallback; +import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.io.FileUtils; +import org.jackhuang.hmcl.util.javafx.MultiStepBinding; import org.jackhuang.hmcl.util.platform.JavaVersion; +import org.jackhuang.hmcl.util.versioning.VersionNumber; +import java.io.File; +import java.util.Comparator; +import java.util.List; import java.util.function.Consumer; +import java.util.stream.Collectors; import static org.jackhuang.hmcl.setting.ConfigHolder.config; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Controllers { @@ -121,8 +134,60 @@ public final class Controllers { } public static MainPage getMainPage() { - if (mainPage == null) + if (mainPage == null) { mainPage = new MainPage(); + mainPage.setOnDragOver(event -> { + if (event.getGestureSource() != mainPage && event.getDragboard().hasFiles()) { + if (event.getDragboard().getFiles().stream().anyMatch(it -> "zip".equals(FileUtils.getExtension(it)))) + event.acceptTransferModes(TransferMode.COPY_OR_MOVE); + } + event.consume(); + }); + + mainPage.setOnDragDropped(event -> { + List files = event.getDragboard().getFiles(); + if (files != null) { + List modpacks = files.stream() + .filter(it -> "zip".equals(FileUtils.getExtension(it))) + .collect(Collectors.toList()); + if (!modpacks.isEmpty()) { + File modpack = modpacks.get(0); + Controllers.getDecorator().startWizard(new ModpackInstallWizardProvider(modpack), i18n("install.modpack")); + event.setDropCompleted(true); + } + } + event.consume(); + }); + + FXUtils.onChangeAndOperate(Profiles.selectedVersionProperty(), version -> { + if (version != null) { + mainPage.setCurrentGame(version); + } else { + mainPage.setCurrentGame(i18n("version.empty")); + } + }); + mainPage.showUpdateProperty().bind(UpdateChecker.outdatedProperty()); + mainPage.latestVersionProperty().bind( + MultiStepBinding.of(UpdateChecker.latestVersionProperty()) + .map(version -> version == null ? "" : i18n("update.bubble.title", version.getVersion()))); + + Profiles.registerVersionsListener(profile -> { + HMCLGameRepository repository = profile.getRepository(); + List children = repository.getVersions().parallelStream() + .filter(version -> !version.isHidden()) + .sorted(Comparator.comparing(Version::getReleaseTime).thenComparing(a -> VersionNumber.asVersion(a.getId()))) + .map(version -> { + Node node = PopupMenu.wrapPopupMenuItem(new GameItem(profile, version.getId())); + node.setOnMouseClicked(e -> profile.setSelectedVersion(version.getId())); + return node; + }) + .collect(Collectors.toList()); + JFXUtilities.runInFX(() -> { + if (profile == Profiles.getSelectedProfile()) + mainPage.getVersions().setAll(children); + }); + }); + } return mainPage; } @@ -131,6 +196,8 @@ public final class Controllers { } public static void initialize(Stage stage) { + Logging.LOG.info("Start initializing application"); + Controllers.stage = stage; stage.setOnCloseRequest(e -> Launcher.stopApplication()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ListPageSkin.java index cf530fb05..3f5547cdd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ListPageSkin.java @@ -46,14 +46,14 @@ public class ListPageSkin extends SkinBase { { scrollPane.setFitToWidth(true); - VBox accountList = new VBox(); - accountList.maxWidthProperty().bind(scrollPane.widthProperty()); - accountList.setSpacing(10); - accountList.setStyle("-fx-padding: 10 10 10 10;"); + VBox list = new VBox(); + list.maxWidthProperty().bind(scrollPane.widthProperty()); + list.setSpacing(10); + list.setPadding(new Insets(10)); - Bindings.bindContent(accountList.getChildren(), skinnable.itemsProperty()); + Bindings.bindContent(list.getChildren(), skinnable.itemsProperty()); - scrollPane.setContent(accountList); + scrollPane.setContent(list); JFXScrollPane.smoothScrolling(scrollPane); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index 39e73aa61..2b91bd082 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -17,52 +17,37 @@ */ package org.jackhuang.hmcl.ui; -import com.jfoenix.concurrency.JFXUtilities; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXPopup; -import javafx.animation.Interpolator; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; -import javafx.beans.property.ReadOnlyStringProperty; -import javafx.beans.property.ReadOnlyStringWrapper; -import javafx.fxml.FXML; +import javafx.beans.binding.Bindings; +import javafx.beans.property.*; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Label; -import javafx.scene.input.TransferMode; +import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.util.Duration; -import org.jackhuang.hmcl.game.HMCLGameRepository; -import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.construct.PopupMenu; -import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.ui.construct.TwoLineListItem; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; -import org.jackhuang.hmcl.ui.download.ModpackInstallWizardProvider; -import org.jackhuang.hmcl.ui.versions.GameItem; import org.jackhuang.hmcl.ui.versions.Versions; import org.jackhuang.hmcl.upgrade.RemoteVersion; import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.upgrade.UpdateHandler; -import org.jackhuang.hmcl.util.Logging; -import org.jackhuang.hmcl.util.io.FileUtils; -import org.jackhuang.hmcl.util.javafx.MultiStepBinding; -import org.jackhuang.hmcl.util.versioning.VersionNumber; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.logging.Level; -import java.util.stream.Collectors; +import static org.jackhuang.hmcl.ui.FXUtils.SINE; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class MainPage extends StackPane implements DecoratorPage { @@ -71,133 +56,142 @@ public final class MainPage extends StackPane implements DecoratorPage { private final PopupMenu menu = new PopupMenu(); private final JFXPopup popup = new JFXPopup(menu); - @FXML - private StackPane main; - @FXML + private final StringProperty currentGame = new SimpleStringProperty(this, "currentGame"); + private final BooleanProperty showUpdate = new SimpleBooleanProperty(this, "showUpdate"); + private final StringProperty latestVersion = new SimpleStringProperty(this, "latestVersion"); + private final ObservableList versions = FXCollections.observableArrayList(); + private StackPane updatePane; - @FXML - private JFXButton btnLaunch; - @FXML - private JFXButton btnMenu; - @FXML - private JFXButton closeUpdateButton; - @FXML - private Label lblCurrentGame; - @FXML - private Label lblIcon; - @FXML - private TwoLineListItem lblLatestVersion; - @FXML - private Rectangle separator; + private JFXButton menuButton; { - FXUtils.loadFXML(this, "/assets/fxml/main.fxml"); + setPadding(new Insets(25)); + + updatePane = new StackPane(); + updatePane.setVisible(false); + updatePane.getStyleClass().add("bubble"); + FXUtils.setLimitWidth(updatePane, 230); + FXUtils.setLimitHeight(updatePane, 55); + StackPane.setAlignment(updatePane, Pos.TOP_RIGHT); + updatePane.setOnMouseClicked(e -> onUpgrade()); + FXUtils.onChange(showUpdateProperty(), this::doAnimation); + + { + HBox hBox = new HBox(); + hBox.setSpacing(12); + hBox.setAlignment(Pos.CENTER_LEFT); + StackPane.setAlignment(hBox, Pos.CENTER_LEFT); + StackPane.setMargin(hBox, new Insets(9, 12, 9, 16)); + { + Label lblIcon = new Label(); + lblIcon.setGraphic(SVG.update(Theme.whiteFillBinding(), 20, 20)); + + TwoLineListItem prompt = new TwoLineListItem(); + prompt.setTitleFill(Color.WHITE); + prompt.setSubtitleFill(Color.WHITE); + prompt.setSubtitle(i18n("update.bubble.subtitle")); + prompt.setPickOnBounds(false); + prompt.setStyle("-jfx-title-font-weight: BOLD;"); + prompt.titleProperty().bind(latestVersionProperty()); + + hBox.getChildren().setAll(lblIcon, prompt); + } + + JFXButton closeUpdateButton = new JFXButton(); + closeUpdateButton.setGraphic(SVG.close(Theme.whiteFillBinding(), 10, 10)); + StackPane.setAlignment(closeUpdateButton, Pos.TOP_RIGHT); + closeUpdateButton.getStyleClass().add("toggle-icon-tiny"); + StackPane.setMargin(closeUpdateButton, new Insets(5)); + closeUpdateButton.setOnMouseClicked(e -> closeUpdateBubble()); + + updatePane.getChildren().setAll(hBox, closeUpdateButton); + } + + StackPane launchPane = new StackPane(); + launchPane.setMaxWidth(230); + launchPane.setMaxHeight(55); + StackPane.setAlignment(launchPane, Pos.BOTTOM_RIGHT); + { + JFXButton launchButton = new JFXButton(); + launchButton.setPrefWidth(230); + launchButton.setPrefHeight(55); + launchButton.setButtonType(JFXButton.ButtonType.RAISED); + launchButton.getStyleClass().add("jfx-button-raised"); + launchButton.setOnMouseClicked(e -> launch()); + launchButton.setClip(new Rectangle(-100, -100, 310, 200)); + { + VBox graphic = new VBox(); + graphic.setAlignment(Pos.CENTER); + graphic.setTranslateX(-7); + graphic.setMaxWidth(200); + Label launchLabel = new Label(i18n("version.launch")); + launchLabel.setStyle("-fx-font-size: 16px;"); + Label currentLabel = new Label(); + currentLabel.setStyle("-fx-font-size: 12px;"); + currentLabel.textProperty().bind(currentGameProperty()); + graphic.getChildren().setAll(launchLabel, currentLabel); + + launchButton.setGraphic(graphic); + } + + Rectangle separator = new Rectangle(); + separator.getStyleClass().add("darker-fill"); + separator.setWidth(1); + separator.setHeight(57); + separator.setTranslateX(95); + separator.setMouseTransparent(true); + + menuButton = new JFXButton(); + menuButton.setPrefHeight(55); + menuButton.setPrefWidth(230); + menuButton.setButtonType(JFXButton.ButtonType.RAISED); + menuButton.getStyleClass().add("jfx-button-raised"); + menuButton.setStyle("-fx-font-size: 15px;"); + menuButton.setOnMouseClicked(e -> onMenu()); + menuButton.setClip(new Rectangle(211, -100, 100, 200)); + StackPane graphic = new StackPane(); + Node svg = SVG.triangle(Theme.whiteFillBinding(), 10, 10); + StackPane.setAlignment(svg, Pos.CENTER_RIGHT); + graphic.getChildren().setAll(svg); + graphic.setTranslateX(12); + menuButton.setGraphic(graphic); + + launchPane.getChildren().setAll(launchButton, separator, menuButton); + } + + getChildren().setAll(updatePane, launchPane); - btnLaunch.setClip(new Rectangle(-100, -100, 310, 200)); - btnMenu.setClip(new Rectangle(211, -100, 100, 200)); menu.setMaxHeight(365); menu.setMaxWidth(545); menu.setAlwaysShowingVBar(true); - - updatePane.visibleProperty().bind(UpdateChecker.outdatedProperty()); - closeUpdateButton.setGraphic(SVG.close(Theme.whiteFillBinding(), 10, 10)); - closeUpdateButton.setOnMouseClicked(event -> { - Duration duration = Duration.millis(320); - Timeline nowAnimation = new Timeline(); - nowAnimation.getKeyFrames().addAll( - new KeyFrame(Duration.ZERO, - new KeyValue(updatePane.translateXProperty(), 0, Interpolator.EASE_IN)), - new KeyFrame(duration, - new KeyValue(updatePane.translateXProperty(), 260, Interpolator.EASE_IN)), - new KeyFrame(duration, e -> { - updatePane.visibleProperty().unbind(); - updatePane.setVisible(false); - })); - nowAnimation.play(); - }); - lblIcon.setGraphic(SVG.update(Theme.whiteFillBinding(), 20, 20)); - lblLatestVersion.titleProperty().bind( - MultiStepBinding.of(UpdateChecker.latestVersionProperty()) - .map(version -> version == null ? "" : i18n("update.bubble.title", version.getVersion()))); - - StackPane graphic = new StackPane(); - Node svg = SVG.triangle(Theme.whiteFillBinding(), 10, 10); - StackPane.setAlignment(svg, Pos.CENTER_RIGHT); - graphic.getChildren().setAll(svg); - graphic.setTranslateX(12); - btnMenu.setGraphic(graphic); - - FXUtils.onChangeAndOperate(Profiles.selectedVersionProperty(), version -> { - if (version != null) { - lblCurrentGame.setText(version); - } else { - lblCurrentGame.setText(i18n("version.empty")); - } - }); - - Profiles.registerVersionsListener(this::loadVersions); - - setOnDragOver(event -> { - if (event.getGestureSource() != this && event.getDragboard().hasFiles()) { - if (event.getDragboard().getFiles().stream().anyMatch(it -> "zip".equals(FileUtils.getExtension(it)))) - event.acceptTransferModes(TransferMode.COPY_OR_MOVE); - } - event.consume(); - }); - - setOnDragDropped(event -> { - List files = event.getDragboard().getFiles(); - if (files != null) { - List modpacks = files.stream() - .filter(it -> "zip".equals(FileUtils.getExtension(it))) - .collect(Collectors.toList()); - if (!modpacks.isEmpty()) { - File modpack = modpacks.get(0); - Controllers.getDecorator().startWizard(new ModpackInstallWizardProvider(modpack), i18n("install.modpack")); - event.setDropCompleted(true); - } - } - event.consume(); - }); + menu.setOnMouseClicked(e -> popup.hide()); + Bindings.bindContent(menu.getContent(), versions); } - private void loadVersions(Profile profile) { - HMCLGameRepository repository = profile.getRepository(); - List children = repository.getVersions().parallelStream() - .filter(version -> !version.isHidden()) - .sorted(Comparator.comparing(Version::getReleaseTime).thenComparing(a -> VersionNumber.asVersion(a.getId()))) - .map(version -> { - StackPane pane = new StackPane(); - GameItem item = new GameItem(profile, version.getId()); - pane.getChildren().setAll(item); - pane.getStyleClass().setAll("menu-container"); - item.setMouseTransparent(true); - RipplerContainer container = new RipplerContainer(pane); - container.setOnMouseClicked(e -> { - profile.setSelectedVersion(version.getId()); - popup.hide(); - }); - return container; - }) - .collect(Collectors.toList()); - JFXUtilities.runInFX(() -> { - if (profile == Profiles.getSelectedProfile()) - menu.getContent().setAll(children); - }); + private void doAnimation(boolean show) { + Duration duration = Duration.millis(320); + Timeline nowAnimation = new Timeline(); + nowAnimation.getKeyFrames().addAll( + new KeyFrame(Duration.ZERO, + new KeyValue(updatePane.translateXProperty(), show ? 260 : 0, SINE)), + new KeyFrame(duration, + new KeyValue(updatePane.translateXProperty(), show ? 0 : 260, SINE))); + if (show) nowAnimation.getKeyFrames().add( + new KeyFrame(Duration.ZERO, e -> updatePane.setVisible(true))); + else nowAnimation.getKeyFrames().add( + new KeyFrame(duration, e -> updatePane.setVisible(false))); + nowAnimation.play(); } - @FXML private void launch() { Profile profile = Profiles.getSelectedProfile(); Versions.launch(profile, profile.getSelectedVersion()); } - @FXML private void onMenu() { - popup.show(btnMenu, JFXPopup.PopupVPosition.BOTTOM, JFXPopup.PopupHPosition.RIGHT, 0, -btnMenu.getHeight()); + popup.show(menuButton, JFXPopup.PopupVPosition.BOTTOM, JFXPopup.PopupHPosition.RIGHT, 0, -menuButton.getHeight()); } - @FXML private void onUpgrade() { RemoteVersion target = UpdateChecker.getLatestVersion(); if (target == null) { @@ -206,6 +200,11 @@ public final class MainPage extends StackPane implements DecoratorPage { UpdateHandler.updateFrom(target); } + private void closeUpdateBubble() { + showUpdate.unbind(); + showUpdate.set(false); + } + public String getTitle() { return title.get(); } @@ -218,4 +217,44 @@ public final class MainPage extends StackPane implements DecoratorPage { public void setTitle(String title) { this.title.set(title); } + + public String getCurrentGame() { + return currentGame.get(); + } + + public StringProperty currentGameProperty() { + return currentGame; + } + + public void setCurrentGame(String currentGame) { + this.currentGame.set(currentGame); + } + + public boolean isShowUpdate() { + return showUpdate.get(); + } + + public BooleanProperty showUpdateProperty() { + return showUpdate; + } + + public void setShowUpdate(boolean showUpdate) { + this.showUpdate.set(showUpdate); + } + + public String getLatestVersion() { + return latestVersion.get(); + } + + public StringProperty latestVersionProperty() { + return latestVersion; + } + + public void setLatestVersion(String latestVersion) { + this.latestVersion.set(latestVersion); + } + + public ObservableList getVersions() { + return versions; + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/PopupMenu.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/PopupMenu.java index 94846b5db..9ca16d845 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/PopupMenu.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/PopupMenu.java @@ -28,6 +28,7 @@ import javafx.scene.control.Control; import javafx.scene.control.ScrollPane; import javafx.scene.control.Skin; import javafx.scene.control.SkinBase; +import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import org.jackhuang.hmcl.ui.FXUtils; @@ -60,6 +61,14 @@ public class PopupMenu extends Control { return new PopupMenuSkin(); } + public static Node wrapPopupMenuItem(Node node) { + StackPane pane = new StackPane(); + pane.getChildren().setAll(node); + pane.getStyleClass().setAll("menu-container"); + node.setMouseTransparent(true); + return new RipplerContainer(pane); + } + private class PopupMenuSkin extends SkinBase { protected PopupMenuSkin() { diff --git a/HMCL/src/main/resources/assets/fxml/advanced-list-item.fxml b/HMCL/src/main/resources/assets/fxml/advanced-list-item.fxml deleted file mode 100644 index 7f71c65f5..000000000 --- a/HMCL/src/main/resources/assets/fxml/advanced-list-item.fxml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/HMCL/src/main/resources/assets/fxml/main.fxml b/HMCL/src/main/resources/assets/fxml/main.fxml deleted file mode 100644 index f018b098b..000000000 --- a/HMCL/src/main/resources/assets/fxml/main.fxml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index e10c5a001..671955f74 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -165,8 +165,8 @@ launcher=Launcher launcher.background=Background Image launcher.background.choose=Choose background path. launcher.background.default=Default -launcher.common_directory=Cache Directory (Store downloaded files) -launcher.common_directory.choose=Choose cache directory. +launcher.common_directory=Download Cache Directory +launcher.common_directory.choose=Choose download cache directory launcher.common_directory.default=Default launcher.common_directory.disabled=Disabled launcher.contact=Contact Us diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 8f6c63232..650998fea 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -165,8 +165,8 @@ launcher=啟動器 launcher.background=背景位址 launcher.background.choose=選擇背景路徑 launcher.background.default=預設(自動尋找啟動器同目錄下的 background.png/jpg 及 bg 資料夾內的圖片) -launcher.common_directory=緩存目錄(檔案下載緩存) -launcher.common_directory.choose=選擇緩存目錄 +launcher.common_directory=檔案下載緩存目錄 +launcher.common_directory.choose=選擇檔案下載緩存目錄 launcher.common_directory.default=預設 launcher.common_directory.disabled=停用 launcher.contact=聯絡我們 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 9d471fe06..7fe9808fc 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -165,8 +165,8 @@ launcher=启动器 launcher.background=背景地址 launcher.background.choose=选择背景路径 launcher.background.default=默认(自动检索启动器同目录下的 background.png/jpg 及 bg 文件夹内的图片) -launcher.common_directory=缓存目录(文件下载缓存) -launcher.common_directory.choose=选择缓存目录 +launcher.common_directory=文件下载缓存目录 +launcher.common_directory.choose=选择文件下载缓存目录 launcher.common_directory.default=默认(%AppData%/.minecraft 或者 ~/.minecraft) launcher.common_directory.disabled=禁用(总是使用游戏路径) launcher.contact=联系我们 diff --git a/lib/JFoenix.jar b/lib/JFoenix.jar index ddb87c8b8584cced7c69e03e9b27cfc359d6f105..c6a5de074173f2ce482eabe2964cb066e42b0c25 100644 GIT binary patch delta 5695 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 delta 40372 zcma&NV|XVGx8)slY}>Ytj&0kvom9uRZQHh;bgWMDkJH^zhaJs*&NFjno-@}w*IQS8 zs&7?m{r28#SJgv0EGOd?Y;ln;dQkFtD&MU|_7N#jm)T`xUSVfSakerJJOe zrIQD@d%C*4GKMIo(8`9>PqijHrh`{qy%}5prqXt_Y$1A@I^FgCV_9mo=<`{GT0n=B<(aT%j zkVH00`uKUR_!75x$fK#vuj?;poq_$->-mc$FYMwimR^pd*WG!=#OPX19(m&LCi{mS zzIEP&JKjXI2ql7nr5_!a_=Q~zN157mwr1|N>zLtKhjl#0DKu>|0E;TO~#_hY!e?y~Bp_1+RggQrmR-n4tYP{yjl$zpi$UMKaa|(`P z`4O)DZs%$L?LDlH3P=~&cM0}k?50QLk*hm>a;~TiV z@#KoHMecemHx2twdMozIWe>UE(QW+>T-DeT;8+bPF-0TV)Xc+L(T%C{1j1>Q53A7# z$qJ?99{JhyEhsE7!a;DGICmvoqV{qv{A-1iigzudm`=&;N;208bAFit@eV_~uli@g z8iGUOBPB7xS%U3%kjZzJ zBnSI!s$cQ08L!o|x?gJhex+6lG#XrG`W#%`26GgLv+5|9V-A-rj;buVl*ty& zm94i=TS~g$Tm8`wh-|#xHj|#3@@k83ZyQIBD3Ah+SSSHH$$T{sqAb`VHia_@9_4)H zyOte7WtBlm!v+)szGj@UHP~HdTPr;&(teX%d2S$?4eeqY9(eL?4J=4L1oJNY;V~!# z>?>W|NJo>A5y~rlpKo-KE7(>yNgXx1O1Nqd_9o|_XXLohi`HdW&wY9gH*s|@K~^a< zmPO2K2u{E;op0XFdR+&#w;@_Yb~ap2%Tk{mGM~7%jOg8y22)Ecn)iO+ftrdQj1stD zx8f&44K}HEwj#)q#Hx5P8+uK<;hy+!%cTIk>Tsc52!q#dlagjvT zY@=1K2(MHbnR}j%;WL?LDS5+GISi}O8M1qv>jUSlF3Ekem-8z+{&TyV(oMV8ZGEw9 zh88<;kZ&R}zt#dVnGe}fpEwChJ7KhuyVjTROTTxcm>4hpC60bK+M#JHyjecyl}Vun z{~CRYvnMpD{6(GwNFq_ z4z=~CLTe<+;MzZyY=Hs;}y7^Q)alp0f^H8Ow2B>H7HV@_3<=Ol}5rboHnml*{k)hBN6j>B}qI*mmM;>{y!! zLwQvV83*QoOgt;2!og5yd9LleJqL}KL^m?~dfT%8s@&~XFLTXShRYgJnvzg`J?kmS z*xbtud>##V3L~ejp6+Cog?&1mw#yn-O~-s5mtNS4?IoXIjmTw;)wzBQeeSr_GRl9GGYH(C=QwT2h_eQCv8wEq;jN_o8mdC zN`tQeF6~AD(U)0&litarbV6M^N?QwQGb@*k=2pra>m`J-Km&!yPq6>u0tIaDA1;o5 zsuxQ`f`OSqXD+$^?^69QC{#?{JZw!JG~7&`+-?64I5hXwF|;v1n0qazyT7e`QZ}CLtTk*Dr>Ss%*;{MT||xx@ZUACWZ127 zp=CVhNN23P3>_L}M>ZI2#MdB(7yB2QWk)v8_Nz_3PsQ&IS+imX7>DsCN+**ZJYa<2 z@<&9m+s2!lp}9B2mAxk&-BAN`NcTnBql%E~Syt!i9S=0vPkZ#4 zVOrDm@QH2?9i6ltXJSSG7QPkYu?a~ioqHoS;+&b%C==u#oh6r@A@V!uzb?`-RFF`N z^1lh_uJCDREa9FI(_9lxL7#gtp@zX4|FloqS~>b^~vKpnFOj-51BSH$8wW-V^#p2ee)&a*+{xN4v*|dVO5H6c?$zi zc?dy_BlSZ^t|B-o1^LVi!dY}_rvy%Ad|8__r^_a(NA>AT@s_ESn(SMslBSO8ytl`2 zZ7n#B+4IhSdY=LTlo_^Lc}>H`)W9wOBp?+Ak2QCNGQDsqE?YX*G@4pGwF!lv?sl16 zv{ARXl_NRIeJ6qD$C}JF+l$O3cgRl2B~mEo&mP;q%?eW7&8z1-k%=-v3blZ1juh>U zxz{mE)32#Qo2}56?Z1SVH7(L0JiWCunQ2KoPYax!?${2%TIPCbY;zc9TvM}z-}G0> zJ8hG+P|U9ABr^M!Qr`A>Bv8t+Q}E{XE;`wHz&NeE1Wl{FT=NzdJF}Rj6%u^$5iN3+IjJHgh|TmJ^DJdqxnBYx47Kq^_%9y+6GwQ3 zi|kHKa4@g}h|J_-$p0Fh{y%v9kIVnFVWsTLL5N~b47zIbIKHR8FSCyzK&nqMm&B$x z8H9@#E%5EueO7zYZ5J-mTDJ=eOLf zUyy(7>n9G~gO3Oy+ewx)P?!iT?(MtAnD!0#kT{ zbY?o-0f0u__L!e*l|F=3awicHEU7Zc?|4W^+e^aNR)Gzt}r4FP6m5C`69Klay_rt~h{L_aZapGBG!dzip0@9vD#Hw4EOc=6jwP|8mkx53hGcuPu1Px|;w|BAFF z#lpzqqT`7;sTuV-n-U*f)v#b+#0)?MGU8a1bvwC|1J*? z7)G05i%oi&&=M`5AB z|H^$aaH0FGVE!6-|4Z z(flU2HwN|}L8Yi+b+2oo%it~^A7S@EI5oA9x!-kR6GLX(xfW4y9oE=^R)RT};qW97 zyy0SCQOx|38wctYO*|xklZRuhBL~vnxoUISp?gxMm+6jA4ad$LM|1ap#c8)BUKNjb z=CwjM*EjztE9b222e zOr{YWVAh|!?`lTP;Hh{g-Db=Eqitl9zHd?!F( zm`r(1r~z-QI@$!17dM5y5fa7&BGJ*a^K|kI2J?+_8fIhyS$*{r)>4onQ}Sg#_kT$zh$0J(l`HrIJ8#JBxQM%>(#d>{)bJxB?2cMlE)5Vyfy5-V~l z9V;;WbklDe8BIc*Y@tmT-Kyju_U@D%QLi}D#@bDy?TY?1a-qQvTCDC>!yMt@a8zFX zam#V7Uz(+p;b*#e;%l9&PV=*j=L>0jTU3Ko4q|lAv}H;^=U>RP^Z75oCSHLE%xfTe ziD9Z1sj(QSn`xBk6A8V;H)Vrue9SDKn6U{6mWkH0fm4jFjS*=VV<_#$_ED{t%y8)l z%kW|NL3=bW)HabDdiHYG76_{?V;Dbfmq`00GAjv>_kzzCvY{{9+6`G7ZbMNN z)v_J0dsOn4w)7pR z4{PM9%VqViR~5AER&^+19mI>EOk-3T27NU)CSM{)OZ;q0sOk%wl_ib>GqkGBYaP8R z;*zqcO*vAmR$xUJ{}AO)W$#G`ycOHr4s)iJ6qa zLZN3$HkCVr86Gx}HomD0`z!eV5Jh&+^Y10=UYC3`4Octi$N@nh*pl7U0ImP_*XQ*#*kl;qW%yt9CjR-@c~|uO%?D+Y=kMTRDx+7Y(YB z+4mJw^OmR)Y7Rk?GC(=F`Pf&Gwwn==?~wVaOLRa0MY34?-Rs~6icFa(;FPs_oR}Tb z8Ppfy3yJWoAgXl9O`<=C!9=}RpJU^i3A(WAo%Y6tSO?)_14xXfFPIAX-HuKN)DB36 z1UjPODTQFUdCYb~X|VQ8sL2Y7A;#lONS#O;sw*y&B1HDkQcX@p;Q9>%tS&glGi%yv z0gea68At(;F*R@%CZ~XH6@)=372`MH)K>GBTgl*ZS;!z=| zZih){X)P`@V4)LTBpqJ~?6*vpRyR@8yZCpe!=4sxH!I)WtB7PxtAx=})~{T${r#K0 z#=p(6Hj&>Pi6sQI%Dcz&ZMe43oj)X9;8$M-OTgv=jo=r03r#ExEExYNu6vb^#-%3m zDWS0YpQ}9X+^#HvBB~tddHqpuRl(Q_zAoFy8;ylJ0{fQ9%C?Jh#*GX6y{gqr#MA!X ztj%kRz1m+F3gT*E>hoY>B(u{bv)Ot#uC8QDLbcuFEc8v#45K&OFq6?uv zG&3lqIWn_0Uc-#&m(|{AHg2*VB85M`F^u@)p@3C-fWMC=%4oQ0-tU8U!#*S2IKcg@ z8f&0W>@g>zh@t49o~V-Hxa0%&>Dmse9aiG11b&dp^?`NE?;3lbnua6g_TbLx#iCUe zF&FUb2?HE+TTuS?G-Z;NMB!w8aHC{DbT6K^aI6ElzCY z*vsTvO?#A=A=gY=5OAoh=$y8knm-LP5Ez}jvICpV00}@|fQi-f*S-Ba)J#OM*! zICC$zfBN$x-&3F9(+}^@&v%q>KYa=Sk+1h()MOZ@XuDR^-&cHq%`6{ zH6iw9E{5Ysy9x)`PPI`-0&GwHF}M>NQ(dJX#GrG0AW?|LTT{>6AgV3|4k{JBCq#3W zggDt{z^2F3+;Qt9;bDf=kmklRqyfiJkd6JX)xRtfrkks3~6K&xgoV?skAsvucio|C^m}dJ zSSL61Snh<-z55AkI)tMUSyfC2f*xSmdY207$065@pLRX3pa`UFUE_0y#mr@bBELe> zh#DP&Qx#o5mmlY)LrWb?&IlS?74K=dwk)gr!c7N;_7O-Ch(}MU=w-Or@f=x!`4aL< zwCK_t{OGZ79V&03sh|dC)E8;w)5X;H^h2lhHCZ~2K%0ks+g(^^!~Z-hNp+|5djF^6 zrqVqk3_iS7eTtGm95Shg(AAtu^(sl9-dElh)c~b79da$IK;mO=h1_e7hR-OKaMN9! zdCEtSV1AADd0u*otZP^liyyR0!ZB(5hd2uV`MW*;ADl9eQ)R%TFW4ZqU$TyRkZd`2 z!I3uK84c&ihp9DwjCvJtWo(6WBrtvpzG5O|*)T(LY)SV*pgG@f4Ntu=x_3I7RlG0n zEq%J!w|zl|$CO#|{O1ny-LUC=AvTU>=carGlPZU7oiv$;Qmt?G3Pv}=HfZ7CiEv!l z?rs$+2ghAJnn_in&rk8hCjav-#s6Fc|FiERIegrmrvn44aLP=)_+Js>Um%9zOii>gB4or2$ zz>EHkr|&=IIZk-oul9PqGYw;2-ftgLg}jw=y-w${)u&c~-@d3|6MQL0#ZvcY7GN}x ze0XEiCQ1>2OUhN451R(YC@+Vg*QI*y^S)K(6e>j*tvUupeiEgWD>Z}HHm1rauXh!7 zOa78L;>nzi;xTV=Chll zjYU*7qT&(g0&)I;val7(pw647Li!eGFyaYdtnzv~&I)8d8Go0qMpUbiV> z_PV_K#vE88Y(&U_4+=Nt!hI zdboC$HZ-N%8`09f2E<3pLd#ILAX=xJ zFEp>Z5j5Qw>dfbK1g$7Fkn#`S%nJ3n{tT@4YD1RG*@K-iIE7_I#oF#v(PvJnqd&UVAq;$uXeI8awD-LIwl6QmfhkvN4 zrIIrn6b4y$LzzKa@K-)_Q+jviDzEH2>I`vSnQcoYwLc%5)Z=NyP&8?UB?+MP*X=RM zXG{6f+JI$z8r;>56bBh(!5ZIB2ui!Kpk_Bjwq%YZyJxa-A-T4t_2l97+iS-{y5b+~ zT>e>``@8;;^jy-@vmoM4uXF$UR@!-P99F1wm7J1*>#?M*guk?D*FR*^Xt}kln$1ly zMb+TI@kRrW3U1&?5UKsjvmChMH}ev?rGIk0!m@9D*DT;y=1zaj!Ec=<*wd`-9+n8> z{VHq8xn2|C8DG#NW!BJxQ$S_Q-zeX zqnD_9=*}-35}TE8tX)j;YTl{)7-CZw^?$fC>U0jDP)l{bEyW{fr0N0Q6v_D5LoK`F zmRk=<1AfZlM?JqFj92dTl&iC;6r$^D%$|Cnj0Q99P$Q%-_(soa%hC0<_Y^OM7cfjl zFPtea&i+Pei`BAoM}RcJQHZLm*;I&!q#lrn2cN!lnt|hBaMx7LdT*@z)z}Kw+64wF zlWz2Hw~p*-)FwfpQPu;ljYv$<6`?67wNok%A!C{T_LsZyibxXvMwR@EmwA4b3Kj!> zp2Y!F8$3Q*Vb~WRNxwpXF^TL+Lqj#~US|ZzI8WsRwE29)+G2FeihOwj=jMJW~nPw6C;ZlwyKL#zfjjMp_L zKW2r$Kyqv+1S>wpjcwVWnDz(3zha3&);%_jyN6ZCe0j~_`Fr`3PbyXwjR46oKC&cU z#6<|;G?)11mYyhOP(7kNuzzjKo4~YbkV5TIVc3RBIqXcc#bGWR=2h3ZDuYGI=bA^d z3Ca83p+LWeiCbK`H=43e2d4ZWU8lgxs8N4!(HKW|J~NS&W#}an3GKPk?PI5#$xo;u zQT{4^9MgzAVq5$gd%(_5POtCijX!M!$Zi7MRN*oanSAWne}*cOmSMOtsQO|yT!v0; z9n?4Xu%DsvW}{|w2-cLYELLnPa%3J^M~MTTV962LW+VWe(Y82Rtvw+#pu9dQ3b7cF z@+h?A%}5Wf0!4iShqxoVUgus|x%gK(9WC7>$C?APni$1P4R{pLh~v1l?&0nBp};cz z>b&^3fECD`E%Xy6|J9xi#zwEo9r%^W1gY~(w7_%|GII?!vBLBDDO#~)2I%jT$Ev92 zTC2VZ$|UZ*BL{KF8JyG?2IeO_dBtrPs8Z$uI>MQ!E}H6)*Fuig5Xggv6j(}@KQM0} z;8kjFpVxix2{uVwkb14CJgOJ>-+3VO|`lhiIt?8qo zV{GX%F-bkS_Pn2aDM2?}Hh|)Hp)K(v6Zi2u;W$MJ7cowKNW}H81=;=auAe4e!^ygY zD^v&wdry+I@KR*OCpowkvenZ@IfQ8OSnS;z9ADV^39Pezy&`OA`ChIGi=<|^&1^el zIefopsJVN7zbKVfxAKyf{(>PubQs;veau(tn9Y`l_noag#3Zx%GY;tHwtfQdJHoxb zUpR{QLqQku!KKLC^$kNy?1z|gOJAP}R7BDw-X3k0ZdM_jf%PB^gY+_- z?(tEsSiI;+hA^D9r5_+R&BepEs7=t7;cV3%S#cv}lbYkbi5%f{jZ zXT!bbYpU7F;WRsoY$`^|t-hgBTB=80cx$yui_$_;Fx~Vs2@!Bc>+{dv%9UI36P9L% ze_=Gmf-l}hNqGXtlTZBgrw^r4Q3wRlES5@@c{qgCC2t{^;)2|SbanlC=@Ep13{{ieWC?kK#bPP&@x4M-)|n$(Ym!`w4OYQSS~*8%s&><)bcO>l(j8! zscwc^Q!hOR-*AAHl5V^4ZANqNLQ5katF=@tJGWwHoM|~jW-0h*b;tSV4Au7K6Z94c zUrZwfH^TZ^^BZC!dzb74f^Ox{$1|e&3Q{#g=5)%>Vncl-4}<6*7Ts}Ey{VER%$c+F z*waqtqSuYnc7}e(@P_MC>HJ2CJStzETU>11(wVhq^=5zuS?myD&*^6l$&;S@X}=lb z+F9renxf<&#d`sz%*k0l!v@W@pXc6U?7~&E7`McV1ro)Y)&_;lpW&W4g1VWNQ|g|+ zIfD6eQ`^mW&dVo$y0u4+KE2F~N!FKljJ_4ri|Z$R7N>UxP5`m^8HWe>Vl)C@cT{RD zUw2qVR3DI*YcQdhkrF*UyS1=>vt;2dw^)320#5{UlvIZ6Th81#!r{>!ET!jU!R4Sf zvo)7$itt;w$E{F0R+$D_&31CLBK`L&eS6hPJy~JaeOEYd_fH`mtwEA93{+ zBc?>^}3-(P%wK^KVd)xHslRNA{xVZcpqL(Ntos-}6T9>)1f`BNI3bV=tDCgF zsVN05OydN+qmfDRTmaFi_Jp^0FXsNkf}I~Rsf~Ou5vk66FA1sFXnx_i*8My3uyUqIiZ^6>vu9hv`5VzeCI_OFWl`l)oc$KAhT4ZJ z9N)5HWR^u6lijs7RjW<2BT#MG55p5pB!hwx#C`FF$Zo~?8w5x$v%w@b)ZwKfYMzut zRm1Im6SIIpw>tuwLH#_;G{r)$SUy?KJInC#@RevTC(m!GU*l}m)U5NwT8kyOxWleu zr-|3Z$FC06+gB&4^No2MOPU<$1m1?stDB@w70>SVoE7)*+b3!4mIS!%&I`9$}-Fx3-;=nCFgltB^Gl&Y>s z_|V2rdhdAV7#Z^ie|GhEt`^2O(AwRhlS7FuDgl^-GZ#6k0#A-2VguJQ0a|s-%b!!M z`CLnX`z_`LUM-0F-XP+%!D&LBmTaT}u9LT@tef;y(+v8|g9Bjj$%S-0tdFw3w&vlB z`L+?BD&$rdm{f|6;)ULTx-q&ho5wRj;Ddsc3wgD?tnHzomug^Xk1%nPj`;valCeQa zUhQ|z#SKaBu9W?umzP_^6?`wNw=emkckQcXI`z-N;hoAVWgSnYeoS8xYH#T3-ufu@ zR=ixAH0K`H(Ez~pOZK(a+=yJLtvSAatYTFUdBZ(&q@Tfha5jq*P~cJ9{2DNUAF8s& zwjNrLMK^J?6%a-SRJ&~x>PJGgl?N*p)cy`6`9na^qR7$EAk*zYXy<0*paq|TM-juz z%Meqf9AsrJ0bU{CfvOxEm&hmfqKFiPJh0nAm8dPBqR&j?;;TtraP^fHG%_a``OfR0Hj1-_cxxwojo{Gb}m6&+>{Dme_g&dvFHRg+<%;6Fgd@;gMp{L-GVvzZ{w$jJs zw6ejYkT6ii=RveT`s5jaL$Z2Hr1S%HY^p?jaE$S$F^O_ZK?ID!%!^}(x;yW=4y+aY zGV@gA+E_U^I&84J=W?0qpw3z$j6Nog2^?5ce1Kit*0dvMO#mU)-d7SZ(R8c@v?UDl z*43s%Pd~mU*yztPn00q9o99AzY?bq+%x!jvlL7PM@8`cwP*+6+!7RQV#8Q0BG7UhK zBpxtOJrKo-uk!4@{WC>f3J`LvdVjI1xt1X;AJFxw`fHVYQabOP@IquBG@0{z^3e1$ z*FI=6cYk#LuV5Zn6b6=HbWrN(o%+a~y5o!OeJ*iEq3P_|N+TFT{hLAxfW6RhCppBk zUJShObp)`ToJAZ%8GqM#QTt0|TdFNJc-IslsS^~W69mrOb{BiDjhA6em|3n$v6dL*0{8b(5F8ZRoF5ur4AXTCjj|Ny-2(;?iGZmo10$%SUgbisk01k9XKHIqi+5&8y8Ne2?IvCfE7S+~ zhkQ)js;o{TSw;qWoapY@75g_W7YrbG*4Cj`Z`i$&ef%VC0IEBU`&($4dRo zMHZ6u2qtZ$SXI$(053eY2o__QW)o~exSS3`tf>%VuzS_17%x6^Xt@g#+BURP7eU4- zv)wzZ#^}mHaHc6#pSaU6b@sb!*irDRai1^064*9T@{cQ0rXDyCD4XG9$N2$4xxDap zkes0GZiuz)kbGG}?g?cd+FKV=&W)r_EXff68%ti);E=2tZXP*uxcWGy4ol1dA{)*E zHkJ#rR^-H&~QN z9nB~F#VptQgFTp9uMxYMdrDw$17b`N%$}a=Br;Q*zf19jxyl}j1g)VGd-Cp_(}mCS zEzg$omD}}{mw4f~i{QzITM*F+Q5qka%5*ly@9b0vyfd$7oWPhkr8I$T;gK04k!;!>*4&i8Jdg|zB{+DKB;rV9YIry)@3#rdS@;wC6=Fr!`xFW^FWu> zPHoOIYY68>%2aPC0M#C`ktmmTT^cZsF}P6wkYQUB;>{g-B@f5|Rd3Km{EhMpRBB#P z)(HX3t6f0JB>+xFG`J44lu7v1@QWEbGph7~STih6G?oq>zH2itRA$tlsc7RE>DXG= zYMTj5Gl8CQNFAzzF}quKzcdyZj?>-?1YEuF+G&EM$uBr#MBnPgk%#^cIg|Rva_Ly} zU%N$70O0gF-3{#SypjSNowP?TNq-k%`RgT|A{fY$2?0fXv?f^bMKIHlfHFJ1BpI$r zwXf7FqK;kZsVYk47d}T~_NejY;2WZX1tz0sZ8vB@Q<$0SAIL`1x##*Z6J7PA~Tf(XFKPLP?pb>7os)hv)6#5XjL3=JlKLGJ{fQ55~{ekp{^!gyA(HOQ5r1uC+ zmp;-6rW#0U$(0F70kL)kKLN!y%Z9h=!%;Aq+!eg~hOj`QRqDG#AMvN8B{G)|WV)j3 zYij*trHX&)TJ>tpI&1Y{k#6aW_~3F5UsdJGO#_WD;wxk6w-}fKV-@{9$L;Tg^9M=Z zIskS#1njmeOy*P&^lOX>V${IOrr=`R4T(L7#2niOhYRV-Tf2 zWJ=uGk`xwX3l;s=!tXQ(g3d1%y@MDnLV$8hzf6nJezL<9ij~5h`&<|6JYxBYlaGi< z8=L=H1V595S!yE=(9qkp3vb@EaD!Ib2uV>9tD-pTtm4UQ&ma-{cpDNy|`iS5@k z#OeQT%~39lS@ZVFA8__zvT!I`WZ06+QWqrm9$s|#)3L##kDKJCQ|fA^gaMGZZtY;k zXvutWL%T~}*}d%K?zs8gXk!Len5WR$bB5sr3T5UBBxu$V{@#&nnQIw*m)*F6jxKuK6aehTpVv#eo#Zk|iYoNv^Qt?IGdBbv1KA5FVW3fc1#9 z8GSU*JhfIIm6o8G`&_!4|2jLLS2|6yrzZ6dqd zQ_az?iN_+Z`kvPLBMnKM4YKTI|l1e!@BlnmV#n>iNEzwP;+*SzdAml6-LZiyT zk}a{1Uh;&ImAOfEb&n_ze|2%<*orFj>Fle;GAc5Bd3O|V1aS0CaCnMzE~zLo)avy^ z<{m1O2#?8%rh}4bVTQo?P}z@3c@>Z&W!XnhnW=X`1n{*O(Y3Ek4NBbI`1=vHd)V61 z0*5E0UmGP(D^afJPGmsVn78hIGHhWtE;BTf1D4n!gg-$ zscBR73CL2!^*0H8h_#~#*^O(}Hw}rP02*f}2vfl0oJe!Cdg9<93#nolW(&!0RsxqI zl}y>|>=U5GoGM_IehewKa3=UEtzSnHpSWzbxmlBh|A!LpHjHWvY2ucX(DbgCh`B#| zyjza}i;t)!fzWU4~A9r0rh6!C!Vj8Q)gb4QdW#lX`ZHf{>r?k#4 zu_-2|P1_b(ax!b3gV$Xs$9ktqi37bvJ!okq|%3n*vQh^8h=esU8JTi)X z1}jf2toxm&@Qw$&b!rRp`9-Vb#jSTU^gsZb+Nlr!PLTqRCr=}sRA&|Y^Rh;;9StWRVq&PlKQs zF<4B?eekrSw3k?n#?{B|eX@NZJAoJ;*GM0PLR9CYT#(S4ULT7}0I6RL$~f3<@)WsG z-LrxMmT^=zNM4m}0KFYV(5w`|uzS}D>TeuL zctUsV#LABR72LSCRp4vMHpZLuY9$uOUn5ZFJxBb^je1i}5c9i<38=*yK=`4eK*|Pg z8ybu=0@eo`aWu|~%@Ry;%gzhU5~7`C@~|! zx)1I#F+DdoGln(;v5j5OJXcR&=&puY67F~^g%Z|`vi61W_NDOl#qjP{b#XAePU!8% zw|5cL`k;Fi2#0fZ< zV3O$heMbii{eMn@@xnSqt?ce;ISL56`WtIl6d;^Q^alK86Qvj?z+$w}>QI@2jYRwT zGxBThbKwaA^WPr0qb0@5>Aj|T)~^<a?w0HXYTh^dEIS>TN$j6O&i!~cV>cW~}2ir&53G-+(xww*M#ZQFKE8{1}M+qP|6 z-`H%L-2QOydol0Ko-_L&IGPGtxExm)7nM?SdAzpt^j1KjRcP4R@k zI9l~nA*Pw_WZ3i#()D?CYqhcmo1+PE1yWCBQcq}7Pi#_8a8gfnQcrkNPw#?>7o0Nn z;t5d$Ap%m9J!5q>6tSG_^_W$EC4x7GNZG^)g13R2G-IPIZMT1l*nn>32c4oI<%j%j zZ6FsHQmu4nGH67p;(19QXIq*sg77-7t&abtY;I8FyE5CcrNlaN5)1dLyR<827GPAjE1pZo#BE-S zW(PXqw9cu%>GZoVI;dlgX00Le&*R-{*sAjtHX3sZ5J1ITfMuxq?&tMIBO!9e@2tW2 z?U|1T+Z{SJ&r|KdkUQeig>2+~zaq+Y;$-XPug$4E09!@S=to!;b}{0-Ac@@h=Fq3V z?#*w>zaW{P{DSzN_}kNSX)_6QgYqG!Q~?AsEtShbBfkAvuI+M=wJ;;^>V3r|n-efw zyhd7JU0O|z`aoAsfcWeRwBnMO|5^VyWKqADR#R*Hi(l7-Rq4;GMX$g<{hu(-i@;e@ z6-CfVx{SK5`Letwe#{?hT>C$IGG9FC_Vn$x2Ytnm4pRD!_WjofvnM!m%+i!RWNm?v z)vL6{h_OE71BPyN6)>?XM_J7!akQO*$87*F-16p}mO$72PlHtWTNpdXd8N80ux$J0aC0;z&u4#?w zx(3s1B(o$@#*i6K8*5?dq1wRFsiQ)8I!N4OE_F|?NS4m%DyNw}Jjz`V<1v2K7q}$( zMCc>)Oia67(Z7j;=y+Dz97M-g!>5Uch&QDl26B482BThu;vD|klH1XL0R9Gdcb)p+ z`~8`HmU(+By3T&!59+P}Z8&HkHzDkTZ|1m?Cf)Y%*WN6Lrdl&~s?&7|X9y+q4yq)iG1hF}v28rNnqBgYdHv+JPX# zwh_9;NTRd<_`m$#ZRJ@l1pkbsff%WuW&dk(!$rl_$i(Kq45d|?(7tF(*q;jZYf>Dj zDE-mMUrEU_LCzK6rNofmQH2wc5RkJji!``X&B=X$EPLrXZ}!@oba<@#m&`D5qPZv;07I9kO1B10AgIFh5VOd{RI zQT4NEZjzaGG6WH!Y_1Y#I0-w(?;8msLbk3Ai>0fKIqcibBHIGdmXt8YX+_H9Roy1xy3okL7MQKs@2knfq>j+W$ zg(mue@JhSwMJl%CDiR2m8Jl8SqlDG%4%&TDc9qD=24kF>5qi>MAkz<}kRBy~)>Xwr zLu$09{3->>l86|(sH(lJN`~B$+k+CHgVnWu>U2 z3;i@!eJ1;`ZRUSY<%){wY$8diC3VzOt|@&OH*IR(a`toI)I=BGzc3i7Oa-K7?cT!Y z%lO%yHQQ|T8fK_jl|-O9)rD|2>n`hY$CV9r<%TUGfer(9<%|FuMTNX9De%YUDg#USX;z3xcUl4<7ga8;TL z&Y;D_jc-}hOtMi!0OpMsgh4MRx-az1+(oL_87)jVKqGFTa^vPJ(#NUwr=?XZ)E#2y z*rj`5%0sE6)$YipaeKoDUjddm5W8v{182_JyEFFwAFUStB%>Kgau~*(O{xt5N zvcogz?_i86d#P;iYS{i&yPPjo0XuuoXzK@Kp(qRl!@u(ow9&|n?YgWJG?L*!%$)wy zEC6SnUrGqAMTnO$r2^OI1quuv%oIz3^FxFA4Q)(e!XVh9r4 zjg_5&0ux2-G5ru#qpHqep4OeKn=drz9H~qq#q+4*3OqNaMo#4?H(HZ?3Hn+Qo1^`$ZJ%F}Ckgg8&=t9(bccaz z*$cefB9!R%&b=fxl=`|5N(0U>d!luQ^&dS64Xe}%>u=@Tfspa#v18LZsqUd!UblRX zx=Ze_E3<47V?UO(a~R~-Rbz(I^_p>jC9I1bGTp=b5{kqS0`w-j`fbH6{fS~0Ey?1> z`9Gmo9@~<-*@8pXpE>@cQTkEe9=@=X+4?l`s~_fmpWiy@Qcfmd>8hEqZl;gv#8xAP zRri>92@L@D%^)}pGXtu0J2{*hvMUslGO<9-C+4zqQ~ow37*^;G=;eTQ4UQW?pXn^_ zM8cYI3*)6$VRk7y7fnT9T($-ua>j+@wG6wa`})=?edblKa%wl}zvJ3&tGpG=VZML$ zsrL|r=jZVFS|Mv(a%KIH^oOwsk_hdv|}A(EBrvjVrGYFWmUFnZyNh#?i- zGCreOgjeY?m9(_~?alyGruSpVe~C&Ap2CEfrWWeHE^VDW$etQU%DCKvAY)dx2mQeV zzM7m3MZ0!c0v*}pH<2$IYK|l!GFl>S5Y7w(Jq0^fRv#LraMGj#29+F9;2E6Bxqyp3XkkB3A>zpF~*reF;SQD zVZ=6nV{u0RohW-sa?hFYn#qKpc`95}QqlR#yg3h&2JhiO9d6ej4rPqfOv!~vZt830 zh>f3h02JCJbs2eh3>&uwD)(!n`?3TJFCr~17-z8@e;7RauT=p+w~w`v=^dqO%*Yl` z*lb9DvOBKTu$3foEYOkwa)_XnTT}(ZL~GDuR7Vs6W;4Jz-<-mJz;;t!-vtuemlCcM zp7X%|Vuarl{CQqt%#SN@E1-3a0N!eU`fU*XfJ#pcGkzE?B<_=?I?=p`Y?&jgAYNBc z0jXy;l#>(DhuRgek>6E@Ssw2q@n_s1^*_cB=%>9eGf4g_5NQwQ`SZ#jal9_}3%?}i z2NL(kSD35N273=9oWuUT79D*QI<(q$Kh037oGEKALJYn62cy|z&slTt#6(Z$>#!du zd131k&>$1=2c}=%c*zfW8iAxqpE-rL9!Us-@k7=kIF5k;Vww*wHSKXxo&ubF(Vt@J zV-bTZRva{F=ETcRRkk=W38pIkFnTl+l+!gHdH%m9pgf%Ob0uoLwG^wppOUjnncU+8 zL?Yoi>ruuZ3S5f57>dj}qRc$#_8903^P#dbD$H_tsS+c03cQO*QVs9pW3BJhq6m4l zRZp#sH39qp6s!&lGA~`0G}a2qtj6O$ah`zWbCcofmK9rxN=@oJcMSCEFX~mPIpf)G z@FQhPcrMZ5P040fLE42`4f8fV;yWGF2XF?;mpQg~oAOEv=(l3}Ffq=?Kcj9mb6s^Wt2bIg_<@0vVRoBAxWeL;P^|JuznV>K97WBV`^ZaKR zh!Hf#^5DNX19#{zUnu`8vr5v)&e+Y_!p!-ZD}jCWZ0S0~bI>@B#C|RsAJ-`B%S@ zy9b-g^Yqr*QEU(Jf!+)6i`h@M4~9bgf`qt-h0!L3UDBU6kT1`Oqc3wCnvMob z=Bcc_ls!d~CJ!*hbY?adVx4l-Xmf6!E)0p9a@tycYOYpL&J1pUUVJsp`XHsE74i|J zMs^*SpSdpGl(2FUmBGn|V2-XzTCvV!z?uE`D&>kvmI|VR#37Y#YVr9nz^uL5jO*@i zQFMnjxk1xJh8*u7`2Nme$2_$tm08(n&{Ac&4ER$2LK0wYT{U_>3WHT{;t?y({zT``Av*~vqcwSxbu0D8`kZacaPaC;C>cov?IL(+0?Mtxu_&4% z+K)(-aT1_e(G*MY&bE}gS;l8Ur>g0T-XKR#1d}4NQ9nvupaluTfn7-EmZ!arn1ubw zgxz7xD9JX&S6&j`7}XPvF#ruZ3$A<$WikLKIg(%-fNYX6qjDoXV@cuG9;Yk2+zbkBG+}j2fK*xiai#= zx`=_zmQg>aQ$Y7mf&E#!hyW{8<7LK~H6*w?_tzHjP@%}As^s}Mm$$=I41R%{ob8zM z%y$rcUP68Kub7iahf>M5r-?rPC|_y>t60oJ zJjV$mQn?AyyhbP%v`KAD9w8rv#@Mt;*aaJN9PvJWkQ2NGvxwRz(GzF*3B9+)zvo)G z21TY&_|0L8tKX983b$X)ex2RDs64Ubi1GEg2^$7A2~n{&E@%}(*@V!T1-VyfwaJne z%n`mK5A3v1L-1M52Vx+CWz0r}O>!izKu<~>oJu};M2YGfFNWqaP3HA;>5qiVM>{A| z)e0Zb$Rnd7_}&qyb=ag&Z5jH~VbVeJ;&zA&uP2f)B@|bJHsU z3yWw5?C%hs?gwNG7C6|d6nrEPvhMxAIcjUDFJEZ?i+XZKE)Mq2UW!KcX8$upGF$E3 zd0iasW7*IYbqHz0Eh@9nF2E*F7p>(qnav7}E7h1cy3B^Ni{6+yBKR;q2zTA$l-9MF zmE-hKf{-XN_p}RmBgxJ|=UPRTwMyT+Sle=Wo#rN-IOrk#3$=?Y5n7{)Ie;tNU&KdKwAWAhuA2 z`&?1&SP2<&%Jb`Fz1zvh$S(d*^#S{}BOsyJx@tC27eEX5iz9AC$Wg|=$Y&70V)~n~ zRZ?YpZPiI7VoJh{g*tXVH%wm~Rl=)sfj)+Qc&Z%_He)+Qi$_C?S>m|C)&UyjhhcF8W^(kEY_?w1t<`feTCkXTwr6YI=YW+ z=^}m~tD|iyI-$0x;*B&$ILVf#4Z_kC7fS9m2Oz4V)s-4UPtaT$rW1Q@xqTD7c~R#L z%MIHbAiJ8cPY{(FlF(GUWnMKl;im66O89)+7M81AR>a-zay<|6ix;|0otYlNO{ySlWt_lwcl z&>hjupwJsUllK~!%@tOfUllLv$_8YY7MD;MB;57VFf(%W7 zw^P=aM;uU}GgTIV{ZjS75_GO=QN$TY7Xr%chXYlSUFr-nN!thscEA>wQyFx(}k6Il!Z0% z&JPylJom(U)foSayZ?d@{a(jtk`N~wgq=8BN=~=PQYa=YH==bHwXchH&Brk6j&c|2 zNgc&6%5fPRPLn4^y{9*?7Liy4m3m81{r>I$j9nPu9w2%A|HlQ(e-%pqfr|}Mv=0vV z%0V?$PG~ERGIM#5Zw?Ih4 zmoeCzR9?O>16pHc2W2L3Ik#&K9Vd6$E&??@fBxLIe5vlm5rauBY^58LQPu^d_ObNk zbwBqS2p#;mAH7g&c9+Pqdnks^Q4c-ztR2XmzHt_f$|xx+s@C>0wGUiIX*FEX41~{% zbPsS6V0TmF8Lf7na)2FluQuvZj>IJuqi?XcEMsZz?e_7Akd$iqACnB|j=7!>55Q}1 zEt3woX7{?-?X-5(HjnzP+-3mJt)x`C`{hTPee5AWa7PPpHxqO&@tj7=?|&-dm{l;? zo>QM+DZ>O`(1`FU5MvF?n07CgY6NKe^ddh$nu7pOlGb5 zi!SwF2QKRg_mlV2UZaRKVDmwMO&O#F&T= zfm5i-?qQ=ZC>J_u^li{cYpT`-nV~<|PR6yLw*MmZ^yP)wkEOhkhk3TrlFF;x*Q+e| zM6>~5meo3AA!!8S_C@%JI1t!~zF+>vKXUe!Sw6${vR@W$dOr->oBTqIJ)CcJXco&a zWX~+e@i*aV$CJ*lczq?hw?0~U-~bt62s5cmnoZUw*tRScS&sTBl4ys`Zq7;8rYqX4 z8kvO=sy}B?;w5dbby@D0-`gnX5o*Z4iQX81+huC6Re#XRj@!@>N6Wmm+g0Cbs-UE85H& z8=b|-7K%9ayBG@V>vzs?D>f{6WghM@9A&WND_hpKtiFVMS1?HNJYd%rBomuo8>n?b1Un#$OAdUn<}E^=krphH_y_;-qGz~PAb5}y%gRWV5O$@o`Z{5cA^no%154s3 z#$pZ7e?uuLZ<2PXz!jd$9BW{>tATcddHEIJDIKW`ZeW z9_CHpkkWGqE2K2i2l6px_W`M#mHkE`9TxNx5L1h21MrfkE7I*|Favza_Ns2S*`1zL zOfXGMmAGO$tYt(k!v~C(A$1yzJOid#Mo>`Q8VfQ5s#V@1giG1}=ODU^X1MQVs!n)Q z1f3yI@w7TrUNFK}1!!VUm|LqEx1d^tU%O1p<%f#7LQX)N_{QlSH69TX{VH%}hXEmWZY60R0?iRdLtyZwHs92T z7%chQsT|(LgWZvJpq$v^K|QT4tIa$N0VVrEwS(TI7tUacvVPRf&|oE@FwWOEjfJ*Uqmc|@B6C*&3!>xw52JMb7}E&mtX0v>E1deK)E$E~OmWunTU`7~j|Kwk!0Ni>USMYY!cK0ILiw`ċc@ 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