From 45f6545fc863df1fef5a2e175436ce2910e5c478 Mon Sep 17 00:00:00 2001 From: crschnick Date: Thu, 16 Jan 2025 07:29:55 +0000 Subject: [PATCH] Squash merge branch 14-release into master --- LICENSE.md | 3 +- README.md | 3 + app/build.gradle | 16 +- app/src/main/java/io/xpipe/app/Main.java | 2 +- .../app/beacon/BeaconRequestHandler.java | 12 +- .../app/beacon/impl/AskpassExchangeImpl.java | 20 +- .../beacon/impl/CategoryAddExchangeImpl.java | 34 + .../impl/ConnectionAddExchangeImpl.java | 27 + .../impl/ConnectionBrowseExchangeImpl.java | 5 + .../impl/ConnectionInfoExchangeImpl.java | 17 +- .../impl/ConnectionQueryExchangeImpl.java | 5 + .../impl/ConnectionRefreshExchangeImpl.java | 5 + .../impl/ConnectionRemoveExchangeImpl.java | 5 + .../impl/ConnectionTerminalExchangeImpl.java | 5 + .../impl/ConnectionToggleExchangeImpl.java | 5 + .../beacon/impl/DaemonOpenExchangeImpl.java | 32 +- .../app/beacon/impl/FsScriptExchangeImpl.java | 7 +- .../BrowserFileChooserSessionComp.java | 11 +- .../app/browser/BrowserFullSessionModel.java | 22 +- .../xpipe/app/browser/BrowserSessionTab.java | 7 +- .../app/browser/BrowserSessionTabsComp.java | 25 +- .../app/browser/BrowserStoreSessionTab.java | 12 +- .../app/browser/file/BrowserFileListComp.java | 19 +- .../browser/file/BrowserFileSystemCache.java | 37 +- .../browser/file/BrowserFileSystemHelper.java | 5 +- .../file/BrowserFileSystemSavedState.java | 4 +- .../file/BrowserFileSystemTabComp.java | 3 +- .../file/BrowserFileSystemTabModel.java | 38 +- .../file/BrowserFileTransferOperation.java | 81 +- .../browser/file/BrowserHistoryTabComp.java | 38 +- .../browser/file/BrowserHistoryTabModel.java | 11 +- .../app/browser/file/BrowserNavBarComp.java | 8 +- .../app/browser/file/BrowserOverviewComp.java | 6 +- .../file/BrowserQuickAccessContextMenu.java | 5 +- .../browser/file/BrowserStatusBarComp.java | 35 +- .../file/BrowserTerminalDockTabModel.java | 8 +- .../app/browser/file/BrowserTransferComp.java | 4 + .../browser/file/BrowserTransferModel.java | 11 +- app/src/main/java/io/xpipe/app/comp/Comp.java | 12 + .../io/xpipe/app/comp/base/AppLayoutComp.java | 35 +- .../comp/base/AppMainWindowContentComp.java | 122 ++ .../io/xpipe/app/comp/base/ButtonComp.java | 46 +- .../xpipe/app/comp/base/ChoicePaneComp.java | 8 +- .../app/comp/base/ComboTextFieldComp.java | 7 + .../ContextualFileReferenceChoiceComp.java | 38 +- .../base/ContextualFileReferenceSync.java | 34 + .../io/xpipe/app/comp/base/DialogComp.java | 2 +- .../xpipe/app/comp/base/ErrorOverlayComp.java | 63 - .../io/xpipe/app/comp/base/FontIconComp.java | 1 - .../xpipe/app/comp/base/InputGroupComp.java | 35 + .../io/xpipe/app/comp/base/IntroComp.java | 84 ++ .../io/xpipe/app/comp/base/IntroListComp.java | 38 + .../io/xpipe/app/comp/base/LabelComp.java | 17 +- .../xpipe/app/comp/base/ListBoxViewComp.java | 16 +- .../xpipe/app/comp/base/ListSelectorComp.java | 33 +- .../app/comp/base/LoadingOverlayComp.java | 10 +- .../io/xpipe/app/comp/base/MarkdownComp.java | 31 +- .../app/comp/base/MarkdownEditorComp.java | 2 +- .../io/xpipe/app/comp/base/ModalButton.java | 74 + .../io/xpipe/app/comp/base/ModalOverlay.java | 78 + .../xpipe/app/comp/base/ModalOverlayComp.java | 315 +++- .../comp/base/ModalOverlayContentComp.java | 23 + .../app/comp/base/ModalOverlayStackComp.java | 55 + .../io/xpipe/app/comp/base/OptionsComp.java | 95 +- .../app/comp/base/PrettyImageHelper.java | 27 +- .../xpipe/app/comp/base/SecretFieldComp.java | 1 + .../xpipe/app/comp/base/SideMenuBarComp.java | 4 +- .../app/comp/base/SimpleTitledPaneComp.java | 10 +- .../xpipe/app/comp/base/TileButtonComp.java | 38 +- .../xpipe/app/comp/base/ToggleSwitchComp.java | 11 +- .../app/comp/store/DenseStoreEntryComp.java | 23 +- .../comp/store/StandardStoreEntryComp.java | 18 +- .../app/comp/store/StoreCategoryComp.java | 51 +- .../app/comp/store/StoreCategoryWrapper.java | 83 +- .../xpipe/app/comp/store/StoreChoiceComp.java | 14 +- .../app/comp/store/StoreCreationComp.java | 112 +- .../app/comp/store/StoreCreationMenu.java | 16 +- .../xpipe/app/comp/store/StoreEntryComp.java | 26 +- .../app/comp/store/StoreEntryListComp.java | 18 + .../store/StoreEntryListOverviewComp.java | 6 +- .../app/comp/store/StoreEntryWrapper.java | 90 +- .../app/comp/store/StoreIconChoiceComp.java | 2 +- .../app/comp/store/StoreIconChoiceDialog.java | 69 + .../comp/store/StoreIconChoiceDialogComp.java | 99 -- .../xpipe/app/comp/store/StoreIconComp.java | 2 +- .../comp/store/StoreIdentitiesIntroComp.java | 136 ++ .../xpipe/app/comp/store/StoreIntroComp.java | 10 +- .../store/StoreQuickAccessButtonComp.java | 4 +- .../app/comp/store/StoreSectionComp.java | 19 +- .../app/comp/store/StoreSectionMiniComp.java | 2 +- .../app/comp/store/StoreSidebarComp.java | 4 + .../xpipe/app/comp/store/StoreToggleComp.java | 6 +- .../xpipe/app/comp/store/StoreViewState.java | 47 +- app/src/main/java/io/xpipe/app/core/App.java | 48 - .../xpipe/app/core/AppActionLinkDetector.java | 19 +- .../java/io/xpipe/app/core/AppArguments.java | 114 ++ .../main/java/io/xpipe/app/core/AppCache.java | 4 +- .../xpipe/app/core/AppDesktopIntegration.java | 17 +- .../xpipe/app/core/AppExtensionManager.java | 8 +- .../main/java/io/xpipe/app/core/AppFont.java | 9 +- .../java/io/xpipe/app/core/AppGreetings.java | 121 -- .../io/xpipe/app/core/AppGreetingsDialog.java | 114 ++ .../main/java/io/xpipe/app/core/AppI18n.java | 119 +- .../LauncherCommand.java => AppInstance.java} | 110 +- .../io/xpipe/app/core/AppLayoutModel.java | 32 +- ...uncherInput.java => AppOpenArguments.java} | 33 +- .../java/io/xpipe/app/core/AppProperties.java | 50 +- .../main/java/io/xpipe/app/core/AppTheme.java | 42 +- .../io/xpipe/app/core/check/AppAvCheck.java | 62 +- .../app/core/check/AppCertutilCheck.java | 6 + .../app/core/check/AppFontLoadingCheck.java | 26 - .../io/xpipe/app/core/check/AppPtbCheck.java | 26 - .../xpipe/app/core/check/AppShellCheck.java | 133 +- .../xpipe/app/core/check/AppShellChecker.java | 109 ++ .../io/xpipe/app/core/check/PtbDialog.java | 34 + .../core/launcher/LauncherModeConverter.java | 13 - .../java/io/xpipe/app/core/mode/BaseMode.java | 137 +- .../java/io/xpipe/app/core/mode/GuiMode.java | 41 - .../io/xpipe/app/core/mode/OperationMode.java | 195 +-- .../io/xpipe/app/core/mode/PlatformMode.java | 64 +- .../io/xpipe/app/core/window/AppDialog.java | 128 ++ .../xpipe/app/core/window/AppMainWindow.java | 233 +-- .../app/core/window/AppWindowHelper.java | 29 +- .../xpipe/app/core/window/ModifiedStage.java | 17 +- .../io/xpipe/app/ext/ContainerStoreState.java | 36 + .../app/ext/DataStoreCreationCategory.java | 30 +- .../io/xpipe/app/ext/DataStoreProvider.java | 27 +- .../xpipe/app/ext/DataStoreUsageCategory.java | 6 +- .../java/io/xpipe/app/ext/LocalStore.java | 14 +- .../java/io/xpipe/app/ext/PrefsHandler.java | 4 +- .../xpipe/app/ext/ProcessControlProvider.java | 6 +- .../java/io/xpipe/app/ext/ShellSession.java | 10 +- .../java/io/xpipe/app/ext/UserBasedValue.java | 13 + .../java/io/xpipe/app/ext/UserScopeStore.java | 6 + .../io/xpipe/app/issue/ErrorDetailsComp.java | 2 +- .../java/io/xpipe/app/issue/ErrorEvent.java | 4 +- .../io/xpipe/app/issue/ErrorHandlerComp.java | 153 +- .../xpipe/app/issue/ErrorHandlerDialog.java | 67 + .../io/xpipe/app/issue/EventHandlerImpl.java | 9 + .../xpipe/app/issue/ExceptionConverter.java | 15 - .../io/xpipe/app/issue/GuiErrorHandler.java | 2 +- .../xpipe/app/issue/GuiErrorHandlerBase.java | 7 +- .../io/xpipe/app/issue/LogErrorHandler.java | 1 + .../xpipe/app/issue/SentryErrorHandler.java | 2 + .../xpipe/app/issue/TerminalErrorHandler.java | 44 +- .../io/xpipe/app/issue/UserReportComp.java | 8 +- .../java/io/xpipe/app/prefs/AppPrefs.java | 96 +- .../java/io/xpipe/app/prefs/AppPrefsComp.java | 6 +- .../xpipe/app/prefs/AppPrefsSidebarComp.java | 2 +- .../app/prefs/AppPrefsStorageHandler.java | 36 +- .../xpipe/app/prefs/AppearanceCategory.java | 7 +- .../io/xpipe/app/prefs/ClearCacheAlert.java | 24 - ...urAlert.java => CloseBehaviourDialog.java} | 46 +- .../xpipe/app/prefs/ConnectionsCategory.java | 14 +- .../io/xpipe/app/prefs/DeveloperCategory.java | 21 +- .../app/prefs/ExternalApplicationType.java | 10 +- .../xpipe/app/prefs/ExternalEditorType.java | 4 +- .../app/prefs/ExternalPasswordManager.java | 28 +- .../ExternalPasswordManagerTemplate.java | 32 + .../app/prefs/ExternalRdpClientType.java | 2 +- .../io/xpipe/app/prefs/HttpApiCategory.java | 9 + .../xpipe/app/prefs/LocalShellCategory.java | 21 - .../io/xpipe/app/prefs/LockChangeAlert.java | 55 - .../app/prefs/PasswordManagerCategory.java | 25 +- .../io/xpipe/app/prefs/SecurityCategory.java | 4 +- .../java/io/xpipe/app/prefs/SshCategory.java | 30 - .../io/xpipe/app/prefs/SupportedLocale.java | 2 +- .../java/io/xpipe/app/prefs/SyncCategory.java | 38 +- .../xpipe/app/prefs/TroubleshootCategory.java | 76 +- .../io/xpipe/app/prefs/UpdateCheckComp.java | 32 +- .../io/xpipe/app/prefs/VaultCategory.java | 52 +- .../app/prefs/WorkspaceCreationAlert.java | 75 - .../app/prefs/WorkspaceCreationDialog.java | 71 + .../xpipe/app/prefs/WorkspacesCategory.java | 3 +- .../app/storage/ContextualFileReference.java | 4 +- .../io/xpipe/app/storage/DataStorage.java | 162 ++- .../app/storage/DataStorageEncryption.java | 69 - .../io/xpipe/app/storage/DataStorageNode.java | 130 ++ .../xpipe/app/storage/DataStorageSecret.java | 157 ++ .../app/storage/DataStorageSyncHandler.java | 4 +- .../app/storage/DataStorageUserHandler.java | 26 + .../xpipe/app/storage/DataStoreCategory.java | 4 + .../io/xpipe/app/storage/DataStoreEntry.java | 102 +- .../xpipe/app/storage/DataStoreEntryRef.java | 29 +- .../app/storage/DataStoreEntryUserScope.java | 6 + .../io/xpipe/app/storage/DataStoreSecret.java | 89 -- .../app/storage/ImpersistentStorage.java | 11 +- .../io/xpipe/app/storage/StandardStorage.java | 60 +- .../io/xpipe/app/storage/StorageElement.java | 8 +- .../app/terminal/ExternalTerminalType.java | 74 +- .../xpipe/app/terminal/GnomeTerminalType.java | 15 - .../app/terminal/TerminalLaunchResult.java | 4 +- .../xpipe/app/terminal/TerminalLauncher.java | 6 +- .../app/terminal/TerminalLauncherManager.java | 13 +- .../app/terminal/TerminalOpenFormat.java | 2 +- .../io/xpipe/app/terminal/TerminalView.java | 6 +- .../app/terminal/TermiusTerminalType.java | 33 +- .../app/terminal/TrackableTerminalType.java | 2 +- .../xpipe/app/terminal/WarpTerminalType.java | 14 - .../xpipe/app/terminal/WaveTerminalType.java | 51 + .../app/terminal/WindowsTerminalType.java | 76 +- .../app/terminal/XShellTerminalType.java | 32 +- .../io/xpipe/app/update/AppDownloads.java | 59 +- .../io/xpipe/app/update/AppInstaller.java | 10 +- .../io/xpipe/app/update/GitHubUpdater.java | 30 +- .../io/xpipe/app/update/PortableUpdater.java | 31 +- .../app/update/UpdateAvailableAlert.java | 65 - .../app/update/UpdateAvailableDialog.java | 38 + .../app/update/UpdateChangelogAlert.java | 32 +- .../io/xpipe/app/update/UpdateHandler.java | 10 +- .../io/xpipe/app/update/UpdateNagDialog.java | 50 + .../app/update/XPipeDistributionType.java | 4 +- .../io/xpipe/app/util/AppJacksonModule.java | 149 +- .../java/io/xpipe/app/util/AskpassAlert.java | 23 +- .../java/io/xpipe/app/util/AsktextAlert.java | 9 - .../xpipe/app/util/BaseElevationHandler.java | 52 + .../io/xpipe/app/util/CommandSupport.java | 10 - .../io/xpipe/app/util/ContextMenuHelper.java | 8 +- .../app/util/DataStoreCategoryChoiceComp.java | 10 +- .../xpipe/app/util/DerivedObservableList.java | 2 +- .../io/xpipe/app/util/DesktopShortcuts.java | 19 +- .../io/xpipe/app/util/EncryptedValue.java | 137 ++ .../java/io/xpipe/app/util/EncryptionKey.java | 45 + .../io/xpipe/app/util/EncryptionToken.java | 108 ++ .../java/io/xpipe/app/util/FileReference.java | 11 +- .../java/io/xpipe/app/util/HttpHelper.java | 52 - .../java/io/xpipe/app/util/Hyperlinks.java | 1 + .../io/xpipe/app/util/JsonConfigHelper.java | 75 - .../java/io/xpipe/app/util/LabelGraphic.java | 16 + .../io/xpipe/app/util/LicensedFeature.java | 6 +- .../io/xpipe/app/util/MacOsPermissions.java | 36 +- .../io/xpipe/app/util/OptionsBuilder.java | 21 + .../java/io/xpipe/app/util/PasswdFile.java | 57 + .../app/util/PasswordLockSecretValue.java | 19 +- .../java/io/xpipe/app/util/PlatformInit.java | 103 ++ .../java/io/xpipe/app/util/PlatformState.java | 49 +- .../io/xpipe/app/util/PlatformThread.java | 12 + .../java/io/xpipe/app/util/RdpConfig.java | 4 +- .../java/io/xpipe/app/util/ScanAlert.java | 70 - .../java/io/xpipe/app/util/ScanDialog.java | 212 +-- .../io/xpipe/app/util/ScanDialogAction.java | 16 + .../io/xpipe/app/util/ScanDialogComp.java | 169 +++ .../java/io/xpipe/app/util/ScriptHelper.java | 33 +- .../java/io/xpipe/app/util/SecretManager.java | 4 +- .../io/xpipe/app/util/SecretQueryState.java | 8 +- .../app/util/SecretRetrievalStrategy.java | 30 +- .../util/SecretRetrievalStrategyHelper.java | 9 +- .../io/xpipe/app/util/ShellStoreFormat.java | 21 +- .../java/io/xpipe/app/util/ShellTemp.java | 7 + .../java/io/xpipe/app/util/ThreadHelper.java | 23 + .../java/io/xpipe/app/util/UnlockAlert.java | 35 - .../java/io/xpipe/app/util/Validator.java | 82 +- .../java/io/xpipe/app/util/Validators.java | 6 + .../xpipe/app/util/VaultKeySecretValue.java | 14 +- app/src/main/java/module-info.java | 2 + .../resources/img/graphics/Hips-122-dark.png | Bin 0 -> 7734 bytes .../app/resources/img/graphics/Hips-122.png | Bin 0 -> 4689 bytes .../resources/img/graphics/Hips-61-dark.png | Bin 0 -> 3533 bytes .../app/resources/img/graphics/Hips-61.png | Bin 0 -> 2159 bytes .../resources/img/graphics/Wave-144-dark.png | Bin 0 -> 8457 bytes .../app/resources/img/graphics/Wave-144.png | Bin 0 -> 4943 bytes .../resources/img/graphics/Wave-288-dark.png | Bin 0 -> 17217 bytes .../app/resources/img/graphics/Wave-288.png | Bin 0 -> 10413 bytes .../app/resources/img/graphics/Wave-dark.svg | 137 -- .../xpipe/app/resources/img/logo/loading.png | Bin 0 -> 7208 bytes .../app/resources/img/producthunt-color.png | Bin 764 -> 0 bytes .../img/system/adobe-lightroom-16.png | Bin 0 -> 392 bytes .../img/system/adobe-lightroom-24.png | Bin 0 -> 520 bytes .../img/system/adobe-lightroom-40.png | Bin 0 -> 752 bytes .../img/system/adoberoom-light-16-dark.png | Bin 0 -> 312 bytes .../img/system/adoberoom-light-24-dark.png | Bin 0 -> 411 bytes .../img/system/adoberoom-light-40-dark.png | Bin 0 -> 593 bytes .../resources/img/system/adventurelog-16.png | Bin 0 -> 839 bytes .../resources/img/system/adventurelog-24.png | Bin 0 -> 1260 bytes .../resources/img/system/adventurelog-40.png | Bin 0 -> 2120 bytes .../resources/img/system/amnezia-16-dark.png | Bin 0 -> 498 bytes .../app/resources/img/system/amnezia-16.png | Bin 0 -> 781 bytes .../resources/img/system/amnezia-24-dark.png | Bin 0 -> 742 bytes .../app/resources/img/system/amnezia-24.png | Bin 0 -> 1294 bytes .../resources/img/system/amnezia-40-dark.png | Bin 0 -> 1291 bytes .../app/resources/img/system/amnezia-40.png | Bin 0 -> 2321 bytes .../resources/img/system/atera-16-dark.png | Bin 0 -> 485 bytes .../app/resources/img/system/atera-16.png | Bin 0 -> 654 bytes .../resources/img/system/atera-24-dark.png | Bin 0 -> 702 bytes .../app/resources/img/system/atera-24.png | Bin 0 -> 1001 bytes .../resources/img/system/atera-40-dark.png | Bin 0 -> 1071 bytes .../app/resources/img/system/atera-40.png | Bin 0 -> 1604 bytes .../img/system/baby-buddy-16-dark.png | Bin 0 -> 448 bytes .../resources/img/system/baby-buddy-16.png | Bin 0 -> 611 bytes .../img/system/baby-buddy-24-dark.png | Bin 0 -> 668 bytes .../resources/img/system/baby-buddy-24.png | Bin 0 -> 906 bytes .../img/system/baby-buddy-40-dark.png | Bin 0 -> 1070 bytes .../resources/img/system/baby-buddy-40.png | Bin 0 -> 1692 bytes .../app/resources/img/system/bknd-16-dark.png | Bin 0 -> 372 bytes .../app/resources/img/system/bknd-16.png | Bin 0 -> 560 bytes .../app/resources/img/system/bknd-24-dark.png | Bin 0 -> 527 bytes .../app/resources/img/system/bknd-24.png | Bin 0 -> 788 bytes .../app/resources/img/system/bknd-40-dark.png | Bin 0 -> 823 bytes .../app/resources/img/system/bknd-40.png | Bin 0 -> 1272 bytes .../resources/img/system/blinko-16-dark.png | Bin 0 -> 504 bytes .../app/resources/img/system/blinko-16.png | Bin 0 -> 587 bytes .../resources/img/system/blinko-24-dark.png | Bin 0 -> 754 bytes .../app/resources/img/system/blinko-24.png | Bin 0 -> 886 bytes .../resources/img/system/blinko-40-dark.png | Bin 0 -> 1220 bytes .../app/resources/img/system/blinko-40.png | Bin 0 -> 1473 bytes .../img/system/checkmate-16-dark.png | Bin 0 -> 303 bytes .../app/resources/img/system/checkmate-16.png | Bin 0 -> 398 bytes .../img/system/checkmate-24-dark.png | Bin 0 -> 377 bytes .../app/resources/img/system/checkmate-24.png | Bin 0 -> 539 bytes .../img/system/checkmate-40-dark.png | Bin 0 -> 584 bytes .../app/resources/img/system/checkmate-40.png | Bin 0 -> 815 bytes .../resources/img/system/checkmk-16-dark.png | Bin 0 -> 368 bytes .../app/resources/img/system/checkmk-16.png | Bin 0 -> 531 bytes .../resources/img/system/checkmk-24-dark.png | Bin 0 -> 502 bytes .../app/resources/img/system/checkmk-24.png | Bin 0 -> 731 bytes .../resources/img/system/checkmk-40-dark.png | Bin 0 -> 726 bytes .../app/resources/img/system/checkmk-40.png | Bin 0 -> 1097 bytes .../app/resources/img/system/clamav-16.png | Bin 0 -> 897 bytes .../app/resources/img/system/clamav-24.png | Bin 0 -> 1530 bytes .../app/resources/img/system/clamav-40.png | Bin 0 -> 3038 bytes .../resources/img/system/claude-16-dark.png | Bin 0 -> 545 bytes .../app/resources/img/system/claude-16.png | Bin 0 -> 763 bytes .../resources/img/system/claude-24-dark.png | Bin 0 -> 800 bytes .../app/resources/img/system/claude-24.png | Bin 0 -> 1233 bytes .../resources/img/system/claude-40-dark.png | Bin 0 -> 1337 bytes .../app/resources/img/system/claude-40.png | Bin 0 -> 2168 bytes .../img/system/coinmarketcap-16-dark.png | Bin 0 -> 537 bytes .../resources/img/system/coinmarketcap-16.png | Bin 0 -> 729 bytes .../img/system/coinmarketcap-24-dark.png | Bin 0 -> 776 bytes .../resources/img/system/coinmarketcap-24.png | Bin 0 -> 1140 bytes .../img/system/coinmarketcap-40-dark.png | Bin 0 -> 1322 bytes .../resources/img/system/coinmarketcap-40.png | Bin 0 -> 2075 bytes .../img/system/coinmarketcap-blue-16.png | Bin 0 -> 567 bytes .../img/system/coinmarketcap-blue-24.png | Bin 0 -> 863 bytes .../img/system/coinmarketcap-blue-40.png | Bin 0 -> 1458 bytes .../img/system/crafty-controller-16-dark.png | Bin 0 -> 374 bytes .../img/system/crafty-controller-16.png | Bin 0 -> 544 bytes .../img/system/crafty-controller-24-dark.png | Bin 0 -> 536 bytes .../img/system/crafty-controller-24.png | Bin 0 -> 756 bytes .../img/system/crafty-controller-40-dark.png | Bin 0 -> 807 bytes .../img/system/crafty-controller-40.png | Bin 0 -> 1178 bytes .../app/resources/img/system/cups-16-dark.png | Bin 0 -> 516 bytes .../app/resources/img/system/cups-16.png | Bin 0 -> 488 bytes .../app/resources/img/system/cups-24-dark.png | Bin 0 -> 817 bytes .../app/resources/img/system/cups-24.png | Bin 0 -> 750 bytes .../app/resources/img/system/cups-40-dark.png | Bin 0 -> 1389 bytes .../app/resources/img/system/cups-40.png | Bin 0 -> 1288 bytes .../img/system/deployarr-16-dark.png | Bin 0 -> 369 bytes .../app/resources/img/system/deployarr-16.png | Bin 0 -> 469 bytes .../img/system/deployarr-24-dark.png | Bin 0 -> 502 bytes .../app/resources/img/system/deployarr-24.png | Bin 0 -> 684 bytes .../img/system/deployarr-40-dark.png | Bin 0 -> 773 bytes .../app/resources/img/system/deployarr-40.png | Bin 0 -> 1049 bytes .../img/system/dfir-iris-16-dark.png | Bin 0 -> 395 bytes .../app/resources/img/system/dfir-iris-16.png | Bin 0 -> 542 bytes .../img/system/dfir-iris-24-dark.png | Bin 0 -> 512 bytes .../app/resources/img/system/dfir-iris-24.png | Bin 0 -> 742 bytes .../img/system/dfir-iris-40-dark.png | Bin 0 -> 767 bytes .../app/resources/img/system/dfir-iris-40.png | Bin 0 -> 1237 bytes .../app/resources/img/system/donetick-16.png | Bin 0 -> 700 bytes .../app/resources/img/system/donetick-24.png | Bin 0 -> 1131 bytes .../app/resources/img/system/donetick-40.png | Bin 0 -> 2015 bytes .../resources/img/system/dozzle-16-dark.png | Bin 456 -> 410 bytes .../app/resources/img/system/dozzle-16.png | Bin 559 -> 569 bytes .../resources/img/system/dozzle-24-dark.png | Bin 646 -> 556 bytes .../app/resources/img/system/dozzle-24.png | Bin 800 -> 770 bytes .../resources/img/system/dozzle-40-dark.png | Bin 1002 -> 831 bytes .../app/resources/img/system/dozzle-40.png | Bin 1319 -> 1173 bytes .../resources/img/system/ersatztv-16-dark.png | Bin 0 -> 375 bytes .../app/resources/img/system/ersatztv-16.png | Bin 0 -> 470 bytes .../resources/img/system/ersatztv-24-dark.png | Bin 0 -> 493 bytes .../app/resources/img/system/ersatztv-24.png | Bin 0 -> 594 bytes .../resources/img/system/ersatztv-40-dark.png | Bin 0 -> 704 bytes .../app/resources/img/system/ersatztv-40.png | Bin 0 -> 830 bytes .../resources/img/system/espocrm-16-dark.png | Bin 0 -> 376 bytes .../app/resources/img/system/espocrm-16.png | Bin 0 -> 523 bytes .../resources/img/system/espocrm-24-dark.png | Bin 0 -> 509 bytes .../app/resources/img/system/espocrm-24.png | Bin 0 -> 719 bytes .../resources/img/system/espocrm-40-dark.png | Bin 0 -> 729 bytes .../app/resources/img/system/espocrm-40.png | Bin 0 -> 1018 bytes .../app/resources/img/system/etherpad-16.png | Bin 0 -> 612 bytes .../app/resources/img/system/etherpad-24.png | Bin 0 -> 797 bytes .../app/resources/img/system/etherpad-40.png | Bin 0 -> 1180 bytes .../img/system/falcon-player-16-dark.png | Bin 0 -> 404 bytes .../resources/img/system/falcon-player-16.png | Bin 0 -> 600 bytes .../img/system/falcon-player-24-dark.png | Bin 0 -> 528 bytes .../resources/img/system/falcon-player-24.png | Bin 0 -> 743 bytes .../img/system/falcon-player-40-dark.png | Bin 0 -> 851 bytes .../resources/img/system/falcon-player-40.png | Bin 0 -> 1181 bytes .../img/system/flashpaper-16-dark.png | Bin 0 -> 374 bytes .../resources/img/system/flashpaper-16.png | Bin 0 -> 536 bytes .../img/system/flashpaper-24-dark.png | Bin 0 -> 524 bytes .../resources/img/system/flashpaper-24.png | Bin 0 -> 771 bytes .../img/system/flashpaper-40-dark.png | Bin 0 -> 790 bytes .../resources/img/system/flashpaper-40.png | Bin 0 -> 1210 bytes .../resources/img/system/fli-so-16-dark.png | Bin 0 -> 427 bytes .../app/resources/img/system/fli-so-16.png | Bin 0 -> 514 bytes .../resources/img/system/fli-so-24-dark.png | Bin 0 -> 651 bytes .../app/resources/img/system/fli-so-24.png | Bin 0 -> 781 bytes .../resources/img/system/fli-so-40-dark.png | Bin 0 -> 983 bytes .../app/resources/img/system/fli-so-40.png | Bin 0 -> 1199 bytes .../resources/img/system/flood-16-dark.png | Bin 0 -> 503 bytes .../app/resources/img/system/flood-16.png | Bin 0 -> 694 bytes .../resources/img/system/flood-24-dark.png | Bin 0 -> 782 bytes .../app/resources/img/system/flood-24.png | Bin 0 -> 1088 bytes .../resources/img/system/flood-40-dark.png | Bin 0 -> 1405 bytes .../app/resources/img/system/flood-40.png | Bin 0 -> 1959 bytes .../resources/img/system/freefinance-16.png | Bin 0 -> 389 bytes .../resources/img/system/freefinance-24.png | Bin 0 -> 497 bytes .../resources/img/system/freefinance-40.png | Bin 0 -> 709 bytes .../resources/img/system/freeradius-16.png | Bin 0 -> 604 bytes .../resources/img/system/freeradius-24.png | Bin 0 -> 861 bytes .../resources/img/system/freeradius-40.png | Bin 0 -> 1440 bytes .../app/resources/img/system/fritz-16.png | Bin 0 -> 606 bytes .../app/resources/img/system/fritz-24.png | Bin 0 -> 1008 bytes .../app/resources/img/system/fritz-40.png | Bin 0 -> 1870 bytes .../img/system/gladys-assistant-16.png | Bin 0 -> 471 bytes .../img/system/gladys-assistant-24.png | Bin 0 -> 888 bytes .../img/system/gladys-assistant-40.png | Bin 0 -> 1636 bytes .../img/system/grafana-alloy-16-dark.png | Bin 0 -> 504 bytes .../resources/img/system/grafana-alloy-16.png | Bin 0 -> 667 bytes .../img/system/grafana-alloy-24-dark.png | Bin 0 -> 794 bytes .../resources/img/system/grafana-alloy-24.png | Bin 0 -> 1071 bytes .../img/system/grafana-alloy-40-dark.png | Bin 0 -> 1318 bytes .../resources/img/system/grafana-alloy-40.png | Bin 0 -> 1838 bytes .../resources/img/system/graylog-16-dark.png | Bin 0 -> 486 bytes .../app/resources/img/system/graylog-16.png | Bin 0 -> 651 bytes .../resources/img/system/graylog-24-dark.png | Bin 0 -> 704 bytes .../app/resources/img/system/graylog-24.png | Bin 0 -> 968 bytes .../resources/img/system/graylog-40-dark.png | Bin 0 -> 1178 bytes .../app/resources/img/system/graylog-40.png | Bin 0 -> 1629 bytes .../app/resources/img/system/hauk-16-dark.png | Bin 0 -> 503 bytes .../app/resources/img/system/hauk-16.png | Bin 0 -> 457 bytes .../app/resources/img/system/hauk-24-dark.png | Bin 0 -> 756 bytes .../app/resources/img/system/hauk-24.png | Bin 0 -> 686 bytes .../app/resources/img/system/hauk-40-dark.png | Bin 0 -> 1339 bytes .../app/resources/img/system/hauk-40.png | Bin 0 -> 1212 bytes .../resources/img/system/hemmelig-16-dark.png | Bin 0 -> 547 bytes .../app/resources/img/system/hemmelig-16.png | Bin 0 -> 827 bytes .../resources/img/system/hemmelig-24-dark.png | Bin 0 -> 853 bytes .../app/resources/img/system/hemmelig-24.png | Bin 0 -> 1447 bytes .../resources/img/system/hemmelig-40-dark.png | Bin 0 -> 1428 bytes .../app/resources/img/system/hemmelig-40.png | Bin 0 -> 2527 bytes .../app/resources/img/system/hoodik-16.png | Bin 0 -> 755 bytes .../app/resources/img/system/hoodik-24.png | Bin 0 -> 1222 bytes .../app/resources/img/system/hoodik-40.png | Bin 0 -> 2418 bytes .../img/system/i-librarian-16-dark.png | Bin 0 -> 326 bytes .../resources/img/system/i-librarian-16.png | Bin 0 -> 397 bytes .../img/system/i-librarian-24-dark.png | Bin 0 -> 418 bytes .../resources/img/system/i-librarian-24.png | Bin 0 -> 555 bytes .../img/system/i-librarian-40-dark.png | Bin 0 -> 621 bytes .../resources/img/system/i-librarian-40.png | Bin 0 -> 792 bytes .../resources/img/system/icinga-16-dark.png | Bin 0 -> 343 bytes .../app/resources/img/system/icinga-16.png | Bin 0 -> 509 bytes .../resources/img/system/icinga-24-dark.png | Bin 0 -> 448 bytes .../app/resources/img/system/icinga-24.png | Bin 0 -> 696 bytes .../resources/img/system/icinga-40-dark.png | Bin 0 -> 741 bytes .../app/resources/img/system/icinga-40.png | Bin 0 -> 1094 bytes .../app/resources/img/system/icon-16.png | Bin 546 -> 0 bytes .../app/resources/img/system/icon-24.png | Bin 765 -> 0 bytes .../app/resources/img/system/icon-40.png | Bin 1228 -> 0 bytes .../img/system/immich-frame-16-dark.png | Bin 433 -> 443 bytes .../resources/img/system/immich-frame-16.png | Bin 460 -> 598 bytes .../img/system/immich-frame-24-dark.png | Bin 670 -> 620 bytes .../resources/img/system/immich-frame-24.png | Bin 685 -> 872 bytes .../img/system/immich-frame-40-dark.png | Bin 1040 -> 1005 bytes .../resources/img/system/immich-frame-40.png | Bin 1067 -> 1325 bytes .../system/immich-public-proxy-16-dark.png | Bin 0 -> 760 bytes .../img/system/immich-public-proxy-16.png | Bin 0 -> 808 bytes .../system/immich-public-proxy-24-dark.png | Bin 0 -> 1131 bytes .../img/system/immich-public-proxy-24.png | Bin 0 -> 1265 bytes .../system/immich-public-proxy-40-dark.png | Bin 0 -> 2037 bytes .../img/system/immich-public-proxy-40.png | Bin 0 -> 2375 bytes .../img/system/investbrain-16-dark.png | Bin 0 -> 509 bytes .../resources/img/system/investbrain-16.png | Bin 0 -> 468 bytes .../img/system/investbrain-24-dark.png | Bin 0 -> 894 bytes .../resources/img/system/investbrain-24.png | Bin 0 -> 788 bytes .../img/system/investbrain-40-dark.png | Bin 0 -> 1658 bytes .../resources/img/system/investbrain-40.png | Bin 0 -> 1491 bytes .../app/resources/img/system/ko-fi-16.png | Bin 0 -> 708 bytes .../app/resources/img/system/ko-fi-24.png | Bin 0 -> 1113 bytes .../app/resources/img/system/ko-fi-40.png | Bin 0 -> 1886 bytes .../resources/img/system/ladder-16-dark.png | Bin 0 -> 500 bytes .../app/resources/img/system/ladder-16.png | Bin 0 -> 784 bytes .../resources/img/system/ladder-24-dark.png | Bin 0 -> 767 bytes .../app/resources/img/system/ladder-24.png | Bin 0 -> 1189 bytes .../resources/img/system/ladder-40-dark.png | Bin 0 -> 1229 bytes .../app/resources/img/system/ladder-40.png | Bin 0 -> 1936 bytes .../resources/img/system/leantime-16-dark.png | Bin 0 -> 389 bytes .../resources/img/system/leantime-24-dark.png | Bin 0 -> 572 bytes .../resources/img/system/leantime-40-dark.png | Bin 0 -> 907 bytes .../img/system/linuxcontainers-16.png | Bin 0 -> 743 bytes .../img/system/linuxcontainers-24.png | Bin 0 -> 1158 bytes .../img/system/linuxcontainers-40.png | Bin 0 -> 2452 bytes .../resources/img/system/localess-16-dark.png | Bin 0 -> 407 bytes .../app/resources/img/system/localess-16.png | Bin 0 -> 576 bytes .../resources/img/system/localess-24-dark.png | Bin 0 -> 566 bytes .../app/resources/img/system/localess-24.png | Bin 0 -> 780 bytes .../resources/img/system/localess-40-dark.png | Bin 0 -> 893 bytes .../app/resources/img/system/localess-40.png | Bin 0 -> 1250 bytes .../system/lyrion-media-server-16-dark.png | Bin 0 -> 352 bytes .../img/system/lyrion-media-server-16.png | Bin 0 -> 541 bytes .../system/lyrion-media-server-24-dark.png | Bin 0 -> 499 bytes .../img/system/lyrion-media-server-24.png | Bin 0 -> 736 bytes .../system/lyrion-media-server-40-dark.png | Bin 0 -> 709 bytes .../img/system/lyrion-media-server-40.png | Bin 0 -> 1054 bytes .../resources/img/system/mailpit-16-dark.png | Bin 0 -> 577 bytes .../app/resources/img/system/mailpit-16.png | Bin 0 -> 689 bytes .../resources/img/system/mailpit-24-dark.png | Bin 0 -> 868 bytes .../app/resources/img/system/mailpit-24.png | Bin 0 -> 1071 bytes .../resources/img/system/mailpit-40-dark.png | Bin 0 -> 1475 bytes .../app/resources/img/system/mailpit-40.png | Bin 0 -> 1826 bytes .../resources/img/system/maloja-16-dark.png | Bin 0 -> 509 bytes .../app/resources/img/system/maloja-16.png | Bin 0 -> 831 bytes .../resources/img/system/maloja-24-dark.png | Bin 0 -> 800 bytes .../app/resources/img/system/maloja-24.png | Bin 0 -> 1368 bytes .../resources/img/system/maloja-40-dark.png | Bin 0 -> 1430 bytes .../app/resources/img/system/maloja-40.png | Bin 0 -> 2543 bytes .../img/system/medassist-16-dark.png | Bin 0 -> 463 bytes .../app/resources/img/system/medassist-16.png | Bin 0 -> 713 bytes .../img/system/medassist-24-dark.png | Bin 0 -> 660 bytes .../app/resources/img/system/medassist-24.png | Bin 0 -> 1060 bytes .../img/system/medassist-40-dark.png | Bin 0 -> 1027 bytes .../app/resources/img/system/medassist-40.png | Bin 0 -> 1807 bytes .../resources/img/system/mediathekview-16.png | Bin 0 -> 870 bytes .../resources/img/system/mediathekview-24.png | Bin 0 -> 1409 bytes .../resources/img/system/mediathekview-40.png | Bin 0 -> 2591 bytes .../img/system/meshtastic-16-dark.png | Bin 0 -> 357 bytes .../resources/img/system/meshtastic-16.png | Bin 0 -> 518 bytes .../img/system/meshtastic-24-dark.png | Bin 0 -> 496 bytes .../resources/img/system/meshtastic-24.png | Bin 0 -> 724 bytes .../img/system/meshtastic-40-dark.png | Bin 0 -> 789 bytes .../resources/img/system/meshtastic-40.png | Bin 0 -> 1246 bytes .../img/system/mitmproxy-16-dark.png | Bin 0 -> 617 bytes .../app/resources/img/system/mitmproxy-16.png | Bin 0 -> 563 bytes .../img/system/mitmproxy-24-dark.png | Bin 0 -> 1032 bytes .../app/resources/img/system/mitmproxy-24.png | Bin 0 -> 971 bytes .../img/system/mitmproxy-40-dark.png | Bin 0 -> 1968 bytes .../app/resources/img/system/mitmproxy-40.png | Bin 0 -> 1818 bytes .../resources/img/system/mxroute-16-dark.png | Bin 0 -> 359 bytes .../app/resources/img/system/mxroute-16.png | Bin 0 -> 544 bytes .../resources/img/system/mxroute-24-dark.png | Bin 0 -> 498 bytes .../app/resources/img/system/mxroute-24.png | Bin 0 -> 751 bytes .../resources/img/system/mxroute-40-dark.png | Bin 0 -> 796 bytes .../app/resources/img/system/mxroute-40.png | Bin 0 -> 1323 bytes .../resources/img/system/netbox-16-dark.png | Bin 0 -> 496 bytes .../app/resources/img/system/netbox-16.png | Bin 0 -> 529 bytes .../resources/img/system/netbox-24-dark.png | Bin 0 -> 636 bytes .../app/resources/img/system/netbox-24.png | Bin 0 -> 716 bytes .../resources/img/system/netbox-40-dark.png | Bin 0 -> 1026 bytes .../app/resources/img/system/netbox-40.png | Bin 0 -> 1153 bytes .../img/system/new-releases-16-dark.png | Bin 0 -> 347 bytes .../resources/img/system/new-releases-16.png | Bin 0 -> 432 bytes .../img/system/new-releases-24-dark.png | Bin 0 -> 454 bytes .../resources/img/system/new-releases-24.png | Bin 0 -> 609 bytes .../img/system/new-releases-40-dark.png | Bin 0 -> 636 bytes .../resources/img/system/new-releases-40.png | Bin 0 -> 850 bytes .../app/resources/img/system/nextbeats-16.png | Bin 0 -> 996 bytes .../app/resources/img/system/nextbeats-24.png | Bin 0 -> 1836 bytes .../app/resources/img/system/nextbeats-40.png | Bin 0 -> 3940 bytes .../resources/img/system/njalla-16-dark.png | Bin 0 -> 383 bytes .../app/resources/img/system/njalla-16.png | Bin 0 -> 536 bytes .../resources/img/system/njalla-24-dark.png | Bin 0 -> 523 bytes .../app/resources/img/system/njalla-24.png | Bin 0 -> 764 bytes .../resources/img/system/njalla-40-dark.png | Bin 0 -> 886 bytes .../app/resources/img/system/njalla-40.png | Bin 0 -> 1213 bytes .../resources/img/system/nocobase-16-dark.png | Bin 0 -> 409 bytes .../app/resources/img/system/nocobase-16.png | Bin 0 -> 390 bytes .../resources/img/system/nocobase-24-dark.png | Bin 0 -> 597 bytes .../app/resources/img/system/nocobase-24.png | Bin 0 -> 563 bytes .../resources/img/system/nocobase-40-dark.png | Bin 0 -> 1041 bytes .../app/resources/img/system/nocobase-40.png | Bin 0 -> 931 bytes .../app/resources/img/system/novu-16-dark.png | Bin 0 -> 462 bytes .../app/resources/img/system/novu-16.png | Bin 0 -> 840 bytes .../app/resources/img/system/novu-24-dark.png | Bin 0 -> 689 bytes .../app/resources/img/system/novu-24.png | Bin 0 -> 1191 bytes .../app/resources/img/system/novu-40-dark.png | Bin 0 -> 1025 bytes .../app/resources/img/system/novu-40.png | Bin 0 -> 1882 bytes .../resources/img/system/ollama-16-dark.png | Bin 0 -> 530 bytes .../app/resources/img/system/ollama-16.png | Bin 0 -> 717 bytes .../resources/img/system/ollama-24-dark.png | Bin 0 -> 827 bytes .../app/resources/img/system/ollama-24.png | Bin 0 -> 1172 bytes .../resources/img/system/ollama-40-dark.png | Bin 0 -> 1436 bytes .../app/resources/img/system/ollama-40.png | Bin 0 -> 2043 bytes .../img/system/openbooks-16-dark.png | Bin 0 -> 275 bytes .../app/resources/img/system/openbooks-16.png | Bin 0 -> 331 bytes .../img/system/openbooks-24-dark.png | Bin 0 -> 339 bytes .../app/resources/img/system/openbooks-24.png | Bin 0 -> 413 bytes .../img/system/openbooks-40-dark.png | Bin 0 -> 501 bytes .../app/resources/img/system/openbooks-40.png | Bin 0 -> 651 bytes .../resources/img/system/opengist-16-dark.png | Bin 0 -> 524 bytes .../app/resources/img/system/opengist-16.png | Bin 0 -> 708 bytes .../resources/img/system/opengist-24-dark.png | Bin 0 -> 775 bytes .../app/resources/img/system/opengist-24.png | Bin 0 -> 1017 bytes .../resources/img/system/opengist-40-dark.png | Bin 0 -> 1366 bytes .../app/resources/img/system/opengist-40.png | Bin 0 -> 1821 bytes .../img/system/openprinting-cups-16.png | Bin 0 -> 547 bytes .../img/system/openprinting-cups-24.png | Bin 0 -> 804 bytes .../img/system/openprinting-cups-40.png | Bin 0 -> 1314 bytes .../img/system/opensearch-16-dark.png | Bin 0 -> 389 bytes .../resources/img/system/opensearch-16.png | Bin 0 -> 591 bytes .../img/system/opensearch-24-dark.png | Bin 0 -> 564 bytes .../resources/img/system/opensearch-24.png | Bin 0 -> 852 bytes .../img/system/opensearch-40-dark.png | Bin 0 -> 967 bytes .../resources/img/system/opensearch-40.png | Bin 0 -> 1444 bytes .../app/resources/img/system/owntracks-16.png | Bin 0 -> 714 bytes .../app/resources/img/system/owntracks-24.png | Bin 0 -> 1064 bytes .../app/resources/img/system/owntracks-40.png | Bin 0 -> 1806 bytes .../resources/img/system/patreon-16-dark.png | Bin 0 -> 345 bytes .../app/resources/img/system/patreon-16.png | Bin 0 -> 316 bytes .../resources/img/system/patreon-24-dark.png | Bin 0 -> 466 bytes .../app/resources/img/system/patreon-24.png | Bin 0 -> 419 bytes .../resources/img/system/patreon-40-dark.png | Bin 0 -> 742 bytes .../app/resources/img/system/patreon-40.png | Bin 0 -> 652 bytes .../img/system/pigallery2-16-dark.png | Bin 0 -> 514 bytes .../resources/img/system/pigallery2-16.png | Bin 0 -> 465 bytes .../img/system/pigallery2-24-dark.png | Bin 0 -> 815 bytes .../resources/img/system/pigallery2-24.png | Bin 0 -> 728 bytes .../img/system/pigallery2-40-dark.png | Bin 0 -> 1366 bytes .../resources/img/system/pigallery2-40.png | Bin 0 -> 1263 bytes .../app/resources/img/system/plikshare-16.png | Bin 0 -> 613 bytes .../app/resources/img/system/plikshare-24.png | Bin 0 -> 875 bytes .../app/resources/img/system/plikshare-40.png | Bin 0 -> 1399 bytes .../img/system/portainer-16-dark.png | Bin 0 -> 392 bytes .../app/resources/img/system/portainer-16.png | Bin 648 -> 529 bytes .../img/system/portainer-24-dark.png | Bin 0 -> 599 bytes .../app/resources/img/system/portainer-24.png | Bin 992 -> 793 bytes .../img/system/portainer-40-dark.png | Bin 0 -> 932 bytes .../app/resources/img/system/portainer-40.png | Bin 1643 -> 1256 bytes .../img/system/psitransfer-16-dark.png | Bin 0 -> 347 bytes .../resources/img/system/psitransfer-16.png | Bin 0 -> 504 bytes .../img/system/psitransfer-24-dark.png | Bin 0 -> 451 bytes .../resources/img/system/psitransfer-24.png | Bin 0 -> 644 bytes .../img/system/psitransfer-40-dark.png | Bin 0 -> 685 bytes .../resources/img/system/psitransfer-40.png | Bin 0 -> 977 bytes .../img/system/radarr-4k-16-dark.png | Bin 0 -> 620 bytes .../app/resources/img/system/radarr-4k-16.png | Bin 0 -> 772 bytes .../img/system/radarr-4k-24-dark.png | Bin 0 -> 947 bytes .../app/resources/img/system/radarr-4k-24.png | Bin 0 -> 1189 bytes .../img/system/radarr-4k-40-dark.png | Bin 0 -> 1693 bytes .../app/resources/img/system/radarr-4k-40.png | Bin 0 -> 2148 bytes .../img/system/radarr-anime-16-dark.png | Bin 0 -> 602 bytes .../resources/img/system/radarr-anime-16.png | Bin 0 -> 756 bytes .../img/system/radarr-anime-24-dark.png | Bin 0 -> 934 bytes .../resources/img/system/radarr-anime-24.png | Bin 0 -> 1171 bytes .../img/system/radarr-anime-40-dark.png | Bin 0 -> 1634 bytes .../resources/img/system/radarr-anime-40.png | Bin 0 -> 2090 bytes .../app/resources/img/system/radarr-v1-16.png | Bin 0 -> 841 bytes .../app/resources/img/system/radarr-v1-24.png | Bin 0 -> 1398 bytes .../app/resources/img/system/radarr-v1-40.png | Bin 0 -> 2803 bytes .../resources/img/system/raindrop-io-16.png | Bin 0 -> 554 bytes .../resources/img/system/raindrop-io-24.png | Bin 0 -> 752 bytes .../resources/img/system/raindrop-io-40.png | Bin 0 -> 1172 bytes .../img/system/rancher-desktop-16-dark.png | Bin 0 -> 353 bytes .../img/system/rancher-desktop-16.png | Bin 0 -> 467 bytes .../img/system/rancher-desktop-24-dark.png | Bin 0 -> 447 bytes .../img/system/rancher-desktop-24.png | Bin 0 -> 598 bytes .../img/system/rancher-desktop-40-dark.png | Bin 0 -> 654 bytes .../img/system/rancher-desktop-40.png | Bin 0 -> 866 bytes .../img/system/rancher-epinio-16-dark.png | Bin 0 -> 375 bytes .../img/system/rancher-epinio-16.png | Bin 0 -> 523 bytes .../img/system/rancher-epinio-24-dark.png | Bin 0 -> 518 bytes .../img/system/rancher-epinio-24.png | Bin 0 -> 730 bytes .../img/system/rancher-epinio-40-dark.png | Bin 0 -> 679 bytes .../img/system/rancher-epinio-40.png | Bin 0 -> 940 bytes .../img/system/rancher-fleet-16-dark.png | Bin 0 -> 396 bytes .../resources/img/system/rancher-fleet-16.png | Bin 0 -> 579 bytes .../img/system/rancher-fleet-24-dark.png | Bin 0 -> 578 bytes .../resources/img/system/rancher-fleet-24.png | Bin 0 -> 821 bytes .../img/system/rancher-fleet-40-dark.png | Bin 0 -> 1032 bytes .../resources/img/system/rancher-fleet-40.png | Bin 0 -> 1453 bytes .../img/system/rancher-harvester-16-dark.png | Bin 0 -> 394 bytes .../img/system/rancher-harvester-16.png | Bin 0 -> 601 bytes .../img/system/rancher-harvester-24-dark.png | Bin 0 -> 580 bytes .../img/system/rancher-harvester-24.png | Bin 0 -> 919 bytes .../img/system/rancher-harvester-40-dark.png | Bin 0 -> 939 bytes .../img/system/rancher-harvester-40.png | Bin 0 -> 1700 bytes .../img/system/rancher-hypper-16-dark.png | Bin 0 -> 363 bytes .../img/system/rancher-hypper-16.png | Bin 0 -> 518 bytes .../img/system/rancher-hypper-24-dark.png | Bin 0 -> 442 bytes .../img/system/rancher-hypper-24.png | Bin 0 -> 688 bytes .../img/system/rancher-hypper-40-dark.png | Bin 0 -> 694 bytes .../img/system/rancher-hypper-40.png | Bin 0 -> 1065 bytes .../img/system/rancher-k3os-16-dark.png | Bin 0 -> 359 bytes .../resources/img/system/rancher-k3os-16.png | Bin 0 -> 406 bytes .../img/system/rancher-k3os-24-dark.png | Bin 0 -> 503 bytes .../resources/img/system/rancher-k3os-24.png | Bin 0 -> 642 bytes .../img/system/rancher-k3os-40-dark.png | Bin 0 -> 842 bytes .../resources/img/system/rancher-k3os-40.png | Bin 0 -> 1199 bytes .../img/system/rancher-k3s-16-dark.png | Bin 0 -> 331 bytes .../resources/img/system/rancher-k3s-16.png | Bin 0 -> 391 bytes .../img/system/rancher-k3s-24-dark.png | Bin 0 -> 437 bytes .../resources/img/system/rancher-k3s-24.png | Bin 0 -> 559 bytes .../img/system/rancher-k3s-40-dark.png | Bin 0 -> 658 bytes .../resources/img/system/rancher-k3s-40.png | Bin 0 -> 854 bytes .../img/system/rancher-kubewarden-16-dark.png | Bin 0 -> 364 bytes .../img/system/rancher-kubewarden-16.png | Bin 0 -> 494 bytes .../img/system/rancher-kubewarden-24-dark.png | Bin 0 -> 508 bytes .../img/system/rancher-kubewarden-24.png | Bin 0 -> 768 bytes .../img/system/rancher-kubewarden-40-dark.png | Bin 0 -> 784 bytes .../img/system/rancher-kubewarden-40.png | Bin 0 -> 1230 bytes .../img/system/rancher-longhorn-16-dark.png | Bin 0 -> 373 bytes .../img/system/rancher-longhorn-16.png | Bin 0 -> 474 bytes .../img/system/rancher-longhorn-24-dark.png | Bin 0 -> 481 bytes .../img/system/rancher-longhorn-24.png | Bin 0 -> 622 bytes .../img/system/rancher-longhorn-40-dark.png | Bin 0 -> 762 bytes .../img/system/rancher-longhorn-40.png | Bin 0 -> 1031 bytes .../img/system/rancher-opni-16-dark.png | Bin 0 -> 411 bytes .../resources/img/system/rancher-opni-16.png | Bin 0 -> 584 bytes .../img/system/rancher-opni-24-dark.png | Bin 0 -> 604 bytes .../resources/img/system/rancher-opni-24.png | Bin 0 -> 939 bytes .../img/system/rancher-opni-40-dark.png | Bin 0 -> 975 bytes .../resources/img/system/rancher-opni-40.png | Bin 0 -> 1601 bytes .../img/system/rancher-rio-16-dark.png | Bin 0 -> 319 bytes .../resources/img/system/rancher-rio-16.png | Bin 0 -> 392 bytes .../img/system/rancher-rio-24-dark.png | Bin 0 -> 354 bytes .../resources/img/system/rancher-rio-24.png | Bin 0 -> 443 bytes .../img/system/rancher-rio-40-dark.png | Bin 0 -> 586 bytes .../resources/img/system/rancher-rio-40.png | Bin 0 -> 735 bytes .../img/system/rancher-rke-16-dark.png | Bin 0 -> 426 bytes .../resources/img/system/rancher-rke-16.png | Bin 0 -> 592 bytes .../img/system/rancher-rke-24-dark.png | Bin 0 -> 592 bytes .../resources/img/system/rancher-rke-24.png | Bin 0 -> 912 bytes .../img/system/rancher-rke-40-dark.png | Bin 0 -> 925 bytes .../resources/img/system/rancher-rke-40.png | Bin 0 -> 1366 bytes .../img/system/rancher-submariner-16-dark.png | Bin 0 -> 301 bytes .../img/system/rancher-submariner-16.png | Bin 0 -> 361 bytes .../img/system/rancher-submariner-24-dark.png | Bin 0 -> 370 bytes .../img/system/rancher-submariner-24.png | Bin 0 -> 451 bytes .../img/system/rancher-submariner-40-dark.png | Bin 0 -> 522 bytes .../img/system/rancher-submariner-40.png | Bin 0 -> 682 bytes .../app/resources/img/system/redis-16.png | Bin 0 -> 758 bytes .../app/resources/img/system/redis-24.png | Bin 0 -> 1208 bytes .../app/resources/img/system/redis-40.png | Bin 0 -> 2070 bytes .../resources/img/system/redlib-16-dark.png | Bin 0 -> 377 bytes .../app/resources/img/system/redlib-16.png | Bin 558 -> 524 bytes .../resources/img/system/redlib-24-dark.png | Bin 0 -> 531 bytes .../app/resources/img/system/redlib-24.png | Bin 701 -> 700 bytes .../resources/img/system/redlib-40-dark.png | Bin 0 -> 761 bytes .../app/resources/img/system/redlib-40.png | Bin 1087 -> 1042 bytes .../resources/img/system/redmine-16-dark.png | Bin 0 -> 387 bytes .../app/resources/img/system/redmine-16.png | Bin 0 -> 615 bytes .../resources/img/system/redmine-24-dark.png | Bin 0 -> 493 bytes .../app/resources/img/system/redmine-24.png | Bin 0 -> 903 bytes .../resources/img/system/redmine-40-dark.png | Bin 0 -> 784 bytes .../app/resources/img/system/redmine-40.png | Bin 0 -> 1565 bytes .../img/system/resilio-sync-16-dark.png | Bin 0 -> 416 bytes .../resources/img/system/resilio-sync-16.png | Bin 0 -> 641 bytes .../img/system/resilio-sync-24-dark.png | Bin 0 -> 582 bytes .../resources/img/system/resilio-sync-24.png | Bin 0 -> 921 bytes .../img/system/resilio-sync-40-dark.png | Bin 0 -> 948 bytes .../resources/img/system/resilio-sync-40.png | Bin 0 -> 1579 bytes .../app/resources/img/system/safeline-16.png | Bin 0 -> 792 bytes .../app/resources/img/system/safeline-24.png | Bin 0 -> 1255 bytes .../app/resources/img/system/safeline-40.png | Bin 0 -> 2377 bytes .../img/system/scratch-map-16-dark.png | Bin 0 -> 476 bytes .../resources/img/system/scratch-map-16.png | Bin 0 -> 642 bytes .../img/system/scratch-map-24-dark.png | Bin 0 -> 652 bytes .../resources/img/system/scratch-map-24.png | Bin 0 -> 962 bytes .../img/system/scratch-map-40-dark.png | Bin 0 -> 1065 bytes .../resources/img/system/scratch-map-40.png | Bin 0 -> 1666 bytes .../app/resources/img/system/seedsync-16.png | Bin 0 -> 802 bytes .../app/resources/img/system/seedsync-24.png | Bin 0 -> 1201 bytes .../app/resources/img/system/seedsync-40.png | Bin 0 -> 1970 bytes .../img/system/semaphore-ui-16-dark.png | Bin 0 -> 386 bytes .../resources/img/system/semaphore-ui-16.png | Bin 0 -> 603 bytes .../img/system/semaphore-ui-24-dark.png | Bin 0 -> 584 bytes .../resources/img/system/semaphore-ui-24.png | Bin 0 -> 850 bytes .../img/system/semaphore-ui-40-dark.png | Bin 0 -> 877 bytes .../resources/img/system/semaphore-ui-40.png | Bin 0 -> 1412 bytes .../system/signature-pdf-libre-16-dark.png | Bin 0 -> 441 bytes .../img/system/signature-pdf-libre-16.png | Bin 0 -> 408 bytes .../system/signature-pdf-libre-24-dark.png | Bin 0 -> 592 bytes .../img/system/signature-pdf-libre-24.png | Bin 0 -> 565 bytes .../system/signature-pdf-libre-40-dark.png | Bin 0 -> 963 bytes .../img/system/signature-pdf-libre-40.png | Bin 0 -> 888 bytes .../app/resources/img/system/sofe-16-dark.png | Bin 0 -> 478 bytes .../app/resources/img/system/sofe-16.png | Bin 0 -> 632 bytes .../app/resources/img/system/sofe-24-dark.png | Bin 0 -> 751 bytes .../app/resources/img/system/sofe-24.png | Bin 0 -> 1019 bytes .../app/resources/img/system/sofe-40-dark.png | Bin 0 -> 1221 bytes .../app/resources/img/system/sofe-40.png | Bin 0 -> 1737 bytes .../resources/img/system/sonarr-16-dark.png | Bin 0 -> 535 bytes .../resources/img/system/sonarr-24-dark.png | Bin 0 -> 803 bytes .../resources/img/system/sonarr-40-dark.png | Bin 0 -> 1348 bytes .../img/system/sonarr-4k-16-dark.png | Bin 0 -> 610 bytes .../app/resources/img/system/sonarr-4k-16.png | Bin 0 -> 866 bytes .../img/system/sonarr-4k-24-dark.png | Bin 0 -> 909 bytes .../app/resources/img/system/sonarr-4k-24.png | Bin 0 -> 1341 bytes .../img/system/sonarr-4k-40-dark.png | Bin 0 -> 1581 bytes .../app/resources/img/system/sonarr-4k-40.png | Bin 0 -> 2424 bytes .../img/system/sonarr-anime-16-dark.png | Bin 0 -> 609 bytes .../resources/img/system/sonarr-anime-16.png | Bin 0 -> 864 bytes .../img/system/sonarr-anime-24-dark.png | Bin 0 -> 924 bytes .../resources/img/system/sonarr-anime-24.png | Bin 0 -> 1328 bytes .../img/system/sonarr-anime-40-dark.png | Bin 0 -> 1544 bytes .../resources/img/system/sonarr-anime-40.png | Bin 0 -> 2365 bytes .../img/system/sonarr-radarr-16-dark.png | Bin 0 -> 518 bytes .../resources/img/system/sonarr-radarr-16.png | Bin 0 -> 710 bytes .../img/system/sonarr-radarr-24-dark.png | Bin 0 -> 712 bytes .../resources/img/system/sonarr-radarr-24.png | Bin 0 -> 1053 bytes .../img/system/sonarr-radarr-40-dark.png | Bin 0 -> 1184 bytes .../resources/img/system/sonarr-radarr-40.png | Bin 0 -> 1685 bytes .../app/resources/img/system/squoosh-16.png | Bin 0 -> 884 bytes .../app/resources/img/system/squoosh-24.png | Bin 0 -> 1527 bytes .../app/resources/img/system/squoosh-40.png | Bin 0 -> 2987 bytes .../resources/img/system/tasmoadmin-16.png | Bin 0 -> 848 bytes .../resources/img/system/tasmoadmin-24.png | Bin 0 -> 1316 bytes .../resources/img/system/tasmoadmin-40.png | Bin 0 -> 2374 bytes .../img/system/the-lounge-16-dark.png | Bin 0 -> 417 bytes .../resources/img/system/the-lounge-16.png | Bin 0 -> 606 bytes .../img/system/the-lounge-24-dark.png | Bin 0 -> 570 bytes .../resources/img/system/the-lounge-24.png | Bin 0 -> 892 bytes .../img/system/the-lounge-40-dark.png | Bin 0 -> 938 bytes .../resources/img/system/the-lounge-40.png | Bin 0 -> 1513 bytes .../app/resources/img/system/tpdb-16.png | Bin 733 -> 731 bytes .../app/resources/img/system/tpdb-24.png | Bin 1135 -> 1141 bytes .../app/resources/img/system/tpdb-40.png | Bin 1993 -> 1989 bytes .../resources/img/system/trackly-16-dark.png | Bin 0 -> 435 bytes .../app/resources/img/system/trackly-16.png | Bin 0 -> 522 bytes .../resources/img/system/trackly-24-dark.png | Bin 0 -> 648 bytes .../app/resources/img/system/trackly-24.png | Bin 0 -> 810 bytes .../resources/img/system/trackly-40-dark.png | Bin 0 -> 1044 bytes .../app/resources/img/system/trackly-40.png | Bin 0 -> 1403 bytes .../img/system/trusted-cgi-16-dark.png | Bin 0 -> 409 bytes .../resources/img/system/trusted-cgi-16.png | Bin 0 -> 190 bytes .../img/system/trusted-cgi-24-dark.png | Bin 0 -> 576 bytes .../resources/img/system/trusted-cgi-24.png | Bin 0 -> 220 bytes .../img/system/trusted-cgi-40-dark.png | Bin 0 -> 985 bytes .../resources/img/system/trusted-cgi-40.png | Bin 0 -> 322 bytes .../resources/img/system/windmill-16-dark.png | Bin 0 -> 444 bytes .../app/resources/img/system/windmill-16.png | Bin 0 -> 670 bytes .../resources/img/system/windmill-24-dark.png | Bin 0 -> 595 bytes .../app/resources/img/system/windmill-24.png | Bin 0 -> 940 bytes .../resources/img/system/windmill-40-dark.png | Bin 0 -> 915 bytes .../app/resources/img/system/windmill-40.png | Bin 0 -> 1548 bytes .../resources/img/system/xen-orchestra-16.png | Bin 0 -> 938 bytes .../resources/img/system/xen-orchestra-24.png | Bin 0 -> 1616 bytes .../resources/img/system/xen-orchestra-40.png | Bin 0 -> 3327 bytes .../resources/img/system/yunohost-16-dark.png | Bin 0 -> 531 bytes .../app/resources/img/system/yunohost-16.png | Bin 0 -> 805 bytes .../resources/img/system/yunohost-24-dark.png | Bin 0 -> 811 bytes .../app/resources/img/system/yunohost-24.png | Bin 0 -> 1249 bytes .../resources/img/system/yunohost-40-dark.png | Bin 0 -> 1434 bytes .../app/resources/img/system/yunohost-40.png | Bin 0 -> 2211 bytes .../resources/img/system/zerotier-16-dark.png | Bin 0 -> 371 bytes .../app/resources/img/system/zerotier-16.png | Bin 0 -> 500 bytes .../resources/img/system/zerotier-24-dark.png | Bin 0 -> 534 bytes .../app/resources/img/system/zerotier-24.png | Bin 0 -> 736 bytes .../resources/img/system/zerotier-40-dark.png | Bin 0 -> 883 bytes .../app/resources/img/system/zerotier-40.png | Bin 0 -> 1297 bytes .../img/system/zwave-js-ui-16-dark.png | Bin 492 -> 0 bytes .../resources/img/system/zwave-js-ui-16.png | Bin 622 -> 0 bytes .../img/system/zwave-js-ui-24-dark.png | Bin 715 -> 0 bytes .../resources/img/system/zwave-js-ui-24.png | Bin 987 -> 0 bytes .../img/system/zwave-js-ui-40-dark.png | Bin 1175 -> 0 bytes .../resources/img/system/zwave-js-ui-40.png | Bin 1664 -> 0 bytes .../io/xpipe/app/resources/misc/api.md | 223 ++- .../io/xpipe/app/resources/misc/eula.md | 8 +- .../resources/misc/github-markdown-dark.css | 10 +- .../resources/misc/github-markdown-light.css | 11 +- .../io/xpipe/app/resources/misc/vault.md | 19 +- .../xpipe/app/resources/misc/vault_empty.md | 19 +- .../io/xpipe/app/resources/style/category.css | 4 + .../resources/style/error-handler-comp.css | 2 - .../resources/style/error-overlay-comp.css | 4 - .../io/xpipe/app/resources/style/frame.css | 14 +- .../resources/style/modal-overlay-comp.css | 12 +- .../io/xpipe/app/resources/style/prefs.css | 6 +- .../app/resources/style/section-comp.css | 8 + .../app/resources/style/store-entry-comp.css | 8 + .../io/xpipe/app/resources/style/style.css | 9 + .../app/resources/theme/cupertinoDark.css | 2 +- beacon/build.gradle | 4 +- .../java/io/xpipe/beacon/BeaconClient.java | 4 +- .../java/io/xpipe/beacon/BeaconInterface.java | 4 + .../xpipe/beacon/api/CategoryAddExchange.java | 37 + .../beacon/api/ConnectionAddExchange.java | 2 + beacon/src/main/java/module-info.java | 1 + build.gradle | 23 +- core/build.gradle | 4 +- .../xpipe/core/process/ElevationHandler.java | 9 +- .../core/process/LocalProcessInputStream.java | 15 + .../process/LocalProcessOutputStream.java | 13 + .../java/io/xpipe/core/process/OsType.java | 17 +- .../core/process/ParentSystemAccess.java | 17 + .../io/xpipe/core/process/ProcessControl.java | 10 +- .../xpipe/core/process/ShellCapabilities.java | 15 + .../io/xpipe/core/process/ShellControl.java | 25 +- .../io/xpipe/core/process/ShellDialect.java | 6 +- .../java/io/xpipe/core/process/ShellView.java | 86 ++ .../xpipe/core/process/StubShellControl.java | 2 +- .../core/process/WrapperShellControl.java | 36 +- .../java/io/xpipe/core/store/DataStore.java | 6 - .../core/store/NetworkTunnelSessionChain.java | 71 + .../xpipe/core/store/NetworkTunnelStore.java | 93 +- .../io/xpipe/core/store/SessionChain.java | 51 - .../io/xpipe/core/util/AesSecretValue.java | 42 +- .../io/xpipe/core/util/CoreJacksonModule.java | 2 +- .../xpipe/core/util/EncryptedSecretValue.java | 4 + .../xpipe/core/util/InPlaceSecretValue.java | 26 +- .../io/xpipe/core/util/JacksonExtension.java | 8 + .../io/xpipe/core/util/JacksonMapper.java | 36 +- .../io/xpipe/core/util/JacksonizedValue.java | 38 - .../io/xpipe/core/util/ModuleLayerLoader.java | 2 - .../io/xpipe/core/util/SecretReference.java | 10 - .../java/io/xpipe/core/util/SecretValue.java | 9 + .../io/xpipe/core/util/StreamCharset.java | 13 + .../java/io/xpipe/core/util/UuidHelper.java | 6 - .../io/xpipe/core/util/XPipeDaemonMode.java | 12 + core/src/main/java/module-info.java | 2 + dist/build.gradle | 3 +- dist/changelogs/14.0.md | 74 + dist/debug/debug_arguments.txt | 6 - dist/debug/linux/debug_attach_arguments.txt | 3 - dist/debug/linux/xpiped_debug.sh | 7 - dist/debug/mac/debug_attach_arguments.txt | 3 - dist/debug/mac/xpiped_debug.sh | 7 - dist/debug/windows/debug_attach_arguments.txt | 3 - dist/debug/windows/xpiped_debug.bat | 5 - dist/jpackage.gradle | 16 +- dist/licenses/jackson.properties | 2 +- dist/licenses/sentry.properties | 2 +- dist/logo/ico/logo_24x24.png | Bin 992 -> 1324 bytes dist/logo/logo.ico | Bin 167520 -> 412838 bytes .../xpipe/ext/base/SelfReferentialStore.java | 17 +- .../base/action/ChangeStoreIconAction.java | 4 +- .../ext/base/action/RunScriptActionMenu.java | 4 +- .../ext/base/action/ScanStoreAction.java | 4 +- .../xpipe/ext/base/browser/ChgrpAction.java | 49 +- .../xpipe/ext/base/browser/ChmodAction.java | 48 +- .../xpipe/ext/base/browser/ChownAction.java | 48 +- .../xpipe/ext/base/browser/NewItemAction.java | 85 +- .../ext/base/browser/OpenTerminalAction.java | 2 +- .../browser/compress/BaseCompressAction.java | 51 +- .../browser/compress/BaseUntarAction.java | 2 +- .../compress/BaseUnzipWindowsAction.java | 2 +- .../base/desktop/DesktopApplicationStore.java | 24 +- .../DesktopApplicationStoreProvider.java | 5 +- .../ext/base/desktop/DesktopBaseStore.java | 10 +- .../ext/base/desktop/DesktopCommandStore.java | 30 - .../desktop/DesktopCommandStoreProvider.java | 138 -- .../base/desktop/DesktopEnvironmentStore.java | 116 -- .../DesktopEnvironmentStoreProvider.java | 193 --- .../ext/base/identity/IdentityChoice.java | 106 ++ .../IdentityMigrationDeserializer.java | 108 ++ .../ext/base/identity/IdentitySelectComp.java | 228 +++ .../ext/base/identity/IdentityStore.java | 37 + .../base/identity/IdentityStoreProvider.java | 55 + .../ext/base/identity/IdentityValue.java | 120 ++ .../identity/LocalIdentityConvertAction.java | 69 + .../ext/base/identity/LocalIdentityStore.java | 43 + .../identity/LocalIdentityStoreProvider.java | 87 ++ .../identity/SshIdentityStateManager.java | 172 +++ .../base/identity/SshIdentityStrategy.java | 390 +++++ .../identity/SshIdentityStrategyHelper.java | 207 +++ .../base/identity/SyncedIdentityStore.java | 58 + .../identity/SyncedIdentityStoreProvider.java | 121 ++ .../ext/base/script/RunScriptAction.java | 4 +- .../ext/base/script/ScriptGroupStore.java | 8 +- .../ext/base/script/ScriptHierarchy.java | 9 +- .../io/xpipe/ext/base/script/ScriptStore.java | 18 +- .../ext/base/script/SimpleScriptStore.java | 20 +- .../script/SimpleScriptStoreProvider.java | 12 +- .../service/AbstractServiceGroupStore.java | 9 +- .../base/service/AbstractServiceStore.java | 17 +- .../service/AbstractServiceStoreProvider.java | 48 +- .../base/service/CustomServiceGroupStore.java | 8 +- .../ext/base/service/CustomServiceStore.java | 4 + .../service/CustomServiceStoreProvider.java | 7 +- .../service/FixedServiceCreatorStore.java | 4 + .../base/service/FixedServiceGroupStore.java | 4 + .../ext/base/service/FixedServiceStore.java | 9 + .../service/FixedServiceStoreProvider.java | 53 +- .../ext/base/service/MappedServiceStore.java | 15 +- .../service/MappedServiceStoreProvider.java | 59 +- .../base/service/ServiceCopyUrlAction.java | 8 +- .../ext/base/service/ServiceOpenAction.java | 46 +- .../base/service/ServiceOpenHttpAction.java | 62 - .../base/service/ServiceOpenHttpsAction.java | 62 - .../ext/base/service/ServiceProtocolType.java | 101 ++ .../service/ServiceProtocolTypeHelper.java | 68 + .../base/service/ServiceRefreshAction.java | 65 + .../ext/base/store/StoreRestartAction.java | 2 +- ext/base/src/main/java/module-info.java | 14 +- .../resources/img/localIdentity_icon-16.png | Bin 0 -> 532 bytes .../resources/img/localIdentity_icon-24.png | Bin 0 -> 800 bytes .../resources/img/localIdentity_icon-40.png | Bin 0 -> 1287 bytes .../resources/img/localIdentity_icon-80.png | Bin 0 -> 2645 bytes .../resources/img/syncedIdentity_icon-16.png | Bin 0 -> 529 bytes .../resources/img/syncedIdentity_icon-24.png | Bin 0 -> 800 bytes .../resources/img/syncedIdentity_icon-40.png | Bin 0 -> 1288 bytes .../resources/img/syncedIdentity_icon-80.png | Bin 0 -> 2641 bytes .../ext/base/resources/scripts/clink.bat | 2 +- ext/system/build.gradle | 5 + .../ext/system/incus/IncusCommandView.java | 175 +++ .../incus/IncusContainerActionMenu.java | 54 + .../incus/IncusContainerConsoleAction.java | 59 + .../incus/IncusContainerEditConfigAction.java | 59 + .../IncusContainerEditRunConfigAction.java | 71 + .../ext/system/incus/IncusContainerStore.java | 136 ++ .../incus/IncusContainerStoreProvider.java | 115 ++ .../ext/system/incus/IncusInstallStore.java | 76 + .../incus/IncusInstallStoreProvider.java | 84 ++ .../ext/system/incus/IncusScanProvider.java | 29 + .../io/xpipe/ext/system/lxd/LxdCmdStore.java | 71 + .../ext/system/lxd/LxdCmdStoreProvider.java | 84 ++ .../xpipe/ext/system/lxd/LxdCommandView.java | 187 +++ .../system/lxd/LxdContainerActionMenu.java | 54 + .../system/lxd/LxdContainerConsoleAction.java | 60 + .../lxd/LxdContainerEditConfigAction.java | 60 + .../lxd/LxdContainerEditRunConfigAction.java | 71 + .../ext/system/lxd/LxdContainerStore.java | 141 ++ .../system/lxd/LxdContainerStoreProvider.java | 112 ++ .../xpipe/ext/system/lxd/LxdScanProvider.java | 29 + .../ext/system/podman/PodmanCmdStore.java | 109 ++ .../system/podman/PodmanCmdStoreProvider.java | 84 ++ .../ext/system/podman/PodmanCommandView.java | 169 +++ .../podman/PodmanContainerActionMenu.java | 52 + .../podman/PodmanContainerAttachAction.java | 42 + .../podman/PodmanContainerInspectAction.java | 54 + .../podman/PodmanContainerLogsAction.java | 53 + .../system/podman/PodmanContainerStore.java | 171 +++ .../podman/PodmanContainerStoreProvider.java | 115 ++ .../ext/system/podman/PodmanScanProvider.java | 28 + ext/system/src/main/java/module-info.java | 42 + .../ext/system/resources/extension.properties | 1 + .../ext/system/resources/img/lxd_icon-16.png | Bin 0 -> 949 bytes .../ext/system/resources/img/lxd_icon-24.png | Bin 0 -> 1484 bytes .../ext/system/resources/img/lxd_icon-40.png | Bin 0 -> 2774 bytes .../ext/system/resources/img/lxd_icon-80.png | Bin 0 -> 5856 bytes .../system/resources/img/podman_icon-16.png | Bin 0 -> 956 bytes .../system/resources/img/podman_icon-24.png | Bin 0 -> 1618 bytes .../system/resources/img/podman_icon-40.png | Bin 0 -> 3226 bytes .../system/resources/img/podman_icon-80.png | Bin 0 -> 8111 bytes get-xpipe.sh | 10 +- .../gradle_scripts/atlantafx-base-2.0.2.jar | Bin 710026 -> 709714 bytes gradle/gradle_scripts/extension.gradle | 7 +- gradle/gradle_scripts/junit.gradle | 6 +- gradle/wrapper/gradle-wrapper.properties | 2 +- img/base/localIdentity_icon.svg | 41 + img/base/syncedIdentity_icon.svg | 41 + .../img => img}/graphics/Hips-dark.svg | 0 .../resources/img => img}/graphics/Hips.svg | 0 img/graphics/Wave-dark.svg | 170 +++ .../resources/img => img}/graphics/Wave.svg | 0 img/os/assistant-dark.svg | 11 +- img/os/assistant.svg | 11 +- img/{system => selfhst}/2fauth-light.svg | 0 img/{system => selfhst}/2fauth.svg | 0 img/{system => selfhst}/activepieces.svg | 0 .../actual-budget-light.svg | 0 img/{system => selfhst}/actual-budget.svg | 0 img/{system => selfhst}/adguard-home.svg | 0 img/{system => selfhst}/adminer-light.svg | 0 img/{system => selfhst}/adminer.svg | 0 img/selfhst/adobe-lightroom-light.svg | 16 + img/selfhst/adobe-lightroom.svg | 23 + img/selfhst/adventurelog.svg | 59 + img/{system => selfhst}/affine-light.svg | 0 img/{system => selfhst}/affine.svg | 0 img/{system => selfhst}/airtable.svg | 0 img/{system => selfhst}/akkoma-light.svg | 0 img/{system => selfhst}/akkoma.svg | 0 img/{system => selfhst}/alist.svg | 0 img/selfhst/amnezia-light.svg | 164 +++ img/selfhst/amnezia.svg | 182 +++ img/{system => selfhst}/anonaddy.svg | 0 img/{system => selfhst}/ansible-light.svg | 0 img/{system => selfhst}/ansible.svg | 0 img/{system => selfhst}/apache-answer.svg | 0 img/{system => selfhst}/appflowy.svg | 0 img/{system => selfhst}/appwrite.svg | 0 .../ara-records-ansible.svg | 0 img/{system => selfhst}/argo-cd.svg | 0 img/{system => selfhst}/asciinema.svg | 0 img/{system => selfhst}/astuto-light.svg | 0 img/{system => selfhst}/astuto.svg | 0 img/selfhst/atera-light.svg | 25 + img/selfhst/atera.svg | 25 + img/{system => selfhst}/atuin-light.svg | 0 img/{system => selfhst}/atuin.svg | 0 img/{system => selfhst}/audacity-light.svg | 0 img/{system => selfhst}/audacity.svg | 0 img/{system => selfhst}/audiobookshelf.svg | 0 img/{system => selfhst}/authelia-light.svg | 0 img/{system => selfhst}/authelia.svg | 0 img/{system => selfhst}/authentik.svg | 0 img/{system => selfhst}/authman.svg | 0 img/{system => selfhst}/autobrr.svg | 0 img/{system => selfhst}/automad-light.svg | 0 img/{system => selfhst}/automad.svg | 0 img/{system => selfhst}/azuracast.svg | 0 img/selfhst/baby-buddy-light.svg | 28 + img/selfhst/baby-buddy.svg | 28 + img/{system => selfhst}/backblaze-light.svg | 0 img/{system => selfhst}/backblaze.svg | 0 img/{system => selfhst}/backrest-light.svg | 0 img/{system => selfhst}/backrest.svg | 0 img/{system => selfhst}/bar-assistant.svg | 0 img/{system => selfhst}/baserow-light.svg | 0 img/{system => selfhst}/baserow.svg | 0 .../beaver-habit-tracker-light.svg | 0 .../beaver-habit-tracker.svg | 0 img/{system => selfhst}/beszel-light.svg | 0 img/{system => selfhst}/beszel.svg | 0 img/{system => selfhst}/biblioreads-light.svg | 0 img/{system => selfhst}/biblioreads.svg | 0 img/{system => selfhst}/bigbluebutton.svg | 0 img/{system => selfhst}/bigcapital.svg | 0 img/{system => selfhst}/bin.svg | 0 img/{system => selfhst}/bitbucket-light.svg | 0 img/{system => selfhst}/bitbucket.svg | 0 img/{system => selfhst}/bitwarden-light.svg | 0 img/{system => selfhst}/bitwarden.svg | 0 img/selfhst/bknd-light.svg | 19 + img/selfhst/bknd.svg | 21 + img/selfhst/blinko-light.svg | 24 + img/selfhst/blinko.svg | 24 + img/{system => selfhst}/blocky.svg | 0 img/{system => selfhst}/bluesky-light.svg | 0 img/{system => selfhst}/bluesky.svg | 0 img/{system => selfhst}/booklogr.svg | 0 img/{system => selfhst}/bookstack.svg | 0 img/{system => selfhst}/borg.svg | 0 img/{system => selfhst}/borgmatic-light.svg | 0 img/{system => selfhst}/borgmatic.svg | 0 .../broadcastchannel-light.svg | 0 img/{system => selfhst}/broadcastchannel.svg | 0 img/{system => selfhst}/brother-light.svg | 0 img/{system => selfhst}/brother.svg | 0 img/{system => selfhst}/budgetbee.svg | 0 img/{system => selfhst}/budibase.svg | 0 img/{system => selfhst}/bunkerweb-light.svg | 0 img/{system => selfhst}/bunkerweb.svg | 0 img/{system => selfhst}/caddy.svg | 0 img/{system => selfhst}/cal-com-light.svg | 0 img/{system => selfhst}/cal-com.svg | 0 img/{system => selfhst}/calibre-web-light.svg | 0 img/{system => selfhst}/calibre-web.svg | 0 img/{system => selfhst}/calibre.svg | 0 img/{system => selfhst}/caprover-light.svg | 0 img/{system => selfhst}/caprover.svg | 0 img/{system => selfhst}/castopod.svg | 0 .../changedetection-light.svg | 0 img/{system => selfhst}/changedetection.svg | 0 img/{system => selfhst}/channels-dvr.svg | 0 img/selfhst/checkmate-light.svg | 16 + img/selfhst/checkmate.svg | 19 + img/selfhst/checkmk-light.svg | 16 + img/selfhst/checkmk.svg | 16 + img/{system => selfhst}/chevereto.svg | 0 img/{system => selfhst}/chirpy.svg | 0 img/{system => selfhst}/chromium.svg | 0 img/selfhst/clamav.svg | 70 + img/selfhst/claude-light.svg | 23 + img/selfhst/claude.svg | 23 + img/{system => selfhst}/clickhouse.svg | 0 img/{system => selfhst}/cloudbeaver.svg | 0 img/{system => selfhst}/cloudflare.svg | 0 img/{system => selfhst}/cockpit-light.svg | 0 img/{system => selfhst}/cockpit.svg | 0 img/{system => selfhst}/codeberg.svg | 0 img/{system => selfhst}/coder-light.svg | 0 img/{system => selfhst}/coder.svg | 0 img/selfhst/coinmarketcap-blue.svg | 33 + img/selfhst/coinmarketcap-light.svg | 23 + img/selfhst/coinmarketcap.svg | 23 + img/{system => selfhst}/commafeed-light.svg | 0 img/{system => selfhst}/commafeed.svg | 0 img/{system => selfhst}/commento-light.svg | 0 img/{system => selfhst}/commento.svg | 0 img/{system => selfhst}/compreface-light.svg | 0 img/{system => selfhst}/compreface.svg | 0 img/{system => selfhst}/confluence.svg | 0 img/{system => selfhst}/converse-light.svg | 0 img/{system => selfhst}/converse.svg | 0 img/{system => selfhst}/coolify.svg | 0 img/{system => selfhst}/couchdb-light.svg | 0 img/{system => selfhst}/couchdb.svg | 0 img/{system => selfhst}/counter-analytics.svg | 0 img/selfhst/crafty-controller-light.svg | 14 + img/selfhst/crafty-controller.svg | 20 + img/{system => selfhst}/crowdsec.svg | 0 img/{system => selfhst}/cryptpad.svg | 0 img/{system => selfhst}/ctfreak.svg | 0 img/selfhst/cups-light.svg | 49 + img/selfhst/cups.svg | 46 + img/{system => selfhst}/cyberchef.svg | 0 img/{system => selfhst}/czkawka.svg | 0 img/{system => selfhst}/dalibo-light.svg | 0 img/{system => selfhst}/dalibo.svg | 0 img/{system => selfhst}/davical.svg | 0 img/{system => selfhst}/dawarich.svg | 0 img/{system => selfhst}/ddclient.svg | 0 img/{system => selfhst}/ddns-updater.svg | 0 img/{system => selfhst}/defguard.svg | 0 img/{system => selfhst}/deluge.svg | 0 img/selfhst/deployarr-light.svg | 22 + img/selfhst/deployarr.svg | 31 + img/selfhst/dfir-iris-light.svg | 13 + img/selfhst/dfir-iris.svg | 13 + .../digitalocean-light.svg | 0 img/{system => selfhst}/digitalocean.svg | 0 img/{system => selfhst}/dillinger-light.svg | 0 img/{system => selfhst}/dillinger.svg | 0 img/{system => selfhst}/docassemble-light.svg | 0 img/{system => selfhst}/docassemble.svg | 0 img/{system => selfhst}/docker-light.svg | 0 .../docker-volume-backup.svg | 0 img/{system => selfhst}/docker.svg | 0 img/{system => selfhst}/dockge.svg | 0 .../docking-station-light.svg | 0 img/{system => selfhst}/docking-station.svg | 0 img/{system => selfhst}/docspell.svg | 0 img/{system => selfhst}/documenso-light.svg | 0 img/{system => selfhst}/documenso.svg | 0 img/{system => selfhst}/docusaurus.svg | 0 img/{system => selfhst}/docuseal.svg | 0 img/{system => selfhst}/dokemon.svg | 0 img/{system => selfhst}/dokuwiki.svg | 0 img/selfhst/donetick.svg | 272 ++++ img/{system => selfhst}/double-take.svg | 0 img/{system => selfhst}/dovecot.svg | 0 img/selfhst/dozzle-light.svg | 20 + img/selfhst/dozzle.svg | 20 + img/{system => selfhst}/draw-io.svg | 0 img/{system => selfhst}/dropbox-light.svg | 0 img/{system => selfhst}/dropbox.svg | 0 img/{system => selfhst}/dropout.svg | 0 img/{system => selfhst}/dub-light.svg | 0 img/{system => selfhst}/dub.svg | 0 img/{system => selfhst}/duckdns.svg | 0 img/{system => selfhst}/duplicati.svg | 0 img/{system => selfhst}/element.svg | 0 img/{system => selfhst}/eleventy-light.svg | 0 img/{system => selfhst}/eleventy.svg | 0 img/{system => selfhst}/elysian.svg | 0 img/{system => selfhst}/emby.svg | 0 img/{system => selfhst}/emulatorjs.svg | 0 img/{system => selfhst}/enclosed-light.svg | 0 img/{system => selfhst}/enclosed.svg | 0 img/{system => selfhst}/endless-light.svg | 0 img/{system => selfhst}/endless.svg | 0 img/{system => selfhst}/endurain.svg | 0 img/{system => selfhst}/epic-games-light.svg | 0 img/{system => selfhst}/epic-games.svg | 0 img/selfhst/ersatztv-light.svg | 21 + img/selfhst/ersatztv.svg | 23 + img/{system => selfhst}/esphome-light.svg | 0 img/{system => selfhst}/esphome.svg | 0 img/selfhst/espocrm-light.svg | 14 + img/selfhst/espocrm.svg | 18 + img/{system => selfhst}/etesync.svg | 0 img/selfhst/etherpad.svg | 42 + img/{system => selfhst}/evcc-light.svg | 0 img/{system => selfhst}/evcc.svg | 0 img/{system => selfhst}/excalidraw.svg | 0 img/selfhst/falcon-player-light.svg | 15 + img/selfhst/falcon-player.svg | 21 + img/{system => selfhst}/fasten-health.svg | 0 img/{system => selfhst}/fastmail.svg | 0 img/{system => selfhst}/feedbase-light.svg | 0 img/{system => selfhst}/feedbase.svg | 0 img/{system => selfhst}/feedbin-light.svg | 0 img/{system => selfhst}/feedbin.svg | 0 img/{system => selfhst}/feedly-light.svg | 0 img/{system => selfhst}/feedly.svg | 0 img/{system => selfhst}/feedlynx.svg | 0 img/{system => selfhst}/fenrus.svg | 0 img/{system => selfhst}/ferdium-light.svg | 0 img/{system => selfhst}/ferdium.svg | 0 img/{system => selfhst}/ferretdb-light.svg | 0 img/{system => selfhst}/ferretdb.svg | 0 img/{system => selfhst}/fider-light.svg | 0 img/{system => selfhst}/fider.svg | 0 img/{system => selfhst}/file-browser.svg | 0 img/{system => selfhst}/fileflows.svg | 0 img/{system => selfhst}/filerun-light.svg | 0 img/{system => selfhst}/filerun.svg | 0 img/{system => selfhst}/filestash.svg | 0 img/{system => selfhst}/firefly-iii.svg | 0 img/{system => selfhst}/fittrackee.svg | 0 img/{system => selfhst}/fladder-light.svg | 0 img/{system => selfhst}/fladder.svg | 0 img/{system => selfhst}/flaresolverr.svg | 0 img/{system => selfhst}/flarum.svg | 0 img/selfhst/flashpaper-light.svg | 16 + img/selfhst/flashpaper.svg | 16 + img/{system => selfhst}/flatnotes-light.svg | 0 img/{system => selfhst}/flatnotes.svg | 0 img/selfhst/fli-so-light.svg | 19 + img/selfhst/fli-so.svg | 20 + .../flightradar24-light.svg | 0 img/{system => selfhst}/flightradar24.svg | 0 img/selfhst/flood-light.svg | 13 + img/selfhst/flood.svg | 21 + img/{system => selfhst}/fluffychat-light.svg | 0 img/{system => selfhst}/fluffychat.svg | 0 img/{system => selfhst}/fluidd-light.svg | 0 img/{system => selfhst}/fluidd.svg | 0 img/{system => selfhst}/forgejo.svg | 0 img/{system => selfhst}/formbricks-light.svg | 0 img/{system => selfhst}/formbricks.svg | 0 img/{system => selfhst}/forte-light.svg | 0 img/{system => selfhst}/forte.svg | 0 img/selfhst/freefinance.svg | 18 + img/{system => selfhst}/freeipa.svg | 0 img/selfhst/freeradius.svg | 33 + img/{system => selfhst}/freshrss.svg | 0 img/{system => selfhst}/friendica.svg | 0 img/{system => selfhst}/frigate-light.svg | 0 img/{system => selfhst}/frigate.svg | 0 img/selfhst/fritz.svg | 249 ++++ img/{system => selfhst}/funkwhale-light.svg | 0 img/{system => selfhst}/funkwhale.svg | 0 img/{system => selfhst}/fusionauth-light.svg | 0 img/{system => selfhst}/fusionauth.svg | 0 img/{system => selfhst}/garage.svg | 0 img/{system => selfhst}/gatsby.svg | 0 img/{system => selfhst}/gatus.svg | 0 img/{system => selfhst}/ghostfolio.svg | 0 img/{system => selfhst}/gitea.svg | 0 img/{system => selfhst}/gitlab.svg | 0 img/selfhst/gladys-assistant.svg | 38 + img/{system => selfhst}/glance-light.svg | 0 img/{system => selfhst}/glance.svg | 0 img/{system => selfhst}/glances-light.svg | 0 img/{system => selfhst}/glances.svg | 0 img/{system => selfhst}/glpi.svg | 0 img/{system => selfhst}/goaccess-light.svg | 0 img/{system => selfhst}/goaccess.svg | 0 img/{system => selfhst}/gotify.svg | 0 img/{system => selfhst}/gotosocial.svg | 0 img/selfhst/grafana-alloy-light.svg | 23 + img/selfhst/grafana-alloy.svg | 23 + img/{system => selfhst}/grafana.svg | 0 img/{system => selfhst}/gramps.svg | 0 img/{system => selfhst}/grav-light.svg | 0 img/{system => selfhst}/grav.svg | 0 img/selfhst/graylog-light.svg | 18 + img/selfhst/graylog.svg | 18 + img/{system => selfhst}/grimoire.svg | 0 img/{system => selfhst}/grist.svg | 0 img/{system => selfhst}/grocy.svg | 0 img/{system => selfhst}/haproxy.svg | 0 img/{system => selfhst}/haptic-light.svg | 0 img/{system => selfhst}/haptic.svg | 0 img/selfhst/hauk-light.svg | 51 + img/selfhst/hauk.svg | 51 + img/{system => selfhst}/hdhomerun-light.svg | 0 img/{system => selfhst}/hdhomerun.svg | 0 img/{system => selfhst}/headscale.svg | 0 .../healthchecks-light.svg | 0 img/{system => selfhst}/healthchecks.svg | 0 img/{system => selfhst}/hedgedoc.svg | 0 img/{system => selfhst}/heimdall-light.svg | 0 img/{system => selfhst}/heimdall.svg | 0 img/selfhst/hemmelig-light.svg | 115 ++ img/selfhst/hemmelig.svg | 115 ++ img/{system => selfhst}/heyform.svg | 0 img/{system => selfhst}/hivedav.svg | 0 img/{system => selfhst}/hoarder-light.svg | 0 img/{system => selfhst}/hoarder.svg | 0 img/{system => selfhst}/hollo-light.svg | 0 img/{system => selfhst}/hollo.svg | 0 img/{system => selfhst}/homarr.svg | 0 .../home-assistant-light.svg | 0 img/{system => selfhst}/home-assistant.svg | 0 img/{system => selfhst}/homebox.svg | 0 img/{system => selfhst}/homebridge-light.svg | 0 img/{system => selfhst}/homebridge.svg | 0 img/{system => selfhst}/homer.svg | 0 img/selfhst/hoodik.svg | 201 +++ img/{system => selfhst}/hoppscotch-light.svg | 0 img/{system => selfhst}/hoppscotch.svg | 0 img/{system => selfhst}/hubzilla-light.svg | 0 img/{system => selfhst}/hubzilla.svg | 0 img/{system => selfhst}/huginn.svg | 0 img/{system => selfhst}/hugo.svg | 0 img/{system => selfhst}/humhub.svg | 0 img/{system => selfhst}/hyperpipe-light.svg | 0 img/{system => selfhst}/hyperpipe.svg | 0 img/selfhst/i-librarian-light.svg | 38 + img/selfhst/i-librarian.svg | 38 + img/selfhst/icinga-light.svg | 40 + img/selfhst/icinga.svg | 41 + img/selfhst/immich-frame-light.svg | 26 + img/selfhst/immich-frame.svg | 30 + img/{system => selfhst}/immich-kiosk.svg | 0 img/selfhst/immich-public-proxy-light.svg | 37 + img/selfhst/immich-public-proxy.svg | 39 + img/{system => selfhst}/immich.svg | 0 img/{system => selfhst}/influxdb.svg | 0 img/{system => selfhst}/inoreader-light.svg | 0 img/{system => selfhst}/inoreader.svg | 0 img/{system => selfhst}/inventree.svg | 0 img/selfhst/investbrain-light.svg | 127 ++ img/selfhst/investbrain.svg | 116 ++ img/{system => selfhst}/invidious.svg | 0 .../invoice-ninja-light.svg | 0 img/{system => selfhst}/invoice-ninja.svg | 0 img/{system => selfhst}/it-tools-light.svg | 0 img/{system => selfhst}/it-tools.svg | 0 img/{system => selfhst}/jackett-light.svg | 0 img/{system => selfhst}/jackett.svg | 0 img/{system => selfhst}/jekyll.svg | 0 img/{system => selfhst}/jellyfin-light.svg | 0 img/{system => selfhst}/jellyfin.svg | 0 img/{system => selfhst}/jellyseerr.svg | 0 img/{system => selfhst}/jenkins.svg | 0 img/{system => selfhst}/jira.svg | 0 img/{system => selfhst}/jitsi-meet.svg | 0 img/{system => selfhst}/jwt-io-light.svg | 0 img/{system => selfhst}/jwt-io.svg | 0 img/{system => selfhst}/kanboard-light.svg | 0 img/{system => selfhst}/kanboard.svg | 0 img/{system => selfhst}/kanidm.svg | 0 img/{system => selfhst}/kapowarr.svg | 0 img/{system => selfhst}/kavita.svg | 0 img/{system => selfhst}/kbin.svg | 0 img/{system => selfhst}/keepassxc.svg | 0 img/{system => selfhst}/keila.svg | 0 img/{system => selfhst}/kestra.svg | 0 img/{system => selfhst}/keycloak.svg | 0 img/{system => selfhst}/kimai.svg | 0 img/{system => selfhst}/klipper-light.svg | 0 img/{system => selfhst}/klipper.svg | 0 img/selfhst/ko-fi.svg | 42 + img/{system => selfhst}/kodi-light.svg | 0 img/{system => selfhst}/kodi.svg | 0 img/{system => selfhst}/komga.svg | 0 img/{system => selfhst}/kontoj.svg | 0 img/{system => selfhst}/kopia-light.svg | 0 img/{system => selfhst}/kopia.svg | 0 img/{system => selfhst}/krakend.svg | 0 img/{system => selfhst}/kyoo-light.svg | 0 img/{system => selfhst}/kyoo.svg | 0 img/selfhst/ladder-light.svg | 22 + img/selfhst/ladder.svg | 22 + .../lancommander-light.svg | 0 img/{system => selfhst}/lancommander.svg | 0 img/selfhst/leantime-light.svg | 15 + img/{system => selfhst}/leantime.svg | 0 .../lets-encrypt-light.svg | 0 img/{system => selfhst}/lets-encrypt.svg | 0 img/{system => selfhst}/librespeed.svg | 0 img/{system => selfhst}/librewolf-light.svg | 0 img/{system => selfhst}/librewolf.svg | 0 img/{system => selfhst}/librum.svg | 0 img/{system => selfhst}/lidarr.svg | 0 img/{system => selfhst}/limesurvey.svg | 0 img/{system => selfhst}/linguacafe.svg | 0 img/{system => selfhst}/linkace-light.svg | 0 img/{system => selfhst}/linkace.svg | 0 img/{system => selfhst}/linkding.svg | 0 img/{system => selfhst}/linkstack.svg | 0 img/selfhst/linuxcontainers.svg | 156 ++ img/{system => selfhst}/linuxgsm-light.svg | 0 img/{system => selfhst}/linuxgsm.svg | 0 img/{system => selfhst}/linuxserver-io.svg | 0 img/{system => selfhst}/listmonk.svg | 0 img/selfhst/localess-light.svg | 14 + img/selfhst/localess.svg | 22 + img/{system => selfhst}/lodestone.svg | 0 img/{system => selfhst}/logseq.svg | 0 img/{system => selfhst}/logto.svg | 0 img/{system => selfhst}/loki.svg | 0 img/{system => selfhst}/lunasea.svg | 0 img/selfhst/lyrion-media-server-light.svg | 19 + img/selfhst/lyrion-media-server.svg | 43 + img/{system => selfhst}/mail-in-a-box.svg | 0 img/{system => selfhst}/mailcow.svg | 0 img/selfhst/mailpit-light.svg | 17 + img/selfhst/mailpit.svg | 17 + img/{system => selfhst}/mainsail-light.svg | 0 img/{system => selfhst}/mainsail.svg | 0 img/selfhst/maloja-light.svg | 30 + img/selfhst/maloja.svg | 31 + img/{system => selfhst}/manyfold.svg | 0 img/{system => selfhst}/mariadb.svg | 0 img/{system => selfhst}/mastodon.svg | 0 img/{system => selfhst}/matomo.svg | 0 img/{system => selfhst}/matrix-light.svg | 0 img/{system => selfhst}/matrix.svg | 0 img/{system => selfhst}/mattermost-light.svg | 0 img/{system => selfhst}/mattermost.svg | 0 img/{system => selfhst}/mautic-light.svg | 0 img/{system => selfhst}/mautic.svg | 0 img/{system => selfhst}/mayan-edms-light.svg | 0 img/{system => selfhst}/mayan-edms.svg | 0 img/{system => selfhst}/maybe.svg | 0 img/{system => selfhst}/mbin.svg | 0 img/{system => selfhst}/mealie-light.svg | 0 img/{system => selfhst}/mealie.svg | 0 img/{system => selfhst}/medama.svg | 0 img/selfhst/medassist-light.svg | 32 + img/selfhst/medassist.svg | 33 + img/selfhst/mediathekview.svg | 116 ++ img/{system => selfhst}/mediux-light.svg | 0 img/{system => selfhst}/mediux.svg | 0 img/{system => selfhst}/medusa-light.svg | 0 img/{system => selfhst}/medusa.svg | 0 img/{system => selfhst}/meilisearch-light.svg | 0 img/{system => selfhst}/meilisearch.svg | 0 img/{system => selfhst}/memories-light.svg | 0 img/{system => selfhst}/memories.svg | 0 img/{system => selfhst}/mergeable.svg | 0 img/{system => selfhst}/meshping-light.svg | 0 img/{system => selfhst}/meshping.svg | 0 img/selfhst/meshtastic-light.svg | 11 + img/selfhst/meshtastic.svg | 20 + img/{system => selfhst}/metabase.svg | 0 img/{system => selfhst}/metube.svg | 0 img/{system => selfhst}/minecraft.svg | 0 img/{system => selfhst}/miniflux-light.svg | 0 img/{system => selfhst}/miniflux.svg | 0 img/{system => selfhst}/minio-light.svg | 0 img/{system => selfhst}/minio.svg | 0 img/{system => selfhst}/mirotalk.svg | 0 img/{system => selfhst}/misskey-light.svg | 0 img/{system => selfhst}/misskey.svg | 0 img/selfhst/mitmproxy-light.svg | 41 + img/selfhst/mitmproxy.svg | 39 + img/{system => selfhst}/mitra-light.svg | 0 img/{system => selfhst}/mitra.svg | 0 img/{system => selfhst}/mixpost.svg | 0 img/{system => selfhst}/mobilizon.svg | 0 img/{system => selfhst}/mongodb.svg | 0 img/{system => selfhst}/monica-light.svg | 0 img/{system => selfhst}/monica.svg | 0 img/{system => selfhst}/morphos.svg | 0 img/{system => selfhst}/mosquitto.svg | 0 img/{system => selfhst}/motioneye.svg | 0 img/{system => selfhst}/mqtt-light.svg | 0 img/{system => selfhst}/mqtt.svg | 0 img/{system => selfhst}/mullvad-vpn.svg | 0 .../multi-scrobbler-light.svg | 0 img/{system => selfhst}/multi-scrobbler.svg | 0 img/{system => selfhst}/mumble.svg | 0 .../music-assistant-light.svg | 0 img/{system => selfhst}/music-assistant.svg | 0 img/selfhst/mxroute-light.svg | 11 + img/selfhst/mxroute.svg | 16 + img/{system => selfhst}/myheats-light.svg | 0 img/{system => selfhst}/myheats.svg | 0 img/{system => selfhst}/mysql-light.svg | 0 img/{system => selfhst}/mysql.svg | 0 img/{system => selfhst}/n8n.svg | 0 img/{system => selfhst}/nasa.svg | 0 img/{system => selfhst}/navidrome.svg | 0 img/{system => selfhst}/neko-light.svg | 0 img/{system => selfhst}/neko.svg | 0 img/{system => selfhst}/neodb.svg | 0 img/{system => selfhst}/netalertx.svg | 0 img/{system => selfhst}/netbird.svg | 0 img/{system => selfhst}/netboot-xyz-light.svg | 0 img/{system => selfhst}/netboot-xyz.svg | 0 img/selfhst/netbox-light.svg | 22 + img/selfhst/netbox.svg | 22 + img/{system => selfhst}/netdata-light.svg | 0 img/{system => selfhst}/netdata.svg | 0 img/{system => selfhst}/netgear-light.svg | 0 img/{system => selfhst}/netgear.svg | 0 img/{system => selfhst}/netlify.svg | 0 img/selfhst/new-releases-light.svg | 25 + img/selfhst/new-releases.svg | 26 + img/{system => selfhst}/newsblur.svg | 0 img/selfhst/nextbeats.svg | 222 +++ img/{system => selfhst}/nextcloud-light.svg | 0 .../nextcloud-news-light.svg | 0 img/{system => selfhst}/nextcloud-news.svg | 0 .../nextcloud-social-light.svg | 0 img/{system => selfhst}/nextcloud-social.svg | 0 .../nextcloud-tables-light.svg | 0 img/{system => selfhst}/nextcloud-tables.svg | 0 img/{system => selfhst}/nextcloud.svg | 0 img/{system => selfhst}/nextcloudpi-light.svg | 0 img/{system => selfhst}/nextcloudpi.svg | 0 img/{system => selfhst}/nginx-light.svg | 0 .../nginx-proxy-manager.svg | 0 img/{system => selfhst}/nginx.svg | 0 img/{system => selfhst}/nightscout-light.svg | 0 img/{system => selfhst}/nightscout.svg | 0 img/selfhst/njalla-light.svg | 19 + img/selfhst/njalla.svg | 19 + img/selfhst/nocobase-light.svg | 26 + img/selfhst/nocobase.svg | 23 + img/{system => selfhst}/nocodb-light.svg | 0 img/{system => selfhst}/nocodb.svg | 0 img/{system => selfhst}/node-red.svg | 0 img/{system => selfhst}/nodebb.svg | 0 img/{system => selfhst}/nordvpn-light.svg | 0 img/{system => selfhst}/nordvpn.svg | 0 img/{system => selfhst}/note-mark.svg | 0 img/{system => selfhst}/notesnook-light.svg | 0 img/{system => selfhst}/notesnook.svg | 0 img/{system => selfhst}/notion-light.svg | 0 img/{system => selfhst}/notion.svg | 0 img/selfhst/novu-light.svg | 14 + img/selfhst/novu.svg | 19 + img/{system => selfhst}/ntfy-light.svg | 0 img/{system => selfhst}/ntfy.svg | 0 img/{system => selfhst}/obsidian.svg | 0 img/{system => selfhst}/obtainium.svg | 0 img/{system => selfhst}/octoprint.svg | 0 img/{system => selfhst}/olivetin.svg | 0 img/selfhst/ollama-light.svg | 62 + img/selfhst/ollama.svg | 64 + img/{system => selfhst}/omada.svg | 0 img/{system => selfhst}/ombi.svg | 0 img/{system => selfhst}/omnivore.svg | 0 img/{system => selfhst}/onedev-light.svg | 0 img/{system => selfhst}/onedev.svg | 0 img/{system => selfhst}/oneuptime-light.svg | 0 img/{system => selfhst}/oneuptime.svg | 0 .../open-source-initiative-light.svg | 0 .../open-source-initiative.svg | 0 img/selfhst/openbooks-light.svg | 15 + img/selfhst/openbooks.svg | 15 + .../openchangelog-light.svg | 0 img/{system => selfhst}/openchangelog.svg | 0 img/{system => selfhst}/openemr-light.svg | 0 img/{system => selfhst}/openemr.svg | 0 img/selfhst/opengist-light.svg | 27 + img/selfhst/opengist.svg | 29 + img/{system => selfhst}/openldap.svg | 0 .../openmediavault-light.svg | 0 img/{system => selfhst}/openmediavault.svg | 0 img/{system => selfhst}/openpanel-light.svg | 0 img/{system => selfhst}/openpanel.svg | 0 img/selfhst/openprinting-cups.svg | 52 + img/{system => selfhst}/openreads.svg | 0 img/selfhst/opensearch-light.svg | 16 + img/selfhst/opensearch.svg | 17 + .../openspeedtest-light.svg | 0 img/{system => selfhst}/openspeedtest.svg | 0 img/{system => selfhst}/opentalk.svg | 0 img/{system => selfhst}/opentofu-light.svg | 0 img/{system => selfhst}/opentofu.svg | 0 img/{system => selfhst}/openvpn-light.svg | 0 img/{system => selfhst}/openvpn.svg | 0 img/{system => selfhst}/openwrt-light.svg | 0 img/{system => selfhst}/openwrt.svg | 0 img/{system => selfhst}/opnform-light.svg | 0 img/{system => selfhst}/opnform.svg | 0 img/{system => selfhst}/opnsense.svg | 0 img/{system => selfhst}/outline.svg | 0 img/{system => selfhst}/overleaf.svg | 0 img/{system => selfhst}/overseerr.svg | 0 img/{system => selfhst}/owncast.svg | 0 img/{system => selfhst}/owncloud-light.svg | 0 img/{system => selfhst}/owncloud.svg | 0 img/{system => selfhst}/owntone.svg | 0 img/selfhst/owntracks.svg | 32 + img/{system => selfhst}/oxker.svg | 0 .../paperless-ngx-light.svg | 0 img/{system => selfhst}/paperless-ngx.svg | 0 img/{system => selfhst}/papermark-light.svg | 0 img/{system => selfhst}/papermark.svg | 0 img/{system => selfhst}/papermerge.svg | 0 img/{system => selfhst}/parseable.svg | 0 img/{system => selfhst}/passbolt.svg | 0 img/selfhst/patreon-light.svg | 13 + img/selfhst/patreon.svg | 10 + img/{system => selfhst}/payload-light.svg | 0 img/{system => selfhst}/payload.svg | 0 img/{system => selfhst}/pdfding-light.svg | 0 img/{system => selfhst}/pdfding.svg | 0 img/{system => selfhst}/peanut.svg | 0 img/{system => selfhst}/peertube.svg | 0 img/{system => selfhst}/pelican-panel.svg | 0 img/{system => selfhst}/penpot-light.svg | 0 img/{system => selfhst}/penpot.svg | 0 img/{system => selfhst}/peppermint.svg | 0 img/{system => selfhst}/pepperminty-wiki.svg | 0 img/{system => selfhst}/pfsense-light.svg | 0 img/{system => selfhst}/pfsense.svg | 0 img/{system => selfhst}/pg-back-web.svg | 0 img/{system => selfhst}/phanpy-light.svg | 0 img/{system => selfhst}/phanpy.svg | 0 img/{system => selfhst}/phorge-light.svg | 0 img/{system => selfhst}/phorge.svg | 0 img/{system => selfhst}/photopea-light.svg | 0 img/{system => selfhst}/photopea.svg | 0 img/{system => selfhst}/photoprism.svg | 0 img/{system => selfhst}/photoview.svg | 0 img/{system => selfhst}/pi-hole.svg | 0 img/selfhst/pigallery2-light.svg | 75 + img/selfhst/pigallery2.svg | 80 ++ img/{system => selfhst}/pikapods-light.svg | 0 img/{system => selfhst}/pikapods.svg | 0 img/{system => selfhst}/pingvin-share.svg | 0 img/{system => selfhst}/pinkary.svg | 0 img/{system => selfhst}/piped.svg | 0 img/{system => selfhst}/piwigo.svg | 0 img/{system => selfhst}/pixelfed.svg | 0 img/{system => selfhst}/plane.svg | 0 img/{system => selfhst}/planka-light.svg | 0 img/{system => selfhst}/planka.svg | 0 img/{system => selfhst}/plausible.svg | 0 img/{system => selfhst}/pleroma.svg | 0 img/{system => selfhst}/plex-rewind.svg | 0 img/{system => selfhst}/plex.svg | 0 img/selfhst/plikshare.svg | 94 ++ .../pocket-casts-light.svg | 0 img/{system => selfhst}/pocket-casts.svg | 0 img/{system => selfhst}/pocket-id-light.svg | 0 img/{system => selfhst}/pocket-id.svg | 0 img/{system => selfhst}/podfetch-light.svg | 0 img/{system => selfhst}/podfetch.svg | 0 img/{system => selfhst}/podman.svg | 0 img/selfhst/portainer-light.svg | 25 + img/selfhst/portainer.svg | 25 + img/{system => selfhst}/postal.svg | 0 img/{system => selfhst}/postgresql.svg | 0 img/{system => selfhst}/posthog.svg | 0 img/{system => selfhst}/postiz-light.svg | 0 img/{system => selfhst}/postiz.svg | 0 .../private-internet-access.svg | 0 img/{system => selfhst}/privatebin.svg | 0 img/{system => selfhst}/projectsend.svg | 0 img/{system => selfhst}/prometheus.svg | 0 img/{system => selfhst}/proton-calendar.svg | 0 img/{system => selfhst}/proton-drive.svg | 0 img/{system => selfhst}/proton-pass.svg | 0 img/{system => selfhst}/proton-vpn.svg | 0 img/{system => selfhst}/protonmail.svg | 0 img/{system => selfhst}/prowlarr.svg | 0 img/{system => selfhst}/proxmox-light.svg | 0 img/{system => selfhst}/proxmox.svg | 0 img/selfhst/psitransfer-light.svg | 17 + img/selfhst/psitransfer.svg | 19 + img/{system => selfhst}/pterodactyl.svg | 0 img/{system => selfhst}/pushover-light.svg | 0 img/{system => selfhst}/pushover.svg | 0 img/{system => selfhst}/pyload.svg | 0 img/{system => selfhst}/python-light.svg | 0 img/{system => selfhst}/python.svg | 0 img/{system => selfhst}/qbittorrent.svg | 0 img/{system => selfhst}/qnap-light.svg | 0 img/{system => selfhst}/qnap.svg | 0 img/{system => selfhst}/quickwit.svg | 0 img/selfhst/radarr-4k-light.svg | 31 + img/selfhst/radarr-4k.svg | 32 + img/selfhst/radarr-anime-light.svg | 36 + img/selfhst/radarr-anime.svg | 34 + img/{system => selfhst}/radarr-light.svg | 0 img/selfhst/radarr-v1.svg | 234 +++ img/{system => selfhst}/radarr.svg | 0 img/{system => selfhst}/radicale.svg | 0 img/selfhst/raindrop-io.svg | 60 + img/{system => selfhst}/rallly-light.svg | 0 img/{system => selfhst}/rallly.svg | 0 img/selfhst/rancher-desktop-light.svg | 15 + img/selfhst/rancher-desktop.svg | 19 + img/selfhst/rancher-epinio-light.svg | 18 + img/selfhst/rancher-epinio.svg | 20 + img/selfhst/rancher-fleet-light.svg | 20 + img/selfhst/rancher-fleet.svg | 25 + img/selfhst/rancher-harvester-light.svg | 41 + img/selfhst/rancher-harvester.svg | 42 + img/selfhst/rancher-hypper-light.svg | 14 + img/selfhst/rancher-hypper.svg | 17 + img/selfhst/rancher-k3os-light.svg | 23 + img/selfhst/rancher-k3os.svg | 23 + img/selfhst/rancher-k3s-light.svg | 16 + img/selfhst/rancher-k3s.svg | 16 + img/selfhst/rancher-kubewarden-light.svg | 20 + img/selfhst/rancher-kubewarden.svg | 19 + img/{system => selfhst}/rancher-light.svg | 0 img/selfhst/rancher-longhorn-light.svg | 17 + img/selfhst/rancher-longhorn.svg | 17 + img/selfhst/rancher-opni-light.svg | 29 + img/selfhst/rancher-opni.svg | 26 + img/selfhst/rancher-rio-light.svg | 16 + img/selfhst/rancher-rio.svg | 16 + img/selfhst/rancher-rke-light.svg | 23 + img/selfhst/rancher-rke.svg | 30 + img/selfhst/rancher-submariner-light.svg | 14 + img/selfhst/rancher-submariner.svg | 14 + img/{system => selfhst}/rancher.svg | 0 img/{system => selfhst}/raspberry-pi.svg | 0 img/{system => selfhst}/rclone.svg | 0 .../reactive-resume-light.svg | 0 img/{system => selfhst}/reactive-resume.svg | 0 img/{system => selfhst}/readarr.svg | 0 img/{system => selfhst}/readeck.svg | 0 img/{system => selfhst}/receipt-wrangler.svg | 0 img/{system => selfhst}/recipesage.svg | 0 img/{system => selfhst}/redict.svg | 0 img/selfhst/redis.svg | 37 + img/selfhst/redlib-light.svg | 10 + img/selfhst/redlib.svg | 15 + img/selfhst/redmine-light.svg | 24 + img/selfhst/redmine.svg | 28 + img/{system => selfhst}/reolink-light.svg | 0 img/{system => selfhst}/reolink.svg | 0 img/{system => selfhst}/requestly.svg | 0 img/selfhst/resilio-sync-light.svg | 26 + img/selfhst/resilio-sync.svg | 43 + img/{system => selfhst}/restreamer.svg | 0 img/{system => selfhst}/revolt-light.svg | 0 img/{system => selfhst}/revolt.svg | 0 img/{system => selfhst}/rhasspy.svg | 0 img/{system => selfhst}/richy.svg | 0 .../riverside-fm-light.svg | 0 img/{system => selfhst}/riverside-fm.svg | 0 img/{system => selfhst}/rocket-chat.svg | 0 img/{system => selfhst}/romm.svg | 0 img/{system => selfhst}/roundcube.svg | 0 img/{system => selfhst}/rss-bridge.svg | 0 img/{system => selfhst}/rss-translator.svg | 0 img/{system => selfhst}/rundeck.svg | 0 img/{system => selfhst}/runson-light.svg | 0 img/{system => selfhst}/runson.svg | 0 img/{system => selfhst}/sabnzbd.svg | 0 img/selfhst/safeline.svg | 85 ++ img/{system => selfhst}/saltcorn.svg | 0 img/selfhst/scratch-map-light.svg | 15 + img/selfhst/scratch-map.svg | 15 + img/{system => selfhst}/scrutiny-light.svg | 0 img/{system => selfhst}/scrutiny.svg | 0 img/{system => selfhst}/seafile.svg | 0 img/{system => selfhst}/searxng-light.svg | 0 img/{system => selfhst}/searxng.svg | 0 .../secureai-tools-light.svg | 0 img/{system => selfhst}/secureai-tools.svg | 0 img/selfhst/seedsync.svg | 29 + img/{system => selfhst}/seelf.svg | 0 .../self-hosted-gateway.svg | 0 img/{system => selfhst}/selfh-st-light.svg | 0 img/{system => selfhst}/selfh-st.svg | 0 img/selfhst/semaphore-ui-light.svg | 14 + img/selfhst/semaphore-ui.svg | 24 + img/{system => selfhst}/sendgrid.svg | 0 img/{system => selfhst}/servarr-light.svg | 0 img/{system => selfhst}/servarr.svg | 0 img/{system => selfhst}/shaarli.svg | 0 img/{system => selfhst}/shellhub-light.svg | 0 img/{system => selfhst}/shellhub.svg | 0 img/{system => selfhst}/shlink.svg | 0 .../shoko-server-light.svg | 0 img/{system => selfhst}/shoko-server.svg | 0 img/{system => selfhst}/signal-light.svg | 0 img/{system => selfhst}/signal.svg | 0 img/selfhst/signature-pdf-libre-light.svg | 13 + img/selfhst/signature-pdf-libre.svg | 13 + .../simplex-chat-light.svg | 0 img/{system => selfhst}/simplex-chat.svg | 0 img/{system => selfhst}/siyuan-light.svg | 0 img/{system => selfhst}/siyuan.svg | 0 img/{system => selfhst}/slash-light.svg | 0 img/{system => selfhst}/slash.svg | 0 img/{system => selfhst}/slskd-light.svg | 0 img/{system => selfhst}/slskd.svg | 0 img/{system => selfhst}/snikket.svg | 0 img/{system => selfhst}/socialhome-light.svg | 0 img/{system => selfhst}/socialhome.svg | 0 img/selfhst/sofe-light.svg | 244 ++++ img/selfhst/sofe.svg | 243 ++++ img/{system => selfhst}/solidtime-light.svg | 0 img/{system => selfhst}/solidtime.svg | 0 img/{system => selfhst}/sonarqube.svg | 0 img/selfhst/sonarr-4k-light.svg | 42 + img/selfhst/sonarr-4k.svg | 46 + img/selfhst/sonarr-anime-light.svg | 47 + img/selfhst/sonarr-anime.svg | 46 + img/selfhst/sonarr-light.svg | 31 + img/selfhst/sonarr-radarr-light.svg | 19 + img/selfhst/sonarr-radarr.svg | 19 + img/{system => selfhst}/sonarr.svg | 0 .../specifically-clementines.svg | 0 img/{system => selfhst}/spoolman-light.svg | 0 img/{system => selfhst}/spoolman.svg | 0 .../squirrel-servers-manager.svg | 0 img/selfhst/squoosh.svg | 163 +++ img/{system => selfhst}/sshwifty.svg | 0 .../stalwart-mail-server.svg | 0 img/{system => selfhst}/standard-notes.svg | 0 img/{system => selfhst}/step-ca.svg | 0 img/{system => selfhst}/stirling-pdf.svg | 0 img/{system => selfhst}/stormkit.svg | 0 img/{system => selfhst}/subatic.svg | 0 img/{system => selfhst}/supabase.svg | 0 img/{system => selfhst}/swarmpit-light.svg | 0 img/{system => selfhst}/swarmpit.svg | 0 img/{system => selfhst}/synapse-light.svg | 0 img/{system => selfhst}/synapse.svg | 0 img/{system => selfhst}/syncthing.svg | 0 img/{system => selfhst}/synology-light.svg | 0 img/{system => selfhst}/synology.svg | 0 img/{system => selfhst}/tailscale-light.svg | 0 img/{system => selfhst}/tailscale.svg | 0 img/{system => selfhst}/tangerine-ui.svg | 0 img/selfhst/tasmoadmin.svg | 22 + img/{system => selfhst}/tautulli.svg | 0 img/{system => selfhst}/telegram.svg | 0 img/{system => selfhst}/teleport-light.svg | 0 img/{system => selfhst}/teleport.svg | 0 img/{system => selfhst}/teslamate-light.svg | 0 img/{system => selfhst}/teslamate.svg | 0 img/selfhst/the-lounge-light.svg | 24 + img/selfhst/the-lounge.svg | 25 + img/{system => selfhst}/threads-light.svg | 0 img/{system => selfhst}/threads.svg | 0 img/{system => selfhst}/thunderbird-light.svg | 0 img/{system => selfhst}/thunderbird.svg | 0 img/{system => selfhst}/tianji-light.svg | 0 img/{system => selfhst}/tianji.svg | 0 img/{system => selfhst}/tiddlywiki-light.svg | 0 img/{system => selfhst}/tiddlywiki.svg | 0 img/{system => selfhst}/tmdb-light.svg | 0 img/{system => selfhst}/tmdb.svg | 0 img/{system => selfhst}/tooljet.svg | 0 img/{system => selfhst}/touitomamout.svg | 0 img/{system => selfhst}/tp-link-light.svg | 0 img/{system => selfhst}/tp-link.svg | 0 img/{system => selfhst}/tpdb-light.svg | 0 img/{system => selfhst}/tpdb.svg | 24 +- img/{system => selfhst}/traccar.svg | 0 img/selfhst/trackly-light.svg | 30 + img/selfhst/trackly.svg | 30 + img/{system => selfhst}/traefik.svg | 0 img/{system => selfhst}/trakt-light.svg | 0 img/{system => selfhst}/trakt.svg | 0 img/{system => selfhst}/transmission.svg | 0 img/{system => selfhst}/trilium.svg | 0 img/{system => selfhst}/triliumnext.svg | 0 .../truenas-core-light.svg | 0 img/{system => selfhst}/truenas-core.svg | 0 .../truenas-scale-light.svg | 0 img/{system => selfhst}/truenas-scale.svg | 0 img/selfhst/trusted-cgi-light.svg | 19 + img/selfhst/trusted-cgi.svg | 41 + img/{system => selfhst}/tubesync-light.svg | 0 img/{system => selfhst}/tubesync.svg | 0 img/{system => selfhst}/tumblr-light.svg | 0 img/{system => selfhst}/tumblr.svg | 0 img/{system => selfhst}/tvdb-light.svg | 0 img/{system => selfhst}/tvdb.svg | 0 img/{system => selfhst}/twingate-light.svg | 0 img/{system => selfhst}/twingate.svg | 0 img/{system => selfhst}/typemill-light.svg | 0 img/{system => selfhst}/typemill.svg | 0 .../ubiquiti-unifi-light.svg | 0 img/{system => selfhst}/ubiquiti-unifi.svg | 0 img/{system => selfhst}/umami-light.svg | 0 img/{system => selfhst}/umami.svg | 0 img/{system => selfhst}/umbrel.svg | 0 img/{system => selfhst}/unbound.svg | 0 img/{system => selfhst}/undb.svg | 0 .../unifi-voucher-site.svg | 0 img/{system => selfhst}/unraid.svg | 0 img/{system => selfhst}/upsnap.svg | 0 img/{system => selfhst}/uptime-kuma.svg | 0 img/{system => selfhst}/valetudo-light.svg | 0 img/{system => selfhst}/valetudo.svg | 0 img/{system => selfhst}/valkey-light.svg | 0 img/{system => selfhst}/valkey.svg | 0 img/{system => selfhst}/vaultwarden-light.svg | 0 img/{system => selfhst}/vaultwarden.svg | 0 img/{system => selfhst}/vector.svg | 0 .../victoriametrics-light.svg | 0 img/{system => selfhst}/victoriametrics.svg | 0 img/{system => selfhst}/vidzy.svg | 0 img/{system => selfhst}/vikunja.svg | 0 img/{system => selfhst}/viseron.svg | 0 img/{system => selfhst}/voilib-light.svg | 0 img/{system => selfhst}/voilib.svg | 0 img/{system => selfhst}/voltaserve-light.svg | 0 img/{system => selfhst}/voltaserve.svg | 0 img/{system => selfhst}/voron-light.svg | 0 img/{system => selfhst}/voron.svg | 0 img/{system => selfhst}/vuetorrent-light.svg | 0 img/{system => selfhst}/vuetorrent.svg | 0 img/{system => selfhst}/wakapi-light.svg | 0 img/{system => selfhst}/wakapi.svg | 0 img/{system => selfhst}/wallabag-light.svg | 0 img/{system => selfhst}/wallabag.svg | 0 img/{system => selfhst}/wanderer-light.svg | 0 img/{system => selfhst}/wanderer.svg | 0 img/{system => selfhst}/webtrees.svg | 0 img/{system => selfhst}/wekan.svg | 0 img/{system => selfhst}/wger.svg | 0 .../whats-up-docker-light.svg | 0 img/{system => selfhst}/whats-up-docker.svg | 0 img/{system => selfhst}/wiki-js.svg | 0 img/{system => selfhst}/wikidocs.svg | 0 img/{system => selfhst}/wikipedia-light.svg | 0 img/{system => selfhst}/wikipedia.svg | 0 img/{system => selfhst}/willow.svg | 0 img/selfhst/windmill-light.svg | 16 + img/selfhst/windmill.svg | 17 + .../windows-retro-light.svg | 0 img/{system => selfhst}/windows-retro.svg | 0 img/{system => selfhst}/wireguard.svg | 0 img/{system => selfhst}/wizarr.svg | 0 img/{system => selfhst}/woocommerce.svg | 0 img/{system => selfhst}/worklenz-light.svg | 0 img/{system => selfhst}/worklenz.svg | 0 img/{system => selfhst}/writefreely-light.svg | 0 img/{system => selfhst}/writefreely.svg | 0 img/{system => selfhst}/xbackbone.svg | 0 img/selfhst/xen-orchestra.svg | 947 ++++++++++++ img/{system => selfhst}/xpipe-light.svg | 0 img/{system => selfhst}/xpipe.svg | 0 img/{system => selfhst}/xwiki-light.svg | 0 img/{system => selfhst}/xwiki.svg | 0 img/{system => selfhst}/yacht-light.svg | 0 img/{system => selfhst}/yacht.svg | 0 img/{system => selfhst}/yamtrack-light.svg | 0 img/{system => selfhst}/yamtrack.svg | 0 img/{system => selfhst}/yarr-light.svg | 0 img/{system => selfhst}/yarr.svg | 0 img/{system => selfhst}/ynab-light.svg | 0 img/{system => selfhst}/ynab.svg | 0 img/{system => selfhst}/your-spotify.svg | 0 img/{system => selfhst}/yourls.svg | 0 img/{system => selfhst}/youtube-dl.svg | 0 img/selfhst/yunohost-light.svg | 46 + img/selfhst/yunohost.svg | 46 + .../z-wave-js-ui-light.svg | 0 img/{system => selfhst}/z-wave-js-ui.svg | 0 img/{system => selfhst}/zabbix.svg | 0 img/{system => selfhst}/zammad.svg | 0 img/selfhst/zerotier-light.svg | 17 + img/selfhst/zerotier.svg | 18 + img/{system => selfhst}/zigbee2mqtt.svg | 0 img/{system => selfhst}/zipcaptions-light.svg | 0 img/{system => selfhst}/zipcaptions.svg | 0 img/{system => selfhst}/zitadel-light.svg | 0 img/{system => selfhst}/zitadel.svg | 0 img/{system => selfhst}/zoraxy-light.svg | 0 img/{system => selfhst}/zoraxy.svg | 0 img/system/dozzle-light.svg | 15 - img/system/dozzle.svg | 15 - img/system/icon.svg | 60 - img/system/immich-frame-light.svg | 68 - img/system/immich-frame.svg | 68 - img/{proc => system}/lxd_icon.svg | 0 img/{proc => system}/podman_icon.svg | 0 img/system/portainer.svg | 27 - img/system/redlib.svg | 15 - img/system/zwave-js-ui-light.svg | 28 - img/system/zwave-js-ui.svg | 28 - lang/app/strings/translations_da.properties | 564 -------- lang/app/strings/translations_de.properties | 566 -------- lang/app/strings/translations_en.properties | 564 -------- lang/app/strings/translations_es.properties | 545 ------- lang/app/strings/translations_fr.properties | 558 ------- lang/app/strings/translations_it.properties | 545 ------- lang/app/strings/translations_ja.properties | 545 ------- lang/app/strings/translations_nl.properties | 545 ------- lang/app/strings/translations_pt.properties | 545 ------- lang/app/strings/translations_ru.properties | 545 ------- lang/app/strings/translations_tr.properties | 546 ------- lang/app/strings/translations_zh.properties | 545 ------- lang/base/strings/fixed_en.properties | 3 - lang/base/strings/translations_da.properties | 190 --- lang/base/strings/translations_de.properties | 182 --- lang/base/strings/translations_en.properties | 181 --- lang/base/strings/translations_es.properties | 179 --- lang/base/strings/translations_fr.properties | 188 --- lang/base/strings/translations_it.properties | 179 --- lang/base/strings/translations_ja.properties | 179 --- lang/base/strings/translations_nl.properties | 179 --- lang/base/strings/translations_pt.properties | 179 --- lang/base/strings/translations_ru.properties | 179 --- lang/base/strings/translations_tr.properties | 179 --- lang/base/strings/translations_zh.properties | 179 --- lang/jdbc/strings/translations_da.properties | 22 - lang/jdbc/strings/translations_de.properties | 22 - lang/jdbc/strings/translations_en.properties | 22 - lang/jdbc/strings/translations_es.properties | 22 - lang/jdbc/strings/translations_fr.properties | 22 - lang/jdbc/strings/translations_it.properties | 22 - lang/jdbc/strings/translations_ja.properties | 22 - lang/jdbc/strings/translations_nl.properties | 22 - lang/jdbc/strings/translations_pt.properties | 22 - lang/jdbc/strings/translations_ru.properties | 22 - lang/jdbc/strings/translations_tr.properties | 25 - lang/jdbc/strings/translations_zh.properties | 22 - lang/proc/strings/fixed_en.properties | 15 - lang/proc/strings/translations_da.properties | 434 ------ lang/proc/strings/translations_de.properties | 412 ------ lang/proc/strings/translations_en.properties | 411 ------ lang/proc/strings/translations_es.properties | 408 ------ lang/proc/strings/translations_fr.properties | 421 ------ lang/proc/strings/translations_it.properties | 408 ------ lang/proc/strings/translations_ja.properties | 408 ------ lang/proc/strings/translations_nl.properties | 408 ------ lang/proc/strings/translations_pt.properties | 408 ------ lang/proc/strings/translations_ru.properties | 408 ------ lang/proc/strings/translations_tr.properties | 408 ------ lang/proc/strings/translations_zh.properties | 408 ------ lang/proc/texts/elevation_da.md | 11 - lang/proc/texts/elevation_de.md | 11 - lang/proc/texts/elevation_en.md | 11 - lang/proc/texts/elevation_es.md | 11 - lang/proc/texts/elevation_fr.md | 11 - lang/proc/texts/elevation_it.md | 11 - lang/proc/texts/elevation_ja.md | 11 - lang/proc/texts/elevation_nl.md | 11 - lang/proc/texts/elevation_pt.md | 11 - lang/proc/texts/elevation_ru.md | 11 - lang/proc/texts/elevation_tr.md | 11 - lang/proc/texts/elevation_zh.md | 11 - .../texts/rdpPasswordAuthentication_da.md | 3 - .../texts/rdpPasswordAuthentication_de.md | 3 - .../texts/rdpPasswordAuthentication_en.md | 3 - .../texts/rdpPasswordAuthentication_es.md | 3 - .../texts/rdpPasswordAuthentication_fr.md | 3 - .../texts/rdpPasswordAuthentication_it.md | 3 - .../texts/rdpPasswordAuthentication_ja.md | 3 - .../texts/rdpPasswordAuthentication_nl.md | 3 - .../texts/rdpPasswordAuthentication_pt.md | 3 - .../texts/rdpPasswordAuthentication_ru.md | 3 - .../texts/rdpPasswordAuthentication_tr.md | 3 - .../texts/rdpPasswordAuthentication_zh.md | 3 - lang/{app => }/strings/fixed_en.properties | 27 + lang/strings/translations_da.properties | 1274 ++++++++++++++++ lang/strings/translations_de.properties | 1256 ++++++++++++++++ lang/strings/translations_en.properties | 1277 +++++++++++++++++ lang/strings/translations_es.properties | 1227 ++++++++++++++++ lang/strings/translations_fr.properties | 1262 ++++++++++++++++ lang/strings/translations_id.properties | 1227 ++++++++++++++++ lang/strings/translations_it.properties | 1227 ++++++++++++++++ lang/strings/translations_ja.properties | 1227 ++++++++++++++++ lang/strings/translations_nl.properties | 1227 ++++++++++++++++ lang/strings/translations_pl.properties | 1227 ++++++++++++++++ lang/strings/translations_pt.properties | 1227 ++++++++++++++++ lang/strings/translations_ru.properties | 1227 ++++++++++++++++ lang/strings/translations_sv.properties | 1227 ++++++++++++++++ lang/strings/translations_tr.properties | 1227 ++++++++++++++++ lang/strings/translations_zh.properties | 1227 ++++++++++++++++ lang/{uacc => }/texts/contact_da.md | 0 lang/{uacc => }/texts/contact_de.md | 0 lang/{uacc => }/texts/contact_en.md | 0 lang/{uacc => }/texts/contact_es.md | 0 lang/{uacc => }/texts/contact_fr.md | 0 lang/texts/contact_id.md | 6 + lang/{uacc => }/texts/contact_it.md | 0 lang/{uacc => }/texts/contact_ja.md | 0 lang/{uacc => }/texts/contact_nl.md | 0 lang/texts/contact_pl.md | 6 + lang/{uacc => }/texts/contact_pt.md | 0 lang/{uacc => }/texts/contact_ru.md | 0 lang/texts/contact_sv.md | 6 + lang/{uacc => }/texts/contact_tr.md | 0 lang/{uacc => }/texts/contact_zh.md | 0 lang/{base => }/texts/elevation_da.md | 0 lang/{base => }/texts/elevation_de.md | 0 lang/{base => }/texts/elevation_en.md | 0 lang/{base => }/texts/elevation_es.md | 0 lang/{base => }/texts/elevation_fr.md | 0 lang/texts/elevation_id.md | 14 + lang/{base => }/texts/elevation_it.md | 0 lang/{base => }/texts/elevation_ja.md | 0 lang/{base => }/texts/elevation_nl.md | 0 lang/texts/elevation_pl.md | 14 + lang/{base => }/texts/elevation_pt.md | 0 lang/{base => }/texts/elevation_ru.md | 0 lang/texts/elevation_sv.md | 14 + lang/{base => }/texts/elevation_tr.md | 0 lang/{base => }/texts/elevation_zh.md | 0 lang/{proc => }/texts/environmentScript_da.md | 0 lang/{proc => }/texts/environmentScript_de.md | 0 lang/{proc => }/texts/environmentScript_en.md | 0 lang/{proc => }/texts/environmentScript_es.md | 0 lang/{proc => }/texts/environmentScript_fr.md | 0 lang/texts/environmentScript_id.md | 9 + lang/{proc => }/texts/environmentScript_it.md | 0 lang/{proc => }/texts/environmentScript_ja.md | 0 lang/{proc => }/texts/environmentScript_nl.md | 0 lang/texts/environmentScript_pl.md | 9 + lang/{proc => }/texts/environmentScript_pt.md | 0 lang/{proc => }/texts/environmentScript_ru.md | 0 lang/texts/environmentScript_sv.md | 9 + lang/{proc => }/texts/environmentScript_tr.md | 0 lang/{proc => }/texts/environmentScript_zh.md | 0 lang/{base => }/texts/executionType_da.md | 0 lang/{base => }/texts/executionType_de.md | 0 lang/{base => }/texts/executionType_en.md | 0 lang/{base => }/texts/executionType_es.md | 0 lang/{base => }/texts/executionType_fr.md | 0 lang/texts/executionType_id.md | 60 + lang/{base => }/texts/executionType_it.md | 0 lang/{base => }/texts/executionType_ja.md | 0 lang/{base => }/texts/executionType_nl.md | 0 lang/texts/executionType_pl.md | 60 + lang/{base => }/texts/executionType_pt.md | 0 lang/{base => }/texts/executionType_ru.md | 0 lang/texts/executionType_sv.md | 60 + lang/{base => }/texts/executionType_tr.md | 0 lang/{base => }/texts/executionType_zh.md | 0 lang/{uacc => }/texts/licenseActivated_da.md | 0 lang/{uacc => }/texts/licenseActivated_de.md | 0 lang/{uacc => }/texts/licenseActivated_en.md | 0 lang/{uacc => }/texts/licenseActivated_es.md | 0 lang/{uacc => }/texts/licenseActivated_fr.md | 0 lang/texts/licenseActivated_id.md | 3 + lang/{uacc => }/texts/licenseActivated_it.md | 0 lang/{uacc => }/texts/licenseActivated_ja.md | 0 lang/{uacc => }/texts/licenseActivated_nl.md | 0 lang/texts/licenseActivated_pl.md | 3 + lang/{uacc => }/texts/licenseActivated_pt.md | 0 lang/{uacc => }/texts/licenseActivated_ru.md | 0 lang/texts/licenseActivated_sv.md | 3 + lang/{uacc => }/texts/licenseActivated_tr.md | 0 lang/{uacc => }/texts/licenseActivated_zh.md | 0 lang/{proc => }/texts/proxmoxPassword_da.md | 0 lang/{proc => }/texts/proxmoxPassword_de.md | 0 lang/{proc => }/texts/proxmoxPassword_en.md | 0 lang/{proc => }/texts/proxmoxPassword_es.md | 0 lang/{proc => }/texts/proxmoxPassword_fr.md | 0 lang/texts/proxmoxPassword_id.md | 3 + lang/{proc => }/texts/proxmoxPassword_it.md | 0 lang/{proc => }/texts/proxmoxPassword_ja.md | 0 lang/{proc => }/texts/proxmoxPassword_nl.md | 0 lang/texts/proxmoxPassword_pl.md | 3 + lang/{proc => }/texts/proxmoxPassword_pt.md | 0 lang/{proc => }/texts/proxmoxPassword_ru.md | 0 lang/texts/proxmoxPassword_sv.md | 3 + lang/{proc => }/texts/proxmoxPassword_tr.md | 0 lang/{proc => }/texts/proxmoxPassword_zh.md | 0 lang/{proc => }/texts/proxmoxUsername_da.md | 0 lang/{proc => }/texts/proxmoxUsername_de.md | 0 lang/{proc => }/texts/proxmoxUsername_en.md | 0 lang/{proc => }/texts/proxmoxUsername_es.md | 0 lang/{proc => }/texts/proxmoxUsername_fr.md | 0 lang/texts/proxmoxUsername_id.md | 5 + lang/{proc => }/texts/proxmoxUsername_it.md | 0 lang/{proc => }/texts/proxmoxUsername_ja.md | 0 lang/{proc => }/texts/proxmoxUsername_nl.md | 0 lang/texts/proxmoxUsername_pl.md | 5 + lang/{proc => }/texts/proxmoxUsername_pt.md | 0 lang/{proc => }/texts/proxmoxUsername_ru.md | 0 lang/texts/proxmoxUsername_sv.md | 5 + lang/{proc => }/texts/proxmoxUsername_tr.md | 0 lang/{proc => }/texts/proxmoxUsername_zh.md | 0 lang/{proc => }/texts/psSessionGateway_da.md | 0 lang/{proc => }/texts/psSessionGateway_de.md | 0 lang/{proc => }/texts/psSessionGateway_en.md | 0 lang/{proc => }/texts/psSessionGateway_es.md | 0 lang/{proc => }/texts/psSessionGateway_fr.md | 0 lang/texts/psSessionGateway_id.md | 3 + lang/{proc => }/texts/psSessionGateway_it.md | 0 lang/{proc => }/texts/psSessionGateway_ja.md | 0 lang/{proc => }/texts/psSessionGateway_nl.md | 0 lang/texts/psSessionGateway_pl.md | 3 + lang/{proc => }/texts/psSessionGateway_pt.md | 0 lang/{proc => }/texts/psSessionGateway_ru.md | 0 lang/texts/psSessionGateway_sv.md | 3 + lang/{proc => }/texts/psSessionGateway_tr.md | 0 lang/{proc => }/texts/psSessionGateway_zh.md | 0 .../texts/rdpAdditionalOptions_da.md | 0 .../texts/rdpAdditionalOptions_de.md | 0 .../texts/rdpAdditionalOptions_en.md | 0 .../texts/rdpAdditionalOptions_es.md | 0 .../texts/rdpAdditionalOptions_fr.md | 0 lang/texts/rdpAdditionalOptions_id.md | 9 + .../texts/rdpAdditionalOptions_it.md | 0 .../texts/rdpAdditionalOptions_ja.md | 0 .../texts/rdpAdditionalOptions_nl.md | 0 lang/texts/rdpAdditionalOptions_pl.md | 9 + .../texts/rdpAdditionalOptions_pt.md | 0 .../texts/rdpAdditionalOptions_ru.md | 0 lang/texts/rdpAdditionalOptions_sv.md | 9 + .../texts/rdpAdditionalOptions_tr.md | 0 .../texts/rdpAdditionalOptions_zh.md | 0 .../texts/rdpFileAllowListCheck_da.md | 0 .../texts/rdpFileAllowListCheck_de.md | 0 .../texts/rdpFileAllowListCheck_en.md | 0 .../texts/rdpFileAllowListCheck_es.md | 0 .../texts/rdpFileAllowListCheck_fr.md | 0 lang/texts/rdpFileAllowListCheck_id.md | 36 + .../texts/rdpFileAllowListCheck_it.md | 0 .../texts/rdpFileAllowListCheck_ja.md | 0 .../texts/rdpFileAllowListCheck_nl.md | 0 lang/texts/rdpFileAllowListCheck_pl.md | 36 + .../texts/rdpFileAllowListCheck_pt.md | 0 .../texts/rdpFileAllowListCheck_ru.md | 0 lang/texts/rdpFileAllowListCheck_sv.md | 36 + .../texts/rdpFileAllowListCheck_tr.md | 0 .../texts/rdpFileAllowListCheck_zh.md | 0 lang/{proc => }/texts/rdpFileAllowList_da.md | 8 +- lang/{proc => }/texts/rdpFileAllowList_de.md | 8 +- lang/{proc => }/texts/rdpFileAllowList_en.md | 2 +- lang/{proc => }/texts/rdpFileAllowList_es.md | 6 +- lang/{proc => }/texts/rdpFileAllowList_fr.md | 14 +- lang/texts/rdpFileAllowList_id.md | 38 + lang/{proc => }/texts/rdpFileAllowList_it.md | 12 +- lang/{proc => }/texts/rdpFileAllowList_ja.md | 4 +- lang/{proc => }/texts/rdpFileAllowList_nl.md | 18 +- lang/texts/rdpFileAllowList_pl.md | 38 + lang/{proc => }/texts/rdpFileAllowList_pt.md | 8 +- lang/{proc => }/texts/rdpFileAllowList_ru.md | 8 +- lang/texts/rdpFileAllowList_sv.md | 38 + lang/{proc => }/texts/rdpFileAllowList_tr.md | 12 +- lang/{proc => }/texts/rdpFileAllowList_zh.md | 4 +- lang/{proc => }/texts/rdpTunnelHost_da.md | 0 lang/{proc => }/texts/rdpTunnelHost_de.md | 0 lang/{proc => }/texts/rdpTunnelHost_en.md | 0 lang/{proc => }/texts/rdpTunnelHost_es.md | 0 lang/{proc => }/texts/rdpTunnelHost_fr.md | 0 lang/texts/rdpTunnelHost_id.md | 5 + lang/{proc => }/texts/rdpTunnelHost_it.md | 0 lang/{proc => }/texts/rdpTunnelHost_ja.md | 0 lang/{proc => }/texts/rdpTunnelHost_nl.md | 0 lang/texts/rdpTunnelHost_pl.md | 5 + lang/{proc => }/texts/rdpTunnelHost_pt.md | 0 lang/{proc => }/texts/rdpTunnelHost_ru.md | 0 lang/texts/rdpTunnelHost_sv.md | 5 + lang/{proc => }/texts/rdpTunnelHost_tr.md | 0 lang/{proc => }/texts/rdpTunnelHost_zh.md | 0 lang/{proc => }/texts/runTempContainer_da.md | 0 lang/{proc => }/texts/runTempContainer_de.md | 0 lang/{proc => }/texts/runTempContainer_en.md | 0 lang/{proc => }/texts/runTempContainer_es.md | 0 lang/{proc => }/texts/runTempContainer_fr.md | 0 lang/texts/runTempContainer_id.md | 5 + lang/{proc => }/texts/runTempContainer_it.md | 0 lang/{proc => }/texts/runTempContainer_ja.md | 0 lang/{proc => }/texts/runTempContainer_nl.md | 0 lang/texts/runTempContainer_pl.md | 5 + lang/{proc => }/texts/runTempContainer_pt.md | 0 lang/{proc => }/texts/runTempContainer_ru.md | 0 lang/texts/runTempContainer_sv.md | 5 + lang/{proc => }/texts/runTempContainer_tr.md | 0 lang/{proc => }/texts/runTempContainer_zh.md | 0 .../texts/scriptCompatibility_da.md | 0 .../texts/scriptCompatibility_de.md | 0 .../texts/scriptCompatibility_en.md | 0 .../texts/scriptCompatibility_es.md | 0 .../texts/scriptCompatibility_fr.md | 0 lang/texts/scriptCompatibility_id.md | 13 + .../texts/scriptCompatibility_it.md | 0 .../texts/scriptCompatibility_ja.md | 0 .../texts/scriptCompatibility_nl.md | 0 lang/texts/scriptCompatibility_pl.md | 13 + .../texts/scriptCompatibility_pt.md | 0 .../texts/scriptCompatibility_ru.md | 0 lang/texts/scriptCompatibility_sv.md | 13 + .../texts/scriptCompatibility_tr.md | 0 .../texts/scriptCompatibility_zh.md | 0 .../{base => }/texts/scriptDependencies_da.md | 0 .../{base => }/texts/scriptDependencies_de.md | 0 .../{base => }/texts/scriptDependencies_en.md | 0 .../{base => }/texts/scriptDependencies_es.md | 0 .../{base => }/texts/scriptDependencies_fr.md | 0 lang/texts/scriptDependencies_id.md | 5 + .../{base => }/texts/scriptDependencies_it.md | 0 .../{base => }/texts/scriptDependencies_ja.md | 0 .../{base => }/texts/scriptDependencies_nl.md | 0 lang/texts/scriptDependencies_pl.md | 5 + .../{base => }/texts/scriptDependencies_pt.md | 0 .../{base => }/texts/scriptDependencies_ru.md | 0 lang/texts/scriptDependencies_sv.md | 5 + .../{base => }/texts/scriptDependencies_tr.md | 0 .../{base => }/texts/scriptDependencies_zh.md | 0 lang/{base => }/texts/script_da.md | 0 lang/{base => }/texts/script_de.md | 0 lang/{base => }/texts/script_en.md | 0 lang/{base => }/texts/script_es.md | 0 lang/{base => }/texts/script_fr.md | 0 lang/texts/script_id.md | 5 + lang/{base => }/texts/script_it.md | 0 lang/{base => }/texts/script_ja.md | 0 lang/{base => }/texts/script_nl.md | 0 lang/texts/script_pl.md | 5 + lang/{base => }/texts/script_pt.md | 0 lang/{base => }/texts/script_ru.md | 0 lang/texts/script_sv.md | 5 + lang/{base => }/texts/script_tr.md | 0 lang/{base => }/texts/script_zh.md | 0 .../texts/serialImplementation_da.md | 0 .../texts/serialImplementation_de.md | 0 .../texts/serialImplementation_en.md | 0 .../texts/serialImplementation_es.md | 0 .../texts/serialImplementation_fr.md | 0 lang/texts/serialImplementation_id.md | 10 + .../texts/serialImplementation_it.md | 0 .../texts/serialImplementation_ja.md | 0 .../texts/serialImplementation_nl.md | 0 lang/texts/serialImplementation_pl.md | 10 + .../texts/serialImplementation_pt.md | 0 .../texts/serialImplementation_ru.md | 0 lang/texts/serialImplementation_sv.md | 10 + .../texts/serialImplementation_tr.md | 0 .../texts/serialImplementation_zh.md | 0 lang/{proc => }/texts/serialPort_da.md | 0 lang/{proc => }/texts/serialPort_de.md | 0 lang/{proc => }/texts/serialPort_en.md | 0 lang/{proc => }/texts/serialPort_es.md | 0 lang/{proc => }/texts/serialPort_fr.md | 0 lang/texts/serialPort_id.md | 20 + lang/{proc => }/texts/serialPort_it.md | 0 lang/{proc => }/texts/serialPort_ja.md | 0 lang/{proc => }/texts/serialPort_nl.md | 0 lang/texts/serialPort_pl.md | 20 + lang/{proc => }/texts/serialPort_pt.md | 0 lang/{proc => }/texts/serialPort_ru.md | 0 lang/texts/serialPort_sv.md | 20 + lang/{proc => }/texts/serialPort_tr.md | 0 lang/{proc => }/texts/serialPort_zh.md | 0 lang/{proc => }/texts/shellCommand_da.md | 0 lang/{proc => }/texts/shellCommand_de.md | 0 lang/{proc => }/texts/shellCommand_en.md | 0 lang/{proc => }/texts/shellCommand_es.md | 0 lang/{proc => }/texts/shellCommand_fr.md | 0 lang/texts/shellCommand_id.md | 30 + lang/{proc => }/texts/shellCommand_it.md | 0 lang/{proc => }/texts/shellCommand_ja.md | 0 lang/{proc => }/texts/shellCommand_nl.md | 0 lang/texts/shellCommand_pl.md | 30 + lang/{proc => }/texts/shellCommand_pt.md | 0 lang/{proc => }/texts/shellCommand_ru.md | 0 lang/texts/shellCommand_sv.md | 30 + lang/{proc => }/texts/shellCommand_tr.md | 0 lang/{proc => }/texts/shellCommand_zh.md | 0 lang/{proc => }/texts/sshConfigs_da.md | 0 lang/{proc => }/texts/sshConfigs_de.md | 0 lang/{proc => }/texts/sshConfigs_en.md | 0 lang/{proc => }/texts/sshConfigs_es.md | 0 lang/{proc => }/texts/sshConfigs_fr.md | 0 lang/texts/sshConfigs_id.md | 13 + lang/{proc => }/texts/sshConfigs_it.md | 0 lang/{proc => }/texts/sshConfigs_ja.md | 0 lang/{proc => }/texts/sshConfigs_nl.md | 0 lang/texts/sshConfigs_pl.md | 13 + lang/{proc => }/texts/sshConfigs_pt.md | 0 lang/{proc => }/texts/sshConfigs_ru.md | 0 lang/texts/sshConfigs_sv.md | 13 + lang/{proc => }/texts/sshConfigs_tr.md | 0 lang/{proc => }/texts/sshConfigs_zh.md | 0 .../texts/sshDontInteractWithSystem_da.md | 0 .../texts/sshDontInteractWithSystem_de.md | 0 .../texts/sshDontInteractWithSystem_en.md | 0 .../texts/sshDontInteractWithSystem_es.md | 0 .../texts/sshDontInteractWithSystem_fr.md | 0 lang/texts/sshDontInteractWithSystem_id.md | 7 + .../texts/sshDontInteractWithSystem_it.md | 0 .../texts/sshDontInteractWithSystem_ja.md | 0 .../texts/sshDontInteractWithSystem_nl.md | 0 lang/texts/sshDontInteractWithSystem_pl.md | 7 + .../texts/sshDontInteractWithSystem_pt.md | 0 .../texts/sshDontInteractWithSystem_ru.md | 0 lang/texts/sshDontInteractWithSystem_sv.md | 7 + .../texts/sshDontInteractWithSystem_tr.md | 0 .../texts/sshDontInteractWithSystem_zh.md | 0 .../texts/sshDynamicTunnelBinding_da.md | 0 .../texts/sshDynamicTunnelBinding_de.md | 0 .../texts/sshDynamicTunnelBinding_en.md | 0 .../texts/sshDynamicTunnelBinding_es.md | 0 .../texts/sshDynamicTunnelBinding_fr.md | 0 lang/texts/sshDynamicTunnelBinding_id.md | 5 + .../texts/sshDynamicTunnelBinding_it.md | 0 .../texts/sshDynamicTunnelBinding_ja.md | 0 .../texts/sshDynamicTunnelBinding_nl.md | 0 lang/texts/sshDynamicTunnelBinding_pl.md | 5 + .../texts/sshDynamicTunnelBinding_pt.md | 0 .../texts/sshDynamicTunnelBinding_ru.md | 0 lang/texts/sshDynamicTunnelBinding_sv.md | 5 + .../texts/sshDynamicTunnelBinding_tr.md | 0 .../texts/sshDynamicTunnelBinding_zh.md | 0 lang/{proc => }/texts/sshForwardX11_da.md | 0 lang/{proc => }/texts/sshForwardX11_de.md | 0 lang/{proc => }/texts/sshForwardX11_en.md | 0 lang/{proc => }/texts/sshForwardX11_es.md | 0 lang/{proc => }/texts/sshForwardX11_fr.md | 0 lang/texts/sshForwardX11_id.md | 13 + lang/{proc => }/texts/sshForwardX11_it.md | 0 lang/{proc => }/texts/sshForwardX11_ja.md | 0 lang/{proc => }/texts/sshForwardX11_nl.md | 0 lang/texts/sshForwardX11_pl.md | 13 + lang/{proc => }/texts/sshForwardX11_pt.md | 0 lang/{proc => }/texts/sshForwardX11_ru.md | 0 lang/texts/sshForwardX11_sv.md | 13 + lang/{proc => }/texts/sshForwardX11_tr.md | 0 lang/{proc => }/texts/sshForwardX11_zh.md | 0 lang/{proc => }/texts/sshGateway_da.md | 0 lang/{proc => }/texts/sshGateway_de.md | 0 lang/{proc => }/texts/sshGateway_en.md | 0 lang/{proc => }/texts/sshGateway_es.md | 0 lang/{proc => }/texts/sshGateway_fr.md | 0 lang/texts/sshGateway_id.md | 9 + lang/{proc => }/texts/sshGateway_it.md | 0 lang/{proc => }/texts/sshGateway_ja.md | 0 lang/{proc => }/texts/sshGateway_nl.md | 0 lang/texts/sshGateway_pl.md | 9 + lang/{proc => }/texts/sshGateway_pt.md | 0 lang/{proc => }/texts/sshGateway_ru.md | 0 lang/texts/sshGateway_sv.md | 9 + lang/{proc => }/texts/sshGateway_tr.md | 0 lang/{proc => }/texts/sshGateway_zh.md | 0 lang/{proc => }/texts/sshInteraction_da.md | 0 lang/{proc => }/texts/sshInteraction_de.md | 0 lang/{proc => }/texts/sshInteraction_en.md | 0 lang/{proc => }/texts/sshInteraction_es.md | 0 lang/{proc => }/texts/sshInteraction_fr.md | 0 lang/texts/sshInteraction_id.md | 5 + lang/{proc => }/texts/sshInteraction_it.md | 0 lang/{proc => }/texts/sshInteraction_ja.md | 0 lang/{proc => }/texts/sshInteraction_nl.md | 0 lang/texts/sshInteraction_pl.md | 5 + lang/{proc => }/texts/sshInteraction_pt.md | 0 lang/{proc => }/texts/sshInteraction_ru.md | 0 lang/texts/sshInteraction_sv.md | 5 + lang/{proc => }/texts/sshInteraction_tr.md | 0 lang/{proc => }/texts/sshInteraction_zh.md | 0 lang/{proc => }/texts/sshKey_da.md | 0 lang/{proc => }/texts/sshKey_de.md | 0 lang/{proc => }/texts/sshKey_en.md | 0 lang/{proc => }/texts/sshKey_es.md | 0 lang/{proc => }/texts/sshKey_fr.md | 0 lang/texts/sshKey_id.md | 51 + lang/{proc => }/texts/sshKey_it.md | 0 lang/{proc => }/texts/sshKey_ja.md | 0 lang/{proc => }/texts/sshKey_nl.md | 0 lang/texts/sshKey_pl.md | 51 + lang/{proc => }/texts/sshKey_pt.md | 0 lang/{proc => }/texts/sshKey_ru.md | 0 lang/texts/sshKey_sv.md | 51 + lang/{proc => }/texts/sshKey_tr.md | 0 lang/{proc => }/texts/sshKey_zh.md | 0 .../texts/sshLocalTunnelBinding_da.md | 0 .../texts/sshLocalTunnelBinding_de.md | 0 .../texts/sshLocalTunnelBinding_en.md | 0 .../texts/sshLocalTunnelBinding_es.md | 0 .../texts/sshLocalTunnelBinding_fr.md | 0 lang/texts/sshLocalTunnelBinding_id.md | 5 + .../texts/sshLocalTunnelBinding_it.md | 0 .../texts/sshLocalTunnelBinding_ja.md | 0 .../texts/sshLocalTunnelBinding_nl.md | 0 lang/texts/sshLocalTunnelBinding_pl.md | 5 + .../texts/sshLocalTunnelBinding_pt.md | 0 .../texts/sshLocalTunnelBinding_ru.md | 0 lang/texts/sshLocalTunnelBinding_sv.md | 5 + .../texts/sshLocalTunnelBinding_tr.md | 0 .../texts/sshLocalTunnelBinding_zh.md | 0 lang/{proc => }/texts/sshOptions_da.md | 0 lang/{proc => }/texts/sshOptions_de.md | 0 lang/{proc => }/texts/sshOptions_en.md | 0 lang/{proc => }/texts/sshOptions_es.md | 0 lang/{proc => }/texts/sshOptions_fr.md | 0 lang/texts/sshOptions_id.md | 27 + lang/{proc => }/texts/sshOptions_it.md | 0 lang/{proc => }/texts/sshOptions_ja.md | 0 lang/{proc => }/texts/sshOptions_nl.md | 0 lang/texts/sshOptions_pl.md | 27 + lang/{proc => }/texts/sshOptions_pt.md | 0 lang/{proc => }/texts/sshOptions_ru.md | 0 lang/texts/sshOptions_sv.md | 27 + lang/{proc => }/texts/sshOptions_tr.md | 0 lang/{proc => }/texts/sshOptions_zh.md | 0 .../texts/sshRemoteTunnelBinding_da.md | 0 .../texts/sshRemoteTunnelBinding_de.md | 0 .../texts/sshRemoteTunnelBinding_en.md | 0 .../texts/sshRemoteTunnelBinding_es.md | 0 .../texts/sshRemoteTunnelBinding_fr.md | 0 lang/texts/sshRemoteTunnelBinding_id.md | 5 + .../texts/sshRemoteTunnelBinding_it.md | 0 .../texts/sshRemoteTunnelBinding_ja.md | 0 .../texts/sshRemoteTunnelBinding_nl.md | 0 lang/texts/sshRemoteTunnelBinding_pl.md | 5 + .../texts/sshRemoteTunnelBinding_pt.md | 0 .../texts/sshRemoteTunnelBinding_ru.md | 0 lang/texts/sshRemoteTunnelBinding_sv.md | 5 + .../texts/sshRemoteTunnelBinding_tr.md | 0 .../texts/sshRemoteTunnelBinding_zh.md | 0 lang/{app => }/texts/termiusSetup_da.md | 0 lang/{app => }/texts/termiusSetup_de.md | 0 lang/{app => }/texts/termiusSetup_en.md | 0 lang/{app => }/texts/termiusSetup_es.md | 0 lang/{app => }/texts/termiusSetup_fr.md | 0 lang/texts/termiusSetup_id.md | 9 + lang/{app => }/texts/termiusSetup_it.md | 0 lang/{app => }/texts/termiusSetup_ja.md | 0 lang/{app => }/texts/termiusSetup_nl.md | 0 lang/texts/termiusSetup_pl.md | 9 + lang/{app => }/texts/termiusSetup_pt.md | 0 lang/{app => }/texts/termiusSetup_ru.md | 0 lang/texts/termiusSetup_sv.md | 9 + lang/{app => }/texts/termiusSetup_tr.md | 0 lang/{app => }/texts/termiusSetup_zh.md | 0 lang/{app => }/texts/vault_da.md | 0 lang/{app => }/texts/vault_de.md | 0 lang/{app => }/texts/vault_en.md | 0 lang/{app => }/texts/vault_es.md | 0 lang/{app => }/texts/vault_fr.md | 0 lang/texts/vault_id.md | 65 + lang/{app => }/texts/vault_it.md | 0 lang/{app => }/texts/vault_ja.md | 0 lang/{app => }/texts/vault_nl.md | 0 lang/texts/vault_pl.md | 65 + lang/{app => }/texts/vault_pt.md | 0 lang/{app => }/texts/vault_ru.md | 0 lang/texts/vault_sv.md | 65 + lang/{app => }/texts/vault_tr.md | 0 lang/{app => }/texts/vault_zh.md | 0 lang/{proc => }/texts/vmwarePassword_da.md | 0 lang/{proc => }/texts/vmwarePassword_de.md | 0 lang/{proc => }/texts/vmwarePassword_en.md | 0 lang/{proc => }/texts/vmwarePassword_es.md | 0 lang/{proc => }/texts/vmwarePassword_fr.md | 0 lang/texts/vmwarePassword_id.md | 4 + lang/{proc => }/texts/vmwarePassword_it.md | 0 lang/{proc => }/texts/vmwarePassword_ja.md | 0 lang/{proc => }/texts/vmwarePassword_nl.md | 0 lang/texts/vmwarePassword_pl.md | 4 + lang/{proc => }/texts/vmwarePassword_pt.md | 0 lang/{proc => }/texts/vmwarePassword_ru.md | 0 lang/texts/vmwarePassword_sv.md | 4 + lang/{proc => }/texts/vmwarePassword_tr.md | 0 lang/{proc => }/texts/vmwarePassword_zh.md | 0 lang/{proc => }/texts/vncSystem_da.md | 0 lang/{proc => }/texts/vncSystem_de.md | 0 lang/{proc => }/texts/vncSystem_en.md | 0 lang/{proc => }/texts/vncSystem_es.md | 0 lang/{proc => }/texts/vncSystem_fr.md | 0 lang/texts/vncSystem_id.md | 5 + lang/{proc => }/texts/vncSystem_it.md | 0 lang/{proc => }/texts/vncSystem_ja.md | 0 lang/{proc => }/texts/vncSystem_nl.md | 0 lang/texts/vncSystem_pl.md | 5 + lang/{proc => }/texts/vncSystem_pt.md | 0 lang/{proc => }/texts/vncSystem_ru.md | 0 lang/texts/vncSystem_sv.md | 5 + lang/{proc => }/texts/vncSystem_tr.md | 0 lang/{proc => }/texts/vncSystem_zh.md | 0 lang/{proc => }/texts/vncTunnelHost_da.md | 0 lang/{proc => }/texts/vncTunnelHost_de.md | 0 lang/{proc => }/texts/vncTunnelHost_en.md | 0 lang/{proc => }/texts/vncTunnelHost_es.md | 0 lang/{proc => }/texts/vncTunnelHost_fr.md | 0 lang/texts/vncTunnelHost_id.md | 5 + lang/{proc => }/texts/vncTunnelHost_it.md | 0 lang/{proc => }/texts/vncTunnelHost_ja.md | 0 lang/{proc => }/texts/vncTunnelHost_nl.md | 0 lang/texts/vncTunnelHost_pl.md | 5 + lang/{proc => }/texts/vncTunnelHost_pt.md | 0 lang/{proc => }/texts/vncTunnelHost_ru.md | 0 lang/texts/vncTunnelHost_sv.md | 5 + lang/{proc => }/texts/vncTunnelHost_tr.md | 0 lang/{proc => }/texts/vncTunnelHost_zh.md | 0 lang/{app => }/texts/xshellSetup_da.md | 0 lang/{app => }/texts/xshellSetup_de.md | 0 lang/{app => }/texts/xshellSetup_en.md | 0 lang/{app => }/texts/xshellSetup_es.md | 0 lang/{app => }/texts/xshellSetup_fr.md | 0 lang/texts/xshellSetup_id.md | 5 + lang/{app => }/texts/xshellSetup_it.md | 0 lang/{app => }/texts/xshellSetup_ja.md | 0 lang/{app => }/texts/xshellSetup_nl.md | 0 lang/texts/xshellSetup_pl.md | 5 + lang/{app => }/texts/xshellSetup_pt.md | 0 lang/{app => }/texts/xshellSetup_ru.md | 0 lang/texts/xshellSetup_sv.md | 5 + lang/{app => }/texts/xshellSetup_tr.md | 0 lang/{app => }/texts/xshellSetup_zh.md | 0 lang/uacc/strings/fixed_en.properties | 4 - lang/uacc/strings/translations_da.properties | 40 - lang/uacc/strings/translations_de.properties | 40 - lang/uacc/strings/translations_en.properties | 44 - lang/uacc/strings/translations_es.properties | 39 - lang/uacc/strings/translations_fr.properties | 39 - lang/uacc/strings/translations_it.properties | 39 - lang/uacc/strings/translations_ja.properties | 39 - lang/uacc/strings/translations_nl.properties | 39 - lang/uacc/strings/translations_pt.properties | 39 - lang/uacc/strings/translations_ru.properties | 39 - lang/uacc/strings/translations_tr.properties | 39 - lang/uacc/strings/translations_zh.properties | 39 - lang/uacc/texts/preview_da.md | 9 - lang/uacc/texts/preview_de.md | 9 - lang/uacc/texts/preview_en.md | 9 - lang/uacc/texts/preview_es.md | 9 - lang/uacc/texts/preview_fr.md | 9 - lang/uacc/texts/preview_it.md | 9 - lang/uacc/texts/preview_ja.md | 9 - lang/uacc/texts/preview_nl.md | 9 - lang/uacc/texts/preview_pt.md | 9 - lang/uacc/texts/preview_ru.md | 9 - lang/uacc/texts/preview_tr.md | 9 - lang/uacc/texts/preview_zh.md | 9 - openapi.yaml | 64 +- version | 2 +- 2688 files changed, 41312 insertions(+), 19924 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceSync.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/base/ErrorOverlayComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/InputGroupComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/IntroComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/IntroListComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/ModalButton.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/ModalOverlay.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/ModalOverlayContentComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/ModalOverlayStackComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceDialog.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceDialogComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/store/StoreIdentitiesIntroComp.java create mode 100644 app/src/main/java/io/xpipe/app/core/AppArguments.java delete mode 100644 app/src/main/java/io/xpipe/app/core/AppGreetings.java create mode 100644 app/src/main/java/io/xpipe/app/core/AppGreetingsDialog.java rename app/src/main/java/io/xpipe/app/core/{launcher/LauncherCommand.java => AppInstance.java} (52%) rename app/src/main/java/io/xpipe/app/core/{launcher/LauncherInput.java => AppOpenArguments.java} (79%) delete mode 100644 app/src/main/java/io/xpipe/app/core/check/AppFontLoadingCheck.java delete mode 100644 app/src/main/java/io/xpipe/app/core/check/AppPtbCheck.java create mode 100644 app/src/main/java/io/xpipe/app/core/check/AppShellChecker.java create mode 100644 app/src/main/java/io/xpipe/app/core/check/PtbDialog.java delete mode 100644 app/src/main/java/io/xpipe/app/core/launcher/LauncherModeConverter.java create mode 100644 app/src/main/java/io/xpipe/app/core/window/AppDialog.java create mode 100644 app/src/main/java/io/xpipe/app/ext/ContainerStoreState.java create mode 100644 app/src/main/java/io/xpipe/app/ext/UserBasedValue.java create mode 100644 app/src/main/java/io/xpipe/app/ext/UserScopeStore.java create mode 100644 app/src/main/java/io/xpipe/app/issue/ErrorHandlerDialog.java delete mode 100644 app/src/main/java/io/xpipe/app/issue/ExceptionConverter.java delete mode 100644 app/src/main/java/io/xpipe/app/prefs/ClearCacheAlert.java rename app/src/main/java/io/xpipe/app/prefs/{CloseBehaviourAlert.java => CloseBehaviourDialog.java} (58%) delete mode 100644 app/src/main/java/io/xpipe/app/prefs/LocalShellCategory.java delete mode 100644 app/src/main/java/io/xpipe/app/prefs/LockChangeAlert.java delete mode 100644 app/src/main/java/io/xpipe/app/prefs/SshCategory.java delete mode 100644 app/src/main/java/io/xpipe/app/prefs/WorkspaceCreationAlert.java create mode 100644 app/src/main/java/io/xpipe/app/prefs/WorkspaceCreationDialog.java delete mode 100644 app/src/main/java/io/xpipe/app/storage/DataStorageEncryption.java create mode 100644 app/src/main/java/io/xpipe/app/storage/DataStorageNode.java create mode 100644 app/src/main/java/io/xpipe/app/storage/DataStorageSecret.java create mode 100644 app/src/main/java/io/xpipe/app/storage/DataStorageUserHandler.java create mode 100644 app/src/main/java/io/xpipe/app/storage/DataStoreEntryUserScope.java delete mode 100644 app/src/main/java/io/xpipe/app/storage/DataStoreSecret.java create mode 100644 app/src/main/java/io/xpipe/app/terminal/WaveTerminalType.java delete mode 100644 app/src/main/java/io/xpipe/app/update/UpdateAvailableAlert.java create mode 100644 app/src/main/java/io/xpipe/app/update/UpdateAvailableDialog.java create mode 100644 app/src/main/java/io/xpipe/app/update/UpdateNagDialog.java create mode 100644 app/src/main/java/io/xpipe/app/util/BaseElevationHandler.java create mode 100644 app/src/main/java/io/xpipe/app/util/EncryptedValue.java create mode 100644 app/src/main/java/io/xpipe/app/util/EncryptionKey.java create mode 100644 app/src/main/java/io/xpipe/app/util/EncryptionToken.java delete mode 100644 app/src/main/java/io/xpipe/app/util/HttpHelper.java delete mode 100644 app/src/main/java/io/xpipe/app/util/JsonConfigHelper.java create mode 100644 app/src/main/java/io/xpipe/app/util/PasswdFile.java create mode 100644 app/src/main/java/io/xpipe/app/util/PlatformInit.java delete mode 100644 app/src/main/java/io/xpipe/app/util/ScanAlert.java create mode 100644 app/src/main/java/io/xpipe/app/util/ScanDialogAction.java create mode 100644 app/src/main/java/io/xpipe/app/util/ScanDialogComp.java delete mode 100644 app/src/main/java/io/xpipe/app/util/UnlockAlert.java create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips-122-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips-122.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips-61-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips-61.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave-144-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave-144.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave-288-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave-288.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave-dark.svg create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/logo/loading.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/producthunt-color.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adobe-lightroom-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adobe-lightroom-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adobe-lightroom-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adoberoom-light-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adoberoom-light-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adoberoom-light-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adventurelog-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adventurelog-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/adventurelog-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/amnezia-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/amnezia-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/amnezia-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/amnezia-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/amnezia-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/amnezia-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/atera-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/atera-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/atera-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/atera-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/atera-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/atera-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/baby-buddy-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/baby-buddy-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/baby-buddy-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/baby-buddy-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/baby-buddy-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/baby-buddy-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/bknd-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/bknd-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/bknd-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/bknd-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/bknd-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/bknd-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/blinko-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/blinko-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/blinko-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/blinko-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/blinko-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/blinko-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmate-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmate-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmate-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmate-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmate-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmate-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmk-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmk-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmk-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmk-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmk-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/checkmk-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/clamav-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/clamav-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/clamav-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/claude-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/claude-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/claude-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/claude-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/claude-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/claude-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-blue-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-blue-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/coinmarketcap-blue-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/crafty-controller-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/crafty-controller-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/crafty-controller-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/crafty-controller-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/crafty-controller-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/crafty-controller-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/cups-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/cups-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/cups-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/cups-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/cups-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/cups-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/deployarr-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/deployarr-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/deployarr-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/deployarr-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/deployarr-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/deployarr-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/dfir-iris-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/dfir-iris-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/dfir-iris-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/dfir-iris-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/dfir-iris-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/dfir-iris-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/donetick-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/donetick-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/donetick-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ersatztv-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ersatztv-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ersatztv-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ersatztv-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ersatztv-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ersatztv-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/espocrm-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/espocrm-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/espocrm-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/espocrm-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/espocrm-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/espocrm-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/etherpad-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/etherpad-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/etherpad-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/falcon-player-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/falcon-player-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/falcon-player-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/falcon-player-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/falcon-player-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/falcon-player-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flashpaper-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flashpaper-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flashpaper-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flashpaper-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flashpaper-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flashpaper-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fli-so-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fli-so-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fli-so-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fli-so-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fli-so-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fli-so-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flood-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flood-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flood-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flood-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flood-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/flood-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/freefinance-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/freefinance-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/freefinance-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/freeradius-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/freeradius-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/freeradius-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fritz-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fritz-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/fritz-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/gladys-assistant-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/gladys-assistant-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/gladys-assistant-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/grafana-alloy-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/grafana-alloy-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/grafana-alloy-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/grafana-alloy-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/grafana-alloy-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/grafana-alloy-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/graylog-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/graylog-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/graylog-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/graylog-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/graylog-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/graylog-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hauk-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hauk-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hauk-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hauk-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hauk-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hauk-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hemmelig-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hemmelig-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hemmelig-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hemmelig-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hemmelig-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hemmelig-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hoodik-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hoodik-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/hoodik-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/i-librarian-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/i-librarian-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/i-librarian-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/i-librarian-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/i-librarian-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/i-librarian-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icinga-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icinga-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icinga-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icinga-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icinga-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icinga-40.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icon-16.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icon-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/icon-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/immich-public-proxy-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/immich-public-proxy-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/immich-public-proxy-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/immich-public-proxy-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/immich-public-proxy-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/immich-public-proxy-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/investbrain-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/investbrain-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/investbrain-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/investbrain-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/investbrain-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/investbrain-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ko-fi-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ko-fi-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ko-fi-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ladder-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ladder-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ladder-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ladder-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ladder-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ladder-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/leantime-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/leantime-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/leantime-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/linuxcontainers-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/linuxcontainers-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/linuxcontainers-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/localess-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/localess-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/localess-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/localess-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/localess-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/localess-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/lyrion-media-server-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/lyrion-media-server-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/lyrion-media-server-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/lyrion-media-server-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/lyrion-media-server-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/lyrion-media-server-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mailpit-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mailpit-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mailpit-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mailpit-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mailpit-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mailpit-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/maloja-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/maloja-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/maloja-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/maloja-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/maloja-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/maloja-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/medassist-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/medassist-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/medassist-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/medassist-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/medassist-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/medassist-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mediathekview-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mediathekview-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mediathekview-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/meshtastic-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/meshtastic-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/meshtastic-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/meshtastic-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/meshtastic-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/meshtastic-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mitmproxy-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mitmproxy-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mitmproxy-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mitmproxy-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mitmproxy-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mitmproxy-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mxroute-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mxroute-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mxroute-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mxroute-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mxroute-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/mxroute-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/netbox-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/netbox-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/netbox-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/netbox-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/netbox-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/netbox-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/new-releases-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/new-releases-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/new-releases-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/new-releases-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/new-releases-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/new-releases-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nextbeats-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nextbeats-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nextbeats-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/njalla-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/njalla-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/njalla-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/njalla-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/njalla-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/njalla-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nocobase-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nocobase-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nocobase-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nocobase-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nocobase-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/nocobase-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/novu-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/novu-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/novu-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/novu-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/novu-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/novu-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ollama-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ollama-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ollama-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ollama-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ollama-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/ollama-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openbooks-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openbooks-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openbooks-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openbooks-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openbooks-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openbooks-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opengist-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opengist-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opengist-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opengist-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opengist-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opengist-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openprinting-cups-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openprinting-cups-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/openprinting-cups-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opensearch-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opensearch-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opensearch-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opensearch-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opensearch-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/opensearch-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/owntracks-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/owntracks-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/owntracks-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/patreon-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/patreon-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/patreon-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/patreon-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/patreon-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/patreon-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/pigallery2-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/pigallery2-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/pigallery2-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/pigallery2-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/pigallery2-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/pigallery2-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/plikshare-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/plikshare-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/plikshare-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/portainer-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/portainer-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/portainer-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/psitransfer-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/psitransfer-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/psitransfer-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/psitransfer-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/psitransfer-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/psitransfer-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-4k-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-4k-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-4k-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-4k-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-4k-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-4k-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-anime-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-anime-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-anime-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-anime-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-anime-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-anime-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-v1-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-v1-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/radarr-v1-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/raindrop-io-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/raindrop-io-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/raindrop-io-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-desktop-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-desktop-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-desktop-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-desktop-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-desktop-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-desktop-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-epinio-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-epinio-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-epinio-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-epinio-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-epinio-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-epinio-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-fleet-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-fleet-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-fleet-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-fleet-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-fleet-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-fleet-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-harvester-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-harvester-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-harvester-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-harvester-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-harvester-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-harvester-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-hypper-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-hypper-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-hypper-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-hypper-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-hypper-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-hypper-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3os-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3os-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3os-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3os-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3os-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3os-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3s-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3s-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3s-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3s-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3s-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-k3s-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-kubewarden-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-kubewarden-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-kubewarden-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-kubewarden-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-kubewarden-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-kubewarden-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-longhorn-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-longhorn-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-longhorn-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-longhorn-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-longhorn-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-longhorn-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-opni-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-opni-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-opni-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-opni-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-opni-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-opni-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rio-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rio-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rio-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rio-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rio-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rio-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rke-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rke-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rke-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rke-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rke-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-rke-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-submariner-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-submariner-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-submariner-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-submariner-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-submariner-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/rancher-submariner-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redis-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redis-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redis-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redlib-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redlib-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redlib-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redmine-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redmine-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redmine-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redmine-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redmine-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/redmine-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/resilio-sync-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/resilio-sync-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/resilio-sync-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/resilio-sync-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/resilio-sync-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/resilio-sync-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/safeline-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/safeline-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/safeline-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/scratch-map-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/scratch-map-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/scratch-map-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/scratch-map-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/scratch-map-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/scratch-map-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/seedsync-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/seedsync-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/seedsync-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/semaphore-ui-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/semaphore-ui-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/semaphore-ui-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/semaphore-ui-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/semaphore-ui-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/semaphore-ui-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/signature-pdf-libre-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/signature-pdf-libre-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/signature-pdf-libre-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/signature-pdf-libre-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/signature-pdf-libre-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/signature-pdf-libre-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sofe-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sofe-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sofe-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sofe-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sofe-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sofe-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-4k-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-4k-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-4k-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-4k-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-4k-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-4k-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-anime-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-anime-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-anime-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-anime-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-anime-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-anime-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-radarr-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-radarr-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-radarr-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-radarr-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-radarr-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-radarr-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/squoosh-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/squoosh-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/squoosh-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/tasmoadmin-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/tasmoadmin-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/tasmoadmin-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/the-lounge-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/the-lounge-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/the-lounge-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/the-lounge-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/the-lounge-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/the-lounge-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trackly-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trackly-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trackly-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trackly-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trackly-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trackly-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trusted-cgi-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trusted-cgi-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trusted-cgi-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trusted-cgi-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trusted-cgi-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/trusted-cgi-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/windmill-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/windmill-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/windmill-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/windmill-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/windmill-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/windmill-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/xen-orchestra-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/xen-orchestra-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/xen-orchestra-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/yunohost-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/yunohost-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/yunohost-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/yunohost-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/yunohost-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/yunohost-40.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zerotier-16-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zerotier-16.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zerotier-24-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zerotier-24.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zerotier-40-dark.png create mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zerotier-40.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16-dark.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24-dark.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40-dark.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40.png delete mode 100644 app/src/main/resources/io/xpipe/app/resources/style/error-overlay-comp.css create mode 100644 beacon/src/main/java/io/xpipe/beacon/api/CategoryAddExchange.java create mode 100644 core/src/main/java/io/xpipe/core/process/LocalProcessInputStream.java create mode 100644 core/src/main/java/io/xpipe/core/process/LocalProcessOutputStream.java create mode 100644 core/src/main/java/io/xpipe/core/process/ShellCapabilities.java create mode 100644 core/src/main/java/io/xpipe/core/process/ShellView.java create mode 100644 core/src/main/java/io/xpipe/core/store/NetworkTunnelSessionChain.java delete mode 100644 core/src/main/java/io/xpipe/core/store/SessionChain.java create mode 100644 core/src/main/java/io/xpipe/core/util/JacksonExtension.java delete mode 100644 core/src/main/java/io/xpipe/core/util/JacksonizedValue.java create mode 100644 dist/changelogs/14.0.md delete mode 100644 dist/debug/debug_arguments.txt delete mode 100644 dist/debug/linux/debug_attach_arguments.txt delete mode 100644 dist/debug/linux/xpiped_debug.sh delete mode 100644 dist/debug/mac/debug_attach_arguments.txt delete mode 100644 dist/debug/mac/xpiped_debug.sh delete mode 100644 dist/debug/windows/debug_attach_arguments.txt delete mode 100644 dist/debug/windows/xpiped_debug.bat delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopCommandStore.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopCommandStoreProvider.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopEnvironmentStore.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/desktop/DesktopEnvironmentStoreProvider.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityChoice.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityMigrationDeserializer.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStore.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStoreProvider.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityValue.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/LocalIdentityConvertAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/LocalIdentityStore.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/LocalIdentityStoreProvider.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/SshIdentityStateManager.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/SshIdentityStrategy.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/SshIdentityStrategyHelper.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/SyncedIdentityStore.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/identity/SyncedIdentityStoreProvider.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenHttpAction.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/service/ServiceOpenHttpsAction.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolTypeHelper.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/service/ServiceRefreshAction.java create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/localIdentity_icon-16.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/localIdentity_icon-24.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/localIdentity_icon-40.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/localIdentity_icon-80.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/syncedIdentity_icon-16.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/syncedIdentity_icon-24.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/syncedIdentity_icon-40.png create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/img/syncedIdentity_icon-80.png create mode 100644 ext/system/build.gradle create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusCommandView.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerActionMenu.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerConsoleAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditConfigAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerEditRunConfigAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerStore.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusContainerStoreProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusInstallStore.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusInstallStoreProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/incus/IncusScanProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCmdStore.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCmdStoreProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdCommandView.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerActionMenu.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerConsoleAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditConfigAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerEditRunConfigAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerStore.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdContainerStoreProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/lxd/LxdScanProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanCmdStore.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanCmdStoreProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanCommandView.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerActionMenu.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerAttachAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerInspectAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerLogsAction.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerStore.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanContainerStoreProvider.java create mode 100644 ext/system/src/main/java/io/xpipe/ext/system/podman/PodmanScanProvider.java create mode 100644 ext/system/src/main/java/module-info.java create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/extension.properties create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/lxd_icon-16.png create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/lxd_icon-24.png create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/lxd_icon-40.png create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/lxd_icon-80.png create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/podman_icon-16.png create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/podman_icon-24.png create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/podman_icon-40.png create mode 100644 ext/system/src/main/resources/io/xpipe/ext/system/resources/img/podman_icon-80.png create mode 100644 img/base/localIdentity_icon.svg create mode 100644 img/base/syncedIdentity_icon.svg rename {app/src/main/resources/io/xpipe/app/resources/img => img}/graphics/Hips-dark.svg (100%) rename {app/src/main/resources/io/xpipe/app/resources/img => img}/graphics/Hips.svg (100%) create mode 100644 img/graphics/Wave-dark.svg rename {app/src/main/resources/io/xpipe/app/resources/img => img}/graphics/Wave.svg (100%) rename img/{system => selfhst}/2fauth-light.svg (100%) rename img/{system => selfhst}/2fauth.svg (100%) rename img/{system => selfhst}/activepieces.svg (100%) rename img/{system => selfhst}/actual-budget-light.svg (100%) rename img/{system => selfhst}/actual-budget.svg (100%) rename img/{system => selfhst}/adguard-home.svg (100%) rename img/{system => selfhst}/adminer-light.svg (100%) rename img/{system => selfhst}/adminer.svg (100%) create mode 100644 img/selfhst/adobe-lightroom-light.svg create mode 100644 img/selfhst/adobe-lightroom.svg create mode 100644 img/selfhst/adventurelog.svg rename img/{system => selfhst}/affine-light.svg (100%) rename img/{system => selfhst}/affine.svg (100%) rename img/{system => selfhst}/airtable.svg (100%) rename img/{system => selfhst}/akkoma-light.svg (100%) rename img/{system => selfhst}/akkoma.svg (100%) rename img/{system => selfhst}/alist.svg (100%) create mode 100644 img/selfhst/amnezia-light.svg create mode 100644 img/selfhst/amnezia.svg rename img/{system => selfhst}/anonaddy.svg (100%) rename img/{system => selfhst}/ansible-light.svg (100%) rename img/{system => selfhst}/ansible.svg (100%) rename img/{system => selfhst}/apache-answer.svg (100%) rename img/{system => selfhst}/appflowy.svg (100%) rename img/{system => selfhst}/appwrite.svg (100%) rename img/{system => selfhst}/ara-records-ansible.svg (100%) rename img/{system => selfhst}/argo-cd.svg (100%) rename img/{system => selfhst}/asciinema.svg (100%) rename img/{system => selfhst}/astuto-light.svg (100%) rename img/{system => selfhst}/astuto.svg (100%) create mode 100644 img/selfhst/atera-light.svg create mode 100644 img/selfhst/atera.svg rename img/{system => selfhst}/atuin-light.svg (100%) rename img/{system => selfhst}/atuin.svg (100%) rename img/{system => selfhst}/audacity-light.svg (100%) rename img/{system => selfhst}/audacity.svg (100%) rename img/{system => selfhst}/audiobookshelf.svg (100%) rename img/{system => selfhst}/authelia-light.svg (100%) rename img/{system => selfhst}/authelia.svg (100%) rename img/{system => selfhst}/authentik.svg (100%) rename img/{system => selfhst}/authman.svg (100%) rename img/{system => selfhst}/autobrr.svg (100%) rename img/{system => selfhst}/automad-light.svg (100%) rename img/{system => selfhst}/automad.svg (100%) rename img/{system => selfhst}/azuracast.svg (100%) create mode 100644 img/selfhst/baby-buddy-light.svg create mode 100644 img/selfhst/baby-buddy.svg rename img/{system => selfhst}/backblaze-light.svg (100%) rename img/{system => selfhst}/backblaze.svg (100%) rename img/{system => selfhst}/backrest-light.svg (100%) rename img/{system => selfhst}/backrest.svg (100%) rename img/{system => selfhst}/bar-assistant.svg (100%) rename img/{system => selfhst}/baserow-light.svg (100%) rename img/{system => selfhst}/baserow.svg (100%) rename img/{system => selfhst}/beaver-habit-tracker-light.svg (100%) rename img/{system => selfhst}/beaver-habit-tracker.svg (100%) rename img/{system => selfhst}/beszel-light.svg (100%) rename img/{system => selfhst}/beszel.svg (100%) rename img/{system => selfhst}/biblioreads-light.svg (100%) rename img/{system => selfhst}/biblioreads.svg (100%) rename img/{system => selfhst}/bigbluebutton.svg (100%) rename img/{system => selfhst}/bigcapital.svg (100%) rename img/{system => selfhst}/bin.svg (100%) rename img/{system => selfhst}/bitbucket-light.svg (100%) rename img/{system => selfhst}/bitbucket.svg (100%) rename img/{system => selfhst}/bitwarden-light.svg (100%) rename img/{system => selfhst}/bitwarden.svg (100%) create mode 100644 img/selfhst/bknd-light.svg create mode 100644 img/selfhst/bknd.svg create mode 100644 img/selfhst/blinko-light.svg create mode 100644 img/selfhst/blinko.svg rename img/{system => selfhst}/blocky.svg (100%) rename img/{system => selfhst}/bluesky-light.svg (100%) rename img/{system => selfhst}/bluesky.svg (100%) rename img/{system => selfhst}/booklogr.svg (100%) rename img/{system => selfhst}/bookstack.svg (100%) rename img/{system => selfhst}/borg.svg (100%) rename img/{system => selfhst}/borgmatic-light.svg (100%) rename img/{system => selfhst}/borgmatic.svg (100%) rename img/{system => selfhst}/broadcastchannel-light.svg (100%) rename img/{system => selfhst}/broadcastchannel.svg (100%) rename img/{system => selfhst}/brother-light.svg (100%) rename img/{system => selfhst}/brother.svg (100%) rename img/{system => selfhst}/budgetbee.svg (100%) rename img/{system => selfhst}/budibase.svg (100%) rename img/{system => selfhst}/bunkerweb-light.svg (100%) rename img/{system => selfhst}/bunkerweb.svg (100%) rename img/{system => selfhst}/caddy.svg (100%) rename img/{system => selfhst}/cal-com-light.svg (100%) rename img/{system => selfhst}/cal-com.svg (100%) rename img/{system => selfhst}/calibre-web-light.svg (100%) rename img/{system => selfhst}/calibre-web.svg (100%) rename img/{system => selfhst}/calibre.svg (100%) rename img/{system => selfhst}/caprover-light.svg (100%) rename img/{system => selfhst}/caprover.svg (100%) rename img/{system => selfhst}/castopod.svg (100%) rename img/{system => selfhst}/changedetection-light.svg (100%) rename img/{system => selfhst}/changedetection.svg (100%) rename img/{system => selfhst}/channels-dvr.svg (100%) create mode 100644 img/selfhst/checkmate-light.svg create mode 100644 img/selfhst/checkmate.svg create mode 100644 img/selfhst/checkmk-light.svg create mode 100644 img/selfhst/checkmk.svg rename img/{system => selfhst}/chevereto.svg (100%) rename img/{system => selfhst}/chirpy.svg (100%) rename img/{system => selfhst}/chromium.svg (100%) create mode 100644 img/selfhst/clamav.svg create mode 100644 img/selfhst/claude-light.svg create mode 100644 img/selfhst/claude.svg rename img/{system => selfhst}/clickhouse.svg (100%) rename img/{system => selfhst}/cloudbeaver.svg (100%) rename img/{system => selfhst}/cloudflare.svg (100%) rename img/{system => selfhst}/cockpit-light.svg (100%) rename img/{system => selfhst}/cockpit.svg (100%) rename img/{system => selfhst}/codeberg.svg (100%) rename img/{system => selfhst}/coder-light.svg (100%) rename img/{system => selfhst}/coder.svg (100%) create mode 100644 img/selfhst/coinmarketcap-blue.svg create mode 100644 img/selfhst/coinmarketcap-light.svg create mode 100644 img/selfhst/coinmarketcap.svg rename img/{system => selfhst}/commafeed-light.svg (100%) rename img/{system => selfhst}/commafeed.svg (100%) rename img/{system => selfhst}/commento-light.svg (100%) rename img/{system => selfhst}/commento.svg (100%) rename img/{system => selfhst}/compreface-light.svg (100%) rename img/{system => selfhst}/compreface.svg (100%) rename img/{system => selfhst}/confluence.svg (100%) rename img/{system => selfhst}/converse-light.svg (100%) rename img/{system => selfhst}/converse.svg (100%) rename img/{system => selfhst}/coolify.svg (100%) rename img/{system => selfhst}/couchdb-light.svg (100%) rename img/{system => selfhst}/couchdb.svg (100%) rename img/{system => selfhst}/counter-analytics.svg (100%) create mode 100644 img/selfhst/crafty-controller-light.svg create mode 100644 img/selfhst/crafty-controller.svg rename img/{system => selfhst}/crowdsec.svg (100%) rename img/{system => selfhst}/cryptpad.svg (100%) rename img/{system => selfhst}/ctfreak.svg (100%) create mode 100644 img/selfhst/cups-light.svg create mode 100644 img/selfhst/cups.svg rename img/{system => selfhst}/cyberchef.svg (100%) rename img/{system => selfhst}/czkawka.svg (100%) rename img/{system => selfhst}/dalibo-light.svg (100%) rename img/{system => selfhst}/dalibo.svg (100%) rename img/{system => selfhst}/davical.svg (100%) rename img/{system => selfhst}/dawarich.svg (100%) rename img/{system => selfhst}/ddclient.svg (100%) rename img/{system => selfhst}/ddns-updater.svg (100%) rename img/{system => selfhst}/defguard.svg (100%) rename img/{system => selfhst}/deluge.svg (100%) create mode 100644 img/selfhst/deployarr-light.svg create mode 100644 img/selfhst/deployarr.svg create mode 100644 img/selfhst/dfir-iris-light.svg create mode 100644 img/selfhst/dfir-iris.svg rename img/{system => selfhst}/digitalocean-light.svg (100%) rename img/{system => selfhst}/digitalocean.svg (100%) rename img/{system => selfhst}/dillinger-light.svg (100%) rename img/{system => selfhst}/dillinger.svg (100%) rename img/{system => selfhst}/docassemble-light.svg (100%) rename img/{system => selfhst}/docassemble.svg (100%) rename img/{system => selfhst}/docker-light.svg (100%) rename img/{system => selfhst}/docker-volume-backup.svg (100%) rename img/{system => selfhst}/docker.svg (100%) rename img/{system => selfhst}/dockge.svg (100%) rename img/{system => selfhst}/docking-station-light.svg (100%) rename img/{system => selfhst}/docking-station.svg (100%) rename img/{system => selfhst}/docspell.svg (100%) rename img/{system => selfhst}/documenso-light.svg (100%) rename img/{system => selfhst}/documenso.svg (100%) rename img/{system => selfhst}/docusaurus.svg (100%) rename img/{system => selfhst}/docuseal.svg (100%) rename img/{system => selfhst}/dokemon.svg (100%) rename img/{system => selfhst}/dokuwiki.svg (100%) create mode 100644 img/selfhst/donetick.svg rename img/{system => selfhst}/double-take.svg (100%) rename img/{system => selfhst}/dovecot.svg (100%) create mode 100644 img/selfhst/dozzle-light.svg create mode 100644 img/selfhst/dozzle.svg rename img/{system => selfhst}/draw-io.svg (100%) rename img/{system => selfhst}/dropbox-light.svg (100%) rename img/{system => selfhst}/dropbox.svg (100%) rename img/{system => selfhst}/dropout.svg (100%) rename img/{system => selfhst}/dub-light.svg (100%) rename img/{system => selfhst}/dub.svg (100%) rename img/{system => selfhst}/duckdns.svg (100%) rename img/{system => selfhst}/duplicati.svg (100%) rename img/{system => selfhst}/element.svg (100%) rename img/{system => selfhst}/eleventy-light.svg (100%) rename img/{system => selfhst}/eleventy.svg (100%) rename img/{system => selfhst}/elysian.svg (100%) rename img/{system => selfhst}/emby.svg (100%) rename img/{system => selfhst}/emulatorjs.svg (100%) rename img/{system => selfhst}/enclosed-light.svg (100%) rename img/{system => selfhst}/enclosed.svg (100%) rename img/{system => selfhst}/endless-light.svg (100%) rename img/{system => selfhst}/endless.svg (100%) rename img/{system => selfhst}/endurain.svg (100%) rename img/{system => selfhst}/epic-games-light.svg (100%) rename img/{system => selfhst}/epic-games.svg (100%) create mode 100644 img/selfhst/ersatztv-light.svg create mode 100644 img/selfhst/ersatztv.svg rename img/{system => selfhst}/esphome-light.svg (100%) rename img/{system => selfhst}/esphome.svg (100%) create mode 100644 img/selfhst/espocrm-light.svg create mode 100644 img/selfhst/espocrm.svg rename img/{system => selfhst}/etesync.svg (100%) create mode 100644 img/selfhst/etherpad.svg rename img/{system => selfhst}/evcc-light.svg (100%) rename img/{system => selfhst}/evcc.svg (100%) rename img/{system => selfhst}/excalidraw.svg (100%) create mode 100644 img/selfhst/falcon-player-light.svg create mode 100644 img/selfhst/falcon-player.svg rename img/{system => selfhst}/fasten-health.svg (100%) rename img/{system => selfhst}/fastmail.svg (100%) rename img/{system => selfhst}/feedbase-light.svg (100%) rename img/{system => selfhst}/feedbase.svg (100%) rename img/{system => selfhst}/feedbin-light.svg (100%) rename img/{system => selfhst}/feedbin.svg (100%) rename img/{system => selfhst}/feedly-light.svg (100%) rename img/{system => selfhst}/feedly.svg (100%) rename img/{system => selfhst}/feedlynx.svg (100%) rename img/{system => selfhst}/fenrus.svg (100%) rename img/{system => selfhst}/ferdium-light.svg (100%) rename img/{system => selfhst}/ferdium.svg (100%) rename img/{system => selfhst}/ferretdb-light.svg (100%) rename img/{system => selfhst}/ferretdb.svg (100%) rename img/{system => selfhst}/fider-light.svg (100%) rename img/{system => selfhst}/fider.svg (100%) rename img/{system => selfhst}/file-browser.svg (100%) rename img/{system => selfhst}/fileflows.svg (100%) rename img/{system => selfhst}/filerun-light.svg (100%) rename img/{system => selfhst}/filerun.svg (100%) rename img/{system => selfhst}/filestash.svg (100%) rename img/{system => selfhst}/firefly-iii.svg (100%) rename img/{system => selfhst}/fittrackee.svg (100%) rename img/{system => selfhst}/fladder-light.svg (100%) rename img/{system => selfhst}/fladder.svg (100%) rename img/{system => selfhst}/flaresolverr.svg (100%) rename img/{system => selfhst}/flarum.svg (100%) create mode 100644 img/selfhst/flashpaper-light.svg create mode 100644 img/selfhst/flashpaper.svg rename img/{system => selfhst}/flatnotes-light.svg (100%) rename img/{system => selfhst}/flatnotes.svg (100%) create mode 100644 img/selfhst/fli-so-light.svg create mode 100644 img/selfhst/fli-so.svg rename img/{system => selfhst}/flightradar24-light.svg (100%) rename img/{system => selfhst}/flightradar24.svg (100%) create mode 100644 img/selfhst/flood-light.svg create mode 100644 img/selfhst/flood.svg rename img/{system => selfhst}/fluffychat-light.svg (100%) rename img/{system => selfhst}/fluffychat.svg (100%) rename img/{system => selfhst}/fluidd-light.svg (100%) rename img/{system => selfhst}/fluidd.svg (100%) rename img/{system => selfhst}/forgejo.svg (100%) rename img/{system => selfhst}/formbricks-light.svg (100%) rename img/{system => selfhst}/formbricks.svg (100%) rename img/{system => selfhst}/forte-light.svg (100%) rename img/{system => selfhst}/forte.svg (100%) create mode 100644 img/selfhst/freefinance.svg rename img/{system => selfhst}/freeipa.svg (100%) create mode 100644 img/selfhst/freeradius.svg rename img/{system => selfhst}/freshrss.svg (100%) rename img/{system => selfhst}/friendica.svg (100%) rename img/{system => selfhst}/frigate-light.svg (100%) rename img/{system => selfhst}/frigate.svg (100%) create mode 100644 img/selfhst/fritz.svg rename img/{system => selfhst}/funkwhale-light.svg (100%) rename img/{system => selfhst}/funkwhale.svg (100%) rename img/{system => selfhst}/fusionauth-light.svg (100%) rename img/{system => selfhst}/fusionauth.svg (100%) rename img/{system => selfhst}/garage.svg (100%) rename img/{system => selfhst}/gatsby.svg (100%) rename img/{system => selfhst}/gatus.svg (100%) rename img/{system => selfhst}/ghostfolio.svg (100%) rename img/{system => selfhst}/gitea.svg (100%) rename img/{system => selfhst}/gitlab.svg (100%) create mode 100644 img/selfhst/gladys-assistant.svg rename img/{system => selfhst}/glance-light.svg (100%) rename img/{system => selfhst}/glance.svg (100%) rename img/{system => selfhst}/glances-light.svg (100%) rename img/{system => selfhst}/glances.svg (100%) rename img/{system => selfhst}/glpi.svg (100%) rename img/{system => selfhst}/goaccess-light.svg (100%) rename img/{system => selfhst}/goaccess.svg (100%) rename img/{system => selfhst}/gotify.svg (100%) rename img/{system => selfhst}/gotosocial.svg (100%) create mode 100644 img/selfhst/grafana-alloy-light.svg create mode 100644 img/selfhst/grafana-alloy.svg rename img/{system => selfhst}/grafana.svg (100%) rename img/{system => selfhst}/gramps.svg (100%) rename img/{system => selfhst}/grav-light.svg (100%) rename img/{system => selfhst}/grav.svg (100%) create mode 100644 img/selfhst/graylog-light.svg create mode 100644 img/selfhst/graylog.svg rename img/{system => selfhst}/grimoire.svg (100%) rename img/{system => selfhst}/grist.svg (100%) rename img/{system => selfhst}/grocy.svg (100%) rename img/{system => selfhst}/haproxy.svg (100%) rename img/{system => selfhst}/haptic-light.svg (100%) rename img/{system => selfhst}/haptic.svg (100%) create mode 100644 img/selfhst/hauk-light.svg create mode 100644 img/selfhst/hauk.svg rename img/{system => selfhst}/hdhomerun-light.svg (100%) rename img/{system => selfhst}/hdhomerun.svg (100%) rename img/{system => selfhst}/headscale.svg (100%) rename img/{system => selfhst}/healthchecks-light.svg (100%) rename img/{system => selfhst}/healthchecks.svg (100%) rename img/{system => selfhst}/hedgedoc.svg (100%) rename img/{system => selfhst}/heimdall-light.svg (100%) rename img/{system => selfhst}/heimdall.svg (100%) create mode 100644 img/selfhst/hemmelig-light.svg create mode 100644 img/selfhst/hemmelig.svg rename img/{system => selfhst}/heyform.svg (100%) rename img/{system => selfhst}/hivedav.svg (100%) rename img/{system => selfhst}/hoarder-light.svg (100%) rename img/{system => selfhst}/hoarder.svg (100%) rename img/{system => selfhst}/hollo-light.svg (100%) rename img/{system => selfhst}/hollo.svg (100%) rename img/{system => selfhst}/homarr.svg (100%) rename img/{system => selfhst}/home-assistant-light.svg (100%) rename img/{system => selfhst}/home-assistant.svg (100%) rename img/{system => selfhst}/homebox.svg (100%) rename img/{system => selfhst}/homebridge-light.svg (100%) rename img/{system => selfhst}/homebridge.svg (100%) rename img/{system => selfhst}/homer.svg (100%) create mode 100644 img/selfhst/hoodik.svg rename img/{system => selfhst}/hoppscotch-light.svg (100%) rename img/{system => selfhst}/hoppscotch.svg (100%) rename img/{system => selfhst}/hubzilla-light.svg (100%) rename img/{system => selfhst}/hubzilla.svg (100%) rename img/{system => selfhst}/huginn.svg (100%) rename img/{system => selfhst}/hugo.svg (100%) rename img/{system => selfhst}/humhub.svg (100%) rename img/{system => selfhst}/hyperpipe-light.svg (100%) rename img/{system => selfhst}/hyperpipe.svg (100%) create mode 100644 img/selfhst/i-librarian-light.svg create mode 100644 img/selfhst/i-librarian.svg create mode 100644 img/selfhst/icinga-light.svg create mode 100644 img/selfhst/icinga.svg create mode 100644 img/selfhst/immich-frame-light.svg create mode 100644 img/selfhst/immich-frame.svg rename img/{system => selfhst}/immich-kiosk.svg (100%) create mode 100644 img/selfhst/immich-public-proxy-light.svg create mode 100644 img/selfhst/immich-public-proxy.svg rename img/{system => selfhst}/immich.svg (100%) rename img/{system => selfhst}/influxdb.svg (100%) rename img/{system => selfhst}/inoreader-light.svg (100%) rename img/{system => selfhst}/inoreader.svg (100%) rename img/{system => selfhst}/inventree.svg (100%) create mode 100644 img/selfhst/investbrain-light.svg create mode 100644 img/selfhst/investbrain.svg rename img/{system => selfhst}/invidious.svg (100%) rename img/{system => selfhst}/invoice-ninja-light.svg (100%) rename img/{system => selfhst}/invoice-ninja.svg (100%) rename img/{system => selfhst}/it-tools-light.svg (100%) rename img/{system => selfhst}/it-tools.svg (100%) rename img/{system => selfhst}/jackett-light.svg (100%) rename img/{system => selfhst}/jackett.svg (100%) rename img/{system => selfhst}/jekyll.svg (100%) rename img/{system => selfhst}/jellyfin-light.svg (100%) rename img/{system => selfhst}/jellyfin.svg (100%) rename img/{system => selfhst}/jellyseerr.svg (100%) rename img/{system => selfhst}/jenkins.svg (100%) rename img/{system => selfhst}/jira.svg (100%) rename img/{system => selfhst}/jitsi-meet.svg (100%) rename img/{system => selfhst}/jwt-io-light.svg (100%) rename img/{system => selfhst}/jwt-io.svg (100%) rename img/{system => selfhst}/kanboard-light.svg (100%) rename img/{system => selfhst}/kanboard.svg (100%) rename img/{system => selfhst}/kanidm.svg (100%) rename img/{system => selfhst}/kapowarr.svg (100%) rename img/{system => selfhst}/kavita.svg (100%) rename img/{system => selfhst}/kbin.svg (100%) rename img/{system => selfhst}/keepassxc.svg (100%) rename img/{system => selfhst}/keila.svg (100%) rename img/{system => selfhst}/kestra.svg (100%) rename img/{system => selfhst}/keycloak.svg (100%) rename img/{system => selfhst}/kimai.svg (100%) rename img/{system => selfhst}/klipper-light.svg (100%) rename img/{system => selfhst}/klipper.svg (100%) create mode 100644 img/selfhst/ko-fi.svg rename img/{system => selfhst}/kodi-light.svg (100%) rename img/{system => selfhst}/kodi.svg (100%) rename img/{system => selfhst}/komga.svg (100%) rename img/{system => selfhst}/kontoj.svg (100%) rename img/{system => selfhst}/kopia-light.svg (100%) rename img/{system => selfhst}/kopia.svg (100%) rename img/{system => selfhst}/krakend.svg (100%) rename img/{system => selfhst}/kyoo-light.svg (100%) rename img/{system => selfhst}/kyoo.svg (100%) create mode 100644 img/selfhst/ladder-light.svg create mode 100644 img/selfhst/ladder.svg rename img/{system => selfhst}/lancommander-light.svg (100%) rename img/{system => selfhst}/lancommander.svg (100%) create mode 100644 img/selfhst/leantime-light.svg rename img/{system => selfhst}/leantime.svg (100%) rename img/{system => selfhst}/lets-encrypt-light.svg (100%) rename img/{system => selfhst}/lets-encrypt.svg (100%) rename img/{system => selfhst}/librespeed.svg (100%) rename img/{system => selfhst}/librewolf-light.svg (100%) rename img/{system => selfhst}/librewolf.svg (100%) rename img/{system => selfhst}/librum.svg (100%) rename img/{system => selfhst}/lidarr.svg (100%) rename img/{system => selfhst}/limesurvey.svg (100%) rename img/{system => selfhst}/linguacafe.svg (100%) rename img/{system => selfhst}/linkace-light.svg (100%) rename img/{system => selfhst}/linkace.svg (100%) rename img/{system => selfhst}/linkding.svg (100%) rename img/{system => selfhst}/linkstack.svg (100%) create mode 100644 img/selfhst/linuxcontainers.svg rename img/{system => selfhst}/linuxgsm-light.svg (100%) rename img/{system => selfhst}/linuxgsm.svg (100%) rename img/{system => selfhst}/linuxserver-io.svg (100%) rename img/{system => selfhst}/listmonk.svg (100%) create mode 100644 img/selfhst/localess-light.svg create mode 100644 img/selfhst/localess.svg rename img/{system => selfhst}/lodestone.svg (100%) rename img/{system => selfhst}/logseq.svg (100%) rename img/{system => selfhst}/logto.svg (100%) rename img/{system => selfhst}/loki.svg (100%) rename img/{system => selfhst}/lunasea.svg (100%) create mode 100644 img/selfhst/lyrion-media-server-light.svg create mode 100644 img/selfhst/lyrion-media-server.svg rename img/{system => selfhst}/mail-in-a-box.svg (100%) rename img/{system => selfhst}/mailcow.svg (100%) create mode 100644 img/selfhst/mailpit-light.svg create mode 100644 img/selfhst/mailpit.svg rename img/{system => selfhst}/mainsail-light.svg (100%) rename img/{system => selfhst}/mainsail.svg (100%) create mode 100644 img/selfhst/maloja-light.svg create mode 100644 img/selfhst/maloja.svg rename img/{system => selfhst}/manyfold.svg (100%) rename img/{system => selfhst}/mariadb.svg (100%) rename img/{system => selfhst}/mastodon.svg (100%) rename img/{system => selfhst}/matomo.svg (100%) rename img/{system => selfhst}/matrix-light.svg (100%) rename img/{system => selfhst}/matrix.svg (100%) rename img/{system => selfhst}/mattermost-light.svg (100%) rename img/{system => selfhst}/mattermost.svg (100%) rename img/{system => selfhst}/mautic-light.svg (100%) rename img/{system => selfhst}/mautic.svg (100%) rename img/{system => selfhst}/mayan-edms-light.svg (100%) rename img/{system => selfhst}/mayan-edms.svg (100%) rename img/{system => selfhst}/maybe.svg (100%) rename img/{system => selfhst}/mbin.svg (100%) rename img/{system => selfhst}/mealie-light.svg (100%) rename img/{system => selfhst}/mealie.svg (100%) rename img/{system => selfhst}/medama.svg (100%) create mode 100644 img/selfhst/medassist-light.svg create mode 100644 img/selfhst/medassist.svg create mode 100644 img/selfhst/mediathekview.svg rename img/{system => selfhst}/mediux-light.svg (100%) rename img/{system => selfhst}/mediux.svg (100%) rename img/{system => selfhst}/medusa-light.svg (100%) rename img/{system => selfhst}/medusa.svg (100%) rename img/{system => selfhst}/meilisearch-light.svg (100%) rename img/{system => selfhst}/meilisearch.svg (100%) rename img/{system => selfhst}/memories-light.svg (100%) rename img/{system => selfhst}/memories.svg (100%) rename img/{system => selfhst}/mergeable.svg (100%) rename img/{system => selfhst}/meshping-light.svg (100%) rename img/{system => selfhst}/meshping.svg (100%) create mode 100644 img/selfhst/meshtastic-light.svg create mode 100644 img/selfhst/meshtastic.svg rename img/{system => selfhst}/metabase.svg (100%) rename img/{system => selfhst}/metube.svg (100%) rename img/{system => selfhst}/minecraft.svg (100%) rename img/{system => selfhst}/miniflux-light.svg (100%) rename img/{system => selfhst}/miniflux.svg (100%) rename img/{system => selfhst}/minio-light.svg (100%) rename img/{system => selfhst}/minio.svg (100%) rename img/{system => selfhst}/mirotalk.svg (100%) rename img/{system => selfhst}/misskey-light.svg (100%) rename img/{system => selfhst}/misskey.svg (100%) create mode 100644 img/selfhst/mitmproxy-light.svg create mode 100644 img/selfhst/mitmproxy.svg rename img/{system => selfhst}/mitra-light.svg (100%) rename img/{system => selfhst}/mitra.svg (100%) rename img/{system => selfhst}/mixpost.svg (100%) rename img/{system => selfhst}/mobilizon.svg (100%) rename img/{system => selfhst}/mongodb.svg (100%) rename img/{system => selfhst}/monica-light.svg (100%) rename img/{system => selfhst}/monica.svg (100%) rename img/{system => selfhst}/morphos.svg (100%) rename img/{system => selfhst}/mosquitto.svg (100%) rename img/{system => selfhst}/motioneye.svg (100%) rename img/{system => selfhst}/mqtt-light.svg (100%) rename img/{system => selfhst}/mqtt.svg (100%) rename img/{system => selfhst}/mullvad-vpn.svg (100%) rename img/{system => selfhst}/multi-scrobbler-light.svg (100%) rename img/{system => selfhst}/multi-scrobbler.svg (100%) rename img/{system => selfhst}/mumble.svg (100%) rename img/{system => selfhst}/music-assistant-light.svg (100%) rename img/{system => selfhst}/music-assistant.svg (100%) create mode 100644 img/selfhst/mxroute-light.svg create mode 100644 img/selfhst/mxroute.svg rename img/{system => selfhst}/myheats-light.svg (100%) rename img/{system => selfhst}/myheats.svg (100%) rename img/{system => selfhst}/mysql-light.svg (100%) rename img/{system => selfhst}/mysql.svg (100%) rename img/{system => selfhst}/n8n.svg (100%) rename img/{system => selfhst}/nasa.svg (100%) rename img/{system => selfhst}/navidrome.svg (100%) rename img/{system => selfhst}/neko-light.svg (100%) rename img/{system => selfhst}/neko.svg (100%) rename img/{system => selfhst}/neodb.svg (100%) rename img/{system => selfhst}/netalertx.svg (100%) rename img/{system => selfhst}/netbird.svg (100%) rename img/{system => selfhst}/netboot-xyz-light.svg (100%) rename img/{system => selfhst}/netboot-xyz.svg (100%) create mode 100644 img/selfhst/netbox-light.svg create mode 100644 img/selfhst/netbox.svg rename img/{system => selfhst}/netdata-light.svg (100%) rename img/{system => selfhst}/netdata.svg (100%) rename img/{system => selfhst}/netgear-light.svg (100%) rename img/{system => selfhst}/netgear.svg (100%) rename img/{system => selfhst}/netlify.svg (100%) create mode 100644 img/selfhst/new-releases-light.svg create mode 100644 img/selfhst/new-releases.svg rename img/{system => selfhst}/newsblur.svg (100%) create mode 100644 img/selfhst/nextbeats.svg rename img/{system => selfhst}/nextcloud-light.svg (100%) rename img/{system => selfhst}/nextcloud-news-light.svg (100%) rename img/{system => selfhst}/nextcloud-news.svg (100%) rename img/{system => selfhst}/nextcloud-social-light.svg (100%) rename img/{system => selfhst}/nextcloud-social.svg (100%) rename img/{system => selfhst}/nextcloud-tables-light.svg (100%) rename img/{system => selfhst}/nextcloud-tables.svg (100%) rename img/{system => selfhst}/nextcloud.svg (100%) rename img/{system => selfhst}/nextcloudpi-light.svg (100%) rename img/{system => selfhst}/nextcloudpi.svg (100%) rename img/{system => selfhst}/nginx-light.svg (100%) rename img/{system => selfhst}/nginx-proxy-manager.svg (100%) rename img/{system => selfhst}/nginx.svg (100%) rename img/{system => selfhst}/nightscout-light.svg (100%) rename img/{system => selfhst}/nightscout.svg (100%) create mode 100644 img/selfhst/njalla-light.svg create mode 100644 img/selfhst/njalla.svg create mode 100644 img/selfhst/nocobase-light.svg create mode 100644 img/selfhst/nocobase.svg rename img/{system => selfhst}/nocodb-light.svg (100%) rename img/{system => selfhst}/nocodb.svg (100%) rename img/{system => selfhst}/node-red.svg (100%) rename img/{system => selfhst}/nodebb.svg (100%) rename img/{system => selfhst}/nordvpn-light.svg (100%) rename img/{system => selfhst}/nordvpn.svg (100%) rename img/{system => selfhst}/note-mark.svg (100%) rename img/{system => selfhst}/notesnook-light.svg (100%) rename img/{system => selfhst}/notesnook.svg (100%) rename img/{system => selfhst}/notion-light.svg (100%) rename img/{system => selfhst}/notion.svg (100%) create mode 100644 img/selfhst/novu-light.svg create mode 100644 img/selfhst/novu.svg rename img/{system => selfhst}/ntfy-light.svg (100%) rename img/{system => selfhst}/ntfy.svg (100%) rename img/{system => selfhst}/obsidian.svg (100%) rename img/{system => selfhst}/obtainium.svg (100%) rename img/{system => selfhst}/octoprint.svg (100%) rename img/{system => selfhst}/olivetin.svg (100%) create mode 100644 img/selfhst/ollama-light.svg create mode 100644 img/selfhst/ollama.svg rename img/{system => selfhst}/omada.svg (100%) rename img/{system => selfhst}/ombi.svg (100%) rename img/{system => selfhst}/omnivore.svg (100%) rename img/{system => selfhst}/onedev-light.svg (100%) rename img/{system => selfhst}/onedev.svg (100%) rename img/{system => selfhst}/oneuptime-light.svg (100%) rename img/{system => selfhst}/oneuptime.svg (100%) rename img/{system => selfhst}/open-source-initiative-light.svg (100%) rename img/{system => selfhst}/open-source-initiative.svg (100%) create mode 100644 img/selfhst/openbooks-light.svg create mode 100644 img/selfhst/openbooks.svg rename img/{system => selfhst}/openchangelog-light.svg (100%) rename img/{system => selfhst}/openchangelog.svg (100%) rename img/{system => selfhst}/openemr-light.svg (100%) rename img/{system => selfhst}/openemr.svg (100%) create mode 100644 img/selfhst/opengist-light.svg create mode 100644 img/selfhst/opengist.svg rename img/{system => selfhst}/openldap.svg (100%) rename img/{system => selfhst}/openmediavault-light.svg (100%) rename img/{system => selfhst}/openmediavault.svg (100%) rename img/{system => selfhst}/openpanel-light.svg (100%) rename img/{system => selfhst}/openpanel.svg (100%) create mode 100644 img/selfhst/openprinting-cups.svg rename img/{system => selfhst}/openreads.svg (100%) create mode 100644 img/selfhst/opensearch-light.svg create mode 100644 img/selfhst/opensearch.svg rename img/{system => selfhst}/openspeedtest-light.svg (100%) rename img/{system => selfhst}/openspeedtest.svg (100%) rename img/{system => selfhst}/opentalk.svg (100%) rename img/{system => selfhst}/opentofu-light.svg (100%) rename img/{system => selfhst}/opentofu.svg (100%) rename img/{system => selfhst}/openvpn-light.svg (100%) rename img/{system => selfhst}/openvpn.svg (100%) rename img/{system => selfhst}/openwrt-light.svg (100%) rename img/{system => selfhst}/openwrt.svg (100%) rename img/{system => selfhst}/opnform-light.svg (100%) rename img/{system => selfhst}/opnform.svg (100%) rename img/{system => selfhst}/opnsense.svg (100%) rename img/{system => selfhst}/outline.svg (100%) rename img/{system => selfhst}/overleaf.svg (100%) rename img/{system => selfhst}/overseerr.svg (100%) rename img/{system => selfhst}/owncast.svg (100%) rename img/{system => selfhst}/owncloud-light.svg (100%) rename img/{system => selfhst}/owncloud.svg (100%) rename img/{system => selfhst}/owntone.svg (100%) create mode 100644 img/selfhst/owntracks.svg rename img/{system => selfhst}/oxker.svg (100%) rename img/{system => selfhst}/paperless-ngx-light.svg (100%) rename img/{system => selfhst}/paperless-ngx.svg (100%) rename img/{system => selfhst}/papermark-light.svg (100%) rename img/{system => selfhst}/papermark.svg (100%) rename img/{system => selfhst}/papermerge.svg (100%) rename img/{system => selfhst}/parseable.svg (100%) rename img/{system => selfhst}/passbolt.svg (100%) create mode 100644 img/selfhst/patreon-light.svg create mode 100644 img/selfhst/patreon.svg rename img/{system => selfhst}/payload-light.svg (100%) rename img/{system => selfhst}/payload.svg (100%) rename img/{system => selfhst}/pdfding-light.svg (100%) rename img/{system => selfhst}/pdfding.svg (100%) rename img/{system => selfhst}/peanut.svg (100%) rename img/{system => selfhst}/peertube.svg (100%) rename img/{system => selfhst}/pelican-panel.svg (100%) rename img/{system => selfhst}/penpot-light.svg (100%) rename img/{system => selfhst}/penpot.svg (100%) rename img/{system => selfhst}/peppermint.svg (100%) rename img/{system => selfhst}/pepperminty-wiki.svg (100%) rename img/{system => selfhst}/pfsense-light.svg (100%) rename img/{system => selfhst}/pfsense.svg (100%) rename img/{system => selfhst}/pg-back-web.svg (100%) rename img/{system => selfhst}/phanpy-light.svg (100%) rename img/{system => selfhst}/phanpy.svg (100%) rename img/{system => selfhst}/phorge-light.svg (100%) rename img/{system => selfhst}/phorge.svg (100%) rename img/{system => selfhst}/photopea-light.svg (100%) rename img/{system => selfhst}/photopea.svg (100%) rename img/{system => selfhst}/photoprism.svg (100%) rename img/{system => selfhst}/photoview.svg (100%) rename img/{system => selfhst}/pi-hole.svg (100%) create mode 100644 img/selfhst/pigallery2-light.svg create mode 100644 img/selfhst/pigallery2.svg rename img/{system => selfhst}/pikapods-light.svg (100%) rename img/{system => selfhst}/pikapods.svg (100%) rename img/{system => selfhst}/pingvin-share.svg (100%) rename img/{system => selfhst}/pinkary.svg (100%) rename img/{system => selfhst}/piped.svg (100%) rename img/{system => selfhst}/piwigo.svg (100%) rename img/{system => selfhst}/pixelfed.svg (100%) rename img/{system => selfhst}/plane.svg (100%) rename img/{system => selfhst}/planka-light.svg (100%) rename img/{system => selfhst}/planka.svg (100%) rename img/{system => selfhst}/plausible.svg (100%) rename img/{system => selfhst}/pleroma.svg (100%) rename img/{system => selfhst}/plex-rewind.svg (100%) rename img/{system => selfhst}/plex.svg (100%) create mode 100644 img/selfhst/plikshare.svg rename img/{system => selfhst}/pocket-casts-light.svg (100%) rename img/{system => selfhst}/pocket-casts.svg (100%) rename img/{system => selfhst}/pocket-id-light.svg (100%) rename img/{system => selfhst}/pocket-id.svg (100%) rename img/{system => selfhst}/podfetch-light.svg (100%) rename img/{system => selfhst}/podfetch.svg (100%) rename img/{system => selfhst}/podman.svg (100%) create mode 100644 img/selfhst/portainer-light.svg create mode 100644 img/selfhst/portainer.svg rename img/{system => selfhst}/postal.svg (100%) rename img/{system => selfhst}/postgresql.svg (100%) rename img/{system => selfhst}/posthog.svg (100%) rename img/{system => selfhst}/postiz-light.svg (100%) rename img/{system => selfhst}/postiz.svg (100%) rename img/{system => selfhst}/private-internet-access.svg (100%) rename img/{system => selfhst}/privatebin.svg (100%) rename img/{system => selfhst}/projectsend.svg (100%) rename img/{system => selfhst}/prometheus.svg (100%) rename img/{system => selfhst}/proton-calendar.svg (100%) rename img/{system => selfhst}/proton-drive.svg (100%) rename img/{system => selfhst}/proton-pass.svg (100%) rename img/{system => selfhst}/proton-vpn.svg (100%) rename img/{system => selfhst}/protonmail.svg (100%) rename img/{system => selfhst}/prowlarr.svg (100%) rename img/{system => selfhst}/proxmox-light.svg (100%) rename img/{system => selfhst}/proxmox.svg (100%) create mode 100644 img/selfhst/psitransfer-light.svg create mode 100644 img/selfhst/psitransfer.svg rename img/{system => selfhst}/pterodactyl.svg (100%) rename img/{system => selfhst}/pushover-light.svg (100%) rename img/{system => selfhst}/pushover.svg (100%) rename img/{system => selfhst}/pyload.svg (100%) rename img/{system => selfhst}/python-light.svg (100%) rename img/{system => selfhst}/python.svg (100%) rename img/{system => selfhst}/qbittorrent.svg (100%) rename img/{system => selfhst}/qnap-light.svg (100%) rename img/{system => selfhst}/qnap.svg (100%) rename img/{system => selfhst}/quickwit.svg (100%) create mode 100644 img/selfhst/radarr-4k-light.svg create mode 100644 img/selfhst/radarr-4k.svg create mode 100644 img/selfhst/radarr-anime-light.svg create mode 100644 img/selfhst/radarr-anime.svg rename img/{system => selfhst}/radarr-light.svg (100%) create mode 100644 img/selfhst/radarr-v1.svg rename img/{system => selfhst}/radarr.svg (100%) rename img/{system => selfhst}/radicale.svg (100%) create mode 100644 img/selfhst/raindrop-io.svg rename img/{system => selfhst}/rallly-light.svg (100%) rename img/{system => selfhst}/rallly.svg (100%) create mode 100644 img/selfhst/rancher-desktop-light.svg create mode 100644 img/selfhst/rancher-desktop.svg create mode 100644 img/selfhst/rancher-epinio-light.svg create mode 100644 img/selfhst/rancher-epinio.svg create mode 100644 img/selfhst/rancher-fleet-light.svg create mode 100644 img/selfhst/rancher-fleet.svg create mode 100644 img/selfhst/rancher-harvester-light.svg create mode 100644 img/selfhst/rancher-harvester.svg create mode 100644 img/selfhst/rancher-hypper-light.svg create mode 100644 img/selfhst/rancher-hypper.svg create mode 100644 img/selfhst/rancher-k3os-light.svg create mode 100644 img/selfhst/rancher-k3os.svg create mode 100644 img/selfhst/rancher-k3s-light.svg create mode 100644 img/selfhst/rancher-k3s.svg create mode 100644 img/selfhst/rancher-kubewarden-light.svg create mode 100644 img/selfhst/rancher-kubewarden.svg rename img/{system => selfhst}/rancher-light.svg (100%) create mode 100644 img/selfhst/rancher-longhorn-light.svg create mode 100644 img/selfhst/rancher-longhorn.svg create mode 100644 img/selfhst/rancher-opni-light.svg create mode 100644 img/selfhst/rancher-opni.svg create mode 100644 img/selfhst/rancher-rio-light.svg create mode 100644 img/selfhst/rancher-rio.svg create mode 100644 img/selfhst/rancher-rke-light.svg create mode 100644 img/selfhst/rancher-rke.svg create mode 100644 img/selfhst/rancher-submariner-light.svg create mode 100644 img/selfhst/rancher-submariner.svg rename img/{system => selfhst}/rancher.svg (100%) rename img/{system => selfhst}/raspberry-pi.svg (100%) rename img/{system => selfhst}/rclone.svg (100%) rename img/{system => selfhst}/reactive-resume-light.svg (100%) rename img/{system => selfhst}/reactive-resume.svg (100%) rename img/{system => selfhst}/readarr.svg (100%) rename img/{system => selfhst}/readeck.svg (100%) rename img/{system => selfhst}/receipt-wrangler.svg (100%) rename img/{system => selfhst}/recipesage.svg (100%) rename img/{system => selfhst}/redict.svg (100%) create mode 100644 img/selfhst/redis.svg create mode 100644 img/selfhst/redlib-light.svg create mode 100644 img/selfhst/redlib.svg create mode 100644 img/selfhst/redmine-light.svg create mode 100644 img/selfhst/redmine.svg rename img/{system => selfhst}/reolink-light.svg (100%) rename img/{system => selfhst}/reolink.svg (100%) rename img/{system => selfhst}/requestly.svg (100%) create mode 100644 img/selfhst/resilio-sync-light.svg create mode 100644 img/selfhst/resilio-sync.svg rename img/{system => selfhst}/restreamer.svg (100%) rename img/{system => selfhst}/revolt-light.svg (100%) rename img/{system => selfhst}/revolt.svg (100%) rename img/{system => selfhst}/rhasspy.svg (100%) rename img/{system => selfhst}/richy.svg (100%) rename img/{system => selfhst}/riverside-fm-light.svg (100%) rename img/{system => selfhst}/riverside-fm.svg (100%) rename img/{system => selfhst}/rocket-chat.svg (100%) rename img/{system => selfhst}/romm.svg (100%) rename img/{system => selfhst}/roundcube.svg (100%) rename img/{system => selfhst}/rss-bridge.svg (100%) rename img/{system => selfhst}/rss-translator.svg (100%) rename img/{system => selfhst}/rundeck.svg (100%) rename img/{system => selfhst}/runson-light.svg (100%) rename img/{system => selfhst}/runson.svg (100%) rename img/{system => selfhst}/sabnzbd.svg (100%) create mode 100644 img/selfhst/safeline.svg rename img/{system => selfhst}/saltcorn.svg (100%) create mode 100644 img/selfhst/scratch-map-light.svg create mode 100644 img/selfhst/scratch-map.svg rename img/{system => selfhst}/scrutiny-light.svg (100%) rename img/{system => selfhst}/scrutiny.svg (100%) rename img/{system => selfhst}/seafile.svg (100%) rename img/{system => selfhst}/searxng-light.svg (100%) rename img/{system => selfhst}/searxng.svg (100%) rename img/{system => selfhst}/secureai-tools-light.svg (100%) rename img/{system => selfhst}/secureai-tools.svg (100%) create mode 100644 img/selfhst/seedsync.svg rename img/{system => selfhst}/seelf.svg (100%) rename img/{system => selfhst}/self-hosted-gateway.svg (100%) rename img/{system => selfhst}/selfh-st-light.svg (100%) rename img/{system => selfhst}/selfh-st.svg (100%) create mode 100644 img/selfhst/semaphore-ui-light.svg create mode 100644 img/selfhst/semaphore-ui.svg rename img/{system => selfhst}/sendgrid.svg (100%) rename img/{system => selfhst}/servarr-light.svg (100%) rename img/{system => selfhst}/servarr.svg (100%) rename img/{system => selfhst}/shaarli.svg (100%) rename img/{system => selfhst}/shellhub-light.svg (100%) rename img/{system => selfhst}/shellhub.svg (100%) rename img/{system => selfhst}/shlink.svg (100%) rename img/{system => selfhst}/shoko-server-light.svg (100%) rename img/{system => selfhst}/shoko-server.svg (100%) rename img/{system => selfhst}/signal-light.svg (100%) rename img/{system => selfhst}/signal.svg (100%) create mode 100644 img/selfhst/signature-pdf-libre-light.svg create mode 100644 img/selfhst/signature-pdf-libre.svg rename img/{system => selfhst}/simplex-chat-light.svg (100%) rename img/{system => selfhst}/simplex-chat.svg (100%) rename img/{system => selfhst}/siyuan-light.svg (100%) rename img/{system => selfhst}/siyuan.svg (100%) rename img/{system => selfhst}/slash-light.svg (100%) rename img/{system => selfhst}/slash.svg (100%) rename img/{system => selfhst}/slskd-light.svg (100%) rename img/{system => selfhst}/slskd.svg (100%) rename img/{system => selfhst}/snikket.svg (100%) rename img/{system => selfhst}/socialhome-light.svg (100%) rename img/{system => selfhst}/socialhome.svg (100%) create mode 100644 img/selfhst/sofe-light.svg create mode 100644 img/selfhst/sofe.svg rename img/{system => selfhst}/solidtime-light.svg (100%) rename img/{system => selfhst}/solidtime.svg (100%) rename img/{system => selfhst}/sonarqube.svg (100%) create mode 100644 img/selfhst/sonarr-4k-light.svg create mode 100644 img/selfhst/sonarr-4k.svg create mode 100644 img/selfhst/sonarr-anime-light.svg create mode 100644 img/selfhst/sonarr-anime.svg create mode 100644 img/selfhst/sonarr-light.svg create mode 100644 img/selfhst/sonarr-radarr-light.svg create mode 100644 img/selfhst/sonarr-radarr.svg rename img/{system => selfhst}/sonarr.svg (100%) rename img/{system => selfhst}/specifically-clementines.svg (100%) rename img/{system => selfhst}/spoolman-light.svg (100%) rename img/{system => selfhst}/spoolman.svg (100%) rename img/{system => selfhst}/squirrel-servers-manager.svg (100%) create mode 100644 img/selfhst/squoosh.svg rename img/{system => selfhst}/sshwifty.svg (100%) rename img/{system => selfhst}/stalwart-mail-server.svg (100%) rename img/{system => selfhst}/standard-notes.svg (100%) rename img/{system => selfhst}/step-ca.svg (100%) rename img/{system => selfhst}/stirling-pdf.svg (100%) rename img/{system => selfhst}/stormkit.svg (100%) rename img/{system => selfhst}/subatic.svg (100%) rename img/{system => selfhst}/supabase.svg (100%) rename img/{system => selfhst}/swarmpit-light.svg (100%) rename img/{system => selfhst}/swarmpit.svg (100%) rename img/{system => selfhst}/synapse-light.svg (100%) rename img/{system => selfhst}/synapse.svg (100%) rename img/{system => selfhst}/syncthing.svg (100%) rename img/{system => selfhst}/synology-light.svg (100%) rename img/{system => selfhst}/synology.svg (100%) rename img/{system => selfhst}/tailscale-light.svg (100%) rename img/{system => selfhst}/tailscale.svg (100%) rename img/{system => selfhst}/tangerine-ui.svg (100%) create mode 100644 img/selfhst/tasmoadmin.svg rename img/{system => selfhst}/tautulli.svg (100%) rename img/{system => selfhst}/telegram.svg (100%) rename img/{system => selfhst}/teleport-light.svg (100%) rename img/{system => selfhst}/teleport.svg (100%) rename img/{system => selfhst}/teslamate-light.svg (100%) rename img/{system => selfhst}/teslamate.svg (100%) create mode 100644 img/selfhst/the-lounge-light.svg create mode 100644 img/selfhst/the-lounge.svg rename img/{system => selfhst}/threads-light.svg (100%) rename img/{system => selfhst}/threads.svg (100%) rename img/{system => selfhst}/thunderbird-light.svg (100%) rename img/{system => selfhst}/thunderbird.svg (100%) rename img/{system => selfhst}/tianji-light.svg (100%) rename img/{system => selfhst}/tianji.svg (100%) rename img/{system => selfhst}/tiddlywiki-light.svg (100%) rename img/{system => selfhst}/tiddlywiki.svg (100%) rename img/{system => selfhst}/tmdb-light.svg (100%) rename img/{system => selfhst}/tmdb.svg (100%) rename img/{system => selfhst}/tooljet.svg (100%) rename img/{system => selfhst}/touitomamout.svg (100%) rename img/{system => selfhst}/tp-link-light.svg (100%) rename img/{system => selfhst}/tp-link.svg (100%) rename img/{system => selfhst}/tpdb-light.svg (100%) rename img/{system => selfhst}/tpdb.svg (58%) rename img/{system => selfhst}/traccar.svg (100%) create mode 100644 img/selfhst/trackly-light.svg create mode 100644 img/selfhst/trackly.svg rename img/{system => selfhst}/traefik.svg (100%) rename img/{system => selfhst}/trakt-light.svg (100%) rename img/{system => selfhst}/trakt.svg (100%) rename img/{system => selfhst}/transmission.svg (100%) rename img/{system => selfhst}/trilium.svg (100%) rename img/{system => selfhst}/triliumnext.svg (100%) rename img/{system => selfhst}/truenas-core-light.svg (100%) rename img/{system => selfhst}/truenas-core.svg (100%) rename img/{system => selfhst}/truenas-scale-light.svg (100%) rename img/{system => selfhst}/truenas-scale.svg (100%) create mode 100644 img/selfhst/trusted-cgi-light.svg create mode 100644 img/selfhst/trusted-cgi.svg rename img/{system => selfhst}/tubesync-light.svg (100%) rename img/{system => selfhst}/tubesync.svg (100%) rename img/{system => selfhst}/tumblr-light.svg (100%) rename img/{system => selfhst}/tumblr.svg (100%) rename img/{system => selfhst}/tvdb-light.svg (100%) rename img/{system => selfhst}/tvdb.svg (100%) rename img/{system => selfhst}/twingate-light.svg (100%) rename img/{system => selfhst}/twingate.svg (100%) rename img/{system => selfhst}/typemill-light.svg (100%) rename img/{system => selfhst}/typemill.svg (100%) rename img/{system => selfhst}/ubiquiti-unifi-light.svg (100%) rename img/{system => selfhst}/ubiquiti-unifi.svg (100%) rename img/{system => selfhst}/umami-light.svg (100%) rename img/{system => selfhst}/umami.svg (100%) rename img/{system => selfhst}/umbrel.svg (100%) rename img/{system => selfhst}/unbound.svg (100%) rename img/{system => selfhst}/undb.svg (100%) rename img/{system => selfhst}/unifi-voucher-site.svg (100%) rename img/{system => selfhst}/unraid.svg (100%) rename img/{system => selfhst}/upsnap.svg (100%) rename img/{system => selfhst}/uptime-kuma.svg (100%) rename img/{system => selfhst}/valetudo-light.svg (100%) rename img/{system => selfhst}/valetudo.svg (100%) rename img/{system => selfhst}/valkey-light.svg (100%) rename img/{system => selfhst}/valkey.svg (100%) rename img/{system => selfhst}/vaultwarden-light.svg (100%) rename img/{system => selfhst}/vaultwarden.svg (100%) rename img/{system => selfhst}/vector.svg (100%) rename img/{system => selfhst}/victoriametrics-light.svg (100%) rename img/{system => selfhst}/victoriametrics.svg (100%) rename img/{system => selfhst}/vidzy.svg (100%) rename img/{system => selfhst}/vikunja.svg (100%) rename img/{system => selfhst}/viseron.svg (100%) rename img/{system => selfhst}/voilib-light.svg (100%) rename img/{system => selfhst}/voilib.svg (100%) rename img/{system => selfhst}/voltaserve-light.svg (100%) rename img/{system => selfhst}/voltaserve.svg (100%) rename img/{system => selfhst}/voron-light.svg (100%) rename img/{system => selfhst}/voron.svg (100%) rename img/{system => selfhst}/vuetorrent-light.svg (100%) rename img/{system => selfhst}/vuetorrent.svg (100%) rename img/{system => selfhst}/wakapi-light.svg (100%) rename img/{system => selfhst}/wakapi.svg (100%) rename img/{system => selfhst}/wallabag-light.svg (100%) rename img/{system => selfhst}/wallabag.svg (100%) rename img/{system => selfhst}/wanderer-light.svg (100%) rename img/{system => selfhst}/wanderer.svg (100%) rename img/{system => selfhst}/webtrees.svg (100%) rename img/{system => selfhst}/wekan.svg (100%) rename img/{system => selfhst}/wger.svg (100%) rename img/{system => selfhst}/whats-up-docker-light.svg (100%) rename img/{system => selfhst}/whats-up-docker.svg (100%) rename img/{system => selfhst}/wiki-js.svg (100%) rename img/{system => selfhst}/wikidocs.svg (100%) rename img/{system => selfhst}/wikipedia-light.svg (100%) rename img/{system => selfhst}/wikipedia.svg (100%) rename img/{system => selfhst}/willow.svg (100%) create mode 100644 img/selfhst/windmill-light.svg create mode 100644 img/selfhst/windmill.svg rename img/{system => selfhst}/windows-retro-light.svg (100%) rename img/{system => selfhst}/windows-retro.svg (100%) rename img/{system => selfhst}/wireguard.svg (100%) rename img/{system => selfhst}/wizarr.svg (100%) rename img/{system => selfhst}/woocommerce.svg (100%) rename img/{system => selfhst}/worklenz-light.svg (100%) rename img/{system => selfhst}/worklenz.svg (100%) rename img/{system => selfhst}/writefreely-light.svg (100%) rename img/{system => selfhst}/writefreely.svg (100%) rename img/{system => selfhst}/xbackbone.svg (100%) create mode 100644 img/selfhst/xen-orchestra.svg rename img/{system => selfhst}/xpipe-light.svg (100%) rename img/{system => selfhst}/xpipe.svg (100%) rename img/{system => selfhst}/xwiki-light.svg (100%) rename img/{system => selfhst}/xwiki.svg (100%) rename img/{system => selfhst}/yacht-light.svg (100%) rename img/{system => selfhst}/yacht.svg (100%) rename img/{system => selfhst}/yamtrack-light.svg (100%) rename img/{system => selfhst}/yamtrack.svg (100%) rename img/{system => selfhst}/yarr-light.svg (100%) rename img/{system => selfhst}/yarr.svg (100%) rename img/{system => selfhst}/ynab-light.svg (100%) rename img/{system => selfhst}/ynab.svg (100%) rename img/{system => selfhst}/your-spotify.svg (100%) rename img/{system => selfhst}/yourls.svg (100%) rename img/{system => selfhst}/youtube-dl.svg (100%) create mode 100644 img/selfhst/yunohost-light.svg create mode 100644 img/selfhst/yunohost.svg rename img/{system => selfhst}/z-wave-js-ui-light.svg (100%) rename img/{system => selfhst}/z-wave-js-ui.svg (100%) rename img/{system => selfhst}/zabbix.svg (100%) rename img/{system => selfhst}/zammad.svg (100%) create mode 100644 img/selfhst/zerotier-light.svg create mode 100644 img/selfhst/zerotier.svg rename img/{system => selfhst}/zigbee2mqtt.svg (100%) rename img/{system => selfhst}/zipcaptions-light.svg (100%) rename img/{system => selfhst}/zipcaptions.svg (100%) rename img/{system => selfhst}/zitadel-light.svg (100%) rename img/{system => selfhst}/zitadel.svg (100%) rename img/{system => selfhst}/zoraxy-light.svg (100%) rename img/{system => selfhst}/zoraxy.svg (100%) delete mode 100644 img/system/dozzle-light.svg delete mode 100644 img/system/dozzle.svg delete mode 100644 img/system/icon.svg delete mode 100644 img/system/immich-frame-light.svg delete mode 100644 img/system/immich-frame.svg rename img/{proc => system}/lxd_icon.svg (100%) rename img/{proc => system}/podman_icon.svg (100%) delete mode 100644 img/system/portainer.svg delete mode 100644 img/system/redlib.svg delete mode 100644 img/system/zwave-js-ui-light.svg delete mode 100644 img/system/zwave-js-ui.svg delete mode 100644 lang/app/strings/translations_da.properties delete mode 100644 lang/app/strings/translations_de.properties delete mode 100644 lang/app/strings/translations_en.properties delete mode 100644 lang/app/strings/translations_es.properties delete mode 100644 lang/app/strings/translations_fr.properties delete mode 100644 lang/app/strings/translations_it.properties delete mode 100644 lang/app/strings/translations_ja.properties delete mode 100644 lang/app/strings/translations_nl.properties delete mode 100644 lang/app/strings/translations_pt.properties delete mode 100644 lang/app/strings/translations_ru.properties delete mode 100644 lang/app/strings/translations_tr.properties delete mode 100644 lang/app/strings/translations_zh.properties delete mode 100644 lang/base/strings/fixed_en.properties delete mode 100644 lang/base/strings/translations_da.properties delete mode 100644 lang/base/strings/translations_de.properties delete mode 100644 lang/base/strings/translations_en.properties delete mode 100644 lang/base/strings/translations_es.properties delete mode 100644 lang/base/strings/translations_fr.properties delete mode 100644 lang/base/strings/translations_it.properties delete mode 100644 lang/base/strings/translations_ja.properties delete mode 100644 lang/base/strings/translations_nl.properties delete mode 100644 lang/base/strings/translations_pt.properties delete mode 100644 lang/base/strings/translations_ru.properties delete mode 100644 lang/base/strings/translations_tr.properties delete mode 100644 lang/base/strings/translations_zh.properties delete mode 100644 lang/jdbc/strings/translations_da.properties delete mode 100644 lang/jdbc/strings/translations_de.properties delete mode 100644 lang/jdbc/strings/translations_en.properties delete mode 100644 lang/jdbc/strings/translations_es.properties delete mode 100644 lang/jdbc/strings/translations_fr.properties delete mode 100644 lang/jdbc/strings/translations_it.properties delete mode 100644 lang/jdbc/strings/translations_ja.properties delete mode 100644 lang/jdbc/strings/translations_nl.properties delete mode 100644 lang/jdbc/strings/translations_pt.properties delete mode 100644 lang/jdbc/strings/translations_ru.properties delete mode 100644 lang/jdbc/strings/translations_tr.properties delete mode 100644 lang/jdbc/strings/translations_zh.properties delete mode 100644 lang/proc/strings/fixed_en.properties delete mode 100644 lang/proc/strings/translations_da.properties delete mode 100644 lang/proc/strings/translations_de.properties delete mode 100644 lang/proc/strings/translations_en.properties delete mode 100644 lang/proc/strings/translations_es.properties delete mode 100644 lang/proc/strings/translations_fr.properties delete mode 100644 lang/proc/strings/translations_it.properties delete mode 100644 lang/proc/strings/translations_ja.properties delete mode 100644 lang/proc/strings/translations_nl.properties delete mode 100644 lang/proc/strings/translations_pt.properties delete mode 100644 lang/proc/strings/translations_ru.properties delete mode 100644 lang/proc/strings/translations_tr.properties delete mode 100644 lang/proc/strings/translations_zh.properties delete mode 100644 lang/proc/texts/elevation_da.md delete mode 100644 lang/proc/texts/elevation_de.md delete mode 100644 lang/proc/texts/elevation_en.md delete mode 100644 lang/proc/texts/elevation_es.md delete mode 100644 lang/proc/texts/elevation_fr.md delete mode 100644 lang/proc/texts/elevation_it.md delete mode 100644 lang/proc/texts/elevation_ja.md delete mode 100644 lang/proc/texts/elevation_nl.md delete mode 100644 lang/proc/texts/elevation_pt.md delete mode 100644 lang/proc/texts/elevation_ru.md delete mode 100644 lang/proc/texts/elevation_tr.md delete mode 100644 lang/proc/texts/elevation_zh.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_da.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_de.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_en.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_es.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_fr.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_it.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_ja.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_nl.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_pt.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_ru.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_tr.md delete mode 100644 lang/proc/texts/rdpPasswordAuthentication_zh.md rename lang/{app => }/strings/fixed_en.properties (79%) create mode 100644 lang/strings/translations_da.properties create mode 100644 lang/strings/translations_de.properties create mode 100644 lang/strings/translations_en.properties create mode 100644 lang/strings/translations_es.properties create mode 100644 lang/strings/translations_fr.properties create mode 100644 lang/strings/translations_id.properties create mode 100644 lang/strings/translations_it.properties create mode 100644 lang/strings/translations_ja.properties create mode 100644 lang/strings/translations_nl.properties create mode 100644 lang/strings/translations_pl.properties create mode 100644 lang/strings/translations_pt.properties create mode 100644 lang/strings/translations_ru.properties create mode 100644 lang/strings/translations_sv.properties create mode 100644 lang/strings/translations_tr.properties create mode 100644 lang/strings/translations_zh.properties rename lang/{uacc => }/texts/contact_da.md (100%) rename lang/{uacc => }/texts/contact_de.md (100%) rename lang/{uacc => }/texts/contact_en.md (100%) rename lang/{uacc => }/texts/contact_es.md (100%) rename lang/{uacc => }/texts/contact_fr.md (100%) create mode 100644 lang/texts/contact_id.md rename lang/{uacc => }/texts/contact_it.md (100%) rename lang/{uacc => }/texts/contact_ja.md (100%) rename lang/{uacc => }/texts/contact_nl.md (100%) create mode 100644 lang/texts/contact_pl.md rename lang/{uacc => }/texts/contact_pt.md (100%) rename lang/{uacc => }/texts/contact_ru.md (100%) create mode 100644 lang/texts/contact_sv.md rename lang/{uacc => }/texts/contact_tr.md (100%) rename lang/{uacc => }/texts/contact_zh.md (100%) rename lang/{base => }/texts/elevation_da.md (100%) rename lang/{base => }/texts/elevation_de.md (100%) rename lang/{base => }/texts/elevation_en.md (100%) rename lang/{base => }/texts/elevation_es.md (100%) rename lang/{base => }/texts/elevation_fr.md (100%) create mode 100644 lang/texts/elevation_id.md rename lang/{base => }/texts/elevation_it.md (100%) rename lang/{base => }/texts/elevation_ja.md (100%) rename lang/{base => }/texts/elevation_nl.md (100%) create mode 100644 lang/texts/elevation_pl.md rename lang/{base => }/texts/elevation_pt.md (100%) rename lang/{base => }/texts/elevation_ru.md (100%) create mode 100644 lang/texts/elevation_sv.md rename lang/{base => }/texts/elevation_tr.md (100%) rename lang/{base => }/texts/elevation_zh.md (100%) rename lang/{proc => }/texts/environmentScript_da.md (100%) rename lang/{proc => }/texts/environmentScript_de.md (100%) rename lang/{proc => }/texts/environmentScript_en.md (100%) rename lang/{proc => }/texts/environmentScript_es.md (100%) rename lang/{proc => }/texts/environmentScript_fr.md (100%) create mode 100644 lang/texts/environmentScript_id.md rename lang/{proc => }/texts/environmentScript_it.md (100%) rename lang/{proc => }/texts/environmentScript_ja.md (100%) rename lang/{proc => }/texts/environmentScript_nl.md (100%) create mode 100644 lang/texts/environmentScript_pl.md rename lang/{proc => }/texts/environmentScript_pt.md (100%) rename lang/{proc => }/texts/environmentScript_ru.md (100%) create mode 100644 lang/texts/environmentScript_sv.md rename lang/{proc => }/texts/environmentScript_tr.md (100%) rename lang/{proc => }/texts/environmentScript_zh.md (100%) rename lang/{base => }/texts/executionType_da.md (100%) rename lang/{base => }/texts/executionType_de.md (100%) rename lang/{base => }/texts/executionType_en.md (100%) rename lang/{base => }/texts/executionType_es.md (100%) rename lang/{base => }/texts/executionType_fr.md (100%) create mode 100644 lang/texts/executionType_id.md rename lang/{base => }/texts/executionType_it.md (100%) rename lang/{base => }/texts/executionType_ja.md (100%) rename lang/{base => }/texts/executionType_nl.md (100%) create mode 100644 lang/texts/executionType_pl.md rename lang/{base => }/texts/executionType_pt.md (100%) rename lang/{base => }/texts/executionType_ru.md (100%) create mode 100644 lang/texts/executionType_sv.md rename lang/{base => }/texts/executionType_tr.md (100%) rename lang/{base => }/texts/executionType_zh.md (100%) rename lang/{uacc => }/texts/licenseActivated_da.md (100%) rename lang/{uacc => }/texts/licenseActivated_de.md (100%) rename lang/{uacc => }/texts/licenseActivated_en.md (100%) rename lang/{uacc => }/texts/licenseActivated_es.md (100%) rename lang/{uacc => }/texts/licenseActivated_fr.md (100%) create mode 100644 lang/texts/licenseActivated_id.md rename lang/{uacc => }/texts/licenseActivated_it.md (100%) rename lang/{uacc => }/texts/licenseActivated_ja.md (100%) rename lang/{uacc => }/texts/licenseActivated_nl.md (100%) create mode 100644 lang/texts/licenseActivated_pl.md rename lang/{uacc => }/texts/licenseActivated_pt.md (100%) rename lang/{uacc => }/texts/licenseActivated_ru.md (100%) create mode 100644 lang/texts/licenseActivated_sv.md rename lang/{uacc => }/texts/licenseActivated_tr.md (100%) rename lang/{uacc => }/texts/licenseActivated_zh.md (100%) rename lang/{proc => }/texts/proxmoxPassword_da.md (100%) rename lang/{proc => }/texts/proxmoxPassword_de.md (100%) rename lang/{proc => }/texts/proxmoxPassword_en.md (100%) rename lang/{proc => }/texts/proxmoxPassword_es.md (100%) rename lang/{proc => }/texts/proxmoxPassword_fr.md (100%) create mode 100644 lang/texts/proxmoxPassword_id.md rename lang/{proc => }/texts/proxmoxPassword_it.md (100%) rename lang/{proc => }/texts/proxmoxPassword_ja.md (100%) rename lang/{proc => }/texts/proxmoxPassword_nl.md (100%) create mode 100644 lang/texts/proxmoxPassword_pl.md rename lang/{proc => }/texts/proxmoxPassword_pt.md (100%) rename lang/{proc => }/texts/proxmoxPassword_ru.md (100%) create mode 100644 lang/texts/proxmoxPassword_sv.md rename lang/{proc => }/texts/proxmoxPassword_tr.md (100%) rename lang/{proc => }/texts/proxmoxPassword_zh.md (100%) rename lang/{proc => }/texts/proxmoxUsername_da.md (100%) rename lang/{proc => }/texts/proxmoxUsername_de.md (100%) rename lang/{proc => }/texts/proxmoxUsername_en.md (100%) rename lang/{proc => }/texts/proxmoxUsername_es.md (100%) rename lang/{proc => }/texts/proxmoxUsername_fr.md (100%) create mode 100644 lang/texts/proxmoxUsername_id.md rename lang/{proc => }/texts/proxmoxUsername_it.md (100%) rename lang/{proc => }/texts/proxmoxUsername_ja.md (100%) rename lang/{proc => }/texts/proxmoxUsername_nl.md (100%) create mode 100644 lang/texts/proxmoxUsername_pl.md rename lang/{proc => }/texts/proxmoxUsername_pt.md (100%) rename lang/{proc => }/texts/proxmoxUsername_ru.md (100%) create mode 100644 lang/texts/proxmoxUsername_sv.md rename lang/{proc => }/texts/proxmoxUsername_tr.md (100%) rename lang/{proc => }/texts/proxmoxUsername_zh.md (100%) rename lang/{proc => }/texts/psSessionGateway_da.md (100%) rename lang/{proc => }/texts/psSessionGateway_de.md (100%) rename lang/{proc => }/texts/psSessionGateway_en.md (100%) rename lang/{proc => }/texts/psSessionGateway_es.md (100%) rename lang/{proc => }/texts/psSessionGateway_fr.md (100%) create mode 100644 lang/texts/psSessionGateway_id.md rename lang/{proc => }/texts/psSessionGateway_it.md (100%) rename lang/{proc => }/texts/psSessionGateway_ja.md (100%) rename lang/{proc => }/texts/psSessionGateway_nl.md (100%) create mode 100644 lang/texts/psSessionGateway_pl.md rename lang/{proc => }/texts/psSessionGateway_pt.md (100%) rename lang/{proc => }/texts/psSessionGateway_ru.md (100%) create mode 100644 lang/texts/psSessionGateway_sv.md rename lang/{proc => }/texts/psSessionGateway_tr.md (100%) rename lang/{proc => }/texts/psSessionGateway_zh.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_da.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_de.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_en.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_es.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_fr.md (100%) create mode 100644 lang/texts/rdpAdditionalOptions_id.md rename lang/{proc => }/texts/rdpAdditionalOptions_it.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_ja.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_nl.md (100%) create mode 100644 lang/texts/rdpAdditionalOptions_pl.md rename lang/{proc => }/texts/rdpAdditionalOptions_pt.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_ru.md (100%) create mode 100644 lang/texts/rdpAdditionalOptions_sv.md rename lang/{proc => }/texts/rdpAdditionalOptions_tr.md (100%) rename lang/{proc => }/texts/rdpAdditionalOptions_zh.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_da.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_de.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_en.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_es.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_fr.md (100%) create mode 100644 lang/texts/rdpFileAllowListCheck_id.md rename lang/{proc => }/texts/rdpFileAllowListCheck_it.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_ja.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_nl.md (100%) create mode 100644 lang/texts/rdpFileAllowListCheck_pl.md rename lang/{proc => }/texts/rdpFileAllowListCheck_pt.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_ru.md (100%) create mode 100644 lang/texts/rdpFileAllowListCheck_sv.md rename lang/{proc => }/texts/rdpFileAllowListCheck_tr.md (100%) rename lang/{proc => }/texts/rdpFileAllowListCheck_zh.md (100%) rename lang/{proc => }/texts/rdpFileAllowList_da.md (82%) rename lang/{proc => }/texts/rdpFileAllowList_de.md (74%) rename lang/{proc => }/texts/rdpFileAllowList_en.md (96%) rename lang/{proc => }/texts/rdpFileAllowList_es.md (90%) rename lang/{proc => }/texts/rdpFileAllowList_fr.md (72%) create mode 100644 lang/texts/rdpFileAllowList_id.md rename lang/{proc => }/texts/rdpFileAllowList_it.md (71%) rename lang/{proc => }/texts/rdpFileAllowList_ja.md (88%) rename lang/{proc => }/texts/rdpFileAllowList_nl.md (60%) create mode 100644 lang/texts/rdpFileAllowList_pl.md rename lang/{proc => }/texts/rdpFileAllowList_pt.md (87%) rename lang/{proc => }/texts/rdpFileAllowList_ru.md (85%) create mode 100644 lang/texts/rdpFileAllowList_sv.md rename lang/{proc => }/texts/rdpFileAllowList_tr.md (68%) rename lang/{proc => }/texts/rdpFileAllowList_zh.md (87%) rename lang/{proc => }/texts/rdpTunnelHost_da.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_de.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_en.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_es.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_fr.md (100%) create mode 100644 lang/texts/rdpTunnelHost_id.md rename lang/{proc => }/texts/rdpTunnelHost_it.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_ja.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_nl.md (100%) create mode 100644 lang/texts/rdpTunnelHost_pl.md rename lang/{proc => }/texts/rdpTunnelHost_pt.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_ru.md (100%) create mode 100644 lang/texts/rdpTunnelHost_sv.md rename lang/{proc => }/texts/rdpTunnelHost_tr.md (100%) rename lang/{proc => }/texts/rdpTunnelHost_zh.md (100%) rename lang/{proc => }/texts/runTempContainer_da.md (100%) rename lang/{proc => }/texts/runTempContainer_de.md (100%) rename lang/{proc => }/texts/runTempContainer_en.md (100%) rename lang/{proc => }/texts/runTempContainer_es.md (100%) rename lang/{proc => }/texts/runTempContainer_fr.md (100%) create mode 100644 lang/texts/runTempContainer_id.md rename lang/{proc => }/texts/runTempContainer_it.md (100%) rename lang/{proc => }/texts/runTempContainer_ja.md (100%) rename lang/{proc => }/texts/runTempContainer_nl.md (100%) create mode 100644 lang/texts/runTempContainer_pl.md rename lang/{proc => }/texts/runTempContainer_pt.md (100%) rename lang/{proc => }/texts/runTempContainer_ru.md (100%) create mode 100644 lang/texts/runTempContainer_sv.md rename lang/{proc => }/texts/runTempContainer_tr.md (100%) rename lang/{proc => }/texts/runTempContainer_zh.md (100%) rename lang/{base => }/texts/scriptCompatibility_da.md (100%) rename lang/{base => }/texts/scriptCompatibility_de.md (100%) rename lang/{base => }/texts/scriptCompatibility_en.md (100%) rename lang/{base => }/texts/scriptCompatibility_es.md (100%) rename lang/{base => }/texts/scriptCompatibility_fr.md (100%) create mode 100644 lang/texts/scriptCompatibility_id.md rename lang/{base => }/texts/scriptCompatibility_it.md (100%) rename lang/{base => }/texts/scriptCompatibility_ja.md (100%) rename lang/{base => }/texts/scriptCompatibility_nl.md (100%) create mode 100644 lang/texts/scriptCompatibility_pl.md rename lang/{base => }/texts/scriptCompatibility_pt.md (100%) rename lang/{base => }/texts/scriptCompatibility_ru.md (100%) create mode 100644 lang/texts/scriptCompatibility_sv.md rename lang/{base => }/texts/scriptCompatibility_tr.md (100%) rename lang/{base => }/texts/scriptCompatibility_zh.md (100%) rename lang/{base => }/texts/scriptDependencies_da.md (100%) rename lang/{base => }/texts/scriptDependencies_de.md (100%) rename lang/{base => }/texts/scriptDependencies_en.md (100%) rename lang/{base => }/texts/scriptDependencies_es.md (100%) rename lang/{base => }/texts/scriptDependencies_fr.md (100%) create mode 100644 lang/texts/scriptDependencies_id.md rename lang/{base => }/texts/scriptDependencies_it.md (100%) rename lang/{base => }/texts/scriptDependencies_ja.md (100%) rename lang/{base => }/texts/scriptDependencies_nl.md (100%) create mode 100644 lang/texts/scriptDependencies_pl.md rename lang/{base => }/texts/scriptDependencies_pt.md (100%) rename lang/{base => }/texts/scriptDependencies_ru.md (100%) create mode 100644 lang/texts/scriptDependencies_sv.md rename lang/{base => }/texts/scriptDependencies_tr.md (100%) rename lang/{base => }/texts/scriptDependencies_zh.md (100%) rename lang/{base => }/texts/script_da.md (100%) rename lang/{base => }/texts/script_de.md (100%) rename lang/{base => }/texts/script_en.md (100%) rename lang/{base => }/texts/script_es.md (100%) rename lang/{base => }/texts/script_fr.md (100%) create mode 100644 lang/texts/script_id.md rename lang/{base => }/texts/script_it.md (100%) rename lang/{base => }/texts/script_ja.md (100%) rename lang/{base => }/texts/script_nl.md (100%) create mode 100644 lang/texts/script_pl.md rename lang/{base => }/texts/script_pt.md (100%) rename lang/{base => }/texts/script_ru.md (100%) create mode 100644 lang/texts/script_sv.md rename lang/{base => }/texts/script_tr.md (100%) rename lang/{base => }/texts/script_zh.md (100%) rename lang/{proc => }/texts/serialImplementation_da.md (100%) rename lang/{proc => }/texts/serialImplementation_de.md (100%) rename lang/{proc => }/texts/serialImplementation_en.md (100%) rename lang/{proc => }/texts/serialImplementation_es.md (100%) rename lang/{proc => }/texts/serialImplementation_fr.md (100%) create mode 100644 lang/texts/serialImplementation_id.md rename lang/{proc => }/texts/serialImplementation_it.md (100%) rename lang/{proc => }/texts/serialImplementation_ja.md (100%) rename lang/{proc => }/texts/serialImplementation_nl.md (100%) create mode 100644 lang/texts/serialImplementation_pl.md rename lang/{proc => }/texts/serialImplementation_pt.md (100%) rename lang/{proc => }/texts/serialImplementation_ru.md (100%) create mode 100644 lang/texts/serialImplementation_sv.md rename lang/{proc => }/texts/serialImplementation_tr.md (100%) rename lang/{proc => }/texts/serialImplementation_zh.md (100%) rename lang/{proc => }/texts/serialPort_da.md (100%) rename lang/{proc => }/texts/serialPort_de.md (100%) rename lang/{proc => }/texts/serialPort_en.md (100%) rename lang/{proc => }/texts/serialPort_es.md (100%) rename lang/{proc => }/texts/serialPort_fr.md (100%) create mode 100644 lang/texts/serialPort_id.md rename lang/{proc => }/texts/serialPort_it.md (100%) rename lang/{proc => }/texts/serialPort_ja.md (100%) rename lang/{proc => }/texts/serialPort_nl.md (100%) create mode 100644 lang/texts/serialPort_pl.md rename lang/{proc => }/texts/serialPort_pt.md (100%) rename lang/{proc => }/texts/serialPort_ru.md (100%) create mode 100644 lang/texts/serialPort_sv.md rename lang/{proc => }/texts/serialPort_tr.md (100%) rename lang/{proc => }/texts/serialPort_zh.md (100%) rename lang/{proc => }/texts/shellCommand_da.md (100%) rename lang/{proc => }/texts/shellCommand_de.md (100%) rename lang/{proc => }/texts/shellCommand_en.md (100%) rename lang/{proc => }/texts/shellCommand_es.md (100%) rename lang/{proc => }/texts/shellCommand_fr.md (100%) create mode 100644 lang/texts/shellCommand_id.md rename lang/{proc => }/texts/shellCommand_it.md (100%) rename lang/{proc => }/texts/shellCommand_ja.md (100%) rename lang/{proc => }/texts/shellCommand_nl.md (100%) create mode 100644 lang/texts/shellCommand_pl.md rename lang/{proc => }/texts/shellCommand_pt.md (100%) rename lang/{proc => }/texts/shellCommand_ru.md (100%) create mode 100644 lang/texts/shellCommand_sv.md rename lang/{proc => }/texts/shellCommand_tr.md (100%) rename lang/{proc => }/texts/shellCommand_zh.md (100%) rename lang/{proc => }/texts/sshConfigs_da.md (100%) rename lang/{proc => }/texts/sshConfigs_de.md (100%) rename lang/{proc => }/texts/sshConfigs_en.md (100%) rename lang/{proc => }/texts/sshConfigs_es.md (100%) rename lang/{proc => }/texts/sshConfigs_fr.md (100%) create mode 100644 lang/texts/sshConfigs_id.md rename lang/{proc => }/texts/sshConfigs_it.md (100%) rename lang/{proc => }/texts/sshConfigs_ja.md (100%) rename lang/{proc => }/texts/sshConfigs_nl.md (100%) create mode 100644 lang/texts/sshConfigs_pl.md rename lang/{proc => }/texts/sshConfigs_pt.md (100%) rename lang/{proc => }/texts/sshConfigs_ru.md (100%) create mode 100644 lang/texts/sshConfigs_sv.md rename lang/{proc => }/texts/sshConfigs_tr.md (100%) rename lang/{proc => }/texts/sshConfigs_zh.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_da.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_de.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_en.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_es.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_fr.md (100%) create mode 100644 lang/texts/sshDontInteractWithSystem_id.md rename lang/{proc => }/texts/sshDontInteractWithSystem_it.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_ja.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_nl.md (100%) create mode 100644 lang/texts/sshDontInteractWithSystem_pl.md rename lang/{proc => }/texts/sshDontInteractWithSystem_pt.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_ru.md (100%) create mode 100644 lang/texts/sshDontInteractWithSystem_sv.md rename lang/{proc => }/texts/sshDontInteractWithSystem_tr.md (100%) rename lang/{proc => }/texts/sshDontInteractWithSystem_zh.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_da.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_de.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_en.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_es.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_fr.md (100%) create mode 100644 lang/texts/sshDynamicTunnelBinding_id.md rename lang/{proc => }/texts/sshDynamicTunnelBinding_it.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_ja.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_nl.md (100%) create mode 100644 lang/texts/sshDynamicTunnelBinding_pl.md rename lang/{proc => }/texts/sshDynamicTunnelBinding_pt.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_ru.md (100%) create mode 100644 lang/texts/sshDynamicTunnelBinding_sv.md rename lang/{proc => }/texts/sshDynamicTunnelBinding_tr.md (100%) rename lang/{proc => }/texts/sshDynamicTunnelBinding_zh.md (100%) rename lang/{proc => }/texts/sshForwardX11_da.md (100%) rename lang/{proc => }/texts/sshForwardX11_de.md (100%) rename lang/{proc => }/texts/sshForwardX11_en.md (100%) rename lang/{proc => }/texts/sshForwardX11_es.md (100%) rename lang/{proc => }/texts/sshForwardX11_fr.md (100%) create mode 100644 lang/texts/sshForwardX11_id.md rename lang/{proc => }/texts/sshForwardX11_it.md (100%) rename lang/{proc => }/texts/sshForwardX11_ja.md (100%) rename lang/{proc => }/texts/sshForwardX11_nl.md (100%) create mode 100644 lang/texts/sshForwardX11_pl.md rename lang/{proc => }/texts/sshForwardX11_pt.md (100%) rename lang/{proc => }/texts/sshForwardX11_ru.md (100%) create mode 100644 lang/texts/sshForwardX11_sv.md rename lang/{proc => }/texts/sshForwardX11_tr.md (100%) rename lang/{proc => }/texts/sshForwardX11_zh.md (100%) rename lang/{proc => }/texts/sshGateway_da.md (100%) rename lang/{proc => }/texts/sshGateway_de.md (100%) rename lang/{proc => }/texts/sshGateway_en.md (100%) rename lang/{proc => }/texts/sshGateway_es.md (100%) rename lang/{proc => }/texts/sshGateway_fr.md (100%) create mode 100644 lang/texts/sshGateway_id.md rename lang/{proc => }/texts/sshGateway_it.md (100%) rename lang/{proc => }/texts/sshGateway_ja.md (100%) rename lang/{proc => }/texts/sshGateway_nl.md (100%) create mode 100644 lang/texts/sshGateway_pl.md rename lang/{proc => }/texts/sshGateway_pt.md (100%) rename lang/{proc => }/texts/sshGateway_ru.md (100%) create mode 100644 lang/texts/sshGateway_sv.md rename lang/{proc => }/texts/sshGateway_tr.md (100%) rename lang/{proc => }/texts/sshGateway_zh.md (100%) rename lang/{proc => }/texts/sshInteraction_da.md (100%) rename lang/{proc => }/texts/sshInteraction_de.md (100%) rename lang/{proc => }/texts/sshInteraction_en.md (100%) rename lang/{proc => }/texts/sshInteraction_es.md (100%) rename lang/{proc => }/texts/sshInteraction_fr.md (100%) create mode 100644 lang/texts/sshInteraction_id.md rename lang/{proc => }/texts/sshInteraction_it.md (100%) rename lang/{proc => }/texts/sshInteraction_ja.md (100%) rename lang/{proc => }/texts/sshInteraction_nl.md (100%) create mode 100644 lang/texts/sshInteraction_pl.md rename lang/{proc => }/texts/sshInteraction_pt.md (100%) rename lang/{proc => }/texts/sshInteraction_ru.md (100%) create mode 100644 lang/texts/sshInteraction_sv.md rename lang/{proc => }/texts/sshInteraction_tr.md (100%) rename lang/{proc => }/texts/sshInteraction_zh.md (100%) rename lang/{proc => }/texts/sshKey_da.md (100%) rename lang/{proc => }/texts/sshKey_de.md (100%) rename lang/{proc => }/texts/sshKey_en.md (100%) rename lang/{proc => }/texts/sshKey_es.md (100%) rename lang/{proc => }/texts/sshKey_fr.md (100%) create mode 100644 lang/texts/sshKey_id.md rename lang/{proc => }/texts/sshKey_it.md (100%) rename lang/{proc => }/texts/sshKey_ja.md (100%) rename lang/{proc => }/texts/sshKey_nl.md (100%) create mode 100644 lang/texts/sshKey_pl.md rename lang/{proc => }/texts/sshKey_pt.md (100%) rename lang/{proc => }/texts/sshKey_ru.md (100%) create mode 100644 lang/texts/sshKey_sv.md rename lang/{proc => }/texts/sshKey_tr.md (100%) rename lang/{proc => }/texts/sshKey_zh.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_da.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_de.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_en.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_es.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_fr.md (100%) create mode 100644 lang/texts/sshLocalTunnelBinding_id.md rename lang/{proc => }/texts/sshLocalTunnelBinding_it.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_ja.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_nl.md (100%) create mode 100644 lang/texts/sshLocalTunnelBinding_pl.md rename lang/{proc => }/texts/sshLocalTunnelBinding_pt.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_ru.md (100%) create mode 100644 lang/texts/sshLocalTunnelBinding_sv.md rename lang/{proc => }/texts/sshLocalTunnelBinding_tr.md (100%) rename lang/{proc => }/texts/sshLocalTunnelBinding_zh.md (100%) rename lang/{proc => }/texts/sshOptions_da.md (100%) rename lang/{proc => }/texts/sshOptions_de.md (100%) rename lang/{proc => }/texts/sshOptions_en.md (100%) rename lang/{proc => }/texts/sshOptions_es.md (100%) rename lang/{proc => }/texts/sshOptions_fr.md (100%) create mode 100644 lang/texts/sshOptions_id.md rename lang/{proc => }/texts/sshOptions_it.md (100%) rename lang/{proc => }/texts/sshOptions_ja.md (100%) rename lang/{proc => }/texts/sshOptions_nl.md (100%) create mode 100644 lang/texts/sshOptions_pl.md rename lang/{proc => }/texts/sshOptions_pt.md (100%) rename lang/{proc => }/texts/sshOptions_ru.md (100%) create mode 100644 lang/texts/sshOptions_sv.md rename lang/{proc => }/texts/sshOptions_tr.md (100%) rename lang/{proc => }/texts/sshOptions_zh.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_da.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_de.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_en.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_es.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_fr.md (100%) create mode 100644 lang/texts/sshRemoteTunnelBinding_id.md rename lang/{proc => }/texts/sshRemoteTunnelBinding_it.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_ja.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_nl.md (100%) create mode 100644 lang/texts/sshRemoteTunnelBinding_pl.md rename lang/{proc => }/texts/sshRemoteTunnelBinding_pt.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_ru.md (100%) create mode 100644 lang/texts/sshRemoteTunnelBinding_sv.md rename lang/{proc => }/texts/sshRemoteTunnelBinding_tr.md (100%) rename lang/{proc => }/texts/sshRemoteTunnelBinding_zh.md (100%) rename lang/{app => }/texts/termiusSetup_da.md (100%) rename lang/{app => }/texts/termiusSetup_de.md (100%) rename lang/{app => }/texts/termiusSetup_en.md (100%) rename lang/{app => }/texts/termiusSetup_es.md (100%) rename lang/{app => }/texts/termiusSetup_fr.md (100%) create mode 100644 lang/texts/termiusSetup_id.md rename lang/{app => }/texts/termiusSetup_it.md (100%) rename lang/{app => }/texts/termiusSetup_ja.md (100%) rename lang/{app => }/texts/termiusSetup_nl.md (100%) create mode 100644 lang/texts/termiusSetup_pl.md rename lang/{app => }/texts/termiusSetup_pt.md (100%) rename lang/{app => }/texts/termiusSetup_ru.md (100%) create mode 100644 lang/texts/termiusSetup_sv.md rename lang/{app => }/texts/termiusSetup_tr.md (100%) rename lang/{app => }/texts/termiusSetup_zh.md (100%) rename lang/{app => }/texts/vault_da.md (100%) rename lang/{app => }/texts/vault_de.md (100%) rename lang/{app => }/texts/vault_en.md (100%) rename lang/{app => }/texts/vault_es.md (100%) rename lang/{app => }/texts/vault_fr.md (100%) create mode 100644 lang/texts/vault_id.md rename lang/{app => }/texts/vault_it.md (100%) rename lang/{app => }/texts/vault_ja.md (100%) rename lang/{app => }/texts/vault_nl.md (100%) create mode 100644 lang/texts/vault_pl.md rename lang/{app => }/texts/vault_pt.md (100%) rename lang/{app => }/texts/vault_ru.md (100%) create mode 100644 lang/texts/vault_sv.md rename lang/{app => }/texts/vault_tr.md (100%) rename lang/{app => }/texts/vault_zh.md (100%) rename lang/{proc => }/texts/vmwarePassword_da.md (100%) rename lang/{proc => }/texts/vmwarePassword_de.md (100%) rename lang/{proc => }/texts/vmwarePassword_en.md (100%) rename lang/{proc => }/texts/vmwarePassword_es.md (100%) rename lang/{proc => }/texts/vmwarePassword_fr.md (100%) create mode 100644 lang/texts/vmwarePassword_id.md rename lang/{proc => }/texts/vmwarePassword_it.md (100%) rename lang/{proc => }/texts/vmwarePassword_ja.md (100%) rename lang/{proc => }/texts/vmwarePassword_nl.md (100%) create mode 100644 lang/texts/vmwarePassword_pl.md rename lang/{proc => }/texts/vmwarePassword_pt.md (100%) rename lang/{proc => }/texts/vmwarePassword_ru.md (100%) create mode 100644 lang/texts/vmwarePassword_sv.md rename lang/{proc => }/texts/vmwarePassword_tr.md (100%) rename lang/{proc => }/texts/vmwarePassword_zh.md (100%) rename lang/{proc => }/texts/vncSystem_da.md (100%) rename lang/{proc => }/texts/vncSystem_de.md (100%) rename lang/{proc => }/texts/vncSystem_en.md (100%) rename lang/{proc => }/texts/vncSystem_es.md (100%) rename lang/{proc => }/texts/vncSystem_fr.md (100%) create mode 100644 lang/texts/vncSystem_id.md rename lang/{proc => }/texts/vncSystem_it.md (100%) rename lang/{proc => }/texts/vncSystem_ja.md (100%) rename lang/{proc => }/texts/vncSystem_nl.md (100%) create mode 100644 lang/texts/vncSystem_pl.md rename lang/{proc => }/texts/vncSystem_pt.md (100%) rename lang/{proc => }/texts/vncSystem_ru.md (100%) create mode 100644 lang/texts/vncSystem_sv.md rename lang/{proc => }/texts/vncSystem_tr.md (100%) rename lang/{proc => }/texts/vncSystem_zh.md (100%) rename lang/{proc => }/texts/vncTunnelHost_da.md (100%) rename lang/{proc => }/texts/vncTunnelHost_de.md (100%) rename lang/{proc => }/texts/vncTunnelHost_en.md (100%) rename lang/{proc => }/texts/vncTunnelHost_es.md (100%) rename lang/{proc => }/texts/vncTunnelHost_fr.md (100%) create mode 100644 lang/texts/vncTunnelHost_id.md rename lang/{proc => }/texts/vncTunnelHost_it.md (100%) rename lang/{proc => }/texts/vncTunnelHost_ja.md (100%) rename lang/{proc => }/texts/vncTunnelHost_nl.md (100%) create mode 100644 lang/texts/vncTunnelHost_pl.md rename lang/{proc => }/texts/vncTunnelHost_pt.md (100%) rename lang/{proc => }/texts/vncTunnelHost_ru.md (100%) create mode 100644 lang/texts/vncTunnelHost_sv.md rename lang/{proc => }/texts/vncTunnelHost_tr.md (100%) rename lang/{proc => }/texts/vncTunnelHost_zh.md (100%) rename lang/{app => }/texts/xshellSetup_da.md (100%) rename lang/{app => }/texts/xshellSetup_de.md (100%) rename lang/{app => }/texts/xshellSetup_en.md (100%) rename lang/{app => }/texts/xshellSetup_es.md (100%) rename lang/{app => }/texts/xshellSetup_fr.md (100%) create mode 100644 lang/texts/xshellSetup_id.md rename lang/{app => }/texts/xshellSetup_it.md (100%) rename lang/{app => }/texts/xshellSetup_ja.md (100%) rename lang/{app => }/texts/xshellSetup_nl.md (100%) create mode 100644 lang/texts/xshellSetup_pl.md rename lang/{app => }/texts/xshellSetup_pt.md (100%) rename lang/{app => }/texts/xshellSetup_ru.md (100%) create mode 100644 lang/texts/xshellSetup_sv.md rename lang/{app => }/texts/xshellSetup_tr.md (100%) rename lang/{app => }/texts/xshellSetup_zh.md (100%) delete mode 100644 lang/uacc/strings/fixed_en.properties delete mode 100644 lang/uacc/strings/translations_da.properties delete mode 100644 lang/uacc/strings/translations_de.properties delete mode 100644 lang/uacc/strings/translations_en.properties delete mode 100644 lang/uacc/strings/translations_es.properties delete mode 100644 lang/uacc/strings/translations_fr.properties delete mode 100644 lang/uacc/strings/translations_it.properties delete mode 100644 lang/uacc/strings/translations_ja.properties delete mode 100644 lang/uacc/strings/translations_nl.properties delete mode 100644 lang/uacc/strings/translations_pt.properties delete mode 100644 lang/uacc/strings/translations_ru.properties delete mode 100644 lang/uacc/strings/translations_tr.properties delete mode 100644 lang/uacc/strings/translations_zh.properties delete mode 100644 lang/uacc/texts/preview_da.md delete mode 100644 lang/uacc/texts/preview_de.md delete mode 100644 lang/uacc/texts/preview_en.md delete mode 100644 lang/uacc/texts/preview_es.md delete mode 100644 lang/uacc/texts/preview_fr.md delete mode 100644 lang/uacc/texts/preview_it.md delete mode 100644 lang/uacc/texts/preview_ja.md delete mode 100644 lang/uacc/texts/preview_nl.md delete mode 100644 lang/uacc/texts/preview_pt.md delete mode 100644 lang/uacc/texts/preview_ru.md delete mode 100644 lang/uacc/texts/preview_tr.md delete mode 100644 lang/uacc/texts/preview_zh.md diff --git a/LICENSE.md b/LICENSE.md index a71e62a8f..a820047ce 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -187,7 +187,8 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright 2024 Christopher Schnick +Copyright 2023 Christopher Schnick +Copyright 2023 XPipe UG (haftungsbeschränkt) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 444c543e8..b13d7aff6 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,9 @@ are not able to resolve and install any dependency packages. ### RHEL-based distros +The rpm releases are signed with the GPG key https://xpipe.io/signatures/crschnick.asc. +You can import it via `rpm --import https://xpipe.io/signatures/crschnick.asc` to allow your rpm-based package manager to verify the release signature. + The following rpm installers are available: - [Linux .rpm Installer (x86-64)](https://github.com/xpipe-io/xpipe/releases/latest/download/xpipe-installer-linux-x86_64.rpm) diff --git a/app/build.gradle b/app/build.gradle index 28760a4e1..6aa569d65 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ dependencies { api project(':beacon') compileOnly 'org.hamcrest:hamcrest:3.0' - compileOnly 'org.junit.jupiter:junit-jupiter-api:5.11.3' - compileOnly 'org.junit.jupiter:junit-jupiter-params:5.11.3' + compileOnly 'org.junit.jupiter:junit-jupiter-api:5.11.4' + compileOnly 'org.junit.jupiter:junit-jupiter-params:5.11.4' api 'com.vladsch.flexmark:flexmark:0.64.8' api 'com.vladsch.flexmark:flexmark-util:0.64.8' @@ -56,10 +56,10 @@ dependencies { exclude group: 'org.apache.commons', module: 'commons-lang3' } api 'org.apache.commons:commons-lang3:3.17.0' - api 'io.sentry:sentry:7.18.0' + api 'io.sentry:sentry:7.20.0' api 'commons-io:commons-io:2.18.0' - api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "2.18.1" - api group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: "2.18.1" + api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "2.18.2" + api group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: "2.18.2" api group: 'org.kordamp.ikonli', name: 'ikonli-material2-pack', version: "12.2.0" api group: 'org.kordamp.ikonli', name: 'ikonli-materialdesign2-pack', version: "12.2.0" api group: 'org.kordamp.ikonli', name: 'ikonli-javafx', version: "12.2.0" @@ -105,6 +105,9 @@ run { workingDir = rootDir jvmArgs += ['-XX:+EnableDynamicAgentLoading'] + + def exts = files(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0].outputs.files.singleFile).toList()); + classpath += exts } task runAttachedDebugger(type: JavaExec) { @@ -120,6 +123,9 @@ task runAttachedDebugger(type: JavaExec) { ) jvmArgs += ['-XX:+EnableDynamicAgentLoading'] systemProperties run.systemProperties + + def exts = files(project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)[0].outputs.files.singleFile).toList()); + classpath += exts } processResources { diff --git a/app/src/main/java/io/xpipe/app/Main.java b/app/src/main/java/io/xpipe/app/Main.java index 39716c264..1f87356fb 100644 --- a/app/src/main/java/io/xpipe/app/Main.java +++ b/app/src/main/java/io/xpipe/app/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) { if (args.length == 1 && args[0].equals("version")) { - AppProperties.init(); + AppProperties.init(args); System.out.println(AppProperties.get().getVersion()); return; } diff --git a/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java b/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java index 0a391696d..43a9cfc04 100644 --- a/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java +++ b/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java @@ -96,7 +96,15 @@ public class BeaconRequestHandler implements HttpHandler { } } } - response = beaconInterface.handle(exchange, object); + + var sync = beaconInterface.getSynchronizationObject(); + if (sync != null) { + synchronized (sync) { + response = beaconInterface.handle(exchange, object); + } + } else { + response = beaconInterface.handle(exchange, object); + } } catch (BeaconClientException clientException) { ErrorEvent.fromThrowable(clientException).omit().expected().handle(); writeError(exchange, new BeaconClientErrorResponse(clientException.getMessage()), 400); @@ -193,7 +201,7 @@ public class BeaconRequestHandler implements HttpHandler { && method.getParameters()[0].getType().equals(byte[].class)) .findFirst() .orElseThrow(); - setMethod.invoke(b, s); + setMethod.invoke(b, (Object) s); var m = b.getClass().getDeclaredMethod("build"); m.setAccessible(true); diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java index 4213c0c7c..b6972cee1 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/AskpassExchangeImpl.java @@ -1,11 +1,14 @@ package io.xpipe.app.beacon.impl; +import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.app.prefs.ExternalApplicationType; import io.xpipe.app.terminal.TerminalView; import io.xpipe.app.util.AskpassAlert; import io.xpipe.app.util.SecretManager; import io.xpipe.app.util.SecretQueryState; import io.xpipe.beacon.BeaconClientException; import io.xpipe.beacon.api.AskpassExchange; +import io.xpipe.core.process.OsType; import com.sun.net.httpserver.HttpExchange; @@ -50,17 +53,24 @@ public class AskpassExchangeImpl extends AskpassExchange { } var term = TerminalView.get().getTerminalInstances().stream() - .filter(instance -> - instance.getTerminalProcess().equals(found.get().getTerminal())) + .filter(instance -> instance.equals(found.get().getTerminal())) .findFirst(); if (term.isEmpty()) { return; } var control = term.get().controllable(); - control.ifPresent(controllableTerminalSession -> { - controllableTerminalSession.focus(); - }); + if (control.isPresent()) { + control.get().focus(); + } else { + if (OsType.getLocal() == OsType.MACOS) { + // Just focus the app, this is correct most of the time + var terminalType = AppPrefs.get().terminalType().getValue(); + if (terminalType instanceof ExternalApplicationType.MacApplication m) { + m.focus(); + } + } + } } @Override diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java new file mode 100644 index 000000000..09eeb872c --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/impl/CategoryAddExchangeImpl.java @@ -0,0 +1,34 @@ +package io.xpipe.app.beacon.impl; + +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStoreCategory; +import io.xpipe.beacon.BeaconClientException; +import io.xpipe.beacon.api.CategoryAddExchange; + +import com.sun.net.httpserver.HttpExchange; + +public class CategoryAddExchangeImpl extends CategoryAddExchange { + + @Override + public Object handle(HttpExchange exchange, Request msg) throws Throwable { + if (DataStorage.get().getStoreCategoryIfPresent(msg.getParent()).isEmpty()) { + throw new BeaconClientException("Parent category with id " + msg.getParent() + " does not exist"); + } + + if (DataStorage.get().getStoreCategories().stream() + .anyMatch(dataStoreCategory -> msg.getParent().equals(dataStoreCategory.getParentCategory()) + && msg.getName().equals(dataStoreCategory.getName()))) { + throw new BeaconClientException( + "Category with name " + msg.getName() + " already exists in parent category"); + } + + var cat = DataStoreCategory.createNew(msg.getParent(), msg.getName()); + DataStorage.get().addStoreCategory(cat); + return Response.builder().category(cat.getUuid()).build(); + } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } +} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java index 7cf0c747f..05390a17c 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionAddExchangeImpl.java @@ -3,6 +3,7 @@ package io.xpipe.app.beacon.impl; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; +import io.xpipe.beacon.BeaconClientException; import io.xpipe.beacon.api.ConnectionAddExchange; import io.xpipe.core.util.ValidationException; @@ -17,7 +18,17 @@ public class ConnectionAddExchangeImpl extends ConnectionAddExchange { return Response.builder().connection(found.get().getUuid()).build(); } + if (msg.getCategory() != null + && DataStorage.get() + .getStoreCategoryIfPresent(msg.getCategory()) + .isEmpty()) { + throw new BeaconClientException("Category with id " + msg.getCategory() + " does not exist"); + } + var entry = DataStoreEntry.createNew(msg.getName(), msg.getData()); + if (msg.getCategory() != null) { + entry.setCategoryUuid(msg.getCategory()); + } try { DataStorage.get().addStoreEntryInProgress(entry); if (msg.getValidate()) { @@ -35,6 +46,22 @@ public class ConnectionAddExchangeImpl extends ConnectionAddExchange { DataStorage.get().removeStoreEntryInProgress(entry); } DataStorage.get().addStoreEntryIfNotPresent(entry); + + // Explicitly assign category + if (msg.getCategory() != null) { + DataStorage.get() + .updateCategory( + entry, + DataStorage.get() + .getStoreCategoryIfPresent(msg.getCategory()) + .orElseThrow()); + } + return Response.builder().connection(entry.getUuid()).build(); } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java index 5624122a1..d99ab55d5 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java @@ -24,4 +24,9 @@ public class ConnectionBrowseExchangeImpl extends ConnectionBrowseExchange { AppLayoutModel.get().selectBrowser(); return Response.builder().build(); } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java index a4c454b63..a7e519bf9 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionInfoExchangeImpl.java @@ -56,19 +56,8 @@ public class ConnectionInfoExchangeImpl extends ConnectionInfoExchange { return Response.builder().infos(list).build(); } - private Class toWrapper(Class clazz) { - if (!clazz.isPrimitive()) return clazz; - - if (clazz == Integer.TYPE) return Integer.class; - if (clazz == Long.TYPE) return Long.class; - if (clazz == Boolean.TYPE) return Boolean.class; - if (clazz == Byte.TYPE) return Byte.class; - if (clazz == Character.TYPE) return Character.class; - if (clazz == Float.TYPE) return Float.class; - if (clazz == Double.TYPE) return Double.class; - if (clazz == Short.TYPE) return Short.class; - if (clazz == Void.TYPE) return Void.class; - - return clazz; + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java index f0f3e65d1..58df33e30 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionQueryExchangeImpl.java @@ -56,6 +56,11 @@ public class ConnectionQueryExchangeImpl extends ConnectionQueryExchange { .build(); } + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } + private String toRegex(String pattern) { // https://stackoverflow.com/a/17369948/6477761 StringBuilder sb = new StringBuilder(pattern.length()); diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java index 5fa336528..1d83efda1 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java @@ -21,4 +21,9 @@ public class ConnectionRefreshExchangeImpl extends ConnectionRefreshExchange { } return Response.builder().build(); } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java index ed7c65907..1fb6d4176 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRemoveExchangeImpl.java @@ -24,4 +24,9 @@ public class ConnectionRemoveExchangeImpl extends ConnectionRemoveExchange { DataStorage.get().deleteWithChildren(entries.toArray(DataStoreEntry[]::new)); return Response.builder().build(); } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionTerminalExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionTerminalExchangeImpl.java index d88fa48e1..a4cbb4007 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionTerminalExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionTerminalExchangeImpl.java @@ -22,4 +22,9 @@ public class ConnectionTerminalExchangeImpl extends ConnectionTerminalExchange { TerminalLauncher.open(e, e.getName(), msg.getDirectory(), sc); return Response.builder().build(); } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionToggleExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionToggleExchangeImpl.java index 7d3f48dd1..6025ce0eb 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionToggleExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionToggleExchangeImpl.java @@ -24,4 +24,9 @@ public class ConnectionToggleExchangeImpl extends ConnectionToggleExchange { } return Response.builder().build(); } + + @Override + public Object getSynchronizationObject() { + return DataStorage.get(); + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java index 75f9e4b7f..0ff4917f7 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java @@ -1,24 +1,39 @@ package io.xpipe.app.beacon.impl; -import io.xpipe.app.core.launcher.LauncherInput; +import io.xpipe.app.core.AppOpenArguments; import io.xpipe.app.core.mode.OperationMode; -import io.xpipe.app.util.PlatformState; +import io.xpipe.app.util.PlatformInit; import io.xpipe.beacon.BeaconServerException; import io.xpipe.beacon.api.DaemonOpenExchange; +import io.xpipe.core.process.OsType; import com.sun.net.httpserver.HttpExchange; public class DaemonOpenExchangeImpl extends DaemonOpenExchange { + private int openCounter = 0; + @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconServerException { if (msg.getArguments().isEmpty()) { - if (!OperationMode.switchToSyncIfPossible(OperationMode.GUI)) { - throw new BeaconServerException(PlatformState.getLastError()); + try { + // At this point we are already loading this on another thread + // so this call will only perform the waiting + PlatformInit.init(true); + } catch (Throwable t) { + throw new BeaconServerException(t); } - } - LauncherInput.handle(msg.getArguments()); + // The open command is used as a default opener on Linux + // We don't want to overwrite the default startup mode + if (OsType.getLocal() == OsType.LINUX && openCounter++ == 0) { + return Response.builder().build(); + } + + OperationMode.switchToAsync(OperationMode.GUI); + } else { + AppOpenArguments.handle(msg.getArguments()); + } return Response.builder().build(); } @@ -26,4 +41,9 @@ public class DaemonOpenExchangeImpl extends DaemonOpenExchange { public boolean requiresEnabledApi() { return false; } + + @Override + public boolean requiresCompletedStartup() { + return false; + } } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java index 6d18435b5..496d54dec 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/FsScriptExchangeImpl.java @@ -20,11 +20,10 @@ public class FsScriptExchangeImpl extends FsScriptExchange { try (var in = BlobManager.get().getBlob(msg.getBlob())) { data = new String(in.readAllBytes(), StandardCharsets.UTF_8); } + data = shell.getControl().getShellDialect().prepareScriptContent(data); var file = ScriptHelper.getExecScriptFile(shell.getControl()); - shell.getControl() - .getShellDialect() - .createScriptTextFileWriteCommand(shell.getControl(), data, file.toString()) - .execute(); + shell.getControl().view().writeScriptFile(file, data); + file = ScriptHelper.fixScriptPermissions(shell.getControl(), file); return Response.builder().path(file).build(); } } diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java index b0f6c25c4..e332c2b70 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java @@ -30,6 +30,8 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.StackPane; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; +import javafx.stage.Window; +import javafx.stage.WindowEvent; import java.util.List; import java.util.function.BiConsumer; @@ -50,8 +52,14 @@ public class BrowserFileChooserSessionComp extends DialogComp { public static void openSingleFile( Supplier> store, Consumer file, boolean save) { PlatformThread.runLaterIfNeeded(() -> { + var lastWindow = Window.getWindows().stream() + .filter(window -> window.isFocused()) + .findFirst(); var model = new BrowserFileChooserSessionModel(BrowserFileSystemTabModel.SelectionMode.SINGLE_FILE); DialogComp.showWindow(save ? "saveFileTitle" : "openFileTitle", stage -> { + stage.addEventFilter(WindowEvent.WINDOW_HIDDEN, event -> { + lastWindow.ifPresent(window -> window.requestFocus()); + }); var comp = new BrowserFileChooserSessionComp(stage, model); comp.apply(struc -> struc.get().setPrefSize(1200, 700)) .apply(struc -> AppFont.normal(struc.get())) @@ -116,7 +124,8 @@ public class BrowserFileChooserSessionComp extends DialogComp { var bookmarkTopBar = new BrowserConnectionListFilterComp(); var bookmarksList = new BrowserConnectionListComp( - BindingsHelper.map(model.getSelectedEntry(), v -> v.getEntry().get()), + BindingsHelper.map( + model.getSelectedEntry(), v -> v != null ? v.getEntry().get() : null), applicable, action, bookmarkTopBar.getCategory(), diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java index 37ad05d36..01988bfa9 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java @@ -34,20 +34,14 @@ public class BrowserFullSessionModel extends BrowserAbstractSessionModel { - DEFAULT.openSync(tab, null); - DEFAULT.pinTab(tab); - }); + DEFAULT.openSync(tab, null); + DEFAULT.pinTab(tab); } } @@ -62,6 +56,10 @@ public class BrowserFullSessionModel extends BrowserAbstractSessionModel { var current = selectedEntry.getValue(); + if (current == null) { + return null; + } + if (!current.isCloseable()) { return null; } @@ -176,6 +174,10 @@ public class BrowserFullSessionModel extends BrowserAbstractSessionModel(sessionEntries); for (var o : all) { // Don't close busy connections gracefully @@ -242,7 +244,7 @@ public class BrowserFullSessionModel extends BrowserAbstractSessionModel browserModel; - protected final String name; protected final Property splitTab = new SimpleObjectProperty<>(); - public BrowserSessionTab(BrowserAbstractSessionModel browserModel, String name) { + public BrowserSessionTab(BrowserAbstractSessionModel browserModel) { this.browserModel = browserModel; - this.name = name; } public abstract Comp comp(); @@ -31,6 +30,8 @@ public abstract class BrowserSessionTab { public abstract void close(); + public abstract ObservableValue getName(); + public abstract String getIcon(); public abstract DataColor getColor(); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java index bf805dcf9..3d4556746 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java @@ -276,7 +276,7 @@ public class BrowserSessionTabsComp extends SimpleComp { var cm = ContextMenuHelper.create(); if (tabModel.isCloseable()) { - var unpin = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("unpinTab")); + var unpin = ContextMenuHelper.item(LabelGraphic.none(), "unpinTab"); unpin.visibleProperty() .bind(PlatformThread.sync(Bindings.createBooleanBinding( () -> { @@ -290,7 +290,7 @@ public class BrowserSessionTabsComp extends SimpleComp { }); cm.getItems().add(unpin); - var pin = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("pinTab")); + var pin = ContextMenuHelper.item(LabelGraphic.none(), "pinTab"); pin.visibleProperty() .bind(PlatformThread.sync(Bindings.createBooleanBinding( () -> { @@ -304,7 +304,7 @@ public class BrowserSessionTabsComp extends SimpleComp { cm.getItems().add(pin); } - var select = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("selectTab")); + var select = ContextMenuHelper.item(LabelGraphic.none(), "selectTab"); select.acceleratorProperty() .bind(Bindings.createObjectBinding( () -> { @@ -325,7 +325,7 @@ public class BrowserSessionTabsComp extends SimpleComp { cm.getItems().add(new SeparatorMenuItem()); - var close = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("closeTab")); + var close = ContextMenuHelper.item(LabelGraphic.none(), "closeTab"); close.setAccelerator(new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN)); close.setOnAction(event -> { if (tab.isClosable()) { @@ -335,7 +335,7 @@ public class BrowserSessionTabsComp extends SimpleComp { }); cm.getItems().add(close); - var closeOthers = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("closeOtherTabs")); + var closeOthers = ContextMenuHelper.item(LabelGraphic.none(), "closeOtherTabs"); closeOthers.setOnAction(event -> { tabs.getTabs() .removeAll(tabs.getTabs().stream() @@ -345,7 +345,7 @@ public class BrowserSessionTabsComp extends SimpleComp { }); cm.getItems().add(closeOthers); - var closeLeft = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("closeLeftTabs")); + var closeLeft = ContextMenuHelper.item(LabelGraphic.none(), "closeLeftTabs"); closeLeft.setOnAction(event -> { var index = tabs.getTabs().indexOf(tab); tabs.getTabs() @@ -356,7 +356,7 @@ public class BrowserSessionTabsComp extends SimpleComp { }); cm.getItems().add(closeLeft); - var closeRight = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("closeRightTabs")); + var closeRight = ContextMenuHelper.item(LabelGraphic.none(), "closeRightTabs"); closeRight.setOnAction(event -> { var index = tabs.getTabs().indexOf(tab); tabs.getTabs() @@ -367,7 +367,7 @@ public class BrowserSessionTabsComp extends SimpleComp { }); cm.getItems().add(closeRight); - var closeAll = ContextMenuHelper.item(LabelGraphic.none(), AppI18n.get("closeAllTabs")); + var closeAll = ContextMenuHelper.item(LabelGraphic.none(), "closeAllTabs"); closeAll.setAccelerator( new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN, KeyCombination.SHIFT_DOWN)); closeAll.setOnAction(event -> { @@ -425,13 +425,16 @@ public class BrowserSessionTabsComp extends SimpleComp { tab.textProperty() .bind(Bindings.createStringBinding( () -> { - return tabModel.getName() + var n = tabModel.getName().getValue(); + return (AppPrefs.get().censorMode().get() ? "*".repeat(n.length()) : n) + (global.getValue() == tabModel ? " (" + AppI18n.get("pinned") + ")" : ""); }, + tabModel.getName(), global, - AppPrefs.get().language())); + AppPrefs.get().language(), + AppPrefs.get().censorMode())); } else { - tab.setText(tabModel.getName()); + tab.textProperty().bind(tabModel.getName()); } Comp comp = tabModel.comp(); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java b/app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java index a9320fa15..7842a30c3 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java @@ -6,16 +6,26 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.core.store.DataStore; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.value.ObservableValue; + import lombok.Getter; @Getter public abstract class BrowserStoreSessionTab extends BrowserSessionTab { protected final DataStoreEntryRef entry; + private final String name; public BrowserStoreSessionTab(BrowserAbstractSessionModel browserModel, DataStoreEntryRef entry) { - super(browserModel, DataStorage.get().getStoreEntryDisplayName(entry.get())); + super(browserModel); this.entry = entry; + this.name = DataStorage.get().getStoreEntryDisplayName(entry.get()); + } + + @Override + public ObservableValue getName() { + return new SimpleStringProperty(name); } public abstract Comp comp(); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java index 78784f670..a8a4b08fc 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java @@ -4,7 +4,6 @@ import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.comp.SimpleComp; import io.xpipe.app.core.AppI18n; import io.xpipe.app.util.*; -import io.xpipe.app.util.PlatformThread; import io.xpipe.core.process.OsType; import io.xpipe.core.store.FileEntry; import io.xpipe.core.store.FileInfo; @@ -29,10 +28,7 @@ import atlantafx.base.theme.Styles; import java.time.Duration; import java.time.Instant; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Objects; +import java.util.*; import java.util.concurrent.atomic.AtomicReference; import static io.xpipe.app.util.HumanReadableFormat.byteCount; @@ -283,12 +279,21 @@ public final class BrowserFileListComp extends SimpleComp { } try (var ignored = updateFromModel) { - fileList.getSelection().setAll(c.getList()); + // Attempt to preserve ordering. Works at least when selecting single entries + var existing = new HashSet<>(fileList.getSelection()); + c.getList().forEach(browserEntry -> { + if (!existing.contains(browserEntry)) { + fileList.getSelection().add(browserEntry); + } + }); + fileList.getSelection().removeIf(browserEntry -> !c.getList().contains(browserEntry)); } }); fileList.getSelection().addListener((ListChangeListener) c -> { - if (c.getList().equals(table.getSelectionModel().getSelectedItems())) { + var existing = new HashSet<>(fileList.getSelection()); + var toApply = new HashSet<>(c.getList()); + if (existing.equals(toApply)) { return; } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemCache.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemCache.java index 746f588c0..434e7ca4a 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemCache.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemCache.java @@ -1,5 +1,6 @@ package io.xpipe.app.browser.file; +import io.xpipe.app.util.PasswdFile; import io.xpipe.app.util.ShellControlCache; import io.xpipe.core.process.CommandBuilder; import io.xpipe.core.process.OsType; @@ -16,7 +17,7 @@ public class BrowserFileSystemCache extends ShellControlCache { private final BrowserFileSystemTabModel model; private final String username; - private final Map users = new LinkedHashMap<>(); + private final PasswdFile passwdFile; private final Map groups = new LinkedHashMap<>(); public BrowserFileSystemCache(BrowserFileSystemTabModel model) throws Exception { @@ -27,16 +28,16 @@ public class BrowserFileSystemCache extends ShellControlCache { ShellDialect d = sc.getShellDialect(); // If there is no id command, we should still be fine with just assuming root username = d.printUsernameCommand(sc).readStdoutIfPossible().orElse("root"); - loadUsers(); + passwdFile = PasswdFile.parse(sc); loadGroups(); } + public Map getUsers() { + return passwdFile.getUsers(); + } + public int getUidForUser(String name) { - return users.entrySet().stream() - .filter(e -> e.getValue().equals(name)) - .findFirst() - .map(e -> e.getKey()) - .orElse(0); + return passwdFile.getUidForUser(name); } public int getGidForGroup(String name) { @@ -47,28 +48,6 @@ public class BrowserFileSystemCache extends ShellControlCache { .orElse(0); } - private void loadUsers() throws Exception { - var sc = model.getFileSystem().getShell().orElseThrow(); - if (sc.getOsType() == OsType.WINDOWS || sc.getOsType() == OsType.MACOS) { - return; - } - - var lines = sc.command(CommandBuilder.of().add("cat").addFile("/etc/passwd")) - .readStdoutIfPossible() - .orElse(""); - lines.lines().forEach(s -> { - var split = s.split(":"); - try { - users.putIfAbsent(Integer.parseInt(split[2]), split[0]); - } catch (Exception ignored) { - } - }); - - if (users.isEmpty()) { - users.put(0, "root"); - } - } - private void loadGroups() throws Exception { var sc = model.getFileSystem().getShell().orElseThrow(); if (sc.getOsType() == OsType.WINDOWS || sc.getOsType() == OsType.MACOS) { diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java index 9f289e7e2..0fd542e03 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java @@ -51,15 +51,16 @@ public class BrowserFileSystemHelper { } var shell = model.getFileSystem().getShell(); - if (shell.isEmpty() || !shell.get().isRunning()) { + if (shell.isEmpty() || !shell.get().isRunning(true)) { return path; } try { - return shell.get() + var r = shell.get() .getShellDialect() .evaluateExpression(shell.get(), path) .readStdoutOrThrow(); + return !r.isBlank() ? r : null; } catch (Exception ex) { ErrorEvent.expected(ex); throw ex; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java index 9040040c0..a7385c22a 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java @@ -65,7 +65,7 @@ public class BrowserFileSystemSavedState { return state; } - public void save() { + public synchronized void save() { if (model == null) { return; } @@ -107,7 +107,7 @@ public class BrowserFileSystemSavedState { } } - private void updateRecent(String dir) { + private synchronized void updateRecent(String dir) { var without = FileNames.removeTrailingSlash(dir); var with = FileNames.toDirectory(dir); recentDirectories.removeIf(recentEntry -> diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java index 571036563..0d0ee4951 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java @@ -43,8 +43,7 @@ public class BrowserFileSystemTabComp extends SimpleComp { @Override protected Region createSimple() { - var alertOverlay = new ModalOverlayComp(Comp.of(() -> createContent()), model.getOverlay()); - return alertOverlay.createRegion(); + return createContent(); } private Region createContent() { diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java index a68e4b891..d8f6f4d2b 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java @@ -5,7 +5,6 @@ import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.browser.BrowserStoreSessionTab; import io.xpipe.app.browser.action.BrowserAction; import io.xpipe.app.comp.Comp; -import io.xpipe.app.comp.base.ModalOverlayComp; import io.xpipe.app.core.window.AppMainWindow; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.ext.ShellStore; @@ -44,10 +43,10 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab currentPath = new ReadOnlyObjectWrapper<>(); private final BrowserFileSystemHistory history = new BrowserFileSystemHistory(); - private final Property overlay = new SimpleObjectProperty<>(); private final BooleanProperty inOverview = new SimpleBooleanProperty(); private final Property progress = new SimpleObjectProperty<>(); private final ObservableList terminalRequests = FXCollections.observableArrayList(); + private final BooleanProperty transferCancelled = new SimpleBooleanProperty(); private FileSystem fileSystem; private BrowserFileSystemSavedState savedState; private BrowserFileSystemCache cache; @@ -65,6 +64,14 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab findFile(String path) { + return getFileList().getAll().getValue().stream() + .filter(browserEntry -> browserEntry.getFileName().equals(path) + || browserEntry.getRawFileEntry().getPath().equals(path)) + .findFirst() + .map(browserEntry -> browserEntry.getRawFileEntry()); + } + @Override public Comp comp() { return new BrowserFileSystemTabComp(this, true); @@ -142,6 +149,14 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab c, boolean refresh) { ThreadHelper.runFailableAsync(() -> { if (fileSystem == null) { @@ -384,7 +399,7 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab { BooleanScope.executeExclusive(busy, () -> { if (fileSystem == null) { @@ -491,10 +503,6 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab r, boolean refresh) { - if (name == null || name.isBlank()) { - return; - } - ThreadHelper.runFailableAsync(() -> { BooleanScope.executeExclusive(busy, () -> { if (fileSystem == null) { @@ -566,7 +574,7 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab progress; + private final BooleanProperty cancelled; BrowserAlerts.FileConflictChoice lastConflictChoice; @@ -28,12 +31,14 @@ public class BrowserFileTransferOperation { List files, BrowserFileTransferMode transferMode, boolean checkConflicts, - Consumer progress) { + Consumer progress, + BooleanProperty cancelled) { this.target = target; this.files = files; this.transferMode = transferMode; this.checkConflicts = checkConflicts; this.progress = progress; + this.cancelled = cancelled; } public static BrowserFileTransferOperation ofLocal( @@ -41,7 +46,8 @@ public class BrowserFileTransferOperation { List files, BrowserFileTransferMode transferMode, boolean checkConflicts, - Consumer progress) { + Consumer progress, + BooleanProperty cancelled) { var entries = files.stream() .map(path -> { if (!Files.exists(path)) { @@ -56,7 +62,7 @@ public class BrowserFileTransferOperation { }) .filter(entry -> entry != null) .toList(); - return new BrowserFileTransferOperation(target, entries, transferMode, checkConflicts, progress); + return new BrowserFileTransferOperation(target, entries, transferMode, checkConflicts, progress, cancelled); } private void updateProgress(BrowserTransferProgress progress) { @@ -112,12 +118,18 @@ public class BrowserFileTransferOperation { return BrowserAlerts.FileConflictChoice.REPLACE; } + private boolean cancelled() { + return cancelled.get(); + } + public void execute() throws Exception { if (files.isEmpty()) { updateProgress(null); return; } + cancelled.set(false); + var same = files.getFirst().getFileSystem().equals(target.getFileSystem()); var doesMove = transferMode == BrowserFileTransferMode.MOVE || (same && transferMode == BrowserFileTransferMode.NORMAL); @@ -129,6 +141,10 @@ public class BrowserFileTransferOperation { try { for (var file : files) { + if (cancelled()) { + break; + } + if (same) { handleSingleOnSameFileSystem(file); } else { @@ -138,6 +154,10 @@ public class BrowserFileTransferOperation { if (!same && doesMove) { for (var file : files) { + if (cancelled()) { + break; + } + deleteSingle(file); } } @@ -207,7 +227,7 @@ public class BrowserFileTransferOperation { var newFile = targetFile.getParent().join(matcher.group(1) + " (" + (number + 1) + ")." + matcher.group(3)); return newFile.toString(); - } catch (NumberFormatException e) { + } catch (NumberFormatException ignored) { } } @@ -242,6 +262,10 @@ public class BrowserFileTransferOperation { var baseRelative = FileNames.toDirectory(FileNames.getParent(source.getPath())); List list = source.getFileSystem().listFilesRecursively(source.getPath()); for (FileEntry fileEntry : list) { + if (cancelled()) { + return; + } + var rel = FileNames.toUnix(FileNames.relativize(baseRelative, fileEntry.getPath())); flatFiles.put(fileEntry, rel); if (fileEntry.getKind() == FileKind.FILE) { @@ -264,6 +288,10 @@ public class BrowserFileTransferOperation { var start = Instant.now(); AtomicLong transferred = new AtomicLong(); for (var e : flatFiles.entrySet()) { + if (cancelled()) { + return; + } + var sourceFile = e.getKey(); var fixedRelPath = new FilePath(e.getValue()) .fileSystemCompatible( @@ -298,6 +326,10 @@ public class BrowserFileTransferOperation { private void transfer( FileEntry sourceFile, String targetFile, AtomicLong transferred, AtomicLong totalSize, Instant start) throws Exception { + if (cancelled()) { + return; + } + InputStream inputStream = null; OutputStream outputStream = null; try { @@ -377,7 +409,7 @@ public class BrowserFileTransferOperation { AtomicLong transferred, AtomicLong total, Instant start) - throws IOException { + throws Exception { // Initialize progress immediately prior to reading anything updateProgress(new BrowserTransferProgress(sourceFile.getName(), transferred.get(), total.get(), start)); @@ -385,9 +417,48 @@ public class BrowserFileTransferOperation { byte[] buffer = new byte[bs]; int read; while ((read = inputStream.read(buffer, 0, bs)) > 0) { + if (cancelled()) { + killStreams(); + break; + } + + if (!checkTransferValidity()) { + killStreams(); + break; + } + outputStream.write(buffer, 0, read); transferred.addAndGet(read); updateProgress(new BrowserTransferProgress(sourceFile.getName(), transferred.get(), total.get(), start)); } } + + private boolean checkTransferValidity() { + var sourceFs = files.getFirst().getFileSystem(); + var targetFs = target.getFileSystem(); + var same = files.getFirst().getFileSystem().equals(target.getFileSystem()); + if (!same) { + var sourceShell = sourceFs.getShell().orElseThrow(); + var targetShell = targetFs.getShell().orElseThrow(); + return !sourceShell.getStdout().isClosed() + && !targetShell.getStdin().isClosed(); + } else { + return true; + } + } + + private void killStreams() throws Exception { + var sourceFs = files.getFirst().getFileSystem(); + var targetFs = target.getFileSystem(); + var same = files.getFirst().getFileSystem().equals(target.getFileSystem()); + if (!same) { + var sourceShell = sourceFs.getShell().orElseThrow(); + var targetShell = targetFs.getShell().orElseThrow(); + try { + sourceShell.closeStdout(); + } finally { + targetShell.closeStdin(); + } + } + } } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java index 57aa3fce3..018833398 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java @@ -8,10 +8,10 @@ import io.xpipe.app.comp.base.HorizontalComp; import io.xpipe.app.comp.base.LabelComp; import io.xpipe.app.comp.base.ListBoxViewComp; import io.xpipe.app.comp.base.PrettyImageHelper; -import io.xpipe.app.comp.base.PrettySvgComp; import io.xpipe.app.comp.base.TileButtonComp; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.BindingsHelper; import io.xpipe.app.util.DerivedObservableList; @@ -20,7 +20,6 @@ import io.xpipe.app.util.ThreadHelper; import javafx.beans.binding.Bindings; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleStringProperty; import javafx.geometry.Insets; import javafx.geometry.Orientation; import javafx.geometry.Pos; @@ -52,7 +51,7 @@ public class BrowserHistoryTabComp extends SimpleComp { var vbox = new VBox(welcome, new Spacer(4, Orientation.VERTICAL)); vbox.setAlignment(Pos.CENTER_LEFT); - var img = new PrettySvgComp(new SimpleStringProperty("graphics/Hips.svg"), 50, 75) + var img = PrettyImageHelper.ofSpecificFixedSize("graphics/Hips.svg", 50, 61) .padding(new Insets(5, 0, 0, 0)) .createRegion(); @@ -148,17 +147,20 @@ public class BrowserHistoryTabComp extends SimpleComp { var entry = DataStorage.get().getStoreEntryIfPresent(e.getUuid()); var graphic = entry.get().getEffectiveIconFile(); var view = PrettyImageHelper.ofFixedSize(graphic, 22, 16); - return new ButtonComp( - new SimpleStringProperty(DataStorage.get().getStoreEntryDisplayName(entry.get())), - view.createRegion(), - () -> { - ThreadHelper.runAsync(() -> { - var storageEntry = DataStorage.get().getStoreEntryIfPresent(e.getUuid()); - if (storageEntry.isPresent()) { - model.openFileSystemAsync(storageEntry.get().ref(), null, disable); - } - }); - }) + var name = Bindings.createStringBinding( + () -> { + var n = DataStorage.get().getStoreEntryDisplayName(entry.get()); + return AppPrefs.get().censorMode().get() ? "*".repeat(n.length()) : n; + }, + AppPrefs.get().censorMode()); + return new ButtonComp(name, view.createRegion(), () -> { + ThreadHelper.runAsync(() -> { + var storageEntry = DataStorage.get().getStoreEntryIfPresent(e.getUuid()); + if (storageEntry.isPresent()) { + model.openFileSystemAsync(storageEntry.get().ref(), null, disable); + } + }); + }) .minWidth(300) .accessibleText(DataStorage.get().getStoreEntryDisplayName(entry.get())) .disable(disable) @@ -168,7 +170,13 @@ public class BrowserHistoryTabComp extends SimpleComp { } private Comp dirButton(BrowserHistorySavedState.Entry e, BooleanProperty disable) { - return new ButtonComp(new SimpleStringProperty(e.getPath()), null, () -> { + var name = Bindings.createStringBinding( + () -> { + var n = e.getPath(); + return AppPrefs.get().censorMode().get() ? "*".repeat(n.length()) : n; + }, + AppPrefs.get().censorMode()); + return new ButtonComp(name, () -> { ThreadHelper.runAsync(() -> { model.restoreStateAsync(e, disable); }); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java index 0a585eee1..eeee7072b 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java @@ -7,10 +7,12 @@ import io.xpipe.app.comp.Comp; import io.xpipe.app.core.AppI18n; import io.xpipe.app.storage.DataColor; +import javafx.beans.value.ObservableValue; + public final class BrowserHistoryTabModel extends BrowserSessionTab { public BrowserHistoryTabModel(BrowserAbstractSessionModel browserModel) { - super(browserModel, " " + AppI18n.get("history") + " "); + super(browserModel); } @Override @@ -24,11 +26,16 @@ public final class BrowserHistoryTabModel extends BrowserSessionTab { } @Override - public void init() throws Exception {} + public void init() {} @Override public void close() {} + @Override + public ObservableValue getName() { + return AppI18n.observable("history").map(s -> " " + s + " "); + } + @Override public String getIcon() { return null; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java index 67fcbd893..13a34a747 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java @@ -118,8 +118,10 @@ public class BrowserNavBarComp extends Comp { path.addListener((observable, oldValue, newValue) -> { ThreadHelper.runFailableAsync(() -> { BooleanScope.executeExclusive(model.getBusy(), () -> { - var changed = model.cdSyncOrRetry(newValue, true); - changed.ifPresent(s -> Platform.runLater(() -> path.set(s))); + var changed = model.cdSyncOrRetry(newValue != null && !newValue.isBlank() ? newValue : null, true); + changed.ifPresent(s -> { + Platform.runLater(() -> path.set(!s.isBlank() ? s : null)); + }); }); }); }); @@ -148,8 +150,6 @@ public class BrowserNavBarComp extends Comp { INVISIBLE, !val && !struc.get().isFocused()); }); }); - - struc.get().setPromptText("Overview of " + model.getName()); }) .accessibleText("Current path"); return pathBar; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java index 3b9091fa2..536a2852c 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java @@ -60,20 +60,20 @@ public class BrowserOverviewComp extends SimpleComp { }); }); var commonOverview = new BrowserFileOverviewComp(model, commonPlatform, false); - var commonPane = new SimpleTitledPaneComp(AppI18n.observable("common"), commonOverview) + var commonPane = new SimpleTitledPaneComp(AppI18n.observable("common"), commonOverview, false) .apply(struc -> VBox.setVgrow(struc.get(), Priority.NEVER)); var roots = model.getFileSystem().listRoots().stream() .map(s -> FileEntry.ofDirectory(model.getFileSystem(), s)) .toList(); var rootsOverview = new BrowserFileOverviewComp(model, FXCollections.observableArrayList(roots), false); - var rootsPane = new SimpleTitledPaneComp(AppI18n.observable("roots"), rootsOverview); + var rootsPane = new SimpleTitledPaneComp(AppI18n.observable("roots"), rootsOverview, false); var recent = new DerivedObservableList<>(model.getSavedState().getRecentDirectories(), true) .mapped(s -> FileEntry.ofDirectory(model.getFileSystem(), s.getDirectory())) .getList(); var recentOverview = new BrowserFileOverviewComp(model, recent, true); - var recentPane = new SimpleTitledPaneComp(AppI18n.observable("recent"), recentOverview); + var recentPane = new SimpleTitledPaneComp(AppI18n.observable("recent"), recentOverview, false); var vbox = new VerticalComp(List.of(recentPane, commonPane, rootsPane)).styleClass("overview"); var r = vbox.createRegion(); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java index 5d4c028f1..8239646f9 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java @@ -312,7 +312,10 @@ public class BrowserQuickAccessContextMenu extends ContextMenu { browserActionMenu.show(menu.getStyleableNode(), Side.RIGHT, 0, 0); shownBrowserActionsMenu = browserActionMenu; Platform.runLater(() -> { - browserActionMenu.getItems().getFirst().getStyleableNode().requestFocus(); + var items = browserActionMenu.getItems(); + if (items.size() > 0) { + items.getFirst().getStyleableNode().requestFocus(); + } }); } } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java index f61f79963..af565eda5 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java @@ -5,10 +5,13 @@ import io.xpipe.app.comp.SimpleComp; import io.xpipe.app.comp.SimpleCompStructure; import io.xpipe.app.comp.augment.ContextMenuAugment; import io.xpipe.app.comp.base.HorizontalComp; +import io.xpipe.app.comp.base.IconButtonComp; import io.xpipe.app.comp.base.LabelComp; import io.xpipe.app.core.AppFont; import io.xpipe.app.util.BindingsHelper; import io.xpipe.app.util.HumanReadableFormat; +import io.xpipe.app.util.PlatformThread; +import io.xpipe.app.util.ThreadHelper; import javafx.beans.binding.Bindings; import javafx.geometry.Pos; @@ -36,7 +39,8 @@ public class BrowserStatusBarComp extends SimpleComp { createProgressEstimateStatus(), Comp.hspacer(), createClipboardStatus(), - createSelectionStatus())); + createSelectionStatus(), + createKillButton())); bar.spacing(15); bar.styleClass("status-bar"); @@ -50,6 +54,33 @@ public class BrowserStatusBarComp extends SimpleComp { return r; } + private Comp createKillButton() { + var button = new IconButtonComp("mdi2s-stop", () -> { + ThreadHelper.runAsync(() -> { + model.killTransfer(); + }); + }); + button.accessibleText("Kill").tooltipKey("killTransfer"); + var cancel = PlatformThread.sync(model.getTransferCancelled()); + var hide = Bindings.createBooleanBinding( + () -> { + if (model.getProgress().getValue() == null + || model.getProgress().getValue().done()) { + return true; + } + + if (cancel.getValue()) { + return true; + } + + return false; + }, + cancel, + model.getProgress()); + button.hide(hide); + return button; + } + private Comp createProgressEstimateStatus() { var text = BindingsHelper.map(model.getProgress(), p -> { if (p == null) { @@ -97,7 +128,7 @@ public class BrowserStatusBarComp extends SimpleComp { var progressComp = new LabelComp(text) .styleClass("progress") .apply(struc -> struc.get().setAlignment(Pos.CENTER_LEFT)) - .prefWidth(180); + .hgrow(); return progressComp; } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java index f94a9db5f..945a13f49 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java @@ -17,6 +17,7 @@ import io.xpipe.app.util.ThreadHelper; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.value.ObservableBooleanValue; +import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import java.util.Optional; @@ -35,7 +36,7 @@ public final class BrowserTerminalDockTabModel extends BrowserSessionTab { BrowserAbstractSessionModel browserModel, BrowserSessionTab origin, ObservableList terminalRequests) { - super(browserModel, AppI18n.get("terminal")); + super(browserModel); this.origin = origin; this.terminalRequests = terminalRequests; } @@ -154,6 +155,11 @@ public final class BrowserTerminalDockTabModel extends BrowserSessionTab { dockModel.onClose(); } + @Override + public ObservableValue getName() { + return AppI18n.observable("terminal"); + } + @Override public String getIcon() { return null; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java index 88b192ff2..6761e5cd5 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java @@ -13,12 +13,14 @@ import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.css.PseudoClass; import javafx.geometry.Insets; +import javafx.scene.control.ContentDisplay; import javafx.scene.image.Image; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; import javafx.scene.layout.Region; +import javafx.scene.text.TextAlignment; import org.kordamp.ikonli.javafx.FontIcon; @@ -41,6 +43,8 @@ public class BrowserTransferComp extends SimpleComp { var background = new LabelComp(AppI18n.observable("transferDescription")) .apply(struc -> struc.get().setGraphic(new FontIcon("mdi2d-download-outline"))) .apply(struc -> struc.get().setWrapText(true)) + .apply(struc -> struc.get().setTextAlignment(TextAlignment.CENTER)) + .apply(struc -> struc.get().setContentDisplay(ContentDisplay.TOP)) .visible(model.getEmpty()); var backgroundStack = new StackComp(List.of(background)) .grow(true, true) diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java index 1e5cf1f2f..eeef401c7 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java @@ -120,8 +120,8 @@ public class BrowserTransferModel { return; } - if (item.getOpenFileSystemModel() != null - && item.getOpenFileSystemModel().isClosed()) { + var itemModel = item.getOpenFileSystemModel(); + if (itemModel == null || itemModel.isClosed()) { return; } @@ -134,15 +134,16 @@ public class BrowserTransferModel { progress -> { // Don't update item progress to keep it as finished if (progress == null) { - item.getOpenFileSystemModel().getProgress().setValue(null); + itemModel.getProgress().setValue(null); return; } synchronized (item.getProgress()) { item.getProgress().setValue(progress); } - item.getOpenFileSystemModel().getProgress().setValue(progress); - }); + itemModel.getProgress().setValue(progress); + }, + itemModel.getTransferCancelled()); op.execute(); } catch (Throwable t) { ErrorEvent.fromThrowable(t).handle(); diff --git a/app/src/main/java/io/xpipe/app/comp/Comp.java b/app/src/main/java/io/xpipe/app/comp/Comp.java index 6d02a00ce..318f09e31 100644 --- a/app/src/main/java/io/xpipe/app/comp/Comp.java +++ b/app/src/main/java/io/xpipe/app/comp/Comp.java @@ -93,6 +93,18 @@ public abstract class Comp> { })); } + public void focusOnShow() { + onSceneAssign(struc -> { + Platform.runLater(() -> { + Platform.runLater(() -> { + Platform.runLater(() -> { + struc.get().requestFocus(); + }); + }); + }); + }); + } + public Comp minWidth(double width) { return apply(struc -> struc.get().setMinWidth(width)); } diff --git a/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java b/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java index 6a350f010..a35b229d3 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java @@ -2,32 +2,35 @@ package io.xpipe.app.comp.base; import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.CompStructure; -import io.xpipe.app.comp.SimpleCompStructure; import io.xpipe.app.comp.store.StoreViewState; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.util.PlatformThread; import javafx.beans.binding.Bindings; import javafx.beans.value.ObservableValue; +import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.control.ButtonBase; import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyEvent; import javafx.scene.layout.BorderPane; -import javafx.scene.layout.Pane; +import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; -public class AppLayoutComp extends Comp> { +public class AppLayoutComp extends Comp { private final AppLayoutModel model = AppLayoutModel.get(); @Override - public CompStructure createBase() { + public Structure createBase() { Map, ObservableValue> map = model.getEntries().stream() .filter(entry -> entry.comp() != null) .collect(Collectors.toMap( @@ -67,6 +70,28 @@ public class AppLayoutComp extends Comp> { }); AppFont.normal(pane); pane.getStyleClass().add("layout"); - return new SimpleCompStructure<>(pane); + return new Structure(pane, multiR, sidebarR, new ArrayList<>(multiR.getChildren())); + } + + public record Structure(BorderPane pane, StackPane stack, Region sidebar, List children) + implements CompStructure { + + public void prepareAddition() { + stack.getChildren().clear(); + sidebar.setDisable(true); + } + + public void show() { + for (var child : children) { + stack.getChildren().add(child); + PlatformThread.runNestedLoopIteration(); + } + sidebar.setDisable(false); + } + + @Override + public BorderPane get() { + return pane; + } } } diff --git a/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java b/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java new file mode 100644 index 000000000..3c98e64b2 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java @@ -0,0 +1,122 @@ +package io.xpipe.app.comp.base; + +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.core.AppFont; +import io.xpipe.app.core.AppProperties; +import io.xpipe.app.core.window.AppDialog; +import io.xpipe.app.core.window.AppMainWindow; +import io.xpipe.app.resources.AppImages; +import io.xpipe.app.resources.AppResources; +import io.xpipe.app.util.PlatformThread; +import io.xpipe.core.process.OsType; + +import javafx.animation.Animation; +import javafx.application.Platform; +import javafx.collections.ListChangeListener; +import javafx.geometry.Pos; +import javafx.scene.image.ImageView; +import javafx.scene.layout.Region; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; +import javafx.stage.Window; + +import atlantafx.base.util.Animations; + +public class AppMainWindowContentComp extends SimpleComp { + + private final Stage stage; + + public AppMainWindowContentComp(Stage stage) { + this.stage = stage; + } + + @Override + protected Region createSimple() { + var overlay = AppDialog.getModalOverlay(); + var loaded = AppMainWindow.getLoadedContent(); + var bg = Comp.of(() -> { + var loadingIcon = new ImageView(); + loadingIcon.setFitWidth(64); + loadingIcon.setFitHeight(64); + + var anim = Animations.pulse(loadingIcon, 1.1); + if (OsType.getLocal() != OsType.LINUX) { + anim.setRate(0.85); + anim.setCycleCount(Animation.INDEFINITE); + anim.play(); + } + + // This allows for assigning logos even if AppImages has not been initialized yet + var dir = "img/logo/"; + AppResources.with(AppResources.XPIPE_MODULE, dir, path -> { + loadingIcon.setImage(AppImages.loadImage(path.resolve("loading.png"))); + }); + + var version = new LabelComp((AppProperties.get().isStaging() ? "XPipe PTB" : "XPipe") + " " + + AppProperties.get().getVersion()); + version.apply(struc -> { + AppFont.setSize(struc.get(), 1); + struc.get().setOpacity(0.6); + }); + + var text = new LabelComp(AppMainWindow.getLoadingText()); + text.apply(struc -> { + struc.get().setOpacity(0.8); + }); + + var vbox = new VBox( + Comp.vspacer().createRegion(), + loadingIcon, + Comp.vspacer(19).createRegion(), + version.createRegion(), + Comp.vspacer().createRegion(), + text.createRegion(), + Comp.vspacer(20).createRegion()); + vbox.setAlignment(Pos.CENTER); + + var pane = new StackPane(vbox); + pane.setAlignment(Pos.CENTER); + pane.getStyleClass().add("background"); + + loaded.subscribe(struc -> { + if (struc != null) { + PlatformThread.runNestedLoopIteration(); + struc.prepareAddition(); + anim.stop(); + pane.getChildren().add(struc.get()); + struc.show(); + pane.getChildren().remove(vbox); + pane.getStyleClass().remove("background"); + } + }); + + overlay.addListener((ListChangeListener) c -> { + if (c.next() && c.wasAdded()) { + stage.requestFocus(); + + // Close blocking modal windows + var childWindows = Window.getWindows().stream() + .filter(window -> window instanceof Stage s && stage.equals(s.getOwner())) + .toList(); + childWindows.forEach(window -> { + ((Stage) window).close(); + }); + } + }); + + loaded.addListener((observable, oldValue, newValue) -> { + if (newValue != null) { + Platform.runLater(() -> { + stage.requestFocus(); + }); + } + }); + + return pane; + }); + var modal = new ModalOverlayStackComp(bg, overlay); + return modal.createRegion(); + } +} diff --git a/app/src/main/java/io/xpipe/app/comp/base/ButtonComp.java b/app/src/main/java/io/xpipe/app/comp/base/ButtonComp.java index eed6cedf5..aab6f8f50 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ButtonComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ButtonComp.java @@ -3,9 +3,9 @@ package io.xpipe.app.comp.base; import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.CompStructure; import io.xpipe.app.comp.SimpleCompStructure; +import io.xpipe.app.util.LabelGraphic; import io.xpipe.app.util.PlatformThread; -import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableValue; import javafx.css.Size; @@ -13,14 +13,16 @@ import javafx.css.SizeUnits; import javafx.scene.Node; import javafx.scene.control.Button; +import lombok.AllArgsConstructor; import lombok.Getter; import org.kordamp.ikonli.javafx.FontIcon; @Getter +@AllArgsConstructor public class ButtonComp extends Comp> { private final ObservableValue name; - private final ObjectProperty graphic; + private final ObservableValue graphic; private final Runnable listener; public ButtonComp(ObservableValue name, Runnable listener) { @@ -31,33 +33,39 @@ public class ButtonComp extends Comp> { public ButtonComp(ObservableValue name, Node graphic, Runnable listener) { this.name = name; - this.graphic = new SimpleObjectProperty<>(graphic); + this.graphic = new SimpleObjectProperty<>(new LabelGraphic.NodeGraphic(() -> graphic)); this.listener = listener; } - public Node getGraphic() { - return graphic.get(); - } - - public ObjectProperty graphicProperty() { - return graphic; - } - @Override public CompStructure