From 19f4b0abc4c7297337b17b8ecd61599505c80169 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sat, 20 May 2023 13:49:58 +0000 Subject: [PATCH] Add changelog --- app/build.gradle | 14 +- .../io/xpipe/app/browser/BookmarkList.java | 84 ------ ...eBrowserAlerts.java => BrowserAlerts.java} | 2 +- .../app/browser/BrowserBookmarkList.java | 155 ++++++++++ .../app/browser/BrowserBreadcrumbBar.java | 92 ++++++ ...erClipboard.java => BrowserClipboard.java} | 2 +- ...{FileBrowserComp.java => BrowserComp.java} | 124 ++++---- .../xpipe/app/browser/BrowserContextMenu.java | 82 +++++ .../io/xpipe/app/browser/BrowserEntry.java | 67 +++++ ...ListComp.java => BrowserFileListComp.java} | 280 ++++++++++-------- ...try.java => BrowserFileListCompEntry.java} | 81 ++--- .../app/browser/BrowserFileListModel.java | 131 ++++++++ ...FilterComp.java => BrowserFilterComp.java} | 44 +-- ...rowserHistory.java => BrowserHistory.java} | 4 +- .../io/xpipe/app/browser/BrowserModel.java | 141 +++++++++ .../io/xpipe/app/browser/BrowserNavBar.java | 57 ++++ ...omp.java => BrowserSelectionListComp.java} | 4 +- ...BarComp.java => BrowserStatusBarComp.java} | 20 +- ...sferComp.java => BrowserTransferComp.java} | 12 +- ...erStage.java => BrowserTransferModel.java} | 2 +- .../xpipe/app/browser/FileBrowserModel.java | 103 ------- .../io/xpipe/app/browser/FileContextMenu.java | 193 ------------ .../io/xpipe/app/browser/FileListModel.java | 123 -------- .../xpipe/app/browser/FileSystemHelper.java | 20 +- .../app/browser/OpenFileSystemCache.java | 29 ++ .../xpipe/app/browser/OpenFileSystemComp.java | 132 ++------- .../app/browser/OpenFileSystemModel.java | 186 +++++++++--- .../app/browser/OpenFileSystemSavedState.java | 15 + .../app/browser/StandaloneFileBrowser.java | 8 +- .../browser/action/ApplicationPathAction.java | 27 ++ .../app/browser/action/BranchAction.java | 8 + .../app/browser/action/BrowserAction.java | 88 ++++++ .../action/ExecuteApplicationAction.java | 29 ++ .../xpipe/app/browser/action/LeafAction.java | 38 +++ .../browser/action/MultiExecuteAction.java | 96 ++++++ .../xpipe/app/browser/icon/BrowserIcons.java | 21 ++ .../xpipe/app/browser/icon/DirectoryType.java | 101 +++++++ .../app/browser/icon/FileIconFactory.java | 29 -- .../app/browser/icon/FileIconManager.java | 90 +----- .../io/xpipe/app/browser/icon/FileIcons.java | 12 - .../io/xpipe/app/browser/icon/FileType.java | 87 ++++++ .../app/browser/icon/FolderIconFactory.java | 36 --- .../java/io/xpipe/app/comp/AppLayoutComp.java | 8 +- .../java/io/xpipe/app/comp/PrefsComp.java | 24 +- .../xpipe/app/comp/base/ErrorOverlayComp.java | 44 +++ .../io/xpipe/app/comp/base/MessageComp.java | 77 ----- .../xpipe/app/comp/base/ModalOverlayComp.java | 107 +++++++ .../comp/source/store/GuiDsStoreCreator.java | 41 ++- .../SourceCollectionContextMenu.java | 22 +- .../source/SourceEntryContextMenu.java | 13 +- .../comp/storage/store/StoreEntryComp.java | 16 +- .../comp/storage/store/StoreEntryTree.java | 36 +++ app/src/main/java/io/xpipe/app/core/App.java | 2 +- .../main/java/io/xpipe/app/core/AppStyle.java | 38 --- .../main/java/io/xpipe/app/core/AppTheme.java | 142 +++++++++ .../io/xpipe/app/core/mode/OperationMode.java | 2 + .../io/xpipe/app/core/mode/PlatformMode.java | 1 + .../fxcomps/augment/ContextMenuAugment.java | 43 +++ .../app/fxcomps/augment/PopupMenuAugment.java | 31 -- .../io/xpipe/app/fxcomps/impl/SvgView.java | 2 +- .../io/xpipe/app/fxcomps/util/Shortcuts.java | 22 +- .../io/xpipe/app/launcher/LauncherInput.java | 5 +- .../java/io/xpipe/app/prefs/AppPrefs.java | 17 +- .../app/prefs/ExternalApplicationType.java | 5 + .../xpipe/app/prefs/ExternalEditorType.java | 25 +- .../xpipe/app/prefs/ExternalTerminalType.java | 116 ++++---- .../prefs/TranslatableComboBoxControl.java | 2 +- .../java/io/xpipe/app/util/Containers.java | 64 ---- .../main/java/io/xpipe/app/util/Controls.java | 73 ----- .../xpipe/app/util/HumanReadableFormat.java | 2 - .../io/xpipe/app/util/MacOsPermissions.java | 7 +- .../java/io/xpipe/app/util/ScriptHelper.java | 7 +- app/src/main/java/module-info.java | 6 + .../{browser_icons => }/file_list.txt | 0 .../{browser_icons => }/folder_list.txt | 0 .../resources/lang/translations_en.properties | 5 + .../io/xpipe/app/resources/style/browser.css | 73 ++++- .../app/resources/style/data-store-step.css | 2 +- .../resources/style/error-overlay-comp.css | 5 + .../resources/style/modal-overlay-comp.css | 18 ++ .../app/resources/style/multi-step-comp.css | 4 + .../io/xpipe/app/resources/style/style.css | 15 - .../java/io/xpipe/core/impl/FileNames.java | 40 ++- .../java/io/xpipe/core/process/OsType.java | 35 ++- .../io/xpipe/core/process/ShellControl.java | 70 +++-- .../io/xpipe/core/util/XPipeSystemId.java | 44 +++ dist/changelogs/1.0.0.md | 6 + dist/licenses/java-annotations.license | 177 +++++++++++ dist/licenses/java-annotations.properties | 4 + dist/licenses/jfa.license | 177 +++++++++++ dist/licenses/jfa.properties | 4 + dist/licenses/jsystemthemedetector.license | 177 +++++++++++ dist/licenses/jsystemthemedetector.properties | 4 + dist/licenses/oshi.license | 21 ++ dist/licenses/oshi.properties | 4 + ext/base/build.gradle | 6 + .../browser/BrowseInNativeManagerAction.java | 66 +++++ .../io/xpipe/ext/base/browser/CopyAction.java | 47 +++ .../ext/base/browser/CopyPathAction.java | 113 +++++++ .../xpipe/ext/base/browser/DeleteAction.java | 48 +++ .../ext/base/browser/EditFileAction.java | 41 +++ .../ext/base/browser/FileTypeAction.java | 26 ++ .../io/xpipe/ext/base/browser/JarAction.java | 41 +++ .../io/xpipe/ext/base/browser/JavaAction.java | 21 ++ .../xpipe/ext/base/browser/NewItemAction.java | 94 ++++++ .../ext/base/browser/OpenDirectoryAction.java | 45 +++ .../browser/OpenDirectoryInNewTabAction.java | 50 ++++ .../base/browser/OpenFileDefaultAction.java | 48 +++ .../ext/base/browser/OpenFileWithAction.java | 73 +++++ .../browser/OpenNativeFileDetailsAction.java | 69 +++++ .../ext/base/browser/OpenTerminalAction.java | 53 ++++ .../xpipe/ext/base/browser/PasteAction.java | 63 ++++ .../xpipe/ext/base/browser/RenameAction.java | 45 +++ .../io/xpipe/ext/base/browser/RunAction.java | 66 +++++ .../xpipe/ext/base/browser/UnzipAction.java | 37 +++ ext/base/src/main/java/module-info.java | 23 ++ .../resources/lang/translations_en.properties | 2 + .../gradle_scripts/atlantafx-base-1.2.1.jar | Bin 0 -> 378704 bytes .../gradle_scripts/atlantafx-styles-1.2.1.jar | Bin 0 -> 76601 bytes .../jSystemThemeDetector-3.8.jar | Bin 0 -> 17691 bytes gradle/gradle_scripts/versioncompare.gradle | 19 ++ version | 2 +- 122 files changed, 4263 insertions(+), 1589 deletions(-) delete mode 100644 app/src/main/java/io/xpipe/app/browser/BookmarkList.java rename app/src/main/java/io/xpipe/app/browser/{FileBrowserAlerts.java => BrowserAlerts.java} (98%) create mode 100644 app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java create mode 100644 app/src/main/java/io/xpipe/app/browser/BrowserBreadcrumbBar.java rename app/src/main/java/io/xpipe/app/browser/{FileBrowserClipboard.java => BrowserClipboard.java} (98%) rename app/src/main/java/io/xpipe/app/browser/{FileBrowserComp.java => BrowserComp.java} (70%) create mode 100644 app/src/main/java/io/xpipe/app/browser/BrowserContextMenu.java create mode 100644 app/src/main/java/io/xpipe/app/browser/BrowserEntry.java rename app/src/main/java/io/xpipe/app/browser/{FileListComp.java => BrowserFileListComp.java} (63%) rename app/src/main/java/io/xpipe/app/browser/{FileListCompEntry.java => BrowserFileListCompEntry.java} (70%) create mode 100644 app/src/main/java/io/xpipe/app/browser/BrowserFileListModel.java rename app/src/main/java/io/xpipe/app/browser/{FileFilterComp.java => BrowserFilterComp.java} (76%) rename app/src/main/java/io/xpipe/app/browser/{FileBrowserHistory.java => BrowserHistory.java} (96%) create mode 100644 app/src/main/java/io/xpipe/app/browser/BrowserModel.java create mode 100644 app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java rename app/src/main/java/io/xpipe/app/browser/{SelectedFileListComp.java => BrowserSelectionListComp.java} (93%) rename app/src/main/java/io/xpipe/app/browser/{FileBrowserStatusBarComp.java => BrowserStatusBarComp.java} (69%) rename app/src/main/java/io/xpipe/app/browser/{LocalFileTransferComp.java => BrowserTransferComp.java} (90%) rename app/src/main/java/io/xpipe/app/browser/{LocalFileTransferStage.java => BrowserTransferModel.java} (98%) delete mode 100644 app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java delete mode 100644 app/src/main/java/io/xpipe/app/browser/FileContextMenu.java delete mode 100644 app/src/main/java/io/xpipe/app/browser/FileListModel.java create mode 100644 app/src/main/java/io/xpipe/app/browser/OpenFileSystemCache.java create mode 100644 app/src/main/java/io/xpipe/app/browser/OpenFileSystemSavedState.java create mode 100644 app/src/main/java/io/xpipe/app/browser/action/ApplicationPathAction.java create mode 100644 app/src/main/java/io/xpipe/app/browser/action/BranchAction.java create mode 100644 app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java create mode 100644 app/src/main/java/io/xpipe/app/browser/action/ExecuteApplicationAction.java create mode 100644 app/src/main/java/io/xpipe/app/browser/action/LeafAction.java create mode 100644 app/src/main/java/io/xpipe/app/browser/action/MultiExecuteAction.java create mode 100644 app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java create mode 100644 app/src/main/java/io/xpipe/app/browser/icon/DirectoryType.java delete mode 100644 app/src/main/java/io/xpipe/app/browser/icon/FileIconFactory.java delete mode 100644 app/src/main/java/io/xpipe/app/browser/icon/FileIcons.java create mode 100644 app/src/main/java/io/xpipe/app/browser/icon/FileType.java delete mode 100644 app/src/main/java/io/xpipe/app/browser/icon/FolderIconFactory.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/ErrorOverlayComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/base/MessageComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryTree.java create mode 100644 app/src/main/java/io/xpipe/app/core/AppTheme.java create mode 100644 app/src/main/java/io/xpipe/app/fxcomps/augment/ContextMenuAugment.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/augment/PopupMenuAugment.java delete mode 100644 app/src/main/java/io/xpipe/app/util/Containers.java delete mode 100644 app/src/main/java/io/xpipe/app/util/Controls.java rename app/src/main/resources/io/xpipe/app/resources/{browser_icons => }/file_list.txt (100%) rename app/src/main/resources/io/xpipe/app/resources/{browser_icons => }/folder_list.txt (100%) create mode 100644 app/src/main/resources/io/xpipe/app/resources/style/error-overlay-comp.css create mode 100644 app/src/main/resources/io/xpipe/app/resources/style/modal-overlay-comp.css create mode 100644 core/src/main/java/io/xpipe/core/util/XPipeSystemId.java create mode 100644 dist/changelogs/1.0.0.md create mode 100644 dist/licenses/java-annotations.license create mode 100644 dist/licenses/java-annotations.properties create mode 100644 dist/licenses/jfa.license create mode 100644 dist/licenses/jfa.properties create mode 100644 dist/licenses/jsystemthemedetector.license create mode 100644 dist/licenses/jsystemthemedetector.properties create mode 100644 dist/licenses/oshi.license create mode 100644 dist/licenses/oshi.properties create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/CopyAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/CopyPathAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/DeleteAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/EditFileAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/FileTypeAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/JavaAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/NewItemAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryInNewTabAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileDefaultAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileWithAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/OpenTerminalAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/PasteAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java create mode 100644 gradle/gradle_scripts/atlantafx-base-1.2.1.jar create mode 100644 gradle/gradle_scripts/atlantafx-styles-1.2.1.jar create mode 100644 gradle/gradle_scripts/jSystemThemeDetector-3.8.jar create mode 100644 gradle/gradle_scripts/versioncompare.gradle diff --git a/app/build.gradle b/app/build.gradle index b6ceb5f3..6493dae3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,6 +24,7 @@ apply from: "$rootDir/gradle/gradle_scripts/lombok.gradle" apply from: "$projectDir/gradle_scripts/github-api.gradle" apply from: "$projectDir/gradle_scripts/flexmark.gradle" apply from: "$rootDir/gradle/gradle_scripts/picocli.gradle" +apply from: "$rootDir/gradle/gradle_scripts/versioncompare.gradle" configurations { implementation.extendsFrom(dep) @@ -38,8 +39,8 @@ dependencies { compileOnly 'org.junit.jupiter:junit-jupiter-api:5.9.0' compileOnly 'org.junit.jupiter:junit-jupiter-params:5.9.0' - implementation 'net.java.dev.jna:jna-jpms:5.12.1' - implementation 'net.java.dev.jna:jna-platform-jpms:5.12.1' + implementation 'net.java.dev.jna:jna-jpms:5.13.0' + implementation 'net.java.dev.jna:jna-platform-jpms:5.13.0' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "2.13.0" implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-parameter-names', version: "2.13.0" implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: "2.13.0" @@ -56,7 +57,14 @@ dependencies { implementation 'com.jfoenix:jfoenix:9.0.10' implementation 'org.controlsfx:controlsfx:11.1.1' implementation 'net.synedra:validatorfx:0.3.1' - implementation 'io.github.mkpaz:atlantafx-base:1.2.0' + implementation name: 'atlantafx-base-1.2.1' + implementation name: 'atlantafx-styles-1.2.1' + implementation name: 'jSystemThemeDetector-3.8' + implementation group: 'com.github.oshi', name: 'oshi-core-java11', version: '6.4.2' + implementation 'org.jetbrains:annotations:24.0.1' + implementation ('de.jangassen:jfa:1.2.0') { + exclude group: 'net.java.dev.jna', module: 'jna' + } } apply from: "$rootDir/gradle/gradle_scripts/junit.gradle" diff --git a/app/src/main/java/io/xpipe/app/browser/BookmarkList.java b/app/src/main/java/io/xpipe/app/browser/BookmarkList.java deleted file mode 100644 index ed2c6af6..00000000 --- a/app/src/main/java/io/xpipe/app/browser/BookmarkList.java +++ /dev/null @@ -1,84 +0,0 @@ -package io.xpipe.app.browser; - -import io.xpipe.app.comp.base.ListBoxViewComp; -import io.xpipe.app.comp.storage.store.StoreEntryFlatMiniSectionComp; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.fxcomps.augment.DragPseudoClassAugment; -import io.xpipe.app.fxcomps.augment.GrowAugment; -import io.xpipe.app.fxcomps.util.BindingsHelper; -import io.xpipe.core.store.DataStore; -import io.xpipe.core.store.ShellStore; -import javafx.application.Platform; -import javafx.geometry.Point2D; -import javafx.scene.control.Button; -import javafx.scene.input.DragEvent; -import javafx.scene.layout.Region; - -import java.util.Timer; -import java.util.TimerTask; - -final class BookmarkList extends SimpleComp { - - public static final Timer DROP_TIMER = new Timer("dnd", true); - private Point2D lastOver = new Point2D(-1, -1); - private TimerTask activeTask; - - private final FileBrowserModel model; - - BookmarkList(FileBrowserModel model) { - this.model = model; - } - - @Override - protected Region createSimple() { - var observableList = BindingsHelper.filteredContentBinding(StoreEntryFlatMiniSectionComp.ALL, e -> e.getEntry().getState().isUsable()); - var list = new ListBoxViewComp<>(observableList, observableList, e -> { - return Comp.of(() -> { - var button = new Button(null, e.createRegion()); - - if (!(e.getEntry().getStore() instanceof ShellStore)) { - button.setDisable(true); - } - - button.setOnAction(event -> { - var fileSystem = ((ShellStore) e.getEntry().getStore()); - model.openFileSystemAsync(fileSystem); - event.consume(); - }); - GrowAugment.create(true, false).augment(new SimpleCompStructure<>(button)); - DragPseudoClassAugment.create().augment(new SimpleCompStructure<>(button)); - - button.addEventHandler( - DragEvent.DRAG_OVER, - mouseEvent -> handleHoverTimer(e.getEntry().getStore(), mouseEvent)); - button.addEventHandler( - DragEvent.DRAG_EXITED, - mouseEvent -> activeTask = null); - - return button; - }); - }).styleClass("bookmark-list").createRegion(); - return list; - } - - private void handleHoverTimer(DataStore store, DragEvent event) { - if (lastOver.getX() == event.getX() && lastOver.getY() == event.getY()) { - return; - } - - lastOver = (new Point2D(event.getX(), event.getY())); - activeTask = new TimerTask() { - @Override - public void run() { - if (activeTask != this) { - return; - } - - Platform.runLater(() -> model.openExistingFileSystemIfPresent(store.asNeeded())); - } - }; - DROP_TIMER.schedule(activeTask, 500); - } -} diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserAlerts.java b/app/src/main/java/io/xpipe/app/browser/BrowserAlerts.java similarity index 98% rename from app/src/main/java/io/xpipe/app/browser/FileBrowserAlerts.java rename to app/src/main/java/io/xpipe/app/browser/BrowserAlerts.java index f28fd3fa..7d9c33b1 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserAlerts.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserAlerts.java @@ -8,7 +8,7 @@ import javafx.scene.control.Alert; import java.util.List; import java.util.stream.Collectors; -public class FileBrowserAlerts { +public class BrowserAlerts { public static boolean showMoveAlert(List source, FileSystem.FileEntry target) { if (source.stream().noneMatch(entry -> entry.isDirectory())) { diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java b/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java new file mode 100644 index 00000000..80b5f9d1 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java @@ -0,0 +1,155 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.comp.storage.store.StoreEntryTree; +import io.xpipe.app.comp.storage.store.StoreEntryWrapper; +import io.xpipe.app.comp.storage.store.StoreViewState; +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.impl.PrettyImageComp; +import io.xpipe.core.store.DataStore; +import io.xpipe.core.store.ShellStore; +import javafx.application.Platform; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.geometry.Point2D; +import javafx.scene.Node; +import javafx.scene.control.TreeCell; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeView; +import javafx.scene.input.DragEvent; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.Region; + +import java.util.Timer; +import java.util.TimerTask; + +final class BrowserBookmarkList extends SimpleComp { + + public static final Timer DROP_TIMER = new Timer("dnd", true); + private Point2D lastOver = new Point2D(-1, -1); + private TimerTask activeTask; + + private final BrowserModel model; + + BrowserBookmarkList(BrowserModel model) { + this.model = model; + } + + @Override + protected Region createSimple() { + var root = StoreEntryTree.createTree(); + var view = new TreeView(root); + view.setShowRoot(false); + view.getStyleClass().add("bookmark-list"); + view.setCellFactory(param -> { + return new StoreCell(); + }); + + model.getSelected().addListener((observable, oldValue, newValue) -> { + if (newValue == null) { + view.getSelectionModel().clearSelection(); + return; + } + + view.getSelectionModel() + .select(getTreeViewItem( + root, + StoreViewState.get().getAllEntries().stream() + .filter(storeEntryWrapper -> storeEntryWrapper + .getState() + .getValue() + .isUsable() + && storeEntryWrapper + .getEntry() + .getStore() + .equals(newValue.getStore())) + .findAny() + .orElse(null))); + }); + + return view; + } + + private static TreeItem getTreeViewItem( + TreeItem item, StoreEntryWrapper value) { + if (item.getValue() != null && item.getValue().equals(value)) { + return item; + } + + for (TreeItem child : item.getChildren()) { + TreeItem s = getTreeViewItem(child, value); + if (s != null) { + return s; + } + } + return null; + } + + private final class StoreCell extends TreeCell { + + private final StringProperty img = new SimpleStringProperty(); + private final Node imageView = new PrettyImageComp(img, 20, 20).createRegion(); + + private StoreCell() { + setGraphic(imageView); + addEventHandler(DragEvent.DRAG_OVER, mouseEvent -> { + if (getItem() == null) { + return; + } + + handleHoverTimer(getItem().getEntry().getStore(), mouseEvent); + mouseEvent.consume(); + }); + addEventHandler(DragEvent.DRAG_EXITED, mouseEvent -> { + activeTask = null; + mouseEvent.consume(); + }); + addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { + if (getItem() == null || event.getButton() != MouseButton.PRIMARY) { + return; + } + + var fileSystem = ((ShellStore) getItem().getEntry().getStore()); + model.openFileSystemAsync(fileSystem, null); + event.consume(); + }); + } + + @Override + public void updateItem(StoreEntryWrapper item, boolean empty) { + super.updateItem(item, empty); + if (empty || item == null) { + setText(null); + // Don't set image as that would trigger image comp update + // and cells are emptied on each change, leading to unnecessary changes + // img.set(null); + setGraphic(null); + } else { + setText(item.getName()); + img.set(item.getEntry() + .getProvider() + .getDisplayIconFileName(item.getEntry().getStore())); + setGraphic(imageView); + } + } + } + + private void handleHoverTimer(DataStore store, DragEvent event) { + if (lastOver.getX() == event.getX() && lastOver.getY() == event.getY()) { + return; + } + + lastOver = (new Point2D(event.getX(), event.getY())); + activeTask = new TimerTask() { + @Override + public void run() { + if (activeTask != this) { + return; + } + + Platform.runLater(() -> model.openExistingFileSystemIfPresent(store.asNeeded())); + } + }; + DROP_TIMER.schedule(activeTask, 500); + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserBreadcrumbBar.java b/app/src/main/java/io/xpipe/app/browser/BrowserBreadcrumbBar.java new file mode 100644 index 00000000..9193a4d2 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/BrowserBreadcrumbBar.java @@ -0,0 +1,92 @@ +package io.xpipe.app.browser; + +import atlantafx.base.controls.Breadcrumbs; +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.fxcomps.util.SimpleChangeListener; +import io.xpipe.core.impl.FileNames; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonBase; +import javafx.scene.control.Label; +import javafx.scene.layout.Region; +import javafx.util.Callback; + +import java.util.ArrayList; + +public class BrowserBreadcrumbBar extends SimpleComp { + + private final OpenFileSystemModel model; + + public BrowserBreadcrumbBar(OpenFileSystemModel model) { + this.model = model; + } + + @Override + protected Region createSimple() { + Callback, ButtonBase> crumbFactory = crumb -> { + var name = crumb.getValue().equals("/") + ? "/" + : FileNames.getFileName(crumb.getValue()); + var btn = new Button(name, null); + btn.setMnemonicParsing(false); + btn.setFocusTraversable(false); + return btn; + }; + return createBreadcrumbs(crumbFactory, null); + } + + private Region createBreadcrumbs( + Callback, ButtonBase> crumbFactory, + Callback, ? extends Node> dividerFactory) { + + var breadcrumbs = new Breadcrumbs(); + SimpleChangeListener.apply(PlatformThread.sync(model.getCurrentPath()), val -> { + if (val == null) { + breadcrumbs.setSelectedCrumb(null); + return; + } + + var sc = model.getFileSystem().getShell(); + if (sc.isEmpty()) { + breadcrumbs.setDividerFactory(item -> item != null && !item.isLast() ? new Label("/") : null); + } else { + breadcrumbs.setDividerFactory(item -> { + if (item == null) { + return null; + } + + if (item.isFirst() && item.getValue().equals("/")) { + return new Label(""); + } + + return new Label(sc.get().getOsType().getFileSystemSeparator()); + }); + } + + var elements = FileNames.splitHierarchy(val); + var modifiedElements = new ArrayList<>(elements); + if (val.startsWith("/")) { + modifiedElements.add(0, "/"); + } + Breadcrumbs.BreadCrumbItem items = + Breadcrumbs.buildTreeModel(modifiedElements.toArray(String[]::new)); + breadcrumbs.setSelectedCrumb(items); + }); + + if (crumbFactory != null) { + breadcrumbs.setCrumbFactory(crumbFactory); + } + if (dividerFactory != null) { + breadcrumbs.setDividerFactory(dividerFactory); + } + + breadcrumbs.selectedCrumbProperty().addListener((obs, old, val) -> { + model.cd(val != null ? val.getValue() : null).ifPresent(s -> { + model.cd(s); + }); + }); + + return breadcrumbs; + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserClipboard.java b/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java similarity index 98% rename from app/src/main/java/io/xpipe/app/browser/FileBrowserClipboard.java rename to app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java index 7a705970..85f6ca4b 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserClipboard.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -public class FileBrowserClipboard { +public class BrowserClipboard { @Value public static class Instance { diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserComp.java similarity index 70% rename from app/src/main/java/io/xpipe/app/browser/FileBrowserComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserComp.java index dc72b1a8..a4723c50 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserComp.java @@ -3,7 +3,9 @@ package io.xpipe.app.browser; import atlantafx.base.controls.RingProgressIndicator; import atlantafx.base.controls.Spacer; import atlantafx.base.theme.Styles; +import io.xpipe.app.browser.icon.DirectoryType; import io.xpipe.app.browser.icon.FileIconManager; +import io.xpipe.app.browser.icon.FileType; import io.xpipe.app.fxcomps.SimpleComp; import io.xpipe.app.fxcomps.SimpleCompStructure; import io.xpipe.app.fxcomps.augment.GrowAugment; @@ -12,10 +14,10 @@ import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.BusyProperty; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.store.FileSystem; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleStringProperty; import javafx.collections.ListChangeListener; import javafx.event.EventHandler; import javafx.geometry.Insets; @@ -32,29 +34,44 @@ import static atlantafx.base.theme.Styles.DENSE; import static atlantafx.base.theme.Styles.toggleStyleClass; import static javafx.scene.control.TabPane.TabClosingPolicy.ALL_TABS; -public class FileBrowserComp extends SimpleComp { +public class BrowserComp extends SimpleComp { - private final FileBrowserModel model; + private final BrowserModel model; - public FileBrowserComp(FileBrowserModel model) { + public BrowserComp(BrowserModel model) { this.model = model; } @Override protected Region createSimple() { - ThreadHelper.runAsync( () -> { + FileType.loadDefinitions(); + DirectoryType.loadDefinitions(); + ThreadHelper.runAsync(() -> { FileIconManager.loadIfNecessary(); }); - var bookmarksList = new BookmarkList(model).createRegion(); + var bookmarksList = new BrowserBookmarkList(model).createRegion(); VBox.setVgrow(bookmarksList, Priority.ALWAYS); - var localDownloadStage = new LocalFileTransferComp(model.getLocalTransfersStage()).hide(Bindings.createBooleanBinding(() -> { - if (model.getOpenFileSystems().size() == 0) { - return true; - } + var localDownloadStage = new BrowserTransferComp(model.getLocalTransfersStage()) + .hide(PlatformThread.sync(Bindings.createBooleanBinding( + () -> { + if (model.getOpenFileSystems().size() == 0) { + return true; + } - return !model.getMode().equals(FileBrowserModel.Mode.BROWSER); - }, PlatformThread.sync(model.getOpenFileSystems()))).createRegion(); + if (model.getMode().isChooser()) { + return true; + } + + if (model.getSelected().getValue() != null) { + return model.getSelected().getValue().isLocal(); + } + + return false; + }, + model.getOpenFileSystems(), + model.getSelected()))) + .createRegion(); var vertical = new VBox(bookmarksList, localDownloadStage); vertical.setFillWidth(true); @@ -63,13 +80,16 @@ public class FileBrowserComp extends SimpleComp { .widthProperty() .addListener( // set sidebar width in pixels depending on split pane width - (obs, old, val) -> splitPane.setDividerPosition(0, 230 / splitPane.getWidth())); + (obs, old, val) -> splitPane.setDividerPosition(0, 280 / splitPane.getWidth())); - return addBottomBar(splitPane); + var r = addBottomBar(splitPane); + r.getStyleClass().add("browser"); + // AppFont.small(r); + return r; } private Region addBottomBar(Region r) { - if (model.getMode().equals(FileBrowserModel.Mode.BROWSER)) { + if (!model.getMode().isChooser()) { return r; } @@ -78,13 +98,18 @@ public class FileBrowserComp extends SimpleComp { var selected = new HBox(); selected.setAlignment(Pos.CENTER_LEFT); selected.setSpacing(10); - model.getSelectedFiles().addListener((ListChangeListener) c -> { - selected.getChildren().setAll(c.getList().stream().map(s -> { - var field = new TextField(s.getPath()); - field.setEditable(false); - field.setPrefWidth(400); - return field; - }).toList()); + model.getSelection().addListener((ListChangeListener) c -> { + PlatformThread.runLaterIfNeeded(() -> { + selected.getChildren() + .setAll(c.getList().stream() + .map(s -> { + var field = new TextField(s.getRawFileEntry().getPath()); + field.setEditable(false); + field.setPrefWidth(400); + return field; + }) + .toList()); + }); }); var spacer = new Spacer(Orientation.HORIZONTAL); var button = new Button("Select"); @@ -114,7 +139,8 @@ public class FileBrowserComp extends SimpleComp { map.put(v, t); tabs.getTabs().add(t); }); - tabs.getSelectionModel().select(model.getOpenFileSystems().indexOf(model.getSelected().getValue())); + tabs.getSelectionModel() + .select(model.getOpenFileSystems().indexOf(model.getSelected().getValue())); // Used for ignoring changes by the tabpane when new tabs are added. We want to perform the selections manually! var modifying = new SimpleBooleanProperty(); @@ -177,12 +203,10 @@ public class FileBrowserComp extends SimpleComp { continue; } - model.closeFileSystem(source.getKey()); + model.closeFileSystemAsync(source.getKey()); } } }); - - stack.getStyleClass().add("browser"); return stack; } @@ -190,16 +214,9 @@ public class FileBrowserComp extends SimpleComp { var tabs = new TabPane(); tabs.setTabDragPolicy(TabPane.TabDragPolicy.REORDER); tabs.setTabMinWidth(Region.USE_COMPUTED_SIZE); - - if (!model.getMode().equals(FileBrowserModel.Mode.BROWSER)) { - tabs.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); - tabs.getStyleClass().add("singular"); - } else { - tabs.setTabClosingPolicy(ALL_TABS); - Styles.toggleStyleClass(tabs, TabPane.STYLE_CLASS_FLOATING); - toggleStyleClass(tabs, DENSE); - } - + tabs.setTabClosingPolicy(ALL_TABS); + Styles.toggleStyleClass(tabs, TabPane.STYLE_CLASS_FLOATING); + toggleStyleClass(tabs, DENSE); return tabs; } @@ -214,29 +231,14 @@ public class FileBrowserComp extends SimpleComp { .bind(Bindings.createDoubleBinding( () -> model.getBusy().get() ? -1d : 0, PlatformThread.sync(model.getBusy()))); - var name = Bindings.createStringBinding( - () -> { - return model.getStore().getValue() != null - ? DataStorage.get() - .getStoreEntry(model.getStore().getValue()) - .getName() - : null; - }, - PlatformThread.sync(model.getStore())); - var image = Bindings.createStringBinding( - () -> { - return model.getStore().getValue() != null - ? DataStorage.get() - .getStoreEntry(model.getStore().getValue()) - .getProvider() - .getDisplayIconFileName(model.getStore().getValue()) - : null; - }, - model.getStore()); - var logo = new PrettyImageComp(image, 20, 20).createRegion(); + var name = DataStorage.get().getStoreEntry(model.getStore()).getName(); + var image = DataStorage.get() + .getStoreEntry(model.getStore()) + .getProvider() + .getDisplayIconFileName(model.getStore()); + var logo = new PrettyImageComp(new SimpleStringProperty(image), 20, 20).createRegion(); - var label = new Label(); - label.textProperty().bind(name); + var label = new Label(name); label.addEventHandler(DragEvent.DRAG_ENTERED, new EventHandler() { @Override public void handle(DragEvent mouseEvent) { @@ -253,12 +255,6 @@ public class FileBrowserComp extends SimpleComp { tab.setGraphic(label); GrowAugment.create(true, false).augment(new SimpleCompStructure<>(label)); - - if (!this.model.getMode().equals(FileBrowserModel.Mode.BROWSER)) { - label.setManaged(false); - label.setVisible(false); - } - tab.setContent(new OpenFileSystemComp(model).createSimple()); return tab; } diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserContextMenu.java b/app/src/main/java/io/xpipe/app/browser/BrowserContextMenu.java new file mode 100644 index 00000000..756c70e5 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/BrowserContextMenu.java @@ -0,0 +1,82 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.browser.action.BranchAction; +import io.xpipe.app.browser.action.BrowserAction; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.app.core.AppFont; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.Menu; +import javafx.scene.control.SeparatorMenuItem; + +import java.util.ArrayList; +import java.util.List; + +final class BrowserContextMenu extends ContextMenu { + + private final OpenFileSystemModel model; + private final BrowserEntry source; + + public BrowserContextMenu(OpenFileSystemModel model, BrowserEntry source) { + this.model = model; + this.source = source; + createMenu(); + } + + private void createMenu() { + AppFont.normal(this.getStyleableNode()); + + var empty = source == null; + var selected = new ArrayList<>(empty ? List.of() : model.getFileList().getSelection()); + if (source != null && !selected.contains(source)) { + selected.add(source); + } else if (source == null && model.getFileList().getSelection().isEmpty()) { + selected.add(new BrowserEntry(model.getCurrentDirectory(), model.getFileList(), false)); + } + + for (BrowserAction.Category cat : BrowserAction.Category.values()) { + var all = BrowserAction.ALL.stream() + .filter(browserAction -> browserAction.getCategory() == cat) + .filter(browserAction -> { + if (!browserAction.isApplicable(model, selected)) { + return false; + } + + if (!browserAction.acceptsEmptySelection() && empty) { + return false; + } + + return true; + }) + .toList(); + if (all.size() == 0) { + continue; + } + + if (getItems().size() > 0) { + getItems().add(new SeparatorMenuItem()); + } + + for (BrowserAction a : all) { + if (a instanceof LeafAction la) { + getItems().add(la.toItem(model, selected, s -> s)); + } + + if (a instanceof BranchAction la) { + var m = new Menu(a.getName(model, selected) + " ..."); + for (LeafAction sub : la.getBranchingActions()) { + if (!sub.isApplicable(model, selected)) { + continue; + } + m.getItems().add(sub.toItem(model, selected, s -> s)); + } + var graphic = a.getIcon(model, selected); + if (graphic != null) { + m.setGraphic(graphic); + } + m.setDisable(!a.isActive(model, selected)); + getItems().add(m); + } + } + } + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserEntry.java b/app/src/main/java/io/xpipe/app/browser/BrowserEntry.java new file mode 100644 index 00000000..680022cf --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/BrowserEntry.java @@ -0,0 +1,67 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.browser.icon.DirectoryType; +import io.xpipe.app.browser.icon.FileType; +import io.xpipe.core.impl.FileNames; +import io.xpipe.core.store.FileSystem; +import lombok.Getter; + +@Getter +public class BrowserEntry { + + private final BrowserFileListModel model; + private final FileSystem.FileEntry rawFileEntry; + private final boolean synthetic; + private final FileType fileType; + private final DirectoryType directoryType; + + public BrowserEntry(FileSystem.FileEntry rawFileEntry, BrowserFileListModel model, boolean synthetic) { + this.rawFileEntry = rawFileEntry; + this.model = model; + this.synthetic = synthetic; + this.fileType = fileType(rawFileEntry); + this.directoryType = directoryType(rawFileEntry); + } + + private static FileType fileType(FileSystem.FileEntry rawFileEntry) { + if (rawFileEntry.isDirectory()) { + return null; + } + + for (var f : FileType.ALL) { + if (f.matches(rawFileEntry)) { + return f; + } + } + + return null; + } + + private static DirectoryType directoryType(FileSystem.FileEntry rawFileEntry) { + if (!rawFileEntry.isDirectory()) { + return null; + } + + for (var f : DirectoryType.ALL) { + if (f.matches(rawFileEntry)) { + return f; + } + } + + return null; + } + + public String getFileName() { + return FileNames.getFileName(getRawFileEntry().getPath()); + } + + public String getOptionallyQuotedFileName() { + var n = getFileName(); + return FileNames.quoteIfNecessary(n); + } + + public String getOptionallyQuotedFilePath() { + var n = rawFileEntry.getPath(); + return FileNames.quoteIfNecessary(n); + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/FileListComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileListComp.java similarity index 63% rename from app/src/main/java/io/xpipe/app/browser/FileListComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserFileListComp.java index 5a81cc63..0bd6cddc 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileListComp.java @@ -1,17 +1,18 @@ -/* SPDX-License-Identifier: MIT */ - package io.xpipe.app.browser; import atlantafx.base.theme.Styles; -import atlantafx.base.theme.Tweaks; +import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.browser.icon.FileIconManager; import io.xpipe.app.comp.base.LazyTextFieldComp; +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.SimpleCompStructure; +import io.xpipe.app.fxcomps.augment.ContextMenuAugment; import io.xpipe.app.fxcomps.impl.SvgCacheComp; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.fxcomps.util.SimpleChangeListener; import io.xpipe.app.util.BusyProperty; -import io.xpipe.app.util.Containers; import io.xpipe.app.util.HumanReadableFormat; +import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.impl.FileNames; import io.xpipe.core.process.OsType; import io.xpipe.core.store.FileSystem; @@ -23,15 +24,16 @@ import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.css.PseudoClass; import javafx.geometry.Bounds; -import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.skin.TableViewSkin; import javafx.scene.control.skin.VirtualFlow; import javafx.scene.input.DragEvent; -import javafx.scene.input.KeyCode; -import javafx.scene.layout.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.StackPane; import java.time.Instant; import java.time.ZoneId; @@ -42,7 +44,7 @@ import java.util.Objects; import static io.xpipe.app.util.HumanReadableFormat.byteCount; import static javafx.scene.control.TableColumn.SortType.ASCENDING; -final class FileListComp extends AnchorPane { +final class BrowserFileListComp extends SimpleComp { private static final PseudoClass HIDDEN = PseudoClass.getPseudoClass("hidden"); private static final PseudoClass EMPTY = PseudoClass.getPseudoClass("empty"); @@ -52,140 +54,153 @@ final class FileListComp extends AnchorPane { private static final PseudoClass DRAG_OVER = PseudoClass.getPseudoClass("drag-over"); private static final PseudoClass DRAG_INTO_CURRENT = PseudoClass.getPseudoClass("drag-into-current"); - private final FileListModel fileList; + private final BrowserFileListModel fileList; - public FileListComp(FileListModel fileList) { + public BrowserFileListComp(BrowserFileListModel fileList) { this.fileList = fileList; - TableView table = createTable(); + } + + @Override + protected Region createSimple() { + TableView table = createTable(); SimpleChangeListener.apply(table.comparatorProperty(), (newValue) -> { fileList.setComparator(newValue); }); - - getChildren().setAll(table); - getStyleClass().addAll("table-directory-view"); - Containers.setAnchors(table, Insets.EMPTY); + return table; } @SuppressWarnings("unchecked") - private TableView createTable() { - var filenameCol = new TableColumn("Name"); + private TableView createTable() { + var filenameCol = new TableColumn("Name"); filenameCol.setCellValueFactory(param -> new SimpleStringProperty( param.getValue() != null - ? FileNames.getFileName(param.getValue().getPath()) + ? FileNames.getFileName( + param.getValue().getRawFileEntry().getPath()) : null)); filenameCol.setComparator(Comparator.comparing(String::toLowerCase)); filenameCol.setSortType(ASCENDING); filenameCol.setCellFactory(col -> new FilenameCell(fileList.getEditing())); - var sizeCol = new TableColumn("Size"); - sizeCol.setCellValueFactory( - param -> new SimpleLongProperty(param.getValue().getSize())); + var sizeCol = new TableColumn("Size"); + sizeCol.setCellValueFactory(param -> + new SimpleLongProperty(param.getValue().getRawFileEntry().getSize())); sizeCol.setCellFactory(col -> new FileSizeCell()); - var mtimeCol = new TableColumn("Modified"); - mtimeCol.setCellValueFactory( - param -> new SimpleObjectProperty<>(param.getValue().getDate())); + var mtimeCol = new TableColumn("Modified"); + mtimeCol.setCellValueFactory(param -> + new SimpleObjectProperty<>(param.getValue().getRawFileEntry().getDate())); mtimeCol.setCellFactory(col -> new FileTimeCell()); - mtimeCol.getStyleClass().add(Tweaks.ALIGN_RIGHT); - var modeCol = new TableColumn("Attributes"); - modeCol.setCellValueFactory( - param -> new SimpleObjectProperty<>(param.getValue().getMode())); + var modeCol = new TableColumn("Attributes"); + modeCol.setCellValueFactory(param -> + new SimpleObjectProperty<>(param.getValue().getRawFileEntry().getMode())); modeCol.setCellFactory(col -> new FileModeCell()); - var table = new TableView(); + var table = new TableView(); table.setPlaceholder(new Region()); table.getStyleClass().add(Styles.STRIPED); table.getColumns().setAll(filenameCol, sizeCol, modeCol, mtimeCol); - table.getSortOrder().add(filenameCol); table.setSortPolicy(param -> { var comp = table.getComparator(); if (comp == null) { return true; } - var parentFirst = new Comparator() { - @Override - public int compare(FileSystem.FileEntry o1, FileSystem.FileEntry o2) { - var c = fileList.getFileSystemModel().getCurrentParentDirectory(); - if (c == null) { - return 0; - } + var syntheticFirst = Comparator.comparing(path -> !path.isSynthetic()); + var dirsFirst = Comparator.comparing( + path -> !path.getRawFileEntry().isDirectory()); - return o1.getPath().equals(c.getPath()) ? -1 : (o2.getPath().equals(c.getPath()) ? 1 : 0); - } - }; - var dirsFirst = Comparator.comparing(path -> !path.isDirectory()); - - Comparator us = - parentFirst.thenComparing(dirsFirst).thenComparing(comp); - FXCollections.sort(table.getItems(), us); + Comparator us = + syntheticFirst.thenComparing(dirsFirst).thenComparing(comp); + FXCollections.sort(param.getItems(), us); return true; }); table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); filenameCol.minWidthProperty().bind(table.widthProperty().multiply(0.5)); - if (fileList.getMode().equals(FileBrowserModel.Mode.SINGLE_FILE_CHOOSER) - || fileList.getMode().equals(FileBrowserModel.Mode.DIRECTORY_CHOOSER)) { - table.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); - } else { - table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); - } - - table.getSelectionModel().getSelectedItems().addListener((ListChangeListener) - c -> { - // Explicitly unselect synthetic entries since we can't use a custom selection model as that is bugged in JavaFX - var toSelect = c.getList().stream() - .filter(entry -> fileList.getFileSystemModel().getCurrentParentDirectory() == null - || !entry.getPath() - .equals(fileList.getFileSystemModel() - .getCurrentParentDirectory() - .getPath())) - .toList(); - fileList.getSelected().setAll(toSelect); - fileList.getFileSystemModel() - .getBrowserModel() - .getSelectedFiles() - .setAll(toSelect); - - Platform.runLater(() -> { - var toUnselect = table.getSelectionModel().getSelectedItems().stream() - .filter(entry -> !toSelect.contains(entry)) - .toList(); - toUnselect.forEach(entry -> table.getSelectionModel() - .clearSelection(table.getItems().indexOf(entry))); - }); - }); - - table.setOnKeyPressed(event -> { - if (event.isControlDown() - && event.getCode().equals(KeyCode.C) - && table.getSelectionModel().getSelectedItems().size() > 0) { - FileBrowserClipboard.startCopy( - fileList.getFileSystemModel().getCurrentDirectory(), - table.getSelectionModel().getSelectedItems()); - event.consume(); - } - - if (event.isControlDown() && event.getCode().equals(KeyCode.V)) { - var clipboard = FileBrowserClipboard.retrieveCopy(); - if (clipboard != null) { - var files = clipboard.getEntries(); - var target = fileList.getFileSystemModel().getCurrentDirectory(); - fileList.getFileSystemModel().dropFilesIntoAsync(target, files, true); - event.consume(); - } - } - }); + table.setFixedCellSize(34.0); + prepareTableSelectionModel(table); + prepareTableShortcuts(table); prepareTableEntries(table); prepareTableChanges(table, mtimeCol, modeCol); return table; } - private void prepareTableEntries(TableView table) { - var emptyEntry = new FileListCompEntry(table, null, fileList); + private void prepareTableSelectionModel(TableView table) { + if (!fileList.getMode().isMultiple()) { + table.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + } else { + table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); + } + + table.getSelectionModel().getSelectedItems().addListener((ListChangeListener) c -> { + var toSelect = new ArrayList<>(c.getList()); + // Explicitly unselect synthetic entries since we can't use a custom selection model as that is bugged in + // JavaFX + toSelect.removeIf(entry -> fileList.getFileSystemModel().getCurrentParentDirectory() != null + && entry.getRawFileEntry() + .getPath() + .equals(fileList.getFileSystemModel() + .getCurrentParentDirectory() + .getPath())); + // Remove unsuitable selection + toSelect.removeIf(browserEntry -> (browserEntry.getRawFileEntry().isDirectory() + && !fileList.getMode().isAcceptsDirectories()) + || (!browserEntry.getRawFileEntry().isDirectory() + && !fileList.getMode().isAcceptsFiles())); + fileList.getSelection().setAll(toSelect); + + Platform.runLater(() -> { + var toUnselect = table.getSelectionModel().getSelectedItems().stream() + .filter(entry -> !toSelect.contains(entry)) + .toList(); + toUnselect.forEach(entry -> table.getSelectionModel() + .clearSelection(table.getItems().indexOf(entry))); + }); + }); + + fileList.getSelection().addListener((ListChangeListener) c -> { + if (c.getList().equals(table.getSelectionModel().getSelectedItems())) { + return; + } + + Platform.runLater(() -> { + if (c.getList().isEmpty()) { + table.getSelectionModel().clearSelection(); + return; + } + + var indices = c.getList().stream() + .skip(1) + .mapToInt(entry -> table.getItems().indexOf(entry)) + .toArray(); + table.getSelectionModel() + .selectIndices(table.getItems().indexOf(c.getList().get(0)), indices); + }); + }); + } + + private void prepareTableShortcuts(TableView table) { + table.setOnKeyPressed(event -> { + var selected = fileList.getSelection(); + BrowserAction.getFlattened().stream() + .filter(browserAction -> browserAction.isApplicable(fileList.getFileSystemModel(), selected) + && browserAction.isActive(fileList.getFileSystemModel(), selected)) + .filter(browserAction -> browserAction.getShortcut() != null) + .filter(browserAction -> browserAction.getShortcut().match(event)) + .findAny() + .ifPresent(browserAction -> { + ThreadHelper.runFailableAsync(() -> { + browserAction.execute(fileList.getFileSystemModel(), selected); + }); + }); + }); + } + + private void prepareTableEntries(TableView table) { + var emptyEntry = new BrowserFileListCompEntry(table, null, fileList); table.setOnDragOver(event -> { emptyEntry.onDragOver(event); }); @@ -203,9 +218,17 @@ final class FileListComp extends AnchorPane { }); table.setRowFactory(param -> { - TableRow row = new TableRow<>(); + TableRow row = new TableRow<>(); + new ContextMenuAugment<>(false, () -> { + if (row.getItem() != null && row.getItem().isSynthetic()) { + return null; + } + + return new BrowserContextMenu(fileList.getFileSystemModel(), row.getItem()); + }) + .augment(new SimpleCompStructure<>(row)); var listEntry = Bindings.createObjectBinding( - () -> new FileListCompEntry(row, row.getItem(), fileList), row.itemProperty()); + () -> new BrowserFileListCompEntry(row, row.getItem(), fileList), row.itemProperty()); row.itemProperty().addListener((observable, oldValue, newValue) -> { row.pseudoClassStateChanged(DRAG, false); @@ -214,8 +237,10 @@ final class FileListComp extends AnchorPane { row.itemProperty().addListener((observable, oldValue, newValue) -> { row.pseudoClassStateChanged(EMPTY, newValue == null); - row.pseudoClassStateChanged(FILE, newValue != null && !newValue.isDirectory()); - row.pseudoClassStateChanged(FOLDER, newValue != null && newValue.isDirectory()); + row.pseudoClassStateChanged( + FILE, newValue != null && !newValue.getRawFileEntry().isDirectory()); + row.pseudoClassStateChanged( + FOLDER, newValue != null && newValue.getRawFileEntry().isDirectory()); }); fileList.getDraggedOverDirectory().addListener((observable, oldValue, newValue) -> { @@ -229,7 +254,9 @@ final class FileListComp extends AnchorPane { row.setOnMouseClicked(e -> { listEntry.get().onMouseClick(e); }); - + row.setOnMouseDragEntered(event -> { + listEntry.get().onMouseDragEntered(event); + }); row.setOnDragEntered(event -> { listEntry.get().onDragEntered(event); }); @@ -250,19 +277,19 @@ final class FileListComp extends AnchorPane { return row; }); } - private void prepareTableChanges(TableView table, TableColumn mtimeCol, TableColumn modeCol) { + + private void prepareTableChanges( + TableView table, + TableColumn mtimeCol, + TableColumn modeCol) { var lastDir = new SimpleObjectProperty(); Runnable updateHandler = () -> { PlatformThread.runLaterIfNeeded(() -> { - var newItems = new ArrayList(); - var parentEntry = fileList.getFileSystemModel().getCurrentParentDirectory(); - if (parentEntry != null) { - newItems.add(parentEntry); - } - newItems.addAll(fileList.getShown().getValue()); + var newItems = new ArrayList<>(fileList.getShown().getValue()); - var hasModifiedDate = - newItems.size() == 0 || newItems.stream().anyMatch(entry -> entry.getDate() != null); + var hasModifiedDate = newItems.size() == 0 + || newItems.stream() + .anyMatch(entry -> entry.getRawFileEntry().getDate() != null); if (!hasModifiedDate) { table.getColumns().remove(mtimeCol); } else { @@ -340,7 +367,7 @@ final class FileListComp extends AnchorPane { } } - private class FilenameCell extends TableCell { + private class FilenameCell extends TableCell { private final StringProperty img = new SimpleStringProperty(); private final StringProperty text = new SimpleStringProperty(); @@ -349,18 +376,17 @@ final class FileListComp extends AnchorPane { .createRegion(); private final StackPane textField = new LazyTextFieldComp(text).createStructure().get(); - private final ChangeListener listener; private final BooleanProperty updating = new SimpleBooleanProperty(); - public FilenameCell(Property editing) { + public FilenameCell(Property editing) { editing.addListener((observable, oldValue, newValue) -> { if (getTableRow().getItem() != null && getTableRow().getItem().equals(newValue)) { - textField.requestFocus(); + PlatformThread.runLaterIfNeeded(() -> textField.requestFocus()); } }); - listener = (observable, oldValue, newValue) -> { + ChangeListener listener = (observable, oldValue, newValue) -> { if (updating.get()) { return; } @@ -380,7 +406,7 @@ final class FileListComp extends AnchorPane { return; } - try (var b = new BusyProperty(updating)) { + try (var ignored = new BusyProperty(updating)) { super.updateItem(fullPath, empty); setText(null); if (empty || getTableRow() == null || getTableRow().getItem() == null) { @@ -397,18 +423,20 @@ final class FileListComp extends AnchorPane { var isParentLink = getTableRow() .getItem() + .getRawFileEntry() .equals(fileList.getFileSystemModel().getCurrentParentDirectory()); img.set(FileIconManager.getFileIcon( isParentLink ? fileList.getFileSystemModel().getCurrentDirectory() - : getTableRow().getItem(), + : getTableRow().getItem().getRawFileEntry(), isParentLink)); - var isDirectory = getTableRow().getItem().isDirectory(); + var isDirectory = getTableRow().getItem().getRawFileEntry().isDirectory(); pseudoClassStateChanged(FOLDER, isDirectory); var fileName = isParentLink ? ".." : FileNames.getFileName(fullPath); - var hidden = !isParentLink && (getTableRow().getItem().isHidden() || fileName.startsWith(".")); + var hidden = !isParentLink + && (getTableRow().getItem().getRawFileEntry().isHidden() || fileName.startsWith(".")); getTableRow().pseudoClassStateChanged(HIDDEN, hidden); text.set(fileName); } @@ -416,7 +444,7 @@ final class FileListComp extends AnchorPane { } } - private class FileSizeCell extends TableCell { + private static class FileSizeCell extends TableCell { @Override protected void updateItem(Number fileSize, boolean empty) { @@ -425,7 +453,7 @@ final class FileListComp extends AnchorPane { setText(null); } else { var path = getTableRow().getItem(); - if (path.isDirectory()) { + if (path.getRawFileEntry().isDirectory()) { setText(""); } else { setText(byteCount(fileSize.longValue())); @@ -434,7 +462,7 @@ final class FileListComp extends AnchorPane { } } - private class FileModeCell extends TableCell { + private static class FileModeCell extends TableCell { @Override protected void updateItem(String mode, boolean empty) { @@ -447,7 +475,7 @@ final class FileListComp extends AnchorPane { } } - private static class FileTimeCell extends TableCell { + private static class FileTimeCell extends TableCell { @Override protected void updateItem(Instant fileTime, boolean empty) { diff --git a/app/src/main/java/io/xpipe/app/browser/FileListCompEntry.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileListCompEntry.java similarity index 70% rename from app/src/main/java/io/xpipe/app/browser/FileListCompEntry.java rename to app/src/main/java/io/xpipe/app/browser/BrowserFileListCompEntry.java index 3d0bf9b3..51434049 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileListCompEntry.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileListCompEntry.java @@ -1,6 +1,5 @@ package io.xpipe.app.browser; -import io.xpipe.core.store.FileSystem; import javafx.geometry.Point2D; import javafx.scene.Node; import javafx.scene.control.TableView; @@ -13,19 +12,18 @@ import java.util.Timer; import java.util.TimerTask; @Getter -public class FileListCompEntry { +public class BrowserFileListCompEntry { public static final Timer DROP_TIMER = new Timer("dnd", true); private final Node row; - private final FileSystem.FileEntry item; - private final FileListModel model; + private final BrowserEntry item; + private final BrowserFileListModel model; private Point2D lastOver = new Point2D(-1, -1); private TimerTask activeTask; - private FileContextMenu currentContextMenu; - public FileListCompEntry(Node row, FileSystem.FileEntry item, FileListModel model) { + public BrowserFileListCompEntry(Node row, BrowserEntry item, BrowserFileListModel model) { this.row = row; this.item = item; this.model = model; @@ -34,6 +32,7 @@ public class FileListCompEntry { @SuppressWarnings("unchecked") public void onMouseClick(MouseEvent t) { if (item == null) { + model.getSelection().clear(); return; } @@ -48,35 +47,20 @@ public class FileListCompEntry { } if (t.getButton() == MouseButton.PRIMARY && t.isShiftDown()) { - var tv = ((TableView) row.getParent().getParent().getParent().getParent()); + var tv = ((TableView) row.getParent().getParent().getParent().getParent()); var all = tv.getItems(); var min = tv.getSelectionModel().getSelectedItems().stream().mapToInt(entry -> all.indexOf(entry)).min().orElse(1); var max = tv.getSelectionModel().getSelectedItems().stream().mapToInt(entry -> all.indexOf(entry)).max().orElse(all.size() - 1); var end = all.indexOf(item); var start = end > min ? min : max; - model.getSelected().setAll(all.subList(Math.min(start, end), Math.max(start, end) + 1)); - t.consume(); - return; - } - - if (currentContextMenu != null) { - currentContextMenu.hide(); - currentContextMenu = null; - t.consume(); - return; - } - - if (t.getButton() == MouseButton.SECONDARY) { - var cm = new FileContextMenu(model.getFileSystemModel(), item, model.getEditing()); - cm.show(row, t.getScreenX(), t.getScreenY()); - currentContextMenu = cm; + model.getSelection().setAll(all.subList(Math.min(start, end), Math.max(start, end) + 1)); t.consume(); return; } } public boolean isSynthetic() { - return item != null && item.equals(model.getFileSystemModel().getCurrentParentDirectory()); + return item != null && item.getRawFileEntry().equals(model.getFileSystemModel().getCurrentParentDirectory()); } private boolean acceptsDrop(DragEvent event) { @@ -85,7 +69,7 @@ public class FileListCompEntry { return true; } - if (FileBrowserClipboard.currentDragClipboard == null) { + if (BrowserClipboard.currentDragClipboard == null) { return false; } @@ -94,14 +78,14 @@ public class FileListCompEntry { } // Prevent drag and drops of files into the current directory - if (FileBrowserClipboard.currentDragClipboard + if (BrowserClipboard.currentDragClipboard .getBaseDirectory().getPath() - .equals(model.getFileSystemModel().getCurrentDirectory().getPath()) && (item == null || !item.isDirectory())) { + .equals(model.getFileSystemModel().getCurrentDirectory().getPath()) && (item == null || !item.getRawFileEntry().isDirectory())) { return false; } // Prevent dropping items onto themselves - if (item != null && FileBrowserClipboard.currentDragClipboard.getEntries().contains(item)) { + if (item != null && BrowserClipboard.currentDragClipboard.getEntries().contains(item)) { return false; } @@ -116,8 +100,8 @@ public class FileListCompEntry { if (event.getGestureSource() == null && event.getDragboard().hasFiles()) { Dragboard db = event.getDragboard(); var list = db.getFiles().stream().map(File::toPath).toList(); - var target = item != null && item.isDirectory() - ? item + var target = item != null && item.getRawFileEntry().isDirectory() + ? item.getRawFileEntry() : model.getFileSystemModel().getCurrentDirectory(); model.getFileSystemModel().dropLocalFilesIntoAsync(target, list); event.setDropCompleted(true); @@ -126,9 +110,9 @@ public class FileListCompEntry { // Accept drops from inside the app window if (event.getGestureSource() != null) { - var files = FileBrowserClipboard.retrieveDrag(event.getDragboard()).getEntries(); - var target = item != null && item.isDirectory() - ? item + var files = BrowserClipboard.retrieveDrag(event.getDragboard()).getEntries(); + var target = item != null && item.getRawFileEntry().isDirectory() + ? item.getRawFileEntry() : model.getFileSystemModel().getCurrentDirectory(); model.getFileSystemModel().dropFilesIntoAsync(target, files, false); event.setDropCompleted(true); @@ -137,7 +121,7 @@ public class FileListCompEntry { } public void onDragExited(DragEvent event) { - if (item != null && item.isDirectory()) { + if (item != null && item.getRawFileEntry().isDirectory()) { model.getDraggedOverDirectory().setValue(null); } else { model.getDraggedOverEmpty().setValue(false); @@ -147,6 +131,7 @@ public class FileListCompEntry { public void startDrag(MouseEvent event) { if (item == null) { + row.startFullDrag(); return; } @@ -154,11 +139,11 @@ public class FileListCompEntry { return; } - var selected = model.getSelected(); + var selected = model.getSelectedRaw(); Dragboard db = row.startDragAndDrop(TransferMode.COPY); - db.setContent(FileBrowserClipboard.startDrag(model.getFileSystemModel().getCurrentDirectory(), selected)); + db.setContent(BrowserClipboard.startDrag(model.getFileSystemModel().getCurrentDirectory(), selected)); - Image image = SelectedFileListComp.snapshot(selected); + Image image = BrowserSelectionListComp.snapshot(selected); db.setDragView(image, -20, 15); event.setDragDetect(true); @@ -166,13 +151,13 @@ public class FileListCompEntry { } private void acceptDrag(DragEvent event) { - model.getDraggedOverEmpty().setValue(item == null || !item.isDirectory()); + model.getDraggedOverEmpty().setValue(item == null || !item.getRawFileEntry().isDirectory()); model.getDraggedOverDirectory().setValue(item); event.acceptTransferModes(TransferMode.COPY_OR_MOVE); } private void handleHoverTimer(DragEvent event) { - if (item == null || !item.isDirectory()) { + if (item == null || !item.getRawFileEntry().isDirectory()) { return; } @@ -192,7 +177,7 @@ public class FileListCompEntry { return; } - model.getFileSystemModel().cd(item.getPath()); + model.getFileSystemModel().cd(item.getRawFileEntry().getPath()); } }; DROP_TIMER.schedule(activeTask, 1000); @@ -207,6 +192,22 @@ public class FileListCompEntry { acceptDrag(event); } + @SuppressWarnings("unchecked") + public void onMouseDragEntered(MouseDragEvent event) { + event.consume(); + + if (model.getFileSystemModel().getCurrentDirectory() == null) { + return; + } + + if (item == null || item.isSynthetic()) { + return; + } + + var tv = ((TableView) row.getParent().getParent().getParent().getParent()); + tv.getSelectionModel().select(item); + } + public void onDragOver(DragEvent event) { event.consume(); if (!acceptsDrop(event)) { diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileListModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileListModel.java new file mode 100644 index 00000000..19628664 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileListModel.java @@ -0,0 +1,131 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.fxcomps.util.BindingsHelper; +import io.xpipe.app.issue.ErrorEvent; +import io.xpipe.app.util.FileOpener; +import io.xpipe.core.impl.FileNames; +import io.xpipe.core.store.FileSystem; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.Property; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; +import java.util.function.Predicate; +import java.util.stream.Stream; + +@Getter +public final class BrowserFileListModel { + + static final Comparator FILE_TYPE_COMPARATOR = + Comparator.comparing(path -> !path.getRawFileEntry().isDirectory()); + static final Predicate PREDICATE_ANY = path -> true; + static final Predicate PREDICATE_NOT_HIDDEN = path -> true; + + private final OpenFileSystemModel fileSystemModel; + private final Property> comparatorProperty = + new SimpleObjectProperty<>(FILE_TYPE_COMPARATOR); + private final Property> all = new SimpleObjectProperty<>(new ArrayList<>()); + private final Property> shown = new SimpleObjectProperty<>(new ArrayList<>()); + private final ObjectProperty> predicateProperty = + new SimpleObjectProperty<>(path -> true); + private final ObservableList selection = FXCollections.observableArrayList(); + private final ObservableList selectedRaw = + BindingsHelper.mappedContentBinding(selection, entry -> entry.getRawFileEntry()); + + private final Property draggedOverDirectory = new SimpleObjectProperty(); + private final Property draggedOverEmpty = new SimpleBooleanProperty(); + private final Property editing = new SimpleObjectProperty<>(); + + public BrowserFileListModel(OpenFileSystemModel fileSystemModel) { + this.fileSystemModel = fileSystemModel; + + fileSystemModel.getFilter().addListener((observable, oldValue, newValue) -> { + refreshShown(); + }); + } + + public BrowserModel.Mode getMode() { + return fileSystemModel.getBrowserModel().getMode(); + } + + public void setAll(Stream newFiles) { + try (var s = newFiles) { + var parent = fileSystemModel.getCurrentParentDirectory(); + var l = Stream.concat( + parent != null ? Stream.of(new BrowserEntry(parent, this, true)) : Stream.of(), + s.filter(entry -> entry != null) + .limit(5000) + .map(entry -> new BrowserEntry(entry, this, false))) + .toList(); + all.setValue(l); + refreshShown(); + } + } + + public void setComparator(Comparator comparator) { + comparatorProperty.setValue(comparator); + refreshShown(); + } + + private void refreshShown() { + List filtered = fileSystemModel.getFilter().getValue() != null + ? all.getValue().stream() + .filter(entry -> { + var name = FileNames.getFileName( + entry.getRawFileEntry().getPath()) + .toLowerCase(Locale.ROOT); + var filterString = + fileSystemModel.getFilter().getValue().toLowerCase(Locale.ROOT); + return name.contains(filterString); + }) + .toList() + : all.getValue(); + + Comparator tableComparator = comparatorProperty.getValue(); + var comparator = + tableComparator != null ? FILE_TYPE_COMPARATOR.thenComparing(tableComparator) : FILE_TYPE_COMPARATOR; + var listCopy = new ArrayList<>(filtered); + listCopy.sort(comparator); + shown.setValue(listCopy); + } + + public boolean rename(String filename, String newName) { + var fullPath = FileNames.join(fileSystemModel.getCurrentPath().get(), filename); + var newFullPath = FileNames.join(fileSystemModel.getCurrentPath().get(), newName); + try { + fileSystemModel.getFileSystem().move(fullPath, newFullPath); + fileSystemModel.refresh(); + return true; + } catch (Exception e) { + ErrorEvent.fromThrowable(e).handle(); + return false; + } + } + + public void onDoubleClick(BrowserEntry entry) { + if (!entry.getRawFileEntry().isDirectory() && getMode().equals(BrowserModel.Mode.SINGLE_FILE_CHOOSER)) { + getFileSystemModel().getBrowserModel().finishChooser(); + return; + } + + if (entry.getRawFileEntry().isDirectory()) { + var dir = fileSystemModel.cd(entry.getRawFileEntry().getPath()); + if (dir.isPresent()) { + fileSystemModel.cd(dir.get()); + } + } else { + FileOpener.openInTextEditor(entry.getRawFileEntry()); + } + } + + public ObjectProperty> predicateProperty() { + return predicateProperty; + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/FileFilterComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFilterComp.java similarity index 76% rename from app/src/main/java/io/xpipe/app/browser/FileFilterComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserFilterComp.java index a939d6dc..37936640 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileFilterComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFilterComp.java @@ -1,32 +1,22 @@ package io.xpipe.app.browser; import atlantafx.base.theme.Styles; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.fxcomps.augment.GrowAugment; +import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.fxcomps.CompStructure; import io.xpipe.app.fxcomps.impl.TextFieldComp; -import io.xpipe.app.fxcomps.util.Shortcuts; import io.xpipe.app.fxcomps.util.SimpleChangeListener; import javafx.beans.property.Property; import javafx.beans.property.SimpleBooleanProperty; +import javafx.geometry.Pos; import javafx.scene.control.Button; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyCodeCombination; -import javafx.scene.input.KeyCombination; +import javafx.scene.control.TextField; import javafx.scene.layout.HBox; -import javafx.scene.layout.Region; import org.kordamp.ikonli.javafx.FontIcon; -public class FileFilterComp extends SimpleComp { - - private final Property filterString; - - public FileFilterComp(Property filterString) { - this.filterString = filterString; - } +public class BrowserFilterComp extends Comp { @Override - protected Region createSimple() { + public Structure createBase() { var expanded = new SimpleBooleanProperty(); var text = new TextFieldComp(filterString, false).createRegion(); var button = new Button(); @@ -56,8 +46,6 @@ public class FileFilterComp extends SimpleComp { }); var fi = new FontIcon("mdi2m-magnify"); - GrowAugment.create(false, true).augment(new SimpleCompStructure<>(button)); - Shortcuts.addShortcut(button, new KeyCodeCombination(KeyCode.F, KeyCombination.SHORTCUT_DOWN)); button.setGraphic(fi); button.setOnAction(event -> { if (expanded.get()) { @@ -75,7 +63,6 @@ public class FileFilterComp extends SimpleComp { text.setPrefWidth(0); button.getStyleClass().add(Styles.FLAT); expanded.addListener((observable, oldValue, val) -> { - System.out.println(val); if (val) { text.setPrefWidth(250); button.getStyleClass().add(Styles.RIGHT_PILL); @@ -86,9 +73,24 @@ public class FileFilterComp extends SimpleComp { button.getStyleClass().add(Styles.FLAT); } }); + button.prefHeightProperty().bind(text.heightProperty()); var box = new HBox(text, button); - box.setFillHeight(true); - return box; + box.setAlignment(Pos.CENTER); + return new Structure(box, (TextField) text, button); + } + + public record Structure(HBox box, TextField textField, Button toggleButton) implements CompStructure { + + @Override + public HBox get() { + return box; + } + } + + private final Property filterString; + + public BrowserFilterComp(Property filterString) { + this.filterString = filterString; } } diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserHistory.java b/app/src/main/java/io/xpipe/app/browser/BrowserHistory.java similarity index 96% rename from app/src/main/java/io/xpipe/app/browser/FileBrowserHistory.java rename to app/src/main/java/io/xpipe/app/browser/BrowserHistory.java index 6fe19adb..ac507aa1 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserHistory.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserHistory.java @@ -1,5 +1,3 @@ -/* SPDX-License-Identifier: MIT */ - package io.xpipe.app.browser; import javafx.beans.binding.Bindings; @@ -12,7 +10,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -final class FileBrowserHistory { +final class BrowserHistory { private final IntegerProperty cursor = new SimpleIntegerProperty(0); private final List history = new ArrayList<>(); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserModel.java new file mode 100644 index 00000000..c8d62f7d --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/BrowserModel.java @@ -0,0 +1,141 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.fxcomps.util.BindingsHelper; +import io.xpipe.app.util.ThreadHelper; +import io.xpipe.core.impl.FileStore; +import io.xpipe.core.store.ShellStore; +import javafx.beans.property.Property; +import javafx.beans.property.SimpleObjectProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +@Getter +public class BrowserModel { + + public BrowserModel(Mode mode) { + this.mode = mode; + + selected.addListener((observable, oldValue, newValue) -> { + if (newValue == null) { + return; + } + + BindingsHelper.bindContent(selection, newValue.getFileList().getSelection()); + }); + } + + @Getter + public static enum Mode { + BROWSER(false, true, true, true), + SINGLE_FILE_CHOOSER(true, false, true, false), + SINGLE_FILE_SAVE(true, false, true, false), + MULTIPLE_FILE_CHOOSER(true, true, true, false), + SINGLE_DIRECTORY_CHOOSER(true, false, false, true), + MULTIPLE_DIRECTORY_CHOOSER(true, true, false, true); + + private final boolean chooser; + private final boolean multiple; + private final boolean acceptsFiles; + private final boolean acceptsDirectories; + + Mode(boolean chooser, boolean multiple, boolean acceptsFiles, boolean acceptsDirectories) { + this.chooser = chooser; + this.multiple = multiple; + this.acceptsFiles = acceptsFiles; + this.acceptsDirectories = acceptsDirectories; + } + } + + public static final BrowserModel DEFAULT = new BrowserModel(Mode.BROWSER); + + private final Mode mode; + + @Setter + private Consumer> onFinish; + + private final ObservableList openFileSystems = FXCollections.observableArrayList(); + private final Property selected = new SimpleObjectProperty<>(); + private final BrowserTransferModel localTransfersStage = new BrowserTransferModel(); + private final ObservableList selection = FXCollections.observableArrayList(); + + public void finishChooser() { + if (!getMode().isChooser()) { + throw new IllegalStateException(); + } + + var chosen = new ArrayList<>(selection); + for (OpenFileSystemModel openFileSystem : openFileSystems) { + closeFileSystemAsync(openFileSystem); + } + + if (chosen.size() == 0) { + return; + } + + var stores = chosen.stream() + .map(entry -> new FileStore( + entry.getRawFileEntry().getFileSystem().getStore(), + entry.getRawFileEntry().getPath())) + .toList(); + onFinish.accept(stores); + } + + public void closeFileSystemAsync(OpenFileSystemModel open) { + ThreadHelper.runAsync(() -> { + if (Objects.equals(selected.getValue(), open)) { + selected.setValue(null); + } + open.closeSync(); + openFileSystems.remove(open); + }); + } + + public void openExistingFileSystemIfPresent(ShellStore store) { + var found = openFileSystems.stream() + .filter(model -> Objects.equals(model.getStore(), store)) + .findFirst(); + if (found.isPresent()) { + selected.setValue(found.get()); + } else { + openFileSystemAsync(store, null); + } + } + + public void openFileSystemAsync(ShellStore store, String path) { + // // Prevent multiple tabs in non browser modes + // if (!mode.equals(Mode.BROWSER)) { + // ThreadHelper.runFailableAsync(() -> { + // var open = openFileSystems.size() > 0 ? openFileSystems.get(0) : null; + // if (open != null) { + // open.closeSync(); + // openFileSystems.remove(open); + // } + // + // var model = new OpenFileSystemModel(this, store); + // openFileSystems.add(model); + // selected.setValue(model); + // model.switchSync(store); + // }); + // return; + // } + + ThreadHelper.runFailableAsync(() -> { + var model = new OpenFileSystemModel(this, store); + model.initFileSystem(); + openFileSystems.add(model); + selected.setValue(model); + if (path != null) { + model.initWithGivenDirectory(path); + } else { + model.initWithDefaultDirectory(); + } + }); + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java b/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java new file mode 100644 index 00000000..912c65e5 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java @@ -0,0 +1,57 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.impl.TextFieldComp; +import io.xpipe.app.fxcomps.util.SimpleChangeListener; +import javafx.application.Platform; +import javafx.beans.property.SimpleStringProperty; +import javafx.css.PseudoClass; +import javafx.geometry.Pos; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.StackPane; + +public class BrowserNavBar extends SimpleComp { + + private static final PseudoClass INVISIBLE = PseudoClass.getPseudoClass("invisible"); + + private final OpenFileSystemModel model; + + public BrowserNavBar(OpenFileSystemModel model) { + this.model = model; + } + + @Override + protected Region createSimple() { + var path = new SimpleStringProperty(model.getCurrentPath().get()); + path.addListener((observable, oldValue, newValue) -> { + var changed = model.cd(newValue); + changed.ifPresent(path::set); + }); + var pathBar = new TextFieldComp(path, true).createStructure().get(); + pathBar.getStyleClass().add("path-text"); + model.getCurrentPath().addListener((observable, oldValue, newValue) -> { + path.set(newValue); + }); + SimpleChangeListener.apply(pathBar.focusedProperty(), val -> { + pathBar.pseudoClassStateChanged(INVISIBLE, !val); + if (val) { + Platform.runLater(() -> { + pathBar.selectAll(); + }); + } + }); + + var breadcrumbs = new BrowserBreadcrumbBar(model) + .hide(pathBar.focusedProperty()) + .createRegion(); + + var stack = new StackPane(pathBar, breadcrumbs); + breadcrumbs.prefHeightProperty().bind(pathBar.heightProperty()); + HBox.setHgrow(stack, Priority.ALWAYS); + stack.setAlignment(Pos.CENTER_LEFT); + + return stack; + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/SelectedFileListComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserSelectionListComp.java similarity index 93% rename from app/src/main/java/io/xpipe/app/browser/SelectedFileListComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserSelectionListComp.java index 53e022cc..180098b7 100644 --- a/app/src/main/java/io/xpipe/app/browser/SelectedFileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserSelectionListComp.java @@ -22,10 +22,10 @@ import lombok.Value; @Value @EqualsAndHashCode(callSuper = true) -public class SelectedFileListComp extends SimpleComp { +public class BrowserSelectionListComp extends SimpleComp { public static Image snapshot(ObservableList list) { - var r = new SelectedFileListComp(list).styleClass("drag").createRegion(); + var r = new BrowserSelectionListComp(list).styleClass("drag").createRegion(); var scene = new Scene(r); AppWindowHelper.setupStylesheets(scene); AppStyle.addStylesheets(scene); diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserStatusBarComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java similarity index 69% rename from app/src/main/java/io/xpipe/app/browser/FileBrowserStatusBarComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java index 549c84e0..93bc4975 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserStatusBarComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java @@ -3,6 +3,8 @@ package io.xpipe.app.browser; import atlantafx.base.controls.Spacer; import io.xpipe.app.core.AppFont; import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.SimpleCompStructure; +import io.xpipe.app.fxcomps.augment.ContextMenuAugment; import io.xpipe.app.fxcomps.impl.LabelComp; import io.xpipe.app.fxcomps.util.PlatformThread; import javafx.beans.binding.Bindings; @@ -13,13 +15,13 @@ import lombok.Value; @Value @EqualsAndHashCode(callSuper = true) -public class FileBrowserStatusBarComp extends SimpleComp { +public class BrowserStatusBarComp extends SimpleComp { OpenFileSystemModel model; @Override protected Region createSimple() { - var cc = PlatformThread.sync(FileBrowserClipboard.currentCopyClipboard); + var cc = PlatformThread.sync(BrowserClipboard.currentCopyClipboard); var ccCount = Bindings.createStringBinding(() -> { if (cc.getValue() != null && cc.getValue().getEntries().size() > 0) { return cc.getValue().getEntries().size() + " file" + (cc.getValue().getEntries().size() > 1 ? "s" : "") + " in clipboard"; @@ -29,11 +31,11 @@ public class FileBrowserStatusBarComp extends SimpleComp { }, cc); var selectedCount = PlatformThread.sync(Bindings.createIntegerBinding(() -> { - return model.getFileList().getSelected().size(); - }, model.getFileList().getSelected())); + return model.getFileList().getSelection().size(); + }, model.getFileList().getSelection())); var allCount = PlatformThread.sync(Bindings.createIntegerBinding(() -> { - return model.getFileList().getAll().getValue().size(); + return (int) model.getFileList().getAll().getValue().stream().filter(entry -> !entry.isSynthetic()).count(); }, model.getFileList().getAll())); var selectedComp = new LabelComp(Bindings.createStringBinding(() -> { @@ -51,7 +53,15 @@ public class FileBrowserStatusBarComp extends SimpleComp { selectedComp.createRegion() ); bar.getStyleClass().add("status-bar"); + bar.setOnDragDetected(event -> { + event.consume(); + bar.startFullDrag(); + }); AppFont.small(bar); + + // Use status bar as an extension of file list + new ContextMenuAugment<>(false, () -> new BrowserContextMenu(model, null)).augment(new SimpleCompStructure<>(bar)); + return bar; } } diff --git a/app/src/main/java/io/xpipe/app/browser/LocalFileTransferComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java similarity index 90% rename from app/src/main/java/io/xpipe/app/browser/LocalFileTransferComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java index 00bb5013..b413c89d 100644 --- a/app/src/main/java/io/xpipe/app/browser/LocalFileTransferComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java @@ -24,11 +24,11 @@ import org.kordamp.ikonli.javafx.FontIcon; import java.io.IOException; import java.util.List; -public class LocalFileTransferComp extends SimpleComp { +public class BrowserTransferComp extends SimpleComp { - private final LocalFileTransferStage stage; + private final BrowserTransferModel stage; - public LocalFileTransferComp(LocalFileTransferStage stage) { + public BrowserTransferComp(BrowserTransferModel stage) { this.stage = stage; } @@ -41,7 +41,7 @@ public class LocalFileTransferComp extends SimpleComp { new StackComp(List.of(background)).grow(true, true).styleClass("download-background"); var binding = BindingsHelper.mappedContentBinding(stage.getItems(), item -> item.getFileEntry()); - var list = new SelectedFileListComp(binding).apply(struc -> struc.get().setMinHeight(150)).grow(false, true); + var list = new BrowserSelectionListComp(binding).apply(struc -> struc.get().setMinHeight(150)).grow(false, true); var dragNotice = new LabelComp(AppI18n.observable("dragFiles")) .apply(struc -> struc.get().setGraphic(new FontIcon("mdi2e-export"))) .hide(BindingsHelper.persist(Bindings.isEmpty(stage.getItems()))) @@ -71,7 +71,7 @@ public class LocalFileTransferComp extends SimpleComp { }); struc.get().setOnDragDropped(event -> { if (event.getGestureSource() != null) { - var files = FileBrowserClipboard.retrieveDrag(event.getDragboard()) + var files = BrowserClipboard.retrieveDrag(event.getDragboard()) .getEntries(); stage.drop(files); event.setDropCompleted(true); @@ -97,7 +97,7 @@ public class LocalFileTransferComp extends SimpleComp { cc.putFiles(files); db.setContent(cc); - var image = SelectedFileListComp.snapshot(FXCollections.observableList(stage.getItems().stream() + var image = BrowserSelectionListComp.snapshot(FXCollections.observableList(stage.getItems().stream() .map(item -> item.getFileEntry()) .toList())); db.setDragView(image, -20, 15); diff --git a/app/src/main/java/io/xpipe/app/browser/LocalFileTransferStage.java b/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java similarity index 98% rename from app/src/main/java/io/xpipe/app/browser/LocalFileTransferStage.java rename to app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java index 1b8f869d..1c6ddecd 100644 --- a/app/src/main/java/io/xpipe/app/browser/LocalFileTransferStage.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java @@ -17,7 +17,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @Value -public class LocalFileTransferStage { +public class BrowserTransferModel { private static final Path TEMP = FileUtils.getTempDirectory().toPath().resolve("xpipe").resolve("download"); diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java b/app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java deleted file mode 100644 index ef37942f..00000000 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java +++ /dev/null @@ -1,103 +0,0 @@ -package io.xpipe.app.browser; - -import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.impl.FileStore; -import io.xpipe.core.store.FileSystem; -import io.xpipe.core.store.ShellStore; -import javafx.beans.property.Property; -import javafx.beans.property.SimpleObjectProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; - -@Getter -public class FileBrowserModel { - - public FileBrowserModel(Mode mode) { - this.mode = mode; - } - - public static enum Mode { - BROWSER, - SINGLE_FILE_CHOOSER, - SINGLE_FILE_SAVE, - MULTIPLE_FILE_CHOOSER, - DIRECTORY_CHOOSER - } - - public static final FileBrowserModel DEFAULT = new FileBrowserModel(Mode.BROWSER); - - private final Mode mode; - private final ObservableList selectedFiles = FXCollections.observableArrayList(); - - @Setter - private Consumer> onFinish; - - private final ObservableList openFileSystems = FXCollections.observableArrayList(); - private final Property selected = new SimpleObjectProperty<>(); - private final LocalFileTransferStage localTransfersStage = new LocalFileTransferStage(); - - public void finishChooser() { - if (getMode().equals(Mode.BROWSER)) { - throw new IllegalStateException(); - } - - closeFileSystem(openFileSystems.get(0)); - - if (selectedFiles.size() == 0) { - return; - } - var stores = selectedFiles.stream().map(entry -> new FileStore(entry.getFileSystem().getStore(), entry.getPath())).toList(); - onFinish.accept(stores); - } - - public void closeFileSystem(OpenFileSystemModel open) { - ThreadHelper.runAsync(() -> { - if (Objects.equals(selected.getValue(), open)) { - selected.setValue(null); - } - open.closeSync(); - openFileSystems.remove(open); - }); - } - - public void openExistingFileSystemIfPresent(ShellStore store) { - var found = openFileSystems.stream().filter(model -> Objects.equals(model.getStore().getValue(), store)).findFirst(); - if (found.isPresent()) { - selected.setValue(found.get()); - } else { - openFileSystemAsync(store); - } - } - - public void openFileSystemAsync(ShellStore store) { - // Prevent multiple tabs in non browser modes - if (!mode.equals(Mode.BROWSER)) { - ThreadHelper.runFailableAsync(() -> { - var open = openFileSystems.size() > 0 ? openFileSystems.get(0) : null; - if (open != null) { - open.closeSync(); - openFileSystems.remove(open); - } - - var model = new OpenFileSystemModel(this); - openFileSystems.add(model); - selected.setValue(model); - model.switchSync(store); - }); - return; - } - - ThreadHelper.runFailableAsync(() -> { - var model = new OpenFileSystemModel(this); - openFileSystems.add(model); - selected.setValue(model); - model.switchSync(store); - }); - } -} diff --git a/app/src/main/java/io/xpipe/app/browser/FileContextMenu.java b/app/src/main/java/io/xpipe/app/browser/FileContextMenu.java deleted file mode 100644 index d6b7d90e..00000000 --- a/app/src/main/java/io/xpipe/app/browser/FileContextMenu.java +++ /dev/null @@ -1,193 +0,0 @@ -/* SPDX-License-Identifier: MIT */ - -package io.xpipe.app.browser; - -import io.xpipe.app.comp.source.GuiDsCreatorMultiStep; -import io.xpipe.app.ext.DataSourceProvider; -import io.xpipe.app.util.FileOpener; -import io.xpipe.app.util.ScriptHelper; -import io.xpipe.app.util.TerminalHelper; -import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.impl.FileNames; -import io.xpipe.core.impl.FileStore; -import io.xpipe.core.process.OsType; -import io.xpipe.core.process.ShellControl; -import io.xpipe.core.store.FileSystem; -import javafx.beans.property.Property; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.MenuItem; -import javafx.scene.control.SeparatorMenuItem; -import org.apache.commons.io.FilenameUtils; - -import java.awt.*; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.util.List; - -final class FileContextMenu extends ContextMenu { - - public boolean isExecutable(FileSystem.FileEntry e) { - if (e.isDirectory()) { - return false; - } - - if (e.getExecutable() != null && e.getExecutable()) { - return true; - } - - var shell = e.getFileSystem().getShell(); - if (shell.isEmpty()) { - return false; - } - - var os = shell.get().getOsType(); - var ending = FilenameUtils.getExtension(e.getPath()).toLowerCase(); - if (os.equals(OsType.WINDOWS) && List.of("exe", "bat", "ps1", "cmd").contains(ending)) { - return true; - } - - if (List.of("sh", "command").contains(ending)) { - return true; - } - - return false; - } - - private final OpenFileSystemModel model; - private final FileSystem.FileEntry entry; - private final Property editing; - - public FileContextMenu(OpenFileSystemModel model, FileSystem.FileEntry entry, Property editing) { - super(); - this.model = model; - this.entry = entry; - this.editing = editing; - createMenu(); - } - - private void createMenu() { - if (entry.isDirectory()) { - var terminal = new MenuItem("Open terminal"); - terminal.setOnAction(event -> { - event.consume(); - model.openTerminalAsync(entry.getPath()); - }); - getItems().add(terminal); - } else { - if (isExecutable(entry)) { - var execute = new MenuItem("Run in terminal"); - execute.setOnAction(event -> { - ThreadHelper.runFailableAsync(() -> { - ShellControl pc = model.getFileSystem().getShell().orElseThrow(); - var e = pc.getShellDialect().getMakeExecutableCommand(entry.getPath()); - if (e != null) { - pc.executeSimpleBooleanCommand(e); - } - var cmd = pc.command("\"" + entry.getPath() + "\"").prepareTerminalOpen("?"); - TerminalHelper.open(FilenameUtils.getBaseName(entry.getPath()), cmd); - }); - event.consume(); - }); - getItems().add(execute); - - var executeInBackground = new MenuItem("Run in background"); - executeInBackground.setOnAction(event -> { - ThreadHelper.runFailableAsync(() -> { - ShellControl pc = model.getFileSystem().getShell().orElseThrow(); - var e = pc.getShellDialect().getMakeExecutableCommand(entry.getPath()); - if (e != null) { - pc.executeSimpleBooleanCommand(e); - } - var cmd = ScriptHelper.createDetachCommand(pc, "\"" + entry.getPath() + "\""); - pc.executeSimpleBooleanCommand(cmd); - }); - event.consume(); - }); - getItems().add(executeInBackground); - } else { - var open = new MenuItem("Open default"); - open.setOnAction(event -> { - ThreadHelper.runFailableAsync(() -> { - FileOpener.openInDefaultApplication(entry); - }); - event.consume(); - }); - getItems().add(open); - } - - var pipe = new MenuItem("Pipe"); - pipe.setOnAction(event -> { - var store = new FileStore(model.getFileSystem().getStore(), entry.getPath()); - GuiDsCreatorMultiStep.showForStore(DataSourceProvider.Category.STREAM, store, null); - event.consume(); - }); - // getItems().add(pipe); - - var edit = new MenuItem("Edit"); - edit.setOnAction(event -> { - ThreadHelper.runAsync(() -> FileOpener.openInTextEditor(entry)); - event.consume(); - }); - getItems().add(edit); - } - - getItems().add(new SeparatorMenuItem()); - - { - - var copy = new MenuItem("Copy"); - copy.setOnAction(event -> { - FileBrowserClipboard.startCopy( - model.getCurrentDirectory(), model.getFileList().getSelected()); - event.consume(); - }); - getItems().add(copy); - - var paste = new MenuItem("Paste"); - paste.setOnAction(event -> { - var clipboard = FileBrowserClipboard.retrieveCopy(); - if (clipboard != null) { - var files = clipboard.getEntries(); - var target = entry.isDirectory() ? entry : model.getCurrentDirectory(); - model.dropFilesIntoAsync(target, files, true); - } - event.consume(); - }); - getItems().add(paste); - } - - getItems().add(new SeparatorMenuItem()); - - var copyName = new MenuItem("Copy name"); - copyName.setOnAction(event -> { - var selection = new StringSelection(FileNames.getFileName(entry.getPath())); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - clipboard.setContents(selection, selection); - event.consume(); - }); - getItems().add(copyName); - - var copyPath = new MenuItem("Copy full path"); - copyPath.setOnAction(event -> { - var selection = new StringSelection(entry.getPath()); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - clipboard.setContents(selection, selection); - event.consume(); - }); - getItems().add(copyPath); - - var delete = new MenuItem("Delete"); - delete.setOnAction(event -> { - model.deleteSelectionAsync(); - event.consume(); - }); - - var rename = new MenuItem("Rename"); - rename.setOnAction(event -> { - event.consume(); - editing.setValue(entry); - }); - - getItems().addAll(new SeparatorMenuItem(), rename, delete); - } -} diff --git a/app/src/main/java/io/xpipe/app/browser/FileListModel.java b/app/src/main/java/io/xpipe/app/browser/FileListModel.java deleted file mode 100644 index b4723654..00000000 --- a/app/src/main/java/io/xpipe/app/browser/FileListModel.java +++ /dev/null @@ -1,123 +0,0 @@ -/* SPDX-License-Identifier: MIT */ - -package io.xpipe.app.browser; - -import io.xpipe.app.issue.ErrorEvent; -import io.xpipe.app.util.FileOpener; -import io.xpipe.core.impl.FileNames; -import io.xpipe.core.store.FileSystem; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.Property; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import lombok.Getter; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Locale; -import java.util.function.Predicate; -import java.util.stream.Stream; - -@Getter -final class FileListModel { - - static final Comparator FILE_TYPE_COMPARATOR = - Comparator.comparing(path -> !path.isDirectory()); - static final Predicate PREDICATE_ANY = path -> true; - static final Predicate PREDICATE_NOT_HIDDEN = path -> true; - - private final OpenFileSystemModel fileSystemModel; - private final Property> comparatorProperty = - new SimpleObjectProperty<>(FILE_TYPE_COMPARATOR); - private final Property> all = new SimpleObjectProperty<>(new ArrayList<>()); - private final Property> shown = new SimpleObjectProperty<>(new ArrayList<>()); - private final ObjectProperty> predicateProperty = - new SimpleObjectProperty<>(path -> true); - private final ObservableList selected = FXCollections.observableArrayList(); - - private final Property draggedOverDirectory = new SimpleObjectProperty(); - private final Property draggedOverEmpty = new SimpleBooleanProperty(); - private final Property editing = new SimpleObjectProperty<>(); - - public FileListModel(OpenFileSystemModel fileSystemModel) { - this.fileSystemModel = fileSystemModel; - - fileSystemModel.getFilter().addListener((observable, oldValue, newValue) -> { - refreshShown(); - }); - } - - public FileBrowserModel.Mode getMode() { - return fileSystemModel.getBrowserModel().getMode(); - } - - public void setAll(List newFiles) { - all.setValue(newFiles); - refreshShown(); - } - - public void setAll(Stream newFiles) { - try (var s = newFiles) { - var l = s.filter(entry -> entry != null).limit(5000).toList(); - all.setValue(l); - refreshShown(); - } - } - - public void setComparator(Comparator comparator) { - comparatorProperty.setValue(comparator); - refreshShown(); - } - - private void refreshShown() { - List filtered = fileSystemModel.getFilter().getValue() != null ? all.getValue().stream().filter(entry -> { - var name = FileNames.getFileName(entry.getPath()).toLowerCase(Locale.ROOT); - var filterString = fileSystemModel.getFilter().getValue().toLowerCase(Locale.ROOT); - return name.contains(filterString); - }).toList() : all.getValue(); - - Comparator tableComparator = comparatorProperty.getValue(); - var comparator = tableComparator != null - ? FILE_TYPE_COMPARATOR.thenComparing(tableComparator) - : FILE_TYPE_COMPARATOR; - var listCopy = new ArrayList<>(filtered); - listCopy.sort(comparator); - shown.setValue(listCopy); - } - - public boolean rename(String filename, String newName) { - var fullPath = FileNames.join(fileSystemModel.getCurrentPath().get(), filename); - var newFullPath = FileNames.join(fileSystemModel.getCurrentPath().get(), newName); - try { - fileSystemModel.getFileSystem().move(fullPath, newFullPath); - fileSystemModel.refresh(); - return true; - } catch (Exception e) { - ErrorEvent.fromThrowable(e).handle(); - return false; - } - } - - public void onDoubleClick(FileSystem.FileEntry entry) { - if (!entry.isDirectory() && getMode().equals(FileBrowserModel.Mode.SINGLE_FILE_CHOOSER)) { - getFileSystemModel().getBrowserModel().finishChooser(); - return; - } - - if (entry.isDirectory()) { - var dir = fileSystemModel.cd(entry.getPath()); - if (dir.isPresent()) { - fileSystemModel.cd(dir.get()); - } - } else { - FileOpener.openInTextEditor(entry); - } - } - - public ObjectProperty> predicateProperty() { - return predicateProperty; - } -} diff --git a/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java b/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java index bdf66992..1410aa4c 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java +++ b/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java @@ -21,7 +21,7 @@ public class FileSystemHelper { } ConnectionFileSystem fileSystem = (ConnectionFileSystem) model.getFileSystem(); - var current = !(model.getStore().getValue() instanceof LocalStore) + var current = !model.isLocal() ? fileSystem .getShellControl() .executeSimpleStringCommand( @@ -31,10 +31,10 @@ public class FileSystemHelper { .get() .getOsType() .getHomeDirectory(fileSystem.getShell().get()); - return FileSystemHelper.resolveDirectoryPath(model, current); + return validateDirectoryPath(model, resolvePath(model, current)); } - public static String resolveDirectoryPath(OpenFileSystemModel model, String path) throws Exception { + public static String resolvePath(OpenFileSystemModel model, String path) { if (path == null) { return null; } @@ -58,6 +58,19 @@ public class FileSystemHelper { return path + "\\"; } + return path; + } + + public static String validateDirectoryPath(OpenFileSystemModel model, String path) throws Exception { + if (path == null) { + return null; + } + + var shell = model.getFileSystem().getShell(); + if (shell.isEmpty()) { + return path; + } + var normalized = shell.get() .getShellDialect() .normalizeDirectory(shell.get(), path) @@ -68,7 +81,6 @@ public class FileSystemHelper { } model.getFileSystem().directoryAccessible(normalized); - return FileNames.toDirectory(normalized); } diff --git a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemCache.java b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemCache.java new file mode 100644 index 00000000..603838e8 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemCache.java @@ -0,0 +1,29 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.util.ApplicationHelper; + +import java.util.HashMap; +import java.util.Map; + +public class OpenFileSystemCache { + + private final OpenFileSystemModel model; + private final Map installedApplications = new HashMap<>(); + + public OpenFileSystemCache(OpenFileSystemModel model) { + this.model = model; + } + + public boolean isApplicationInPath(String app) { + if (!installedApplications.containsKey(app)) { + try { + var b = ApplicationHelper.isInPath(model.getFileSystem().getShell().orElseThrow(), app); + installedApplications.put(app, b); + } catch (Exception e) { + installedApplications.put(app, false); + } + } + + return installedApplications.get(app); + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemComp.java b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemComp.java index 028279b9..96fa018e 100644 --- a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemComp.java +++ b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemComp.java @@ -1,25 +1,26 @@ package io.xpipe.app.browser; import atlantafx.base.controls.Spacer; +import io.xpipe.app.comp.base.ModalOverlayComp; +import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.PrettyImageComp; -import io.xpipe.app.fxcomps.impl.TextFieldComp; +import io.xpipe.app.fxcomps.SimpleCompStructure; +import io.xpipe.app.fxcomps.augment.ContextMenuAugment; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.fxcomps.util.Shortcuts; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleStringProperty; import javafx.geometry.Insets; -import javafx.geometry.Pos; -import javafx.scene.control.*; +import javafx.scene.control.Button; +import javafx.scene.control.MenuButton; +import javafx.scene.control.ToolBar; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; -import javafx.scene.layout.*; -import org.kordamp.ikonli.feather.Feather; +import javafx.scene.input.KeyCombination; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; import org.kordamp.ikonli.javafx.FontIcon; -import static io.xpipe.app.browser.FileListModel.PREDICATE_NOT_HIDDEN; -import static io.xpipe.app.util.Controls.iconButton; +import static io.xpipe.app.browser.BrowserFileListModel.PREDICATE_NOT_HIDDEN; public class OpenFileSystemComp extends SimpleComp { @@ -31,116 +32,47 @@ public class OpenFileSystemComp extends SimpleComp { @Override protected Region createSimple() { - var creatingProperty = new SimpleBooleanProperty(); - var backBtn = iconButton(Feather.ARROW_LEFT, false); + var alertOverlay = new ModalOverlayComp( + Comp.of(() -> createContent()), + model.getOverlay()); + return alertOverlay.createRegion(); + } + + private Region createContent() { + var backBtn = new Button(null, new FontIcon("fth-arrow-left")); backBtn.setOnAction(e -> model.back()); backBtn.disableProperty().bind(model.getHistory().canGoBackProperty().not()); - var forthBtn = iconButton(Feather.ARROW_RIGHT, false); + var forthBtn = new Button(null, new FontIcon("fth-arrow-right")); forthBtn.setOnAction(e -> model.forth()); forthBtn.disableProperty().bind(model.getHistory().canGoForthProperty().not()); - var path = new SimpleStringProperty(model.getCurrentPath().get()); - var pathBar = new TextFieldComp(path, true).createRegion(); - path.addListener((observable, oldValue, newValue) -> { - var changed = model.cd(newValue); - changed.ifPresent(path::set); - }); - model.getCurrentPath().addListener((observable, oldValue, newValue) -> { - path.set(newValue); - }); - HBox.setHgrow(pathBar, Priority.ALWAYS); - var refreshBtn = new Button(null, new FontIcon("mdmz-refresh")); refreshBtn.setOnAction(e -> model.refresh()); Shortcuts.addShortcut(refreshBtn, new KeyCodeCombination(KeyCode.F5)); var terminalBtn = new Button(null, new FontIcon("mdi2c-code-greater-than")); - terminalBtn.setOnAction(e -> model.openTerminalAsync(model.getCurrentPath().get())); + terminalBtn.setOnAction( + e -> model.openTerminalAsync(model.getCurrentPath().get())); terminalBtn.disableProperty().bind(PlatformThread.sync(model.getNoDirectory())); - var addBtn = new Button(null, new FontIcon("mdmz-plus")); - addBtn.setOnAction(e -> { - creatingProperty.set(true); - }); - addBtn.disableProperty().bind(PlatformThread.sync(model.getNoDirectory())); - Shortcuts.addShortcut(addBtn, new KeyCodeCombination(KeyCode.PLUS)); + var menuButton = new MenuButton(null, new FontIcon("mdral-folder_open")); + new ContextMenuAugment<>(true, () -> new BrowserContextMenu(model, null)).augment(new SimpleCompStructure<>(menuButton)); - var filter = new FileFilterComp(model.getFilter()).createRegion(); + var filter = new BrowserFilterComp(model.getFilter()).createStructure(); + Shortcuts.addShortcut(filter.toggleButton(), new KeyCodeCombination(KeyCode.F, KeyCombination.SHORTCUT_DOWN)); var topBar = new ToolBar(); - topBar.getItems().setAll( - backBtn, - forthBtn, - new Spacer(10), - pathBar, - filter, - refreshBtn, - terminalBtn, - addBtn - ); + topBar.getItems() + .setAll(backBtn, forthBtn, new Spacer(10), new BrowserNavBar(model).createRegion(), filter.get(), refreshBtn, terminalBtn, menuButton); - // ~ - - FileListComp directoryView = new FileListComp(model.getFileList()); + var directoryView = new BrowserFileListComp(model.getFileList()).createRegion(); var root = new VBox(topBar, directoryView); - if (model.getBrowserModel().getMode() == FileBrowserModel.Mode.BROWSER) { - root.getChildren().add(new FileBrowserStatusBarComp(model).createRegion()); - } + root.getChildren().add(new BrowserStatusBarComp(model).createRegion()); VBox.setVgrow(directoryView, Priority.ALWAYS); root.setPadding(Insets.EMPTY); model.getFileList().predicateProperty().set(PREDICATE_NOT_HIDDEN); - - var pane = new StackPane(); - pane.getChildren().add(root); - - var creation = createCreationWindow(creatingProperty); - var creationPane = new StackPane(creation); - creationPane.setAlignment(Pos.CENTER); - creationPane.setOnMouseClicked(event -> { - creatingProperty.set(false); - }); - pane.getChildren().add(creationPane); - creationPane.visibleProperty().bind(creatingProperty); - creationPane.managedProperty().bind(creatingProperty); - - return pane; - } - - private Region createCreationWindow(BooleanProperty creating) { - var creationName = new TextField(); - creating.addListener((observable, oldValue, newValue) -> { - if (!newValue) { - creationName.setText(""); - } - }); - var createFileButton = new Button("File", new PrettyImageComp(new SimpleStringProperty("file_drag_icon.png"), 20, 20).createRegion()); - createFileButton.setOnAction(event -> { - model.createFileAsync(creationName.getText()); - creating.set(false); - }); - var createDirectoryButton = new Button("Directory", new PrettyImageComp(new SimpleStringProperty("folder_closed.svg"), 20, 20).createRegion()); - createDirectoryButton.setOnAction(event -> { - model.createDirectoryAsync(creationName.getText()); - creating.set(false); - }); - var buttonBar = new ButtonBar(); - buttonBar.getButtons().addAll(createFileButton, createDirectoryButton); - var creationContent = new VBox(creationName, buttonBar); - creationContent.setSpacing(15); - var creation = new TitledPane("New ...", creationContent); - creation.setMaxWidth(400); - creation.setCollapsible(false); - creationContent.setPadding(new Insets(15)); - creation.getStyleClass().add("elevated-3"); - - creating.addListener((observable, oldValue, newValue) -> { - if (newValue) { - creationName.requestFocus(); - } - }); - - return creation; + return root; } } diff --git a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java index fa81db1a..706473bc 100644 --- a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java +++ b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java @@ -1,13 +1,16 @@ -/* SPDX-License-Identifier: MIT */ - package io.xpipe.app.browser; +import io.xpipe.app.comp.base.ModalOverlayComp; +import io.xpipe.app.core.AppCache; import io.xpipe.app.issue.ErrorEvent; +import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.BusyProperty; import io.xpipe.app.util.TerminalHelper; import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.XPipeDaemon; import io.xpipe.core.impl.FileNames; +import io.xpipe.core.process.ShellControl; +import io.xpipe.core.process.ShellDialects; import io.xpipe.core.store.ConnectionFileSystem; import io.xpipe.core.store.FileSystem; import io.xpipe.core.store.FileSystemStore; @@ -15,6 +18,7 @@ import io.xpipe.core.store.ShellStore; import javafx.beans.property.*; import lombok.Getter; import lombok.SneakyThrows; +import org.apache.commons.lang3.function.FailableConsumer; import java.io.IOException; import java.nio.file.Path; @@ -22,34 +26,74 @@ import java.time.Instant; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; @Getter -final class OpenFileSystemModel { +public final class OpenFileSystemModel { - private Property store = new SimpleObjectProperty<>(); + private final FileSystemStore store; private FileSystem fileSystem; private final Property filter = new SimpleStringProperty(); - private final FileListModel fileList; + private final BrowserFileListModel fileList; private final ReadOnlyObjectWrapper currentPath = new ReadOnlyObjectWrapper<>(); - private final FileBrowserHistory history = new FileBrowserHistory(); + private final BrowserHistory history = new BrowserHistory(); private final BooleanProperty busy = new SimpleBooleanProperty(); - private final FileBrowserModel browserModel; + private final BrowserModel browserModel; private final BooleanProperty noDirectory = new SimpleBooleanProperty(); + private final Property savedState = new SimpleObjectProperty<>(); + private final OpenFileSystemCache cache = new OpenFileSystemCache(this); + private final Property overlay = new SimpleObjectProperty<>(); + private boolean local; - public OpenFileSystemModel(FileBrowserModel browserModel) { + public OpenFileSystemModel(BrowserModel browserModel, FileSystemStore store) { this.browserModel = browserModel; - fileList = new FileListModel(this); + this.store = store; + fileList = new BrowserFileListModel(this); + addListeners(); + } + + public void withShell(FailableConsumer c, boolean refresh) { + ThreadHelper.runFailableAsync(() -> { + if (fileSystem == null) { + return; + } + + BusyProperty.execute(busy, () -> { + if (store instanceof ShellStore s) { + c.accept(fileSystem.getShell().orElseThrow()); + if (refresh) { + refreshSync(); + } + } + }); + }); + } + + private void addListeners() { + savedState.addListener((observable, oldValue, newValue) -> { + if (store == null) { + return; + } + + var storageEntry = DataStorage.get().getStoreEntryIfPresent(store); + storageEntry.ifPresent(entry -> AppCache.update("browser-state-" + entry.getUuid(), newValue)); + }); + + currentPath.addListener((observable, oldValue, newValue) -> { + savedState.setValue(savedState.getValue().withLastDirectory(newValue)); + }); } @SneakyThrows public void refresh() { BusyProperty.execute(busy, () -> { - cdSync(currentPath.get()); + cdSyncWithoutCheck(currentPath.get()); }); } - private void refreshInternal() throws Exception { - cdSync(currentPath.get()); + public void refreshSync() throws Exception { + cdSyncWithoutCheck(currentPath.get()); } public FileSystem.FileEntry getCurrentParentDirectory() { @@ -79,29 +123,66 @@ final class OpenFileSystemModel { return Optional.empty(); } - String newPath = null; + // Fix common issues with paths + var normalizedPath = FileSystemHelper.resolvePath(this, path); + if (!Objects.equals(path, normalizedPath)) { + return Optional.of(normalizedPath); + } + + // Handle commands typed into navigation bar + if (normalizedPath != null && !FileNames.isAbsolute(normalizedPath) && fileSystem.getShell().isPresent()) { + var directory = currentPath.get(); + var name = normalizedPath + " - " + + XPipeDaemon.getInstance().getStoreName(store).orElse("?"); + ThreadHelper.runFailableAsync(() -> { + if (ShellDialects.ALL.stream().anyMatch(dialect -> normalizedPath.startsWith(dialect.getOpenCommand()))) { + var cmd = fileSystem + .getShell() + .get() + .subShell(normalizedPath) + .initWith(fileSystem + .getShell() + .get() + .getShellDialect() + .getCdCommand(currentPath.get())) + .prepareTerminalOpen(name); + TerminalHelper.open(normalizedPath, cmd); + } else { + var cmd = fileSystem + .getShell() + .get() + .command(normalizedPath) + .workingDirectory(directory) + .prepareTerminalOpen(name); + TerminalHelper.open(normalizedPath, cmd); + } + }); + return Optional.of(currentPath.get()); + } + + String dirPath = null; try { - newPath = FileSystemHelper.resolveDirectoryPath(this, path); + dirPath = FileSystemHelper.validateDirectoryPath(this, normalizedPath); } catch (Exception ex) { ErrorEvent.fromThrowable(ex).handle(); return Optional.of(currentPath.get()); } - if (!Objects.equals(path, newPath)) { - return Optional.of(newPath); + if (!Objects.equals(path, dirPath)) { + return Optional.of(dirPath); } ThreadHelper.runFailableAsync(() -> { try (var ignored = new BusyProperty(busy)) { - cdSync(path); + cdSyncWithoutCheck(path); } }); return Optional.empty(); } - private void cdSync(String path) throws Exception { + private void cdSyncWithoutCheck(String path) throws Exception { if (fileSystem == null) { - var fs = store.getValue().createFileSystem(); + var fs = store.createFileSystem(); fs.open(); this.fileSystem = fs; } @@ -111,6 +192,7 @@ final class OpenFileSystemModel { filter.setValue(null); currentPath.set(path); + savedState.setValue(savedState.getValue().withLastDirectory(path)); history.updateCurrent(path); loadFilesSync(path); } @@ -130,7 +212,7 @@ final class OpenFileSystemModel { } return true; } catch (Exception e) { - fileList.setAll(List.of()); + fileList.setAll(Stream.of()); ErrorEvent.fromThrowable(e).handle(); return false; } @@ -144,7 +226,7 @@ final class OpenFileSystemModel { } FileSystemHelper.dropLocalFilesInto(entry, files); - refreshInternal(); + refreshSync(); }); }); } @@ -159,13 +241,13 @@ final class OpenFileSystemModel { var same = files.get(0).getFileSystem().equals(target.getFileSystem()); if (same) { - if (!FileBrowserAlerts.showMoveAlert(files, target)) { + if (!BrowserAlerts.showMoveAlert(files, target)) { return; } } FileSystemHelper.dropFilesInto(target, files, explicitCopy); - refreshInternal(); + refreshSync(); }); }); } @@ -191,13 +273,13 @@ final class OpenFileSystemModel { } fileSystem.mkdirs(abs); - refreshInternal(); + refreshSync(); }); }); } public void createFileAsync(String name) { - if (name.isBlank()) { + if (name == null || name.isBlank()) { return; } @@ -213,7 +295,7 @@ final class OpenFileSystemModel { var abs = FileNames.join(getCurrentDirectory().getPath(), name); fileSystem.touch(abs); - refreshInternal(); + refreshSync(); }); }); } @@ -225,12 +307,12 @@ final class OpenFileSystemModel { return; } - if (!FileBrowserAlerts.showDeleteAlert(fileList.getSelected())) { + if (!BrowserAlerts.showDeleteAlert(fileList.getSelectedRaw())) { return; } - FileSystemHelper.delete(fileList.getSelected()); - refreshInternal(); + FileSystemHelper.delete(fileList.getSelectedRaw()); + refreshSync(); }); }); } @@ -246,22 +328,46 @@ final class OpenFileSystemModel { ErrorEvent.fromThrowable(e).handle(); } fileSystem = null; - store = null; } - public void switchSync(FileSystemStore fileSystem) throws Exception { + public void initFileSystem() throws Exception { BusyProperty.execute(busy, () -> { - closeSync(); - this.store.setValue(fileSystem); - var fs = fileSystem.createFileSystem(); + var fs = store.createFileSystem(); fs.open(); this.fileSystem = fs; - - var current = FileSystemHelper.getStartDirectory(this); - cdSync(current); + this.local = fs.getShell().map(shellControl -> shellControl.isLocal()).orElse(false); }); } + public void initWithGivenDirectory(String dir) throws Exception { + initSavedState(dir); + cdSyncWithoutCheck(dir); + } + + public void initWithDefaultDirectory() throws Exception { + var dir = FileSystemHelper.getStartDirectory(this); + initSavedState(dir); + cdSyncWithoutCheck(dir); + } + + private void initSavedState(String path) { + var storageEntry = DataStorage.get() + .getStoreEntryIfPresent(store) + .map(entry -> entry.getUuid()) + .orElse(UUID.randomUUID()); + this.savedState.setValue( + AppCache.get("browser-state-" + storageEntry, OpenFileSystemSavedState.class, () -> { + try { + return OpenFileSystemSavedState.builder() + .lastDirectory(path) + .build(); + } catch (Exception e) { + ErrorEvent.fromThrowable(e).handle(); + return null; + } + })); + } + public void openTerminalAsync(String directory) { ThreadHelper.runFailableAsync(() -> { if (fileSystem == null) { @@ -269,13 +375,13 @@ final class OpenFileSystemModel { } BusyProperty.execute(busy, () -> { - if (store.getValue() instanceof ShellStore s) { + if (store instanceof ShellStore s) { var connection = ((ConnectionFileSystem) fileSystem).getShellControl(); var command = s.control() .initWith(connection.getShellDialect().getCdCommand(directory)) .prepareTerminalOpen(directory + " - " + XPipeDaemon.getInstance() - .getStoreName(store.getValue()) + .getStoreName(store) .orElse("?")); TerminalHelper.open(directory, command); } @@ -283,7 +389,7 @@ final class OpenFileSystemModel { }); } - public FileBrowserHistory getHistory() { + public BrowserHistory getHistory() { return history; } diff --git a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemSavedState.java b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemSavedState.java new file mode 100644 index 00000000..ef1eda35 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemSavedState.java @@ -0,0 +1,15 @@ +package io.xpipe.app.browser; + +import lombok.Builder; +import lombok.Value; +import lombok.With; +import lombok.extern.jackson.Jacksonized; + +@Value +@With +@Jacksonized +@Builder +public class OpenFileSystemSavedState { + + String lastDirectory; +} diff --git a/app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java b/app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java index f7ff2dde..600fe4b3 100644 --- a/app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java +++ b/app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java @@ -37,8 +37,8 @@ public class StandaloneFileBrowser { public static void openSingleFile(Property file) { PlatformThread.runLaterIfNeeded(() -> { - var model = new FileBrowserModel(FileBrowserModel.Mode.SINGLE_FILE_CHOOSER); - var comp = new FileBrowserComp(model) + var model = new BrowserModel(BrowserModel.Mode.SINGLE_FILE_CHOOSER); + var comp = new BrowserComp(model) .apply(struc -> struc.get().setPrefSize(1200, 700)) .apply(struc -> AppFont.normal(struc.get())); var window = AppWindowHelper.sideWindow(AppI18n.get("openFileTitle"), stage -> comp, true, null); @@ -52,8 +52,8 @@ public class StandaloneFileBrowser { public static void saveSingleFile(Property file) { PlatformThread.runLaterIfNeeded(() -> { - var model = new FileBrowserModel(FileBrowserModel.Mode.SINGLE_FILE_SAVE); - var comp = new FileBrowserComp(model) + var model = new BrowserModel(BrowserModel.Mode.SINGLE_FILE_SAVE); + var comp = new BrowserComp(model) .apply(struc -> struc.get().setPrefSize(1200, 700)) .apply(struc -> AppFont.normal(struc.get())); var window = AppWindowHelper.sideWindow(AppI18n.get("saveFileTitle"), stage -> comp, true, null); diff --git a/app/src/main/java/io/xpipe/app/browser/action/ApplicationPathAction.java b/app/src/main/java/io/xpipe/app/browser/action/ApplicationPathAction.java new file mode 100644 index 00000000..2e1b471c --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/action/ApplicationPathAction.java @@ -0,0 +1,27 @@ +package io.xpipe.app.browser.action; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; + +import java.util.List; + +public interface ApplicationPathAction extends BrowserAction { + + public abstract String getExecutable(); + + @Override + public default boolean isApplicable(OpenFileSystemModel model, List entries) { + if (entries.size() == 0) { + return false; + } + + return entries.stream().allMatch(entry -> isApplicable(model, entry)); + } + + boolean isApplicable(OpenFileSystemModel model, BrowserEntry entry); + + @Override + public default boolean isActive(OpenFileSystemModel model, List entries) { + return model.getCache().isApplicationInPath(getExecutable()); + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/action/BranchAction.java b/app/src/main/java/io/xpipe/app/browser/action/BranchAction.java new file mode 100644 index 00000000..17c69caf --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/action/BranchAction.java @@ -0,0 +1,8 @@ +package io.xpipe.app.browser.action; + +import java.util.List; + +public interface BranchAction extends BrowserAction { + + List getBranchingActions(); +} diff --git a/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java new file mode 100644 index 00000000..fa57213a --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java @@ -0,0 +1,88 @@ +package io.xpipe.app.browser.action; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.issue.ErrorEvent; +import io.xpipe.core.util.ModuleLayerLoader; +import javafx.scene.Node; +import javafx.scene.input.KeyCombination; + +import java.util.ArrayList; +import java.util.List; +import java.util.ServiceLoader; + +public interface BrowserAction { + + static enum Category { + CUSTOM, + OPEN, + NATIVE, + COPY_PASTE, + MUTATION + } + + static List ALL = new ArrayList<>(); + + public static List getFlattened() { + return ALL.stream() + .map(browserAction -> browserAction instanceof LeafAction + ? List.of((LeafAction) browserAction) + : ((BranchAction) browserAction).getBranchingActions()) + .flatMap(List::stream) + .toList(); + } + + default Node getIcon(OpenFileSystemModel model, List entries) { + return null; + } + + default Category getCategory() { + return null; + } + + default KeyCombination getShortcut() { + return null; + } + + default boolean acceptsEmptySelection() { + return false; + } + + public abstract String getName(OpenFileSystemModel model, List entries); + + public default boolean isApplicable(OpenFileSystemModel model, List entries) { + return true; + } + + public default boolean isActive(OpenFileSystemModel model, List entries) { + return true; + } + + public static class Loader implements ModuleLayerLoader { + + @Override + public void init(ModuleLayer layer) { + ALL.addAll(ServiceLoader.load(layer, BrowserAction.class).stream() + .map(actionProviderProvider -> actionProviderProvider.get()) + .filter(provider -> { + try { + return true; + } catch (Throwable e) { + ErrorEvent.fromThrowable(e).handle(); + return false; + } + }) + .toList()); + } + + @Override + public boolean requiresFullDaemon() { + return true; + } + + @Override + public boolean prioritizeLoading() { + return false; + } + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/action/ExecuteApplicationAction.java b/app/src/main/java/io/xpipe/app/browser/action/ExecuteApplicationAction.java new file mode 100644 index 00000000..348cb94e --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/action/ExecuteApplicationAction.java @@ -0,0 +1,29 @@ +package io.xpipe.app.browser.action; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.util.ScriptHelper; +import io.xpipe.core.process.ShellControl; + +import java.util.List; + +public abstract class ExecuteApplicationAction implements LeafAction, ApplicationPathAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + ShellControl sc = model.getFileSystem().getShell().orElseThrow(); + for (BrowserEntry entry : entries) { + var command = detach() ? ScriptHelper.createDetachCommand(sc, createCommand(model, entry)) : createCommand(model, entry); + try (var cc = sc.command(command).workingDirectory(model.getCurrentDirectory().getPath()).start()) { + cc.discardOrThrow(); + } + } + } + + protected boolean detach() { + return false; + } + + protected abstract String createCommand(OpenFileSystemModel model, BrowserEntry entry); + +} diff --git a/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java b/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java new file mode 100644 index 00000000..4712996c --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java @@ -0,0 +1,38 @@ +package io.xpipe.app.browser.action; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.util.BusyProperty; +import io.xpipe.app.util.ThreadHelper; +import javafx.scene.control.MenuItem; + +import java.util.List; +import java.util.function.UnaryOperator; + +public interface LeafAction extends BrowserAction { + + public abstract void execute(OpenFileSystemModel model, List entries) throws Exception; + + default MenuItem toItem(OpenFileSystemModel model, List selected, UnaryOperator nameFunc) { + var mi = new MenuItem(nameFunc.apply(getName(model, selected))); + mi.setOnAction(event -> { + ThreadHelper.runFailableAsync(() -> { + BusyProperty.execute(model.getBusy(), () -> { + execute(model, selected); + }); + }); + event.consume(); + }); + if (getShortcut() != null) { + mi.setAccelerator(getShortcut()); + } + var graphic = getIcon(model, selected); + if (graphic != null) { + mi.setGraphic(graphic); + } + mi.setMnemonicParsing(false); + mi.setDisable(!isActive(model, selected)); + return mi; + } + +} diff --git a/app/src/main/java/io/xpipe/app/browser/action/MultiExecuteAction.java b/app/src/main/java/io/xpipe/app/browser/action/MultiExecuteAction.java new file mode 100644 index 00000000..4eea0503 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/action/MultiExecuteAction.java @@ -0,0 +1,96 @@ +package io.xpipe.app.browser.action; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.app.util.ScriptHelper; +import io.xpipe.app.util.TerminalHelper; +import io.xpipe.core.impl.FileNames; +import io.xpipe.core.process.ShellControl; +import org.apache.commons.io.FilenameUtils; + +import java.util.List; + +public abstract class MultiExecuteAction implements BranchAction { + + protected String filesArgument(List entries) { + return entries.size() == 1 ? entries.get(0).getOptionallyQuotedFileName() : "(" + entries.size() + ")"; + } + + protected abstract String createCommand(ShellControl sc, OpenFileSystemModel model, BrowserEntry entry); + + @Override + public List getBranchingActions() { + return List.of( + new LeafAction() { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + model.withShell( + pc -> { + for (BrowserEntry entry : entries) { + var cmd = pc.command(createCommand(pc, model, entry)) + .workingDirectory(model.getCurrentDirectory() + .getPath()) + .prepareTerminalOpen(FileNames.getFileName( + entry.getRawFileEntry().getPath())); + TerminalHelper.open( + FilenameUtils.getBaseName( + entry.getRawFileEntry().getPath()), + cmd); + } + }, + false); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "in " + AppPrefs.get().terminalType().getValue().toTranslatedString(); + } + }, + new LeafAction() { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + model.withShell( + pc -> { + for (BrowserEntry entry : entries) { + var cmd = ScriptHelper.createDetachCommand( + pc, createCommand(pc, model, entry)); + pc.command(cmd) + .workingDirectory(model.getCurrentDirectory() + .getPath()) + .execute(); + } + }, + false); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "in background"; + } + }, + new LeafAction() { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + model.withShell( + pc -> { + for (BrowserEntry entry : entries) { + pc.command(createCommand(pc, model, entry)) + .workingDirectory(model.getCurrentDirectory() + .getPath()) + .execute(); + } + }, + false); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "wait for completion"; + } + }); + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java new file mode 100644 index 00000000..3b3399f6 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java @@ -0,0 +1,21 @@ +package io.xpipe.app.browser.icon; + +import io.xpipe.app.fxcomps.impl.PrettyImageComp; +import io.xpipe.core.store.FileSystem; +import javafx.beans.property.SimpleStringProperty; + +public class BrowserIcons { + public static PrettyImageComp createDefaultFileIcon() { + return new PrettyImageComp(new SimpleStringProperty("default_file.svg"), 22, 22); + } + public static PrettyImageComp createDefaultDirectoryIcon() { + return new PrettyImageComp(new SimpleStringProperty("default_folder.svg"), 22, 22); + } + public static PrettyImageComp createIcon(FileType type) { + return new PrettyImageComp(new SimpleStringProperty(type.getIcon()), 22, 22); + } + + public static PrettyImageComp createIcon(FileSystem.FileEntry entry) { + return new PrettyImageComp(new SimpleStringProperty(FileIconManager.getFileIcon(entry, false)), 22, 22); + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/icon/DirectoryType.java b/app/src/main/java/io/xpipe/app/browser/icon/DirectoryType.java new file mode 100644 index 00000000..a0d8fcd1 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/icon/DirectoryType.java @@ -0,0 +1,101 @@ +package io.xpipe.app.browser.icon; + +import io.xpipe.app.core.AppResources; +import io.xpipe.core.impl.FileNames; +import io.xpipe.core.store.FileSystem; +import lombok.Getter; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public interface DirectoryType { + + List ALL = new ArrayList<>(); + + static DirectoryType byId(String id) { + return ALL.stream().filter(fileType -> fileType.getId().equals(id)).findAny().orElseThrow(); + } + + public static void loadDefinitions() { + ALL.add(new Simple( + "default", new IconVariant("default_root_folder.svg"), new IconVariant("default_root_folder_opened.svg"), "")); + + AppResources.with(AppResources.XPIPE_MODULE, "folder_list.txt", path -> { + try (var reader = + new BufferedReader(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + var split = line.split("\\|"); + var id = split[0].trim(); + var filter = Arrays.stream(split[1].split(",")) + .map(s -> { + var r = s.trim(); + if (r.startsWith(".")) { + return r; + } + + if (r.contains(".")) { + return r; + } + + return "." + r; + }) + .toList(); + + var closedIcon = split[2].trim(); + var openIcon = split[3].trim(); + + var lightClosedIcon = split.length > 4 ? split[4].trim() : closedIcon; + var lightOpenIcon = split.length > 4 ? split[5].trim() : openIcon; + + ALL.add(new Simple( + id, new IconVariant(lightClosedIcon, closedIcon), + new IconVariant(lightOpenIcon, openIcon), + filter.toArray(String[]::new))); + } + } + }); + } + + class Simple implements DirectoryType { + + @Getter + private final String id; + private final IconVariant closed; + private final IconVariant open; + private final String[] names; + + public Simple(String id, IconVariant closed, IconVariant open, String... names) { + this.id = id; + this.closed = closed; + this.open = open; + this.names = names; + } + + @Override + public boolean matches(FileSystem.FileEntry entry) { + if (!entry.isDirectory()) { + return false; + } + + return Arrays.stream(names).anyMatch(name -> FileNames.getFileName(entry.getPath()) + .equalsIgnoreCase(name)); + } + + @Override + public String getIcon(FileSystem.FileEntry entry, boolean open) { + return open ? this.open.getIcon() : this.closed.getIcon(); + } + } + + String getId(); + + boolean matches(FileSystem.FileEntry entry); + + String getIcon(FileSystem.FileEntry entry, boolean open); +} diff --git a/app/src/main/java/io/xpipe/app/browser/icon/FileIconFactory.java b/app/src/main/java/io/xpipe/app/browser/icon/FileIconFactory.java deleted file mode 100644 index d65aaf13..00000000 --- a/app/src/main/java/io/xpipe/app/browser/icon/FileIconFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.xpipe.app.browser.icon; - -import io.xpipe.core.store.FileSystem; - -import java.util.Arrays; - -public interface FileIconFactory { - - class SimpleFile extends IconVariant implements FileIconFactory { - - private final String[] endings; - - public SimpleFile(String lightIcon, String darkIcon, String... endings) { - super(lightIcon, darkIcon); - this.endings = endings; - } - - @Override - public String getIcon(FileSystem.FileEntry entry) { - if (entry.isDirectory()) { - return null; - } - - return Arrays.stream(endings).anyMatch(ending -> entry.getPath().toLowerCase().endsWith(ending.toLowerCase())) ? getIcon() : null; - } - } - - String getIcon(FileSystem.FileEntry entry); -} diff --git a/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java b/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java index 8cc48f9c..07773d99 100644 --- a/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java +++ b/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java @@ -7,89 +7,14 @@ import io.xpipe.core.store.FileSystem; import javafx.scene.image.Image; import lombok.Getter; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.util.*; public class FileIconManager { - private static final List factories = new ArrayList<>(); - private static final List folderFactories = new ArrayList<>(); @Getter private static SvgCache svgCache = createCache(); private static boolean loaded; - private static void loadDefinitions() { - AppResources.with(AppResources.XPIPE_MODULE, "browser_icons/file_list.txt", path -> { - try (var reader = - new BufferedReader(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))) { - String line; - while ((line = reader.readLine()) != null) { - var split = line.split("\\|"); - var id = split[0].trim(); - var filter = Arrays.stream(split[1].split(",")) - .map(s -> { - var r = s.trim(); - if (r.startsWith(".")) { - return r; - } - - if (r.contains(".")) { - return r; - } - - return "." + r; - }) - .toList(); - var darkIcon = split[2].trim(); - var lightIcon = split.length > 3 ? split[3].trim() : darkIcon; - factories.add(new FileIconFactory.SimpleFile(lightIcon, darkIcon, filter.toArray(String[]::new))); - } - } - }); - - folderFactories.addAll(List.of(new FolderIconFactory.SimpleDirectory( - new IconVariant("default_root_folder.svg"), new IconVariant("default_root_folder_opened.svg"), ""))); - - AppResources.with(AppResources.XPIPE_MODULE, "browser_icons/folder_list.txt", path -> { - try (var reader = - new BufferedReader(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))) { - String line; - while ((line = reader.readLine()) != null) { - var split = line.split("\\|"); - var id = split[0].trim(); - var filter = Arrays.stream(split[1].split(",")) - .map(s -> { - var r = s.trim(); - if (r.startsWith(".")) { - return r; - } - - if (r.contains(".")) { - return r; - } - - return "." + r; - }) - .toList(); - - var closedIcon = split[2].trim(); - var openIcon = split[3].trim(); - - var lightClosedIcon = split.length > 4 ? split[4].trim() : closedIcon; - var lightOpenIcon = split.length > 4 ? split[5].trim() : openIcon; - - folderFactories.add(new FolderIconFactory.SimpleDirectory( - new IconVariant(lightClosedIcon, closedIcon), - new IconVariant(lightOpenIcon, openIcon), - filter.toArray(String[]::new))); - } - } - }); - } - private static SvgCache createCache() { return new SvgCache() { @@ -109,7 +34,6 @@ public class FileIconManager { public static synchronized void loadIfNecessary() { if (!loaded) { - loadDefinitions(); AppImages.loadDirectory(AppResources.XPIPE_MODULE, "browser_icons"); loaded = true; } @@ -123,17 +47,15 @@ public class FileIconManager { loadIfNecessary(); if (!entry.isDirectory()) { - for (var f : factories) { - var icon = f.getIcon(entry); - if (icon != null) { - return getIconPath(icon); + for (var f : FileType.ALL) { + if (f.matches(entry)) { + return getIconPath(f.getIcon()); } } } else { - for (var f : folderFactories) { - var icon = f.getIcon(entry, open); - if (icon != null) { - return getIconPath(icon); + for (var f : DirectoryType.ALL) { + if (f.matches(entry)) { + return getIconPath(f.getIcon(entry, open)); } } } diff --git a/app/src/main/java/io/xpipe/app/browser/icon/FileIcons.java b/app/src/main/java/io/xpipe/app/browser/icon/FileIcons.java deleted file mode 100644 index 89992de7..00000000 --- a/app/src/main/java/io/xpipe/app/browser/icon/FileIcons.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.xpipe.app.browser.icon; - -import io.xpipe.app.fxcomps.impl.PrettyImageComp; -import io.xpipe.core.store.FileSystem; -import javafx.beans.property.SimpleStringProperty; - -public class FileIcons { - - public static PrettyImageComp createIcon(FileSystem.FileEntry entry) { - return new PrettyImageComp(new SimpleStringProperty(FileIconManager.getFileIcon(entry, false)), 22, 22); - } -} diff --git a/app/src/main/java/io/xpipe/app/browser/icon/FileType.java b/app/src/main/java/io/xpipe/app/browser/icon/FileType.java new file mode 100644 index 00000000..cbc44d0b --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/icon/FileType.java @@ -0,0 +1,87 @@ +package io.xpipe.app.browser.icon; + +import io.xpipe.app.core.AppResources; +import io.xpipe.core.store.FileSystem; +import lombok.Getter; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public interface FileType { + + List ALL = new ArrayList<>(); + + static FileType byId(String id) { + return ALL.stream().filter(fileType -> fileType.getId().equals(id)).findAny().orElseThrow(); + } + + public static void loadDefinitions() { + AppResources.with(AppResources.XPIPE_MODULE, "file_list.txt", path -> { + try (var reader = + new BufferedReader(new InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + var split = line.split("\\|"); + var id = split[0].trim(); + var filter = Arrays.stream(split[1].split(",")) + .map(s -> { + var r = s.trim(); + if (r.startsWith(".")) { + return r; + } + + if (r.contains(".")) { + return r; + } + + return "." + r; + }) + .toList(); + var darkIcon = split[2].trim(); + var lightIcon = split.length > 3 ? split[3].trim() : darkIcon; + ALL.add(new FileType.Simple(id, lightIcon, darkIcon, filter.toArray(String[]::new))); + } + } + }); + } + + @Getter + class Simple implements FileType { + + private final String id; + private final IconVariant icon; + private final String[] endings; + + public Simple(String id, String lightIcon, String darkIcon, String... endings) { + this.icon = new IconVariant(lightIcon, darkIcon); + this.id = id; + this.endings = endings; + } + + @Override + public boolean matches(FileSystem.FileEntry entry) { + if (entry.isDirectory()) { + return false; + } + + return Arrays.stream(endings) + .anyMatch(ending -> entry.getPath().toLowerCase().endsWith(ending.toLowerCase())); + } + + @Override + public String getIcon() { + return icon.getIcon(); + } + } + + String getId(); + + boolean matches(FileSystem.FileEntry entry); + + String getIcon(); +} diff --git a/app/src/main/java/io/xpipe/app/browser/icon/FolderIconFactory.java b/app/src/main/java/io/xpipe/app/browser/icon/FolderIconFactory.java deleted file mode 100644 index 3f8203bc..00000000 --- a/app/src/main/java/io/xpipe/app/browser/icon/FolderIconFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.xpipe.app.browser.icon; - -import io.xpipe.core.impl.FileNames; -import io.xpipe.core.store.FileSystem; - -import java.util.Arrays; - -public interface FolderIconFactory { - - class SimpleDirectory implements FolderIconFactory { - - private final IconVariant closed; - private final IconVariant open; - private final String[] names; - - public SimpleDirectory(IconVariant closed, IconVariant open, String... names) { - this.closed = closed; - this.open = open; - this.names = names; - } - - @Override - public String getIcon(FileSystem.FileEntry entry, boolean open) { - if (!entry.isDirectory()) { - return null; - } - - return Arrays.stream(names).anyMatch(name -> FileNames.getFileName(entry.getPath()) - .equalsIgnoreCase(name)) - ? (open ? this.open.getIcon() : this.closed.getIcon()) - : null; - } - } - - String getIcon(FileSystem.FileEntry entry, boolean open); -} diff --git a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java b/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java index 9be90bed..a8b47494 100644 --- a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java +++ b/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java @@ -1,7 +1,7 @@ package io.xpipe.app.comp; -import io.xpipe.app.browser.FileBrowserComp; -import io.xpipe.app.browser.FileBrowserModel; +import io.xpipe.app.browser.BrowserComp; +import io.xpipe.app.browser.BrowserModel; import io.xpipe.app.comp.about.AboutTabComp; import io.xpipe.app.comp.base.SideMenuBarComp; import io.xpipe.app.comp.storage.store.StoreLayoutComp; @@ -47,7 +47,7 @@ public class AppLayoutComp extends Comp> { new SideMenuBarComp.Entry( AppI18n.observable("browser"), "mdi2f-file-cabinet", - new FileBrowserComp(FileBrowserModel.DEFAULT)), + new BrowserComp(BrowserModel.DEFAULT)), // new SideMenuBarComp.Entry(AppI18n.observable("data"), "mdsal-dvr", new SourceCollectionLayoutComp()), new SideMenuBarComp.Entry( AppI18n.observable("settings"), "mdsmz-miscellaneous_services", new PrefsComp(this)), @@ -78,7 +78,7 @@ public class AppLayoutComp extends Comp> { var pane = new BorderPane(); var sidebar = new SideMenuBarComp(selected, entries); - pane.setCenter(selected.getValue().comp().createRegion()); + pane.setCenter(map.get(selected.getValue())); pane.setRight(sidebar.createRegion()); selected.addListener((c, o, n) -> { if (o != null && o.equals(entries.get(2))) { diff --git a/app/src/main/java/io/xpipe/app/comp/PrefsComp.java b/app/src/main/java/io/xpipe/app/comp/PrefsComp.java index 841300c5..9c1ba13a 100644 --- a/app/src/main/java/io/xpipe/app/comp/PrefsComp.java +++ b/app/src/main/java/io/xpipe/app/comp/PrefsComp.java @@ -6,7 +6,6 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.fxcomps.SimpleComp; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.prefs.ClearCacheAlert; -import javafx.beans.binding.Bindings; import javafx.geometry.Pos; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; @@ -33,27 +32,6 @@ public class PrefsComp extends SimpleComp { MasterDetailPane p = (MasterDetailPane) pfx.getCenter(); p.dividerPositionProperty().setValue(0.27); - var cancel = new ButtonComp(AppI18n.observable("cancel"), null, () -> { - AppPrefs.get().cancel(); - layout.selectedProperty().setValue(layout.getEntries().get(0)); - }) - .createRegion(); - var apply = new ButtonComp(AppI18n.observable("apply"), null, () -> { - AppPrefs.get().save(); - layout.selectedProperty().setValue(layout.getEntries().get(0)); - }) - .createRegion(); - var maxWidth = Bindings.max(cancel.widthProperty(), apply.widthProperty()); - cancel.minWidthProperty().bind(maxWidth); - apply.minWidthProperty().bind(maxWidth); - var rightButtons = new HBox(apply, cancel); - rightButtons.setSpacing(8); - - var rightPane = new AnchorPane(rightButtons); - rightPane.setPickOnBounds(false); - AnchorPane.setBottomAnchor(rightButtons, 15.0); - AnchorPane.setRightAnchor(rightButtons, 55.0); - var clearCaches = new ButtonComp(AppI18n.observable("clearCaches"), null, ClearCacheAlert::show).createRegion(); // var reload = new ButtonComp(AppI18n.observable("reload"), null, () -> OperationMode.reload()).createRegion(); var leftButtons = new HBox(clearCaches); @@ -65,7 +43,7 @@ public class PrefsComp extends SimpleComp { AnchorPane.setBottomAnchor(leftButtons, 15.0); AnchorPane.setLeftAnchor(leftButtons, 15.0); - var stack = new StackPane(pfx, rightPane, leftPane); + var stack = new StackPane(pfx, leftPane); stack.setPickOnBounds(false); AppFont.medium(stack); diff --git a/app/src/main/java/io/xpipe/app/comp/base/ErrorOverlayComp.java b/app/src/main/java/io/xpipe/app/comp/base/ErrorOverlayComp.java new file mode 100644 index 00000000..f0c7fbf2 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/comp/base/ErrorOverlayComp.java @@ -0,0 +1,44 @@ +package io.xpipe.app.comp.base; + +import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.fxcomps.SimpleComp; +import javafx.beans.property.Property; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.control.TextArea; +import javafx.scene.layout.Region; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; + +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class ErrorOverlayComp extends SimpleComp { + + Comp background; + Property text; + + public ErrorOverlayComp(Comp background, Property text) { + this.background = background; + this.text = text; + } + + @Override + protected Region createSimple() { + var content = new SimpleObjectProperty(); + this.text.addListener((observable, oldValue, newValue) -> { + var comp = Comp.of(() -> { + var l = new TextArea(); + l.textProperty().bind(text); + l.setWrapText(true); + l.getStyleClass().add("error-overlay-comp"); + l.setEditable(false); + return l; + }); + content.set(new ModalOverlayComp.OverlayContent("error", comp, null, () -> {})); + }); + content.addListener((observable, oldValue, newValue) -> { + if (newValue == null) { + this.text.setValue(null); + } + }); + return new ModalOverlayComp(background, content).createRegion(); + } +} diff --git a/app/src/main/java/io/xpipe/app/comp/base/MessageComp.java b/app/src/main/java/io/xpipe/app/comp/base/MessageComp.java deleted file mode 100644 index 4e7e5b05..00000000 --- a/app/src/main/java/io/xpipe/app/comp/base/MessageComp.java +++ /dev/null @@ -1,77 +0,0 @@ -package io.xpipe.app.comp.base; - -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.util.PlatformThread; -import io.xpipe.app.fxcomps.util.SimpleChangeListener; -import io.xpipe.app.util.ThreadHelper; -import javafx.beans.property.Property; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.value.ObservableValue; -import javafx.scene.control.TextArea; -import javafx.scene.layout.Region; -import javafx.scene.layout.StackPane; -import lombok.AccessLevel; -import lombok.experimental.FieldDefaults; - -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class MessageComp extends SimpleComp { - - Property shown = new SimpleBooleanProperty(); - - ObservableValue text; - int msShown; - - public MessageComp(ObservableValue text, int msShown) { - this.text = PlatformThread.sync(text); - this.msShown = msShown; - } - - public void show() { - shown.setValue(true); - - if (msShown != -1) { - ThreadHelper.runAsync(() -> { - try { - Thread.sleep(msShown); - } catch (InterruptedException ignored) { - } - - shown.setValue(false); - }); - } - } - - @Override - protected Region createSimple() { - var l = new TextArea(); - l.textProperty().bind(text); - l.setWrapText(true); - l.getStyleClass().add("message"); - l.setEditable(false); - - var sp = new StackPane(l); - sp.getStyleClass().add("message-comp"); - - SimpleChangeListener.apply(PlatformThread.sync(shown), n -> { - if (n) { - l.setMinHeight(Region.USE_PREF_SIZE); - l.setPrefHeight(Region.USE_COMPUTED_SIZE); - l.setMaxHeight(Region.USE_PREF_SIZE); - - sp.setMinHeight(Region.USE_PREF_SIZE); - sp.setPrefHeight(Region.USE_COMPUTED_SIZE); - sp.setMaxHeight(Region.USE_PREF_SIZE); - } else { - l.setMinHeight(0); - l.setPrefHeight(0); - l.setMaxHeight(0); - - sp.setMinHeight(0); - sp.setPrefHeight(0); - sp.setMaxHeight(0); - } - }); - - return sp; - } -} diff --git a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java new file mode 100644 index 00000000..8d6f738c --- /dev/null +++ b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java @@ -0,0 +1,107 @@ +package io.xpipe.app.comp.base; + +import atlantafx.base.controls.ModalPane; +import atlantafx.base.theme.Styles; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.fxcomps.util.Shortcuts; +import javafx.beans.property.Property; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonBar; +import javafx.scene.control.TitledPane; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Region; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import lombok.Value; +import org.kordamp.ikonli.javafx.FontIcon; + +public class ModalOverlayComp extends SimpleComp { + + + public ModalOverlayComp(Comp background, Property overlayContent) { + this.background = background; + this.overlayContent = overlayContent; + } + + @Value + public static class OverlayContent { + + String titleKey; + Comp content; + String finishKey; + Runnable onFinish; + } + + private final Comp background; + private final Property overlayContent; + + @Override + protected Region createSimple() { + var bgRegion = background.createRegion(); + var modal = new ModalPane(); + modal.getStyleClass().add("modal-overlay-comp"); + var pane = new StackPane(bgRegion, modal); + pane.setPickOnBounds(false); + PlatformThread.sync(overlayContent).addListener((observable, oldValue, newValue) -> { + if (oldValue != null) { + modal.hide(true); + } + + if (newValue != null) { + var r = newValue.content.createRegion(); + var box = new VBox(r); + box.setSpacing(15); + box.setPadding(new Insets(15)); + + if (newValue.finishKey != null) { + var finishButton = new Button(AppI18n.get(newValue.finishKey)); + Styles.toggleStyleClass(finishButton, Styles.FLAT); + finishButton.setOnAction(event -> { + newValue.onFinish.run(); + overlayContent.setValue(null); + }); + + var buttonBar = new ButtonBar(); + buttonBar.getButtons().addAll(finishButton); + box.getChildren().add(buttonBar); + } + + var tp = new TitledPane(AppI18n.get(newValue.titleKey), box); + tp.setMaxWidth(400); + tp.setCollapsible(false); + + var closeButton = new Button(null, new FontIcon("mdi2w-window-close")); + closeButton.setOnAction(event -> { + overlayContent.setValue(null); + }); + Shortcuts.addShortcut(closeButton, new KeyCodeCombination(KeyCode.ESCAPE)); + Styles.toggleStyleClass(closeButton, Styles.FLAT); + var close = new AnchorPane(closeButton); + close.setPickOnBounds(false); + AnchorPane.setTopAnchor(closeButton, 10.0); + AnchorPane.setRightAnchor(closeButton, 10.0); + + var stack = new StackPane(tp, close); + stack.setPadding(new Insets(10)); + stack.setOnMouseClicked(event -> { + if (overlayContent.getValue() != null) { + overlayContent.setValue(null); + } + }); + stack.setAlignment(Pos.CENTER); + close.maxWidthProperty().bind(tp.widthProperty()); + close.maxHeightProperty().bind(tp.heightProperty()); + + modal.show(stack); + } + }); + return pane; + } +} diff --git a/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java b/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java index c59fe1e3..73df1e01 100644 --- a/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java +++ b/app/src/main/java/io/xpipe/app/comp/source/store/GuiDsStoreCreator.java @@ -1,7 +1,6 @@ package io.xpipe.app.comp.source.store; -import io.xpipe.app.comp.base.InstallExtensionComp; -import io.xpipe.app.comp.base.MessageComp; +import io.xpipe.app.comp.base.ErrorOverlayComp; import io.xpipe.app.comp.base.MultiStepComp; import io.xpipe.app.core.AppExtensionManager; import io.xpipe.app.core.AppFont; @@ -9,7 +8,6 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppWindowHelper; import io.xpipe.app.core.mode.OperationMode; import io.xpipe.app.ext.DataStoreProvider; -import io.xpipe.app.ext.DownloadModuleInstall; import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.CompStructure; import io.xpipe.app.fxcomps.augment.GrowAugment; @@ -25,6 +23,7 @@ import io.xpipe.app.util.*; import io.xpipe.core.store.DataStore; import javafx.application.Platform; import javafx.beans.property.*; +import javafx.geometry.Insets; import javafx.scene.control.Alert; import javafx.scene.control.Separator; import javafx.scene.layout.BorderPane; @@ -48,7 +47,6 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { BooleanProperty busy = new SimpleBooleanProperty(); Property validator = new SimpleObjectProperty<>(new SimpleValidator()); Property messageProp = new SimpleStringProperty(); - MessageComp message = new MessageComp(messageProp, 10000); BooleanProperty finished = new SimpleBooleanProperty(); Property entry = new SimpleObjectProperty<>(); BooleanProperty changedSinceError = new SimpleBooleanProperty(); @@ -188,7 +186,14 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { @Override public CompStructure createBase() { + var back = Comp.of(this::createLayout); + var message = new ErrorOverlayComp(back, messageProp); + return message.createStructure(); + } + + private Region createLayout() { var layout = new BorderPane(); + layout.setPadding(new Insets(20)); var providerChoice = new DsStoreProviderChoiceComp(filter, provider); if (provider.getValue() != null) { providerChoice.apply(struc -> struc.get().setDisable(true)); @@ -197,37 +202,33 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { SimpleChangeListener.apply(provider, n -> { if (n != null) { - var install = n.getRequiredAdditionalInstallation(); - if (install != null && AppExtensionManager.getInstance().isInstalled(install)) { - layout.setCenter(new InstallExtensionComp((DownloadModuleInstall) install).createRegion()); - validator.setValue(new SimpleValidator()); - return; - } + // var install = n.getRequiredAdditionalInstallation(); + // if (install != null && AppExtensionManager.getInstance().isInstalled(install)) { + // layout.setCenter(new InstallExtensionComp((DownloadModuleInstall) + // install).createRegion()); + // validator.setValue(new SimpleValidator()); + // return; + // } var d = n.guiDialog(input); var propVal = new SimpleValidator(); var propR = createStoreProperties(d == null || d.getComp() == null ? null : d.getComp(), propVal); - var box = new VBox(propR); - box.setSpacing(7); + layout.setCenter(propR); - layout.setCenter(box); - - validator.setValue(new ChainedValidator(List.of(d != null && d.getValidator() != null ? d.getValidator() : new SimpleValidator(), propVal))); + validator.setValue(new ChainedValidator(List.of( + d != null && d.getValidator() != null ? d.getValidator() : new SimpleValidator(), propVal))); } else { layout.setCenter(null); validator.setValue(new SimpleValidator()); } }); - layout.setBottom(message.createRegion()); - var sep = new Separator(); sep.getStyleClass().add("spacer"); var top = new VBox(providerChoice.createRegion(), sep); top.getStyleClass().add("top"); layout.setTop(top); - // layout.getStyleClass().add("data-input-creation-step"); - return Comp.of(() -> layout).createStructure(); + return layout; } @Override @@ -275,7 +276,6 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { .getText(); TrackEvent.info(msg); messageProp.setValue(msg); - message.show(); changedSinceError.setValue(false); return false; } @@ -287,7 +287,6 @@ public class GuiDsStoreCreator extends MultiStepComp.Step> { PlatformThread.runLaterIfNeeded(parent::next); } catch (Exception ex) { messageProp.setValue(ExceptionConverter.convertMessage(ex)); - message.show(); changedSinceError.setValue(false); ErrorEvent.fromThrowable(ex).omit().reportable(false).handle(); } diff --git a/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java b/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java index aaa53138..d18a3bbf 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java @@ -3,7 +3,7 @@ package io.xpipe.app.comp.storage.collection; import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppWindowHelper; import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.augment.PopupMenuAugment; +import io.xpipe.app.fxcomps.augment.ContextMenuAugment; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.DesktopHelper; import javafx.scene.control.Alert; @@ -13,19 +13,14 @@ import javafx.scene.control.SeparatorMenuItem; import javafx.scene.layout.Region; import org.kordamp.ikonli.javafx.FontIcon; -public class SourceCollectionContextMenu> extends PopupMenuAugment { - - private final SourceCollectionWrapper group; - private final Region renameTextField; +public class SourceCollectionContextMenu> extends ContextMenuAugment { public SourceCollectionContextMenu( boolean showOnPrimaryButton, SourceCollectionWrapper group, Region renameTextField) { - super(showOnPrimaryButton); - this.group = group; - this.renameTextField = renameTextField; + super(showOnPrimaryButton, () -> createContextMenu(group, renameTextField)); } - private void onDelete() { + private static void onDelete(SourceCollectionWrapper group) { if (group.getEntries().size() > 0) { AppWindowHelper.showBlockingAlert(alert -> { alert.setTitle(AppI18n.get("confirmCollectionDeletionTitle")); @@ -44,7 +39,7 @@ public class SourceCollectionContextMenu> extends Pop } } - private void onClean() { + private static void onClean(SourceCollectionWrapper group) { if (group.getEntries().size() > 0) { AppWindowHelper.showBlockingAlert(alert -> { alert.setTitle(AppI18n.get("confirmCollectionDeletionTitle")); @@ -63,8 +58,7 @@ public class SourceCollectionContextMenu> extends Pop } } - @Override - protected ContextMenu createContextMenu() { + protected static ContextMenu createContextMenu(SourceCollectionWrapper group, Region renameTextField) { var cm = new ContextMenu(); var name = new MenuItem(group.getName()); name.setDisable(true); @@ -96,13 +90,13 @@ public class SourceCollectionContextMenu> extends Pop if (group.isDeleteable()) { var del = new MenuItem(AppI18n.get("delete"), new FontIcon("mdal-delete_outline")); del.setOnAction(e -> { - onDelete(); + onDelete(group); }); cm.getItems().add(del); } else { var del = new MenuItem(AppI18n.get("clean"), new FontIcon("mdal-delete_outline")); del.setOnAction(e -> { - onClean(); + onClean(group); }); cm.getItems().add(del); } diff --git a/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java b/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java index 13670fee..1b4b0722 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java @@ -3,7 +3,7 @@ package io.xpipe.app.comp.storage.source; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppI18n; import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.augment.PopupMenuAugment; +import io.xpipe.app.fxcomps.augment.ContextMenuAugment; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataSourceEntry; @@ -16,19 +16,14 @@ import javafx.scene.control.SeparatorMenuItem; import javafx.scene.layout.Region; import org.kordamp.ikonli.javafx.FontIcon; -public class SourceEntryContextMenu> extends PopupMenuAugment { +public class SourceEntryContextMenu> extends ContextMenuAugment { - private final SourceEntryWrapper entry; - private final Region renameTextField; public SourceEntryContextMenu(boolean showOnPrimaryButton, SourceEntryWrapper entry, Region renameTextField) { - super(showOnPrimaryButton); - this.entry = entry; - this.renameTextField = renameTextField; + super(showOnPrimaryButton, () -> createContextMenu(entry, renameTextField)); } - @Override - protected ContextMenu createContextMenu() { + protected static ContextMenu createContextMenu(SourceEntryWrapper entry, Region renameTextField) { var cm = new ContextMenu(); AppFont.normal(cm.getStyleableNode()); diff --git a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java index 19dc8353..b40c3f75 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryComp.java @@ -9,7 +9,7 @@ import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.SimpleComp; import io.xpipe.app.fxcomps.SimpleCompStructure; import io.xpipe.app.fxcomps.augment.GrowAugment; -import io.xpipe.app.fxcomps.augment.PopupMenuAugment; +import io.xpipe.app.fxcomps.augment.ContextMenuAugment; import io.xpipe.app.fxcomps.impl.*; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.fxcomps.util.SimpleChangeListener; @@ -164,12 +164,7 @@ public class StoreEntryComp extends SimpleComp { }); }); - new PopupMenuAugment<>(false) { - @Override - protected ContextMenu createContextMenu() { - return StoreEntryComp.this.createContextMenu(); - } - }.augment(new SimpleCompStructure<>(button)); + new ContextMenuAugment<>(false, () -> StoreEntryComp.this.createContextMenu()).augment(new SimpleCompStructure<>(button)); return button; } @@ -218,12 +213,7 @@ public class StoreEntryComp extends SimpleComp { private Comp createSettingsButton() { var settingsButton = new IconButtonComp("mdomz-settings"); settingsButton.styleClass("settings"); - settingsButton.apply(new PopupMenuAugment<>(true) { - @Override - protected ContextMenu createContextMenu() { - return StoreEntryComp.this.createContextMenu(); - } - }); + settingsButton.apply(new ContextMenuAugment<>(true, () -> StoreEntryComp.this.createContextMenu())); settingsButton.apply(GrowAugment.create(false, true)); settingsButton.apply(s -> { s.get().prefWidthProperty().bind(Bindings.divide(s.get().heightProperty(), 1.35)); diff --git a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryTree.java b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryTree.java new file mode 100644 index 00000000..2c264879 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryTree.java @@ -0,0 +1,36 @@ +package io.xpipe.app.comp.storage.store; + +import javafx.collections.ListChangeListener; +import javafx.scene.control.TreeItem; + +public class StoreEntryTree { + + public static TreeItem createTree() { + var topLevel = StoreSection.createTopLevel(); + var root = new TreeItem(); + root.setExpanded(true); + + // Listen for any entry list change, not only top level changes + StoreViewState.get().getAllEntries().addListener((ListChangeListener) c -> { + root.getChildren().clear(); + for (StoreSection v : topLevel.getChildren()) { + add(root, v); + } + }); + + for (StoreSection v : topLevel.getChildren()) { + add(root, v); + } + + return root; + } + + private static void add(TreeItem parent, StoreSection section) { + var item = new TreeItem<>(section.getWrapper()); + item.setExpanded(section.getWrapper().getExpanded().getValue()); + parent.getChildren().add(item); + for (StoreSection child : section.getChildren()) { + add(item, child); + } + } +} diff --git a/app/src/main/java/io/xpipe/app/core/App.java b/app/src/main/java/io/xpipe/app/core/App.java index db68063e..5ed92e93 100644 --- a/app/src/main/java/io/xpipe/app/core/App.java +++ b/app/src/main/java/io/xpipe/app/core/App.java @@ -73,7 +73,7 @@ public class App extends Application { var titleBinding = Bindings.createStringBinding( () -> { var base = String.format( - "X-Pipe Desktop (%s)", AppProperties.get().getVersion()); + "XPipe Desktop (%s)", AppProperties.get().getVersion()); var prefix = AppProperties.get().isStaging() ? "[STAGE] " : ""; var suffix = XPipeDistributionType.get().getUpdateHandler().getPreparedUpdate().getValue() != null ? String.format( diff --git a/app/src/main/java/io/xpipe/app/core/AppStyle.java b/app/src/main/java/io/xpipe/app/core/AppStyle.java index 10eb8e2f..f7cef72f 100644 --- a/app/src/main/java/io/xpipe/app/core/AppStyle.java +++ b/app/src/main/java/io/xpipe/app/core/AppStyle.java @@ -1,17 +1,9 @@ package io.xpipe.app.core; -import atlantafx.base.theme.NordDark; -import atlantafx.base.theme.NordLight; -import atlantafx.base.theme.PrimerDark; -import atlantafx.base.theme.PrimerLight; -import io.xpipe.app.ext.PrefsChoiceValue; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.prefs.AppPrefs; -import javafx.application.Application; import javafx.scene.Scene; -import lombok.AllArgsConstructor; -import lombok.Getter; import java.io.IOException; import java.nio.file.FileVisitResult; @@ -36,9 +28,6 @@ public class AppStyle { loadStylesheets(); if (AppPrefs.get() != null) { - AppPrefs.get().theme.addListener((c, o, n) -> { - changeTheme(o, n); - }); AppPrefs.get().useSystemFont.addListener((c, o, n) -> { changeFontUsage(n); }); @@ -78,12 +67,6 @@ public class AppStyle { } } - private static void changeTheme(Theme oldTheme, Theme newTheme) { - scenes.forEach(scene -> { - Application.setUserAgentStylesheet(newTheme.getTheme().getUserAgentStylesheet()); - }); - } - private static void changeFontUsage(boolean use) { if (!use) { scenes.forEach(scene -> { @@ -106,10 +89,6 @@ public class AppStyle { } public static void addStylesheets(Scene scene) { - var t = AppPrefs.get() != null ? AppPrefs.get().theme.getValue() : Theme.LIGHT; - Application.setUserAgentStylesheet(t.getTheme().getUserAgentStylesheet()); - TrackEvent.debug("Set theme " + t.getId() + " for scene"); - if (AppPrefs.get() != null && !AppPrefs.get().useSystemFont.get()) { scene.getStylesheets().add(FONT_CONTENTS); } @@ -122,21 +101,4 @@ public class AppStyle { scenes.add(scene); } - @AllArgsConstructor - @Getter - public enum Theme implements PrefsChoiceValue { - LIGHT("light", new PrimerLight()), - DARK("dark", new PrimerDark()), - NORD_LIGHT("nordLight", new NordLight()), - NORD_DARK("nordDark", new NordDark()); - // DARK("dark"); - - private final String id; - private final atlantafx.base.theme.Theme theme; - - @Override - public String toTranslatedString() { - return theme.getName(); - } - } } diff --git a/app/src/main/java/io/xpipe/app/core/AppTheme.java b/app/src/main/java/io/xpipe/app/core/AppTheme.java new file mode 100644 index 00000000..83e341ae --- /dev/null +++ b/app/src/main/java/io/xpipe/app/core/AppTheme.java @@ -0,0 +1,142 @@ +package io.xpipe.app.core; + +import atlantafx.base.theme.*; +import com.jthemedetecor.OsThemeDetector; +import io.xpipe.app.ext.PrefsChoiceValue; +import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.issue.ErrorEvent; +import io.xpipe.app.issue.TrackEvent; +import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.core.process.OsType; +import javafx.animation.Interpolator; +import javafx.animation.KeyFrame; +import javafx.animation.KeyValue; +import javafx.animation.Timeline; +import javafx.application.Application; +import javafx.css.PseudoClass; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.Pane; +import javafx.scene.paint.Color; +import javafx.stage.Window; +import javafx.util.Duration; +import lombok.AllArgsConstructor; +import lombok.Getter; + +public class AppTheme { + + public record AccentColor(Color primaryColor, PseudoClass pseudoClass) { + + public static AccentColor xpipeBlue() { + return new AccentColor(Color.web("#11B4B4"), PseudoClass.getPseudoClass("accent-primer-purple")); + } + } + + public static void init() { + if (AppPrefs.get() == null) { + return; + } + + OsThemeDetector detector = OsThemeDetector.getDetector(); + if (AppPrefs.get().theme.getValue() == null) { + try { + setDefault(detector.isDark()); + } catch (Throwable ex) { + ErrorEvent.fromThrowable(ex).omit().handle(); + setDefault(false); + } + } + var t = AppPrefs.get().theme.getValue(); + + Application.setUserAgentStylesheet(t.getTheme().getUserAgentStylesheet()); + TrackEvent.debug("Set theme " + t.getId() + " for scene"); + + detector.registerListener(dark -> { + PlatformThread.runLaterIfNeeded(() -> { + if (dark && !AppPrefs.get().theme.getValue().getTheme().isDarkMode()) { + AppPrefs.get().theme.setValue(Theme.getDefaultDarkTheme()); + } + + if (!dark && AppPrefs.get().theme.getValue().getTheme().isDarkMode()) { + AppPrefs.get().theme.setValue(Theme.getDefaultLightTheme()); + } + }); + }); + + AppPrefs.get().theme.addListener((c, o, n) -> { + changeTheme(n); + }); + } + + private static void setDefault(boolean dark) { + if (dark) { + AppPrefs.get().theme.setValue(Theme.getDefaultDarkTheme()); + } else { + AppPrefs.get().theme.setValue(Theme.getDefaultLightTheme()); + } + } + + private static void changeTheme(Theme newTheme) { + if (newTheme == null) { + return; + } + + PlatformThread.runLaterIfNeeded(() -> { + for (Window window : Window.getWindows()) { + var scene = window.getScene(); + Image snapshot = scene.snapshot(null); + Pane root = (Pane) scene.getRoot(); + + ImageView imageView = new ImageView(snapshot); + root.getChildren().add(imageView); + + // Animate! + var transition = new Timeline( + new KeyFrame(Duration.ZERO, new KeyValue(imageView.opacityProperty(), 1, Interpolator.EASE_OUT)), + new KeyFrame( + Duration.millis(1250), new KeyValue(imageView.opacityProperty(), 0, Interpolator.EASE_OUT))); + transition.setOnFinished(e -> root.getChildren().remove(imageView)); + transition.play(); + } + + Application.setUserAgentStylesheet(newTheme.getTheme().getUserAgentStylesheet()); + TrackEvent.debug("Set theme " + newTheme.getId() + " for scene"); + }); + } + + @AllArgsConstructor + @Getter + public enum Theme implements PrefsChoiceValue { + PRIMER_LIGHT("light", new PrimerLight()), + PRIMER_DARK("dark", new PrimerDark()), + NORD_LIGHT("nordLight", new NordLight()), + NORD_DARK("nordDark", new NordDark()), + CUPERTINO_LIGHT("cupertinoLight", new CupertinoLight()), + CUPERTINO_DARK("cupertinoDark", new CupertinoDark()), + DRACULA("dracula", new Dracula()); + + static Theme getDefaultLightTheme() { + return switch (OsType.getLocal()) { + case OsType.Windows windows -> PRIMER_LIGHT; + case OsType.Linux linux -> NORD_LIGHT; + case OsType.MacOs macOs -> CUPERTINO_LIGHT; + }; + } + + static Theme getDefaultDarkTheme() { + return switch (OsType.getLocal()) { + case OsType.Windows windows -> PRIMER_DARK; + case OsType.Linux linux -> NORD_DARK; + case OsType.MacOs macOs -> CUPERTINO_DARK; + }; + } + + private final String id; + private final atlantafx.base.theme.Theme theme; + + @Override + public String toTranslatedString() { + return theme.getName(); + } + } +} diff --git a/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java b/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java index bf101947..4e54bf84 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java @@ -8,6 +8,7 @@ import io.xpipe.app.launcher.LauncherCommand; import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.XPipeSession; import io.xpipe.core.util.XPipeDaemonMode; +import io.xpipe.core.util.XPipeSystemId; import org.apache.commons.lang3.function.FailableRunnable; import java.util.ArrayList; @@ -91,6 +92,7 @@ public abstract class OperationMode { AppProperties.logArguments(args); AppProperties.logSystemProperties(); AppProperties.logPassedProperties(); + XPipeSystemId.init(); TrackEvent.info("mode", "Finished initial setup"); } catch (Throwable ex) { ErrorEvent.fromThrowable(ex).term().handle(); diff --git a/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java b/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java index 1b114707..63ceeddc 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java @@ -60,6 +60,7 @@ public abstract class PlatformMode extends OperationMode { TrackEvent.info("mode", "Platform mode initial setup"); AppI18n.init(); AppFont.loadFonts(); + AppTheme.init(); AppStyle.init(); AppImages.init(); TrackEvent.info("mode", "Finished essential component initialization before platform"); diff --git a/app/src/main/java/io/xpipe/app/fxcomps/augment/ContextMenuAugment.java b/app/src/main/java/io/xpipe/app/fxcomps/augment/ContextMenuAugment.java new file mode 100644 index 00000000..ac9fd9cd --- /dev/null +++ b/app/src/main/java/io/xpipe/app/fxcomps/augment/ContextMenuAugment.java @@ -0,0 +1,43 @@ +package io.xpipe.app.fxcomps.augment; + +import io.xpipe.app.fxcomps.CompStructure; +import javafx.scene.control.ContextMenu; +import javafx.scene.input.MouseButton; + +import java.util.function.Supplier; + +public class ContextMenuAugment> implements Augment { + + private final boolean showOnPrimaryButton; + private final Supplier contextMenu; + + public ContextMenuAugment(boolean showOnPrimaryButton, Supplier contextMenu) { + this.showOnPrimaryButton = showOnPrimaryButton; + this.contextMenu = contextMenu; + } + + private static ContextMenu currentContextMenu; + + @Override + public void augment(S struc) { + var r = struc.get(); + r.setOnMousePressed(event -> { + if (currentContextMenu != null && currentContextMenu.isShowing()) { + currentContextMenu.hide(); + currentContextMenu = null; + } + + if ((showOnPrimaryButton && event.getButton() == MouseButton.PRIMARY) + || (!showOnPrimaryButton && event.getButton() == MouseButton.SECONDARY)) { + var cm = contextMenu.get(); + if (cm != null) { + cm.setAutoHide(true); + cm.show(r, event.getScreenX(), event.getScreenY()); + currentContextMenu = cm; + } + + event.consume(); + } + }); + } +} diff --git a/app/src/main/java/io/xpipe/app/fxcomps/augment/PopupMenuAugment.java b/app/src/main/java/io/xpipe/app/fxcomps/augment/PopupMenuAugment.java deleted file mode 100644 index 7a8e2064..00000000 --- a/app/src/main/java/io/xpipe/app/fxcomps/augment/PopupMenuAugment.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.xpipe.app.fxcomps.augment; - -import io.xpipe.app.fxcomps.CompStructure; -import javafx.scene.control.ContextMenu; -import javafx.scene.input.MouseButton; - -public abstract class PopupMenuAugment> implements Augment { - - private final boolean showOnPrimaryButton; - - protected PopupMenuAugment(boolean showOnPrimaryButton) { - this.showOnPrimaryButton = showOnPrimaryButton; - } - - protected abstract ContextMenu createContextMenu(); - - @Override - public void augment(S struc) { - var cm = createContextMenu(); - var r = struc.get(); - r.setOnMousePressed(event -> { - if ((showOnPrimaryButton && event.getButton() == MouseButton.PRIMARY) - || (!showOnPrimaryButton && event.getButton() == MouseButton.SECONDARY)) { - cm.show(r, event.getScreenX(), event.getScreenY()); - event.consume(); - } else { - cm.hide(); - } - }); - } -} diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/SvgView.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/SvgView.java index 07fb5480..f8989fa6 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/SvgView.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/SvgView.java @@ -52,7 +52,7 @@ public class SvgView { var widthProperty = new SimpleIntegerProperty(); var heightProperty = new SimpleIntegerProperty(); SimpleChangeListener.apply(content, val -> { - if (val == null) { + if (val == null || val.isBlank()) { return; } diff --git a/app/src/main/java/io/xpipe/app/fxcomps/util/Shortcuts.java b/app/src/main/java/io/xpipe/app/fxcomps/util/Shortcuts.java index f80ec6b2..d6a952a3 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/util/Shortcuts.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/util/Shortcuts.java @@ -9,6 +9,7 @@ import javafx.scene.layout.Region; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; @@ -21,7 +22,6 @@ public class Shortcuts { } public static void addShortcut(T region, KeyCombination comb, Consumer exec) { - AtomicReference scene = new AtomicReference<>(region.getScene()); var filter = new EventHandler() { public void handle(KeyEvent ke) { if (comb.match(ke)) { @@ -30,21 +30,23 @@ public class Shortcuts { } } }; - SHORTCUTS.put(region, comb); + AtomicReference scene = new AtomicReference<>(); SimpleChangeListener.apply(region.sceneProperty(), s -> { + if (Objects.equals(s, scene.get())) { + return; + } + + if (scene.get() != null) { + scene.get().removeEventHandler(KeyEvent.KEY_PRESSED, filter); + SHORTCUTS.remove(region); + scene.set(null); + } + if (s != null) { scene.set(s); s.addEventHandler(KeyEvent.KEY_PRESSED, filter); SHORTCUTS.put(region, comb); - } else { - if (scene.get() == null) { - return; - } - - scene.get().removeEventHandler(KeyEvent.KEY_PRESSED, filter); - SHORTCUTS.remove(region); - scene.set(null); } }); } diff --git a/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java b/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java index 258b376f..e2aa88a3 100644 --- a/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java +++ b/app/src/main/java/io/xpipe/app/launcher/LauncherInput.java @@ -1,9 +1,11 @@ package io.xpipe.app.launcher; +import io.xpipe.app.browser.BrowserModel; import io.xpipe.app.core.mode.OperationMode; import io.xpipe.app.ext.ActionProvider; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.issue.TrackEvent; +import io.xpipe.core.store.ShellStore; import lombok.Getter; import lombok.Value; @@ -114,7 +116,8 @@ public abstract class LauncherInput { return; } - // GuiDsCreatorMultiStep.showForStore(DataSourceProvider.Category.STREAM, FileStore.local(file), null); + var dir = Files.isDirectory(file) ? file : file.getParent(); + BrowserModel.DEFAULT.openFileSystemAsync(ShellStore.createLocal(), dir.toString()); } @Override diff --git a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java index 07973cc3..f7345b5e 100644 --- a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java +++ b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java @@ -11,7 +11,7 @@ import com.dlsc.preferencesfx.util.VisibilityProperty; import io.xpipe.app.comp.base.ButtonComp; import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppProperties; -import io.xpipe.app.core.AppStyle; +import io.xpipe.app.core.AppTheme; import io.xpipe.app.ext.PrefsChoiceValue; import io.xpipe.app.ext.PrefsHandler; import io.xpipe.app.ext.PrefsProvider; @@ -68,8 +68,8 @@ public class AppPrefs { private static AppPrefs INSTANCE; private final SimpleListProperty languageList = new SimpleListProperty<>(FXCollections.observableArrayList(Arrays.asList(SupportedLocale.values()))); - private final SimpleListProperty themeList = - new SimpleListProperty<>(FXCollections.observableArrayList(Arrays.asList(AppStyle.Theme.values()))); + private final SimpleListProperty themeList = + new SimpleListProperty<>(FXCollections.observableArrayList(Arrays.asList(AppTheme.Theme.values()))); private final SimpleListProperty closeBehaviourList = new SimpleListProperty<>( FXCollections.observableArrayList(PrefsChoiceValue.getSupported(CloseBehaviour.class))); private final SimpleListProperty externalEditorList = new SimpleListProperty<>( @@ -90,11 +90,10 @@ public class AppPrefs { languageList, languageInternal) .render(() -> new TranslatableComboBoxControl<>()); - private final ObjectProperty themeInternal = - typed(new SimpleObjectProperty<>(AppStyle.Theme.LIGHT), AppStyle.Theme.class); - public final ReadOnlyProperty theme = themeInternal; - private final SingleSelectionField themeControl = - Field.ofSingleSelectionType(themeList, themeInternal).render(() -> new TranslatableComboBoxControl<>()); + public final ObjectProperty theme = + typed(new SimpleObjectProperty<>(), AppTheme.Theme.class); + private final SingleSelectionField themeControl = + Field.ofSingleSelectionType(themeList, theme).render(() -> new TranslatableComboBoxControl<>()); private final BooleanProperty useSystemFontInternal = typed(new SimpleBooleanProperty(true), Boolean.class); public final ReadOnlyBooleanProperty useSystemFont = useSystemFontInternal; private final IntegerProperty tooltipDelayInternal = typed(new SimpleIntegerProperty(1000), Integer.class); @@ -512,7 +511,7 @@ public class AppPrefs { Group.of( "uiOptions", Setting.of("language", languageControl, languageInternal), - Setting.of("theme", themeControl, themeInternal), + Setting.of("theme", themeControl, theme), Setting.of("useSystemFont", useSystemFontInternal), Setting.of("tooltipDelay", tooltipDelayInternal, tooltipDelayMin, tooltipDelayMax)), Group.of("windowOptions", Setting.of("saveWindowLocation", saveWindowLocationInternal))), diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java index dbac96cd..94beeabf 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java @@ -27,6 +27,11 @@ public abstract class ExternalApplicationType implements PrefsChoiceValue { public abstract boolean isAvailable(); + @Override + public String toString() { + return getId(); + } + public static class MacApplication extends ExternalApplicationType { protected final String applicationName; diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java index 8b18b7ce..2aa24c05 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java @@ -23,6 +23,11 @@ public interface ExternalEditorType extends PrefsChoiceValue { public static final ExternalEditorType VSCODE_WINDOWS = new WindowsFullPathType("app.vscode") { + @Override + public boolean canOpenDirectory() { + return true; + } + @Override protected Optional determinePath() { return Optional.of(Path.of(System.getenv("LOCALAPPDATA")) @@ -48,7 +53,13 @@ public interface ExternalEditorType extends PrefsChoiceValue { } }; - public static final LinuxPathType VSCODE_LINUX = new LinuxPathType("app.vscode", "code"); + public static final LinuxPathType VSCODE_LINUX = new LinuxPathType("app.vscode", "code") { + + @Override + public boolean canOpenDirectory() { + return true; + } + }; public static final LinuxPathType KATE = new LinuxPathType("app.kate", "kate"); @@ -81,7 +92,13 @@ public interface ExternalEditorType extends PrefsChoiceValue { public static final ExternalEditorType SUBLIME_MACOS = new MacOsEditor("app.sublime", "Sublime Text"); - public static final ExternalEditorType VSCODE_MACOS = new MacOsEditor("app.vscode", "Visual Studio Code"); + public static final ExternalEditorType VSCODE_MACOS = new MacOsEditor("app.vscode", "Visual Studio Code") { + + @Override + public boolean canOpenDirectory() { + return true; + } + }; public static final ExternalEditorType CUSTOM = new ExternalEditorType() { @@ -110,6 +127,10 @@ public interface ExternalEditorType extends PrefsChoiceValue { public void launch(Path file) throws Exception; + default boolean canOpenDirectory() { + return false; + } + public static class LinuxPathType extends ExternalApplicationType.PathApplication implements ExternalEditorType { public LinuxPathType(String id, String command) { diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java index 88687c9f..e70b23a8 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java @@ -17,7 +17,7 @@ import java.util.stream.Stream; public interface ExternalTerminalType extends PrefsChoiceValue { - public static final ExternalTerminalType CMD = new SimpleType("cmd", "cmd.exe", "cmd.exe") { + ExternalTerminalType CMD = new SimpleType("app.cmd", "cmd.exe", "cmd.exe") { @Override protected String toCommand(String name, String file) { @@ -30,8 +30,8 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } }; - public static final ExternalTerminalType POWERSHELL_WINDOWS = - new SimpleType("powershell", "powershell", "PowerShell") { + ExternalTerminalType POWERSHELL_WINDOWS = + new SimpleType("app.powershell", "powershell", "PowerShell") { @Override protected String toCommand(String name, String file) { @@ -44,13 +44,13 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } }; - public static final ExternalTerminalType PWSH_WINDOWS = new SimpleType("pwsh", "pwsh", "PowerShell Core") { + ExternalTerminalType PWSH_WINDOWS = new SimpleType("app.pwsh", "pwsh", "PowerShell Core") { @Override protected String toCommand(String name, String file) { // Fix for https://github.com/PowerShell/PowerShell/issues/18530#issuecomment-1325691850 var script = ScriptHelper.createLocalExecScript("set \"PSModulePath=\"\r\n\"" + file + "\"\npause"); - return "-ExecutionPolicy Bypass -NoProfile -Command cmd /C '" +script + "'"; + return "-ExecutionPolicy Bypass -NoProfile -Command cmd /C '" + script + "'"; } @Override @@ -59,8 +59,8 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } }; - public static final ExternalTerminalType WINDOWS_TERMINAL = - new SimpleType("windowsTerminal", "wt.exe", "Windows Terminal") { + ExternalTerminalType WINDOWS_TERMINAL = + new SimpleType("app.windowsTerminal", "wt.exe", "Windows Terminal") { @Override protected String toCommand(String name, String file) { @@ -77,8 +77,8 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } }; - public static final ExternalTerminalType GNOME_TERMINAL = - new SimpleType("gnomeTerminal", "gnome-terminal", "Gnome Terminal") { + ExternalTerminalType GNOME_TERMINAL = + new SimpleType("app.gnomeTerminal", "gnome-terminal", "Gnome Terminal") { @Override public void launch(String name, String file, boolean elevated) throws Exception { @@ -105,11 +105,12 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } }; - public static final ExternalTerminalType KONSOLE = new SimpleType("konsole", "konsole", "Konsole") { + ExternalTerminalType KONSOLE = new SimpleType("app.konsole", "konsole", "Konsole") { @Override protected String toCommand(String name, String file) { - // Note for later: When debugging konsole launches, it will always open as a child process of IntelliJ/X-Pipe even though we try to detach it. + // Note for later: When debugging konsole launches, it will always open as a child process of + // IntelliJ/X-Pipe even though we try to detach it. // This is not the case for production where it works as expected return "--new-tab -e \"" + file + "\""; } @@ -120,7 +121,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } }; - public static final ExternalTerminalType XFCE = new SimpleType("xfce", "xfce4-terminal", "Xfce") { + ExternalTerminalType XFCE = new SimpleType("app.xfce", "xfce4-terminal", "Xfce") { @Override protected String toCommand(String name, String file) { @@ -133,15 +134,15 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } }; - public static final ExternalTerminalType MACOS_TERMINAL = new MacOsTerminalType(); + ExternalTerminalType MACOS_TERMINAL = new MacOsTerminalType(); - public static final ExternalTerminalType ITERM2 = new ITerm2Type(); + ExternalTerminalType ITERM2 = new ITerm2Type(); - public static final ExternalTerminalType WARP = new WarpType(); + ExternalTerminalType WARP = new WarpType(); - public static final ExternalTerminalType CUSTOM = new CustomType(); + ExternalTerminalType CUSTOM = new CustomType(); - public static final List ALL = Stream.of( + List ALL = Stream.of( WINDOWS_TERMINAL, PWSH_WINDOWS, POWERSHELL_WINDOWS, @@ -156,7 +157,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { .filter(terminalType -> terminalType.isSelectable()) .toList(); - public static ExternalTerminalType getDefault() { + static ExternalTerminalType getDefault() { return ALL.stream() .filter(externalTerminalType -> !externalTerminalType.equals(CUSTOM)) .filter(terminalType -> terminalType.isAvailable()) @@ -164,12 +165,12 @@ public interface ExternalTerminalType extends PrefsChoiceValue { .orElse(null); } - public abstract void launch(String name, String file, boolean elevated) throws Exception; + void launch(String name, String file, boolean elevated) throws Exception; - static class MacOsTerminalType extends ExternalApplicationType.MacApplication implements ExternalTerminalType { + class MacOsTerminalType extends ExternalApplicationType.MacApplication implements ExternalTerminalType { public MacOsTerminalType() { - super("macosTerminal", "Terminal"); + super("app.macosTerminal", "Terminal"); } @Override @@ -178,22 +179,21 @@ public interface ExternalTerminalType extends PrefsChoiceValue { var suffix = file.equals(pc.getShellDialect().getOpenCommand()) ? "\"\"" : "\"" + file.replaceAll("\"", "\\\\\"") + "\""; - var cmd = String.format( - """ - osascript - "$@" < readOnlyLabel.getStyleClass().add("read-only-label"); comboBox.setMaxWidth(Double.MAX_VALUE); - comboBox.setVisibleRowCount(4); + comboBox.setVisibleRowCount(10); node.setAlignment(Pos.CENTER_LEFT); node.getChildren().addAll(comboBox, readOnlyLabel); diff --git a/app/src/main/java/io/xpipe/app/util/Containers.java b/app/src/main/java/io/xpipe/app/util/Containers.java deleted file mode 100644 index f7a901d1..00000000 --- a/app/src/main/java/io/xpipe/app/util/Containers.java +++ /dev/null @@ -1,64 +0,0 @@ -/* SPDX-License-Identifier: MIT */ - -package io.xpipe.app.util; - -import javafx.geometry.Insets; -import javafx.scene.Node; -import javafx.scene.control.ScrollPane; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.ColumnConstraints; -import javafx.scene.layout.Priority; -import javafx.scene.layout.Region; - -import static javafx.scene.layout.Region.USE_COMPUTED_SIZE; -import static javafx.scene.layout.Region.USE_PREF_SIZE; - -public final class Containers { - - public static final ColumnConstraints H_GROW_NEVER = columnConstraints(Priority.NEVER); - - public static void setAnchors(Node node, Insets insets) { - if (insets.getTop() >= 0) { - AnchorPane.setTopAnchor(node, insets.getTop()); - } - if (insets.getRight() >= 0) { - AnchorPane.setRightAnchor(node, insets.getRight()); - } - if (insets.getBottom() >= 0) { - AnchorPane.setBottomAnchor(node, insets.getBottom()); - } - if (insets.getLeft() >= 0) { - AnchorPane.setLeftAnchor(node, insets.getLeft()); - } - } - - public static void setScrollConstraints(ScrollPane scrollPane, - ScrollPane.ScrollBarPolicy vbarPolicy, boolean fitHeight, - ScrollPane.ScrollBarPolicy hbarPolicy, boolean fitWidth) { - scrollPane.setVbarPolicy(vbarPolicy); - scrollPane.setFitToHeight(fitHeight); - scrollPane.setHbarPolicy(hbarPolicy); - scrollPane.setFitToWidth(fitWidth); - } - - public static ColumnConstraints columnConstraints(Priority hgrow) { - return columnConstraints(USE_COMPUTED_SIZE, hgrow); - } - - public static ColumnConstraints columnConstraints(double minWidth, Priority hgrow) { - double maxWidth = hgrow == Priority.ALWAYS ? Double.MAX_VALUE : USE_PREF_SIZE; - ColumnConstraints constraints = new ColumnConstraints(minWidth, USE_COMPUTED_SIZE, maxWidth); - constraints.setHgrow(hgrow); - return constraints; - } - - public static void usePrefWidth(Region region) { - region.setMinWidth(USE_PREF_SIZE); - region.setMaxWidth(USE_PREF_SIZE); - } - - public static void usePrefHeight(Region region) { - region.setMinHeight(USE_PREF_SIZE); - region.setMaxHeight(USE_PREF_SIZE); - } -} diff --git a/app/src/main/java/io/xpipe/app/util/Controls.java b/app/src/main/java/io/xpipe/app/util/Controls.java deleted file mode 100644 index 238aea07..00000000 --- a/app/src/main/java/io/xpipe/app/util/Controls.java +++ /dev/null @@ -1,73 +0,0 @@ -/* SPDX-License-Identifier: MIT */ - -package io.xpipe.app.util; - -import javafx.scene.control.*; -import javafx.scene.input.KeyCombination; -import org.kordamp.ikonli.Ikon; -import org.kordamp.ikonli.javafx.FontIcon; - -import java.net.URI; - -import static atlantafx.base.theme.Styles.BUTTON_ICON; - -public final class Controls { - - public static Button iconButton(Ikon icon, boolean disable) { - return button("", icon, disable, BUTTON_ICON); - } - - public static Button button(String text, Ikon icon, boolean disable, String... styleClasses) { - var button = new Button(text); - if (icon != null) { - button.setGraphic(new FontIcon(icon)); - } - button.setDisable(disable); - button.getStyleClass().addAll(styleClasses); - return button; - } - - public static MenuItem menuItem(String text, Ikon graphic, KeyCombination accelerator) { - return menuItem(text, graphic, accelerator, false); - } - - public static MenuItem menuItem(String text, Ikon graphic, KeyCombination accelerator, boolean disable) { - var item = new MenuItem(text); - - if (graphic != null) { - item.setGraphic(new FontIcon(graphic)); - } - if (accelerator != null) { - item.setAccelerator(accelerator); - } - item.setDisable(disable); - - return item; - } - - public static ToggleButton toggleButton(String text, - Ikon icon, - ToggleGroup group, - boolean selected, - String... styleClasses) { - var toggleButton = new ToggleButton(text); - if (icon != null) { - toggleButton.setGraphic(new FontIcon(icon)); - } - if (group != null) { - toggleButton.setToggleGroup(group); - } - toggleButton.setSelected(selected); - toggleButton.getStyleClass().addAll(styleClasses); - - return toggleButton; - } - - public static Hyperlink hyperlink(String text, URI uri) { - var hyperlink = new Hyperlink(text); - if (uri != null) { - hyperlink.setOnAction(event -> Hyperlinks.open(uri.toString())); - } - return hyperlink; - } -} diff --git a/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java b/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java index 77fc8922..c1544446 100644 --- a/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java +++ b/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java @@ -1,5 +1,3 @@ -/* SPDX-License-Identifier: MIT */ - package io.xpipe.app.util; import java.text.CharacterIterator; diff --git a/app/src/main/java/io/xpipe/app/util/MacOsPermissions.java b/app/src/main/java/io/xpipe/app/util/MacOsPermissions.java index 937ba673..6a1f4c98 100644 --- a/app/src/main/java/io/xpipe/app/util/MacOsPermissions.java +++ b/app/src/main/java/io/xpipe/app/util/MacOsPermissions.java @@ -17,8 +17,11 @@ public class MacOsPermissions { var state = new SimpleBooleanProperty(true); try (var pc = LocalStore.getShell().start()) { while (state.get()) { - var success = pc.executeSimpleBooleanCommand( - "osascript -e 'tell application \"System Events\" to keystroke \"t\"'"); + var success = pc.osascriptCommand( + """ + tell application "System Events" to keystroke "t" + """) + .executeAndCheck(); if (success) { Platform.runLater(() -> { if (alert.get() != null) { diff --git a/app/src/main/java/io/xpipe/app/util/ScriptHelper.java b/app/src/main/java/io/xpipe/app/util/ScriptHelper.java index 82c30477..eb30b576 100644 --- a/app/src/main/java/io/xpipe/app/util/ScriptHelper.java +++ b/app/src/main/java/io/xpipe/app/util/ScriptHelper.java @@ -17,8 +17,13 @@ import java.util.Random; public class ScriptHelper { public static String createDetachCommand(ShellControl pc, String command) { + if (pc.getShellDialect().equals(ShellDialects.POWERSHELL)) { + var script = ScriptHelper.createExecScript(pc, command); + return String.format("Start-Process -WindowStyle Minimized -FilePath powershell.exe -ArgumentList \"-NoProfile\", \"-File\", %s", ShellDialects.POWERSHELL.fileArgument(script)); + } + if (pc.getOsType().equals(OsType.WINDOWS)) { - return "start \"\" " + command; + return "start \"\" /MIN " + command; } else { return "nohup " + command + " /dev/null & disown"; } diff --git a/app/src/main/java/module-info.java b/app/src/main/java/module-info.java index 8f29eb49..69dd3b9c 100644 --- a/app/src/main/java/module-info.java +++ b/app/src/main/java/module-info.java @@ -1,3 +1,4 @@ +import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.core.AppLogs; import io.xpipe.app.exchange.*; import io.xpipe.app.exchange.api.*; @@ -33,6 +34,7 @@ open module io.xpipe.app { exports io.xpipe.app.fxcomps.util; exports io.xpipe.app.fxcomps.augment; exports io.xpipe.app.test; + exports io.xpipe.app.browser.action; exports io.xpipe.app.browser; exports io.xpipe.app.browser.icon; @@ -81,6 +83,8 @@ open module io.xpipe.app { requires java.management; requires jdk.management; requires jdk.management.agent; + requires com.jthemedetector; + requires versioncompare; // Required by extensions requires commons.math3; @@ -119,11 +123,13 @@ open module io.xpipe.app { uses ProxyFunction; uses ModuleLayerLoader; uses ScanProvider; + uses BrowserAction; provides ModuleLayerLoader with DataSourceTarget.Loader, ActionProvider.Loader, PrefsProvider.Loader, + BrowserAction.Loader, ScanProvider.Loader; provides DataStateProvider with DataStateProviderImpl; diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_list.txt b/app/src/main/resources/io/xpipe/app/resources/file_list.txt similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_list.txt rename to app/src/main/resources/io/xpipe/app/resources/file_list.txt diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_list.txt b/app/src/main/resources/io/xpipe/app/resources/folder_list.txt similarity index 100% rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_list.txt rename to app/src/main/resources/io/xpipe/app/resources/folder_list.txt diff --git a/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties b/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties index 207fa984..470e509c 100644 --- a/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties +++ b/app/src/main/resources/io/xpipe/app/resources/lang/translations_en.properties @@ -9,6 +9,11 @@ setLock=Set lock changeLock=Change lock lockCreationAlertTitle=Create Lock lockCreationAlertHeader=Set your new lock password +finish=Finish +error=Error +ok=Ok +newFile=New file +newDirectory=New directory password=Password unlockAlertTitle=Unlock workspace unlockAlertHeader=Enter your lock password to continue diff --git a/app/src/main/resources/io/xpipe/app/resources/style/browser.css b/app/src/main/resources/io/xpipe/app/resources/style/browser.css index 7d82d99e..a60e4a78 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/browser.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/browser.css @@ -49,7 +49,22 @@ } .browser .bookmark-list { - -fx-border-width: 0 0 1 1; + -fx-border-width: 0; +} + +.browser .bookmark-list *.scroll-bar:horizontal, +.browser .bookmark-list *.scroll-bar:horizontal *.track, +.browser .bookmark-list *.scroll-bar:horizontal *.track-background, +.browser .bookmark-list *.scroll-bar:horizontal *.thumb, +.browser .bookmark-list *.scroll-bar:horizontal *.increment-button, +.browser .bookmark-list *.scroll-bar:horizontal *.decrement-button, +.browser .bookmark-list *.scroll-bar:horizontal *.increment-arrow, +.browser .bookmark-list *.scroll-bar:horizontal *.decrement-arrow { + -fx-background-color: null; + -fx-background-radius: 0; + -fx-background-insets: 0; + -fx-padding: 0; + -fx-shape: null; } .browser .tool-bar { @@ -58,7 +73,7 @@ } .browser .status-bar { - -fx-border-width: 1 0 1 0; + -fx-border-width: 1 0 0 0; -fx-border-color: -color-neutral-muted; } @@ -66,6 +81,56 @@ -fx-padding: 0; } +.browser .context-menu > * > * { +-fx-padding: 3px 10px 3px 10px; +-fx-background-radius: 1px; +-fx-spacing: 20px; +} + +.browser .context-menu .separator { +-fx-padding: 0; +} + +.browser .breadcrumbs { +-fx-padding: 2px 10px 2px 10px; +} + +.browser .context-menu .separator .line { +-fx-padding: 0; +-fx-border-insets: 0px; +} + +.browser .breadcrumbs .button { +-fx-padding: 3px 1px 3px 1px; +-fx-background-color: transparent; +} + +.browser .breadcrumbs .button:hover { +-fx-background-color: -color-neutral-muted; +} +.browser .path-text:invisible { +-fx-text-fill: transparent; +} + +.browser .context-menu .accelerator-text { +-fx-padding: 3px 0px 3px 50px; +} + +.browser .context-menu > * { +-fx-padding: 0; +} + +.browser .context-menu { +-fx-padding: 0; +-fx-background-radius: 1px; +-fx-border-color: -color-neutral-muted; +} + +.browser .tab-pane { + -fx-border-width: 0 0 0 1px; +-fx-border-color: -color-neutral-emphasis; +} + .chooser-bar { -fx-border-color: -color-neutral-emphasis; -fx-border-width: 0.1em 0 0 0; @@ -83,7 +148,7 @@ visibility: hidden ; } -.browser .table-directory-view .table-view { +.browser .table-view { -color-header-bg: -color-bg-default; -color-cell-bg-selected: -color-neutral-emphasis; -color-cell-fg-selected: -color-fg-emphasis; @@ -96,7 +161,7 @@ -fx-opacity: 0.75; } -.browser .table-directory-view .table-view:drag-into-current .table-row-cell { +.browser .table-view:drag-into-current .table-row-cell { -fx-opacity: 0.8; } diff --git a/app/src/main/resources/io/xpipe/app/resources/style/data-store-step.css b/app/src/main/resources/io/xpipe/app/resources/style/data-store-step.css index 114c9538..cafd6e18 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/data-store-step.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/data-store-step.css @@ -1,5 +1,5 @@ .step { --fx-padding: 1em 1.5em 0.5em 1.5em; +-fx-padding: 0; } .spacer { diff --git a/app/src/main/resources/io/xpipe/app/resources/style/error-overlay-comp.css b/app/src/main/resources/io/xpipe/app/resources/style/error-overlay-comp.css new file mode 100644 index 00000000..6bc56f69 --- /dev/null +++ b/app/src/main/resources/io/xpipe/app/resources/style/error-overlay-comp.css @@ -0,0 +1,5 @@ +.error-overlay-comp { +-fx-padding: 1.0em; +-fx-border-width: 1px; +-fx-border-radius: 2px; +} diff --git a/app/src/main/resources/io/xpipe/app/resources/style/modal-overlay-comp.css b/app/src/main/resources/io/xpipe/app/resources/style/modal-overlay-comp.css new file mode 100644 index 00000000..229981cd --- /dev/null +++ b/app/src/main/resources/io/xpipe/app/resources/style/modal-overlay-comp.css @@ -0,0 +1,18 @@ +.modal-overlay-comp .titled-pane { +-fx-padding: 0; +-fx-border-radius: 0; +} + +.modal-overlay-comp { +-fx-border-radius: 0; +-fx-background-radius: 0; +} + +.modal-overlay-comp .titled-pane > * { +-fx-border-radius: 0; +} + +.modal-overlay-comp .titled-pane > * { +-fx-background-radius: 0; +} + diff --git a/app/src/main/resources/io/xpipe/app/resources/style/multi-step-comp.css b/app/src/main/resources/io/xpipe/app/resources/style/multi-step-comp.css index ffc1ca8d..ba6a2a62 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/multi-step-comp.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/multi-step-comp.css @@ -80,3 +80,7 @@ -fx-pref-height: 0; } +.multi-step-comp > .jfx-tab-pane .tab-content-area { +-fx-padding: 0; +} + diff --git a/app/src/main/resources/io/xpipe/app/resources/style/style.css b/app/src/main/resources/io/xpipe/app/resources/style/style.css index e4895d6f..22cd510f 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/style.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/style.css @@ -13,21 +13,6 @@ -fx-padding: 1.2em; } -.message-comp { --fx-background-color: #FF9999AA; --fx-border-width: 1px; --fx-border-color:-color-accent-fg; --fx-border-radius: 2px; -} - -.message { --fx-padding: 0.0em; --fx-background-color: transparent; --fx-border-width: 1px; --fx-border-color:-color-accent-fg; --fx-border-radius: 2px; -} - .radio-button { -fx-background-color:transparent; } diff --git a/core/src/main/java/io/xpipe/core/impl/FileNames.java b/core/src/main/java/io/xpipe/core/impl/FileNames.java index 985f463b..6d020d3e 100644 --- a/core/src/main/java/io/xpipe/core/impl/FileNames.java +++ b/core/src/main/java/io/xpipe/core/impl/FileNames.java @@ -1,10 +1,15 @@ package io.xpipe.core.impl; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class FileNames { + public static String quoteIfNecessary(String n) { + return n.contains(" ") ? "\"" + n + "\"" : n; + } + public static String toDirectory(String path) { if (path.endsWith("/") || path.endsWith("\\")) { return path; @@ -45,6 +50,39 @@ public class FileNames { return components.get(components.size() - 1); } + public static List splitHierarchy(String file) { + if (file.isEmpty()) { + return List.of(); + } + + file = file + "/"; + var list = new ArrayList(); + int lastElementStart = 0; + for (int i = 0; i < file.length(); i++) { + if (file.charAt(i) == '\\' || file.charAt(i) == '/') { + if (i - lastElementStart > 0) { + list.add(file.substring(0, i)); + } + + lastElementStart = i + 1; + } + } + return list; + } + + public static String getBaseName(String file) { + if (file == null || file.isEmpty()) { + return null; + } + + var name = FileNames.getFileName(file); + var split = file.lastIndexOf("\\."); + if (split == -1) { + return name; + } + return name.substring(0, split); + } + public static String getExtension(String file) { if (file == null || file.isEmpty()) { return null; @@ -68,7 +106,7 @@ public class FileNames { return false; } - if (!file.startsWith("/") && !file.startsWith("~") && !file.matches("^\\w:.*")) { + if (!file.startsWith("\\") && !file.startsWith("/") && !file.startsWith("~") && !file.matches("^\\w:.*")) { return false; } diff --git a/core/src/main/java/io/xpipe/core/process/OsType.java b/core/src/main/java/io/xpipe/core/process/OsType.java index f58c3e67..206f519f 100644 --- a/core/src/main/java/io/xpipe/core/process/OsType.java +++ b/core/src/main/java/io/xpipe/core/process/OsType.java @@ -1,10 +1,12 @@ package io.xpipe.core.process; +import io.xpipe.core.impl.FileNames; + import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; -public interface OsType { +public sealed interface OsType permits OsType.Windows, OsType.Linux, OsType.MacOs { Windows WINDOWS = new Windows(); Linux LINUX = new Linux(); @@ -23,8 +25,18 @@ public interface OsType { } } + default String getXPipeHomeDirectory(ShellControl pc) throws Exception { + return FileNames.join(getHomeDirectory(pc), ".xpipe"); + } + + default String getSystemIdFile(ShellControl pc) throws Exception { + return FileNames.join(getXPipeHomeDirectory(pc), "system_id"); + } + String getHomeDirectory(ShellControl pc) throws Exception; + String getFileSystemSeparator(); + String getName(); String getTempDirectory(ShellControl pc) throws Exception; @@ -33,7 +45,7 @@ public interface OsType { String determineOperatingSystemName(ShellControl pc) throws Exception; - static class Windows implements OsType { + static final class Windows implements OsType { @Override public String getHomeDirectory(ShellControl pc) throws Exception { @@ -41,6 +53,11 @@ public interface OsType { pc.getShellDialect().getPrintEnvironmentVariableCommand("USERPROFILE")); } + @Override + public String getFileSystemSeparator() { + return "\\"; + } + @Override public String getName() { return "Windows"; @@ -80,13 +97,18 @@ public interface OsType { } } - static class Linux implements OsType { + static final class Linux implements OsType { @Override public String getHomeDirectory(ShellControl pc) throws Exception { return pc.executeSimpleStringCommand(pc.getShellDialect().getPrintEnvironmentVariableCommand("HOME")); } + @Override + public String getFileSystemSeparator() { + return "/"; + } + @Override public String getTempDirectory(ShellControl pc) throws Exception { return "/tmp/"; @@ -138,7 +160,7 @@ public interface OsType { } } - static class MacOs implements OsType { + static final class MacOs implements OsType { @Override public String getHomeDirectory(ShellControl pc) throws Exception { @@ -157,6 +179,11 @@ public interface OsType { return found; } + @Override + public String getFileSystemSeparator() { + return "/"; + } + @Override public String getName() { return "Mac"; diff --git a/core/src/main/java/io/xpipe/core/process/ShellControl.java b/core/src/main/java/io/xpipe/core/process/ShellControl.java index ffa0f91b..41b0c54e 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellControl.java +++ b/core/src/main/java/io/xpipe/core/process/ShellControl.java @@ -2,17 +2,25 @@ package io.xpipe.core.process; import io.xpipe.core.util.FailableFunction; import io.xpipe.core.util.SecretValue; +import io.xpipe.core.util.XPipeSystemId; import lombok.NonNull; import java.io.IOException; import java.util.Arrays; import java.util.List; +import java.util.UUID; import java.util.concurrent.Semaphore; import java.util.function.Consumer; import java.util.function.Function; public interface ShellControl extends ProcessControl { + default boolean isLocal() { + return getSystemId().equals(XPipeSystemId.getLocal()); + } + + UUID getSystemId(); + Semaphore getCommandLock(); ShellControl onInit(Consumer pc); @@ -29,6 +37,15 @@ public interface ShellControl extends ProcessControl { public void checkRunning() throws Exception; + default CommandControl osascriptCommand(String script) { + return command(String.format( + """ + osascript - "$@" < elevationFunction); @@ -81,16 +96,17 @@ public interface ShellControl extends ProcessControl { default ShellControl subShell(@NonNull ShellDialect type) { return subShell(p -> type.getOpenCommand(), new TerminalOpenFunction() { - @Override - public boolean changesEnvironment() { - return false; - } + @Override + public boolean changesEnvironment() { + return false; + } - @Override - public String prepare(ShellControl sc, String command) throws Exception { - return command; - } - }).elevationPassword(getElevationPassword()); + @Override + public String prepare(ShellControl sc, String command) throws Exception { + return command; + } + }) + .elevationPassword(getElevationPassword()); } interface TerminalOpenFunction { @@ -102,16 +118,16 @@ public interface ShellControl extends ProcessControl { default ShellControl identicalSubShell() { return subShell(p -> p.getShellDialect().getOpenCommand(), new TerminalOpenFunction() { - @Override - public boolean changesEnvironment() { - return false; - } + @Override + public boolean changesEnvironment() { + return false; + } - @Override - public String prepare(ShellControl sc, String command) throws Exception { - return command; - } - }) + @Override + public String prepare(ShellControl sc, String command) throws Exception { + return command; + } + }) .elevationPassword(getElevationPassword()); } @@ -129,8 +145,17 @@ public interface ShellControl extends ProcessControl { }); } + default ShellControl enforcedDialect(ShellDialect type) throws Exception { + start(); + if (getShellDialect().equals(type)) { + return this; + } else { + return subShell(type).start(); + } + } + default T enforceDialect(@NonNull ShellDialect type, Function sc) throws Exception { - if (isRunning() && getShellDialect().equals(type)) { + if (isRunning() && getShellDialect().equals(type)) { return sc.apply(this); } else { try (var sub = subShell(type).start()) { @@ -140,8 +165,7 @@ public interface ShellControl extends ProcessControl { } ShellControl subShell( - FailableFunction command, - TerminalOpenFunction terminalCommand); + FailableFunction command, TerminalOpenFunction terminalCommand); void executeLine(String command) throws Exception; diff --git a/core/src/main/java/io/xpipe/core/util/XPipeSystemId.java b/core/src/main/java/io/xpipe/core/util/XPipeSystemId.java new file mode 100644 index 00000000..56ce5d54 --- /dev/null +++ b/core/src/main/java/io/xpipe/core/util/XPipeSystemId.java @@ -0,0 +1,44 @@ +package io.xpipe.core.util; + +import io.xpipe.core.impl.FileNames; +import io.xpipe.core.process.ShellControl; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.UUID; + +public class XPipeSystemId { + + private static UUID localId; + + public static void init() { + try { + var file = Path.of(System.getProperty("user.home")).resolve(".xpipe").resolve("system_id"); + if (!Files.exists(file)) { + Files.writeString(file, UUID.randomUUID().toString()); + } + localId = UUID.fromString(Files.readString(file).trim()); + } catch (Exception ex) { + localId = UUID.randomUUID(); + } + } + + public static UUID getLocal() { + return localId; + } + + public static UUID getSystemId(ShellControl proc) throws Exception { + var file = proc.getOsType().getSystemIdFile(proc); + + if (!proc.getShellDialect().createFileExistsCommand(proc, file).executeAndCheck()) { + proc.executeSimpleCommand( + proc.getShellDialect().getMkdirsCommand(FileNames.getParent(file)), + "Unable to access or create directory " + file); + var id = UUID.randomUUID(); + proc.getShellDialect().createTextFileWriteCommand(proc, id.toString(), file).execute(); + return id; + } + + return UUID.fromString(proc.executeSimpleStringCommand(proc.getShellDialect().getFileReadCommand(file)).trim()); + } +} diff --git a/dist/changelogs/1.0.0.md b/dist/changelogs/1.0.0.md new file mode 100644 index 00000000..c61ebcc6 --- /dev/null +++ b/dist/changelogs/1.0.0.md @@ -0,0 +1,6 @@ +## Changes in 1.0.0 + +- Completely revamp file browser +- Add more appearance themes to choose from +- Add arm64 support for homebrew release +- A lot of bug fixes \ No newline at end of file diff --git a/dist/licenses/java-annotations.license b/dist/licenses/java-annotations.license new file mode 100644 index 00000000..f433b1a5 --- /dev/null +++ b/dist/licenses/java-annotations.license @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/dist/licenses/java-annotations.properties b/dist/licenses/java-annotations.properties new file mode 100644 index 00000000..784601a7 --- /dev/null +++ b/dist/licenses/java-annotations.properties @@ -0,0 +1,4 @@ +name=JetBrains Annotations for JVM-based languages +version=24.0.1 +license=Apache License 2.0 +link=https://github.com/JetBrains/java-annotations \ No newline at end of file diff --git a/dist/licenses/jfa.license b/dist/licenses/jfa.license new file mode 100644 index 00000000..f433b1a5 --- /dev/null +++ b/dist/licenses/jfa.license @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/dist/licenses/jfa.properties b/dist/licenses/jfa.properties new file mode 100644 index 00000000..40f52a0f --- /dev/null +++ b/dist/licenses/jfa.properties @@ -0,0 +1,4 @@ +name=Java Foundation Access +version=1.2.0 +license=Apache License 2.0 +link=https://github.com/0x4a616e/jfa \ No newline at end of file diff --git a/dist/licenses/jsystemthemedetector.license b/dist/licenses/jsystemthemedetector.license new file mode 100644 index 00000000..f433b1a5 --- /dev/null +++ b/dist/licenses/jsystemthemedetector.license @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/dist/licenses/jsystemthemedetector.properties b/dist/licenses/jsystemthemedetector.properties new file mode 100644 index 00000000..3c10ec31 --- /dev/null +++ b/dist/licenses/jsystemthemedetector.properties @@ -0,0 +1,4 @@ +name=jSystemThemeDetector +version=3.8 +license=Apache License 2.0 +link=https://github.com/Dansoftowner/jSystemThemeDetector \ No newline at end of file diff --git a/dist/licenses/oshi.license b/dist/licenses/oshi.license new file mode 100644 index 00000000..c8d628e5 --- /dev/null +++ b/dist/licenses/oshi.license @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2010-2023 The OSHI Project Contributors: https://github.com/oshi/oshi/graphs/contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dist/licenses/oshi.properties b/dist/licenses/oshi.properties new file mode 100644 index 00000000..e7db3fdf --- /dev/null +++ b/dist/licenses/oshi.properties @@ -0,0 +1,4 @@ +name=oshi +version=6.4.2 +license=MIT License +link=https://github.com/oshi/oshi \ No newline at end of file diff --git a/ext/base/build.gradle b/ext/base/build.gradle index c8d2cbbb..7feaa585 100644 --- a/ext/base/build.gradle +++ b/ext/base/build.gradle @@ -8,6 +8,12 @@ apply from: "$rootDir/gradle/gradle_scripts/commons.gradle" apply from: "$rootDir/gradle/gradle_scripts/lombok.gradle" apply from: "$rootDir/gradle/gradle_scripts/extension.gradle" +dependencies { + compileOnly group: 'org.kordamp.ikonli', name: 'ikonli-javafx', version: "12.2.0" + compileOnly 'net.java.dev.jna:jna-jpms:5.12.1' + compileOnly 'net.java.dev.jna:jna-platform-jpms:5.12.1' +} + compileJava { doFirst { options.compilerArgs += [ diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java new file mode 100644 index 00000000..583ecf42 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java @@ -0,0 +1,66 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.core.process.OsType; +import io.xpipe.core.process.ShellControl; +import io.xpipe.core.process.ShellDialect; + +import java.util.List; + +public class BrowseInNativeManagerAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + ShellControl sc = model.getFileSystem().getShell().get(); + ShellDialect d = sc.getShellDialect(); + for (BrowserEntry entry : entries) { + var e = entry.getRawFileEntry().getPath(); + switch (OsType.getLocal()) { + case OsType.Windows windows -> { + if (entry.getRawFileEntry().isDirectory()) { + sc.executeSimpleCommand("explorer " + d.fileArgument(e)); + } else { + sc.executeSimpleCommand("explorer /select," + d.fileArgument(e)); + } + } + case OsType.Linux linux -> { + var action = entry.getRawFileEntry().isDirectory() ? "org.freedesktop.FileManager1.ShowFolders" : "org.freedesktop.FileManager1.ShowItems"; + var dbus = String.format(""" + dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 %s array:string:"file://%s" string:"" + """, action, entry.getRawFileEntry().getPath()); + sc.executeSimpleCommand(dbus); + } + case OsType.MacOs macOs -> { + sc.executeSimpleCommand("open " + (entry.getRawFileEntry().isDirectory() ? "" : "-R ") + + d.fileArgument(entry.getRawFileEntry().getPath())); + } + } + } + } + + @Override + public Category getCategory() { + return Category.NATIVE; + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return model.isLocal(); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return switch (OsType.getLocal()) { + case OsType.Windows windows -> "Browse in Windows Explorer"; + case OsType.Linux linux -> "Browse in default file manager"; + case OsType.MacOs macOs -> "Browse in Finder"; + }; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/CopyAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/CopyAction.java new file mode 100644 index 00000000..382446d2 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/CopyAction.java @@ -0,0 +1,47 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserClipboard; +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class CopyAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + BrowserClipboard.startCopy( + model.getCurrentDirectory(), entries.stream().map(entry -> entry.getRawFileEntry()).toList()); + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2c-content-copy"); + } + + @Override + public Category getCategory() { + return Category.COPY_PASTE; + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.C, KeyCombination.SHORTCUT_DOWN); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Copy"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/CopyPathAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/CopyPathAction.java new file mode 100644 index 00000000..a1c899c8 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/CopyPathAction.java @@ -0,0 +1,113 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.BranchAction; +import io.xpipe.app.browser.action.BrowserAction; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.core.impl.FileNames; + +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.util.List; +import java.util.stream.Collectors; + +public class CopyPathAction implements BrowserAction, BranchAction { + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Copy location"; + } + + @Override + public Category getCategory() { + return Category.COPY_PASTE; + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public List getBranchingActions() { + return List.of( + new LeafAction() { + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Absolute Path"; + } + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var s = entries.stream() + .map(entry -> entry.getRawFileEntry().getPath()) + .collect(Collectors.joining("\n")); + var selection = new StringSelection(s); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(selection, selection); + } + }, + new LeafAction() { + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Absolute Path (Quoted)"; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.stream().anyMatch(entry -> entry.getRawFileEntry().getPath().contains(" ")); + } + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var s = entries.stream() + .map(entry -> "\"" + entry.getRawFileEntry().getPath() + "\"") + .collect(Collectors.joining("\n")); + var selection = new StringSelection(s); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(selection, selection); + } + }, + new LeafAction() { + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "File Name"; + } + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var s = entries.stream() + .map(entry -> + FileNames.getFileName(entry.getRawFileEntry().getPath())) + .collect(Collectors.joining("\n")); + var selection = new StringSelection(s); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(selection, selection); + } + }, + new LeafAction() { + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "File Name (Quoted)"; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.stream().anyMatch(entry -> FileNames.getFileName(entry.getRawFileEntry().getPath()).contains(" ")); + } + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var s = entries.stream() + .map(entry -> + "\"" + FileNames.getFileName(entry.getRawFileEntry().getPath()) + "\"") + .collect(Collectors.joining("\n")); + var selection = new StringSelection(s); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(selection, selection); + } + }); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/DeleteAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/DeleteAction.java new file mode 100644 index 00000000..e76cea07 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/DeleteAction.java @@ -0,0 +1,48 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserAlerts; +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.FileSystemHelper; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class DeleteAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var toDelete = entries.stream().map(entry -> entry.getRawFileEntry()).toList(); + if (!BrowserAlerts.showDeleteAlert(toDelete)) { + return; + } + + FileSystemHelper.delete(toDelete); + model.refreshSync(); + } + + @Override + public Category getCategory() { + return Category.MUTATION; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2d-delete"); + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.DELETE); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Delete"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/EditFileAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/EditFileAction.java new file mode 100644 index 00000000..89275b81 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/EditFileAction.java @@ -0,0 +1,41 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.app.util.FileOpener; +import javafx.scene.Node; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class EditFileAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + for (BrowserEntry entry : entries) { + FileOpener.openInTextEditor(entry.getRawFileEntry()); + } + } + + @Override + public Category getCategory() { + return Category.OPEN; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2p-pencil"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.stream().noneMatch(entry -> entry.getRawFileEntry().isDirectory()); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Edit with " + AppPrefs.get().externalEditor().getValue().toTranslatedString(); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/FileTypeAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/FileTypeAction.java new file mode 100644 index 00000000..d0f8df9c --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/FileTypeAction.java @@ -0,0 +1,26 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.BrowserAction; +import io.xpipe.app.browser.icon.BrowserIcons; +import io.xpipe.app.browser.icon.FileType; +import javafx.scene.Node; + +import java.util.List; + +public interface FileTypeAction extends BrowserAction { + + @Override + default boolean isApplicable(OpenFileSystemModel model, List entries) { + var t = getType(); + return entries.stream().allMatch(entry -> t.matches(entry.getRawFileEntry())); + } + + @Override + default Node getIcon(OpenFileSystemModel model, List entries) { + return BrowserIcons.createIcon(getType()).createRegion(); + } + + FileType getType(); +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java new file mode 100644 index 00000000..ae2b0441 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java @@ -0,0 +1,41 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.icon.FileType; +import io.xpipe.core.process.ShellControl; + +import java.util.List; + +public class JarAction extends JavaAction implements FileTypeAction { + + @Override + public Category getCategory() { + return Category.CUSTOM; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return super.isApplicable(model, entries) && FileTypeAction.super.isApplicable(model, entries); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, BrowserEntry entry) { + return entry.getFileName().endsWith(".jar"); + } + + @Override + protected String createCommand(ShellControl sc, OpenFileSystemModel model, BrowserEntry entry) { + return "java -jar " + entry.getOptionallyQuotedFileName(); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "java -jar " + filesArgument(entries); + } + + @Override + public FileType getType() { + return FileType.byId("jar"); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/JavaAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/JavaAction.java new file mode 100644 index 00000000..7da62a50 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/JavaAction.java @@ -0,0 +1,21 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.ApplicationPathAction; +import io.xpipe.app.browser.action.MultiExecuteAction; + +import java.util.List; + +public abstract class JavaAction extends MultiExecuteAction implements ApplicationPathAction { + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Java"; + } + + @Override + public String getExecutable() { + return "java"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/NewItemAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/NewItemAction.java new file mode 100644 index 00000000..be09d2a5 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/NewItemAction.java @@ -0,0 +1,94 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.BranchAction; +import io.xpipe.app.browser.action.BrowserAction; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.app.browser.icon.BrowserIcons; +import io.xpipe.app.comp.base.ModalOverlayComp; +import io.xpipe.app.fxcomps.Comp; +import javafx.beans.property.SimpleStringProperty; +import javafx.scene.Node; +import javafx.scene.control.TextField; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class NewItemAction implements BrowserAction, BranchAction { + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2p-plus-box-outline"); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "New"; + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.size() == 1 && entries.get(0).getRawFileEntry().getPath().equals(model.getCurrentPath().get()); + } + + @Override + public Category getCategory() { + return Category.MUTATION; + } + + @Override + public List getBranchingActions() { + return List.of( + new LeafAction() { + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "File"; + } + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var name = new SimpleStringProperty(); + model.getOverlay().setValue(new ModalOverlayComp.OverlayContent("newFile", Comp.of(() -> { + var creationName = new TextField(); + creationName.textProperty().bindBidirectional(name); + return creationName; + }), "finish", () -> { + model.createFileAsync(name.getValue()); + })); + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return BrowserIcons.createDefaultFileIcon().createRegion(); + } + }, + new LeafAction() { + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Directory"; + } + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var name = new SimpleStringProperty(); + model.getOverlay().setValue(new ModalOverlayComp.OverlayContent("newDirectory", Comp.of(() -> { + var creationName = new TextField(); + creationName.textProperty().bindBidirectional(name); + return creationName; + }), "finish", () -> { + model.createDirectoryAsync(name.getValue()); + })); + } + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return BrowserIcons.createDefaultDirectoryIcon().createRegion(); + } + }); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryAction.java new file mode 100644 index 00000000..5aaf9336 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryAction.java @@ -0,0 +1,45 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class OpenDirectoryAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + model.cd(entries.get(0).getRawFileEntry().getPath()); + } + + @Override + public Category getCategory() { + return Category.OPEN; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2f-folder-open"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.size() == 1 && entries.stream().allMatch(entry -> entry.getRawFileEntry().isDirectory()); + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.ENTER); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Open"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryInNewTabAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryInNewTabAction.java new file mode 100644 index 00000000..708b9ef8 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenDirectoryInNewTabAction.java @@ -0,0 +1,50 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class OpenDirectoryInNewTabAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + model.getBrowserModel().openFileSystemAsync(model.getStore().asNeeded(), entries.get(0).getRawFileEntry().getPath()); + } + + @Override + public Category getCategory() { + return Category.OPEN; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2f-folder-open-outline"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.size() == 1 && entries.stream().allMatch(entry -> entry.getRawFileEntry().isDirectory()); + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.ENTER); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Open in new tab"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileDefaultAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileDefaultAction.java new file mode 100644 index 00000000..52ba759d --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileDefaultAction.java @@ -0,0 +1,48 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.app.util.FileOpener; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class OpenFileDefaultAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + for (var entry : entries) { + FileOpener.openInDefaultApplication(entry.getRawFileEntry()); + } + } + + @Override + public Category getCategory() { + return Category.OPEN; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2b-book-open-variant"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.stream().noneMatch(entry -> entry.getRawFileEntry().isDirectory()); + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.ENTER); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Open"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileWithAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileWithAction.java new file mode 100644 index 00000000..be3c3d5b --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenFileWithAction.java @@ -0,0 +1,73 @@ +package io.xpipe.ext.base.browser; + +import com.sun.jna.platform.win32.Shell32; +import com.sun.jna.platform.win32.WinUser; +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.core.process.OsType; +import io.xpipe.core.process.ShellControl; +import io.xpipe.core.process.ShellDialect; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class OpenFileWithAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + switch (OsType.getLocal()) { + case OsType.Windows windows -> { + Shell32.INSTANCE.ShellExecute( + null, + "open", + "rundll32.exe", + "shell32.dll,OpenAs_RunDLL " + + entries.get(0).getRawFileEntry().getPath(), + null, + WinUser.SW_SHOWNORMAL); + } + case OsType.Linux linux -> { + ShellControl sc = model.getFileSystem().getShell().get(); + ShellDialect d = sc.getShellDialect(); + sc.executeSimpleCommand("mimeopen -a " + d.fileArgument(entries.get(0).getRawFileEntry().getPath())); + } + case OsType.MacOs macOs -> { + throw new UnsupportedOperationException(); + } + } + } + + @Override + public Category getCategory() { + return Category.OPEN; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2b-book-open-page-variant-outline"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + var os = model.getFileSystem().getShell(); + return os.isPresent() + && !os.get().getOsType().equals(OsType.MACOS) + && entries.size() == 1 + && entries.stream().noneMatch(entry -> entry.getRawFileEntry().isDirectory()); + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.ENTER, KeyCombination.SHIFT_DOWN); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Open with ..."; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java new file mode 100644 index 00000000..82879897 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java @@ -0,0 +1,69 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.core.impl.FileNames; +import io.xpipe.core.process.OsType; +import io.xpipe.core.process.ShellControl; +import io.xpipe.core.process.ShellDialects; + +import java.util.List; + +public class OpenNativeFileDetailsAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + ShellControl sc = model.getFileSystem().getShell().get(); + for (BrowserEntry entry : entries) { + var e = entry.getRawFileEntry().getPath(); + switch (OsType.getLocal()) { + case OsType.Windows windows -> { + var content = String.format( + """ + $shell = New-Object -ComObject Shell.Application; $shell.NameSpace('%s').ParseName('%s').InvokeVerb('Properties') + """, + FileNames.getParent(e), FileNames.getFileName(e)); + try (var sub = sc.enforcedDialect(ShellDialects.POWERSHELL).start()) { + sub.command(content).notComplex().execute(); + } + } + case OsType.Linux linux -> { + var dbus = String.format(""" + dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItemProperties array:string:"file://%s" string:"" + """, entry.getRawFileEntry().getPath()); + sc.executeSimpleCommand(dbus); + } + case OsType.MacOs macOs -> { + sc.osascriptCommand(String.format( + """ + set fileEntry to (POSIX file "%s") as text + tell application "Finder" to open information window of file fileEntry + """, + entry.getRawFileEntry().getPath())).execute(); + } + } + } + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public Category getCategory() { + return Category.NATIVE; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + var sc = model.getFileSystem().getShell(); + return sc.isPresent() && !sc.get().getOsType().equals(OsType.WINDOWS); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Show details"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenTerminalAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenTerminalAction.java new file mode 100644 index 00000000..76253928 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenTerminalAction.java @@ -0,0 +1,53 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.app.prefs.AppPrefs; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class OpenTerminalAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + if (entries.size() == 0) { + model.openTerminalAsync(model.getCurrentDirectory().getPath()); + return; + } + + for (var entry : entries) { + model.openTerminalAsync(entry.getRawFileEntry().getPath()); + } + } + + @Override + public Category getCategory() { + return Category.OPEN; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2c-console"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.stream().allMatch(entry -> entry.getRawFileEntry().isDirectory()); + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.T, KeyCombination.SHORTCUT_DOWN); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Open in " + AppPrefs.get().terminalType().getValue().toTranslatedString(); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/PasteAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/PasteAction.java new file mode 100644 index 00000000..bf3bc178 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/PasteAction.java @@ -0,0 +1,63 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserClipboard; +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class PasteAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var clipboard = BrowserClipboard.retrieveCopy(); + if (clipboard == null) { + return; + } + + var target = entries.size() == 1 && entries.get(0).getRawFileEntry().isDirectory() ? entries.get(0).getRawFileEntry() : model.getCurrentDirectory(); + var files = clipboard.getEntries(); + model.dropFilesIntoAsync(target, files, true); + } + + @Override + public Category getCategory() { + return Category.COPY_PASTE; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2c-content-paste"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.size() < 2 && entries.stream().allMatch(entry -> entry.getRawFileEntry().isDirectory()); + } + + @Override + public boolean isActive(OpenFileSystemModel model, List entries) { + return BrowserClipboard.retrieveCopy() != null; + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.V, KeyCombination.SHORTCUT_DOWN); + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Paste"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java new file mode 100644 index 00000000..a9e7ff2d --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java @@ -0,0 +1,45 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.LeafAction; +import javafx.scene.Node; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class RenameAction implements LeafAction { + + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + model.getFileList().getEditing().setValue(entries.get(0)); + } + + @Override + public Category getCategory() { + return Category.MUTATION; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2r-rename-box"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.size() == 1; + } + + @Override + public KeyCombination getShortcut() { + return new KeyCodeCombination(KeyCode.R, KeyCombination.SHORTCUT_DOWN); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Rename"; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java new file mode 100644 index 00000000..e924cd9b --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java @@ -0,0 +1,66 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.MultiExecuteAction; +import io.xpipe.core.process.OsType; +import io.xpipe.core.process.ShellControl; +import io.xpipe.core.store.FileSystem; +import javafx.scene.Node; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.List; + +public class RunAction extends MultiExecuteAction { + + private boolean isExecutable(FileSystem.FileEntry e) { + if (e.isDirectory()) { + return false; + } + + if (e.getExecutable() != null && e.getExecutable()) { + return true; + } + + var shell = e.getFileSystem().getShell(); + if (shell.isEmpty()) { + return false; + } + + var os = shell.get().getOsType(); + if (os.equals(OsType.WINDOWS) && List.of("exe", "bat", "ps1", "cmd").stream().anyMatch(s -> e.getPath().endsWith(s))) { + return true; + } + + if (List.of("sh", "command").stream().anyMatch(s -> e.getPath().endsWith(s))) { + return true; + } + + return false; + } + + @Override + public Category getCategory() { + return Category.CUSTOM; + } + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2p-play"); + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "Run"; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + return entries.stream().allMatch(entry -> isExecutable(entry.getRawFileEntry())); + } + + @Override + protected String createCommand(ShellControl sc, OpenFileSystemModel model, BrowserEntry entry) { + return sc.getShellDialect().runScript(entry.getFileName()); + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java new file mode 100644 index 00000000..9ef22e35 --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java @@ -0,0 +1,37 @@ +package io.xpipe.ext.base.browser; + +import io.xpipe.app.browser.BrowserEntry; +import io.xpipe.app.browser.OpenFileSystemModel; +import io.xpipe.app.browser.action.ExecuteApplicationAction; +import io.xpipe.core.impl.FileNames; +import io.xpipe.core.process.OsType; + +import java.util.List; + +public class UnzipAction extends ExecuteApplicationAction { + + @Override + public String getExecutable() { + return "unzip"; + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, BrowserEntry entry) { + return entry.getRawFileEntry().getPath().endsWith(".zip") && !OsType.getLocal().equals(OsType.WINDOWS); + } + + @Override + protected String createCommand(OpenFileSystemModel model, BrowserEntry entry) { + return "unzip -o " + entry.getOptionallyQuotedFileName() + " -d " + FileNames.quoteIfNecessary(FileNames.getBaseName(entry.getFileName())); + } + + @Override + public Category getCategory() { + return Category.CUSTOM; + } + + @Override + public String getName(OpenFileSystemModel model, List entries) { + return "unzip [...]"; + } +} diff --git a/ext/base/src/main/java/module-info.java b/ext/base/src/main/java/module-info.java index 0cd23a0f..453779eb 100644 --- a/ext/base/src/main/java/module-info.java +++ b/ext/base/src/main/java/module-info.java @@ -1,3 +1,4 @@ +import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.ext.ActionProvider; import io.xpipe.app.ext.DataSourceProvider; import io.xpipe.app.ext.DataSourceTarget; @@ -5,6 +6,7 @@ import io.xpipe.app.ext.DataStoreProvider; import io.xpipe.ext.base.*; import io.xpipe.ext.base.actions.*; import io.xpipe.ext.base.apps.*; +import io.xpipe.ext.base.browser.*; open module io.xpipe.ext.base { exports io.xpipe.ext.base; @@ -20,7 +22,28 @@ open module io.xpipe.ext.base { requires static net.synedra.validatorfx; requires static io.xpipe.app; requires org.apache.commons.lang3; + requires org.kordamp.ikonli.javafx; + requires com.sun.jna; + requires com.sun.jna.platform; + provides BrowserAction with + OpenFileDefaultAction, + OpenFileWithAction, + OpenDirectoryAction, + OpenDirectoryInNewTabAction, + OpenTerminalAction, + OpenNativeFileDetailsAction, + BrowseInNativeManagerAction, + EditFileAction, + RunAction, + CopyAction, + CopyPathAction, + PasteAction, + NewItemAction, + RenameAction, + DeleteAction, + UnzipAction, + JarAction; provides ActionProvider with DeleteStoreChildrenAction, AddStoreAction, diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/lang/translations_en.properties b/ext/base/src/main/resources/io/xpipe/ext/base/resources/lang/translations_en.properties index cb7b647f..99f99d29 100644 --- a/ext/base/src/main/resources/io/xpipe/ext/base/resources/lang/translations_en.properties +++ b/ext/base/src/main/resources/io/xpipe/ext/base/resources/lang/translations_en.properties @@ -9,6 +9,8 @@ destination=Destination configuration=Configuration selectOutput=Select Output options=Options +newFile=New file +newDirectory=New directory copyShareLink=Copy share link selectStore=Select Store saveSource=Save for later diff --git a/gradle/gradle_scripts/atlantafx-base-1.2.1.jar b/gradle/gradle_scripts/atlantafx-base-1.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..91e1b140c6a16f2ac8048a5e3eb0774d5346ebfe GIT binary patch literal 378704 zcmbTe1CV9Sw(ncEZQHhOS9RI8(WNfiwr$(CZQE5{u6o^PN9=p<**Cs--&+xD#f(^E z#LT(!H!??#{O3}T1_nU^fPjDiXp5*(1Nd(*6aWwaSy2^1T1h!EdRaj^Nik7n6*^h5 zuWkg_!pM{v&X3Z^EvkRmeyyVGT9rRjmTG14k!tq^6VzgB*5r) zPW0)x9EJU^_FR`OYDl^aqU4g9gnk@!jRJAPIz&vjK)wzh$a~6ugXQt_2ITW|3m-uX zYE&+0l5;8KHH8yNs!Cc1#JVa4bGJedmJBA#Tc`FNBVFi@mzPw6)x|eoBmV}N@=&fh z9nS3hLLEP8OcH`&GkhPU;&0i}7Fwl>vq4-IJ3(3-7hQ|`j`fyUEohB4d4@2MlSIeK zQ4g=d0-q)ELsL0Fijh2{Pnh2{MjS`O8+re2_jja`!|9Vp1Ofo42Km=W^M3~IFSP%r zlK#J_{14EStt@Q+8*D1F%E*EU-U;#$*hKhYSbQW{4h{N5x#<37Om!Th^pZz>kjUy` z9gEk&^S-32P^x%5KX1h~T=mG5Rxcm_M9Yk0}5Ruhi zN#sqQrN^!)q?5Rsk2qax7CG3e%AJ!0tY;c!YKUSNE?R7>V6EF`rSzc|97tFu1(0Wp zRuYm&P;LCN&{~Vix#CNTue9R}xufH=f7Z0u?>q#1_|HN=y(?hk@yISVU@5s1Ff8FM z)yS(&^`EfP=qn0vtKdO57ALo&FbqinEH)x`TE?xpVD!D8u;lJl>j9b7N z&#YWUUp5sQ)#HN@Z^udgjP!&z;lMBq1()<&>X;EEaLRhP7>jlDH0SoN6$sOPb5`n|z*;!MP0J)kBA!AnG81n);FfZUd@rOf97*)ZXOUGPkwSBm!OBKQ z0CRwIhcA(>ND^6sLk=wziX?{Q>}!cO)dsVR00^x%^c*BfbOalsQUGbJ(0*p5p5BDAv_NjEM5s>vHL~8 zc%zO+!*uL=epLK+qx239KXS&0K#yg(VL_BG$k;QD)9HBfM*Dbjre~)c*gbrNQUpPk zpqMZkFj(VSL;L5)6L!~-P9ApiBhH57Q#i5vhCSS~maT1=LGK3Z)+P~dX%L5^6mgge zkOgeOEXKWOX9XMtoz7=(9em&c?pa0^uYtQ(U%e2EqY7Km87;HOLy#%d0EQ$%!5&mS zjC?;x#bG&p4Mw)b#8P!EUVz$`Po1JilafuP-7+SbrJzLr&T^9C!Kr}4A!4K@#sEjq zETXd`i=M(T*XuP1V+vBLe(I%JrNdftV8Sp;HMza;fb6DWDkLI@a5{Fdec5<~%1O$r zLQpqN6!fE@d65uvm_;z5R(3hkmLf+;5SehLWy@K)m}N1F%RE#`pB9=$J?qA2I8p@;N3Vb6`>hQY&t^?*Kv;s@?CPz|l%6qMD!Pb8KTx9)UdJc{nlHbm~9>xW|W z@flP;A}jdquc*o7I}1@?*?I5y$CYD}Va=Vqv4Vj_7Y=G>FK>ptzd9QH7H&Y$Zw7|G z55iO7?Pq|rSv=o)Xndg1t^#na_FLtRK;Ub0O>ra2iIiFBD5p^H%C�KJyP0dIm1? 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

!DE;dcP z0I{JHx3sYdNe4~z_76iDJ|(w@#@VxVxK^@BJDr?O=OX8WcsW{56uLPap1r^HZ491o z!A_HKI+yW%MO&<+qC~&~(%^TF($k*EZjX@r^`?jlrNBg^eF$`jlaW|c4ML#%k-4{v z_^UMeQA01ZUp%`mUhD$aBCh9|okTbt`x$&=L0NJ?{^D^(rt<_WEc8rvCzdmNm-LFQb^vZP=3Ze|{`JZF2BPWphef*vW zfskmMbVQDzL?D-~Hu60P;>veoNo+Qea8u)p>|Cohy&YlM7?9e&ZXGQB?7dpohMzCZ z?izQ9Kc!E1JYwnPWjErJ&&~MdEB?429yG1BOcBrf1mBQIci@mpKE&FkdkwFr>_| zi_h|H z#|u*ZfMb_mbo&s8@(n!*6>@=b3mRf)A&AwBej|K|^rXa;wvCoRp(XWCnwQ4)0C$qM z9;gNn?Kr@AQWfFrR_oqg?^LT9W2FJ|?`rs;CPqy@`XIYEk5VXmT>;y&AL7;iNlVKE ze!(m^`&e%Zz)EQPtY7xoSCpOy*>oFo(8}?_Z+7bCSvXeLVEhg$tVtcq(=<+6hiD^D z8R9heArq}*N>@wX8&)86?tP^0PzVlWgX_Pm2o8?L12j^#Skde6tnPNc+$t(M4!62C zgGm_{wgG{UFN{B%1kj3okSUCKcy%eJby23r!?2Ksr>cqM=QM1SyOfhHIDU73KYNDV0h2gsa$HQEKB*!IGtrAaRw@by5r6K7oM zsb?oem&Zrgf(_Q^I&ZKwzU=8E-!3c_dw!6-qHtN9?%FZ-1u_3kc_vHZUCpx^dyF^n zNZHz(<$LW4u-J<&2wu5ONMGC)<9oY${S#$H<~?yx{d@BAx3lGX)@c$#wHBIlR#BhP zHS3(VQkAG`4XvZ5jy57L=pGuJh5uCTk`PdRaoB1rD)|05BalWPtS%IVF&^!Z zT3ryJ>JC-8PGwKnOFzuU5XNg4egY`3@I>D>>||V|JIta_OHnzBwU+L+6%llCc^mXKHAmVPl4TdeIV(rLki$34dU%jl zFIa>v>1SL7PtpAaXYw z>GSHcXQW@3L<3HLA@oLdV?Ree9>v2LbO(pSbwU1e z){koB&?w~)1R%v3YQ*T)ch`o0ybE4l;>Ks+MCSmHI)>#;j>Lv)u0u-i0R^a+D!~LK!R*?4ie#3so^8ClKfo0{MNS^_r4$ z-^-?5q1k=h27@blKvY;CLlb*<*s@J?HZX{^M=5L4u%IOdgUh~kCd+!U;=)u|hGZOY zBFGMq+2@MiTn1yrW(c|SKuXyopRbcC0A>g#Yr{(0JDQa=@#~UiF<~;&10T*BW1VP! zIHEO{;f@LQ%%X#5{!w#o;SJ1C`bBeyi+3PC2<%DxC!qtA873cj+RrH?t@JFxt=Am& zW8PWCe^rVX`6$CD<9V{A27)b_6Qnw>zG4Io32OmYGcC;Q%s7jv)NITu6D+g+Z2h^# zC<3mYkYysB*`gqs8Q{v25J4+%D$4%$;ghJ+De-tjxtD@8S34Vt#3cBGSNsD{&p5=l z>nbsHdzGMWD9f^GrUjM>248D3%{mOHJTcIeo?p9xg+wwrFG+9w+7vUu%137s%cgRZ z$1sv1Z_OinQUW%T<=wBB@r`UJSQR}n53}&ZJeb{9JrrfC1$KD$t&?`;CEW(Y4AW>c zie`R;gaVfGRDU~jjjYltY+$n`Yoq5zs}vidRe#6jrp=zIW}_=Q6~V34MEI)y=TCJ%AtAw_Qg<~8_0JU&mN2qa?fBHBaFL=z-3`V2gK+; zzw3ctPSlJc7=Jj;ou};(Mm-pUAx=+7?kfv#dS#=`Er#geg$G?v(8_^L8=8Nl`@#;y zt(+ZPys$wfMsJ#n8JB54-fer1#Cr{8vAZ?Q_(=V3GMY0#SB49b#D+Bd+_nUL0*uwL zaCLe#C4p-Y%*^t0@;J7Adn#+!N&_jyHW9|8bVD(4mp(wWQ)+)J)j6`I&8SUFUC99Z z&MCRNRGr)DfmlnV2>kBRr#(d*Ykj{fA3hi+r*s&rE?!xZxkceE(9|cq&tx~k`4fJ` zc_kvKV5k3|{1u_c@xzoRq4V`OeJg@NS~hQCca@yV>?U^{$tCf! zc>7eJlrDi(GSy-kThgjBh8fIfP5`&8-sRskB`4MFjtRf`vv?98-jwx___^hGHl%Ml zB)#_g3(q_40 z%L-OdR=6pnu39Gozj1xx6@{mmPGce<6)Q-Dk>>nx4%?vdO85Sh$rdu&-L@4VIjJW> zC;L$)0(lanNRJhksa$bum~IRd!P#w29#PwQZ@vThRibt2E>A9r76nygG5>{=KB79j znP)YNqH7F^96-_v`26?J8pXy`;N$jH&>75z$l_ZqAR>SL>Zw@>USf>*sGfRYsC(O( z`$ze5ovJD6Z0(rrMY@q#Xwq-Lwe=_3NtIaRE6Ouu4Es=_choW%{>Z-GaNAH?aSLBj z+bE_=0SB6Qp)|^X??M4sWDvt*Ow^Nn@iofWc_EkM z{EJA}7XOR1cZ#kp`nEoEa$?)IZQHh!9ox2T+qQXP+qRvYBqvtoe)oP=)#~A2)mp8W zJsbZ7nv(Lx1(5$o+)9al0yKmsKqZ;cJ;BJ8**njnQn8 z4s3FLLb-<0m5m|G=L6l_v_}B0SRF+t8Eeu>*O^{i zf+h(@lUgPPS5+3EDVxPxradqYKI#^4F~)l22}8vZsUZdTrMF%9r3E|+bp3NZRa1Ec z^pCz_=Q$j_Wki8zu=@buPj{DIA`q*AfQDKu03BZV>R?UZVzh3)PJn%A&*Jq5E!Oxx z%%GUCb#@su=-+zbd2_U#$Q1}TQEoYv2b{Qd$Q9B+(FUt6`qD6sd>(T+>72Mq!m=uI zUfM<_Pq>Z@@?Ek6Hh>($!?DJ?m0=vnaMAwv4uNRxDDU{_>lLsBI#D3i1YHBUYpr$V z*1gK;>qk&(?q0kQZw|1WE)~auABp#nyi%WL4$=&!_z*d2_M*~&rkV7))Fg@7&_!7H zfrqj(L2o2)32G40L7BE-ht!&d9e5d^J_EEIi|{U2<38FLnc0#&2*n2|WLJEQE?dWh8ui|E z@~;VPf{V$rpd`Nt)BRyiZuyH-E&<;z=?^_GduFp}lQy!4)ltUYyr)hwg^98U3NM%Y z(-X9{eNUuUkRCMz{M$LhNI@>@Hk}Viu$u9PuJP~}npe59%J*&K+C6P&t2?nty08T9 zk4d?^IPktZ5Y}%SEMt)m_HioNn-rv0wmx6=G75h>;l)S+ zdFm1?dNSJ}NHQtMv1quYi6R5B(}gX~5abO9Q&#tB4x+BQ_|3yL=AAT0;Q@D4uhc8f z`OI?ny46map(h%v(|b0O&sS<9GV5+iK9IczUj+R6R6Ks zi!tfLx*8;}nn~(HbLLl;2js{Mv?3>@IIu)qHGcw5ZsuypkK{TgEk%#? zs#<1kKZh*0sq)hJTeRrsZ0Qk0>n@)4CsvQ^s#oeN9#dVjk!}Ltk2js5U;ioN75m+e zxgEbNy!ic>;*bZ?R}YB-2q-}7Kgo`%|AXRC7T{#{e`dD-x5PLmY139o5GC|`U4S#Z z#1J}nSh%Ewc2l^JtR@DwL46IQf@GxXSE;iz{?ygFtPc%+^awP5Ul>#Ex&j=i65ZIB z8RO;miWc+3^X@G_kX}J%;IKc;fdolIyeJZ7sA?_ljfJnXWt%&}RqL(AF?YacD!4w} zaK%pAz&QiWm4y6-Zs@(%Co}&(n~BSHsM^A%t-RPu7ABFd6pi@7sNOzF zt{s#wp0+qEJqcLTH$D>mqz?n z%-hX5(!YE#BK|lX@)LYJ#`$2~o+Y;Qq-1llqTY zVE>6RFKcHEuvP%rn*485T!_-7?V34YISjp(L51fl{dmDO!#KEvy#o0;F&ha2oKL~I15 zF^n*rmN2=MiVG*g8` z@eW?xFey#abKO(g9C1uR1w{N19mT{go|6J007-nu^2&lm)z1cY%b)a=7z(9?)^aV4 zCA1Fonp5psQ#!5o;*5{Q+{-7f%uYjqrt-RL(K(ie359Iq6Bzh_GzJtrFJ`ddJqPP9 z>0{|a_f%_;g7awDZ^RC7f`|+|>bOZ=JW#B>#Kq5GuR3#*vbC!!hocD7{QjxkR~vI9 zsSOC;iUR^1R}m(qo&ar_s_z^=)pb;d#u7uSHOrse9X8T9Bg8bdGcxrvmwF}D-I5(d zCsZpG8=>2T0^GR|DA$ke517NGud-ePy3Ke0D_1CVh!ZmV2m@bWdSn)*7eq}I#Svh- zd?~zD%AG#lts-}P`M=SIV5?*Fd7WP*pl4(PRQZ7exq^{1z0k+iC6!#ZLPaiGc4bps zY!sOm^8Zqx{yR%&PA^yV*H2x+{6||H`G4B${&!vd_dZvn38|s8jQT~-Jk@893;_a6 zX2F&S6EsdjND*ue5@-lP7?2;a@$VPBJHQ>@Y{z(hMXN>iazV6fsI^tKs-{JCKAvUe z%*@T|*;2j5t0k&+qq0WY^CpMg&J-{1*INdCM#t%v)0fvumkgfQ!;mBpwni2{CrlIy zbKzO(f*-|J(a@58T|t&2F%q;L`&+U^SYg#K26s-!eWSlMtIpF~643@$s%}6YW6#6{ zWY8EV*XnQ(*&20~n*#f#L+nB18q3$CFro3Jt3_0vG(1SGVoT*799tEzaUx5&yzk3; zO@oFf1@Zm#`6}Bm{zj=9Rp|wMYh(%o#_s|g1&i?`=PX5;d~*zXrIp-yTN%@e;Yy(< zHaDflSo3?MIH4ETYIcm#5O>O^>hbG7TGk|mIB@weP9f_L7=g-6UUmZ$Z4N31zXtCi ztDR{!;=@E?UZq5^=fWs;UNr)x_){He1|36@pp6AsLsgkQIko^p6a}){n_aCph7>kV z8FmP!Dh@P47I>AA!i!yn#zCf*p*w~DGR6McGomg+#il?oA5jq#Ck(I#4t6g@Ut*e<+KiSgfsE_$gB}PEDHx9T4gI239t;PwLUna4y~J+ zROCuB%Mrm;lCtGSD7w);)p=(LU!~gs!rQ1#9F{Q&^`82J;u}b~YB;yK1cTA8vGGbZfXbo?BWMfhE1q zwVZe=*B*Tk#Z@R~@XFea+|o2Aj=~Rt1_#__uEQ&REPG3@+USP}V+Y&Q3pkixw22vA7C=ZQr)sQsC1X2jwWD!#s9eL`n3urF>uE0a2!$T; zVkaFyL$VT=xqP7uF~FJ(Rb0>qgQP*1-Z^TK6r3O|!zNpk;;jDq^4A`>!>uyYWH@7& z>&U+Anw$zwU*T@mMr(Kpm@p}(5GlfNp0hv}Uv2N$-?L=)4=M)O+^bl3<{ zE9S#a`MpA3YwL|fyD_|mWPd<+qaLeZ!v;ZZYs8_8p+KN^t}+S~pF5#;YCBhPE zC0gGx!E4(y?SySg!Y};R9#GM{E?(0{w zC9mjQxG}zJxI!qIR@rSF?b0TTsm!_$HDg8fNC8^J=pkED!%>p?^REnMkjYW}AfejI zEF=qkFJ&^D%-Y36sUB;Cz=u-ecTl%C7dex(M-XK7m}o!_=;ToKxjzqMqVq>2@FCX&K@O|lSi zA#T;DbIS`A<5QN5HFSVOU_n&QK`s;up=e9QnCE~qb9uJT>`OFC%C~yln^Ssx{>e6! zp!Di87TnIXt=v}|DOy zZ7!#G=%TWNQ*9A(#ZRSUs*1H%o#fA>Q~zs-1mcdFer)o{o;I^H(#ZBaFn{}HBmvtt zULq-cE^mtfI(WWxcpgVCP1(@59=U^FK+udiqTo&PKC6NmSs3))J3f@S?ou@}%SM?X zQD#~RD{5WvfoMz>#}Bn@=&9L2nvL3|DQb6%bNL?>*k6v=;C*bUY^(kCv zh2xyF1dT+Wb_IArRBT}xJ=?^m@_fbMd6wMApA?sc^QkRvGsWO9K$H*PFLM{-({;2U z`*lYV6I_kQCB^_BcngU-Ydospj6y1sil}+R8M+v2*u&aoj}mq4J!cp!x92R-sHR!X zN?yNWxU5BCMy7Bf>=ai>XmZZv2^5t5P>4#}4iv>GRI49=hSQI?6(qQ1gmGDnZUQMy zOFv{DBol}(e_+N!{!tMi{+9Voz;;cThjrVMc0V2wWASUeEgwnoi}TJm0K29y_*{GJ zC=^d%a2qb3)`FnJRmCqte?3By0zKYw93vCIpHq%|V}St5I-IW@O@vqy+U)^Ud zd;L0pVJibI&6}I<^@TMz5sfFtth&9pOZlMrSO?t=iSZTo&Nqr~vXm7~0xw_+UpS1J z=6%8b-Z~Eq((jM_!)Yv_ZLv&G=`yRY4C+IU?%V65pH%cAhYz-+^epZrNjfr+NmM!; zfpHb(6LYq+9oboWUeNJ$4&;Vrz|o@Lsg@Fo%cjG50Od2p-H-G*+rhRb(KhEaxN~E; z24rbB+>Mh}AGnfvx?5H9naAQrSNukoKfr7Gg*$*ZZ^d%iy?x<}4&(Y=2%J!XhBbRSV)nSWm?5mg2^1IHJ=`lwaT%1+AionIH5Nw>6e zY$x0CWUZ{`?Mkvyv8y$(-DP#D_izj4Wey+j)kbpNM%Iq)WU5kwH0mvHEc6VlBCw~> z4&%SFD#9T3MH5s8&ygmo$!h($Sa5E_RDMtDW9NjoS+`?GkJffWLlHK9=gYb z8m5>6BOdUm@J5bNh>ajPX}!~UJnCSvv=wmbjbaBsmrfy37u6}p~klmtgcf%js}OR#8f` zSO1Z&^}$4B~@{>)N(!*BT4HXadIO2%g@Tb+Q6FE5MJKt^>mG+hxP zKNg_^H52giJ#|V6N1vbFn(48`GHKCPUNX|*U+Ll>Nhh_Be%BLi=t3)c2^Kkl$n@bl zVo&~HknC}XFqw3>ogN;GyPKruZ6UG{8vP}iDohOjLn7M%d)1HSh8WBjLZGAzyoFu* zVX}Sds_E(JQ8h7x<56>)(A=dYO{hkU&ZK;5q9CXnRH3bEwwzVL;f|8yUW-|kSq_rZ z24pAc3Uc_mWozeftEaL*7$~W+8n#HTG=e4|?OL?`- z;@H-Trk~0q#Ap%B6yRzRb5V{Pnlz|4LnFWcSIp=t*Gf&+jj~v_Bn3gph>R38)0nz*OO2j6n=6lO&;pXuBlzM|+OwcKPkvHB~Ol z5k-YHdwpmMa{VD{4ohk^RjS(JEn4C=T2?h`-#^yU9(JdW;Mv`{6Q7aW*Xu`~Q|8@k zAB;Z5SWQlQ0^uNKLS)Tg$jir=w+&_L-@2iz+Ew5%LMy;+tGGH6 z={gJXNX;{EYALQq1lV-2oKPJK!4{r#MP5OUg-ME{a3ECJKHHsTqR&`DAqsQH?Emr| zsv9gSZmyp&d`&BhS%jw6%-w@h9`9FoY8@GKctX5U5FFWtaIt^FZy40e8H6~fncp&WSAlQy-7?t)aU&R;FkD+OrgFn>W0!B0 zdkKk|=*HdXnu+wutiUU!`v*Z1|5I@ zKlFSYZf~CbRj7ZWHGii?P$oIZf&x*UlGHdk*%e~OF$8LggyWM>Kc1n1kQPk&L@H$6 zkwiY*zov1k?)fpov1}h9MA!iXu*OBahPHLYc){aI5T8Fsmp5wU4EYc+aWdn-zgzC+ zDdVDIVuZKJJU1MBoG_fh7N9dViij1fQa%9ex+BQg;O^XdE8JFEj%_t#hM!vL=3-aII9?BbIpcbibjJSrED&Y zQQ(B|ZeXom{-ouL>#{=bS6yr^t?2Pp{3II4?jIw?uS0r@Q$Oo-bOm0K7B_==0Q@G& zVL2m#r|p*tQRN80jYXt$1>f|MhJEhDQ)_85P62f&9DpYxNfVQtn306)%*I9I?AqGK zy&A9dy%QSa2R5Xr9_E^ijd`nJJc^<@vJH7$BS>WkbV(IQ5+j9NJi27NYF@9}OCcCL zCMdsj@ap^wWe4}+5E&e|9uQ=T8h8(*;R zZIE;H=TC$LZuIILz~o2@Nt8HRx=L9ikck8}yqKbo&aJVB^OYEDJFFYNJ$!*{gp^K1 zHp=TZ5myIktc-W@svYonVSK1|bHVhfZW<UJIZ zBd{-|Gh`YLk(aIt86~B3yrYqM7Vn{|#br3n_aU-h)*hTPe+~D~fiIe}$XUQ->CGEY zFJcjFUq{fjV*s^q{m#~|D=)4+*xD!+p)C7r6k2I^%pNi#KS>818!ILAnsH;CV<&3|4NqtYtvV^l00%csgpVD|K*4 z(H{u$sO{W*6iM(K^)=#vstEB{U{ePE{J#Wv2el+eve)z3NEe}|VS4$J~I341GJ}!db?u80sFY_LID0;W4}F}#sOwT|@_o{fw2-OtC4*pVF-tO6z_V%y zzu1~CWwE}pyDpj`P7TVCpV~_lO_%$+)LV%C0c}Xz9h_C!s52OI5{|@*)U{&BmP@y4 zIL)83zwCczM{b#>C-;}_`(75ElS1bH<_2$sLE-NkNuQX{V`XH2PFJR=b|bkmevtDm z{_Pk*e?f1{U@JeDiW2f|Iy4^s*U5{=PVGa3J{GFNpsFeE*V%bAIZCIU6ZE}j1^cb~ z0=A0;Cx^7egL>_XS>l>GyE-XL3y`dQ%goe@jxyKRS--hq<*}^;tTf%C^q>n%(_YzQ zm$AHe4L7`pqi|9T-jBQL>pRc>yEDN_ORk`ptnISl?NM%LEV34*n*dnfab`C;`;iqU zLZTO=z!vei8j`hE`@Nm6)RUN8(Y1oBcBlvpvQnwA1V&yRaRSj0CV4r+6X)bsg5LBN z&r`q+1(1#vB(R9hYhaPvXehvk0yl6mdi4pdS)OfA>&=!H-w=es6+&X+R+|&a5~<*f z0cxSMm5f4sJtwNuQP6aByshxo*(bKNARaA=~}n+qq&6@BQV@Fgr-p+ zQYfj=A7V@&Sj#BJ4rrNCr;&hX@XqJW*{0{u5JbZ!v;f~n1e$$PQ$hx{g&qqPQdu2i z7p%q}J%z-@+$qN=eBF~asY;bf%>)b0VxKFb(C6kcm8i=KHdlqo1G&RCrLY-6txqSZ zXq5HJiyZZ^dZZv|l$GdLT9E6ue>e69>jhOvhzElB!-_d__WJGNa=jj+nBplZ)@qtq7! z9a8PTUA!aK>Zh~^(;Nr35`Rf*jVf=0t3}Ays5D2)h3_1_cn)~dheNwO+-FIXFTk^C z6`he7I(kHG(sXev>~4~O&30I*vbi`AOf@ph7$@rtk1I5%u955D<=F|B*Nq$kszyfr zwC84X076l7rVtkFHLK=9MDUM|N043F@4$j9Kz7mc5(+Dodq?o-xz_iT7sNdW96_P> zJd`ecR(IIjH*~z_3_qhYD-`91L|MHmSl={GHLDlm03zu*W9i|nXcmdn3FPu3YL1{c z_r%%qJH&&sVa&;PKmt@{6Kam|)}1M+Pig@a@=)xCs}G^$8P7a|e#8n~%L)8}ld!^H z&`3Ix9!itT9oZPq`YQ6bH}-lob;;1zh{C)`@(FD@X!d+lI#{W2oys$&&g{>A&)Uid zdt~j)I~N;<<|W{cU*3Qh-w|3w>s3MhSZIo@QW13mZLgHa@ z=T~Xbwg@`i8v&LUvqd)1wya~KzM7D&Tu&#)yc?zFoSW48Bs0=D9@Za<6Q;C*UyXT~ z!PwQod+DFPc{ zx+)zz5bn>;to22stQ1+o%h$vN85uDm_E`{-#jtqDcBY0Tjhpn{zJPg@i))sT>y;!q zKv13Zv-6p6+tjtFS-rT{KTKg6W)P+~-mfQS=%VFmEe;~lnnMu)A2R!e4;wu60`CX> z4L>yei+dtCE_1T_N5NbC3TlT4YRLue8ZnQjomrb6&tGKUyX^Jgoq}HJ5;IE(f&(_p z9=S!`FaZ^RUT?zbJsaCyrAg#>kD?a{xI~crmtBL%Q)zGxjaNf3X4op!8EBD#S?jJf zV)c??KaPT@KCQ+t2fYar9mUSi&WSJZ1xJ=Tza(>)fFL6m&*?q6AnzLi`5BslwP2%$ z-JMAIBr+PC{0LC8;*h<2^P=15869u)&S~KVo0*2Z-gc>y--rI1EdEbd_^jwKgg#Oq zC(W-yUvx$dn=%=Y>vpLKd$E63PN5zB%AQ%V`tkJL2>7GEGKBNyPqBOo&h-D0dO26a zb#-I=U`J1YCAshw)WvKaI(Z$M&5p3|JrPFvo0I^hA)T*Oy*;1*#*OCH$2%((W%^uS z`08@$99=v)nW^{h!P--AiT#jy)5^^Jrg}rrhN=%i|00LprF;`Gh5I`t7`el4hRNha z^@jah8Jpg`F}~)k?w{?i?n&s5#(b1+nL3oey|LZ{4d8z(@n`icLvaT~gbE7N&N_fS zW6{MX1}H>(PeEzMW*wtbLL4G@O5LE2c8T=3HCD)|-k`fR1?=uCC>t46=dJ#E1{i7m zn_-nWP@Md8b$9|_3|4mb;oCc8qG_Syl#EykJ08X&9RFTYak=Wh6CidU+iVU z9v6AkX7I4-FZRH_nR{9UBm%(WKI6-ci_F@ceSqZP;MyI0I0)`grt2H4KlM8Q^<{eZ z6$HdPbZ9*XF&0gzn>@&HP9OyqfB{X;bPm|@3Vx0i3#B~%ZF2k^FflPO=W3Mh9d;|0 z;4OYT;{GbP6+>wPZ?G}(&S1noVK}I1@@%Mv;RJPh)4vZ#lXgyrgDQqQNCQYW>2iRf z$7_O?1vF2NVU9$eO;~!F#CS)|VT!dy(^T`ytP?9kyLn*r2=&U6M-zOzO~@(Ryua9i zi{0-!8aLjB0-$C~8!w_>FBpSkEehqM7c`3@qF|8=3W}Y#=#k}G?`JbccWF47_NoTkxrAU5sYyETC;QJTipti2} z0TF%vv9>Y%$JJtC!{pCXQ*jHm$2FGK^wMz4e9q-yd%so}Y3Gx)Rg8-#wqIz7LmKNl zt6$_mJ9}yAx&7TP*VEvkLZB**HMv$j-u9Zm^8Vl}!~s>XOhXE3JT2R}JacP(+}c2{ zjw}966f#G2_vE3mY_?u1NB2Uu)t$AVJ&+2<2fm=a5O4avSpUja%|}FA7H}DvOS9diFnes`bKyi+?1EmFTUO56U~Lfx;+naKtDj zSfA?I18@~%Ofx3aMl7V8+#8Y>7o$x@q*(l}<4)dw&GQVJj~MDevD`k1KkWIN`%apZ zm5DqE`mw~72@}(^wNfuJCHFH>!X#c&_#$bX92l~CPJALc5fgNJE-I#Bquv#Mg}W+B=#oU9V~9C9 z!@w`SW7?d>+|tSZ6VpO?CQ}-G?vafVaH{!EUw@!?u=K*z^ae#frp^dmSAbS$M7q<* z^#o17bKw0K4t%A{f%316_Lzl+;B2FG;&~!e#$nGe#8cZVD5mM~K9t6^7J#84N;S(= zbXllXONg-rMUin-5z2*t;vyZdE_MOLC3&R6sMBBTBHi%kwGUr$ylC><)o4-MWRbd6@nkr>-UPFQ zciez4@w`1<4sJw&uGA46r%2g)p3+`o(qfTO!?jFcYD-kyCI*v*uY#}t+?)Tjt4v16 z1kGDTJ2JNnUFIY5OQ5Bc4z+u%2xifpMw~9mo04?Av!)?FlKd4R$va*0=KVYVNN*=L z4%tIe!8$@znD~A8K-YQ728S3`zOm}>9}_c857G1u_CXm;>L+4-J}+}t05jEOv14rh z41>#U0p5V#J+Rl<%TO%4Xxw|NE2g8`teKC1Qv?7FNq@izO=4p3wV>a>>4HTl*?t((2p3%TY4y6O>E zIxjaTwnC-pz`$z%?f5xQrB##~!^kOjEV^Iym7oxB?{$i4eL_GdFC=X&I4qNV8uIxY^ue34wwmQr*@YH{kIrV&v+MIp6Em2zjp@1Lh&qS|qp$Bwe+P#~O}0D<8qI7)2O~J!)u45aW_A z8{wA3I*!UjfAasA2xoMR4YdOq2uS#c7^xur8w3Ri0s;aEnYvExM<4NjKJ-5;fU`Bg z))`>xPHzZsGNCuJvvqc~vv#6a0600h**O~jKg3}v%9~2af(X1x0!RZ=K!oM)zy8F_ zCWH1v7p5|*z9dFc(s}IJB*L_>n5J#y5PT%TYn2$h?t#B3rt)@WnJ3Do@LkEc$>%wF zcA5QPz`lO>LGwrxjr<(+9klNUm5XM00nH^An5s7(_&9AHX`WO~fTj(acP0azhC%&rC2>!O-OJ!#^YI}#RAp9p{l zhD*h@WZ5J7oi#{aq0yLm`VfjFyH0RL^=-RqC7qH*UHOS|e}ZN&!z z2hnbZp2%UC{unJNkvJlpa|pnq%tpG2)UwnpQ7EPB52?AH=%y=4TB%XemX4h|Rq_H& zClsIOKn>e+N_iWtbUXxg0`kAK?BAjPY8PFx4L4Pe&A=zL6{j?cp;Jr4qz0ASqN_>P z|M4LR=l&r&F#cuqI^=lqXs3itW{UlaZ} z8It@eKUVL*26+95p~X#zJJAU^FqxNEr>#r;zkL0c!eAd5^4_mye5McV|J4j4;^B++ zKgyxU|ENg&Ps$+$J9|6V{~JDEmqLs;LYlS_ik`Vm{N|s4TNci6A zbViywrkUH6{eDJ;^JaL#BFK-^L-;0tnzqZ$lkV%8-EMfFv%PMozFuC>q5VhQlZOyO z55qMv`Y8r^R`Jp@dwE*4c@SEQil0)@*I<_w$p`4G8KWYbg=zvOXCHYVv|D{ zHDF4JeUSn|(*m~dRK;K3TDG0zxO3fCxR7FPMdT7S-Abz1G0>t|lgyG-Hg5_l{X8-^ z+)TPUoAF0E2DkDAx-UIokELiou9d}|o2!h0F++89al`)%mZ)&;B6&#my`n6PWpb5a zltz8NDF5W3Kr^SCV88``fupOMUbN3JV76d!2tjQ^Wd6%Sv)yMC4qSNdSVe_l=8ctB zAOfsW!r|O5p9~;u5-Ej7WKxTEdu<_o;n{f{jjtpRcKh6Po#1d9o%mv+fsLcDRDzuN zb{U3$QJ0`=ci}`u7N)~UXI?Dw2zOR=JXof=6-Fk?w$XOnycyfA)P9Apyw}?y_*GVP z_7LZ`hi*k~XtHWxEwnoGpem$v3E@`;ag>K}{}vNu*Fq22QT){nby<--uzT;05Dw(g z`2_N5MU%wXi=jFAF9rZ7BE5o_W7Mo&axY%La6bWhVCIZhD1(qY{|5HZocg0*8U{wt zB39fI`t?jPsPWt&5k2*%Nn#%~N0vtYEB2pRah@4D9m8vj3ZM85P4y^+iSScfbI%~h zju8~T&~k>}jomU%qz2K6Qu_D^a~26Jwj?h}eE_-iv0b}sEcPdNgAg~SLu@`yVQK@? zO;x=`T!GMK(46uQl2lYv7y$bM`d^j&mw(jL<)@PSK>pLV{{N+tnf_Y?m!q;Nhw`(X z!$SX-riO+JhX|zUjG7?Wnd`?!4>2Yc8RL6dp@EH_lCvxIQp}b48zqB65AW-LmleIt zT!nDskeG2^$>npgu>AP&{EQET2dKq#DR+xMFc%;m^k)cwh|%ylrGuv3PK1&z2EL{% zkK9OBbd4^UuYTv^mf9PDG^dXtW8s!?YW8Q&_9A8r(Ps7CqkA>Mq=oDj^hWkQ%Nm7w z?C@^L8Q_|nkAxXlWHok==N^}Joti{9v<$52sH+4}r2dxN*>src_lSjaX8NZA;SerG z`d513g~}Nn7@(%AVrougb|fJNquVjKc0bHQm%rIB8jGi6*zPT)0W*`y5{1o2I-ey? zL{d#R{uh6(#k3C8r~N8F&j?5zqccu~EcwAwl*#$3tl4scGl~#gowJs3bj}s1KYnEa z#phaC38rG}(mR3B%P@f#T3U7(rUsNh`C<9Kk#``yv^!slh$3>V%~3X^F=l|lJ@Ub5 zFMxu+E}RB8=(^@#VWk-9>sFh{A26JT_4xOUdK8N5Fe~~JO?7GsD!;7*#_QfP9!zQZF#t$Ci<1f z=-~0O^C5Vd3=t^0D?$HzXT#sj0t+Vzr?z|5n-0c=1r?&E#Fb%?!MV~K_m9CDH=fi3 z;jf}R9=3URgN$fgwdTsQHc$@+n8gdm^~lf(kIFjXkE+1^j-%oh#=Gz(h z_Q=Ene=NhVmo)ZRYwt8#b#@)VULsp{>9RQ2*fQ6{(&Na-g6Wmbq?L^BAS`Tb2J`w{ z=N@6ZmrA)Yw(!@U@CsYC3}7*06x$fYzEP%gH`~#z==OYJdF4pm1Izx&C6son0lmu{ za+=P6g8x_JD8N9Z9sM-U`Ty@%0P}x0PD=8oJhC9lNN+*OW~v}nq0S#5rH*n1P(c)t z{AB53+5%XS-K{2T3S}A=Cj9Ydr9E*fbsjh8&tJjJ)=2W!5YfPV|bWOd%X(z{a?DL;7rOF>{BZsUm^P(1FM91*u%Vpg==TBA}vF zpuEdWuAed>71l*tR&k(3Wroh$;&L(6HkB!PV4o_JB(ozj(-HL{jq`ZgTdJT?sD zSA_SMmSiR)i_&YX6)m;rmFvVn%77JNIv~~bMP0iU*9r|zGtJH;>D#pKq-IWynrw%IO zz9<4=v{YAk%EoJC-dUv}@`NvY^A`*d{k~4d09ne?g1IYcl-Zo?xs``$S4vzgPxOZU zUo9cr{_fTD(-OS@u_c)Q(-Gl+rXoQ{M>{teJ0pOzg`MsHw1>*K61FM^?jm6;~GQ6QnnAUf=h}Y$&W_OAkbv7( zN3XBduMXtmd%-KBtHIh$uN4z|n`)=lE`*eKEm?z0YjHqgi8#^840I!m4DgqxS`iP^50ZENm5w zRl6wdH7H8=6K0BoZI?~iy+*&*$--5jRh!mj8VEH^=Fa%rG0c|0%dV+AK0Zab4NJFa zdxZgslgo*1Ybmj%0=VsE_@x0?s56NR%q7M$V}X&>Xmo6HEKA&m$qNL$d!9%LEhu${ zb#G2#=2tE*<%_;jQmB;dEM?nlY)-xcFnqAQkT?axLF>j_mvbd z7Id$rlBPqI$H6*)JD-C!sb-#X+q}Io?$yuPt7x{7jWQ1KdY!*-&FGeYaAFQw|L z^%KDZ#mb|^@X3F|;Yow1#!q3+>N9mmrCgn4Zi*K){SFD5A4yrE)GRu#!Xi>%SahV$ zP+*E7abgRarZ;%t5L_=}x5#ZJW?*y;{m^;kd>l8m;D;vV^pG@rx3l=2UfX|AQbc74 zCli!ss~H{@PVvXGQNLhm8BV1N?_8kiVjj-MfOkc3pwbFAT}}6PFH@CW5{r<)Cfa{U zGSD4-5oF0b%#Xa_Q)2(mFVRXE|;b~*v1 zU@MEDjNpAI!750Hnd_k#2zB~)A7eisOIJctAnJ6x!D66IR;WQ!;5IurXxA4o_iVg} zXG6BO#GE6OM7d^km6Jr(gNCXdK^jkE;6L98cuk#d~5$Xuke3 z;L8`8JwiV8uIf3TaQfDfum1(A_;o@{p7P_MU<3b86C~;Xd)NQZ{D=+djYs zL~cYFseQ2dTeGc#Yx5ZPv0SsSK!XIQMi1%c;x@gCkI-leE)=ka1Cmzem;ts9p$fKw z)k}|3a}ycd^^u?<@1mUFM1983h6A_of@HJ=i`AZ?O(zs;W^&w!GZy3x3q^t=gg9WX zPjd!6jKZnEluS4w6wLlY46)v$kiUrj&_*a@!2vPDiiH!n$BQ6#nCbGhq5&L0icJKd zfDy(}(rz=@iGZE1LYu0p(N^_3Sn!yBjEO=FB_lbD1r1zo*+$f-L4aFsFTj}4m~<3+ zq)4|^s_ND{RVb?B6&jGh2#N1qSv{$PC#^>$E1joS?ZGN#6dTYeRqSKI>N0{P!ipBh z$Y{(K)R%APR@+8-XsOjdfPUR(fYXsNDh!s~D|ieK9%R%C4E}R}&Cd`F@If%gS}vF#58SqO zt9=V{8CtYw-imVF7?CSDw{p#(KET6)R$xy&ubWQvLoO0ztfd4C)`E1Y2NJZpCQ$zN z10z}3{#|Oi0H^x(vnMD3kK_Yd2U}VMOBS0=Ra)SJ@U2UR9vHd3yzd3 zge-)oZ6~U=SaK*;imWghoGPhNt8yhdb!Q$GoI>`RIwZr`zGnS)Ad+WxUBh5&9@1ic=Nhb-`+IJI7B{{gZUy-)Af!oz$gGuheJ;XYA}mix-&oJS zsE)jo1_8Dj@{MycSTmnai$Cloi!M=w#963$H#6(kTCP%K0d|2#g@d&l4I12Xi1$!W z%&VR8SJsb}<-pE(V3EXGm<4-Az`pI3^2n8eHvz#6Y(#{$x`(!rr^4H@m?CD?$%}X3OwR;WS%P|sN;Pkn&I+YjG z7Ai^!>i3%hHZA31yVL+`JtuZ;>B|OIY&<*7V+&|!k*1Th%Q?mw7o_^2DQqpifWGdZ z;vRM);}PJ7e12@(QWbT4Eo|38wDy#gZdkxdezNQ-yPHHiqHnI=y9z+!y^8{Y;u?FP zh6?z!Z~HGa>`lU7>Gm|Ltbm0}9%`lz5#jB?6V>S$X@p8}D7=dHO0`#3?fstbK`6?{ zsoy_dS4G>-_n6@8IccuecO%(`+ zpJbm-XA36)`PG6!Tk!6{Z6d0rr!$p|kByDRMQsXaJviRN9su$u0IYc)xkPSi^=1`X zmls%d3cAHL_(u(mPE)6^v)P_)^CvPU#-Nf3!4Wp=$N{o9j2t1d@GCv%$#^zjQk9N6 z6ow;%l8ayPM8waPcn>{TDP_ zP{vITD|M|_~`FW&gDip6y}V+qM38JiYsbTT-;#0$cc;+>4qLy{<2L_ACB zLY{caIuoE1n=iE2;;$Rz_ufXOAwxstp^CP4WBW@mrFSM8XN#EIpzjZ2wA)oOO)-)% zs$?pNp45Ao7fJgET}Cr?j1#Ba^aQIa^V|Ba^f4eFyC?K^ZRwj(6I@Y|qRN*Z5rMKo z>*A@HkSBM7<=4zgMtsT~DdTTu3w9+K0SZP1<<_E5ESqrOs^K+Gr0p%<4hcUbn35r$ zDe|%i*I;%c7$+@bS8|#mBG@QWyg*Vgn{M_+O(mF#xEJ|rIFXO2!GhuK{(Md1Qn1J` zVcV&J0;DhirRrMoV#EH8f_5|CkakjeGP#WrS2bKA!z3x(C?X1C5X=sat!2#1XY*s( zqnp!jYT6DQoRA_`9AXEWSZon;Hr)NO$kLbq4XaTief1DXz5YE^$iI;+8KT)Lvrl#L z9KXmfGB*j}h^OJ%j<;g)B2pw`iqT@{Ld~E%c~Ty2v!j(+vZ)%d;9VfdJ0T&WhBQzh zY7{hDqFH4RoW;gVGmifczTWw{60rHxo{4c{dt%$RZD(TZ#F^MR;l#FW+qP|+6VJ}` zzTd6gU-qfG|Af1`x~s3gJ^{^IlFNEb#)wnXi5_G#xE}PC^U9YhiwQ|QZ}CpWV;+rz z+!Xl^3vh%Pv_QhxquEsvzuc}MKDAwM3e5}=1xRQ9myxefK$GQ)gU#4v4lu+4id8ul6aGVE0{dCvzX@s5T71R9V~SaL4Sty$YL4o zB1iH%98Qowh z0V;T>Id_01+FD9I&VxQ9^QfdPj<-{9HF7+*#JOT)Dx(OzRCUy*fU%hIBFlC@@e_7I z{9bs_a=fE|zjL9zYDG^Zw*{$onI5~6iB>;zRksoqK3>DHAcfej$rg6d$=YIxG#|mt z?lUjW5|TXLQi_Vj5;olPYJ@vyc8Gi{o5b%em(ZEu45QaTOm-)MqO+K`KD3Tuxd(wU8U)uKB_ybsvnJi^>4C_MBiW0 zeZi_IUBGZ+w_wss8hH`zt)KKq<_O$+TZR-N|LtZ9YL7}GYUL9eeD<5pKIdig>lL-U z)N-~WT9G8?m*)N-FseWo<$*#Pw63STa&lQ1YCXQQW9foq7!fX3_G5!vQ~!o2Gr%L-bVW_ z^lJl0AZiskj3ra1hf!N5{WyMy{*isAV|S_@c?+Cv^LDUBg;y)>(Du_Lm?f8sCumEPZry?!XL$tc^Or&v~R^>E^Ms6J8M?f+KH3ce zeL^d@BpuoWdz}cJ`h0OWGkh?Wiy9-GyW}UR-A(xbB=1^r%(*xtm{;A5?ZlO8K(3Iy zj~+7*2@+Z2!=6E_DAbyo>mFQbuI9ByM}eK%@+i?F6|XqgGu{&qFl0hLg4s;^_SxabtM=y|Y;@^`u( zu$@a3%|ZreG)GylZr9)ONjKNm^olk6*UjENN~ z%XUXf&0tob+vx#xKf$$UaN1aGW+v~WOaoL=6HTq(Za|^zSZIyKaYp@}!+zImc_{yu@{I}H! zXsfCqURa}XoCkGf-C1OqS6A^2?v^^)TkScPpJcr=!-f)-q(X=sZoR&N`4Ycly{!s( zR(8&XS|ysG^^Lj!3f)hOQQ$&On$Xa>(Mz~@s!UZ+HBYY4(K3FM0W_a$2FtFM1cf^* zkT8-+_le9|7Ut#rig_fJG6L<|CYiWtCCJaD?CVxCf#Tf^1C!~BjM7sbnCCNP*ZqVs z>4mY|Ak#DLh!qom#2^n#iDZ%sV4DSc)UPGU!pC-Sqt*fVDN_X^+#}Hv-*0*?)=V6EF`-na=~;Jp@a!Z)e1Wn zk-^qI73Cz<=K>Q}4yQ9Kp+>;E38Jq%ro=mehXP)0TFYFSp2R+s{6`z~#qOsGXODP2 z(W_ZYTFcO!?`Q5EO&_1wBz(F1Ukq=2b>_&8$HiMN#V);t1EPtWdxu;MTE%~thGQiW z7?LD%M5S@pSe9wZo^Mv`8+N`C*oXU19B!;A!)r0;mrEJ>*Vm0|&IQmyKO{LkfAZ@6Qre31g6%%wbn;slpb>?1Kv+h(s& z8B&hNe^<+4ssBERH-``A2wr)wc#1WL8E9Ev!G)K6K`<(LIK*MN%;`ui}*7H9kLIOi#-iaTKFQt zfAJfWF@u2WUgkSx30fKrP-LJSr`r|NeU;R!e&m$VD+{3UQ-D`+9WS`)^ z=nc7u=7~Ber<0PAeAK3T;L<^iuI7&VwWxb^MK28RCK%cUZHk@r2+|*o%1nU(dsu`J z<{LKR(Y`ehA@>D`A2wW++wUK|^RX?gUvRE7`E$GcLJC{_cI7^^H70vxJ)1H>vQNG_ z$|3KB)F>G@2YRI3h9BQy`lsTIY~Gl6cR+T^#<6DcB)qS9@#%|UG`BA)e@)QS@q_&1 zCaf~#ik;pJQ}qe!yMd8j4M#O+|IE@8LnI-mDE$vVNO{th*6O!)|{2#A_+A6MYG&dNn>n$jx z;XP)|Pb8u4mqUAx_M#U>pIbdqb=Xd+ze9URrdD1yc@sdx%$t zA`N=p7PTU<-!Uaebe#fWGa)N#5xrNx**N070NE>tTxVl4a=~YUT|K^MMx+Qs)Pz!P z!!UnvyBu`Y!n*fcz5K{zuqQnmK4qY^$8w)_Wv@gP#Bv8iwU2I%Ng;I39t z5C++LY#MLkFSK%p0wbAbL>LBsNGkj_$9KLu6d-oWDJK3?0l_`FG8X6FHiq}jpnN?5 za-u@2n;1yPOJjl;^EeFj#;26;3In>&BPC^jbEf;pj`l3j^<1C|I;d+);4kG2$lTsK z((X*%HVy-qHMFW`rk@)tl)s##z*HJWa9guAO4i^k#^K7B78IClaZ>6h>w0%$e2~%( z2_R1cF;c%%lKQP@{PPbNY$YIMoc&^N-{YAK@j7ddjv}Pw<(FK+s*}=QlpUtjO~dpV ztEJlcOh?W02h$mUAN*`2B2-!)|3K8R;b1E*B|eV9sr%gPz}s6!H#HYY?+LoqV(je zh074Gr+LtB_Y0VtxX&5!uHQSv1AQDTdgCBwK4*kd3O8UWSOVEF6g5z(ISN zp))%kecQBhtLm*DV*!AH#(Ucwb~_FJGADD7-YYRWLar1g&jiRYA~VaXlj25D3_bIJ zn;ak#A*~KnrHZYjELronbNv3cN5isHwTjp?{Oz(oau4MLg%6a{Z{xx39iFiih+n-w zF5oQuoCaS%qxaiqIB=E#BWB=-Y?}y&DSFD(KZUp2FngR@yP%%PzbhK4sVd&P6qrbg zlaafCt=6t0YbT;%EXBN$ELFJumkny*W`awSa%Zmx##M68{B=*L+r*3^x&i#b9gour z{q%MDVV(rC1c+;lJ{JHdmb2RTp1cE(t&(MX*dDiS_acQ)w8CFNHFT;-7ClY04OV22 z;6O64Bf@*kA^V1HWlA#P3zME{UOqV$kOR0yudBZa@v>z6s`oQDBPmANVUKE!$JZfc zw3^-WiM!^JB$KzPJ3r(S7zmxR82IJB=X~ih(*SD0eJ2Yzia3y!){o5x19RjxHDr`- z4wCCZ3*EQJ4(b7COrl+IM4B878yzDI$-_EaWNRiwwh{NH#Cq63gu`e25gBuPiGxT%NG?YaWs>=HEo;Sz^*GTv0 zvxhbJw7m(o2RL`( zy(i+;y4fzXq5agQ5mgg52SM4ejb=N;qV(It8eN0tw+r;k268ETIJ+ikOTwh_d{#8sA+`W!hQN4ZwwmWb*uYb~>Q>7s3cMa~_+;a(c$aB1i zH1?rQQ+&`*1p*^)OPu@SNO|QPVm4(^YbmaNMW5|1-dO`RXTGmkc7i0MCq(8(M>x$mz)7kUWq61Dc ziqaV!v}Hc1V<}e2=b+cxBE-S2O2T-SP~L^iFe?Tn6=zoGYG93@DE8En-=9a#wWJaC zFD<)R=p)8-G0rC1SdZoYmLQ*rA#{Del&XNGdo#a@tsoj5DS}^5NR?=Iwnp?v1W=g} ztKhl`mVLWS6d8%vdeLOXvc5nfmdkoEL81U>(9Ik-nvk9C*Q9a*p+)pDk2Tx2aslfV z?h>!{V{2JlkrAp%*vJq>2ao)3`t&Sbe69f{$@FtMR?{(aCm{1!^#nC0uwEWmj_=C7 zQa!;VsSk(mTIMoel;L47RWQLF%5cJSu5y+;u@=+*Z)`tG@B@MB?^R#p#A*OxOW&Vg> zka(aP)|39%?|Tg%A1DBJT)AG^tOg{-yp}kupC0eU&6JQ%+AuN z!U`Wnl_V*+5<5o}3;tVz4sCY6gtD3CrV<@9-f8K^uko;)fW)>s)e%4GrGop=UHH~Z z@+Gw{oIf;;+QcpMSYIF(nMDQ{C$LFkieg*IEUsaqtj2#UA>dd83`wU$(#7 z=1yHs;?<@$20`2U#^mhP`((eqjMVS_#a=ippdxoO2=eWw?dRs^DVMJ>FLXP7@|_Pu zfG9FDxj7z?dB_Dyffgdv*^ufU9QZ+4Ix)z{=_*s~F~}a5u5kHa<%Tej^DTYi@z)qP z*zwIc&v^2_$VOHN#sdn#bboqpT=MDe?Dor6t{Dw36Usyr7zv}4A+iGbV}!3Iy5galepi+rLpr^as^FQJ zXO+BS)(Fz5(K8`VHA9_L!HZnCzpGkvjZtMn_mUYrCfJYI5rSP1fv+M@yz5bY{7d>Z z@%wi`!LEHBAq}Li1%0d4(hGQu?c1GxHSLVLJ9%|pHOoQuX6u3;DFR@MeYlkt z7|ppy(M}W1TVoSpL*sZm6(}?NcMHL@`n=7ocEq*RW_^<-9`uD_o}hQ0W7B>Cvm!_J zPV^tZB&R%=1e@^Nw_mdVZPonWtQ7x)-Tuc(@xN7&N%1y{i$dt3J8SyQ9kOu|Kd=~c zbxk!x;ArAKK;eAHC3-S20SZ1oLivKMynoD?rS{x8NV}Uswle5gKR+^Nr5O zKD;NBtSO8;0t8^Ku_0h8QZ}Qfr^3lb>5_zhNWb=zmX7mk@y{d!9z|@_ug82)QX_?b zAX(4v#nJkNUJCqaCoxT>P2#ksl}BeBG3H?~PNWU zos7SP3H?gHh?MwarVGL0;B^Qnb@jU7b4(IodDlU4cRNFmamgd^2p~2%77@K`+IVV|9CO~io4E^PDA+ZZ*(upG$zEI!6>Wd#4PzuI9#u<*K7B2M5%wiV) za}BrUYaUgaQS$3BQK{G?X;HJV3_3j4Ff0fDCa+7?VFx;Mnr-LD16%R{nHMUz1WU#! zJXw>N!tY7)da3yr<~REKQ4{0=?0%RC2##Rt$vuuCPr7~PAvle>e9HrF{0J*O(oS2z zEAC2}{2ZtJ4#cAcZglD2BCAp;oXNoh`b~e8hQ;luEbYyFE}<^;Dc_SlDmyrSiEG~f zeA8cNOa==7I4Ju6%GCZhU+Mq#P5*x?qKX&VTlMJqBs1f%`An0_Oll3r*s2U8j`#yzZ2e_*I@)+-<>yzZ<&?R%K^ys)3@~Z7*IZW=l%PRTbsE%@C=R@yUMwu zI&ePyo2(y6%n&oPLR83jp}9xT*~y3oqqD-)qrsRk{NBvR(XYq!)R`BNZ}7AOd0J%n zQJ4yVl~Al#Qq^N<5tv_9ufeljA248|oxdTgTt+o!ao2yi@Pi4`);y0;gbiF;{@L6< z+820`p#3BkbT_eTWzgUvKd#6WoWr_DLb=(X=7L)%EtEvFY<7a+W_0n7;c-!!#cBWH z@}+7YoUH6;Yn@^O~s0T@M3_2 z2*rIH;7B!Yg8U?j`Rb854nCKPl4)kY^m>C++8vAJ*zRG$6n4ir%8rT(|?N+&FhSdxnhw)u=(RSDJ`@mh%1 zi8LkG4qP}D$_qRYSET((hHAh^UOP!4JENd9i=-eXrK^M$1!)~r>7!z=UH&ZIZI~rE zHg@Lw6~kz_a7=Yx%FB_Hk2rQl{{GnpgrV?6sVPAW!SH9WqGrbD1NK%)U+i9uOnd*C z^P=Mp08~%VoGV0+BGj!%6?%PK*s;0BU*vViWV4A{!SAW@ zLTDIrs03+sLUgH#e5zz{su=*Ga*7%5_b;Zea7|WpwO%<0M#W8FH+g&l%=PBJF||j@ zz>Z65ks-(Ao@uR%=KBErN8PAOwJ6^RpE&tJNwS=TrS3M2Pk3r-MJ_7Wc7%Ks3{<%& zeAMfzK#MXg$er3nHprTg3RWEoVi!PgEISR^wnzY+uV-9VQ=~Z-{WbIG1Ph>s5v5-# z8xP;XIzUB_d7JR)6e~7>B_OK4$NQ2*7b7+gwR9QO)I}>5vrO55X&JOdp<6Zr1s2st zVSywb`e~$x0xan@l@KRS$4DuXlQE{UnYudz;f+063js6JDz*62$Cait=d@E(cFDM` zn zFuEE^IVmyeYWrqz3|Ph^xIH!FL^vpVm%6xF$>%9p8oe?E)oP9ydQ&Ji$zd?)$Lh}a zD8*gmPbKQ3`@r#8xK@om*Zs(2c=fS|a5k+W9Q@tZ2{D~2!|2KU$1*gE>1;iYc9-(O zPjko?DV|>ySBvAv^b+|sE zKiH%cu1N+W7A0cT2c=f@;S9n!JzP9s6_JsDvGZ`AgZ^YEBS1LNc))L)Lk1u_LzcIu zJ8=%P)!;pK(#e+YT4x^?VQs6|LVwvI{+L)1ZJ8|OivpeiGmr;Js*b7ss*bH~T4^Qh+?o%V`r)J)n6Ps; zHKwc(`uUD(H0>hZUP2@F!zap~{#bg6190PCcq4VuKMwc?I>`B`hos>sDf#wH{Kz;& zYgI9_(*vt+0fO5o{N=d{{?fpIEdo(VY(Z5#)@5pO&IZhSniwrW!M`#$Q z)wMuQ?Z0gxr%6m&#&{j7gCx5h&-@?IHDr_QloOoF4^$bT(6a*`JjKevBEjk<(;u-A z+s&ru*^kMA8+X)N)7 zcwn+{8_dS)>W*6FMk4WUBt%}ti|=JI3_??M$0Gqp(QbpwJ}3+cH4S1fG9j94{X=wg zqc-RUHXXXg#5I~8K~vo0BHN{oP0{#v|KdbF8t4tirErRLF&+nAMY`qpuA1f2$RChG z+}B5$G4Jg|E^Nh3aLNw&pWFw`cPN%#%OlQ7j&G|u51e}Xp>Ks1Uc(D3#qDaz?SIUC z*J1pw6KgTHA`$YJjiIU1lX)Ob=K|Q!@4-^n-+kRHi8~Wz1?t-{=4q4PGkM`!AtGg^ zh%Avm9A@+SXigRVlh|KEZW?MCM@(~Sfi7TE5NY@L0Qa*NA!+qA1^v3VO>*rt1*6-z zKyu@B1^sJ6L&dt_r{+uOl)ibvj@nCdG@(hsj`B-&m1$-4S4;mN(^i&~&{w|BUR;E{ z&YD|r=^y~91SvxOuAs_G-6`j-IO3OTNY2`eG4$V%envZfa>Os2ke$_!0{jnmxSp1~ z0)h`e^e@8;YS&vqnvbz#M(0~W+K-{(Sm5nHrBX$eMP-m+vxEJJ?4W8X}cHgc!76zXB0u4x17+a*P&URMFdO+ zWA1?qjhaiRUJu3xxs^fS2mFP1U#ZwWg!pGTr^GKhd|3HZPNeS^=WM+^MQMNT>8^BX zI{X;#s;Pn$0$E-5^_3$RE8bn)tV{C~q%|bll&KkU*fH{MYo4RKaH}mLq7%Dhmo&H=?Zm=(w1l*=OcgSV7={sT2YzSEScA~5w#+n40=Ys^ zQl+PgVRIXuFTx%KGilGE2N~v1zLODWmRqJHv(N_?*o5Z8<(X=s!=~;ks=BlXV2Q

##!p44JSS=Jczg;JkbN&!lC`jxY*qj)8d4-|HAL=hi(IK$EMb*2V# z$^`WLle+y@Bi)Y27?IomBu)`3lBFW6Giol$ecg+uCktFzRj2qyuFMwz;mnd#@3r3c ze9V0jaV&B!8i+f0@f0#HKvxQNduH|SfHVe?bd*m$tKwyX^}HDu(H{k>W7yXC>cuk} zam@wx>E$kgoK2>?$=eVbG_04Q>^(}I3`fLkgb0nXxLK2JQPA?z{jqa#ihX{DYrFVd z73zn^^i-Sc#27dW=a~XqmVLp7YrE*2;Hg5eNjk9pVhzhkX@)uyyly-l*u9?JETxEY zmWF(`CWer=FkT3^Rb@#~bz-#l@axARJnn%mg-?g(oDT?yk5XO<`+yQYheY*DX_iJA z`sgYYnNXvV7|0>B|Fs*>nQ$>=lLEKT{Hrf$lw;nb?Fx0GEA zOg~QndmsaJ#If9ws664*wW!E_t4pak;MsFQ zMUD&P9m9l_dyc5Fv!rR+6x$Qu{SQ~_G{jccKgS&p}c+0ft?VnH<0nwlo@{*HZZgH!p+CBs|(9{&gvV2 zqT!asRd-k#ptg~U>QBg+q8jz!%36O0MjHQD{OPmAL&@r!Pyt7}MrmrMlqa49@hhFS@tW+#s2?1E;%6TsK8s?nROV2y z-9xp{rOflG?X_hV8MsY+am!suXr+Y^)N03P?K{ntWvj;Uh9Wqu`YO-}B50{DITiKS zcBYy^o&^l@HmYSGq_L4J5!?@*lgOp7-fsCWIGdlMpote}xy!UNsGJdDATMZ3SF8c^ zQ%9^j1#$6CQe0Iic#(|ha3f!=M_x_X_sT70W0Mb-cq|EAs}kmUZ1lOt2#CP*#P?qH zyrL27f*rDJ;uVGTbXhRT1iLan3Ls@i*$k^0=dzFXZoLh_aIeABQ4?J+{7BO&{^~Wm zi(1DqVrQa;zlNDwZ5@*9lSY!Cz>Qp33jDI-Ph5_8wwSBY)?o~;o0@qI4a#{_jkTiR z(y7)ut!k8eqnDldE2~ZTXFW2b@Nmt+N2Yxmb%&8YZN2Y};6FE!b87F?b-HzR$;RkSy_w1!F^QMynNC~g1rES}$i^^w~ z&P~gj`gOcYx2C0S`zCjtE0dSjxo*RzzxC_xRnJzDH`*0jMol$ZS9lul$xFV5uXjaD zUxrORI#(l@I~E%6(M!G#O@i82jOMf}h7uX}O=}t(bJpyUGbT;r*19@&x)pW~jrXeH zS=lFX-rsxKVK#pc4<32y3QbJx0M0yLftGDJ>&JG1%{ur_h0&s#!_OWNztR;w?S1*K zQBG;?{3-|ruSl7K|A7JM2{nVp7K0pARjXho!%v_AE%R*TurZ(Y-m(uy#D#a;;D!BN zlXO9^?E)oHrmcOVpS}I?`?a;b<_xPau0XDaABZQl`S35!%zg~f0~o+o3d9wx@MJtW z`bjTRTJuHuSKU30UA<0H2Rs+Ur3=mh{>yECU~5n8m@PjBnV{>G@93{hC_Jt6oD3s0 zRgStL$^BaSUM{}4&%&|6)skiZlne_^QF!8X9RuWk>r)cp$!((xPBHh@{FLLmSjNcM zzvCNl9p9lkS|4r(_qy;k@dY^c7y+qmJ(#;*P`-x8Ib!Enupy^hmglQbf6Zc%>_P`@ zFB~&d+{HGYjp$?2rvkG(0HRwL<5VOfqRc0&rAzaZw4zUxb{j}VO5 zL*Ia-fuTv@#mI!inAo3=RQ7eM= zo`Dt&-j9AGP`^faU&Cg1?+kA);&z~TEf(g$N-a8KFU#VtoGqk<5hoYk!yZ2Vw-aO7 z%vjZ3uuMp-0-~=N_&roUEQXOJNBZq=D|-Zv{8%M;j_{TJ7JCxj1RQ$?t5G|`_(;8^ z5VzQ#d$88u6;(L+tpJi&NULcfxb#XaQE26IhQlUBh#iFwSQ`8{s!?EhxICe}`4c z=W}AugA(A|1I&S4R?h!Fh6tyAFUbvL=3ApMkxh-(W{O4g{cbJ_ z&~?6V*&}m+*4$Tigl`V(XocbPC*Vrs?LW|iG3aNIuvBClun6Hm$j)=OLJI3(=e-TktjF05sLE6(2R4@`m!_xEK9som3xt6D2JMGGUv8n z&7L@QKJYM#p`~2V(P-HdmwSIV?+ms|8N7>th?J@92-J@|Fc<63C9jLOqLqh5k&D-| zk}6E?PM_0k*cL!|(i+7Dj5svNJdPp&!*f!Q_y?!uqy7{Xb3G}5c7#?Put|#oLXQSgtR7#DOzM*cU)o=Y~N^8lO zBuN;wP4kVRo~cX!2o?5>lV)6QnGDBxrMBh8>0lk(RM@k$JXNRYqWSvu*Ywbhd7=7^ z!X0$5y_nZX?#4QBO?J^iaE$)oz z@~b8xg4)1mv=M1)tYIb79#r_I^dalOWtqctg{HbM>fBCFCcsRlBIh@KI#YF~p*W){ z_coqp|C8P5TDRE8M!qFD&jAm2edN?fLAnmAD!ck~vhk<40@E64OAqV?bgEl#98($+ z8=K$nIcS6j>L9o9xiF7eIJrL2;nX`@S(jiGJp6Qidku<@>C>GoF*&y=CI>WPUX9&g z@oY^pvGWq5w$wgyFp8RqU3Rf}5BY(?if?DjYO)A0o@s|w7Av}b#mW>WtOO=$%VHH4 z6p_-}3d~k6lcnseP1P2)O&(X$1fsgR1gwqDwk^&cs!@Dfyw62p+9cEq*$C#c^y2ieZ_6yGvDh6J21^=NG%_Bk#%JYCr+=ao8B{kx~ z9Khf9hIT|3t3{t4U}=RLxex8YUv~7ui#homgJ_N2K;Q!Xp-eF1z0vr2_^i%{@x06S z@~vdRV$(N>bLUldD^MQb+jLT4r*&3|F?2Vo+EqS1==09-;VGq66rWSg#pw{XC z;lWHlD0@oRnaI#bd#a-+Yy%|ckJ6ks@xbT`Uzx@8p!bPbSrF(H2G=WU8d%bC*DJu- zmDfSp&W|3^ZPND0!0g>t9+loT7=2DN)o9ru!GgD-GZ-h0I$C~%+?KGU9j z@K7y#3%O$LJ?2Vz?PxcYRh{(`aY66B^hDo%%oEjna{WK~OAd$?k&(QnM|SvWZ;@uA zA+n)Ce6jJzo}kU_t;0KSnRW}JA}?R^n(Jaf7roi}R%uAKBK=c$Vo}cMt)X>QiW1(Z znsvoYo?Cm)#_OW+Pcee0htdRJ1lKu-yy`dpMg1Ky$qPkgq))T+vL5-7(;Ov66Qs`h z%^r&9-Z!tu?>?hmyL3LBK7+`@UdgYi#0c#dGqaR{wjYW+GC3@Vp}ucWZ&AcZfTfj% z6Tq2LeoYZ0woK678^R;Gs5kPm=By^b(=6cFPL*(V72u~! zS@5-7H@^9)vcmOL>fV~aEp1U4HHaha`)XXKH4evaAIq+O7&CE$Rw7W5*VR_!V;#K- zRN7(B?N|*JT`ohsI6?fRh5lGJ&$_O?c0PS4xb+7obmxs9vxI;#fP5@%SS+wmqKBpn;y93AwE`O#pPdo08`#u z$A(riXLVYzz%13^L7pCcGKX(q=G_`WbLUpx|LzI7F7n{WyR=J--s^5D;43Hm5rera z3>PQSlqd~f#xGt9E$+Fz41~Z`MxighYYe8b#8ID1LoYu1_+#6iIn8|R%Ij=EaZaQ! zwKMmJ&&FNXY-sS(Bx>>oUn$HeRe|#8h#+up?58$qZT#25u0VK&+~<2P3c^iLy_7+m z)(X$(J|%);4y6Rc?sQ$fMP!0+#r&K$rT9XK!`MeNXncWg5vqd@ zF(~6)%x=^SKU(Ae|g_MwZ@9) zk{^bi+y8IT&#F_+j3LbS)UDAvS)U29FfQ{IUZ42CVUV|Qje(ln1O`FVwG+|^r^a6M zL$wYRU^fmt4RfL(C)^T@{ok@RrbXChpRIEVass69fZv6K0fK!vz00fAKdW)*pHnJau{!pldas z#i4Hu7j$}R4af?Z%z0c1ZK$X^0!IIm8%#NyA~XhMaB*=C03B)7`gBsETY%?PA=sPW zBX@}$Ia;v#d0OF?S)UDB@veiQ_lQ?Vd0)6}<=P=PjiFs431;aZc|VQF`Y;jL*uZ+k zNkjD{elPU-z?AFIoM(yO|5}s@k)|WTAy2W)ctNkL+8$!4WVt*}lWX2`nVMRj_2Kj@q*8WYw>$acJy*T|3SwN$NFnOW*NYRQ|E5bfd~$Hn}qzt2;j&#eiv zec=Di4^Vj7z){h3e9>g;jJKFbas=pQp^qChZyC5zd0Ej{Dm~BZ=;U1%nXTm=dfTm# zOwck;KD~d zY`G?lCQW?c=LHzIBZCArPYtItGyNWDi>3J+ zruItg8CowMr&jcl8TOH%NXy?5-wP4}Yg*6FuIcEx&OZD6Tx0C{-WoszRvI({%_zyQ zz^tdI*__yPm70Xo9&QHM;y|D`w=4Z+YoOZDpGg_Fx9F;_d6facdP8HU*K_2n#})$r z5P;yq?Ze5BsG@GCN6^5ih-fixD2`(dF(ZiWckWM)udcKf8ID*)* zPY1o%+R>y%e+#tSvlPcGV;fkd!o+^tbTJ-e#>!}sSDzXBi|H~v3Ky|BJ^Petpz0Qt zFE4TEr7;(hgNo$b>E8f&QV(mA4x@c>%*U8D2CaG>al;tmZvha$(!0P%~okyFQFbM)47N= z*&4I-&ME=d!-)a!$Oj%cDLCza7qVe!*62h}J@{2CE`nnuHORUu@N0I}Lp5Yqr3)-! zNvd@rhtPSnz1}qs=V0?|zSl6bsfPo!6^M@Ver5eru-g=V3_p}7lgo}hK#j<68sC=v z(y%RA{t6jv9NbQZjb?8AqqyQvH{QYA#|+{Hlx&%+lf?b~f_+QKMK0zlzQYvtZzaRu ztY657O%n+u1>xKaWl*aYeV}Wz@E}NLjl!C!t{y8~V*j`vq1(PQiZLOCmxS)XOcqfr zIxf~!VTEr&b74_@q{U%$qT`?8qF=I#!RVBQtSKLf%Fiw`ac+jvc8~q&ibe8n9l6VM zSu?;p9>%4_?AJ?1&^sEH@@^=i4GA2j7)4d*OjyGvl2*^(TO zsYMiLmDOD})b!_mqR0^K_M<(D5fzjK%hJz@0+x-W8M?^zs5cUs=AEiKRr^aH_#{?{ zt5<|YknTdEy%0;@AH86G!z}pMQ6!+D!e3#4*bv0zuie4w#QN(sn2xzB4@yuFCZa_|irf$ojUsAOU|sm>`A zxH<8H9e}g*vi#at)78+N~+y9?AT*xSW&o!?}w!}NXLiQRy5c?8JCMcdo z=e6DcRDU9A$>8;sY|C~2CAR(mP$i5FY0W{`idr09IB z5Kso}OcvWnEch_)Q0^7wlk#(RnvH2;(&ep9kS3w)zKNcfW$4p*Ys>4;Wp;xX`QP`i znx5};{W7@-D6q;nSFQa_zLi~bh0#y3uA|xdQzQeL8 z{)HX*R7)(myg*zXynCAt$?577a;J~`D%2^R!dHM3E>zeJ;Y(OB3 zSn%N)`1ovD1G)e}FfY;K>)S$UoKHTJk_)UBowWqVEF%_tSKSpv4*Ca|p=SAYPhpW+ z34mx}M1g8&1tpWeQS~@N=wgxD8f_#KjR_1VPH_ek+)Nb()g#9Y=kRQ{4k?oW&cP;Y zAF_NEaOB%O3rnl4zPoE|#~+V}5^QswdEP(kxqTVI{d~@ zaw%E=ruHjJ~P3TXM#zcso)2qQDu_WFv39EBAsLqy{!1*5rOAKclzGHw)>!rslSUU z43Da7;Tts~qg;dqQACBQ`zurNH%ral5#XfAS#QX)i64h)p(oUTEGd>9L#)zi%AzavqQkt7v4MEUCM18vy$WH zJU+X4CtPLh>Ai#rwBlOq(tc*^iPUT8iro%En(My5DZC|=3Ne=oS?kU-rrMM73^65S zalMXjF4kmkFY5+gFhtG?fL6o}oX~S1Z5T+MgyW-%>BjoY;6KD!hhL64Xw}G!5ByL# z{S0{X1Um-QtJw03A`scv&Tqtlwjobzb9#_rnYxZQFGhh*cz~=I3%JOPyI#uzeniB( z8#_9TI^)J|?7F|;4-i$y5h7M;-goqYzU;$HZ>S6zoIgf80vj@pqwAfVJNi`(9umj- zn0^f5L}u>JHe)=42G{d9Nw&W(BJ|_lO<7%{ndAtfccLys;;s%&Czxd;q~XszL-H1l zeIwi`?;-UT`lF(e10Q#1BPnn-@8m5`fMYH5>rJYp;7)}Z`LJacDP}AO1CvjgEML>Fj}u8il+ zi&atc1^a8>4p_rlgYM1wcG8ync!I$R==C9B6D0LLm#aM8F9!cxA5+$W;Q(jf zIx`JhIbRq?FUGboV-;d zq9tRH8m48Aw+9Ynsm`yB0_Z;yzc!erwJn5d@VWePA+)Argzn#QrY%Vm-Sv$c<qs+Fi<*`oPF|q7kO62(dUF5KkF(iXNi=6jo zUf+N3%+2`^FT($Ak^5hFq_b3X?T`dfc$J&>3zmrf6~EV*4>oU$ZRDNH))U}>oLd~* znP#dX#)WE{k=3*0S0rY%6Ug7)_e0r58R)9ehQBvuB zo9s4wKm*1M>g0Zw&&B9Zd^{~deGI%9eA;?R3#~OfWo6AU!WFcGw5@OhzKm0J(}cmM zKdU@Q)s%oQtQ)8WzuK-TA-u?p4qOzlL5# zp;mnK?4-^f6{y>XA=QK*BJt5|#g#`6uj9DWQryE}`(*aQSb1_Sy4)=%i+R1s1QI-R z&v&mz-XC=pXlv7_4uVTyg=Z9{p15(VT^OpI4#ybOj_wDKVty4V_539t&A()+{N|l5%S6ZyOug6211Py;*oa3_8W`s&oB%Cdo4~|<1u?n z#+VCiROzoaJf*6bRNVb{yd5pV zM>+h2ytnmE7x>4&&6<0ZQClR^eEuw&$Qa&A&ZflI=>Pinzz6A?_&K4$4|D_J7Qk8Z>{`aS-ra{x6G3MLvuw9Pd@w5vuK?o!` z*2}+?>+%rx!8xPUkQoUs+g!y|yvHUb-UaAzgj7dV_G2CCIQMe)zLf06ODWz}8b6Z? zst9VYq@52g>ObB+ykDQB=zrB2RA-AOFd#hMqJY4d;MtLXV&C-aRML|yL(O|8TFf-a zr2sEG#6VlCtG&kJDfL3d9nRIGxV$bu8V6DY_aGx$Afi5CY?kpMbcdJ zM8<~UQYBm8`h!u=0A*&A{Xoy(r(XuIT^x$>O0+@axdXBG_3+j^&YyP50OrX1gNDf`jlvQh5Uc1>o>HbJjbKk z0j!up4_laompm1~=v(c%?lYL+O(~yAFYZWDQNb+d2e490jQQ`^mFH=|a!%jDfEA7jR+spxvV-}sEjyzTPfuh7~aW)I)~x|edt%Q(xGq-9)J~^ zEfdY31T-^=D(E7+5GiJkQ9*)yr9f&E7V`F`*!aN}yDE;KS_YTWe^ zujp|kZ~9qv;3s_G6}i_Orp^3|_exBSDt!`h-(}>h5pQLDGTFSfd!9 z)otM&UBURH88p?8-Xc~D-7raTO+P?m{4Tfy@rTWHB%w9WDJC0mmYauMztp>I6ZtAq zN9>@%4e=fk|J;rof5z<(vFfknjB13nXtded;}L#q!hNn8kCEwYYlvM&>)nF=(=JQf zMY_2gY75Es?#t8O@#@#3RBfGuT7()>nwj)Iq;Ytk3r#|Svr9b}rX7|4-1OKVMP&s#;6+_|82pUpUfrQHwAS@)LZ7Nd) ziFchr;H-Z0KVw)zCOd~WCAM4pu4!240=)bB!bi&=pPa@gfM2M*;qSYagd2k#KVb|p zE>W@m$7^EQ>GA^qYN|pcAX9E?lji)02P#%+BXe|b8*F`Xb~K4 zL1|B&V8z{5fK23ekiP>Agc3k`@(HaOs=%hkmIpc85QBb1pqvyqE#o@=YxuXLb#gFp z<>CA0)pyx0gt&MjJq?*2!_-l`&au&4(!@|MrY)&G4+3tTVTK{rB(M0zk+JQrG-iw~KSuIES@d+3JS3odW+$KnFJuF*Rb(S|_23PJQ-YKU)onJ3$HfYVVxNd2& zT*U@?@sk83BHUE=(2n?g`-TWb(Kbl+OIXS>ES2iVP=t7`u2+fH{RK>G(KpjdoF<7= zN_B|*kd3`zOv(1V!8cYsQq%h%gLCll-a4EcaM4r-`SPf|U4FD_*LvR=GuJ0O-wfsb zmm%BZ$S)+<(|F@A+BTSb7DX#BLb#@rk-rg1ov0$q;OGBvN<3z46BM%-#8+illk{{e zlRw74lfH{Sibxhqw&*KPR`eoj4xG+Oh-LB_Oz7cP%&VD)5kP$`l{GN={Z!(+7PXkF zAuoTi6Udyp(LV;q=NY`bsG+ghU&8%#W^jQ%_73g!P2RD+Rics#}yy^v=h zW=B!PrQOO{*AU_rkrDWJC+EkFlBh2eopDM5cLa*>2(~j!bEUGgn)-~nKw0`-_ zHvUh{nUBe}n#<$e*igLDZLN1svHlV=#50c( zg)kK3*+9Br|LaVRgiH?g+*_DoKrEJu%2RXC1)Bgh%jCWj=s8zv!(ik?_)v}F>tIpd zOG-hGqQQvff(FGLfGkyaa2!;&Te&#+@|t>3TBXo}QmB@G%~0>N?m!&)O+U; zh&SgI6^ow~z0nGN%aEgxI%h?XY#Qxn_&{X^f0fq;@La-Kpk+p?J`dGsGjZ;}vtLUL zTXXUF{c&qVh-RTtsSq&=Wm3HtY67&x7B~F#FOI;rF6N&wfMZenF=$kNTL3Nn{o5!c z4EXM?vF8TbG5ZNlgSV8y_iBPC+DXyg%q_b$@hr&CRAD3+92Mp@I}I`GB>=Osk5cI< z&Vf;Oj>>}7Z+qH77R$cMKaEjwaT~GI7x6A&$*j;;4yZqTyMJ?4{UIzMEFAQ>yan4> z_)C-*J59c_+nC|GD`uTCp%q}dRz51sOE?JB_=+`EnkSiuiLErqRLf8jv#}|ky3-ev zhllqwIcrQ;{g0}*m0}ClqJ8cTaK1d`{%hc}kAD@?fLepaQsGpz6{a6%UbG{XX69TT zly10+FnU{~avNpOnEeB!=Zlqi=oplr8Pu2{=0e#V*JYlZS`?HA+8VMn%OBEO; z&9Sttr)_p_(`>NpRBJ&tIO{DU>M@%4+h2!;@rfgfVDhN%0+`LEa_~;9`M9`b>!%Bmzu_;^R6XZ6r-J9OkTuwJd%tRiB4n)WR}VO@H_Xwq%MF{k;8hNvx^7f1*{e zO(`TvwaZ28Z;K~I;@?$yMbp`9>u9g9vPyoLVK4{27>Q|s6nhJuq{{IN zo|=H_DA9z18qSK%^nsDI)}hDKg368zsy8#1O&VJq*(5qd{#uEE10v=!F%G!V$%udp zyOGILXgi5O1`m>z$^BN|H>HI8ONtJY8tu5R5bn~RwCJ*S)ZXxBPnq!x@vIpL5*{A! zCwe2>e(Kx29rTCGi)JF6xLja85w;2^IDv3?ZjnLfmUObp-o{G^g=jnA!T4Lv7<7z$ z?;LhT2C>(MDIOqOD=hFdxyu=0VzHIrDO%@sk8{XE@oR2q{=Ul_1CuqsvMZW21|D4C zMi(W{N;@AC)U}jWCgf%K2|TKA5dW6*s>#53g9K7Jxr%3X9nGsoz`J-5H=kT3z1$vH z^g#@&FO@<%uLCIdt`lYXsa9l19`zmIHxY+n@3<>8bvOrX5O@+%C-g15LVuE;@U>uY z4>91h7201i#$Jt#!1t@VVt>-^ydP`v@>_cBQ`7wG73>$Ap&TyKuD&I9O&#pl%a1H| z4ir;LX059vES5RGk|{TPw=m1VrkCt5!&F`tr@Not@iC8XNZNX%_n@= zF106p?>@JEk4guVCZY+PX6s!S!Jb-^^m%nhiZF`NW2Lr8-i1`Ok^Rbx3EjnAG=mXR z*#e$VSN=n4&i>VM>4fc5=CRn>M3!Wtki>i;s+|D#O89GDEYngO#wtPor2eJIh@NDJ zEbJmA(S*IB@bRbAarR>JL}TT}bCUES-TcxuUQ4^C@M7w8LYEoz{nKDCm~sVY zi#mA67bAlT73Z{Zv}Pj3<#QZSCkwnl6OBy}tYvPTTXH+xFt-JkDs?&H-Dg5}7y$F) zTv-YRl~#(402ZiIzBue$l|RZ{;$`evmT!_R?AgVMgnkdRU!vw)t|WVX5I+V0)aY z?thnV)b-uG4|cvTqT0nN<*6*HdVi5(2Y3`7qfARmG$)$DdZN}K3g>(gycPujY-sb{ zPpL&!t2=|QOPIGk!7kCucuLh;*xNpFw|fT2-k%1_X5qZn*6z?nG*Pb5T}rev8gbN( z#+K=c`ph8z-CHv0{fW2YAXnU)Bp7X>5J$;fjS+icpT9zP%veZ40$X*bIlQ2H0179H zXA6$k9j_hw{T5C{%}yOYEG4IcAD7SFSX-5`7+ecg4%13>)xXDJBw(9j=Ac`iN z2Jk>Cr{Nh#K3o*ezR^97w##S^jB1M8)+1in*Fh-~l=D|;#$yh4CHGm#9nRBxU?djo6wcD@n!<*0t9ZrT}Ds)*7v!{1JF*~W%2i!;Kv8y2~o@b4W zguIQ94}8lMpALD*Lnv)LpOhBS?FZS$py%`H3&B0pEFL&CR?iTI%K*0gX|GJ?L$f4$ z7B*(OUAGjPi_eUWLJmy=ECVW-d5Q%3Hy*kK`m={yrLnr4TZT>F>TcB6yWtcqU%3PH zF`SitEZ6z~_&8$EV{ulP=s-)o-~}g~=fPZejS*0tQED&9f+zDcmC-|E7_>ad5E7!w zYf{SR|DCnw=YazaCvczD89<$u8Q*;}<3e7`2csP{Cik;|M;uWmSNI9}h;Ds{am*Nq z=aFn+1;##9`YGswx*MHJ>HftdUd!xX%52Ds7L#1R70Q$56XPNe)(jn&)Qx+C(|?H6 zGKtBX*lomt09Res?^P;69K=3%Z5Exe?QMm7wba(@QA-f#e9BRO5&cifMm+^ng2_IdP7YV?r}7IVJI-EL;E(p;^lE4%-Y z*!nB<#-`kLsMw`nzlHKXMVR(MF7zJO{K8D=XPZEO>tQyF_s-iV@fFN_r5=MmDYYjw zJ!V-WfKwy5)qKFK1%h=c{QFVAP|$CT=3F$l9Y>x%oximxlZKdjeU2Typ`KBU_jqbM zAvABuVhi-O>H2Dm@%ZYBm|c?@w$;||RzlwO~*T9|W0SjQZg z1p3F8Pt@Lb;_!Ohce^qGVCxqNv}Fu!7OB=>3fAf*>;Wz$}J5ac9^hHo;N zNEkkCMH)hPRCkI@pvuUB;T`vDW?YwWaG3wKb(5V3x>DyXAkOCO%9?6d{KZ>lW0co^ z4#t-Y?wTKQ&13wA{+$l)WZgop*;B4Y z-bo9&B*j?XENAn^`#m@ljlVs?SMl2N+Gs$~yc2X~LSE_&;Pn{zD)YEhg7^EekwZB@8|8Hu!Jv)jR!L2$!-d>wL@N`fN9ML{Um+C zGh#cmk^m6A0=lr2;}%LQR*t4AEZ`e0qW|96jq{E&TMrF&e4wh5N_qL{vPyuOv`XDs zDb2z9SAZXm$oK4>AiwmOTg=McJ==bDj<>FnBj4!R538jJVOM9i6^5l08F4%xwdf_h z_2B|*FK6@^$Fu1}_rluXjItQ=iOSxsnbrmu@^456or3ven21lF8T|3cDo9Q!LPtQ9p&Ao+u&Ha-XSynz492h z#jtwlBR5PwLZn|-Ybm0qr{%4i37@n`_U5hH*l$$}~mnVBsFH}F?OcYLeHWMit$+;mQ#xaa4D-UI_w=LuuuYbs7 zggvrLE#fvB?UvNunZ_%C(;Gqquu3_Iyi@&s z9-B;$E1ZE{`ZM&Tcd%I}(Kt`enM_mXW=M;R(PL1v1+eE%igt6A)rz0wz8h&-UCWB zQOBK6ZCja-ow0;h3jbCmDDKmj(g6#O&Yi^hDl!ibupx~+-u6n=VhZ=p^y4FJD63JL zx;B_AVS1pn3*5?JAXU)4WM{&1k94On8P9*30sD zsHwP8UqbSN)M|h#{-aILPN@r%H9nrRjx}@Q2kuGCArVvJ6;Zee(Rf9qSKk&+dDu^l z%OR0Fv_qr35N{l17bF zX)^7-V{?6?Sq5$%HIn-Bg$Ei%B=dIUVN)TD^2%|^R(IywciO)l=lL>p75Bcn4qYOp z6U$TQUgMsflsuwdp#QD%0ojy%Kuw$iY>{+^x6Dqopir%M=*pLbv%K-(!}4OURTPLb z3Z6rY;ScAEBCA>LuQ*m$g}+2R4D$^W{r&XwVzOcRv=ICE+{=SnWcBNpFXNxHumAqK zkomUdKf{)N5=7XbKAL!UrIixcCG}8Y|IpGLyEJ*0`0lFl0C8}|HznP+M1sBO#l%^B!p875Hs`CIZOok zpf?ekWD;dSwPSTz6lY=a4H#Gl&cbeZ%y<1KJJBd0bFm1ZTJYMy)V}B{sl||pCQkZa zIYU|7_Mo@gI73MF>FRAP@gLR5zCL8r4!}I~Z2>naZfZk%Ezy{4$1uGq&?6Z#*_*As zb6$oZbCv8mf(g4FSy0B&ynRFg{2PEb9PWVlA=${+1$39AVKuWcPxf8PzH+oGPL1j?sl4 z3iz&Z(uI!M$1&(5!@z>n7j9d5nlS+jS|zW_Gqg-0=+i`1D) zCPwtm%&)8hIJnzn$CIiyb?f_fp~)zVmNuN;-cr{{HkN%bURp_{P`$4Z*UiNp`|@qb9O##dq~ zM}x?ko(eECzP7|kzRENW?%|D$K`Apd+tHtLjvUHDc8>OOOfZ=15A;aZ-u0D#v`CtWQgM+bj z!jbX%Nxpurob-pRbBTXc*Jn_ja;A`~j3V_i=^;c0NW0tfL(&M`)~R0~wT2(km$}pM zc?Wn|rmBGM5Q!|a6+srzls>Q3d~xM`ck=Kry8bKa!wD|WRRo9k{i=JqqKTsVR#*Qn*t=84wG5vm zHPSzl)HMHqKovVPGiwuNHw$MY^ZyzwM=AYB;&Y0 ziDcRyTfs8TM(xJSW!$snA5u|<|JtbdOnc_0@sCY)PFT-sb(&~>%x?92e}949BGr>I z04t-JL1Ria*4X9R$~(B^U&gHtIv-XLXHsz0e(?0S=YLr_O=-p;bJr;g|uOq+r_? z)8oqb-(f_@rY+>n139yWpl&s3G&K5CBm?dy0?7Skzsd$k!`UMKz??{>s@y0$mhH2| zN!pAokdPCW@kL$ScZs;W0YBP(%We3JWmeP?ujx>`BZkLLBYui%N46{RLT)rx9=e1m z)(@dalf_;LYhdp_tNw(rwfa1!m2+vTjxxoY7*#s-sSQT>&=MUA-qhTl`Kx9gf;?~4 z%$?jW9>&G2Wy%EkQBF;K+M|QELk*#I2KJRll-YLc8#KT|TmqP|Kk`w_CC8*A zqhl}fo7T9+t{NimFD~cg9}{*G)}7J3P)Xbp*p3iN;0!|^6N=WuNZ@|scw3|SYQ`hB zo7y6#oVE{PGg0j->z7`xZhtU>zrpXY=NJ=GPWwCw|h{g0ZTl4UxGjFFlV($ov4R^zsn>kUsx#m;>*%w%HLnussJ|;xR_22Kz~Z%?WJ0pew*x?& zis{55taw~=r(BJ5@ms!ji+ihvzk94P+d73q6&E*mvsa6x6kume_DNR@e2aFR@z!^_ zYw5XcnNVWr;ENI???|H!sA^q|m7JPRpL8yOdx^JV{m*Wx&)@4j7d`)`@bI%}Z@{^N zqFc_(nX--^&D9hYg4JK6#qrxO6$G>e7rT*8SP1koz(SAMEJDjqE$Nw`tCM~xs0=C=iwaJvlI6^P0jf3c z-`^;4l~eN`At}G|Z&Cdz@v>|IY7%Uid^&}sa!5l0Pbo+m$f{20l;6P59>4bD8wnMZ z#3C@Qb?bn2CjXiZHVT}|dC5KgR=zFlohZ;%q8z^9G;hZ7&Q3;S^6{m_6z=NX=x7Dm z{Md}+kp)P-Qp-`9Ln+>+fY3E?*N-PEl+#bbSIiBRKT;7qAuW!bnP<+^6UEKxRIw$? zca|>{dIIDiC*4@FK}m9V_xGgwo<>MYM=ls-=wa8~&>kRjEz>%K-HqNatJ@0ZmmJ z%CG45wX93Dov6){MRU#=6&aqa-h`&0i1eH$+%Np&7dpIWPha5nUQfag`jHugW)j99KSo~N928Q>hDeJE!*O(CUIncnw0H@ zGdm}l5X_T+q6}4ytaE;3>ng_qcuLw#Rb*+O^N}DTh?IyN7k*tX=D?_P7Gc78IA{EZ zUIK!F7}WRF({m?`4B8EH^QU6YL-G!v^Bm;(7#BqjS@g853u)&F^v91k(QS^Gv%1drmOjz&)O@* z4_-%7ZxZNzyO7^-6S-xn680BFgg6(w-v#bx1Rd6kJtI2rgI;PKi8I zAr{qPbuT8bBu*ZS8A}d~#}p<|9tY~r5ny6EX0;4-#mZvTjIZchi*oA$gUlw9{SRhT z(lAxdR2dbC;!JV!NW4y%a>m+{!0hy$iwKL(DL{|L9v^6$pE|-C)__0SxK7dZ4jcAQ zJ85Yq=fOq#9auFMVlcypev^mmc|<>KSQ8a7&?f`7@C9K$N`B5-n^pVI(N>k#QmBrD z_DTP#?&xQ*W@)_b_iFhNvn@qPr|rrxCQx730*vr`cIbQ-gBl>X{d03Ed~#RA%hl%B zpaGXPS8mP3o*QJOwE!+>oB!+3(NbB=PyAB5ElA#W$gkcYMbGF$3>=VsZ``0mro^j9 zrU;|KM1cqgc)=Wf<;%d(;2q}ToR>_M7%R|-k4K787_0vBa4Ne1({nMZG4TFsV(4@>7hej;G8*aLdK0s{F`t~3slcm zdleK#K1;H6s>I4@i;xYR+|8ws_DyPGQ;a9veT|@>OZ+MOztD<5<8LPLiPoTh6dLgT zU!e6r{%=_-R{si#=T(jkHc_Mq--6lCvuUip{82@bNOS~EQibtqSZq>il&o9Ft$Llo zFZuRMY6qTS;A3mo4darg2(7QMR`Su*^fJ@wqSfv2wk9U$%UXaD5fBZ$3hf~;D(^3* z--Jzy7phn1olGLCu(q0~QWSFoNqhvv3g$pdKA>M+Z-o>Oy8XS}$8?jJ8n}0I5Wej-d7FkqEh*7JNe}AElSkFO$v@A`-_Zgx+>ztfFsrZJu%721H&{v z0{2L$COD9zZ|Y>PBmz(%hun>c3;}1g=L-yp8v2eZQ4{ZgRUXPy8ZpTdTvLSGqX<4o zgEI&P#Qv~i2l<*AGF|d$rqYk0nH?TtykO7o_g?ucc!yJGGup@Ju~QY77h1`G`>O9| zTq*-FSn3W9R?IZzP~*l=4pvVwgyp_=jRB|DwG4 zgnksY?9ZwYuGE>@-xTll{8KdBEwVsO3Odf`FiCQKf|m6(0Pc6q>y~ne0Kr$#N9C+c zLI!rO!%pT3De+(Wje5VRiU-03teBr#PVY=*d|MLoW2)-XL=-2BbBcrXPHu5O;%pkn z)$Uc|3yfsv>pnZMkyq2%!UZ<-+62K=XI9Xu)oP(>PYr|#Bkg^DN!)fvbtJ-}NU7xCl#Y_lvIggf!xon`KzS%MU>>~B~T0U+D zQ9%oRU?=-;Jj2nP|k?~y^4w(+b zng1elzBDWb`7CkAav|mb@klX1jBjd>{}K@C+x7KdcvO!n9V7X~qv=2X*{J@9c>GW7 zsV#dUtD=0YlQBr9qOB+iXc|+p$ofN45I`lx7dJ5J8m|~eXptS00sv|0X^Emeux|F7 z0zOIT_!`Pd@cjCTm$xxWlUZxUk`|1qA!}()m(N+7nuqWAkDsESr3ieXQh#}W{eCbS zV-1(yRF>$hFfNPi{pp4*7pErF`AC%JCk{|=OB(CCD};WF3rEnG0B9kq&rKpzP-A2z zb%QccS;;j&(3Q-{;jQ7gIEFdsTY!be0VkdHA~eVaAZs9-8jU1ER^HCZoDqg9OQWb5 z0|8tCxVb!5_9G{6a{#bGRq4hVO|%guy0a5p)9;BOrv$N)o%G`t#_!UY$zwpcpO|0U z@M>wJ2dxp+wiv(1RA_{$0#4tN)AP6On?ZFL$-yy+wU_c)1W_8Nr9ZpG`jIuHQE=$& zpPmFJvbQ)NX@pNB!6|JK-hI}86tb=C83dqJuyCk3aUVY z`ABNh;gG^V)1ie&i4m464Ply)EX8t_zD82H#~UcKTG(x%38ActR=YtCHd-bczvrmc zBDa?c(I^IkHyMRnkGW%Jvq$!eBywH@9wtyrb>8rBRzBe$BYTv;ac4U^?d zA#hY>(9tNFC#m1#1WE!5!|8B-E)gU#t?~7*uPvK5XE9GIh5{;P$51QcZpum9A<8fs zsN}plA4}cgehe4L3>OqJxuVih9#yebtqM;~(a&&oPpO+|RS@Zny%D0emA1wnJEun< zbvO{>DKXOYw^f=D`U>`k9>s_z)>*U$5Cf1ie zk#@OOU;2baC46|aoow8k@f^$?wx^f!yCy0dnK_H>B;#Nh90w1-?dY|pxT*r-63^nd zg#)#iu>8p~djSVatf>UytT!X5D&fV!yTW7{02w#s$t~p%hT-1?W~R~YV26?6^%4e*} zwcmqy<$g!7GLQbfDN*8Kr(hyYUA6#Wu{jpIrwDaVDQ8L1L30 zIxkA(oUxLTkod^!R5>mMfmB`5WG|sIo@j=7eoZqm%iu%zPU-J2`2?kgZy1%zAGU1Y z$oY;9eVRTJ0_T|rsO-oLGgKD&toiW}k7W0(^C@IG4%4Yf{1%VmsZ6gBYc2GSZC!u5&6nT}DE;|lu8CpCWoqly@ATYB{VJ&Kl*--jR3 zVFxwomt8V`afbMV{9dSY%POeIJvO>hllc|l%o!aN{ zXwBpD8O-uHjV}7`gGANX&B+a=OwU(VeVHs*E=I)a-m zPz79&N+TM+)hZO)K%eMH=sLfAId=7u7!5BWjdyQ5YE>q#E=F?Vw}AALhO({wz{3*v zhLwGx*U$?DF&`1a9}{35gV;b0Wg^w+_!wb}gq#picK0J-3*!)&MB*W%N8hFI0^EOG zBFX%Dij?G#9kBJ-W7B#U`J(}C-VWC92kW~j->`q%jqW)pHnK#U(tYVsR%x+99(%k% z8Rr7s#?d4suratZq$?s$A-sB#D;ipzk{gl73mx3488wuWrlDxs`(r@@Vq@@!lgLh4 z6PW8{be~6fU$6(!HDQtB)f;3AiB4B!(AKIieow}dA8g}J(XWfmxE4NY6!gRGvfSb( z@w^JvKP>|B24DGTDt?+EcK8S6MTrdcp}bt=>Pnam?jjNDk{$3TFKcRI#+cL*(#;+W z7KJnalKr3}-)8>voa%M|W zzxpkwn&2wt2v^jZ>8(~v>Em0Dl%1OdL{B?|$jI!XbQjuK6~0cDvFMCRY!qwSc9eO#Dj@3_dJOvx&2ib(Z4_xBF8 z`-98Bo>#4qA##oTr>5kQBAj2gI`gixBtbpA<^$|sEle!&hl$l^``U;5C*uE~g#Q04 z?fAc{xuR6GKbag1UMuc6dN3J@UkW4hMRib!+cPk7;9h<3`Xo-j zfTVL)Lf$ct1XhlP{RI3}LhMXf9b{8$&1lXq+$P*s3odi~K3=f9;Y-b81!e?B`T(Yw zQaY_`%CE=N?I2+THy`=$o!BeUo0skR_e$j#wx_Lk(A0o>OLbsyMqjzSG__fr*nq%- z2pkzG$;?~6zRkeAdCp4xDw?|dJvN*F`#TI`=^~1ms;5#FV_~IbZPtJTaMsd|Zi`Wa8`GX4uhB58_P&?(bPF^bD@58HL|68)ozVE$EW1R&SSd%F7YGwmqXn%STz_9!TRXdCYj;t}ZWZNH(zL$jU>PL~tiNY$ zRq6drh*IO&KMELKxWghrj7z5Sjd}6Tr{kR_p$+Tap5`5!f1`6-<%#vg$1iS}!%QxQ zQ_{#QRN^^O7S~AXA@H$=ypSC+YQL3nR`vL1e$zw#Vo@gG=>xV`*gUAaT%dg-`jSf& zjcic~4>+vcIrK`j815XLXUHX(F!Qfap4Y&Wc9`qD!3rK~dNr6rg)g#Q=`~hPW)1P| zJa*CLFRY_DsNQ70hSUb2N56m0uYS3tI)!LquFxAMynTcTdK6|5sc8F_VvMC9hUMfNAj691>KS9_4_bF>I&Hfh0;Vh0br_8pAK(1KcZQ_8Hmr-#$Hh z;CSf~6_77?unDxr`yOyQ``!9}KH)tYHnaU{v?;#BJ39{ovBwEJeGA29O0307uy=|YR9LPeWph+~Rvnu3oo2%@f|hE+IJ zT8h3b>$a2f>ak-<&wp4@oq!IUMks$6xW||{gjtQ8LDVDfT{wvMCk8xoq^|G=1M1MC z4St2IQ&-Kubac@b^SUKbFFvBJsrE3m$*QBTB|K1Hg}i+MLK^c7JE-NqXKoP&af#v+h;i=wOYb?gjbSS^Aekw zQFeCd-zG@-3v38w4dMtjuT#Pv&FAk$3iU#nFiT(H?C5T~=O=AUl&V_d4XD)Oe>69X zNbs1;m?!&?imxlAAkSie~GzL8iW*Mjl_KVwhK_Md7@+2y=WYNIiQ}72kdGNIvGbBu*6wg zhBEH86haO+Z>DDOpqP$68gI4dEnltLs4sPK)ioM@?6{9MtvP+)bndV3_M-(m4z+*w z1#p49J^#vTT{v@ps{6aBXV#p!bhtWGlI6sY7_Q2IFc5Tx;RcFjL``ZKRCT&SNd6Yw zU12-Zkp^|N#{Dp)k6Hm&$dXoD6%rEs9L)Y4#jHAP41v^uuv@&)ZK<-3c>Q`T>}Rc_ zbUT%k#wf8Ot>P%+wrXdc`Z?JAS!3t1opK;2_~I2OXn!^U!*HgCtNJuZFNOM2OO%C&VB_1*@UCQ{}$)AJ>N{&ywMpJ4?Fz}YI3eTVA-aVsWdbsTR) zytUjG8xmGLgi;GA_Kp90w|!%6n;NaP%IWw`7|R446*bU6RYGqk-i)OXvzXXM@#aRb z`;mq`kxRzAY`fFH=86^5@5yHgNl!nmtPe$kN>CvUMHdeUz6H1jIUXBOYe;SD@~BY0 z0#V2zTq8P9mCPvI62>LHLoQige-Z@JfP!}kjLA1wl*lweQAv{TmBb-~SiUT=;{E}0 z1-Z_$E`OrC_N}?8VtD8J`+lz=-z1rkf}2z_9Jv~;Qys#nEt9ouO8}u(ExdGG!AB+| zm;pmthm3EDC&P$>7NN{uXv0~^!DVn+lKVudwfSA5Nc39Kcc#XnqH`;49Hv}Wo z+dHXiim*xCDOdI7Ng77W$zJZ?Pqr0BO1a)KjyFz;4c8yq1*I!FESZ?c9ObiO6|9I7 zD>@x#OWm^}^Yc|&W=n>;Ve6cNs?QL|%J9B{63jnGb2lygH6n`6DYGN;ccwE#b5fT0 zXE79el)Uq7OB6Jo?4Dms^Tmt+_wR#Uk2_aaybbqHeP78ocV=>)&c59K)$k0_zI1SV z`||j3y=8GiYx@>#Cw|4`@=N?uLB+TLaT!ck?B~gc2~NFr^hJ-AhT-kp6pVX!^`j`w zHd6Mq=C8v+H7dlJ2#Jm;F_wW^F{8{4+u3@_x-j9l|L{ui9uw^I_yqduKlX0A{~tjA zPf%+@x$CIAyvK;mB#5ccXsDgV5mSbxxQm7JIbS&MYzC z_KhW^IOoweOwA=vjJ!aae~B_E$X2&=F4o*B`qEzELp zbmd}mp-NgeJD?SMyHH`BoHjm)=Jb%CRvNJm7^gxhS-$8UYxImb8NHC)p2y>%LbFrb zAVOoeh5~a=+YG1)Daf~H@~|V2+EjQnIXbUOfg=h^XzY|Vz;115T56KHsD%aZuFzxK zsjm|@X+MDlMrKZFb%Je6TKuuzN*Wbq{Iv`9z9Zwqb+(Ih5H3lQ1^a-=<{dOcq;3?6 zTTEobm4;VpBEx#3zA~FI-dVW&2^78`xevTwYz!PZA9=eUIbUb!r`T*bE?H_UEX^?+ zKkGrZN36Lb-A1dFY2N;D^qzYlGRPky2pbviqci2`tDDoh^9u#WAY{3_znS02Bo5h} zP;k+LJJbvPL?EXa=ek5$oKI96+Ku9HygwP2L^$eL8vyxi$l8ZF^pnBLP?FeJn7my} z9o(ENYw`)uCZ2ZXvMo!mVM36f*7>|*h{MQG;~&?sSH94=!repTATYFSEaHnHj=Uf0acwF5RJ87QMSIEX}E z*F(B7kwuN`_LQ}-Wxhp2era4EdpU<0+PtqTmc+|MPbJd>7%xH%Xr9ue;X}VWso6=j^H%VF9L2+-MJ?nWN+LKV=hHs~FCkeu%l%S>^VN;&hrmAqk@7L1 zWe$27k}d65rNcKmf2;at_ytiOr{XvD*g~f!F1i#?^_6i98Z7UWv@Axv8=uc`mkh;E z%30T|lxEZ$2PZE#@sh9j2H=<0=;1`!oY4S@yCz|?c=3VW5A`ko!dr7k_?3eVMcQ_d z#96I;CXRx)$ftP>MdjwJa-irFY5xD)FGpfP}2)JChSxiA~kFO{=|c6=$S*PZf^5~%oHgz(}>XD*P`=PFdwZ0(Tz6vD!XXf zng=)C=;#?zVsZ789z^bRFNG=xFN#!WZdkfq{Q-OIx1yojebb>bs+We?e0Nk1AvL!3a@}I&Xd|Lgy#1nqCw0>AZ~o2AFX`h)t}?%1LHqx-2@4cB%D>+*S6`1rW|0(MkF0TgfX zQGOJGszj}(mEx$QiF@mMyi^bJNyV^9975ySNU5PkTsorNTF6Y zZ8{;8M+tuUX;oL`b`00fdstQkKZ>68Omvzgbc5db9BtpmIltPTAlX@3L~ltl^V*&& zF}#!&fiVm71mGD>Zpq2EcpHT~m~M{Q^EfkmLGZBwqH z8{2lyvKDGW35O9{L^I!UUs|~264v?{rsrn&QYQMQ)a22850Uj$^42xl5A0d5{T)gq zxu9=oDd;PHZ*lp2EWtUMSQHSFd8A?HR~kWeqeUTx<_=!G(W3zB+;l9PWoA3x$h=#_ zXq!vXSIK?UL=ko|sHCc;+@`X!oo<`Q+v7uA|Av>4k~|-;8OLeDMJ8OYp(!Oep(W$E zH*-NXZrwh5b??0dS!#kr=Iy-Zf)5&R_yWs-q3#cESTg0)*mELn`p#q21-_Qsw%Q}t zzFXbLTT`T4H+)^Qb7Qjk$>Ln#WUcuX(cH~tdXf>O{Gvo>c`YA_Z?BPQ+!l=icHNQc zK1L&H=o#E`di(yX0(x&Ak$ZFeKGZYepw)2pQ2Xq{At7!tR!|%jx2O$?EiIlhmDeV( z+1T+C4saKe>2j6xbf5XKfj-qw=#i}hctc9w&uO<+o`&|R-mbp3nZeO+@x7)4I9{taL3SYV2Y!!E`V-aak1aenI3Vv{-RTNgd_Pu>D3(hz)kM)mbFpsd8 zb6J5ZatYwYz9*T1&-(PF2lTukiorWy?0Jf$MPF2VrrCnpQ1=3AlL6V{D#sgMhlN9j zXk!#4OB$pt4T4B^-WjorWE*2?EVJb{?%Xj=y2LhzHw(!Z0(x3ncb# zUlS0_)E#g!?NL3w4~UkQ13AGI-5jC}2>m=dy1pV)Yr)E@Or8@>(zCSe4Z2N$nvjUj zd~nv*seEFWEN!TTF$O#6Fd_dYwuP6 zD-TTZ3y&2r=$DVAjskKCrekK(^EQI_>SKj=%^FaK=k~yxs$+j37~Yg~j>f61OEbAM z*t1r%UE7QYBs)V0UiO6{4C>t*DG%ZL3A+3{R7(T(Ah`8D3|9v^-Nve}8FqJfu>3yS z=6O`*JCglAy3367cikACV2s;6J?fo{egliY+No68fq@39gQT70GA#DB z$F5wM@IwauerO*X`hEU;4xa%g>fI%LF{KW=U8Z?^+f%DM3)Nxy2(d6sBDWO4<$ zP78hlc*V0Vq6kC9+MXy2#kD+D%f%4!Ff2UDFtK*|uy$39=*9AC6YF$`Z5WsRt4aBi%G5a9w{Eug zWu|Y_Oy9PFzI7G7a~-W~V1-!S6Vl!qu%;&E+bUD_P)fC@aU!kSr}Cd^gL(Lybdo3++HF z`=fsGjt7*A#*{zXQ_dOJ+(BwMe|)^RdHYZau?}lQyjt?%&JQt)5b;2xTq{#Yon9{^ zag%;=(M`R*p#K&27Jd=Z9-E~Pp)1|GVlZ{ZA6ER6%~f@hQ5jF{K6mW*-l&+}-`tZc zoL+f>af4K+I`U$7&#zM^KQHjxl~4Y%G2m3Ugo7A(8y=aM#Ar z)85sEUc}VcTEWoH^uL4LR&7WR6?Ig;vsoE3Og%Iqq%;r+1OjYGg@Vuq77_&^VWDOK zN$ZP*9uj3T=8GAUgsRr+KdYtHZK_*Vsx4~W;j^n1`Yg5nz-lZkYQ}zz*x#tQu+hvnzP3gbQ_0dDrHK}lW?=x5b7_XLB3iPOd1y}J?g7!}v>7khY0lsmGRRHjO3%5jnn{D+U~VrLAU z!&>4D3z%kES~}WF_Ux5Y!gf<=6v-KB=$Fm_L<_o>cZ#U&OE{44Ks&0$XDK$4#X3{Y z%OH`I{x4+}OZBgRO%F`0{OG zJ-!|ZQlK)KX+2fkM16p>!pfFm204=~{xTS_BF!pP1sgJ`#SYfT|tDk zo#Y+WW0$YDcWzfGit`9vkE&Efl$9z(Ro77#g|K~cv|Q3;DU~Wh$~+dd3Y9@rnPe{3 ziCK90{mdnTjn2`uwr(Kbeg*)m4ErIi3jyxo`qi(Y#Ht$&Yob)NWy%>#L4jF#04rRX zQdjEJSjKTJ1~Y|KkS!@`ofj&pa>XYy&2io27|(8QVr#=o(c>M;lW2mM39#x_Em8Y) zlm#l+ugoW?`L@Q+*G#W2sa2M=$;?;X3d_7Ta$(l0TH=?2L^zO^yLx3l$W4Y{V-@FE z`UuF&V5xsCh?AkQp5VtoY-Vo%!k_1;*FA&w6b_0}Y+yr1dHl6Z&c;%)Dw&l@7T*B$ z32B-8fulV&l$;#1-&rST?(x$_m8D`;hBg?&$Z(3jloFd7mDM&-g=DNGT!%zo7qhjq zQopd_0$=5H0(ZcKseKF|<+k-1F{3uT&`E7u_LQlFU_q>>M?mYlY9al*Q>X+!2*A7F zPr6R-GwJg08LreOpXgG%D#ImVtrKbaY}Jh`lx?h>8fU+_7z-XP%d@|zo{@Y==5tnR zLA_fgEE<~V0J!$)N7r@R)3o597eVcyDpANLSg6N5Z5!~#VhOnRpI@zGb%!i%dr)E^ zRh@8PDq5o5uycZ15Wh2{t~qce2MxZ3Qu(NS%7c2z^xfq}ApCVoqeC3T)^S)QroW<9 zyF^aQ4SzNbNRX~lLDMT;I%y_g#Kn!N`6`!En}%XhpS9Ba2Fq2uq)yAjV;j$}bUtFF z@=NCfmGmVpAH!Py3Yg2n19gnVFB*`-MK0ABTJN~zO07lzk&S8Q+Mz3mjY)75?58hb z1p$Wr_Uq5KGs!YuY8vu5F|&s_P<(6;K?v|=IxeGUlEr3hwGK9tpdB2mtHZK47=Wfj+Z1fNViM~cU8{cg1svw;iYZQh%`aB7*$_+~bTncLuC~?B| zzFlyOScOFQTJc2t(PoGc8~7}tJH+c`F+(BOv=Fhor+7j4K^Fv_rbeDO5V0_N&2$OY zrCsVxV(;_<7(ml4U-~H;Bie;w9o!8x{DeZUta(=;CER47HUuP{?PxSl2EIcm{Zj2R zp!A20(M6MJk2prK%wNAWoF=X2q6=8;Y<$%$d3pU9G1ZTv`t)!0)5frSBrzeiU(J%d z$!N|9s-wbTyW=A6MhcNPuax)p6UI`PBCN{kc5ZA4u(Z+%vFs|ZFu(gU{V|Fs+WuHl z5Met_8|1g;1b@Ez1*jKdl#Tw{N`wcumY*kVZ^=^qxhaNNQ9X9}tmPzf(_%b+;3Iab zUZFbT)bLoOMS8Z>%WIdxPc7cVR_Sk;RDU@?gKUz4wV5O1M6{8((nHL=luGDnen|Rl z*9C0}He0w4EK~lEp75=|;srx5Y#6Cq`~)&$!_{&;1!PW-{Sr6Tw`@VV2RBzsUqr%p zx705}6DNT-FHe06|%nbl{a5sArkEq$;C(K;4=J+$+(I4qgSz(wv1Mkcq`hmcRXe!y8R0~G17-98^)+#QaYrY@(5<& zw_+ac6HX=Aiv4#PTL<5Xt?JMno;5lok^Esgj1X&ISW#{v2SQVw8G%H_(@NTOxunyFes zeGw|iT<|TfK8- zk9n2OJa)pZ>*t%5{Wn}a4c8KJA%Gr2B)r7m?9}RTc86jKi^m2J3)MEGFIg&fW~#^> z1A;WAQMgY=a}Oo5N3_)T2R04U&zGz*+3f10pfRscILO0F&{N!Q?JjLzhPane`qhQ+SgbaBBM*hYjxbU#v6^t z;e-Pmk+HS4O`ag07W;bLbZ0ZSw6WNyClniqh%c+PFST((_+_fcUDjHb_%a}(ugL`r zP)Ik6(GTaadZFfO#FthV_PT*Ji`3O6-FzE{FZY00CHHV##JqeQzK4$f04b5?+g>&( zRcXIUaJo4Y{GLL<9n0?WIj?<{{Rn_Wn(7)1puZSaa3Mg5xc~-c7JV30bU*meHW8Dc z13+}I4ogWshJZ!P;mDPkHqa*~kmI=1CLrC1Jz2*|w$XGEFGg178EIS||4_Oqs#$_I z8Lk1S7E6v}E=+a=>*|iV4yG(pFm#&G&Fxu}G_RjrE^B=T5E+50qyQ1m7bTX~yv6tF zNM%}RBl#mnwmc6ByxbA%C-FWctCR@|oQg(Da!bij%uwr zqT&>L&p}2Wg$zsEt@jN{TsLGbC+G1w#gT&$dDLQ}p~Z`1NGIdDy;O??DvRr+jHgx@ zW_y9xZ3n94TZ$3Q8j6ByNX2IK0lQ;H>@c6c_4aae^@=jqQ);y&RGP(fDjvE@w#F&< zvn(Dkuw}D-poILs?Tq?Ir@>>RfYS@%<)HGfZ>qac8JW3EMB#}}AF7ETNiQxL26Ii4 zI+DZ|sJTeRm|XpBgShbjqk$~CMNkKVJ_&waLG~QbR&9}pvTy8dYfxt2C8EqVqf&P` zvPxzL2U=bivV&oN#WOqjqY&PT#{nV4r_&cPh2|9oft z)s^jE{c!sh8)CADjsbDALUsAv+c30saxI_-@|e4Tz30uux5tW(iH*^2YnanMnEUNJ zxi>>fgOZQCCu}@@Y%MLuhl+3WBHB_#;|HkpUYvsCuk`NeM;NU)Hjr<+Pfzum2QJX3z8)F*SczNb>^@q~^%9Hx%S;-_=VS$d}Q&e(gFrdKt^FG??Z?~wu-^;d04v6K?ij5ePD zNSIXYppCC;EBoiSi?w{Kmr=T?T!j=`Q`FkP900LEA;_T6??R&j{gfJtGg=SyN|Go9 zCsn@)zUfXqlV>Vd`yaZE>RQhvtNL(~BuYn9qt2l@^|VMAZ^hV32XI?+?>%gItR_X6 zRKfVpOccPluXdVY9Y<~6&a~ze$p4|Tz)H4EGertYDvE_FF(^HQFDic!U-;|T2k|X` z{vEy8Pg3Vk`H?>QOfUW$)$v14DXy2T{ZuE?A7ECTOMDwydoN$8pR}MK^e`q$iSf=N zW=F#QArf2a9Vrc;)LqNMP3w#=yDp84UxE`OGb-_;m-Rz{nl*oRRoV%^#M7)^^C~4B zUhxG$OR_01jnbvQcSYqhSEk}aM^2tEda*6yS)+)kFA@C?#+6%D5oq;hHKPE__Qw3B z>7y@1_meYe#0x?}Gy@b(ZIa#etx~$Mx{ilQV!Gw!w1k-=iS6R$Ifj*-*TOfyW&oeI z7J0ltsUMBXWZkK-BX6CdcDfgod&~I2Dg!Qn7%`_J5%!Rq`*}eVidVQwxEVF?-LPKR z%mC~J^0_dnX;2>7RDo)|RS@mQ6{~fmp=H-}Tqsqw%IZbywJ`pBC#KfW06` zI!Ab6cqR5Ru#_bnu45K;L=3efH0QneXh+2_Qh8#!mtxmx9MQ7WR8#!cwPy5ZVFFGn zoP?<&noJR1W?X!EQr@{DUFyJR$gZ$4lys2k2go1sAzMWGjjRPF*AbqRX*Yc@wFN4g zT|3N`P7PZNSozsBoT9d6CUGFV2beHw0ORuj4|rkQ4tuuKBB(E$uuKI}xy;55a&JhV z>D3F&JMyhPm7T`JBXhZNCiQa4)h~9HX2O+LFOiA0)F#5`lcFR3L8hJR`oeF^60fM`9vz^h$g?AO-CJ=jjY*(=AzcrLiv9G~aGkW%XJH zgZZG1qbw-s+nVesHB(3R_qglSijgz={GK_lSseHg!=3D$bN0dQw*Y6l1D@;-yU;nW zfM>u1?*ykXfk(aro%kH^0B3{AWACxaUdfJN{D=NKo%W;14?Q5%BN>ygeQqSYLvaFbTh|1l?I$;P;2Z8nKMUOf`{42e96 zs1Rm{0y9N0`4Sl%Q_dW4lH@=WsstI}B%eDC0Fq^StjXLXQKtow2NNd}=Rgy_1QcLN z%mf;MBq#z+2$JXk6GjgnP>Hl0mZaMl^vQS`5_wYbCL{?p;7Ke3O=yxx}+!cjL5# z3Kq$ZkdeF5vk_W1%;?#iS3HEy^jqfSzF0G(BwCTFo8q&VMf$;Mgm11ig{k_Si235k zt5|8tCR#`nV3!K6! z&n~JxoVi6&VpU5kV+zZ-?lrZI$FSsnBNfwI;KXknCQjQpV7~g9l}2K?w{pNQD(`)t z0QjKw*VFGW}Je%kF?8%dk=^BQo zL)zi1FX)pn62V``UDJC;St$q(LpXTCxtnrMp8%?W4-^YBwF=r+4=pPc8LvxdwZc;( zaX9%^&=k=q$^xFaNlM*FF*;?f*=-{!>vm21IW%8iiZ5Ra6=#mXI4p5^XG*Y}7*Moc zqElgp(EP-3d||;?4%t(3M7g{o%`X?6vu4^kbM2gYHjZ!(d&1_KBbjp@xuQ$>re<6E zavLgoT%%V6@2RP94q-0ja1QY6Nlf7!_%ySrS3xh7WN2(OnERSwos}|teja#2{u4qv zOJ|%B@YNK~7spXOKG4Z>P9{x=BBB*=T_y?=Q-^fUuJm+FENz6xP*eu&L;Zn}e9+@F zigf*wi!bS{Y5GMVKTN83)~O%$ib(xZIlox2ch@c~JNP7#KKD*53qw zkVKkN=l5}^b)(Z-#RGy_){td;dK?KN@+m*1!VaVmBzhoo6%a+qjX`}FwuoPlH+!HT z?EwFbviq%oU$}jI!Ld8|&57TV>o2=2Hah3-XsD59jzpi>AfbP=ZDMUax)0LmY-6wQGcqCh8* z13@e&fX_Jx;Jr*bTJ}*x8JUx?BS+s99MLWUeg>8yvg4-9n1l1I`EoY@Um@3@k2QSMr zfxQU@SFl~yyL}gIxOOz9no{l)XGXO)z*84Jok>;GOFh$D`i$I1k#>DjT4ql9aILePd+Y@0~a6srff|5bHx$C&#QL$IVSj(*@)Et91`h$Yz|0vkG5P(zB681YWmqZ z8|ZLOwesx4=Y8q_atCj)in zk~$gHhE(0|lyVsbs04(l8B~7xjEWiOa>|BOB2#?Xe+!JQ=gK|2NnlDkCdBEP&vPyd`G+=da)$0UA7S7ry`xN~}i(3yUCvd^STG?N%&F zw#9E2xPJh@)HZ5kdI0d_DdX+Y3RdL5%~e*^RL zP4SbRoA7x_ydw)4Lff|60lC0i@YcGc`?1EJWp@nVOT+C2GSC=c7#`ez(?)sOj{EQb zJxs(u!L9!%w#7?bulCRRKZE?=%FxBe(9Xrs%!A&@(AkvU#lqCql-}6&zq-fR+0&XB zI$6^hJ3C+XS~@>+Br&}8`h^;Eu@!lnX!pctWkeO+eD<-kk$EH|i7Jt}_HF(83jRH$ zm1@iXn^)^K)g}Uv87X2$#0&_OpJvEm|9jTn-VVRJ0COp9Q2XcBK5gb3*UR7e_jlZX z2bxt?EytNM=;+pdP5*}r$2uB+;nvGy4-*SfT{Vu}%mGViz8*QZUbYf90Q7SRfH=r4uZy zx8IXrqy)^@5ZB`NrvMOxX8vD`ImbA05s9QCQ@UG=K=h+2ots3I@zK=IuVKctIBH;= zFKnVk5uJ@tM+O973{fIt-%3!ASM~@p!oaw+L_5sLM;t8L;%z3NVoE+Ov2Ih0C}cm) zhW3Jmwt1REQXK&!C|$h9APPqlnZjujDHO}BcuJQ}5g{U}LB>$JYzGYlBgn2hNN^t^ zg91d80NFJyx_pE(nR~S`m~YJwkb;l^H@S)W;q;(Uc=SLTUmf8A99UyawCLWBwy5&Yq+TD3FW) zPOaxiNg!YRF8)39>a>$uu+iL$%eA7ekqP5lToYD1Z|DU zwXnRp7o_EPg=EwDQE=6E(b*aa^!Fnk!b}5rLnojxWaC`xVW2XV<6MJI02LYh9t1|t zsBH*pgfEKA>~?j$)TnVgx(Tney#`-4?~on)``Xv|qlu326gm3m^_g)AATHC9gwu2h zYB7t?{hjhzJvPCs62E|D8({26CR5r5E!n-Cd*k7K@_9Hq!P^$0fPEV%F1M`ii7#W; z=a@{+%FoGnpJ+wz61)PI6#~hdQ5|rX3~LI*J4u6m=)idvVlw@&;?M3SIOQqoDwnqd zk`zG%0_DRgVjQU-Web`}1!zog=CEy;fPxS*)3#@OnYfM-GF1#Hsm`VI zH|o|Y6P3hJ1wmwS5J{|*3^L0K2@4e?ZG%GeUBw8?;IM2^G177nL@Px6zfGp?_l1An z!Xb^JVkb*tTmg`YdXwq(zeAWqw~G9yTB=Ojm14Yr!$8KTgkV9VP*vRC)m=ndRmjT2 zk19p1GHM6|Bm3Sz^Lu%TO=uZlJ7WF5Rn)?3E6j~l_UG+w zH|Yxa|LS;DWu+-!40JREI%ymj>s%deU^CxGa3tD@O++Ke%&8N;N+c{tj&%*W~k z-BI1$T;j+qh_tWn#{}BPUrGg-O;XKUe*tfbk9-|;0Tv(j3HPGUzM#x4hCt^_Ig!?Ien{?T5EeWjHUJIo0TM_cx(sVIulXSGd91mrv*3eI}z$o`R8}FzTUQdB=on#co}C-(`=&Pt$dNt#&_a%@*a;n}^T&DmoJ8r3 z{x)Pyg^TTRcI~cpPN=W#v$!^+8dK{}`Lx=v9?vCi5w8`2Pyq`U*NKP&wkfK8ou2)y z?1`<6;6jH@nFEMOB6%)|4l>O+U%j|5D4+z|f+>w*hQGc|z{%*I4(2L5(04eSrvZQ+ zV>2jJVl3DX03cUVG~5~>ql62&+Okh`|CRgFbyNo8AFXR849HkD8N7P>m*JSz4s-kM zQXcKK)PQ^Y%6~OV0|rBz@rc{A5-m5FAMFTv$#V|WS8&3qAc_FkPU~)cEfa!ucs@GU zl6bNq{C1sv>%wPDP37*Ui;PS_MxOBhQg8UHhl*2xitq;BFIYGft+g3e231&84G$a) z=(^?QALQcM4{Sx(Xsrs|3y>EC$P*~dbxZ9stf|vc9SYm2xq$um2PD#r^9GQ+7;X`{ z21P@=Qx49MoOXJ}BQ_nlPa~mEVpc;Zv+NJddXcK}qG?t#b3wFPtZ2HS(0l-m5;NS| zZNI~c-*0R2%V#}q>z=>EN=NOH&i7Wd?p+?hV?vfUpSqK?=KUsq$VsJF);Cn)&mCE} zH?VytGn{Y7;j zR{SLwYeWc{;naD*QC(*syRoB<@%Ve*yzcu+K=#1gEd9G2)-OHKk*P8uAcuL>G|lB| zN7^SmFchi@d5v>p11E>jhmRMU~9pcf1*a(TWXrT+r`d|3qz-gy9WD=dwe-(`^|BFyD&qaTh|-Rkg*c;Nguw$@7)EPb@}e_OfdVo6>(=dhK79S zVRRqZTTloQ)<45;yyGyF2`E-{{z2bQk93uE13uD~S1Q^kDzlftMNmN%<1L4((XXOq zj6z|;jltr&V{u*58bIzs6-~(%kx7q+RedEwJ#ZdBtE%Wd^d2>vAkS0Ji#i+LGQY8L z&L&RDlKO+A9ixa?tEb%C&O?6<;R|bY1Myr(!Wp(v{THQk8@E#ij`}=~PGUDcJ#*%a zUpk`K^22j`kdbbR>yK0E!VZ^gzKVpz@32AH9ElKpUNRctk1Y>;r z(t1ovgMDSrhI7;GZ?8*9rVF;K#3mz+=W4H5UqT?J<&dpwck;p}IQae2?9ufp!|cAlzNGApV|bo#$*B|(USUzStf^S9I|OzM#Cu(F}t}m$5!v1P7E`l)61s` z(vc3O5EWx#8~QXeig43d*oriFhcoJYV^2RHW>B>WAd^Q%)=g&IEgp;q67x(7Po}$a zBI_FJcG}i|GT6+CsB5w^F>)K@9I*|8 zxZ&+ArL2<+9gxIy_V37?oIOW(+tT+wpEVuz1|pRM6w!RWdx-$zZvQQ9&4vtjV0+Qfqz1;64lg?1l zBj=e9qJCTt%LV@3?;AYkj_LceJJG(g1^!S5u;VR_Ar$%NiUA$3hH`WbmXW$NlGbX# zLoC~e*?-tV&)62>7=3j*Xp7p@covgR#{S~#jP{SR8&x!`oQ`v^4aX-ykfGP@c39HQ|%rf}mKx!8SvzPUL5Lm0EsJPeM)x^>v*96N%H?Y}ZLgdy!$TNw zdMW79fVXFHYj*e&5a~HKBwwID2P}`q{yKpAsm^Z;7;%(Ok;b$)+>!a->GdX3AS+DE zhl9Va!EnbGM%lpGQzdgYo8F702)7?&TTz-JNRjog{Dno4q%RKuysV|oZ{6pi9yq>7 zI3dkQ&FOYqyh#c^LtR2xf1p498*%(Z_sq64BFSU?n zi%EDViiVFLV+p_W+Ohnj>03HE#R)7!@+-7>+&>03&(ssYsKz)$Z^r@Qn6Ks!S6J-7 zJoR-MKRcyYX_jxPL2lw$&5P%2aNGHd*Z!cQ%&ckXsgKn)cA41)a`Kj+%mPt`4@Lyg zKmF{V$+Q$bjwH%p4{96f=utdhfjJ5BQ`&qKUss>bg6=STdEi}vKck!l7(Mf3#5V+f z6tBq9`>s^}j&tO2_tPWhEROd@Cv0poiod^tVdO@^O$>B6G2=jzrUs`lvg>N5g!Cz4 zk-+y@j*eo_T!zJMbuLt0|$nGmq`n6GM4+rP;hgi<+DL;vc+!#;#=43gG0gOqu< zhLxI2HjgPFO7@cwO(k@7wtl04{*#tE8ve%S>pJiHrVpV@<^mmO<7{+A%*4P3?KH>G z``xV>@!IZh^b#&AIYwgU8qL<%tt<~RnyIQI+shsN<435- znfY8|?VIcB6aFcNJCcE{-d|*Ich z$9lQiH0&MNFEKNEu&vd$rDOQqf%!oSWIV;U!b)xKflo|i{_{*770$mC3G@C|GDtrH z=Fgw-*w6lYl>K=&`yJeIsRr?Tz}k_zxweEIfeq5mcQ5ljZg2Ol0^)4@R}(g9Z-}O! zX&Y%L^Md&9aJu=^{i~Ajl^inNpwY>Ue#9SD9%*12RZbrytqYpur*x77ohFC;dpMuc z7pG(NT(y7$=ZIH!NExvN{)03GCQvSt*w@zn-azQmBc2jX%!z(^ZScs}2+5Q_r1~Bj zJsp9Kz#{%)4u-#YFZ+#J3Tg5778Q9uVd zQim3ZKhhc}Z|jb#_AT&F;ivuF9dhV`9s{D}W={x#=_|o^*s23P-vhV=H^xz*{3E2l zQo4jBpnQP$U-Lpr9$hLCa489|GuxuK`pWa6VrHWTg)Qca7K$0;o6F ziq}lw-e~Zo7kIT#Bx+;M8xZk!uUi9iz`#_TK}lT9z4y_`{?ye@9rqhef(fE zQS6~&(f&tr%4pU=Bu1oWn9 zPaf{RBJ%lbY}jr_|4!83?wzPxJ@uIe#=CCZ)cRTmFhZV-mapy_R!ppTN}_`X%R`qO%B0{!BNK zC$m=yc@km>lN+t;|9S`YS@TP5`d$+^sp5N?7OhS}T^=C4_wrR*oGJaIz zKWnt~`|ZT1!Q`S)H>6KxQ}sr0#XYls4Do*;F(z$<3fNWN1IQb=n+o`mJHmqdHBuZ! zG8{$7#uQm?fP@QP;KBxj;W0qr9bUP!0^K#?S|hsl83YkbQvS3nC;8NL@$@{LV8_eK zz~tP5V|5;rE;vn6c8A6*b)89RHm}&7usYx@#X%Ra`|>~Ndvpk zC&BLAuTQwL;90gxUt1MkCQRRM{o|zmq&H9m+DTs7Np3Z0@ouL^#3^2~Xm9TPl#?$^ z>>I(4s27@y3Tc(}Hl~_Bu^@D^x}K8Z3DF4!Z+J$vhoJ7Bwf^6Pb(X!;-c z-OAANjR}c*UU%WWI?hEY2`-)b=B_Uj<%;O;#{zG3{WI>51E;^(7yO@U_51J?C0n=N zf4P=^vu~e(ieR`&m;jyzF0QyJk5UGD1|$~cVN;6eXw}{$V$$WU#dh?DpkB#Eblt2y zrK?`+Uww5Nr-b;(W%Al{7Oix@@4$=vTnB)0U~Xg`jD=L)(S!KD5PdlWdUvkSmDh@Q zo{&gxB~dwmWd<%oXvj}=>)ai652^uU!BZw-;Q*!O;lgs}&lY|+`1IVUG+$c-L$oam zoQvKM`};v2^|wrCwn--&UTR2vzOp%DGC!Z+M3yPOMg%CLSRHP4d$7?mDe{7nY~g~E zopc=Ue9EtR*9f?_%)kt_4&_+eUNZm8CnH$hZoHlqp5NU0qla9XgO8E^Vd^YO+}xo4 zAm`a>Sgm=9iP#pQJBo!#BspT9=qdDoT3*&0c$~VIn)mmyX?7>Bpr?;`O=o#D4fR31 zM2A_<4NB1#7^B! zYa5}>TsNJjaNA+ZT3^ZS?+vndqP_)xBY&a2*`>N2vOX7T{5;SiMnW|CD>eceX~uwu zm!FTS_yHSZIs5{kW}?abtgsZ~i>b+wUwiYZ-8Pl(uF$0B&aMDd#9Wd3`ZDc(cd5(X z9Ccbc@2<}!u#tbQ0d8M-|JK5qyzMIhblS&s+K2m``sesAnro7K+Fk^5Oi!Nha*I_IX*K&!6mO3;MAG-Lb2=QG$#Ol;3k#caWz0nqvinwwmg$J#K#*`=WX;&<49{qg%8 z#_gJWR%&b2o|;`f<*WDPb8L_Sptpn-kd%<@;hWd4Nn&L8KY3Sm9(}AV7?0kejIzu- zFmd+kF#waAiwc32VzIBqT9bn?c70MUCwG}5Qv#>Pb>CdSAO2-CwCEad&n{m6{oFoJD&GNGW>%j0wz$(8k&tvp z_CFOc1kJLtyzaaR-Fj~~y!URqnoO_mAwW&=ehTM3kIV`ei>JfXH8I*8_7%gQWdDb; zb8OD6>$Y%g+Z}XlJ007$ZQXIwv2Ay3CwFYywr#uLety9@RlCNXYgMhP^>xoZ<~0Vw z$TnxgX!ZY4&Y>9WymT9-$B%L&t|V$&qgj{EqT45Q9z4h|n4w8+*?5*xD}Rv4wO|=t z!Kn)9Oza%QoQNpU`~TP18e14pLGMjk`2+oi-jbQc(l~m#+^nXK{Bo-Mc^wMOgSj)u zc>R%}b-g#m_ZOkeS@zb6K3rFhp!Deva^#-~JyKg4W9vHjmQnK9KnWu`>&)BSz;Q#r z!m=J?-+z=Ktv&_QwjRD^IeBo8rvoCe=MV2~tf4|d5F09tM^Y{y) z8@3Y-m{o_M{yU3Z2PYPIy`!qXEU&=QSe2cDHf9^4=}Rwfo0+M;n~E~=r}1xcQkOBB zEcOmm^hvRxu#3?2@CnHg^yG^3d>ZPrW<|x!Xxa|Z63(&78t9+oVyG+oboHVbs?x=2 z`;oh40z+@fu;d@g>b9FiWIo+C)(7E|*v*vc-K1J!Y|(3C*Gh#J!Plrp5rJu~Ua8Xe z;CtRyQVb=mBi22sV^7WTT!_lONM}ut`4wL*Kq%%j z^Y3kze->HJNS&Q<%Me^7A|`mtkBq(8J9xBTMo=H`2(7M>ceOr@s{YHnDa6HGFy^N@L-h_un}`E zN<0TMfbJa%zF_<_3n=MsThsUMlp9()Ly= z;71FPG9}YtbN#{cN625_v%_H7BK7^K1;2>Jn2GPP((N*@Sq>}U@n(kvt#UV@Bo2OP zh5-z1?`slw;p4`Enmg7QtO9HmAPfKvXTj^yiE5 zT?6tu`A?sMzM*>Wf+0^N4>h`emGz_?dBV!Y?a~%mGZC)^RX@HQ(x)DsKb^0hPe!>o z&5jdAVri-ddwZw+ZDPB9v`$VsBE~Ov&=mRJ^gCaK*YdV3)-p95;g8MN@hf`pD=(%E z(ttD^W%r#&ZqxfO$to@qV^l3sLgk~| zw~H~$_yMbfsX*_Oq9IXUbVkU57)*pxUu`$ho;T*kvMNbBCiky5$K`WM(zb@NjQVPAC_e~^}fWL<@bhl;dv#+~7D0L})INBZVXa)ByHk!Ze*>?>e;lqpv ze$rE*{Iyn4O({)}_sj&FsWKFkPV68-|2y}hMr*>ii!DDAxlD&yiWA&)8^ye?EG@FT zWs;QC{nuZ-b|N08 z!cBxh0gQOr!)=H|a^o5B^pHlU{scJ6gdTSx57B!$l+Uu7#`BRaOT8byeI7d$7Z|D} zLJ9+!Md?|-G-T%AE2tMi0*^v*w zp-V*@c{zT(g0Q2CE9B%C$8?&{x08TlJ`8`UVI^6g@dAHfbWSKPK%E`Td|3VL_LmP- z>>B(P-KWrT-1i@Ltn`;VX*KIUbf*$^_oCX=ow2+P1sfOhOeoC&XVby>`JrTD z#P*(09Q21|nrHX~#VLKI8Eljn6~lLk*QXhzhtbalvhN+zCuV*>{Zm%n3WJ|}C&hm| zGd=UK$k!AMz$g4qR?^>3U|(NSUz5MT@jQR$`Ww()F}~U`j=rySH7ee|5*)DR{pC!4 zaGXT-7T6Z?>pUJaAC>ck{X(`9!b;WSY}vdqYCqKNDh+H`F_}(_vVBKb^xMCxaN%7u z=9Z7PhnB2JhwUr8ymvvZaloJb`X0V$u^C~l>Un>|K$qBwU2aQ#6V~U$N8CNzy4UAU zO=*yMdbQnPU&C5;&5$2cd+v!s`hnOIH27mKVJ~@|joJ@Mg6?JK5BRNE3BQB~(+5U} z8f!5?I})mI=6T4dEgazVXJ~7j@Pj8%hkI}O@^xH;_UU%|=J$J<3qRPc7OGYYJrk*Des=?B`>*+bomEtV_b-*fzjx1nT9EjNnZHH97-b~T zd^^oo_gTHGMGm)fC{78zD*GI&IWGx)$+j4K5dl31|Mc6=g0MwlEvNOyMh zgPgi+A73uhHil%0ZeUfGUmof7M0zTB)@(I1djCVcDL8xJHt3a@dvU2S-L;I&muz3#sL=~w<>0Fa*6`@nvX0^|RX zg8hEEm&!Gq(8x|K)qJQuOfo%~dBF|-t@dZ|VBo4fgb~0T6aJu+h-tRp>~SvPhiUsU8|l8xb&uOr@-d(aB-dgQ!e zZ5tet=?BBTV(YUCO$HJi2wy1&PH&Ev86!pfqS^BW4<*(f2I@x@ZmCFc-bgrn4fveN zZt=fHCUyqLt~FZY<23kwdByY2M&8`z71xp&3B@ncp^8OA_AlXENT5o~v9RVd<-Nsi#Kc z`@-w!zt`SH%0S_VM~~Sg@rb9{p6{kr7|l1UEehDmUT~z}`SKA+CU&hlQvYi=Zz8y3 z<5pny<{pckP>yDpj<9|A0* zKb#n>W{D~Yj~H}Ya+*r`lQH3Yoc*PfB%pmVQ zdxc=gs_T$mKU4ma3JD&Oyhgk`-@`;-WO%PPnOhJ+-R~vxjmRKgK<5*;)DiSSLFNMe zT5m;qTj@ zp0AhRJ&1%h6TCVyJ|8!Kzps+Ojq-YRHrU+-m@ncKZYKVIb&Lf5eQ`$-;`uwX@z?X? z^V8>}RKw5v>-zrk-+2oGILaW(GlzYsMTrHK@|0iWu00*nhhFG@Jx}+1NU>?3p9noa zakvCd-i?osxQ=!NJVSulmU@@MXKkxnN4tKnFi0^Le{7$Awljhfub^j&$ZhiVUh#-f zU!N8PL$yGcm~$aJCy?l1Z=&uA!P*wbl+rc)I8+)~glFmBniti2ME&6uIPi9g}N(O&{%Y#f-W0Rb`HJ+7F6?1C?&5N0_+yp(QKLLG=d*Vc1utIdB zGMck=_$KyWWQ+knJmrjfAYWkiZ)SDiL$}Xbu)dL09Oz#PKS~UPwI9i?>**Ft=nJ-} z#B`;%+zE9SLyjLD4y(mF54I)7KM+OiF;^?)I)NxRWUgYY9Dd8cnKm^1yo%Uf+x}hL7c0O`*Wh%IFWwB5G8;y%E$lcBU9NOig+ONP(|6+g6vEQtpi17;3}eD zEaqj#4jQuKmPbc-9O^AL{=}!j$;}no4#;NyNei3NkhUS_EwHAjD7N+X;d%Ci81~Kh za`JU0yNrM2hXvB(zP}^FCDerYW$;&$;Y(2H?w9i7cgpq8b02d?y2T-yH0L*su{&3{$de^ntX zTj@34ZSMrk)K$qpcFV4dj~nTSt6xU95f$6-9l?>w?d}F-9BEE=cV*++x+pz3z#b)C z@<)w}!kRZKD8`RT-42YBp{)g|_LPDQTxb#{_QocKg(y{8|F&lS zZDFvbbLk=-u*|RTz>!>8n5dR+w*m z-EzYv{zBcJc)C^XuoYz7>FU3IL6$kp33oGC;_+&V{4sFy<&jV4697hM#y;m{97bn) zO!UVlBlF7dobczy7N7eL7S1_{&&~)|h`kM!vM2jR8ZO5jLkI2+w<(UZ2(?LwB&mP%Zr)*ujz}A zjK7o_PA@t00S{`^1Ymzvm}T#~p3f-17reW6ofQ5Vs6EYO691snx>u9=i;O}hs6x!b$_~1=#dA0$as;XZRm;)p@=RZ%5f@9}k z(Ozgsf8Ti`ByogL=xl4;eotvsod=FL#wK9hy`fJD^#{^M^@*h9DIiev{x-EVWTXob zpkDl9G+Hej$|aoD99hVU!#RC{8+nDpy<{y7*ak=UVP{QCW6Cva{H1>vHAjg`N=+p@ zXZ#$$`CMu`NdE2666b`5Mr6sxrb;cmj}3ZwR3A3b`N}%H&FehZ&FWy&=CT;ZaLt%f z%W5^wa5{mDuoH0XFqfziEuCk5YW+~#xF3)avTqmi*Hh3$K#I?5y%ob3-eOBix@i|= zOhfd0%FYkWXGV`6iSJvyAYQWojdCH+3YKqLdU3};ZI39%6q?eR{L}6G`g>PwR{v$o zJdNsJ`=uP)z8i(Q_r&Gz?ZZSJlbdICl*g;}3V)zS*GUVs(8b;Y)~6JzLSOyTl1IoV z!i9#ekYVaOjg5N!z5c5P zn(~#%CiW=~AJA=B)Qd1t?Nxf&am7>U`*-7M&>XUrm{~|kczCbf4Wqb-7Z0#8GkVXD`*qDUqGly zF<9`&le#8N13cm5Na45F=#mf_Ls1cQt{GI-Ry1&rZ2OV<--}s ziKpB}8zRb3w(38BdFaL#z+wc^=}7m-NGq<(cWu*56flrQfOwO;u4VoXwZ?||D{`yr{hg0Wn;%eA+?eg9TX6TQMrtE!)) zv;`Km37YNd_=0)Q@1z9XQlMzjOO8S?r%Mrd_FmDjA0Mh-OO@kPueh&x+s3xt9Ch2E zm-*won0rw>HQ&t&5)kIy)@6!xMGCO2TJv&Bli$hc@Kn=EJA(MNMAvy3hMCuwyr)q*q0=1FT~vDVIEm7_p_Z6^u`p3P$9^i zF@s|wM87e@D)&okwgZMQr2Nf6T)g+r++t_t;ngsRZVQ2?ZhQ#C zJv`e19F#~o1Sg}Wt?AQghIGvKUaR+%3xprhP1$F=6ON@F1#wlh_!p7i!xGw0`0S^uKqgv;9*={to}ply;! zQFdP(fhxq@)CVf$pcgjF`#+OjjXmb^a8J#Jj;%mZgc%C1yzpwowQCphX?i_+zgh--!07C@VQm$v0M|d?bN}R$XBH$!f{?^3&(Plpgiixn?16w9USM^QjqD z30}qDsJ_mnPE8j^O-=a<#sjwdVoT>U;~bdTEXA9>_5A(#wVw(`KZl`ZcscXigeH5Z z-n=CibrkH~ob~1vW(!61hTQLOY}_j*{OGTYqW-pQ**#=LAJm(-u1!V7-5_@Xj(uh$ zMN2|*_`Hh@4A`QaKH~@!GCkkK)t^}FI=R?(ydDTL(m)IO+jcf-p8g2~0+|gn{0Z>+ z8enezFFDNUxGKeH{y^e9fT|YWnUa*tK>eY58CDfra&TcBuGvA4JFd# zQyKAc`@0@&SPg0I!23WKAEA$%$wBajjB(CTPTa+rT*?9xMpyQa6S3#6qb4_>5G^L{^<4C(zEx?T_Jj+Ofk#f&^*UAT z-k_f&BtbBl4ACQx))k7}?IHzVEa4k?%6~AAQV{5Kyo!I}lpV0MnrEsNw+cc{7HLx_ zPmOsoZL_9iI@{7g2l>eiPDba(Y*uPXd9=^1A-ha{S!mdcsA^>g8)@J=}|OJQuH zm&C7$9dGcdvK>b>Y1Cl0Zawg-imlYSZ&kF2xl$~*_G%fwBH7|fJV5H>7(90#LrBpQ zS+1*SO~w)0kb{Z=>dv1YI71w%`9XLXSXs`OPt?Yo)z9h2jHo48Dmv#-bBG@?xO1gO z6K>~JkgBMxL~Yh-mD$9+nG5(k4Gj*N`PMfgacmBpOf(b&c?oT63=7?eoYPHO^iXi& z$K;^D8aQ%D;hU9Qs`|!ADBm#*81D$HW!MRS97$N}ZE~YqkFHS?Fw)__f{DpDt4+>f zwgt1%;MWWTT-Hq|xzx(mZ>BLSvv-y<=Idt}h08p7mZC%WS#`{0w=cwOEs~Z7BD7}J zWwvm0KGhRf-j0#74%lj1MsrxN&>pmqX&J+U?yQ(|t&YWYk@J;41}{7C#A@%+c4khz zWZf&=V|_N3@jXitYt_TYO$FKB5sPbZb!=tF(1APJFIm#`zxvDU>-Cg^sY<;I??EFk&1=YuHYD-%6k5-=6DE_Ji&F&rmIhsOe zEy5G7BGpojP98O#kSDYusON5jA2m3jEI8naVXL`H$j(-drt4HH!fK&P=OJFWiqiyl zJdMlg!j(#=+$<`(DabG?LZ*Y8;PiCiNGe3QfM5$OpL|m0V%!CqC3v7fWBK*Sb1rH) z*oH=wYCr}~<+-_W zz2|xotZS{LH2Vxw^}FbL)|FQeB1CeHYH9SO(t(hZT7t%8UR9lk7JEhsx2ElTvD}}H z>AiPrbsc8!W^>uf2kU@J^&xvZo?p~1cKN**;*DDw(@#2eTj#xmvlOxkk{MnXv|&ruC`iF$)<95bxSm-DE$&9ZBa zB(MRj4j+DG4KN52FsBBn(n840_g zbOJH0#dR!B;S$`Jo7vCCtuIrRa^p=HCZ~B2lOpQ{b6@++3Ld-Ex}z!?hJ9+`u{(J1eYq=9|xW>>4_V|13&3{#I;c=QO0PnmixTi4Y*+fq7i zxV76}&7cGMO;gYk>^yx*tR5GVmZfgdP0XX0)i2&C=F7_u3kfYyV4_MDOYF@_Kc5J> z;x-KP;}n84gTB2vDCcvI;pu`cO*)D&9=`5S+i231Xp`M9D3$3R)6m~xMjVclj5mRkYLrUzV#aMSow*G1Rpr$L?$KT+F5PXmZZJ;++1xIwo;WFb1H{p@w6O4{LWg@ zup1Vt$*&0JMRl|!RNIP5X=lS3-^?mS>pD1xl{C7fUcupF9G024D$IifhgffmU)YyN zl49Xv$8CBiZdS#ZfvM*>2xe>ZR!D~=SFJ>VKeA*+raHCYs^{iK10e*k6WF=TVsbr4 z6l)g)k{qZ~+1V`wi}@&1;2|`XHDv*(jg9P1CJ47nMyxyL>ezAhfwrbDqAS97^`o34 zpML%~;+0Qsb^JuLP-17jf(pwy86b?kt4D~j>v85fZVFtHz4jJ4^aAscMl)J)Qwhsx z0jBnyx{7wCUW10!(hE9EBqJuxOm#Y~lg(bdoB9|n2g4u-#3w~-dNus@v;Ku43_-qJqZYHlk@d!KPE)h*V>a1mQvE4lDAzqZco5rlZIOc|2WPen~J%XFd zXws*l%M>pNXJ;Bz+#h*&yL&&e1u*gF~XOb|L(wT4PTR(Y{9p+-!QPd)FFuU%EdbgkKB z4wgvdvC+|6L``LubV%TeOY`HaJdzI^f0+o>N?mM)TWiP%Z`%mdv8`sZ+t59wb^-8n z?2uf&n|~RP;3i+FyGih$Tn@qx+LKGAjc%zb#(i4O%(L6@7i67^PXWknq-&LY=k#ib zRhgs$m(;@Q+$Q))Wx^9hykScE#szmfns(#e8z3gJ=%PB z#po@JF`OTPyLn{j^H6n6_~`4az1}R1YiTl9-{~kzZ|y>EX;2$r3Hm3B1F>cmj%Wmf zc%yb}>iI}Cd0#w98yewb351A{R!~30Y#QsAxqj92>Vz@NOm=Tksl|4EIr9tHp~`bl zx^PR=V%KGC-e_>x_=A>~Z#!2a=46!P*s4`dTuH^+%q&NPn5TkoQy&dO+Dr42&P}f* zgLzukz7@C)h8(y#ZpwGm4anu7$GPzYwOO7&I|csxB|Wy*ML!IOWned3HrZT{WX&r_ zq{Sxd$H@_Job?Rl7Rv=k5z42XA&WG8?pl$!U(>|nn!4%AGKaNc6*qlVLhf>c;2h;k zsA)7#!f*H;{oBme0vq&}P|ur$uwxzvDS z;vgpj9h%D3MS8T1XfZD+DdmhJ&v@x6PGVlNBrF42$)Al#qge^Xev8PfmlbBzBa)%& z09xR)%e5;5XTwP=Tf0)m67_|nQ*Y#?joN-@}yS#FL_N2E9uTfq|EZmHcejCd+7ow zXVhqF3Ggs|PQ^ae1HnCO1 zYUwiG>loAUVr|(|2NHpF2(i7)%7S&<5|l^zDxvEi>Lx2o@I|q4xHx)C50kr0BJD%U z0}Rxn-Q&?bKK0eAA9ln4VjTea5ZtCahfC5XJn>7wu_KFBTRK;pFnKYe+;Ekcz{)K$ zqg1Z}z~1OZ^{052_7uDE{u3x7oy#{dfWs?8g{R|Mn?Wu;zXFbIVijOnE-;*D@*{Im z8raS(x)`9%!}d|>nJ}VF`83F|=w()ewQ{eFTQ%_yMhN8pmt7$CpeQ&79+)-ZJVS-! z+Cl5i0iBCwGj7WWKQbr0G0WYsQlCcI)T<-Dxq*o6jMEcizrt+OkMOiDr^tkMGQ+LIv-svVc+CU=1pPXY#CE%f=|| zEU#auZI<zQXt%_HG^9Ds z53y-8P6{zoK1qgz(2zQx5P(-wLE-ab9$gr{RO;-f;m>emLO z-1YL*&Bh$pY!h}H7r|Z2G+W>XXb_suo<)gE98)!1EXN}eP;49`EB}e zdR*2$mFr`HTLl^T(;WNd)z|_2e*ls$R96xY4P6u;KlwRH676}JN(V|~TLZ+uJPp7& zY&j{SF?r9gLp&n}v>~Cb7{e9{lU9aDwySu|jSSyk!g3aGVsQXtY|D_%Tslvbg`rb< z)-48>u>@Eaa-DMtIIX?wTL9Q8pl2k51`VbvVaCIpQCP|gW&Pl6j9LrWq7^q7x^khz zbR~FVhJE;zG>{{+DvrdH745{WcrzQ>I%>b&@KnZ1>>+DB`6zfiyj)AzMTPaz+KzEb zytnilf&wC?sG51y8n6fz?gkr^F&p7T) z=C@Rw7+y?P=o$~KPJ1WQVJt{;>*+Svp$%#c0*Rvv!Z?3`J` zmBOdA9*V9N(tv%%+0HyblpJI$C3-hY*`eEzaZow>YMlbUr;j=9s(r6z$Wl$!DTLex z&Qe0wg9xOU6wj}NP=t=cO3^K%bJ}jMoJHhn`~2|nLj8!ADbgS}a+3x6*swuMf%S-m zazUK_07d9J>on-+iYP&0dp|?jHn!f?3geXz)wq<2hB}8)U<^kcc8n8lum>6|L{c92 zWx_MmOe!0P#`q@%698o!sNj~S>cm%~D^X5&Q!WVjdr2_uHMu43Q3*5rI4|3WNiSPd4r@W1Fj9i~( zo^ucIhPD#ieG{YHn2<}I--oaH&8v(1vJ7A?ym%s)yBrsFjbZjA1j!JTjwO-q<`7sZ z79H?JE`Oqm=MgiCgr9+_jjPf-k_IUnSaJTis!bPcPHRxI?rblJgzOblK65YZ9V_Hg zP^vWhFJ_39-+gdXPjrK$5%B(KZD@x?x;=5SVq4QrzZ~2^mA(3jVP{1{1E@QAbd856 z%&Hd+#%LZkWtqGy#X>r9Zp*cgE1nmvi8!#H=2I+0ZC+&ZRiT9)&evSOsynb+%ZTtc ziaTh_H)*=a*$U=CN+;^TJ>s5X34@WsxKOJXT@gf)tg>t8zPT23g=6k-UR(_2s4uA` zMz-H`M~IJUiJXLcJ-NEC`<3j%o{UVf5dGD(yP~vInySmJu$;Qsq>a?%cEP zG;y8FX(qQPK`z>CaKUB^MXF}wA@55hx~YOeq(Kokv)31^2bH&$8#^29^wQDG6Gq>d z99E?iLV#IBk_vF7ox9FDoF2++IzSUt`IlGGa1GjOZq3dkQOcY*=y9kA1D<;6OXe*>G3stTI7tiRdt$ zp=efG?TjQzx&RKPTb^z) z$?3B>;AXh97k_zt>7{b6)w-Tl5;~QHc~{C*gF0??=*D-u=4agRR}D4B%8B3AW#7Pp z_m#+V1KNuJYvHA*WEZXRg1JQPd|s!fL2P!%7J~&T~F>}-YrYvEb2k*tk@LY;Udi+Yzle)~EOX@kcdRNGIqsYIW@RkSy z77WXmF;*ZL8=h;j2tV{@SQ_`hn@lj*7Rzt^<`*+9^QQeaOOz0GCQ92EHD=1J)snJQ zpw4waFa_b^5R5p; z;6*dUK3UB)P}R;;i9p@jed8uy${rWrU*lSpB9o;(;tykM#Tl{hquLJ@<0(Md*Ti;l z%#nk8s~4WhZBeAw##hd96tP+$;cJpSplz~h6i2BaRKH#TE>hQ77OPHLa}W2ck^o`> zLshmss2pI)DpRi|4E?0GK@!nmd37{q%EXYI1*h829G#MNTT?LeKEPiiRh*JkO8}fM z;lFlpr)d+!nh-F}<=O9~IZ$^XR+?}Io$9-+SkrOrf($J~i$JV0e^>%Y<2H%9O=pRz(EvE8UBQ?zHT9q{x3B)bzx zo0v*v$0MjZafEpx%^}CobFQtYY8I4RiKg5|52PPn#nkpam zo2nv$YWRjbSYtFX_@&nPK*R2x&vba;eXN;Ykhk3$q>K93J7d0TV#q5BLFQ*{f!##GUA|1lE7u zXgp8n7o~XCrm5AT;Q)Q*7&D}>XS~}#8op4gx6Xwg^H59F9oaE>j)Y=1CK(V(M~Xb< zIh%q`>PbgcZkG#$ZfqIL`S(6~7+K^V5(eT^iPoz^0ou1#?o7*y+uO1xa2F>wmBtI^?ptTcMmoz7Sxld!1V2W!P3m3L zA1av2)Gb4a(nQUBt3icuyU=`22h4*u5s!F6;~>RnW5|kD;0E7+ zUefe((jr;Gt=C$}J!{@*5ZHSOM{F80SD*2F&fGACflvRn?BcX`Q%ayXh|M-}UrN$* zkbbrH$@^GpgZm)?!_mlzlZ)L%SPq{Q zn>8E)`449g#l@RRhfw zH*I-;J0=%S^^tTbxyc5h#>ohD#141YyoAuvnYVU3QT(KurRmPT|)gdinvaAaTs zkUg2j`a;I>O*lAE8VrK8&55KS0LwVW;vhd=MgtSmy$D5J(Zu~!#g)oy3&0SF3>}4rOpCEwKMstH3F1=sxh}CFEd5*=y=6h~Xl-AV#xGYu#Gx zU6d(la?p8TfS@K`vIbcPP#^W%^f7CY2RtEi)>6lhjNc__$<_zfKYPkD_?vCqZZ>Pd z-gyw=`I8a3)uUME3n)BGDEEp@pqKe+^v6zWvPC3}^r@9!QI}3zWP+~~YjLzlpXjnp7+>@2}RO}B2agq9W_A$AUuOrZ%hx|L^X zum@c0nYoATSp}w&$a+&@$M7B7tsbLws1w^%Uj+G=r_lOaY{sM7GUg}>eK`$ONw#1b znxdfcvM)g4Ft6I};0RS#DSjUFLksCdJ;7WLk`>4@lc%VS~(oR=1bEo0^?p{Cvn$76Pe@)9xFU;p=sbbSgahxf|{MuJpvuBYs4>5Q8nVGvQ;ZnSbkVP2$ zBF(vaGp&7zp1(mCO#m8$s@;%eFMBy}HMZEAZfh!RKd1)`J{h>&)Oy#Zcvqu#$_Q*p zYL=D>w2l8N!@d0=h!=;zo3LtlSiexP^_Vu^+OdA6414;2KFI^l49=SP)r~DVa42;) zh?2GkU|(!9PxXQ7|4@U^U?P~JBoW@yS_+MkLM7s7N!@=g8U+KJFej1fWMi^p_dU$J z{!OzZRw8ib&Da&~J?t{cRoh42tL?AXWxLh=yc*8ESOqaeMB3Q&ABW3Ex&UxfNHtu1 z%u$Cy#&dz9C7cbF6o6P)R!P~NEQMl#Adc>V3#+J zoNSV8WANJT`s;pe-|CR~+s<5V!8 zarCclM28`&Y|9lNIfJ|oZ6-h!E+WCWFTUDdopA}*;Sj`dR(B;WXZyQH1!Sj-Cg7S) zh8`wcnqG5>4~UB*aW&4(p-bpP#B~iLzntrfaur~EC#*W-#E!C#u&;nKESj{-Fu$mR z*uzlA4P|F&{9Mu;!Nt5h1;=gWZnR;6dGK$GkP2Y8fZlX~xm_etapNyt=8dm=v`5ys z5W~nP1vYEo$1|dtZ@k}mAxhx5PY#W)3N|hf2XY5c6|gd^!)eoG*wO^gtVf-Z*_KOk$ld46q=VrYtgS+s|~# zz%4(LImRi_wpGyPp&O#MiIf$UVql#D55e>YLTILoDFPAO>HlqK-{s*wx>Tmwr?{c zov9NBW6grn%haALD*y*qgE7V6u=PZ5Qr?S1;UJ19n`-C2bkjTe*meC0%~r=YF-d3Z zAvV|aJ2}`ElYBvC6QqwrjtpiYp$@0A@skQCWYmbNb(KktJLt-%!BC_LL!6%(A9jOc z=nXQhDRueuqt%H6Mw*J8yy?|#*bPA&;+r5DS!N<+?f8F;-BWNN0oN|-*tVTa zY?~9?wr$(C?M!Uj=ESz`iFWdR|K9uJRGo9W`l@x+)!nt$>i2OdSdKSkg3_m*XxyS3 zmfAYfvoJm^67{p=z3AV+b(zqd(pNrRufowZ{JV02LO%PBvw8VTuMC0(8y&NJ#!2^z!8#h`=26}*E9 z@MjK-3zoGNx&Y|pqcqT~KAPbtk#%f32qzCzm?)rLyi)Xz#z;XSZeUsy&m9n|2~vlq zM@6OaTpasQ!Z9AR!G{eQMj`^uT|`EpfL+l%CiV2{DozTKOolaZq%mP2Y217)Aa)vq z9-1GC#<`^^p6q>J&6c7bJ5))h8)m^$kCnaVzywpmWqTkQ!V6mrh1dB|oK%>!p5rb9R&q`^9(n6l)O20fC+#>R@| zc~<0nd;uzRGj$(*HGldH@KPOEhj2l_H9hj(2111QBX|J*)G7+|`lp&hJyV%mlRYYk zo8=Z0QDlxVNj3ciI8CW!)^@B2r^dM#A`OJ*=O5W*O|u4@X~xA&V1Y(XPb#6}uOI^9 zF8F{e`MvaaoXfl}vofuiSyy>eAIK$Go(lXA2CfSZ$wjHs(Ah*0LhlqeD}6UqD=~`; zF0)*-W4dtIo87dX zqmmV+pG1Z}`sgC=S!R;w$(u5;X2Ik?nm!=hNO4YxJ9F%Et`vfx@F|$;tgS+lUqc!) z6UpXyUX#IZ)pm{Zc}=M1gX2=!sNGH6VgU1_>MSZy<-Y07=3Y7ECYNK=b~ z^r?(ggWIdce^_<%5;Yph#gxIW*TV{EScYTSVgj=GDO)YbN@b+&D5`NrATx998ORD> znAJ(Y;$`7#P#hiHBG#jDZpMZMLa`UZpaU`QD>dU2_+HplU=l@5aXKySCkIVZB|{uq zvoVmDRTN|-gop5zVdIcW6Wu}5`8|LUvbji?wvQ~(u*rRrMxJJR0W<749Is+gn+6vN$tg2g9D_IPk&25EhHBXe8Q4Zrj)U4X z#oO2+zmu}=POi8?OP{XxEaWfA6c%akehAb39ZTGiN6J`bU5~o>f=0G$Nq@A~4KRBs zVZ21kuF4t-T5`_~ZeU3_AMT873~t38)enT^0^T&H-~mQQw!4Gy=4o^7=-HAAw$On| z^V=_U>i4wQltKcO#|O726JfibN#-e{I5Z>Vtriw8X$<}t!cJ9r3#TM=Br%a*QRJT~F{%`p&iTmJp(1@l z3}eksMO6b)c*Qk8cCwrq!yi zLp{glJ}M0Gu~sdWb|?m_!ZE>R>}BNA;$>(L9?)9#E1?K$xLGyYTChHQv614o`e4A= zXsm7mGg=1}@EsU1LCZ|^4mgQN5l%GmDFoKy(H%*z5IfX%VV6gc;>o_`&zj*!wr;XwD{b$k59Guur z2l|mR^Y!!_beoN!4?gS~E4w@SHzU#x+`%L#WESJO!x4UjUjikY}1aTaJ&E_xPJ z!!XwK8Hp)t3QU~p^fHbJ12EEN+i9YqYAhdmk-#V=(<#`Qc0}Ckij<8TH{(S`{@yGw zl2PRu^!F{I*zpS+TQY5WXQIyWv5QGaOqsWr;yl%n!0Ep`_h{?>2xu~EXWW~J7P?hI zGMI%ZlFGS6`5V6BR!@S}w(Yo9#R=IdrxAzV^@{*j$8woBO;&t5X-LVER^PD#$DpgE5^{OtX1MDypw2185;&^zH26VajAoW#Q-u+YI3JrS#4@=(fEB1?`XBpf-2vD4X^WS z!6#uMF^fOam{mOZRPb^=KuKfxR&WhTDQN=_UZiu|VDmJkV?|86NDxrkK(%R;*50n? zK5-u>yMas&Ez)o>(qcD0nJtIa3dtILdG<*^ScCPhKuOA})D`7i#+6oCF{&<8MlCE- z)Q?TOLoD&~JN89e%yIZTZh)rM{zkFHXz^kfZ4e3&xj#=(|+)}>=pq@DW2NK*!s z!3uD=SU`hN)50#dHQ2y%0V$6oPGcarb;~izQ;K7r7Bsx^#KaU!VGh=(2c^I+q&~84 z;d+Po9HzU`*CT>D<5qk#J0ZHzqL-DuyTF+8nS!X$iC+*R*v5|l%P(oKQ68au2q~yO z!OA%p^e=raYoynf22z9Lp0{87gdP9QLd0rQQKTC2wrVgno~PObbM)1XK`{>M>hbe@ ztrnvHo(0k^s7e8uW|%Jf3bQ;;-i*-(vJ^Tnntg}9yYKM;_WB=@vR|h`c+c4>^>^ba ztV)Piy&zAW{6?|+e`=GwFjJe%V9$aST0nZM3x_;#>)*qipD)1nqJ7lttefk!Ok}1j zbWXf!({N&W?Pi_nzJt94OEaq6{6uT781Nj$7L%{*NGK9L19$wpOChPVGMLy$mMOBT zIjqOW)~ENWvXsylU7$0Q^?+&F5}@i+-cYE?vP~b{Sq0no1@hG>(Db*#CUFl~NaiKE z22V^H|6GED=gD>U6a5QMr>aQz_t1fZI*ZS`Am|Xt$Vsc{_=sVz3|6j>2ZVs$NUkr+ zz`MdBtP%wf2nX4G#a1rFCcHMR8Yt$leZFAkMr%|Nf2m|LA;gh4X46hqUY!|QDn+pO z!YOg?2$w>Dy+`ELBo_H@Ix16{F||m-!5Ntr^th6h{fZZjoCHWqn9Yr8EcZzC0%Fl*E`cg&gjW!v5%3FL}%q@JwZ{4(ne?os4GH}l~@%MA6}glKj5&LQBRwO z(O2ZKj7jwFS6EQLFuT*ZD!|-+a$w;ZL>L)9NSG5{!iy{c?ly?U4W3RYQ3hzT!jZMMfO->A-f!Jl*-4uD@TkYK%F4&YGiVfMVtT$0TU)wuL%UPM z54#_C#SpDZzXZHmaIZJ^px7|mxK)a$cf0WrP@JQznRhBz2wW^e4IE;_HedrAQZDva zL|B*$Qa8)Wu#rldq1aooD=lsIZ&+m2vGGQPRfFD`ghx$+;m(TyZhm zmyLQk79vYz%#k@zJTUm%dk}1=o(29lKODdYG(!+0j2&b-&M!=qSSPQIKQfCgb~6JV ze*xNXJ2u(p>~QZuYyD7slnkxU93<2CSE3Q+BlWlGTfAhenlNiMaKh!QnxQ*TV7!9W}5I7NiBA3KlRM z>4C-55^4pfz%3^WozyQ}A)0r_4JeWT60C%qUtly1R_+6uu;zEmjWlcubR7%0d&fEIAxp~6;- z%?PRQ&0r-7yd#nJ+WDBeh!yb0ivpI3q_E>)P@LK5(ug#Z+?@Hh1OivdqC-N?>1guT zoYxd2Pjcd8dEI1RPGclbagzqkRjZXG=Yoz}di+eq86{D%4qB3XYTwOg*x_tch6Ob} z1NO>U!eRZD*b>X_Xfeca34oDe>uO485Q! zfzJ1F5^9=-Dqyg(SPlmQ_sO`dH&%!<2IUUkw#xF9Oxo3!d|FcZTC%a>%MdFhSIuwf z(`%co`F>F=7kevFtL{gQ6-G#GtsS__dcARhgv{|S84)<591xsBhZINtz*#lFPYpuS z4XGKPo9m5O$T35_xuy>O923$nL3pLvdYDa(U{_lGGBWU#FUG_G7aU8XwqT8JoSrr#t+I-TN?r_6ZnIYX%ZVKWToWS_Vzf*(euR-LTLssA+_xqv7pG3Judg_Q zlPyUa$e@*sgaTE?7&s|S#08X`LxLQ5XGWVLjL@I3^cyxcs#J)irw>l;I*FcdQeu{X zz+HHd+=2WiD=5GLIzcX)-qR+W`7cU@l^tDXK3D8R!c-YBuC&P~*1~}k{z<3Ak_aq% z^ZbAZzT_!cp!Xmb3__RR2v)WQPE(Ni_*|ku^;BoBCDtxAG`SMaoX{;4V-*cwV7mI? znhX4u{Yd(?6D4P59e>({OYW_ler@j>{BnXmq0c5rwtOh=#3M-48Mvcrvr-m~eijQ- zS-sYV$V8gX!&_m4pdDL}t$;bFRjk-AO%_a>2s5DA@$!=a3L6a7A|^{}&BFRyZ!|BW z%SZz(DL7gJEN38Gx#{+SjOU4V2iEslX`5$qkXJM-4xS_gi$W#;?qjzOU#)gl@iCK0 zz%+LYWm!{oh8ZSPK;;@!J8KJwuUu@eKE5geMw(!YwyiIgk^B^BG2{yFPiL?HMb*tm zJDL&cLJ4MKkGj(bh^&o?@oRY01as8Y#R?FRxY_C;ha?749a|B*-_zHyb}|F7%zDxw zC13NwixPoLBcshD<0(_4zBOLgUP&QZKp`opHva)3ofzuM(?HM8<5#|8hLy2FTd5oH z?^0IXOL)JkkP~^Mm6VGmVG2Xh;yX%fSS!hLF!tP~HjQ-m7#Xq^DDgEZ)V0sB!t|+$ zW+xOBB8;iVrq%`%swIIe8~+FCB|5vzCQ&9aAZi4)ysQcHn8AAgg3H**l$`uEg9_=@ z;C8Ib(?504bLy!R@;K#{O=qsC8Iz+g%@V~@#Yo5#PlA=Xfxi)gM3=Q z%If!!Ye>6a1C~{7sk%QSR8Jlf_Lgm7eBA7BgK_xqbv!k4w)fvo(No$>m4q;pR1ZDI z_SUtNjc-4oy|+8nQN5|=_ObnXdIfZi&4=pG4ko9JE!z=K0TCIG^x7S&!R^M}f znw)-OeBE2G-#fSAS1W#ZZxullH1UzDVGlYeFE{lbTb{OU z-T5)uD!sjZjA9~IcibY+HB!|kWwC0!c-w$17h-GAzO0xDK@gj z%6BMjOVKOW(w>o8cg)F|=!JKtmbRkzZT@s1SA1(Pb1~WRRpNnehdf){r}wrL8Rbh| z>DKoHw$c~I$+ixDzGf*^a$E6v^4fOpY4U}~xQa6dJnX(0>{;p#IL0@!8@_T|k-Z9e zf~H$(_mD??`PJ`myWp1i+O@_W&G#~fbGCyc9bA;Xw#Nx>Td{MDMoN+mh-1y3z{oyLgM|+Z%837WBc}8C9uioAp8s zKKuhutij9=JQnxGFP#I~hi+R}kt0*|{qz##q@x{Q?!+mF1-SCQRlw_6RqF}wrB5*h zwz2tMTG^ei+mU4Fo3KyaFput8Q{BC0ye-L*x9-L3y^1b)I{v> z*q=UMAw2KBIS=BAbMW-ql@^SForr- zGk$Y(l{d(4Q$lIs+oIq zpj+VLT-~|P&c9H&hb`>( zK2y=?wKgid@?*wAxAlr*K{>vkg$S9B zZkSJ(*<+GV_pfN@$`f6(+t@wxPHNe+dB5Neg~ILLzRLElC8`$D*Mz$78W_HHKbN+w zF4*M5SlsM-*OR{Z<_hdrEPb{$FYy3RJJu&J2-|g_sEgbR`gnG*M<9_;_Lb>?92?!k z2RAKa4}0HfsYFuf!PC$!eqgQ3!~MUzuK9QG(qlmPk{Hc45eJQdEAN^W>5oJ+!y6ZD z*Om7>Rg7zEDmu8k*tInC8vw`(0{iRu*&dzfVe@y{2;a`(ZMY@Rl*{q9NQ^aQ4%&$z z-d{r;O8?#jJ6A8}MsSYneEJ@6o*VRDoQ% z4tiRBP9)o@lFh$77XQnFP`*h|K6$lO`=)ntcUWIxv9<+T{k9NC?d&ky#qxlfq?f}QW!H(Qf9SyY27C>ny4!1?{ z2rb-}I)HoQedi-Ayq>Ks$hYnIdSQW^)r5m^2sPXucExx=h1qF=(R+a-?a3bX0rWnI z=;0<{f0#hwuZfz)h49`a?cHL;c<->iaeH|Iy4%OTBYyF7>?G6C8 zcZP$739CsL`i>>LF~;I&Q@u;o20Iy7z&rRdBl_5{W(UpVgZ0q~G(Nz(^Ch~Yy6Sf< zg=Zpd5%#%Bo7{0A#scx(0LQyMDE-&d_g?c}uDPc3T#whVoolSERYK2uL_6_xpiY41e&M-4LHWCi4@tURCt`00sUk)_3hPl;R=RcJ}re9_*o~ zI+pzXgg(_Jeu&O?;{~F;2gXGkfaXHy4LYKhIPImi)?+>Q zKItMs6ZG?zKsyAvPRAO2;)E1%3rnz9h^67 zdEcuBq7&Ksj{=-ByRKB%z|M>L)}bA;t}8ot+c8Ttq1fwfTKL0K(p}E)hs(y&{gSGm zPGvZHEXIeXw*Psd%Zx9^2btYEH`NyKS!`R4arHX!rV zD%yy!8Z>qBiF2cK@sJ3~mFZPQnozn7@r*%X$8$JzVFrEELz^2=1(TP3JA z8N-t9Jv}K$fe43-cT3P}_a88Jw#FWKsBTubMI%insY3V71J--Cp0Iw5V>Qn1iV{!u z>eq&+FX1a68@@T6wl4d!+5saJ_eTocIjvPg=UsP#NwI}t%UFE2-gF29l1lcg_ag3V zx*E+j786_Q&9=~6ye%j-Xye*3{UZ6xx(bKJ`Ab|GoqurNvWS+UrgI)&Dp+>$E5Giy zUK@RN_TRQRTNTE91orNYPjVBHyh8h~C0|vkw)ql1ZojZkb1}b~Z{Wo*6fbKtmzEQ- zW{13Qoj!J9oTfw7YkuHnQ3I_qq0R?(So$obpX^Tm@b}IkkG&=_JE* zLJVqmkD{3`r{p_NUQ1T?4{0B7w_Ip3X(n81*-c4#)hj+@9Z7@k<0IXf(Ep`7#ErCP zjfBE#-E}$|wlIL3`*4eD`S!$s^Df`&r8;w~ruXUgM!iro9YCiE?9Vs|^%&svJ-2mL zQU5zve@q3Hxl!~-eplOZO8z>(E5eR^`@I}X368JCA-ho%QJJ;q@zBply0(8!HI{#i z`#T4QoPz&`4WcdZ#`XmlY7_q-E1uiX{_f1n$jbzjwyx&C(CqIUiKSR4v!wzs=G@q+ zMqwru`=W~c?0)HE%h|nUQB>u6bx=36;+Pe^$p%~8ht{bBBNKh}<97V(`FY(shic{X z4R>azpkW=>H%k%>-)|gT@AU)o#tZF^8{C){6yrBN>-`-tq|bn;xAA8HGClJprP+q# z!{asEjjlV_c`;=SSJW_9Q|8LPmFN2%Vz8?<$-|Pc&Z+OBoKJrdPvSpeo^xsM$(P-y zjBWb3mobp7?W!AK&ux&c!uxza~TYk95*PAuOt@L;KY47h#GSIe!7rlZDrF*~k~dlx3X%N!B#Y3#qw-q+RM-fTiL;Z^0+=tW}}SbwTs#M z4OlI48(wPKtqJ&uJ+tyq-RR9mc;C^U{rkmu{*~DoG~DhTR}#*P_ko!{D%|d^+~C@Us?-lQ z#DI{LgVPu9{d`D)thlw}#g4m259s zcXrq6fcKi9DxFQI7s8DAz}@3bN_k)02t^3 z{l7rzr7XOwf9yeoj@*ImAD?0LUPBZ|bv zb2`30NGU|=B$O8$I&9n9m57*_h#0>YqIqw%kloIYYg=2}>&|@4rH)>WirgP49rfSs z(dXB??>6#(pmfTBeZH+~{7>$0DE)et6gkB2;T{}w3`CcakXh`RSB^RXvdt)9!|570 z#zb%?T@S0s6CVO)DoC3#9%Iz$Gmj|!Mv^S`XhJl}Ztr+q7XsxSVHX9dNDt*jzn=m{ zOaSvn5vFvO0F)vix1KKe&|ThDi}y1)5kx+rz}(NOZ!g4^k(!^cNILEVQSck>>1mqqpyWZ|Mk`r?4pFF~pcK&&X+1lVD8iK@DgE!zq$!rv2}*x3X_z6B_R2lEfCy

{sE!Bm`-$hHw%Hh76Y@BpH1L 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�hW0TogjOCCkfq&N^=Y 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

WrRBe2wcq6 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 rxw7xeVrif);`?A>aQ1vATT) literal 0 HcmV?d00001 diff --git a/gradle/gradle_scripts/jSystemThemeDetector-3.8.jar b/gradle/gradle_scripts/jSystemThemeDetector-3.8.jar new file mode 100644 index 0000000000000000000000000000000000000000..a8ac11f541cad5328137b0429891bcc7666519fa GIT binary patch literal 17691 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 Ld<{2zfBgD?7fJnA literal 0 HcmV?d00001 diff --git a/gradle/gradle_scripts/versioncompare.gradle b/gradle/gradle_scripts/versioncompare.gradle new file mode 100644 index 00000000..b8a249e7 --- /dev/null +++ b/gradle/gradle_scripts/versioncompare.gradle @@ -0,0 +1,19 @@ +dependencies { + implementation files("$buildDir/generated-modules/versioncompare-1.5.0.jar") +} + +addDependenciesModuleInfo { + overwriteExistingFiles = true + jdepsExtraArgs = ['-q'] + outputDirectory = file("$buildDir/generated-modules") + modules { + module { + artifact "io.github.g00fy2:versioncompare:1.5.0" + moduleInfoSource = ''' + module versioncompare { + exports io.github.g00fy2.versioncompare; + } + ''' + } + } +} diff --git a/version b/version index 0e97bf48..afaf360d 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.5.41 \ No newline at end of file +1.0.0 \ No newline at end of file