From b7c5407cace3e8dfd5092dc6df181c48554aec9b Mon Sep 17 00:00:00 2001 From: Amr Bashir Date: Fri, 20 Oct 2023 02:17:09 +0300 Subject: [PATCH] refactor: remove window and app plugins (#671) Co-authored-by: Lucas Nogueira --- .changes/config.json | 26 +- .../disable-window-controls-api-options.md | 5 - .changes/disable-window-controls-api.md | 6 - .changes/fix-docs-build.md | 2 - .changes/pre.json | 9 +- .changes/tauri-alpha.11.md | 4 - .changes/tauri-alpha.12.md | 2 - .changes/v2-alpha.md | 4 - .changes/window-incognito.md | 5 - .changes/window-is-focused.md | 6 - .changes/window-plugin-refactor.md | 10 - .changes/window-set-effects.md | 6 - .changes/window-tap-drag-region-detection.md | 5 - .github/workflows/check-generated-files.yml | 8 - .github/workflows/lint-rust.yml | 8 - .github/workflows/test-rust.yml | 6 - Cargo.lock | 18 - examples/api/package.json | 2 - examples/api/src-tauri/Cargo.toml | 2 - examples/api/src-tauri/src/lib.rs | 2 - examples/api/src/App.svelte | 14 +- examples/api/src/views/App.svelte | 33 - examples/api/src/views/Communication.svelte | 2 +- examples/api/src/views/Welcome.svelte | 2 +- examples/api/src/views/Window.svelte | 615 ----- plugins/app/CHANGELOG.md | 18 - plugins/app/Cargo.toml | 14 - plugins/app/LICENSE.spdx | 20 - plugins/app/LICENSE_APACHE-2.0 | 177 -- plugins/app/LICENSE_MIT | 21 - plugins/app/README.md | 76 - plugins/app/banner.png | Bin 60162 -> 0 bytes plugins/app/guest-js/index.ts | 90 - plugins/app/package.json | 32 - plugins/app/rollup.config.mjs | 11 - plugins/app/src/api-iife.js | 1 - plugins/app/src/commands.rs | 36 - plugins/app/src/lib.rs | 32 - plugins/app/tsconfig.json | 4 - plugins/mirrors.txt | 2 - plugins/window/CHANGELOG.md | 27 - plugins/window/Cargo.toml | 21 - plugins/window/LICENSE.spdx | 20 - plugins/window/LICENSE_APACHE-2.0 | 177 -- plugins/window/LICENSE_MIT | 21 - plugins/window/README.md | 89 - plugins/window/banner.png | Bin 58100 -> 0 bytes plugins/window/build.rs | 18 - plugins/window/guest-js/index.ts | 2347 ----------------- plugins/window/package.json | 32 - plugins/window/rollup.config.mjs | 11 - plugins/window/src/api-iife.js | 1 - plugins/window/src/desktop_commands.rs | 211 -- plugins/window/src/lib.rs | 114 - plugins/window/src/scripts/drag.js | 17 - plugins/window/src/scripts/print.js | 7 - plugins/window/src/scripts/toggle-devtools.js | 26 - plugins/window/tsconfig.json | 4 - pnpm-lock.yaml | 26 - 59 files changed, 6 insertions(+), 4499 deletions(-) delete mode 100644 .changes/disable-window-controls-api-options.md delete mode 100644 .changes/disable-window-controls-api.md delete mode 100644 .changes/window-incognito.md delete mode 100644 .changes/window-is-focused.md delete mode 100644 .changes/window-plugin-refactor.md delete mode 100644 .changes/window-set-effects.md delete mode 100644 .changes/window-tap-drag-region-detection.md delete mode 100644 examples/api/src/views/App.svelte delete mode 100644 examples/api/src/views/Window.svelte delete mode 100644 plugins/app/CHANGELOG.md delete mode 100644 plugins/app/Cargo.toml delete mode 100644 plugins/app/LICENSE.spdx delete mode 100644 plugins/app/LICENSE_APACHE-2.0 delete mode 100644 plugins/app/LICENSE_MIT delete mode 100644 plugins/app/README.md delete mode 100644 plugins/app/banner.png delete mode 100644 plugins/app/guest-js/index.ts delete mode 100644 plugins/app/package.json delete mode 100644 plugins/app/rollup.config.mjs delete mode 100644 plugins/app/src/api-iife.js delete mode 100644 plugins/app/src/commands.rs delete mode 100644 plugins/app/src/lib.rs delete mode 100644 plugins/app/tsconfig.json delete mode 100644 plugins/window/CHANGELOG.md delete mode 100644 plugins/window/Cargo.toml delete mode 100644 plugins/window/LICENSE.spdx delete mode 100644 plugins/window/LICENSE_APACHE-2.0 delete mode 100644 plugins/window/LICENSE_MIT delete mode 100644 plugins/window/README.md delete mode 100644 plugins/window/banner.png delete mode 100644 plugins/window/build.rs delete mode 100644 plugins/window/guest-js/index.ts delete mode 100644 plugins/window/package.json delete mode 100644 plugins/window/rollup.config.mjs delete mode 100644 plugins/window/src/api-iife.js delete mode 100644 plugins/window/src/desktop_commands.rs delete mode 100644 plugins/window/src/lib.rs delete mode 100644 plugins/window/src/scripts/drag.js delete mode 100644 plugins/window/src/scripts/print.js delete mode 100644 plugins/window/src/scripts/toggle-devtools.js delete mode 100644 plugins/window/tsconfig.json diff --git a/.changes/config.json b/.changes/config.json index 146d1e3211..399448f51a 100644 --- a/.changes/config.json +++ b/.changes/config.json @@ -38,7 +38,6 @@ "manager": "rust", "publish": false, "dependencies": [ - "app", "barcode-scanner", "log-plugin", "cli", @@ -51,8 +50,7 @@ "os", "process", "shell", - "updater", - "window" + "updater" ] }, "api-example-js": { @@ -60,7 +58,6 @@ "manager": "javascript", "publish": false, "dependencies": [ - "app-js", "barcode-scanner-js", "log-js", "cli-js", @@ -73,8 +70,7 @@ "os-js", "process-js", "shell-js", - "updater-js", - "window-js" + "updater-js" ], "postversion": "pnpm install --no-frozen-lockfile" }, @@ -87,15 +83,6 @@ "postversion": "pnpm install --no-frozen-lockfile" }, - "app": { - "path": "./plugins/app", - "manager": "rust" - }, - "app-js": { - "path": "./plugins/app", - "manager": "javascript" - }, - "authenticator": { "path": "./plugins/authenticator", "manager": "rust" @@ -333,15 +320,6 @@ "manager": "javascript" }, - "window": { - "path": "./plugins/window", - "manager": "rust" - }, - "window-js": { - "path": "./plugins/window", - "manager": "javascript" - }, - "window-state": { "path": "./plugins/window-state", "manager": "rust" diff --git a/.changes/disable-window-controls-api-options.md b/.changes/disable-window-controls-api-options.md deleted file mode 100644 index 6602e068e7..0000000000 --- a/.changes/disable-window-controls-api-options.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"window-js": "minor:feat" ---- - -Added the `maximizable`, `minimizable` and `closable` fields on `WindowOptions`. diff --git a/.changes/disable-window-controls-api.md b/.changes/disable-window-controls-api.md deleted file mode 100644 index a0e46af515..0000000000 --- a/.changes/disable-window-controls-api.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"window": "minor:feat" -"window-js": "minor:feat" ---- - -Added the `setMaximizable`, `setMinimizable`, `setClosable`, `isMaximizable`, `isMinimizable` and `isClosable` methods. diff --git a/.changes/fix-docs-build.md b/.changes/fix-docs-build.md index 880c5935c6..11df007a8e 100644 --- a/.changes/fix-docs-build.md +++ b/.changes/fix-docs-build.md @@ -1,5 +1,4 @@ --- -"app": patch "authenticator": patch "autostart": patch "cli": patch @@ -23,7 +22,6 @@ "updater": patch "upload": patch "websocket": patch -"window": patch "window-state": patch --- diff --git a/.changes/pre.json b/.changes/pre.json index 0ca64f7c94..5dc8af0981 100644 --- a/.changes/pre.json +++ b/.changes/pre.json @@ -3,8 +3,6 @@ "changes": [ ".changes/deep-link-initial-release.md", ".changes/dialog-async-message-dialog.md", - ".changes/disable-window-controls-api-options.md", - ".changes/disable-window-controls-api.md", ".changes/fix-docs-build.md", ".changes/fs-wiret-binary-file.md", ".changes/http-multipart-refactor.md", @@ -30,12 +28,7 @@ ".changes/updater-nsis.md", ".changes/updater-plugin-refactor.md", ".changes/v2-alpha.md", - ".changes/window-incognito.md", - ".changes/window-is-focused.md", - ".changes/window-plugin-refactor.md", - ".changes/window-set-effects.md", ".changes/window-state-decorated.md", - ".changes/window-state-promise.md", - ".changes/window-tap-drag-region-detection.md" + ".changes/window-state-promise.md" ] } diff --git a/.changes/tauri-alpha.11.md b/.changes/tauri-alpha.11.md index 0f5a7a0c30..4346b574e4 100644 --- a/.changes/tauri-alpha.11.md +++ b/.changes/tauri-alpha.11.md @@ -1,6 +1,4 @@ --- -"app": patch -"app-js": patch "authenticator": patch "authenticator-js": patch "autostart": patch @@ -44,8 +42,6 @@ "upload-js": patch "websocket": patch "websocket-js": patch -"window": patch -"window-js": patch "window-state": patch "window-state-js": patch --- diff --git a/.changes/tauri-alpha.12.md b/.changes/tauri-alpha.12.md index b19782aaec..97e9f4cc45 100644 --- a/.changes/tauri-alpha.12.md +++ b/.changes/tauri-alpha.12.md @@ -1,5 +1,4 @@ --- -"app": patch "authenticator": patch "autostart": patch "cli": patch @@ -23,7 +22,6 @@ "updater": patch "upload": patch "websocket": patch -"window": patch "window-state": patch --- diff --git a/.changes/v2-alpha.md b/.changes/v2-alpha.md index 4083686d54..5e649b73fc 100644 --- a/.changes/v2-alpha.md +++ b/.changes/v2-alpha.md @@ -1,6 +1,4 @@ --- -"app": major -"app-js": major "authenticator": major "authenticator-js": major "autostart": major @@ -44,8 +42,6 @@ "upload-js": major "websocket": major "websocket-js": major -"window": major -"window-js": major "window-state": major "window-state-js": major --- diff --git a/.changes/window-incognito.md b/.changes/window-incognito.md deleted file mode 100644 index 5d64fb0303..0000000000 --- a/.changes/window-incognito.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"window-js": "minor" ---- - -Add `incognito` window configuration option diff --git a/.changes/window-is-focused.md b/.changes/window-is-focused.md deleted file mode 100644 index 6f212fd5a0..0000000000 --- a/.changes/window-is-focused.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"window": "minor:feat" -"window-js": "minor:feat" ---- - -Add `WebviewWindow.is_focused` and `WebviewWindow.getFocusedWindow` getters. diff --git a/.changes/window-plugin-refactor.md b/.changes/window-plugin-refactor.md deleted file mode 100644 index 000d4c2382..0000000000 --- a/.changes/window-plugin-refactor.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"window": "patch" -"window-js": "patch" ---- - -The window plugin is recieving a few changes to improve consistency and add new features: - -- Removed `appWindow` variable from JS module, use `getCurrent` or `Window.getCurrent`. -- Removed `WindowManager`, `WebviewWindow` and `WebviewHandle` types and merged them into one `Window` type that matches the name of the rust window type. -- Added `Window.getCurrent` and `Window.getAll` which is a convenient method for `getCurrent` and `getAll` functions. diff --git a/.changes/window-set-effects.md b/.changes/window-set-effects.md deleted file mode 100644 index f2a5d3d99b..0000000000 --- a/.changes/window-set-effects.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"window": "patch" -"window-js": "patch" ---- - -Added the `setEffects` and `clearEffects` API. diff --git a/.changes/window-tap-drag-region-detection.md b/.changes/window-tap-drag-region-detection.md deleted file mode 100644 index 66fcbaf72a..0000000000 --- a/.changes/window-tap-drag-region-detection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"window": "patch" ---- - -On macOS, fixed tapping on custom title bar doesn't maximize the window. diff --git a/.github/workflows/check-generated-files.yml b/.github/workflows/check-generated-files.yml index a5be08c094..52be59f02d 100644 --- a/.github/workflows/check-generated-files.yml +++ b/.github/workflows/check-generated-files.yml @@ -25,10 +25,6 @@ jobs: id: filter with: filters: | - app: - - .github/workflows/check-generated-files.yml - - plugins/app/guest-js/** - - plugins/app/src/api-iife.js authenticator: - .github/workflows/check-generated-files.yml - plugins/authenticator/guest-js/** @@ -109,10 +105,6 @@ jobs: - .github/workflows/check-generated-files.yml - plugins/websocket/guest-js/** - plugins/websocket/src/api-iife.js - window: - - .github/workflows/check-generated-files.yml - - plugins/window/guest-js/** - - plugins/window/src/api-iife.js window-state: - .github/workflows/check-generated-files.yml - plugins/window-state/guest-js/** diff --git a/.github/workflows/lint-rust.yml b/.github/workflows/lint-rust.yml index 4c1f5899f3..b2e2a9330f 100644 --- a/.github/workflows/lint-rust.yml +++ b/.github/workflows/lint-rust.yml @@ -41,9 +41,6 @@ jobs: id: filter with: filters: | - tauri-plugin-app: - - .github/workflows/lint-rust.yml - - plugins/app/** tauri-plugin-authenticator: - .github/workflows/lint-rust.yml - plugins/authenticator/** @@ -116,9 +113,6 @@ jobs: tauri-plugin-websocket: - .github/workflows/lint-rust.yml - plugins/websocket/** - tauri-plugin-window: - - .github/workflows/lint-rust.yml - - plugins/window/** tauri-plugin-window-state: - .github/workflows/lint-rust.yml - plugins/window-state/** @@ -165,8 +159,6 @@ jobs: fmt: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/test-rust.yml b/.github/workflows/test-rust.yml index 075dcd384b..854e118672 100644 --- a/.github/workflows/test-rust.yml +++ b/.github/workflows/test-rust.yml @@ -43,9 +43,6 @@ jobs: id: filter with: filters: | - tauri-plugin-app: - - .github/workflows/test-rust.yml - - plugins/app/** tauri-plugin-authenticator: - .github/workflows/test-rust.yml - plugins/authenticator/** @@ -118,9 +115,6 @@ jobs: tauri-plugin-websocket: - .github/workflows/test-rust.yml - plugins/websocket/** - tauri-plugin-window: - - .github/workflows/test-rust.yml - - plugins/window/** tauri-plugin-window-state: - .github/workflows/test-rust.yml - plugins/window-state/** diff --git a/Cargo.lock b/Cargo.lock index 4768943ee5..de3ba4dda8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -237,7 +237,6 @@ dependencies = [ "serde_json", "tauri", "tauri-build", - "tauri-plugin-app", "tauri-plugin-barcode-scanner", "tauri-plugin-cli", "tauri-plugin-clipboard-manager", @@ -251,7 +250,6 @@ dependencies = [ "tauri-plugin-process", "tauri-plugin-shell", "tauri-plugin-updater", - "tauri-plugin-window", "tiny_http 0.11.0", "window-shadows", ] @@ -5675,13 +5673,6 @@ dependencies = [ "tauri-utils", ] -[[package]] -name = "tauri-plugin-app" -version = "2.0.0-alpha.2" -dependencies = [ - "tauri", -] - [[package]] name = "tauri-plugin-authenticator" version = "2.0.0-alpha.2" @@ -6048,15 +6039,6 @@ dependencies = [ "tokio-tungstenite", ] -[[package]] -name = "tauri-plugin-window" -version = "2.0.0-alpha.2" -dependencies = [ - "serde", - "tauri", - "thiserror", -] - [[package]] name = "tauri-plugin-window-state" version = "2.0.0-alpha.2" diff --git a/examples/api/package.json b/examples/api/package.json index 27bc5a3964..f5a9407dbe 100644 --- a/examples/api/package.json +++ b/examples/api/package.json @@ -10,7 +10,6 @@ }, "dependencies": { "@tauri-apps/api": "2.0.0-alpha.8", - "@tauri-apps/plugin-app": "2.0.0-alpha.1", "@tauri-apps/plugin-barcode-scanner": "2.0.0-alpha.0", "@tauri-apps/plugin-cli": "2.0.0-alpha.1", "@tauri-apps/plugin-clipboard-manager": "2.0.0-alpha.1", @@ -23,7 +22,6 @@ "@tauri-apps/plugin-process": "2.0.0-alpha.1", "@tauri-apps/plugin-shell": "2.0.0-alpha.1", "@tauri-apps/plugin-updater": "2.0.0-alpha.1", - "@tauri-apps/plugin-window": "2.0.0-alpha.1", "@zerodevx/svelte-json-view": "1.0.5" }, "devDependencies": { diff --git a/examples/api/src-tauri/Cargo.toml b/examples/api/src-tauri/Cargo.toml index 8fb867f533..21741e796c 100644 --- a/examples/api/src-tauri/Cargo.toml +++ b/examples/api/src-tauri/Cargo.toml @@ -18,7 +18,6 @@ serde_json = { workspace = true } serde = { workspace = true } tiny_http = "0.11" log = { workspace = true } -tauri-plugin-app = { path = "../../../plugins/app", version = "2.0.0-alpha.2" } tauri-plugin-log = { path = "../../../plugins/log", version = "2.0.0-alpha.2" } tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.0.0-alpha.2" } tauri-plugin-clipboard-manager = { path = "../../../plugins/clipboard-manager", version = "2.0.0-alpha.2" } @@ -28,7 +27,6 @@ tauri-plugin-notification = { path = "../../../plugins/notification", version = tauri-plugin-os = { path = "../../../plugins/os", version = "2.0.0-alpha.2" } tauri-plugin-process = { path = "../../../plugins/process", version = "2.0.0-alpha.2" } tauri-plugin-shell = { path = "../../../plugins/shell", version = "2.0.0-alpha.2" } -tauri-plugin-window = { path = "../../../plugins/window", version = "2.0.0-alpha.2", features = [ "devtools", "icon-ico", "icon-png" ] } [dependencies.tauri] workspace = true diff --git a/examples/api/src-tauri/src/lib.rs b/examples/api/src-tauri/src/lib.rs index 2e04967ad8..f9d345678e 100644 --- a/examples/api/src-tauri/src/lib.rs +++ b/examples/api/src-tauri/src/lib.rs @@ -31,7 +31,6 @@ pub fn run() { .level(log::LevelFilter::Info) .build(), ) - .plugin(tauri_plugin_app::init()) .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_clipboard_manager::init()) .plugin(tauri_plugin_dialog::init()) @@ -40,7 +39,6 @@ pub fn run() { .plugin(tauri_plugin_os::init()) .plugin(tauri_plugin_process::init()) .plugin(tauri_plugin_shell::init()) - .plugin(tauri_plugin_window::init()) .setup(move |app| { #[cfg(desktop)] { diff --git a/examples/api/src/App.svelte b/examples/api/src/App.svelte index 9bf1574b5c..6c24851eb7 100644 --- a/examples/api/src/App.svelte +++ b/examples/api/src/App.svelte @@ -1,7 +1,7 @@ - -
- - -
diff --git a/examples/api/src/views/Communication.svelte b/examples/api/src/views/Communication.svelte index 83f1c75e4f..43ec30f72a 100644 --- a/examples/api/src/views/Communication.svelte +++ b/examples/api/src/views/Communication.svelte @@ -1,5 +1,5 @@ - -
-
- - -
-
- {#if Object.keys(windowMap).length >= 1} - Selected window: - - {/if} - {#if windowMap[selectedWindow]} -
-
- - - - - -
-
-
- - - - - - - - - -
-
-
-
-
- X - -
-
- Y - -
-
- -
-
- Width - -
-
- Height - -
-
- -
-
- Min width - -
-
- Min height - -
-
- -
-
- Max width - -
-
- Max height - -
-
-
-
-
-
-
-
- Inner Size -
- Width: {innerSize.width} - Height: {innerSize.height} -
-
-
- Outer Size -
- Width: {outerSize.width} - Height: {outerSize.height} -
-
-
-
-
- Inner Logical Size -
- Width: {innerSize.toLogical(scaleFactor).width} - Height: {innerSize.toLogical(scaleFactor).height} -
-
-
- Outer Logical Size -
- Width: {outerSize.toLogical(scaleFactor).width} - Height: {outerSize.toLogical(scaleFactor).height} -
-
-
-
-
- Inner Position -
- x: {innerPosition.x} - y: {innerPosition.y} -
-
-
- Outer Position -
- x: {outerPosition.x} - y: {outerPosition.y} -
-
-
-
-
- Inner Logical Position -
- x: {innerPosition.toLogical(scaleFactor).x} - y: {innerPosition.toLogical(scaleFactor).y} -
-
-
- Outer Logical Position -
- x: {outerPosition.toLogical(scaleFactor).x} - y: {outerPosition.toLogical(scaleFactor).y} -
-
-
-
-

Cursor

-
- - - -
-
- - - -
-
-
-
- - -
-
- - -
-
- -
- - {#if isWindows || isMacOS} -
-
- - - - - -
- -
- -
- -
- -
- -
-
- Applied effects: {effects.length ? effects.join(",") : "None"} -
- - -
-
- {/if} - {/if} -
diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md deleted file mode 100644 index 3109c03f6e..0000000000 --- a/plugins/app/CHANGELOG.md +++ /dev/null @@ -1,18 +0,0 @@ -# Changelog - -## \[2.0.0-alpha.2] - -- [`4e2cef9`](https://github.com/tauri-apps/plugins-workspace/commit/4e2cef9b702bbbb9cf4ee17de50791cb21f1b2a4)([#593](https://github.com/tauri-apps/plugins-workspace/pull/593)) Update to alpha.12. - -## \[2.0.0-alpha.1] - -- [`d74fc0a`](https://github.com/tauri-apps/plugins-workspace/commit/d74fc0a097996e90a37be8f57d50b7d1f6ca616f)([#555](https://github.com/tauri-apps/plugins-workspace/pull/555)) Update to alpha.11. - -## \[2.0.0-alpha.0] - -- [`717ae67`](https://github.com/tauri-apps/plugins-workspace/commit/717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release! - te to alpha.11. - -## \[2.0.0-alpha.0] - -- [`717ae67`](https://github.com/tauri-apps/plugins-workspace/commit/717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release! diff --git a/plugins/app/Cargo.toml b/plugins/app/Cargo.toml deleted file mode 100644 index 6e18978e0b..0000000000 --- a/plugins/app/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "tauri-plugin-app" -version = "2.0.0-alpha.2" -description = "APIs to read application metadata and change app visibility on macOS." -edition = { workspace = true } -authors = { workspace = true } -license = { workspace = true } -rust-version = { workspace = true } - -[package.metadata.docs.rs] -features = [ "tauri/dox" ] - -[dependencies] -tauri = { workspace = true } diff --git a/plugins/app/LICENSE.spdx b/plugins/app/LICENSE.spdx deleted file mode 100644 index cdd0df5ad7..0000000000 --- a/plugins/app/LICENSE.spdx +++ /dev/null @@ -1,20 +0,0 @@ -SPDXVersion: SPDX-2.1 -DataLicense: CC0-1.0 -PackageName: tauri -DataFormat: SPDXRef-1 -PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy -PackageHomePage: https://tauri.app -PackageLicenseDeclared: Apache-2.0 -PackageLicenseDeclared: MIT -PackageCopyrightText: 2019-2022, The Tauri Programme in the Commons Conservancy -PackageSummary: Tauri is a rust project that enables developers to make secure -and small desktop applications using a web frontend. - -PackageComment: The package includes the following libraries; see -Relationship information. - -Created: 2019-05-20T09:00:00Z -PackageDownloadLocation: git://github.com/tauri-apps/tauri -PackageDownloadLocation: git+https://github.com/tauri-apps/tauri.git -PackageDownloadLocation: git+ssh://github.com/tauri-apps/tauri.git -Creator: Person: Daniel Thompson-Yvetot \ No newline at end of file diff --git a/plugins/app/LICENSE_APACHE-2.0 b/plugins/app/LICENSE_APACHE-2.0 deleted file mode 100644 index 4947287f7b..0000000000 --- a/plugins/app/LICENSE_APACHE-2.0 +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/plugins/app/LICENSE_MIT b/plugins/app/LICENSE_MIT deleted file mode 100644 index 4d75472566..0000000000 --- a/plugins/app/LICENSE_MIT +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 - Present Tauri Apps Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/plugins/app/README.md b/plugins/app/README.md deleted file mode 100644 index d79c52e386..0000000000 --- a/plugins/app/README.md +++ /dev/null @@ -1,76 +0,0 @@ -![plugin-app](https://github.com/tauri-apps/plugins-workspace/raw/v2/plugins/app/banner.png) - -This plugin provides APIs to read application metadata and macOS app visibility functions. - -## Install - -_This plugin requires a Rust version of at least **1.65**_ - -There are three general methods of installation that we can recommend. - -1. Use crates.io and npm (easiest, and requires you to trust that our publishing pipeline worked) -2. Pull sources directly from Github using git tags / revision hashes (most secure) -3. Git submodule install this repo in your tauri project and then use file protocol to ingest the source (most secure, but inconvenient to use) - -Install the Core plugin by adding the following to your `Cargo.toml` file: - -`src-tauri/Cargo.toml` - -```toml -[dependencies] -tauri-plugin-app = "2.0.0-alpha" -# alternatively with Git: -tauri-plugin-app = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -``` - -You can install the JavaScript Guest bindings using your preferred JavaScript package manager: - -> Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. - -```sh -pnpm add @tauri-apps/plugin-app -# or -npm add @tauri-apps/plugin-app -# or -yarn add @tauri-apps/plugin-app - -# alternatively with Git: -pnpm add https://github.com/tauri-apps/tauri-plugin-app#v2 -# or -npm add https://github.com/tauri-apps/tauri-plugin-app#v2 -# or -yarn add https://github.com/tauri-apps/tauri-plugin-app#v2 -``` - -## Usage - -First you need to register the core plugin with Tauri: - -`src-tauri/src/main.rs` - -```rust -fn main() { - tauri::Builder::default() - .plugin(tauri_plugin_app::init()) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} -``` - -Afterwards all the plugin's APIs are available through the JavaScript guest bindings: - -```javascript -import { getVersion, hide } from "@tauri-apps/plugin-app"; -const appVersion = await getVersion(); -await hide(); -``` - -## Contributing - -PRs accepted. Please make sure to read the Contributing Guide before making a pull request. - -## License - -Code: (c) 2015 - Present - The Tauri Programme within The Commons Conservancy. - -MIT or MIT/Apache 2.0 where applicable. diff --git a/plugins/app/banner.png b/plugins/app/banner.png deleted file mode 100644 index 752d36da9f1b185fe6a75a216cd30f753c5fe62a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60162 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

Oi>(rvKeM_A^4a2Af&l#KPS+4e%a=2 z-KnCoR$+(RiQW*=3b+`(iDUb!0e%zE+m&pJrIHdq*64!;tW&ccr%?`(4(5Lb3k5Gn z{%~e5rkrLqEpeDAODIV&=MfGS4Le_C$8n6Jbm#n@(Z3UB&d{PgToad6|PUUAz=YNUy z=rL!UvhtBZ+cv)Ip@e8vpD~zA@8uT>RMa4;^it`eAaAxDno#*%qI*utwWMiF&$R-e z1P<7SstZY@wY5k;RQZ&VkLEFzz=Ee)GMEhjUM?|TkXeGhXL=VdpIRRL^7^6iPhE~S zsQM|Iy>+klJtm8FEA+&$`#l~%*ZKIb4=5@%bZaXGzqFq{DvwW1V2deG^hw&**Q@?2 zJKlQVrQlmRDSXBvsYKw#k02P}SeL$pQaunr`nq~92HZDI)T38@Z`F2oecI;#VLf-` zA}%7L3s2-Zgr_SE*-7PX3@)Rf(%kQ-qS1T3LXH0UyXCO6(;OO{AY$3I*i{`oxBu;< zfsW*Izd2$p#3l;$4&qiIw zf#xBwRMJ`JR6J|_FUGP4pI3yye5$g(sU*FJK+VDP;^!YXP5?LqkqE-JBn;2k+Bmq- zn3eF`cEw4~d&YU#8+r&Awx4Hfq(qUBXSJPmb96#@a<>(=oBU-gEdK&CiEu#x_7Lti6Rk)7)O z&vng=Ri_3JTu=N1J#rL-^xE>!VZk4<4QQxIaZUv+?^ zp58nKS*u{#hMaon1V{&5;#0_z+PZG#_s@p|Q2+*8_w^b3U8gy=dI_#3sGENC{-%II zA6G18;myO`1cH6yfvxq4W^xwycV;m5Tbdwt;)?Z8=yD3;O%C_7+*+AL(h1V)1x73H zotmjyCI4%vCN6<)$E7$d?@;#q>tQf|frc&AVILGL1!m}ed9W5j?htmX#PUZ__}vGm z<}6HH$$V4dR<^26i(jU~ z$mwA&%GJdgmBr?iwLH;Z9$=#iwuu8&ypqoR%Q+*LbFH2s3_P{9Jw|SFY@UsDgu(VZ zMvF*k?Gvu^)KAZIWr5e#K6Vr7(XwTD@O;tIp+tZXMrQ2Pao2ez@n}*b1C(Dj-(Aq0WCF>U*oeqi;~WEU!qdTDCsF1bfSo^T{tA zUr^>lgk0Btz_c0V*=c6NC6M_?tZVO~ebNQ=PF?>Pn8+!f=CnrrAv%?B5XD$gv{1X? zy|sT3>o59Tr#!n@qW3h&jO{FwbN$QwTfVG`k^Ke+U3IV_Y!xXdFke+yT~lkRucx2=MqQ;tRgJ` znrDv|791>k`=L=tf$g4)5Ka?1n!(fXJ`4UPvDmzpj}&T=?f-hdKA$ahXgQwLu`sru zVE>mKmIZgO->IGL!^@s{fOVI`=LPG6C|6eYs{>X43w0(rMGD{j4$Z8{0o~SW!Ug;u z6F?r@74V+@s#jTl^m0oUE=$n9S~Y4llTiyhe>1y$ZlspObH++MJ6L({0dQos#(okG!)=6y<%G9X>BNMY zdKIA(Z!4&5{1%GJOp12RM=h(Z^iIFMc#kJAv#bf7Hk}8{CVP?(ve4&Q2TIy8_w(0a zFPiiNe;Qvdlejw0h`X-!@6QbR@i(usIsSVrO!$nLGzU5x3b$6zi2AzCip@Z|vlG~v z%&^xEYWr8`j02}GeOc}KS_b%MgXTSuVwpU1Ve9n*n^hSJ`JL?|`_X!DNlL`!axs#iv%HtcAJKc!< z*OJX#(4uj#U4F;Ot$E{qvube%WZ;h@$D)`2e13qine#_q9fU=?3=jHTU!H4TwfM4I zMHe5?F8YkfkaTAyU6br&qA%Aa)^8{$++dnV;m3dK1!lz*YvKdjXd0SGv7N__<_;1g z1Rc5el(+QWj>4LfCZ%U5714PdpSXdyz7PS@ zBlk>iu2WPthppWnAD^&?NiH3NfDA*e%5%Tteix8V=R?HgoZNBX2yX zSzNE5T9~F-{P_XM$Yp?MO~VDK)5>$e)`;jsVjrGn7u3UO-uex(#voTWY)}4r_Zh;G zg?(0*{p(e6gnqpIf$7N0HGwXuoC3}}3S@&Is5UIc$x#8a6SP!hcs{KCRk~C0bN1wV z1@7|Oc-_Bkz+K(}4n6|%^pfNXDHMrbQ=!{%9}47JmHOSrEz|w#6#VAw%_JqE$IKX+ zWCs-T1sV8O7a(f2+)yxKt8}2unj{&zA5g60s3{MeR+C})7hIP7fP|C6EWYZy0#Dyw z$ppjR$jAhyDaxeE{Vf<;S(zL4gFh*coLtK zZ8N$p##F4t0P}C3 zKH^8Ph0bi(9%}TFXl7^|!`;nOB_AZps2-frl(su##0uuO{I9O|{3ZPS z!KzmCpIm@LU%q!zR8E}mev_4);0S+Quv+DlVspq=Qf`pZ1qb=1MiQeAulai z%k}=5NrTJlOg6UFGwmD#ihoLF!Wm%DeJUgh7d7 z^>g_6yTdiK*j3YUC0ZbcExt&I!{cDNdkHA>_T8tXE4(Eg4}~|fBgz7X#!w5Vtx&<} zK($~XvGv42{V;wgarH;_2ypBN5HO8oZ)Ay4aK9hNprEIXFuoOFOtke4p#ZZDU9O08 zXM9ryhHvd-U!s7u!40Au7v7M6(zv4XzdUdzG9HNDOoFbq1UNSPK2W!6$9B*BeGdEeha-_%&PPSWQ0crrMTbWnGMa$GLnQ$Lj(}^PnO4t}7Rf1DJneur@3v z!o1GAB90le`F5pLFya(MfHg1&!|-cCjz2F3jhdNycs7DD$$+p3U;l0Z5_F~PzLzW1 zL#Q_zcM){1vh-PMg9g711}%Sdns1I5RLt|F<)c)&#V?+J*wC$ zZHn0%8h#*9GpANt+ID?0t#vK7=cTH-H#R$)Hp5rLnz;(Kd=q=X_7%`$~IpF9=G=#|OtC=71T3-sK#)EpMmGf306d40gA8=ZK zd;=_i3#L~)*AW^bbFSdT&I8u1$3=bfw)D{d37+8M`{~kM*3v#V89*0S zaYM=MUO>@I`owhp&k}~kA9*7FF(hp&90;q*KMJ-mLPAVmf+#cfdg9yqzIfI{iZvu? ziS$+Ny|-ps;gm`z&r00M9|qESG1%fq4Q;N+4N~d>r!muBo%nNaO%YLYg_y>(<;X5w zSjNP=p-19l(FvCcJ!qGGF$uu3a-XAsD{D__ff-war)`a|EZmTdjPZcI2qt3e#gVxq zI)vr$X2}PLSpxG_Vv&0a7p?n7)s+4axd3jS(73u~&8O2~?q~t{>3TvprB2W~TbxOS zCsrg1TfJhv;v%OM^F;`;aP5KK#WKCy9R_+mHF`bdn*7!L-`>cc(=}}Ys{$UBd1w6H zL6Wd7G%DcD0!)zTO00H{ogXYZoPgN&DScwFLdz^cML|C@C)deh+ZIB;?S)t8wc-~IdRKnoDfF2(*&&lXu-mDlv6jfUy?L?+8X4fyx5 zjVv(0T2ojloB`>ECethbn0_CcBGkG2s+~piYTSn>J=;<%l6G*E>4iQk1kY!JbZIcT zj4)QQK3j|+k`xZ|(j4@TQFfRCXT`TySAEM61RYsWUvB~_m1*|1x(i7>?A7BfU~IdK zd|^K%nc*XBSop3VN89BgCu}gi@_KvA=(MrFCrGwxLQ6kbyY(=!f{=HQ=IPK0)H8Ag zyyl>%8607O@asYnvKc&Qhv>1F-mYErR)Lwhi2PQ$bL)TGkoLS)53YD zy^s5n*}Fgpi%i3fj=}LnXrgx<{UdK}HGgOu5*DJHXFt* zEJC$gO2YzW1Mp{kRw$)^l27C(vNO2WZHR_TyMr7-rYyQ3i+5qgp@zUC z(nbJg)3>TM(K6&;qIc?!EL2}_zTSoHT{+wqb;+pOtO=K|vTxS??ixuF?iEk(VQdx zC<}c#01|KOM_VCs{;1Fo?SM=<^GtHQl@4PEa7qAJk9Chro+lnU7U|x}ntnfW&_!A}uniXGKPSqoMsSd-=yL!asS@jaU6J@hZ-TvT~gZpqb~zVnrT8p7^U!u2}HmUfm`TL_>Qe{ zlUR}vv~sjTPOrAHq^}Uhv!VYMejcx)eNNp$O2IMRH_f+#NzI=a)&^F1E$KX>@Q>7k?y`!B{x0FVb13LsZ(Ti5#5>{oahq^7}>6yA9 zbP?!s2N*fL{tcGOE0u)*`kD#8u~42e{XNQ zEsiF&{*@dge|YnPO`6pBKkugG7|{l;zJZthk(m`4beO0ez_(;vb_5U6Q1EW(Bc9B& zuWtMDVgQLDcz;GVCP6!X02oNd?$DizrtiM{ZtLK8lvXGC=PQlnD+M0h$5oK^^|AXy z$YGeKzi{|@AZ74fUa;XdK%XG-KUsT?FZ6BFP=r zO6MQmF!q)U1)>Z_dpi90ai2ha2X3m*+zM4mG9L$j6P@3l_f!-Ay6CzPiA(GmZ~{%| z4Lpc98#@99%WN-@7t0S5c4yp1^Bgh>{!#cEGA9Ogn%_L z-km>)O%iFgKE6K9@A_AB+I-oDS`yQQ$+J_laTyTL&GXs#R5I5NG7Ka`QwpN{xdp@( zETirO+w)Cz4ZjR`N7Gj*)~$>H#20`d&i9LE`8xmeB!BBtuL0ZIbtCqOG7yFX5B>H( z6p-Zg4L7v)S*eXQesx8!IbP=x|NQnKldpxFtKZGRIa0s6jUxg|_B&o}1f1VP>AP)> zQHV8Dk|rG=BR3r!jA3k}{Xh|R+)Ccv!3XH^@8UI^`dI(P%_^{m$DSODFgwcG1mk~x zI8t|;ce>A%=Rumv4@beT(H5id1rx;GW#_y-`2@n!uzzPt3_t1gL4DOd3Hr9uD|v^fP_ zw(P+jkLLIMJo1Jv=Jb&llWRbxIqux;<%yhb0hIAVGw|Fv2D_|dtKR-{%_PvEfTFA9 zc*D>e3cScCMlKG&{<2hY!2c)?fJXMP*5Pr=f)BInv`J{qy2a5hQsD`+V5jsYI4~SM z$&!a!+aS4x*^&;&rhqj}YMN|1b9!@HNXUp`S=>(ezqrH5xk>?gd?FkTu(*ENd2is{D}xgR%Fso&)(C;E={NZ~mSjX%h;6eN@e&f8f-D)e$DA|s(OV{lOc0jV z?9Sne)sp9xZ#u5QqB>rm`lIX4L9bn(u(gNrggV!+wUfAXSk`inx5H(`iG|?GyTsPe zcA~D5(80Ybjc>?n(A6bI_a^60AN(xT`jfe{N96USbMme6po4Y{NflyBQiqxDIs{*G zTE{Me-K{_|`jP*V(yXfAVSLFy&Cl&dbKfo4*gcTp_dkdMY%-52bV3wM69w0@Z=<*$`O0>Czc)cpxp z4*ZKevgG1)?+e?nt!uG2IVFaYDt>1k?Yx~uOC@sod4`=PtsQO<@`0rMxZ^bY&HE~^ zNPsN}+NDc>Rw!yL4ja`x01km_V&%1H^F&!xw4<*X>)Xiod539UKwcmn#)w78h5BRV zcVVI{r1lrb(&$0F-Y}W4HvW8&RTWdAZU(!dOu_RoK1;N244Xa)(}k4m(5QKtO&K8$K17oxyrqpej%a*nB7%P)0B$yBF^Brf>IgXMTa~#Q4QXsdR6XVz zdgJLBT{EtlHeB7c2g>}8i)ycXWx_-MI4vAcl)BfP_^xr1SCXW!K8K~Cgn<-jdek`8 zQtIY1{mkgNP%>%r|I3US7#*h{rSPnIoSgM)OZTYa9!cu3r*mLL zY(#F`RrUmzQ=WBcB41!ez6CCZoqs4LF}oJ|P*Ay3c5F60TN7xTY2FX!up8Po#Aqgm z7(@XG8rK?nKUEvx@E(bDu^bJocq$Csaa#s%~&G526;&+oK}#5?w8^=XUg zPiBIQ`P=jAhLG=kEHTsWE!ACQUzPCqOHH%?5GJX`g$iyOWN0mFjmGax?TR0oDdX1# zRL{xq@?FN`qYqSnv-um(K+m(-gXO(>4oy8A1u=_$IR`TZ zY1O)lYrxQ`b`+uA{1s}bh9f-F#=mQIml`&u0^i8;fVGNiYD3v-@vf#c=JXS2Fv5yb zt<*JRtKW?+hUo_qs#jdz!8aw-J{JDMqLsj&W!~tN|>T)h&ef^@Q+=rX}TulPv?e}udG>$WnV z`K?qr@x!TA1+uS&1yvtJK+QI0X_v3Q zb@_sAm@l+KI#gfogZ*ECQ##va;Ji4weNxm*?e7cSCf7-JIwxi;Hc3fqNl}g z-L~Mcr8>@+<3nEUdT7H%=xH~7|0o*UP#q=rR)0O#$}m*ye|qbTugq&eHvP}5e$WO{ zBSlXtV(o$Nb%?=Y=y9jw=Z(?<^D$mB@_wily=kTz%8vi2`ZtPAd23SjeSP$|MkXpJ zss0CJ>QVZ-D0!NV_cxQ^ud)!<5&jbXksc3 zik2PSpFcRsH_DI0Zo~W3Ge;vlVM4!jwcsMQksDfn#<%RgczO1UEL0rwl!Uh#1C`&!(X9@aegx8*2fZ*FeK!NXQ2M;YG_##Sejc*?z{tPcm3srDm} zRozy-;-V zk=6i1WpHuo?T3VeR6XQIdF&Zc5Q`To5ehF=VT6t);LE~m-{qP2xpjt_aaEp!pSdAT zARN4A2lak-moIC2h_l&+liCyJxVUn8@L7`S{HqS?%MQubNYAc{_wRRu3hGNKa3xA zj!AX>>Zw+nQIoEjN9jD+9=n<;;hEPXv3|VA>(MW9?yUnJ_hIgXv;-SRXoJmi*{j_~ zltAdJWpSg3-jZoS}AZlhHxT8CUAicP(mUww1C#e0PYN76SnzNcOsUCcrtYV9tE z=S!3;B`4FYv=7rDO%-N)4+2_xdveOh0|x5~X}u7WnbO*8@U!Cmhv*8wv1kWG{59j( zbWicEvm(4>5ts*ut1lF%lGD~YMKf&`T{>-usR};3DJ41DVxEhyE#_mh9~>_HIDWspC3)9Wqv4h#F*Su1AhDgls*8e!nH8`!p zsTqQCpJOND3>0;Enex0|nX=ecZ|C{ky10ics1ZeM->Wi@i%aSmUG%&No--4$vK}YO z+pXq+Q<@3W5@RoF6^vwrX3Bj^iwt*c?B|C9m0PWp*K-CVT$+JZT;MpRu}^8n4@`ns z4>=mS>(RrPLDBLNS=f*o3wyUYty^1#`8(}>CD&(zr3c!{dOsY!$u+)~Y5dyy&0sqC z8cEVP9BfHgQ=_WFIA}u6hvZB(1aICE99!SoTNC|s?c>g9kD!jh=9?rNcF-ve`ntDN z&qLhTYz6;K5`K<%LhK_iv8D6Pi$@rIg(1{1Fr#lF(Y19uZ1pWgr#n4>+9uEVl`nCt zOt_@W=^ts2e+$cYBlOq48+u!kxg*IcC#uhOcn@cP_2tixDsQW@H9~?U;*$D4)jw?< z32{`vi!{Nnef8*cOp$bEgD^nmH7h-u$#f!bYVX)lqG*2R35<*CX6FH=5^R6O`kxEfJvKvo63op`1x_(BbJ%u%NRs{_}q@ElpODA z)z|mot$hQw%;8BGj-4gi5<$pk%n~hibg!@G93(w&f(!h}z(z$RDZN?Upg_IC)Q=UH zzqCk_q%?fo>HZ(75Z{4P&b7pHrQ`7U-7PJ8s%#lLC> z2}@AuX(F{SMF{bpa8pEFBs%W`OM~$-TX6Zi8!RLEKKQj)NBHpXM6&;XdBFBy`k-tv zRccrgEfWD#ITli34Vvh{lKSoV%~%z{46K{NKHP~tD8xG|{(&UDTKc9VxcOniJ*}nU zgBYuoB#H}%Gs@8fmy`XK>U0z``$0gz{pjXzT2){c4q%N4{K62mGF)(UU*xDM@WV=L|p_N~Hqxt96Ai%33+J%VGk z#f;OP3BO`pzYHnY6Eq#yZM$GhgMIbuQlWz$di!lyD>Sswgui@sa$`a+_c_mu1l(hpC$a_Ke!KFI~fOdSy}SF{vBY8dkes7c0HA9`x{RmVs*Lk zz~uWuFEqlV4Sz_BV-Da{$$I+TvFj_8K7f4Xf}ZW+7bVrw{4Bbd|FyHwD~<{^3_jaZ zQgcs)WWteP+TvRmc}Ys4H{GJebR57II*K^`_pAVa*`~m2iizFR6SU9TNhP|N3;z#O z-8^$noXVt7TcXym!Z zZfR4~L$Lk-t@#Lk5+qnm*52;5>MkYh^v*WcdQBP{m22`)1aOijY){o*srcQmWF`hD zFLyDmW`k+*#kVFOJ_W!2f0w}Tw3=p}Vas6N^q6@-sZAoOBNkIzl+9hM(km~kjd^pK z9Zo^T6w_Ob%SopOm?qBh$96fl2Z{ff{qN1K&^`w)HEqXdD*_a* zPpK^b+kzO3&#-i?y$AmWA+V5P{v^vSr?GA3N9D_Nw=BY#Kb>@j|cs2+P%IG^Me2Er}_g~&i^EvEkD($Zyje8JUT&JI%{g? zeFM6!|1Dq$eQ@zg)n>XeK^vA9mPyM;8I5;@@5!{P} z(J^k&@LxJ2+;L?NMtjkBk~%nF|9G`e=px=c`rlp)Qh#&nS(E#Y4Vo>w7{|sh1b^~A zT(ezKfXxSd=7Zr-p!n{+Kd**pxVb=fIZ`M8EUcLJ{TWC7|E(!t?x$Y^Z{(QpNR=vK z!l##PLB~?){~Ez;_(nXGQ-c55h1NIqqzeYPt+2E* zHJFIIKS&R$(+l304#K1FXZu~62?!v^tzgV8T045daRoIG5YQCUm}m$U_d52S4)hTXS#&bpM`~o)AsFNMrp(AXQH?J62LKW!(vPgW6H0#rB*2@y291mzL0rWnfApBd)z}&YMbg0W1pQ`hsy^^v`U|7YK=>uS zppwl7R#v|Oz%*t~S^?&|tCbO!-9h)TctN!U0?KJ1tkrj1Irs5U zyTV%@8smH5=!L5_NA!u~tZkFP5KmuGA}#Rz_+JM2%|3L#u?HSOfVf5C6w#*E2v}x> z!5VjxHHqy9L9kO17hX_nZ}i>Ypnm)t`@|*0DchPuUEvJmw59THGqhXY1!$H3Mzpx$ zpdsBQATt1>LDJIZw=H*0$7g8WjE%u6q@pj%&^D03qVhL`q`v)bDuk-+;n2Xbwb4ms zQccJzyLJ;|A~kK{Z{GdUSIU9HfF;U7_>3B%52(=<4a33gbZCaqT@e zrKuYM(=gk->sDs_%ZAXwqiMEg3JqxS2~oggI0BwFE6TTR9mrYiqZANYrb9z=))5HO z>vm)f$EktjPnIWE#{;L$>tZ`%8nda7km&MIvF%5vz7W+2etCE7MCvw*C-Wd`4Pu~% zw>IXLgHfp!-q6chS{H=rS=|Ft`GZ71dnX6PQLEY|08Wsj-QS@}D^>t5&Hbp{RsIX8C=5_bim1YcZ#M)m^9)pi!+HALD7raR|jUT&^J zM`au>leE_~?B4r@aOw1+Kg z3oSlrH}V)bb>R5K!~WZ!W9s9Tqn-!_+&evFW`V+LBoJ+dxE75e`_LaA>-mE|mHK)= zR0>(tFIIL^G6)oyDSoIqVQ!RI0qVr6ajl!mHam>**dl6J6`E0xvWwq5gWz}?B*>S% z*PME7*;6dgyo9?`73<>1jb_P#RE-@mQjdfRu3v(H25A0DjAZtrx*D1@kGTeKX)kV1 zTOt!F+|yiKmQTI2RuK!g6Zy=ly3?8kA=w=o>aTTdHXm^Gmy)V>#TZ7R*P_$ zWt#Tq{7+#1lh^w5ENv#Xad`q%^Q-J0LW}*wu|rg@{aic3V>K7OGRJnJO&c;Ch#0R6 zbM(bo6in1?_Iggcq-YZXq4YF}tD;}e04aV;Mo1#nqu+5-bxe>Ne5eg?i+xKJo|s`a z-pCo0@d}homnZ2@QrYsJq~wLa!us+HOjsbu^h2?jm4`n5>vRMXUbYw54^t89kFoB4 zAn!UC8g!1SKz<(}6p{;XyJ6s!+Z3s*QRbLD&QD2HCk)2iSP zT*%ytq)z+%O8qzKeHjq~Ss?Ybn{MsH&TL9_JqxSN@=8$H>39&W#W{(OR*e*siJ61z4JvIA|>D?ljO>enGi zMn36W0piCZ`>cqPd!I1q8C|mvIL&MN3JiY2Sf8K7c3-Pd3~NDjNVRD@&6AIbaV|{! z%FnL3%~|h+=nQ2W$-PX^ue8WN?KeC~Qp}Py7A$uc)yM)=Dl|z`+f&W z`HRL8&7U)5VlkAzxaGRBdtXWoOCO zbh6V8^hpUKnwHCiOmtd!#l9z{8i&dBOqj$xT5&3aXtvqL@-JeuGlP>6u$3Ri$3>aP zW>@9XLy|4z9#||O(~9Ytm=1dsiI|n0n+)?M5XiAEKVr^h$M|b&utK&2V-Db4o+(sK z2V{?J8`4v~;H1$iC$pozQz3|}6pa!xIB({AiC&M6>j`ESUBViOH2V8Bd{<4MUaJ5d zX}E1_FG9t@;6Ac85YVbf%_$y5=s!^*%q)4)Dsdh!Vf`zwNt`r@Us2~o$ZY}L++%yh z*O7_;>hG4EL?hr%=4%B^z0iEcMF|aFbFP1fye<;YSMfaRrBD=CX0QQ{zRngxR=F?K z&Qx@n7wktP`9DooSDVC&4)WLd;k|H>9$NKb*J~o80s+Hf9$ESs&OuA>L8&^R-tk4s zptMR`hrA0|ugShgT}`TY<%`AII!#x8-XJTQi#^H15eF)6)zbixdzo*sr>QC zd=kvrOa`Qe892>35sO#7PIsx~d`EMp!MGOpN`P zyO}eDK(_HVxk<1|a-1S>p1fFKC`%@Hqg&Y$nzT36%gd(9u%dvvN2bU4-m|GXmIg>% zUg%;usEgXc>CRk&rbYsM%y5|V@v%vDNjqg)x$@kC9}MZKwdIH|K5--MO*Klm?fi)# z(%EO4DU_h(M=^AO%l9y=w@xtpqvG9TwODTr+ja|zlFH{&6tqf09?{m;)qxR-Ni<& zp(ndqa#W8rXNb+cjV;iI3_x80f8i-OmkaKrI$vvSG57=ygxLmr#}5eqn%I}8+*qZ1 zewY|J((rpeYL!>W8Gq`{HAwrGUs7r^eH+?HpsYC(qU@;N@xJ&PGx`UL{X(ZL`={0O zO;u7YG`gt`)udIt9ec^%c)S7MY({*p)ZnL}{>yPSd0ayZw@dh^7&q0n<|Rj9wcmPX zQOrEOT;z2WX4Hi=;Sjw`tRT|jH91WxK1*Nthg<0zOb?thx2X`p-euS3zD|z2Cexmp zD<85jNX;5AC>aVTl7}?hfxt_&GrA#?QL?sAI3FONo5 zH;08$+0gI+L@zjeW>_nsa#+Hs@VKqewQ5 zNJTeZJ`~oaX1;vJ(^)Le@E}p0LTyOQ2XBzbkL)yB;42?%U|o=Nj0{4&_kN5BqQyDp z=Xz6kTaX;m4GDzEc25z^otKa^vdz{uCrENg^RNwTi2YgsU0v}%pD|t-l&gR2b zDgCO2*Lgk4E5$xq9CRO>Y?F6AM^vw?JmSa6#vReDzMFba8FF%s2=PbKbrpv|_@evtKdS&{~f~w+rWbLoA z>oD&V^n^a;!(8RYHnnBPx?)i?|3?DrSX#_!=riJ*@B{ z3Y%swWa@pPmYlRsZSaEUFBU@nx7UWZhu=EJrUdyib8)b-SPC4$!?BVQr8e%9b)ngb^ z7;#N8wSe{GhjGt=-;?;<5X&ITX$wr4!D#HW&ALA_Il7p*gtC8IUKJ^r)1PrKG{8<- zWlmTO(ke7Cj%l7OlID?Cgoj7vhWM%%IVFi{+%#7B zuceg+0{578h&aQEG3cH$G|^FvyqMwkzA)NRXdU3h)W!TchH z8ox)nfpu(X@)i37Pk@S0qsP_fxU_63mI7g>Y}`K6*MDRbFDVngR%0_`UCH~XuOS+o zWiz;=P9uBcJD*5lR(8-o|3lPsceSq~r~^*X7g)a0kT~<)=(2}1Fn#D${m+z8G5(t1 z>XWV>8Ao?6V^1b~IbBl6zjAbmLKewg1hyCJ|>Ia;_9xS-SC~srX*H;#bkLbVJY^^<970b^cyCcKe_z<2Jb_I=4m~TD6!jjbiS>->DIyPMhujKu0&9v#0U!;yub`Z@0s{Pq?#wP9n+L zCNB9uJA?2JJq2LENW~y@qIu z1OEQCZHYxDMUurA>Z{(Phb|6`mE+{N&bnF6ToPRPh2mG8x6%Go$u& z5UV47RgmwAV{S9QrQ4JeB65#NXt!~V3e8^!Je)cb+eFW{qWA)iUvJ0L7IRQM+cDWz z*gjv*C+K{e=SqTS(lIVXmU#XAk4C4~i+`TReRv`=AOst0fBj0{Y?08pon~nIS;i3$T&-eTN{kMO%yVrf4d+xpGoaf^ZO7?ZWDK4FG z$Xlz>|Djp&5cDy4sC<1qn=#&FtoHEJz6gRe9rY~u(bH6A9)$qkfG-0SteQqcAz%jarlVp8@ANLF<= zG>T~=MBJ80-Nof46RpRY5CSFj%zXCHY;TahpIQnuoJ}8Ja~ji!)+>|?AWKszEx@OV ztaW>zb!`=$wq_KfT6oye5o=9jGispIlgY_(6@FLMHiPR(GeBvc=h^lj2YR04yB;)4 zNs4#fEP|MB@n_G4-Cz)~rESZcKlGD9*mtGOTW&v1QfuO?^xJ=ie6CvrLfZn2XfG#X zf3w3lXXeRRiS;MQ+%q(6B%|}c4AtVxmk)iv+_^r*`~2tazGpyjxVNbK;+f!5W+t~yO$7~ zAn29m=1oeSHXkaK0sBKah&WvJU85LKh99VS!vBM-5DZZJ`)QNn;tpq@BAY&azo+AG2jH$0T$V z*^harqUh2WP|DH`eqSo49~-`9!BBW1ziVsq;>k}0VIa|V7m^dwh84OUs)&CO`BTw| z;|o8nHK|QYRrF!V_!qS4FfcBC7ENKG zC;YSx5-}R4pVJcJW5kMYrlbwl8HXd=bh)swnwVLt_%Zh}Cq;{{$)mNqE-L6ORpF07 z_F!6azg z+NO!}(MCWre3Ko_;u#eivDThcw`Kaq5(UjM<|FCMegx^~JnqkFFw#N> z7?nxi3XBr0h>tG&ix~W_)Z_Ut-a18J)r~ensaKQhsI=~&s@d>(?=T0)XJQV&j2A(r z9AaRzM+K`ERAI$?rs-tQj}-4@_#5nBg&Y|F)b9T{F!SPLO^Cg&EpRqogUCkFtRf%n zUNJNM)YpG>TaOOXQ8B;W4t-~gmcgf)dEorF_Q9(C4twc#O*Jnn@>*!9B(m?@qX&p|;ck4Jgh=xrN2(rkKg!BVrnUo4OsQY3!U3SLxBT|!88rDB#W%KRB+MnLH zM(%$c={yDdUci`R>(T;Ic|v>|Li^{a6V)$uN;;w4A}hrw0)_OKW!YCzcXQf$E`Mv7 z7P;iTEk{hsCOns!Dm-j7&(S+~Z!BCFLqnEQGFIMi9LN_k4#Bpf#`+p-+7n#Ezv4Nr ztUYoYH*zx5DWHH!5!=N2+xtaJ>KW77;AfFEAs}gyLn2x2Ztm}^+>OSM*sWS#;e}Nh zhuqP+KT#i6qbKIHqQ~UHoMb0s@4_y$kmUGqtf7|es{6(`nAcjyd{=#z-X~~bMOHfQ z0AswJ;SXLjcTu4|xz5oBQc$Io7og~b)oz+MqD!)gsdRJ0Vt^$7)Ab(zM=tM(L_DJKxnkKNiU4aNb6CeERqt@lYsD=vshMHK@l* zg5S3LI31NJ_L#^BJH{FFJp1E#cAsLzPf5B)q*XS^?X^Mt{or)Yr&no9(_RG~t*VE` zZPKBIt+q>n>a3No=@Cf=p-6qSg9FRO2Zz{K&?hd)pUiyOh)18m(RG=#b8BMi{u!O8 zhJIIS0B>p7VhG$d>g;ELZ#H7uH{hF_#z6U@p82`JN{d*ZfF<~O*p}EP-iGS%&@|f?*hTEZRDqxvyX*Y$u`s^UmgSDv3sUGz&9)t4CRI$ln6+>x3m?L@%P-NdsfEr&j zXP6wbr%bATqGpBcv3bB->H=-;`%9sU5wb6cCbU|^Y>^zX04|N03aP*q6y<@YK$!7c z)9)$MlrWwOYtE8>aGKLe%>I64xSi8S`}Ayr1DnIcvs^vPt|b3f#~YoKqUfl(MjMwq z_!lLsO-@JteSL;w(`R0i1xm*+Q{&C7@RMdWO+z}zTedWMzCpi3kNv{j-;H>^>)}bI z*!|Fby5nV^1+7k09 zDXHhaV9H~LPE%Ox=cU}uiSBAN#WNvwy>NBT&CIBiZ71?-$W>Kv(v= zp81-pXLQ1$64qZ9Au5>w=!V#)Ofng7wS<1aW-o>X=^ywr_~Cf@EaikjO2#WLnO8Uc z^p8@eg~KK@*QJlVI%o~CZYzl*H3 z9Pp11@%@(Et*ITx=u=;FQZz`HbNSdWQy2pXbThqWe*02QgaDSyOJGxb(2le`jP!Ct zE`lfNqSq!(R)EAMaKZZFKs7gkIYtrGx-NNLR8XNWk? z+8Z3>H=ctL`OpP+=`u1ZTD}L-FRuuYs;EM36O|*a@Y$JrpI7)zoa`U!Xpv##qtsz5 z;6M1V9I;k=#yfZJvg*DQc((f6M` zOTS_DmeF}BaNQbdr?1aP-CCNypRWO#EfHKEb_hV#|$Or>=~iFw))Z3$7z^^b^W0E zCQBvkmM@c^3{Xl-JyUQbb?6McAazfZDj}XI`l|0)ohb44QMnnkg6_%1a3h;mQ-*|L z^BS^C0+#aHCgfy=cJ0lggwrI6%j}sakj$%VZS!7F5t0X!n46O4dITx!A_z+4PN$;G z*orUYY`z5UxL$eqMUBk6`P05>^N(`V&-7}aA5LD3%2a0X(%%k))Bk#H9gtfZ=1K3T zrk^Sj8H)AXE5CL%^UCm^8hQFvzjhU;uqr|e1gLQ@Gy@8Z-Q$T=(Hzmxx(K4XYmQn@ zdp45?OMnpA*|O{B0HZo>r`T_lGz zp{9XA5x%!j&UvL@2IZC3Z`1JB24JQ!L6O*r9;jd63DG)~F>Gk-Wp^07ZMbpc z0>wiCks-EuH(V&k?0zasGajyp=63neDE%Wj0$AWB#L$H8NVG$2a0#+eck^2~ZT9W^ z*@YJ@#f8tTmGhh|47bcCbUirX1#;Z_?d-S69HL^fEhNZa9TkdJ>Rs1#{Ge|Mt ztGzofESYLVUMtDy_4%-vX<&X+%g3?De)t9bI3vuw`9^APiFh|9(tgjFLn3tw+aYXP zk&GBep+xA8|4tUnKQN=lcS2m8l^PG*7hJWIg)f5L5T>M4*#N*(;fS zX*!@pPq6Y?{2!-5TjH=kbe(=V?W92*xO$rZvC*dWt2Lm|hltvO@a_k(9-c*o#Ty*@ z1fYl*ZIA@JC2g5yR9A=$aNT<+WS1n<$S&me5JWdeS&MY2= zOsU%g7Wlv;5DRLlo9!x0U@T_C@U+89>+IuyaDyY8&Xfa`+pO?O%>B_6p=h$@uq3?< zt@l-ZUK5#3`;&3?nrTeS)Y`VslAxDt(lS6#44IF&mwkUD5Fm1L=o4oBXD7Uya2* zA06iWh&xB41R&pqinct$$tNftY-Vq(YW5{ouxC@TTX8p8F?e6_rKTU{S9|&FcEPve zli#Q1=h#zd4W&!YUp*iCgt0%>7?;7FByk%VZ;o%YV$Yu=j?-))v~2w%%M@vr^Qb~L>rKF96n zF)Td7-G>pVCb^L~rWxN35ln8Zkiqq!aGnZB3-#R6_!N*E8IavpPLi5aR}v`x;fIh7 z{rat=Y^qlKjpHp4DzH{?rM-^7C$A4Gz%@yY=JALHx^<204Thun4oloZ<0eLw8D-r0 zfKn{@`83(AAx1s9VL-b|HKg*|=yb}s{ltH>fk{INNC~fwOT3yt6jd}5VeSShkr506 zIzsi~jUGcOH#RD?h;EiqA&^#_+Q%#t?ALssa^Nzwk@y%%fELhY9D7LiuH8_d;nV!)?GAgIEuaK56Kay#bBmFJ zk$>FxCdpomUops6WSxtT^*5pB3BNZQ>CZlFG4jzIq_5XPDjX);A0eqv^4td+;`Vwk zqC544pvwqfpE8s~kpp7XZc08Xb2GSjscEW(49=%|j){t(C&+qlBpuEvPSU3}-#nF{ zSRMa!goLHW_v5>yk8FMRluF_4Xv$qJOG@8znUfericRPx9|zL725fJNG(>v^q$n!i z)HoTo#n`h@6mIOQj*37ek9icbJicNt$Oz(1l);JNB5|M>qdH_?(z%=l#1OpP&EIO* zK~5w{zTs?_#ElWyxu8}NOLkVE!PU1n)&r$1qIMnP@av>?TJ!PSkiyh_FOxYECbT-T z!I=;W8}UTCXD5UFT^y!O^d#;0?=TSvbXIIwW*V;1Q-po1v3f%)QO-{Wnn=~4j0^jb z0c#!$4aZIrudO^LiUT5KvDd8b)$~Q&*Tq`RuIN+SMMAPT!&?yU0nH0 zdmx_4o~@F^+xh`Bkt^Xu;+Vp)*IH6ScxQo-E1)dVAXv1#RADWKG_Wkk!_FSGtvMsR z)39|`a^!ydWB3251(*f11Eu5B?!2{q7b)*JH=lP3S@E(LdQstZL($UKp@*t@BxxdE zJGlbCCM0s92Kd8)yk^uNj{Z}6Gm=%4pFu7&dPKC#CWZ}2GTK_89!Rz5vvv4`Pve%y z>Y16H3~eKlbe&qK{<;9vV-0)mYx4W0RC!Dmro*!4xbMX2whd`L4EcKw)B~&={9#s# z*!cN5o`!@Dq#M;9>^$U+ckx!vD`&+_v})4ku~Z)c zT>I^t9~`wGzyt&3FZ8d98dkEW+dTOg^DO{(FhrO23OvU;@m`L)DaQ)Le27#i<#J@4mW!a&oxA zzWd95Yf`l7ELD)kYtJjZJ;QMJFA@4vgawfA&xumE(MTdI(}?$c5Sx!l@QOWs(2S3O z99js!JDdGJ4Lw_VlT#-Bn~B7M;pyBV>vF}l))~tkvgxwq@%BRFLmGK+O1K;Ong$JT zsq34Hl?Sy?mUn8G_Z#;iG#Z!B8`8Y%@2=5$2Gr(2cO>X z_4xQF(KFC={=Qto+b4u)2|N~L7M1BzrZk0@Sh2F|7>f%$5~@GVoRK0aXOoPD^jSlt z5IdVef<^}9pkN*rZ0VwMqrD%#0Y1CZjBW_xy?marcc$3W;Jqs3{UAh=*$as>maSk; zE2bYGdqGlL$ye!NTH-nufQf1c2pP~$6<^{f@VoV%A#SUiA&4v~v#qIVX%^H~=#cBS zNu{8X>zW8V%KwFUvf9 z3qFLIg}C9bxm&yncwf=Y*1mQ zSy%W8?uWRaZq($IZyQUP_vQ<1dVo2g!I1ngH)hg{9DW2BiLFDKjoIW4T0TiQ|FxD) zPi6f|N?*)~TD->-(q}h+=DR7amkTfA_L}u#C)ratRgCmMZxzr-hL|f#q-q}>`}UV^ z!puZufSrT0@J7K%YI zO@ABOl2`*8y^Ajizld6rnDP{QxTK!-X5~a{FkKqtN)lvaZ{(B4#1UsL2l)#n0R|DK z9>x;+M4e`KY4(02jg#V-ccNjED`5hTbL*AQh8|*0MMe%rCnMu0#9-PHzsgZ;YZ(sD z*vL!<*^pE1m;LSZDcRtc0X+%0Oq@74|pMJMP;73DmovWf66E3Xam5^;W5 z;`^O`;M`u{(uf?JQ+twqQ1?T3@rQi5P~huwTlx+Nuw9ExJ~QV)Y?BVHSHVImX~t>h z0oN;@9Remjr>jp=Bc$yb+lRc$$7B;htVLj#7a_1KERkE+B1}$2TY`IeQX;8O?FEJI ztC11WZTyv1;aTd{Jiqvt9y+sDx7sih<&#Qz;DZ+JufleV8%j?cAH?^miJ09a|NKy; zW9oJyV$%W=IBq~4P3ox&O_nGlB!s__wKmyQJP>3WN%qBK+qM2FQPm~z87S2aOYYLC z*ORLd#(w5}g%98DmB`M4I_jPd`NWgz`TkH47{pg%2*(=-dW#Mx-s&{c`uR#`lMP3M zXs|wd1ftCzt3weg=9=dKKC26Z+FY|c_1cRsnGoG$ zLft%E2t+A5)@x5hUT=}!YtnfMlYK7}$jR3lgWtS-SbO&l4cs)7^h#_f{Js6Jwk3MY z5tp29UK`Ybssa9DUZx*0*IAu>XOb^m$He87)x=;{*A-J-diOac1)*jbJJ@4mBSy#L zflYYR2ywW3q>8Dl26@MBGPIEU{uF}DNOwMXmtX(j&KmVm{M_Mdc5n0QD{F*#QuHaa<`ge z{BZJo4((#oekxwlazl&F_KG;=627WR)2wAVG^~SpEPV0$fLLW6JsL8~WdGjeJ1K4V zaxMOmn&nXwFQuNWHXY1iAl@sOv-~=0g6*--hyjWNlkdgAkqYZ{ke74x8=_iU{Udec z<}%vCd=cs`=lpO?R^ndrX)Szv6PB?g3vzk?XJDzL34_&KL&^J_*hKlxERMS!%N@J6 zZrs#W&4a3lKqyn(?zDWDjT%KLuq4->Qi^kO`~NLyo&t`t5Y zQEEi^tsK1)ZnBVh-S_%qWRToSgLTxn-hiZBe1~DPptm5U@Y6+{ZZ_wA%MDrP8T7(G zudwVUXxM*2_^;GeR3ooi%xzudh>+fG(rnmJvA+uthkE@q^{;+%yuGFXQ)Ls0Lb?5{ z+v-FN!i{(nr^UbP@OtVtU7&S;;YOQKpO(A9`lB!{W~QtKSZ5UJlQ2eXb6}oKxW)F( zOWh!>Z#XZe3GwHKUhbtw>TIpj{oNSqXZS=eAFF1>p}kBgM2a)uOb|E?@+R{{Hj3=M zm~H8iM)sGGyg6P#=eb^YCx4$bOCy&-q`Z;iPE^}^Q-%k5_ic30)lUQmBq((Os5=3f zW;^u2-q8|(D&~(iWo;B4c|TosXkRHuOuM}&hL|xXs>{?(@(^E(U-{^rd-;Y+ zclzvkYz6xD@{2L2oV7Uj4Y#1~c}L4%)YfS}ZKWq{lJi$##ARVGycFJy;cpM@%Ufp- z`|UTzUt?OSAVY_dCuFU>e0B8-(oY^cmh>eB-yyhT^I3K+unuy%zGJ~Gdpq?}iHpY>+G#jt*V`gglwpfDw)o5 z@~>L+b^hGE+Uid#<)we7bBOYNmMoR6kSgHKLuFm)T`~Z@Od-i*cJ(_{eRAC9X4xF8 z32Qw=Z8+IFJuVgO7fyW=^{iZOSC^_SxHsSBmGzy2X6D3#4*DKr1-a$3>|HLZI~fOG zGG<%c5}W7p7)W5L9^}cC!!KJl_I%>Qw@rhK>1>(Vs_LcrFd{}*C*gfI% zW+-V_w(N%)zXBA908?(mw+)l2xTR9P^w6_lvEV&H@yW51%zjW32rdO=&z!l4xY@3S zDqoCH)YIPo5C7T7Z9EWKPKgbF@EV4vnB$q2LrDcq%!!e05>*raE$|J(0CHNf;#UoBCJ5h*P=dbyk&`4H|Wc5>%J?V@$s&;T8ZcaMEITj(-2`%OIH+Pu;En zDmZ&!3$r?Iuu}c?={e-FL<~wXULcrUF}`=x4Jor;*J?Zv1xBvex9^73>&amo^++ytd4hc{l1I;bdwlrY#(Q_SmJHS|wh{ z;8pg9r0J`NU}J}}EQ@VgEK+FYPp-DZ3N~?n+fMWmXQbKWUX(G8?a|!!cR@{ek9O-j zy`z~Qkgbp!p)HDZuV!b;btE_eCrntI)S91uAwGg=y+ji&W-+8R$1^};g~Ji?%MIDT z3*>JM2VvnSIOr?w`Bwkt#UVcN^2XH?i<;V9uWFbTx*nEU4Kk~EuDb#;Nd4)ESxoFz^Imr=oCT^pONs1JB@_-U$ou>!S`)3)Nwx5y-^qqy}VIzD&QMqZGu zc2}x#vSx?PxiRKYDiGb2=M9JdPWer*hJKFbQ(y|_36{taT8UrZ{yb3|ud{1XV-~DC zyiVOXKg$_!n9jd(t~~J|cEv&4--KsCXbtinJ3KsY0M#euqt4mBhNU;k-W9aj6Q846 zk;(Z|$g^9JnqP~t8H+rj`+z83r)8CH+Uo+;6_bsFMmxz(!+HC!A0H3uNEZg!&+Z}g z&$*u9Ygykuu%8R?;o={1z#uQYE$6Gbj|ir!;nY6(Rl`Hp)BIZlnyczbbWa+%6qT%O z%cCICG+*bHX-dOeEX=o1bXOTVh5W*=4ZG!*P*(YxU$0qM5 zJ_UBwiuM26&44Crk(wLm`k*O>H8pmrg8J>tHDr2NR}!jYCo^BGY9L-2YPD%M|0T-l zzQvqW&-0)jyFHw(vuokMrR}nJ)%VmmqUAS=#l*#oR@2!=^$4TUa9nm+~~<8w*JZpW!DZ5fj%uUN-ELzjJY*D-bR z3-n*G?b-oc_dOUP(Lz?_R3|^XjX0^{uw=jb?D*z zvGHI5_M<;a(evLXv_l#gRX14~PD=#$sAPYUT4`9?`UdL?8apHaK$=E=TGK+*kDPmH zSg1>um*^?Ozu!LSV$Mtw;AVKVQgmvfA@I<@{R1>Fp%irNCO}LIrSSL(^0D*vx%cl>xNhiKWYxbHI3Dm-b}G^V=OYKqvJMk`%4PCgn>IC0#gA73|*V+lX# zcr6rOsSkP2JQCmPz7s*SH78SK2zh6&*ydewY2I}j6$#`pS2EmSvnTYcI-{^=k-ZJZ ztrw%7bA5U;UzKf(`I?oZiTeh9q9S^ql-mnqg2kp=`GdxK2u2tZ0}2GKJ_*m&@l3I5 z72T+^+-xP+5@c>FO%>nwGKh`DzB?_Vvq{_^@m7+!KOtJ{w3uV2t|Dx(!BZ}{LDOnD zU)-hoiovB|b}?YGrBKrk|EheGFnR0yp(9xrlx_d?62sS%LVMTIS=SCTA!4n5d_cR% zab8+oC>S<5sh!y zE<9`sIa#LdGd+)K3c22*&8SGLmaeHT58RQp^ST_@7Wbl742fbeueDjtx(qGzZ*ut{ zYz4!gc=Jm*@MQ6@(CcG$$?>E>A7pSHKWePb&Vz4PbH-50Z5Wf|H6Z>bMzZwyRh^AT zXq&VeGShR25$Y58Ogm>taKE6Ba?k(MaPgDV;w#4-3g5kpK{hYe{@V4eN$RrF`JOLs zip?SxT(gpqEt?X3)UJ*(Bkhl0wPPdv%IYbD?SS=xZ&PzV^v3bB?wY#3=K)Y|eNr{4 zK6!-wlY0SZ*na?G;CdoDSLTR!vum^Ll3a!gNl|+tNxrsEe>Nqh+_~8hl}YKd@~x96p=uRd}eGZfP(-*=1K#vdDY>Z_;FgY1O{l z?sIM$OvvN+WNiK%1T0imxk^5<8_D$j*|%i}9o(QTdeRLS<8+ImvT{`~q2pmghTd=xbI(b7~BuRjbZ zKoE=E>KFR4(Zd{=!-y1+3KH+|S1(sJZRlB9%}dx7 zy9wL>6`xBzsE2gA!tO$taP>!**CUKqx>B$Er!wOo zFb#wRjz?kt|2zk8+HU5e44}o!ue%VSqN4s2xYKUQz8O#iZ(jmZMhcE-@ESlEm?j1C zc51q*9a6}dUxUSROF-}M2$ugxbnqs3MgiDXhYyzENM?ZN@Rc5D&f@YdQkHk?Nq_|M zTotok>B-v*GLZHGJrCC>f{Stgrv|(F>!^7TcP{xKMg9&s6okW2Pz25>1D|Fa_^ow8 zbbay!4C4`ih9Z^)BM*vX0v>C#cVgIsfYKUxmEe43%i==I`&rJ;|L13rmCqhs8WbZs z_i=JcK-BLnkkG~;0bfySUBn#p?B#)UP@?DE+-#U1$ z(>jdogT3XlEB61=P{7`IhRzZml<{1$e`7@s!Yu8!;|0k%(q1Vzr!(>5icDMDZK8p!Q^_6Zh{hm((}}PA8%Kbxd>OB^jcCQc8pLnEp1*3nF}b#5aJb&i z@UXl&sR`V_Zr%+0esx2|0>{l+r=1nw>y50?`t?g}`k!Xk#kO2OVt7|k&MxTNiCYi7 z$H0#he*j~EoBRh{jyzt$x222d6p|jI_x~b!aLhynBMS3_$zi{V_OhE6?9JNEmP~&x z4_^Q0rBm$Y_mUQ#hf_CG?f>`%om*T>hT|2BGvpp%6;?zBSsa8=2Gi+NEnM1y$TlO(8$DOa5 zd48W{Hc0*0zdDuLxly{>QQ|Zt_jvN@>y6)W+spA+LEH{^1Xw=Q21A1X{Rv8fk%pnO zU8PIAR*KHG9Ls-PgK9eVUN+<^DewY6kOt{G90IqA4)8Etx$4#tU}(a63ijdYlZds? z<OnLA19KQL^6~nx__Et|QXiOwBR79O|H6M5YT$;FXO(3D6h%|7Sb^Z~M@(p6 zC40Jbpka03|2(`RXI1qYsgqEJTI8JelXN#h$`o_E`L9YC=XZo&sxJf$)J9v}Z1;_b=(_UT2N#m7ef0g_?I6)+*@jXS+*}^TfNT zx}O<<^eydXh9a=W?g9MbOVBJqLe!W{-X8p$xk+fa+oa z=*^Dwz}*C)=@uP_>Ly4V%7#rk<28VqiF_2bm8!_dCp!mxFnx&CeU^}A$xK0D;FJ8(yQYfIO?W-zsSf4S?+!m*Lx>Hh zhKstVe;>Fo@2-$EyzzRY_C!>qKwzKkjv-yxG{CWDLTYxVtO3oLBY}z^;;d-iYS*Qo z#T5t=vd&4I#~@cKi7>HBi_jH9ZWc!Az%E|E0bex>T;G?5^Ba-vdlGGHZ~N}(zIRP~ zUr&YnB@_a_th-yG_MlAWEa-+EY-;IWVHh3q&wkjgG{+bZwo(6_r1lQndlxftT^r;E z)fIUUuFnAcWR`#d&2+yJ%@Q~A2OJ>L*YHJu`U}w6>p3RX5-<(W#mAG{+0rhbc;;Q9 zZM#vD6;0*(!(K|SVDFutOcG*~b_RLKld(vqi5n+jycM7y5-^LU_vvSF02++sw;`tGsbRcGU|AON zDp9Pu2Bls<>~zE#j8ZzC$9?DjQwyLw`MYHioFB5`qzDCZt^@&7G+2O?v}y4eYC@c2 z@Jxk&oV)^XRvhy|;{Vmd4RI*~Uas4FA*tv!K1NdEbG$I~h{-7~9T>mPR%9&CbI4;b9 zS5dpruMyL{+}|q>+Vn2%=E>1nQTi_$kA^V`ne+BmBciKtMu<3WFw-c}@Z$>Mz~;{V zwtx%wH3VojY3srwu)+of{1c$K!H9akcM)*<0uq!kRD;*r3L!^Y<(BC^K(E6hnm>h} zn%=v)=ftYzF4m>$OJygYIucUL=%V>TGo7)l>|7PE+@6t(Lyv>`d_U}|JGTHgPI>2`I6Lsc9?dVsBzig)w6V$vwLHMN7rUQo&h>hm zcak)~dLX+n|!DoQT#hOnlDL zr=1>XTn=KNAa}JTg5p<{s~-UDDx4dA_v-m_Lan>;uMYw=V#=sW&5C{2RS&?d<=Ap} z7g{f#u7%`tvGEQhgRya*skD|Q%1+&a(yj!{Ti zk2qU-TMwKj#kTm7l~*JC5~&y`{igM!8}MW(uUNHjwRP#Zu|cB zz3oMt7#XonZIBe`;@-0BSU;YlW$YCcv<+-Z0#7KefW+a&pzlMVG%W9a*|$SFXHgquokN|no&AAd(^M4y z_t)nS18L%{fs2R`wQ;L+615Eu5ZCF~5os*h9Px=4HREOAh~BGoh)1-YZ0ALh1@TbS zE=m+QtO)+bfyc5oC7^u|^|nJu15fuCGfSD6b_Aw{(vLMs3T^B@5sDy>fpwd7KeAnj z()et(v=YqTqoBITM4!74JOuVpQv=ErYH8y&rhc&FtX~n<1|NfeDdMz@-NiK54~OMk zk-Y^PEuEI?;&zkt$m81=-+>F*WI0*s{ZbNoE=UIlG99*?AQ8nJdjm*Efs?qIKJsbY zVW47C1VF5^s5a&V5M5hb1!5t5+o_}hWv;nD%Itx2)O}Qg1xgJ1%khG!nVu2H@V;(F zNkZP?&U)z|j&E@Y@@L0*Rf$&B0d};`wAy@dEBi*`J;3#i11#(@HEg@Z@{R$(Gi1*p zDxna}1XTlveLf;nwB52{-s^Hf%-1$%R+cv(fP+TMcoaQ-uH<^I0m8y`UwCJOz_f^4#;n${*=(s5`NM{~7oo-#&C<3+j8z*!dz}e!`kd z_XV&O~oW_)`N)dZ)MI(2z=Dpp8cYR_5Y2crq3DFueGw7B4h#&k_uIzQ}bj#m)`9oXKbF zfVT=aMcX>jrcRSKewtw2fkICN{$N#at<@S_eYmybn*Fxs1lKyGp318w^}O9Va1vb| z{2LSo_I`}MyYgNzdsGI&4_FhBc^iPG8>^k!(%)l3DYrvJEf;Exd4X3m*#*$V?h2Mv zCp{f!fk$r8tr$%Iu)oP(r12vG5Vn)kinq$iKN3B~MzrJFy}%Edwv6aZS*9SalXsAd z)0YadU28yGMm|9k1`$F=N!Z3v3%Ffws~#fbsunEKBq?euQl z5CW7*LI)DgQ?#QXE`db@{TF8?OA|Kw|0sed6EFF$*m3jbJg`gO`l1_NAyDBFQ7bz{ z&)7Ni{d%VH(Z}ybR`dLKbwKbdz;oM$bkySU#zv|}Qg^fVvb@f}GFx z_#u2NZetR&4SI7SV0^_(0KOH3x%Z7i&@!4l0beoz2MnB+E{z0`%=1J0n!^Vr)l1N` z2XKVq(dv=vU8^o>pvk;JfI1VB5I0u7zt}@XZM~@wfrmagA{M6O4>uZ+>VjX`i zqTxKqA0w7qY5Z4eH=`BQQCCM#u6V8h!%;A@6n9N-mUvaQpWMJxtX&^7u)?(C?8s>D z^k(~FT2OJC7dH;qUB`c`XOzXDZykyT4DRnz(LmvIhm11Q+)5Um?@kiP87r_Ib@?$W zjA@&GL=l^^cw9w)pA2^-VnkYc_`r@jTGDNF6hQx7*yj1yFKE-AfyHoFVs>6)9$V`? zfR%~L?_SJL{42qw1YjO~^|?)A!|Uvr^cjHY3r(=15g1FZ_%UIeYHDPOnM7J!YXd~+^4&V9V{d)_-(iTZ=MVo@KP7^TWCy_d zg^>oe8q#aP*AMg~0+hJ0$YqkpAF)vFsFTLm01?hP?b{;eAtriOId{S7T?dsmrkB=9-ZDmze-I_6rBju#>j z{vOz6zIPR}?e6@$#VDF&^a0@%4It|HIgET5#}LP;{8Br0-t}k#sN`>1lz_3o^$$;g zWHxDFzu>1}N;pTh7AQ+V=~Zrs$2X67bx^80b5NIt3fZ$*5y9LLfecdC6pPw7lv==_ zG(y!#$ERCPdet*s`mw32g8B=F#_NZQdMz(PTK!M!Z-&36iQ07~S&@RB2Yi7hHKxsoGyvlb*l|7@&+330i0}M>@Kx-`hq^$+0JEW=WQAHP z@j1okuiJafx%IHYo`Xz@6d|GaXWl^{h@U95A2nwJ2Xfq_e7?`Ys}M~@pB*&A#69S- zwhUIF@^_48M&G|!$1%QU)I%$mfYZmbE_=mpM?Z+@!2)2>340%z#(5$OfWe4}j8P`Y zMafSJe%zg|Lxv=9QO_~e$@5t+;>u%im&XYh7^U;Cz-dY_;WyjJN?EOxb#Uh+ap%5V z+d-g~;o&N&!Zd)d3Mpc`{Ct)QM96Vuz`7vZ>(0!u?@7{rxGgPON(AnjF(NHD%GF-!G-PrLa;x4@li zicx2I&W}pkVu2bu>(OEM*mfojDBl-o!-nudEr7#4e?(=n9*}r)C52k5wz+gdv#GnJ_hUM4JVtaekFW|1JK#eceeh_TK&Y@|e6m1K% z52>tR4pK}CD?g(He(GR@e*(e#r5fPBB4@ak8i-8UE^(K5+|m5jmf1_WQ{b{y9?ShH z^UO5p;%0Z=5@j}J{_S9~uIG3M9o^boKdW&6d6wgSg}1kgDjV4Rsd5u8rpe`SkBwFHnSF2(+0K=X6ee9NLyjPzV!hGE z-@Dame`jFs;!34tUOYO$)L}?w{d8aDQ?5S?TyZ%hwv6?i>QOa+{&Zibhw5o3wqqvc z>WLG<2bR6>d6?KR6{&bONMeF=U+>f~j@4iEbDCw6?NIj%&v=n>SMPw_$waaRlP{uKN}3UB+g%evrjzJx>bV! z@*<(d%Mxf~v^`!ep_QuMGf1e-fUso?Dz`Il5C#r{P??v?NXkEnKAf9f}} zc~F{^%B`9hYrNVH7gfDDaPUe%Z?k~U=7ARLX1{-|s(2e6+b)&AbA*b$KAaEk_;%f? zsJ>6D;Lx(iuk~T;RU+a_Bqa#XYT6midA`m548xFGY{uJR*Jn+ripfknW9y~Jk&;&h z9n80e>bv4qf4wWNtpVr%4%#pSG5>!ZU3oZE?Hd+Ksq7(3im_!GKH0aD?Mxz*T?~eN zsO*L?iWd7aw#ZT$i7=LA%czWHJ~0^#VyLmNV_yfq({HYsxvu%^J?A|4^E~%`zjMw5 zzx2%N`k>n980JD-*mu_fb&iF_5>E-MTM0gQJYNMA z?==MTr$I_9*9k3uA2c~w@TxFOAmHS8Ioua`JHNbqcF-L@c+LC7iH%zi5OCe%i~x=i&9-D9zsnMtJCHFVx=GEc)ac9sx9|Q+mLunO4;E%D;S5nZ&svrS`jH z{cDA|p5H=A8?&Sdp>SCMPUX^nBS#Mg=gU+WbTRbC#>Rpyyo>2##IU7>SA>&P>8goPFn(X59E5+I=he|sEzn10Z(N*AzQ?ks7 zk3+QHT7@5eb6M31o3MeEPArGC_IcMiC&#My?h~&S21p|lF|Chuim8^jvlAr06u~ju z9l6A(o163fgXkCneek30$0ym?`$$n2r^|x90#Z7?wQPymChs*(G7*qcq;o`I4XvyO8jmYyb9z( zP)sV!xrh8jMD%20oVuwZkc(Q1@+$v*nAusiek6Y7rrV31Jh}?NxzOuR;9Hsw4wnaQug21hoBGZ3p4>eQmNc>Vb}|d^I3yag_T56JjDBLpm!gXM(*&rrJqg zypeg<<8;VKqqLX4#!IfR|J?|}tK7IO{X!DRm2T9?d*+K@c!uJCPWwU%MNLOb0gvyL zt1l(l`!u}h4M!In&vTxNi4x;@Nt#A9WKJ#b9M~Ql9<`E%bZR^M?}3O>+LNQ+#aqOX z;)q~wik?s^OARb>z7#k+Za_v?x4K0*;p^p7e!9PV0s%I}1+G?9R@yvIVFW6=(S%r< z(6<>dE%`kMzHLIeYT{$XZgK;5KxF9e5^1wNtv`j1>y0cU^u!g72*1oOSp>#Cf#DMf z?pdGIJ3bO*l)QrTA=Korw)pVaWHv2ysc9BA#)ax~sDWmLT8EmXCb$eyC|L(kfc#_a z5v}FZr%zTbAKii!_>58@Nco72pyBmM+8a~M6z-%Hyy%{MJWXY?)o(O(wno17AHj3G z;Lz5nYdsZfQ#fHOFJCEeuJ1ohksH*Tje#VXJFt`RhSJetd||-N$u)_XZ;gTUFw-S? zl>TBBqXa>ZERvVQ_tvMqf7JS`0xy#c(jz3Hc?EI$jGul`z%t@G3}xBWCmQn zcvC~+yU9^#u4CAeim**{AeNf8+w+_!!lt|`9s61a;%IMQ%Is2}#QIe**pp^Ujsf$8 z&Ci^P*KgL`2%QC)|FAml%6<|+bm+`#2+>PHiUBU1z6rU_;={Sa2$;EVu@t0G8U}|g z#(ewTmqC7LEr!Z80>evspHZMkF6ke0W9fb$9I;f3C9Z&pf(fdPO>C2y7`c_YDY@sf zdW-Dpf^~AfyWT<@Kb8Zu*uS9GsbIY=#5IAWME3+;il>!d2bRkp|4}vqa*3$b7Nj6` z&eS^#Y#$!>dcm`}iA;t?~e_b8~W$1W-mm$m#t6+L)6xF4=cd$0JAtyrP>aK~Ydga~W~#j)=<^g7UJ|ov1T-o`D9J#|=a?6S+ z;w(p4rxxI?Wo*IC)xESBXm9^yP7mgc}=g}+8d_O9)X z0mtZ}gwz*pe~L56h2YXG-2Uh?i_%7;pY9QN<-lB-8hO(9kmhLwPp{_3guWGKW^LDmP#l+q6sVOL% zey0w2&SSv>Md2Fr`>ONe^B<}NCh_fG#3VF~e~uqSNdj!&G_1$P5<`1;x_AX7M!v^- zuI#9;$<2S@3dA-j3%r{mvQ*xLOKc^)+YPnPDwIrV9`*gT!Kx#|0Zz6)NHHR`m+HKm z5sI70WAtPuVOFx}2Pa=c%2v*tG#da-_1B&+B*l5l}}ir#<^taD9O^efavGm?&$Y&(NnksHlX&a zhB@BN>XpF|W!FjqBx{Cm@0jn;lyVc=8sIJj?a-@M#^mFx2$pcCW`Qo?k`a!7M6S_H_A zTk9)Z5}s>P(U9`8v5RW()nV&6odvoyka=@HMU0&$YUQ5wkFJY_%*L1&+sb>T+jVA{ zRUa(LmfefIyk~ZEg5$(}fTS%q*gOl^+kUm6C-I7UAkxCB!7JczcuzN@v)@3_;^?t$ z;Wc|aJ)17Vdix0GEl#5*19@bBM#LtkE6`chRm@dY;p6>Zhl))oU~BV)xE z*uwP`;@7H4r~HbE9rO;hHM!C_jc4%ZX0}c%sa-`jl3tY4m};qNJ^#;|;oA?aKZpa~ zioL54D++~D23;X1S}rAUld_?R%5gENNXZ_a{yM>%VnthV?~H{%VLODd8J8x;$B(+u z(%0zfdyey4k6XpKNn<;cUank%7h8F|t4U<{2=k7QF_NWTru$^&Z{ts6WZ2*%R;7Lc5fc7AWS`lGQ>gyGW13cG}a9$)h#9wq-tx!Y>vdp<9} zVBcQ}`+oXr)7<)DZsl{#%=zcCtUok{{CeMxCYZAW@W4BaHdV=>KFfwK&4Os7_ctGa zq7T6zbSsw)5~1liJMX|(G6krCmHFg)&6FqSx>y~@ZuYrHV-0HrALor+brV9kgxmC! z;}(8G=q&U?D*hg}nOn#GCYVvdoAKE9u45`^_$Xh^OD02gfWQRR_%|0%M6uhI~b|2Ihx%F#|spgYYAV1^qh4|TDrU8&b*CljJ1SIJQOfmlL;G%aVCcU zoPt{WYlFnCf%+)Q){r5zlPtDL`pEz(G1bxhsADdW_UbNh`@8egl`|BBc*F-|H9sjY zXa9mLe#S%4SrH5qE5p87XVDa{TRqdSYck|}X@}I9A07#OSgoZq0UOb^s^J3>MrURh zD=HL7Bk;graT-)BzZa2~tveSL@q5Y_CL7#L?dD!7sFhm%UE4`(y`yJWqjgnJ|g*JHg^AV zR{IAlN+_mP`6`q6=S=N6GpuQ@Ngl2-J+~lsT0YuQDLe2CL7PM?&j@2zmP_DM^;%{R=lKv}BJQMVX=$ zU#{tRx7?sFzC8|(JiJvu8fgK3_HP`eP9E&)h6|lLbu7#c{p?UtZ$uCVkE@4?XaaVpsmp|;l2rZV@ z$WII|hZIKq)Sr8r-nzETx;o@oL2H0bj&ehOdxu z$O{CU4AFB`Jj-;MeJ(liRYqd?&jZeQyKcLobqI^eB0zR?(YYE9=aJ%*npu2h*9qj_ z$?GEVZ<*$zAd&W@SQU7Az}CXx)n1v>G*iZrP5tPhNGFBuu#H1}9*fC3}F2O7$2B#=L7BSz;xhd;(0rM$V zV2+ClF~(g&8^rz?Dv2VAUIs=86>4rF)M z(}5nBh@2)TVP)DJ*uTt^qHAoa3?tE$fP_TW6GQ|>oualKaB2+Vg|E`9HRmnS0=rJ8 zJkdvOQNsx@EG!(d4|9-Nx?u~pT{?l9Q|94cH(>f{KkB`FH!9g!SM1mQ8Kv~r%)Zle zo?uL1hF@~*{9cFgtLw+sSqu>fn- zsh6yp^id~Z2ilI~|7=QLs+I~|xxaoc-@km2P`dsKy|U4h{%@i^-~cgG=t3^qw+h;l za-~ZBL&RzH|7s%s;&i6!c$MOM{M3IVISFb+z}1f~XG_p*C1`KG7`nO1BD=ADb0X?} zWU9uq=$Mid1|Tr%Po7ZUW`#tauK~)=Qm*0us@=Ne%XtzvCA~sSR|CfH>-PGnv}Tp4 zOc5RV7EQ_Th(leL!x&-M=lXhG#I2s%3*1rmSu!pdK0&MQ+QSTiiJq{5BA50eAAFxaQu#A7mQ{ zVA##oQ?W(CI4m^$4&^?3P~u&{!3q+oiKxY=?G`U)2Y$vH?|EDDMUBq~9X)o4n|O79 zUHy^N6X?#tp}wv^jc``lq96ig$e6oke0$MPd0W%?DVKIsF)?6$2-MZVCS1u(B6C$$ zi?(oTs@3IPW2IyRJD#uQsE}hAxvvYgUo-12DkaNP)I8GIpM5AzXSVMFG@8G-S0>erqj0`7tZY*jP^6S-{*ol-pPLyBq3t)??Pt?alCZ7c$%j; z?T^=SOH<-GbIE215W+7ft!x+x}4A~;FJCiG2`p9m`ZlYmGM>?tzm4vN= zcxjoUe@1+DR+(ri(2fK)F??@FhvI@T3r`62|Nev34Y?;3O%4GnaAZ~52uwEe1ITt< z?X#dI8Slr}^|z*c$CfTHqqOo9^37)j#6X9#(6`Qko)ind(@oZP7G2DaVBwQbw9wGc z`K{p57@kJ3($+TPVls{P7QP3$&m+w+wsZF0vPVSUSK;SnU;=i zyHPK^^RX5`qkBJ*z0BTc{t1#*AGBFP%<9FTwcpXOP2U9Rw<@z!rT|FEkg~;`D@#ie zhabd#ccr%ugQDYCHL`QO@zbYGUTO2Z-H{Bkg$ZHAUMFFt&+MP9pJ|1Hh=5k>5OTTbCK8Eki?#zEGlfe=+6V5r70!=1z^PMS|CnjUzP|16 z50*!J{VeP}Z8fw}CSLk+%lIUC)#Lv7HK-=A0LR94p^YdRg2?PR|f zXFlghMorGVz^RLH9D6DWGHzS)9Y-t-l$yX{t(JW4DL>X5bLD+IkOPDNW;O?@b5#Br z_5@Uo$=NYiUs^E-CQqaf@P%#40B6}sS*3_XyWzhcSd|7|CuE!&#%Xoqlo^Paz z@;EEY$}_J79H!`4@w7aQ&nmn!YeBAfv-q8iUKJ=fb27-?ZGZe`M3E}DkM0*8ODH9)&#jsm z7t!z&nATIX5Y>~!Gd#SkOT!zMnaCgpaU$^;2?lb|8Mo6H zyE{iFleLpYwYR&$;}qpydl9Rl;!C=xKE4Bbp`_Dn_MlO3Wh-(AI1)$QH-)GFoWE70 zj;c^T%BlPL>^US-c-D<#ious>muEJ1XMexJbE&*I=-}6~RH>{TudR(uS)i)VmFG|? zbn&mtuAeV*|E*>g#)M9`m~ZLRdCBp)i-z7M{d*wULOiG+oes6HPzgRvdEn{2c@QFD4-!!f;;>^_+f z`r?vP)Cd#q1e5yiN1916ciMlKDFqELx&H~WRE++ zUnO1ToG;rt;V=Pl+IM2Q^h6Mi5LaK4F)qYCA;#_N_T{L&5XB7wc)P>%8H-{eC+8>3 zf>erzN0N%4bSW{Qz9XO7>U?me)XR<~=Ukg!TJl7M)G4Afc(u}))RG~kady0&bRAF9 zE4pU(CoaKJMilp2kR=~<^Kr{8*a+1nXaSad*&ucdKCeQp)=?rT786zkLipUN#Fvj! zc<{F>YT$y{n2~vrf&avSW-LkF7(lSQo9^>y2ase+iF3Qt z3Befg1<;vq^vsy)HaC3W-~YfcLasQdSSCK(bjg@-3skGn&4WW*3AfjVey}*)^JA`K YedLMzCcNU#qD(cmd: string, args?: unknown) => Promise; - } -} - -/** - * Gets the application version. - * @example - * ```typescript - * import { getVersion } from '@tauri-apps/plugin-app'; - * const appVersion = await getVersion(); - * ``` - * - * @since 2.0.0 - */ -async function getVersion(): Promise { - return window.__TAURI_INVOKE__("plugin:app|version"); -} - -/** - * Gets the application name. - * @example - * ```typescript - * import { getName } from '@tauri-apps/plugin-app'; - * const appName = await getName(); - * ``` - * - * @since 2.0.0 - */ -async function getName(): Promise { - return window.__TAURI_INVOKE__("plugin:app|name"); -} - -/** - * Gets the Tauri version. - * - * @example - * ```typescript - * import { getTauriVersion } from '@tauri-apps/plugin-app'; - * const tauriVersion = await getTauriVersion(); - * ``` - * - * @since 2.0.0 - */ -async function getTauriVersion(): Promise { - return window.__TAURI_INVOKE__("plugin:app|tauri_version"); -} - -/** - * Shows the application on macOS. This function does not automatically focus any specific app window. - * - * @example - * ```typescript - * import { show } from '@tauri-apps/plugin-app'; - * await show(); - * ``` - * - * @since 2.0.0 - */ -async function show(): Promise { - return window.__TAURI_INVOKE__("plugin:app|show"); -} - -/** - * Hides the application on macOS. - * - * @example - * ```typescript - * import { hide } from '@tauri-apps/plugin-app'; - * await hide(); - * ``` - * - * @since 2.0.0 - */ -async function hide(): Promise { - return window.__TAURI_INVOKE__("plugin:app|hide"); -} - -export { getName, getVersion, getTauriVersion, show, hide }; diff --git a/plugins/app/package.json b/plugins/app/package.json deleted file mode 100644 index 77d5bf439a..0000000000 --- a/plugins/app/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@tauri-apps/plugin-app", - "version": "2.0.0-alpha.1", - "license": "MIT or APACHE-2.0", - "authors": [ - "Tauri Programme within The Commons Conservancy" - ], - "type": "module", - "browser": "dist-js/index.min.js", - "module": "dist-js/index.mjs", - "types": "dist-js/index.d.ts", - "exports": { - "import": "./dist-js/index.mjs", - "types": "./dist-js/index.d.ts", - "browser": "./dist-js/index.min.js" - }, - "scripts": { - "build": "rollup -c" - }, - "files": [ - "dist-js", - "!dist-js/**/*.map", - "README.md", - "LICENSE" - ], - "devDependencies": { - "tslib": "^2.5.0" - }, - "dependencies": { - "@tauri-apps/api": "2.0.0-alpha.8" - } -} diff --git a/plugins/app/rollup.config.mjs b/plugins/app/rollup.config.mjs deleted file mode 100644 index 99a3dd3190..0000000000 --- a/plugins/app/rollup.config.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import { readFileSync } from "fs"; - -import { createConfig } from "../../shared/rollup.config.mjs"; - -export default createConfig({ - input: "guest-js/index.ts", - pkg: JSON.parse( - readFileSync(new URL("./package.json", import.meta.url), "utf8"), - ), - external: [/^@tauri-apps\/api/], -}); diff --git a/plugins/app/src/api-iife.js b/plugins/app/src/api-iife.js deleted file mode 100644 index a9e45a486d..0000000000 --- a/plugins/app/src/api-iife.js +++ /dev/null @@ -1 +0,0 @@ -if("__TAURI__"in window){var __TAURI_APP__=function(_){"use strict";return _.getName=async function(){return window.__TAURI_INVOKE__("plugin:app|name")},_.getTauriVersion=async function(){return window.__TAURI_INVOKE__("plugin:app|tauri_version")},_.getVersion=async function(){return window.__TAURI_INVOKE__("plugin:app|version")},_.hide=async function(){return window.__TAURI_INVOKE__("plugin:app|hide")},_.show=async function(){return window.__TAURI_INVOKE__("plugin:app|show")},_}({});Object.defineProperty(window.__TAURI__,"app",{value:__TAURI_APP__})} diff --git a/plugins/app/src/commands.rs b/plugins/app/src/commands.rs deleted file mode 100644 index ebe06f766b..0000000000 --- a/plugins/app/src/commands.rs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -use tauri::{AppHandle, Runtime}; - -#[tauri::command] -pub fn version(app: AppHandle) -> String { - app.package_info().version.to_string() -} - -#[tauri::command] -pub fn name(app: AppHandle) -> String { - app.package_info().name.clone() -} - -#[tauri::command] -pub fn tauri_version() -> &'static str { - tauri::VERSION -} - -#[tauri::command] -#[allow(unused_variables)] -pub fn show(app: AppHandle) -> tauri::Result<()> { - #[cfg(target_os = "macos")] - app.show()?; - Ok(()) -} - -#[tauri::command] -#[allow(unused_variables)] -pub fn hide(app: AppHandle) -> tauri::Result<()> { - #[cfg(target_os = "macos")] - app.hide()?; - Ok(()) -} diff --git a/plugins/app/src/lib.rs b/plugins/app/src/lib.rs deleted file mode 100644 index fbfd27d591..0000000000 --- a/plugins/app/src/lib.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -//! [![](https://github.com/tauri-apps/plugins-workspace/raw/v2/plugins/app/banner.png)](https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins/app) -//! -//! This plugin provides APIs to read application metadata and macOS app visibility functions. - -#![doc( - html_logo_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png", - html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png" -)] - -use tauri::{ - plugin::{Builder, TauriPlugin}, - Runtime, -}; - -mod commands; - -pub fn init() -> TauriPlugin { - Builder::new("app") - .js_init_script(include_str!("api-iife.js").to_string()) - .invoke_handler(tauri::generate_handler![ - commands::version, - commands::name, - commands::tauri_version, - commands::show, - commands::hide - ]) - .build() -} diff --git a/plugins/app/tsconfig.json b/plugins/app/tsconfig.json deleted file mode 100644 index 5098169aa9..0000000000 --- a/plugins/app/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["guest-js/*.ts"] -} diff --git a/plugins/mirrors.txt b/plugins/mirrors.txt index dfa1a2b31b..73f0816e47 100644 --- a/plugins/mirrors.txt +++ b/plugins/mirrors.txt @@ -1,4 +1,3 @@ -app authenticator autostart cli @@ -19,5 +18,4 @@ stronghold updater upload websocket -window window-state diff --git a/plugins/window/CHANGELOG.md b/plugins/window/CHANGELOG.md deleted file mode 100644 index 352c6c20d8..0000000000 --- a/plugins/window/CHANGELOG.md +++ /dev/null @@ -1,27 +0,0 @@ -# Changelog - -## \[2.0.0-alpha.2] - -- [`4e2cef9`](https://github.com/tauri-apps/plugins-workspace/commit/4e2cef9b702bbbb9cf4ee17de50791cb21f1b2a4)([#593](https://github.com/tauri-apps/plugins-workspace/pull/593)) Update to alpha.12. -- [`70e535a`](https://github.com/tauri-apps/plugins-workspace/commit/70e535abd5410873862fb035b6b66f0fea1edde2)([#590](https://github.com/tauri-apps/plugins-workspace/pull/590)) On macOS, fixed tapping on custom title bar doesn't maximize the window. - -## \[2.0.0-alpha.1] - -- [`d74fc0a`](https://github.com/tauri-apps/plugins-workspace/commit/d74fc0a097996e90a37be8f57d50b7d1f6ca616f)([#555](https://github.com/tauri-apps/plugins-workspace/pull/555)) Update to alpha.11. -- [`2fc420b`](https://github.com/tauri-apps/plugins-workspace/commit/2fc420ba375de924f236f5b32d26667f742fcd6b)([#418](https://github.com/tauri-apps/plugins-workspace/pull/418)) Add `incognito` window configuration option -- [`84133b5`](https://github.com/tauri-apps/plugins-workspace/commit/84133b57b8c443007c728dd8dbe32b08804009f9)([#426](https://github.com/tauri-apps/plugins-workspace/pull/426)) The window plugin is recieving a few changes to improve consistency and add new features: - - - Removed `appWindow` variable from JS module, use `getCurrent` or `Window.getCurrent`. - - Removed `WindowManager`, `WebviewWindow` and `WebviewHandle` types and merged them into one `Window` type that matches the name of the rust window type. - - Added `Window.getCurrent` and `Window.getAll` which is a convenient method for `getCurrent` and `getAll` functions. -- [`c8c3191`](https://github.com/tauri-apps/plugins-workspace/commit/c8c3191565aef518037f9f4519886ca98329fe47)([#392](https://github.com/tauri-apps/plugins-workspace/pull/392)) Added the `setEffects` and `clearEffects` API. - -### feat - -- [`a79d6d9`](https://github.com/tauri-apps/plugins-workspace/commit/a79d6d94bdbf6d1919adff8e65f79240c31d4a14)([#406](https://github.com/tauri-apps/plugins-workspace/pull/406)) Added the `maximizable`, `minimizable` and `closable` fields on `WindowOptions`. -- [`a79d6d9`](https://github.com/tauri-apps/plugins-workspace/commit/a79d6d94bdbf6d1919adff8e65f79240c31d4a14)([#406](https://github.com/tauri-apps/plugins-workspace/pull/406)) Added the `setMaximizable`, `setMinimizable`, `setClosable`, `isMaximizable`, `isMinimizable` and `isClosable` methods. -- [`83abea3`](https://github.com/tauri-apps/plugins-workspace/commit/83abea3cae8408ce262f3815c1a6cc506e73c486)([#407](https://github.com/tauri-apps/plugins-workspace/pull/407)) Add `WebviewWindow.is_focused` and `WebviewWindow.getFocusedWindow` getters. - -## \[2.0.0-alpha.0] - -- [`717ae67`](https://github.com/tauri-apps/plugins-workspace/commit/717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release! diff --git a/plugins/window/Cargo.toml b/plugins/window/Cargo.toml deleted file mode 100644 index c11a4a8135..0000000000 --- a/plugins/window/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "tauri-plugin-window" -version = "2.0.0-alpha.2" -description = "Interact with the Tauri window." -edition = { workspace = true } -authors = { workspace = true } -license = { workspace = true } -rust-version = { workspace = true } - -[package.metadata.docs.rs] -features = [ "tauri/dox" ] - -[dependencies] -tauri = { workspace = true } -serde = { workspace = true } -thiserror = { workspace = true } - -[features] -icon-png = [ "tauri/icon-png" ] -icon-ico = [ "tauri/icon-ico" ] -devtools = [ ] diff --git a/plugins/window/LICENSE.spdx b/plugins/window/LICENSE.spdx deleted file mode 100644 index cdd0df5ad7..0000000000 --- a/plugins/window/LICENSE.spdx +++ /dev/null @@ -1,20 +0,0 @@ -SPDXVersion: SPDX-2.1 -DataLicense: CC0-1.0 -PackageName: tauri -DataFormat: SPDXRef-1 -PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy -PackageHomePage: https://tauri.app -PackageLicenseDeclared: Apache-2.0 -PackageLicenseDeclared: MIT -PackageCopyrightText: 2019-2022, The Tauri Programme in the Commons Conservancy -PackageSummary: Tauri is a rust project that enables developers to make secure -and small desktop applications using a web frontend. - -PackageComment: The package includes the following libraries; see -Relationship information. - -Created: 2019-05-20T09:00:00Z -PackageDownloadLocation: git://github.com/tauri-apps/tauri -PackageDownloadLocation: git+https://github.com/tauri-apps/tauri.git -PackageDownloadLocation: git+ssh://github.com/tauri-apps/tauri.git -Creator: Person: Daniel Thompson-Yvetot \ No newline at end of file diff --git a/plugins/window/LICENSE_APACHE-2.0 b/plugins/window/LICENSE_APACHE-2.0 deleted file mode 100644 index 4947287f7b..0000000000 --- a/plugins/window/LICENSE_APACHE-2.0 +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/plugins/window/LICENSE_MIT b/plugins/window/LICENSE_MIT deleted file mode 100644 index 4d75472566..0000000000 --- a/plugins/window/LICENSE_MIT +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 - Present Tauri Apps Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/plugins/window/README.md b/plugins/window/README.md deleted file mode 100644 index d29d2f3ba0..0000000000 --- a/plugins/window/README.md +++ /dev/null @@ -1,89 +0,0 @@ -![plugin-window](https://github.com/tauri-apps/plugins-workspace/raw/v2/plugins/window/banner.png) - -Interact with the Tauri window. - -## Install - -_This plugin requires a Rust version of at least **1.65**_ - -There are three general methods of installation that we can recommend. - -1. Use crates.io and npm (easiest, and requires you to trust that our publishing pipeline worked) -2. Pull sources directly from Github using git tags / revision hashes (most secure) -3. Git submodule install this repo in your tauri project and then use file protocol to ingest the source (most secure, but inconvenient to use) - -Install the Core plugin by adding the following to your `Cargo.toml` file: - -`src-tauri/Cargo.toml` - -```toml -[dependencies] -tauri-plugin-window = "2.0.0-alpha" -# alternatively with Git: -tauri-plugin-window = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -``` - -You can install the JavaScript Guest bindings using your preferred JavaScript package manager: - -> Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. - -```sh -pnpm add @tauri-apps/plugin-window -# or -npm add @tauri-apps/plugin-window -# or -yarn add @tauri-apps/plugin-window - -# alternatively with Git: -pnpm add https://github.com/tauri-apps/tauri-plugin-window#v2 -# or -npm add https://github.com/tauri-apps/tauri-plugin-window#v2 -# or -yarn add https://github.com/tauri-apps/tauri-plugin-window#v2 -``` - -## Usage - -First you need to register the core plugin with Tauri: - -`src-tauri/src/main.rs` - -```rust -fn main() { - tauri::Builder::default() - .plugin(tauri_plugin_window::init()) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} -``` - -Afterwards all the plugin's APIs are available through the JavaScript guest bindings: - -```javascript -import { getCurrent, Window } from "@tauri-apps/plugin-window"; - -const appWindow = getCurrent(); - -// manipulating this window -await appWindow.setResizable(false); - -// Creating new windows: -// loading embedded asset: -const webview = new Window("theUniqueLabel", { - url: "path/to/page.html", -}); -// alternatively, load a remote URL: -const webview = new Window("theUniqueLabel", { - url: "https://github.com/tauri-apps/tauri", -}); -``` - -## Contributing - -PRs accepted. Please make sure to read the Contributing Guide before making a pull request. - -## License - -Code: (c) 2015 - Present - The Tauri Programme within The Commons Conservancy. - -MIT or MIT/Apache 2.0 where applicable. diff --git a/plugins/window/banner.png b/plugins/window/banner.png deleted file mode 100644 index ea52673ad7c886ce533af29444d9493f7e6b9ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58100 zcmYg%by!qi)Gi<*s7OgjDhz|<5K>Yq0&_?ihEy0Nr9`9~L6nXILxs{|!JN%Kh8uew?%OoTu)By4!iiG4+APEWS z3rY&;CtvbPH%Ultk^m3yqrEa##xEsW>ti=Iw*}nvFWv34x{rRqb6@=S{a_XnmFo=G zuH8pdwA^pYm7#DG^ZOtoR-~(z>cXzlmKzhn6a4hibrn*84E%nxl;_U4R{kgF6NGbh zNuglf-kSfx+2iG6`?R%!QT_ES-<}EEbv<>{cW43XMD^T1iS#9@{{H@K)YR0gKL-b^ zweaW>?%d|KQ2tzDJ@sFD>f0!F2^0TuFiTee+gD^<-dE?njly6stT%1|G)l)We5S+s zO#JP@e)_1$sJFlJbaW(ax_&5b`Lb|ubhoziW&4RM><(Glb*D)VuLGzO7EVs>D@;Pj zkdTmJqy3-CG}bdYu$=Z0o3!ZBdJlxa>wqk zeg|6>7A+A57_i^q&6_uU@N`G8B`%Ck*tE7{Ah|!rAU81y`io06h>eLk#i%bf^!D}= zqGDnuwwoDr#-zl>!4pDaUs`Xkt{I0?JnOTai~WTqCC&yI3|IKL7R9AY*$SefpYzcI ztB(Y*yXyQ-Cfej0_O3$OfW2cyuj(>AL33X7Sba$)Dg-8xQkU@0`aK&9SGLa*-W|XM z2m|$D-rQ^$3JQv{!LC$^Ums!>N0vH4T+-8tA0uhAl&%k@n~_UQT|1vWR!!QZ?ATpm zaa;a5F5R~Yx35|ER5%~ZNSwL0MoIGLepORbb7tq@sGoz(&~Sjy%c_;j{kQS=@89n{ zJUpF`{Z8B$^Jkp{1J5!}Pfu6XbNg~$y?T`iE$yMhFAVLx*Y1o7Al@t$^IRKq%o9(L z@z^MSQd2gN%nN7@OipG;heU;wuOmq=k$Ke_l$d4K7fr|YFC(89nN$j}A#Nz$kV{o! zU5V?Dq&(~ct~kW1*G5o|0waRC0Q9*yV_xB5qpPtY;=ySE_dBQrFuIEP?iLUTXP;5{3U75g#q|XP zOgiq^OH`%B8SVVDwVy*B^dSW%WIB^w;(|;C)@|U=+Ei00CuF^oanxc`;-0WYHa5Fw z7gtmG@yX2@;5!6BR~W$Sp58HAvMq0?jNODuBkyz_qwseE&CRDS^5Z^(f;wu@5~b+7yW-Bssyo*S%e;&s^YF9Mb(qoy;cY2Eq@Gl7+;OxR8ZxXU zCS#|~>&N_kV2LTpxtaEUX_$+$opP1`a{;*N708`}A$L+aIXO|IxpvJg0d+W^Cg~vJ zbGVqt<&;S^6KZS(Jb%69d5?R}Ae^mrsy-9B9iUeu zSzDU>o1eMjbO8$VK&iWT54q0ot^3ChN?~s>5Be`f1n#Ifi0$^MsWIr z-1to|+ESU^CF$UoX#1fw9aMEV&N*XIPHK_O2^c1sX?_B3-TKiayBPJAobtor;HExG z+ER;STeDTJAb=M?Dq78x^}~-iTT<~Ja;QC|?`^F5^)G7*maS1|-b?trQ(p*b2}WN% zoHXF}!oX=yir9>IE^0Azu6g};oz7zy4lwO)3x7BU{=8I%my{bA4+f<5ZQZ1AQqe7x zls?K85bpVShyNDP@>D)|M7SVO*2HSA13OH?1}qu4{Pr%8IeP-uYE}449SBC3h#xrY zeW((b&i!}T)YRk;InG&3OiWg_{XoIvbbmT6o%8iW0{^A*=Vl%dZ36v)?zZQ%2ips_ z?X+ZWu?o9JOoIlc&Qm$qbQY>4u7p~#)df-%OL-<%P4)tb+YYGW6M z_8R6AQ^V(~P0!sWd2kyTe_i^iEHbGb14WhXsZVSL$Kh{hB?!W`)E66XNZ9!K4HW24 zKA*pMNAO@&$^Y=5F!C@-J(mHcz8!{@T6EB`zeRr&79i-!TVhoDZ5#>SWwm^4EqC-x z4J%OalVw?+Xb7?*q((*IdM95Y2ewY9rVc_bsiIH%rWK8M1o4sa{SlH?YH(mCatJMc zFxvA5rB38xXFuLr87_~7@*|IV+Ui%OVD#oEkA}8(t z4JP(;4tYP^5T+-@UlrRF#OsOSVqTn7iiTDs-uf~>ji-q~)6!_cKi|N5vk`W!;OvAisw zr3EN;#7b{nk-Bprcjr#U3ooyIXOwy#E|E!c%K@-Q^isI*t_%+=hXt{(?u}uE@Otr& z!X*3;+~-8Bq^jdK<~}&>!SIsE;Loyr0zuwlQW~ggbIy*Tq>l7LQ;f!vL43ajPqt-d z#Vrd|{Js`EQ0`)A>CrW6>df=yzC#FdIup*9<@H4uQ}ncb^5t~0{UkxS+B>OVIcJX3 z$prcO(dH49sVff4V0atdMUBtV+c3e$OL6FTeOrTh4omMmCH z%3*6{nHS-muTKDL2ZpMM;O{mcK9Er4nZe+8{j#-^JOusT>WkS~Uen=fteYyV;Blsu z(@2l9va)S%q8S#I)*DuG3-3?&;sYZi)+K(QSC$*deBA(L5YBJJ8M6EgbUo%$aHf+3-pXp3klQA@F1x%4!D*N~y@3Bh zPiFeXAq(+t8750sxmc}3b<|OK^xG~KD%P@BZw+2iJcPN6OL2=UMVAL~`Tx^h$N_7a z*h(z7CAVeTo<+V9olzH1Sjm-px_wRlG zN-V>QD&32v+KKr#Uay5>8F>osSAKYfd)~?(L+u9(lC@|T(;1=NqcXjp!Z$>R`>=ym z&$XqwdR0CUvPTt^hmZ1=_@^0|vG2O+2@q{O%Y(N2;N`uG{$>D2u*z)!140?ZAipz7 zSmGxfzgqeZmZJJ7S}cm{&J0WY1*WvlWCStTF)JIot&rCUOF2tLy};$*KBW7ImCN7>ky&lD4b-)Q_I z={!;AmkW=z@;Oc$_o@JRB zZuKHgw?`E7wtU)-aDvoO>am2F9RBzu52}l{;(J*Ge@gN_KRP_LIcF=pxo+a=c@8H> zVC{vs9lwGj-ckeC1p=sZ0DI=%`2=c#-lQy9`kCvdmyzT{QaYf|g&D;KD^*4guGFt- z$oT#k%6SneXph`8Fxq4f!CH=G52@vr!|@J`onLbu_kl)6=Ml~!K2YH)6#Wx<*#UY`OFu6jF7W4aEZ1rR9I*gPIHmw@!7Ps8 z5(iD9H^U`)wGqBDCNLRXUm_n{r89v9x#O z+T;JOKxR3kl(_Ttj^aGk7^1yn(yVmm=g*(Ukbe~n6dFz%u40x7=LD}_yLJjyg<0;V zS-6-s<msdg-r96QyrOUw%;7Uiy6udqt+BO2}U+?%AEi0@WvSQ}oRF-B6 zxdey1N$n3DbGaC&^O_~$K`hw=wpQpApjW5vhsNlj0H zdU&mu7@{0oe5Vv*ri@z()@xH!Q*xbDQ;+iwzw1@`uR-ibPXOD4-w)ok9%%WOrd zgW^Q%Cppu}P`bqrex`$C8BCscCA7BHhSn&TZB;XuJ{!-4jy*9rC>>a!ByYD>O&|oG z=e!N5s`-vmR}M9Uj@)=5l;ekHqgTo!eYLOhTtZ-4I1Ev|G2fk@Tt5``P3B=?&s=A+ ztsb7i z$2Gy_{F+L0WVZ&YbGM;o4f7JKgpcWY-N}0ncyA_k=+jrUyOP22sYWE?*W!lIyA zuD#1t=F{eob&ZMKq+^4Fd!y&s6@IA9VDMj&20;r~3RKgMl)vJ2XBN2mOsVBUXgKo~ z-BBIDo~e~n>YZa*JKXq@5Iq6r$BZz`a8iA5-`QLO!*j~(cqMJHhwl_w^XmhMsxtw2bHgUJ*;`G!9grnlnP2^Tr*04WJZIyIZTh&mDAw%QbTr^!jlLN)VPcQok3n%*c#JgVF>OfxFdb37{g*JU&BNqy~_HrM)D zbow#GJnt4jI@ZL7U_!sgke%8QKim{%@+3^%9!6$PKC&qF*}N%uM=Fap3{z$W{GK1C zz7673|J?Xq{zhB6%QuxKfn?qr2B>g1HTk5+Mk#c84zJt>>Z8Qsy$#v-W)Cr}T$?_E zf%koX2LJ)fcIw>tVp^?UCXw+HltZQ)t1&XC*)-qIf-}S+&qx!2d=_ z(JmGydBGJE!!$Lfwc(c|t^-Cqu=ud$#VeH|x(+#a+nX1y$azag^5i=W$Yb%?o14q3 zRJpeEDYjQ*T|Ig!>Wgf;QZ~OeG&Crrd02xZ6moHvx70T}?d5=I`gE=7CzI&s>kret zr82+x>Vo}_@^6Q{nk58Al(v1Jzez-s{~qm~dlL=sb-D-o+}I34o~q83;5JLO0mgO= zKNRBQg^&Q$nAk@Y2qZXnaV@PcFUyJLR=E5sd4$p^rOo~Js-1~c1SBXvgfR*i_)Cww z{aWEU)A|`XHF$wWK2BdrW)}&X%t5uz4=L{Wf4pDBA>t-K)=%6V6X6ENyzBKjm&-MB`+9RxcJ&sMJ0Jm~Dsnq}d+Xis;E$LrToPnb zZ?BE1chgN$f?&jT+avmi3yv5juN5?Gzon+3!dq%l5U{_5o^`p#N93Pxuds_Y-38HC z<{RDqSk`xcZ2K$P$ZiDw)8w^;1xBl=Cqz~eVS%Z7NNZ(CG(m83a!yokNe_0CLkcP< zB%K)iLTI5nMccXG&B+o#*3eM))lAtz>4LlzT%Spn$OVxN=(67|Fc5`m(LX<87nrD? zN(%r5295!^>EweKZeO2X69RlFT-s$WcX;9Mh^-}*+McR2Rzd2p|5NqF*iE)&kN~ah zdI?f4KRo>F8wG(;?{i2i9`pV@Up3;}{x=!rDS3}=)xPA=%!Ld99HHBO3f9A% zktD6$Mw*P^NJ_`es%sznO)b0RHLua#S}^XnJGr`QMck+LPDqvDykE3b=*eU)6z_? zE9$UkJ*o^ucsxWfpApr`-c}XETqw)p8sl;8pIc+7ZZNxRw zSoYK%6F<+DxAqQBP7;(Mc=F)S71XoNsfIYPp#V1PS6^pB{~eg6z^G0s?M~AzJf$Ym zj!&m>VF>$!BH=v!3^Y(c0hJltt=^U3oz*hDL(ZpAcCYUtWmnm6_yJq^q;+Rf%|sGT zER5sf)?fj~?j=@#tB3y%>B~B~Pszs|?CcrRPz`)3x2d?{E)cEuExGwB4K*i=&_m-m zbrh#d6{6{rQKQ(c+y@a67$Q$R%$;?ck~ z-Q+;P?EIsWy9%ehZWE8Na6{vR<+=w9DM~UjU$%egDAo5uHI1dQY!4(>!})VniW|g% z=r-kGjvugRUPeCyu-nqb%?XK@Y*Xp3XDbB;NZqp5e7ad>)eZ_xSx*~+{p~4;HdQzo zR(?C5JPFrml76mAl$W1*C1$ zV2|lzqKD(EHDFKC!_Iw>-mze36wSv^1JBCfXn;U(B?@zz4&1ivoNkF+6}Sm3vC5Bn z(Y^R{b?PsU2k3fb>>wdR`_5WXv(ro3M5Av%e?L0f%?)@_ln7UiS79$~W&du}07nU6 znXudScISNm1U6*w zi2$hTDOoi}E`W2sALcVn$>=$$Q7=eOsPM4~=weUlk#-vvPrU`q@Vuc-{~M;osuTxT zot6d(ty_|z-9PqXqN1MM-}3Z&@!~}) z(PP0F%iiLWp78VxdzYEm!-z9x`k&Tf6F)cd_mk9({>f`vX zmtE&jbfD3tmDYR@>Mw9_HNgDxN=(0cs8Kuy#v?oA&Bm6|^K=z24Kr~jV#BzRUI`mh%QMZPtnQGtK}b2ihG`3<}Y5veGja*+qrnIT3>?&7^iFnO|9JG(+BOFt|>Fw zY|nRh(lsW^ld{I*23DZOQjNCwZ~n3MgO=d_^0%;o zU@OE7B?6uv#Z_on(i8l6<)^!RJZz^7Ny3mA{#>q|{B!?+0C7LsUCPx`?hg{>p0kt; zW3tS1xoBt6JU!%?)G_`RCjf;t^=ji+n^6NyIIh)PT!loS=RlH@7jNQ1L1RhD^}$KL zc*UUDWbOtJ2*Yk_&elzK*xCwYpDgzH;lDndmZoQRYkC^sC~5!}w7sc8XDQ!!90ymE z7wI{wq*NYQf|@pIv+GR74YWYZ%=>$h1|FBZ3G5L}KVhL)eCBLIEt`}k6>?XkC$Kr!xkwq#2Yj4Prsje?94~d=n6#jF6yS@Wn}2C% zaow}!qr@8H0!KlU)P-DBdj|&J`9jK8^W*O#$)krtcWY5J}PdDUO` zDHd*^uRrJFo%UPvGxCO1Bcfc=Mm+AE^UYn+%py-x^v6Z{Y%Fnm6|e!3>1*a!t!FZz zyhDsT)|ylIwsb9Mf}>A+9C!4Q0@nr_V1XaT%NJ;Xw97LWu?-ozKX71>B%7K{;ftN6 z0Ruq*L|>q9bnCh)^Sv&E`4wC2)A+kr_JsA1T{7tR?y&Ks@_cPg!j1GQ+@d#b7J_L+c~&_ZGVX$o_>Ea)wM-;kcr6>DtycvBGA2^X>Kip@WCm&d}}{9q7a z@qap3VlSFGyMAnd3B_6byqjA#E^$Qj`t#c-^gTQ2?b4l zAmP_ze@1ZYgHNnPi-pV5jfWuo!IW&zttf3$p}Kt4vhH#i)TmJ8WD^JArGM<9XgpWO zhu8dp)lhG7S1Wn~`D5e92#CpR9N$$-!X46;z)l-wI)|3L34OBy#3O61rx_T@4uL>k zcNtEK4CQ86#6^B8cIe-BLQGF|+iAaEf(mD>zJ$@LAb{GW>~C(>1fjqlaxCxutxuo! z2pqYvvrIJJ*U#tLZN<=L%0<#s7B}phGBsF69;gVR}X`SxO_dn#hJGyuDdfD66Fk z#G1VI7GuNL@Zo!6%WsdPg@Km$!D2lkywCaV>~#-1S-?L`ErWR(*aT<0Xx1eA%SNojoZ?d)$KptuG8d3z(&Q7$P9pBJeiNgTK8kSoxv zpxl)`Te2zlpMl;F39A(@JeyP(e>+=3Lk7IM$1cX&Gv3;iW6Zhmh zxC3b#LZThAja8{w*4SnQPIk||QcE;1RAS6GBlMhdo45g8L{A!7Fj*1WO0R;fA<;}@ z4i&yOSzUMUuE{O5gJ>bCQQGfOUtV)u$z6IlhuFS;MFvfiKtNsM{-Ys@$pD%kV5|7S z=HQ5Xzt2U{$`VUIqcW@Tg(W1|Z-czk8z1uS8kKq0_&Gf73gunybq&g$jterkv>J1W ze{HU?DsK!e%VL8T75`n^uA0W`nv|bpt6<)gyae6Ak|@mMnO4h{-Zf*;2u=5sd$aRl zyb5D64;3fdPw-rtCyVbkk^c@H_gzj~ID`fe(iFZs#onG%u5`{=XB#ii|2M~3o~8=2 z=55tspl!PkiQd1~xE+9f+m6A17qv@M@byR;vUXl0{6@6gp)mczd|5Kky+!6jA;|kDB~j6jW|v-QBtpOf@u6GotgYy6C8CM>p3o z>_;Xxc*+^uFTHxrQ*{oTo($P#6Eq!pS(*-g!UL&L+Mf~4kfKUn=}653pcZa^`7V($ zd%ayCYx6w)f{pTn#g7sT)XHuZ_=u8>D^lti| zGkwJQMcgV?X1pg*?F%QF4c1?B62i$;3z>Y2TQRNka$y>J=@$pXZ$FeXAyX)=iHwzB zp1FM~d$VtLNVLhHLAbxhR$x@#mj;Ty_{NBCX;{E`hKN?Qx5k*Xt{7tAI~2mVSoVR9 zhv@Ye6GPsD1v_?d<7yX5#VRwWp&G?UZ$` zTNU(bWWl31k`;T=Fi9QjPTP5jn5MpdncvZ$0*Wpnk87W5?Ldm5I|+p!z5GgwWh182 zUVj&oI$0R4I_clZ%H8Yz<68MsXMQ4*UgKatYI?VNygf zwU2DtjyZ8KNg4oCn~ZxoP?FxCyF`0t%bC!z7lS^xQo3c?!@>m_o{$#7uSvW+a1Rpt zpAqkvuvgJy^3b@>c^ogH$ThjVXX956h$BJf0c02voxyDb{p2x`g@aA=BGO6qyBHkp_sHxKD!B z!o-ursGHAI#gj`Rab~m*)@vcpVv%u)IK*DCa4#?3J%>lRS!5`Y$Ic!Wz)zwvCjw{k zxqTkeY?e9A7D?^&47|azpbrhHaL?Y1Wz;1%(ifz>0Lq!0<+^^O+r{wT5svgTd&BH- zcfo@H8h7=RJoh@_i%?x=z4!VR3a}S$U3hlTmC=$!M7gKTpnIHf{~aLWRo1<03AsZ} zE5<4)=UcsUP=mTC*RrCNCxz{mFaY*{&AFV?ZH^|{=B7F?#2i;?moF7^4G0_Y=q++C z&!V5d)qX3qc5$#1?B_(DqE6U~_cJ4r1Nfrj$|+^<)MM<(^(!WzqGlX-{)`o{#37WJ zf1FqF3ZoX3Y|l9=s}ADseG|MJ{E%_uoH!+Yfwc_D%#YpAjJkQ7oOWvJyR&>rJ_qW12j-w-JLVZ?Kkm4w@6 zP}2?a4rlv`TcW*EROgASJHO{Q7e%PJppZ}$vR7bJUgFUFmt(@$N?PC#9GjdV01ys+ zU-kki&pdtIU-(0^XaRQ6+EK(^`@KhNTFRb7-P_?GjlM~HlIb`8zOj6S21j(FCVQ)r zQa<9AKDP^lgq}ft^7DvzKN3r#C9uAA>)wnxVuu3mjs7c2@%fp>%q2#GPzw7c7=Wsz zWD$#f_W&$t&!>P>v1f)FImi$meZAG&nIs;XlU(~29S=WF-zghAI5g?IxKHC1MfOAi0mi+I;Oe+;* z6NH8oMpI>1vbUphren)%VeZvm_Rd?^T3bderE*ElCFx3#)#9h+&F5KN`ZXQz%@FWp zHZwQEEiP!=!{!@dmxlIPgtI=>yJjqR`VOdLfF*WVi9l?r#K&9uu}6Fb^9s`sRKyMh zD@mCeDypaJbeO)ZyzubM=pUziQTm6cfc?t?-tp$9gD*1_F1NcRQk+HC-_fVs6LyV1 zpD{^)1k}Zo?-q$MMjs&7CC%#Ak%#mvv;M8VG0f{40%nk|5?Y%11)A`YknrZ!M?lP0 z+iI>P!eYzNz7$DPx-1JSkw1aCO9vOj0#c`3*7e5kjj9N;Lx+-}HR7h~8VP|tDFVEp zsR268PF2M;asy7N;QqswPMuTlT1WKa+RFM@4+k>&EYcnShKpQ-m*AF~=~(b}z^`Ch z#umtc7Ap}mW5v(*G`9w+!2a?4e|(#rC(e)z0;{BVhRV2MgjcR@=GOE~}W9 zq9@F~*!fXy;<2O8>>jEn_h|*IG^F`uMn|ZC1iXC1Xw&@yYS(r2M24N?qyKEj5tYSj1oh9z!?NL^J>3k1Q=cJt7ZbJ9+d4U0f>xLgfs{2YK>&oPL+B7`caP7b%}(y2 zmJ&!q>(X7-xQU%&PJo)^6MGOdF%{**XMA{cz=myvZSSumY0Crt5JxJJH~(^BF?F`w zVeP&GCP7;bTVXuFk|N!xmD!XF9m*-imVwWz!Akl%V>@Il?v;13Fxm@WSF>{07+1%Q zX;r2@p;6Ice+UNpV{#G zNSH|bhE_`b4qh@q0fgsi_6cQfG8K?BZfiFFL|!!AWlrzc<&NA+rCc*Z?{96#;+!jv z$d!C2F4cMIY)ov_--M)-ntNzr@m*gW7Ok+xF^`^_5IZR3hG5zx=ziuqsw-9=J43tr zOWI>I5LJu36^s!yDB38JhmIBx^)<7fy0TFbo?YsW#Hh7AfSrv^jVPpaf-BM4k`5*l zmt2w%O1|@7Hp}?@?Df<0RR7t~>gr#t?aki9fzZ-^ zf8=pby0o+Dbn?At5Y<_^1u+=?itT7CE~C>gk80x45O2d8&DIm8M}Ygmqe~H(wWEC_I=t)*=#W zY3_>)1PDG>DDMq98b7Z;mMFUHxF5AVv4v*KjHi<;uZ2$`uY-4HDX*St!Y%_><@oG% z;y30NevDu*W59YW)#Sc$t2c4eEDpAFE$fQBpx5v1t5c~{<@XA-tmo?5F^t`igFMs> zLsFEc*cjf?4_b>#s=cyzFl0c~NEWGFeGjc^5`P?-M1UqoFx89LSn{v~B)1nNM-129 zE>NNJD22Z??f2`__ukwNH<&o?+Gp9X*(whgSlh3;F_ny)U>a9MwRo?C1!@67zCUJ5 zSkL44p%9MB>+>TU+q#h2e$$kS`2FamfVE9tjifJ>5Yj5}j*xCg;JDi{^Xk|$4t*Sq z@k4ORR5G?HS~(}#+>)IAgO(>bm)^lb8!?Ew^Y}?h=T`Zh`v~B&d?(L=M%1rz_1ux4 zrlAK$0@YfcYlS(GyQIA)_5Tnp)e+E5md5c*1d0VQsZBP0#5rk0A$VS~EL>oivM{|~ zf>hjcfCfI91Njuwu72X$?t9kMEl9tCWqgd!$#jMN@otfA0AczO(N7$2M2@yIP@#bg7aPtCWs**nZ z)`#HyvQR5@wyIzql44u@hJ3@bKkSp8$U{}A@EA|;n4CdwZJk8FmLsh18G?7>k*C47 zwQQj{NI|jOhFTFdvAF+^7WA671pR!bF=)-gWa%1tugq5wdcxQwEP(2rceVxybIKQ| z>pBdRMZ@4!@HPiWaTyTAwoiHOSbS~YZ&2BB^NVuz^HvdDKyUiTmZuKqvrOuIMFC(z zQ+enN8ImNVhqF}?H_|*`hhC#ylGltjhoD}RX{N$=-V%LM%cH$?O|zeSGrdF33@UW& ztqBm+V<}m-Bi=ESes1IRbu|4tEyE?#qf&T$vVVjhGpj9gazRtKot0eGtoDto6@SV` zfDf4sm&q!&?%}qG2B+x6J5AvV7NoNM-~y1dkMEwmnvDK_pZ{e)Z34AROA2t^h*< zIaV;C33m5`fQ-qU3RbZFQNVe-bJ_pXGd2#YKOKg!thRvhaQc=?it09v>6pFJEymT< z5Bjd?H&MmY)L6z|zbKg3TxvbV950{}PHl{@Bb{IgL#Ge@U=hw%5Z8`InN-?i3rPTd z-*w-~bdfJp!3LN&{m^h<^!O*ue&n&qz&Y~D>r%_@I*xWEwPCTPmMULo^5de(?T;tC zO6*m{r9Vl4{hLQv0`s7JulvUcfr*agXe;MBpURU;7~cDQv|os{Yx|8%n0_RL_azV@ zAx1y{7+Y<+#N~GS@eL%`!T?EgkSTmpX6792&)pnMi<-5~z_8`Kl%g-d7U%HrKRKA* z(t~9QCe(F_2?i>iV&<|Tliz>@{DMgtoBJpyi*0Vl^iQe~zC*W~@~%`4qC=W} z21Q2k!agwQAU^RoIUF2!R)++}ko1NI)UhY)9YjfNxWHS%$9H0j=Q)l_%jk`vq?s=1 zV6c02wx(ItOS(y;(sJf~J4Q039RoRa!Ox*d-Op$o=hwr8Wyl6z!x3*)C)Makp&9}KQa=Ba`xiS;ROchy`zWq z%!EZu=4vFT?PDPjqsO)z0boT#wA9G$LZeyP8k=s`nOi81p@&VW!}zhgpG`G$+4H(feyiaH?&@VLc2T*F$W)ZIC;etLDZ&{%X3j-K# zZpzvAWVnY8k!*rNR4Z`K`1mRw%^J9&jc_@YJGx)ZBLg4FPa}b z#-g*KIbka<;LzuJRT{)-VZfZLV@gV|8CAqc}u$I(6rnpdi*EuZt1Jw zj!CO6LoKUOTL4A0q=ya<2^+)T-ZZbDi!Pjj$D99mlX_4C*S76xsce=N<0jo>MU9>J z?sqp;r5?rYSI(8EHFZGa21K4sjlzYLu-=Za^F2WJK$W~-NM&#cT#{J0`J2hZ zUil81dTOS_9H-RV1n7r>aO7fW=BX)KRnVvmxsKR^< zJ!Uwzru%*%`Cova8z3h?)UtFRx!JiiP*^UZ&O5-@bJX&m6!J7)3)yWj@ zo~+m^$;}OCUmasM^Ll#tS4}DHdBef{N7E0uL($Eg0oS?z_f>@D2YI#eSC>_$dBLUc z@XHo)6@D>HOQ`acV{GeYzn)HRq)6>;|D8fiH~oWw+UW?vKJSIhg%}xpv~H?Sqz99P z=C@}xWsbvTD-Fs2-PDqPvpTn~N?kKc9$HCCZ-Z2DqHInTx@lsTtv=xxW{LkXV{&hr6iBG>Gpl)-YkQ(D`$9)$YcPpu zFGYlQ_U>?fk8tLH_?_$Y(cmOs_`{ZsTW{G>`{&PQni2X0A*(Ng5U+XOiG|N(%%vRn z`J{_&m$q?sdMK5Bb`uu@P|Hqro2|os;XL9ga-~mW79>}>mWOXbz%arUjxp)~xV35Y zJTZBRSvY&~-VgZY9%51&ga~(9&*!h6*YEtUy<|nPJ^K8s@VM`Kz1?zgwaD=ynl0D> zn=okbv<?I4R!q&FDzKaKm!h|M|AN_e8%B^)cIwLz~esa>vZpeska8dPAG#f@75O zrtkQ>E$?nu@2{&>omqqDf#|d5nw?%X_Of$j@56&vO2o*(KtCEU9TDR)n8NYK_r>${ zZfNFhU3;=STD~ATiD<>yC=}LIu_!Oo+1~Kz+vMuX{i3t%-LNI`^y=K?Sd^Fw*e~m~ zyX_b5O`G0OYkkU7N#;aEqW0|V2KBF3iOD~LMLqv|aQ2b`_a z(eUD!D^crcrCf)pxrk9;=InI+EX$qqX6d-l6R4A9tFUZrcXqNz{1gbGOLu|Ka^qh`{!>R2vEhK(+1HfE^gP^eQ_8xyT-Y+5xqbt4lst=+3`@8b>|G)%fRCX$S|6X`PO~H@Z9JppPxnF7WQ8jt z_5b>6TRCbuH&zsu@;{V`TpzHI=PTVsoNXb7q2UIHeKUo1Z(?VIAtLag)1kHp9bgl1 zG&-rBeLTyz%sII`;!xtYJ8WyaU2Vg2^Ls1LyhGiW>J;MS%TD3plxAY^gPF2Hj-+?wgs`XvW#*`J>Nt6%p=q$gC%1(-Se{7NqqtH`RM+*{;LegY~;3>onO zsQj@f%}+ihNF}SUhOwZEHq$Fp4GW+Q$QnYD?WFegLK9uE?jgO+baBpiz%j1FpKq5&khDm@ z`0KpyHy{VAnI{kj6_<<3`+DTopZuDfu~m)Rhg`(ggBk|1)&N0!GjElS|J;EnQSGT> zdw8t>isfRP(y5CY+}OTp9yYlgIgF@u*PaQ{0OlaEt$<2-GvfWXz|`=Sx0 zU^L6QZ^_R|guNaVYhzC^I~p1M?cG9*y6?MIV|(|{Ylbqhs;t*kgU7AX4W;u0Y3Rk~ zKQOrt_BC(f>~v4s?H8lvcR|cSN9|;+yu^W`M1wz+ONtKGB^oxJ$DFFimktlT={9gn z?(%iSp*ppkjaD}2u7GQfmuDtN)>dg#Y1F{ocOln0COV`4hJ8Pd+v9gdm^rF{T`B7< zD-Gvy_cCBUskboeBrHOcK1D~aj)arl;g2HpXO7PuJuk7pxaR|fTbjQ8V8~J8`XHm> zlX$1g4tsmhfT(PW<#yDRrCUoJn$VF%g!!ksx*xTARB}PNk45Ze;Wiy@&Q`gp7~M^= zGN^d6LVzaZPbm{!=Ktv%nqp5p<0;LVb+x|FhQ7Yg{yC?l^tR9w%BX?#eQM3$UR-qY z#nqslz!O2L_&O(%8UsZgo&LId`K75gufQpu2B2{!LsyZCX%?0rYr zJsTeB^|;sV3H#K3G*nW9Aq9W6q=s>8zboqo&CU)7Z7sXbAxWxem3E+E2Oe-CFgsgP z-*Y_5rGnD&+q1n{#QNh_y}KNTx=ym)Hbj%l5j_n7qG6S6zq zttQkz-A03i9r)aZ8Mg3NAJLK@5)G2{XChMan-&+?!?kK3i6)u(?+gqVj!PA6IL`a4 zaqq?{UjrhUgzfF+oamdnobVnCvfUC33rc4PwZDI=m|wj;U88BO=$fXDJl&G$J{p5& z2$Wg2RR`-q96CVi;iWROy8&wUi89)JSh=h2eRMoaP+OB1uO-_1aomEO2~Y7+m<{W! z!pkv}QO!;J!eJoQZy;=2HS+MuPS&PL^w87CuT`_0wa7y48G?V1Q?nf?;3-}?(Q~7l zI6a1*8oxMjz#N$z&TyR#^)1_b!btL_#wV>AO;>mQc}taFq}%I_7-t2Z9xNVB zo&|V_d}vks7M%1q`=HC##GhZGBwvEr+vf8Z#|0)Q#~=JTmy?6~LueF-T*I$41Uh?n zKJHr&*!x;E{uz2GBw(w)-2iX$KA20kCB9>O{^h;(V6#pBc@M=n*O?CZmLrO=)Ye$I zV)E$hyV9|;N0BOL6e*4T#yyWH^{mV0^U>&EP`i&BEd1YD09!{pL-cLeOz*-Os(Ywc zrri{*0BXg@}9Lody|0?DqCKk!?;m`^Cy2t=D}HG&{`;jvq_?x@io$0w zcV$FxkLlc9#61Ar2Bw#3D-@t|z{N@F&{dyPI*|SIju++of&l1UHGUHvDRX#U0|NX?^9!X-@!FF0zf09up~f=IoicbH z_9uVo-QD|a7B5xIquy~-F?xI|P|RTVg7}M-zHFw6i*~NK6C{5aU2M43z*o@@*PZxL zo+BwsChR%s@3}@)=8h}>GJ3;ShFRCx5M7q17ynmo?aRz%yZ6Pd<~_R*Xeng+?+zO? zKId_Q5OeW7(Wrll-I1dMwjVw8c`%P^r2kITbC)54%)k zpHFk8(X)Qp)EM>omtd#IxcgucS){tGQ<%$ZsoZF7?PnHIh7cPxh4xQI$Q)HvbGMif z3teYk@ZR&84vuDXbX=^k!j#BDthwCw(T6pydBv_PP|-hB<+Lr&NZ;t}J3872rB=Pc z{YJl%Fjt?{qc|hzsV(uOhV_+L;&P`RFNchMkP8~@A5BqfK7JLw4b>KQJG_ADt;@Ib z_j7a1>=|jk=?&gw`ElS}J?`=N6Y=}Plu(U4%TNj7^sttwYq6#B_#wT2pHaoO++3nw z-}#ugNZrPR(XB+{2+uR-gy7;K^g0W5IjPE`~W%rD4*8E~1ykg2&4?H_6Z&`5; z*iJXVXg_``y_BO8S@!VE)N_2`*Fa+NHyL-Rc%MC$j|xE-$CE#ATObRMgo+uly@fxM zs=0Tlvdvom4^L+u(9|EceWejWMv9=qNa>I+=@O*76cD9L6eJ`a-CfcR(#=4+1*A)I zAf2OmzxzGU^Pa!>XJb1%=Z@?8-1o6_;`0S{4_ryd=u_NC6JPhtKdQ`w(Fm`XDNUqX zo7oX6jHwQi+FDC}kDE66BxU}sCzu$IFIg;{9&|jiq`WE_?`C`II=@kUS3V zCY(g*zoxg3rJ(T7wgf%tP32b5G_Dq0n^ExsA{R1jHP|%kXj`@jpcA9jewOmV*{|#d zwX9Q!x0O;?KSgjJdw|=fT-cFFxJmpZ^HDB{i2_qK1;UV2sJ!bC?^F)B?y@Hm#?@K1 z3w(cE24Oywcs0yj^`uCQ!>v!L@*gFc?}9%DBXUp_Ij30xTZ{?t`hX!D2P?AdF$b{6l}VbAl7V%xlbQoJl$TW*I{ zv~Hu}^>;_w>plzPEsKZmScjE%*Bf5t{}o7>g5RF%`Nn)xZ7Bf3e%m+!Rc)0iT^`$r z0S#&lrFe|P!>lHu(Qp@It0}VC!OtND*SST4_W3~Juq-aQw0Qc?SCJWulKG2_WALFu zO|osq1ZiSHy^?a6v=$lZOzM;>zOT;fJY2(}3~}+RPqc)a;$S#>T>N%bT-(!j!50(H zhqJXu^Rg1xKOn?R!V}f|mH3uSTBTSy2L8T5E@fz?IB**cOmNaGxkfmZf z$zOLsa8gF3I;&_mWS-RkbtPBok?2cnqv5X&&*&~^u6wR4A&GCCA`S;P%+>`hY)G;% zW8+t;BqX7YA3VIG=lB=Dm`(J& z&v6~;CjW|T3!IgurMsy!(x#Igueu{H)uVt@r%q}IRErY)&o!2jT$vl0BXYBa>dFdj z5zJxG;(s_;j_fae+6?R(a(|A@?SUZxPYZP!7SibB)TAxF+*6vv{;LmHyLB8V$CWU; z-t%IU8)o5*S~i&{pFsrzPNL%&`75~*IlL(x|}yjnA;yz5I)&9 zxf2pr{En{w;;=eE(RX=U;9S5 z@l|jIawGqy7p3M`Kbh)q>vW6R1;ZG%#G46prwr*YL`H(>)#NoAUKps~!0w#952FMV z`b=ujW8l%6n9Lt-5y{#W1*tg(0_UCE zu>B2=t45Hf`2pFKiMQwFpM0@6yZYt87Y0tw5o&Lxk9>dt2;#h;Ir$Z8$uxlZ@$AO znVLq!`bR+l;u$4zHI3I^50&$4KAnb(jT8e#zfIFEP3gHCqlo(^4fGa|#=D?WB(ikMz(#-<0WEXA(zg%Xj8 z$6?oh>B-)6+n}odPu4-|hUEbWV^B)+;`aJZ4^I2-uR{I@UIn}t1H3$eDuK19CG?5= ze=09Rx8G_=8e`C0TnJgl1A6RNLIZ*GvkhvS>!T!UQok!^Kx>rRI0n!90N=$5%~!1% z=k?*`bdQ*}JRxJ;NDDpT`SZKO=SC)7y>!9-RAj8z$!%1m57~A9$yLJoPeAsq`8m=z zvWhK!E+K@RcdqKs)b|3gl!87)lL6uZ_FCnkD))f8c#kd?7BWc~aUN4(v^cKSA2FtP91Mg*M@kXRho4)I(`IDZqGKkq^kEO)@;x{lWN_ixnh-HW}J62Rw8w3 zj$P9SWKxj>so(c-0X#?Yw2ryht4TDFju#IJ21hja3RYWkT~!AkXh&<3M#pJ#sp9J? zsXB3E^x{mDLrAPFSygolRP~5#HRbK5Z+V^}uP6`s3Y+kFPx% zFQZ$@@++#;+yt6@I&_khY;yAHAN%HtNi< z%IlL9Nh5)pmV8Tq`)ZF?pPf7apHXwy*lj(I7c?Y?o)jrB+oNOALI`4&u$dpn3hx@7HdE8wsjp)yj1^9ocWAw)D9NkOm zBMBiz3uV_n$_~E#hEBk=bF79b&5LKbPwGR*Ng6oMBXifR;QrBrF8qth@8p;ICB+p5 zS*0~v$6pHEi_e;EyoNPzTK{5l6l_@^r2i0Vo>i1DO4^!@B*)tl-f!kXBDUVA*tfb( za%J{nye&7QC8mrjkYwYI?3jVqm=b6X0{J4Kb(?Q0NBO3{sY zBUK28}-jK!(LOErXe%Z-5ga+f1v0|JS7*eaf zql~*QD53eShvCIu{WZ_XAqr>13z$S4*T>0JNmMC{I4Y=CGo}_zn+vBurnz^nJ3WI^ zD`0}|y`Z=Y$UWtS{cJm+Ytv$sKYuczy{{a&AK_C}I7)VoZ~sN=t!;2zr82h3X7-W{8_P@NWKUrxJLyF-UhEGMmZ>ur;+)CBpy&-G~jJ7AQZQg^Ah* z>vYSX6l*qdLa7zloW_;;Nyk=r;#km*(urrvaEyr$%*l;X`4yr&(_Ff!&vi+L@pF#y z3yLz@MsDH_>=eW=Myoy9yGooKMhvAE9~z{pt^D#T>cC*B2w+!^2JN|4P32{97(DE5jd_tw-nFyHKJ)XWpL?9s911Ppbrm(~k5UJl79&q|1}E~~WTbnp-L8OH zgxz1DyRE@#YM1{&>SOiIPT4$aI^3HwhRL_A_AC1^C_c1%5i}HUwtGQjEQ=iBCo3)V zI*Q3Kw|q|?Wyo-FQ6pM0MK%=&xDpfGc z=fOg=R;8Jmf(xo|Y1(gXiX4%XVOy1}(b^f5O5|9RQLjxdS5U8A97?bmTb>ajO>Y5} znyryZHjy&|<%l5>U~G~sowidmQ7SSr%TIrF#Je!T(Y~wOdLy%&WkTgh?k%0dCmKE3 z07*#V@6TrM0&z9LXe$7`ey&@#2jej1IkhF2I?;NIr8b=(MtF+|-z7LJA2%cHLG~{R zR??siI**F*pfdt;Vr_`cPoT7O7T*rd1*cun4xc3Bq*xW`7lXE40F>R8T<(>@9(x+m zgEG~gd1iq{JtN<%l0K%`*M+`2D7l)fYmE~F9ozb?A>Br?sC~*+L4l$j8oat9&p?hg z($w79tR`r;@VDSMH&fpIx5HIz(7)aDABqIAN)s)n1WW;k1WRvRiA)uouP0(CbS*y%Nu)n!n=-OuLo%HN zY%NmC$urIEcq5lKTmb3`GE3UQ$nV*B@dV_x9@!ZGl81BI$f)&~N2y@nlU~zKaam&# z=t6nff!fVlA5-@r!RpIw{;^|`cJsWrThR#%SH`JHTNpjrLmtBqDX`svbWK%R1GPizq^ou@i6KwgEhT!cdVt=!XotIE;=MI z;yBiv3q@P@K9wt7?KRmKb7U7sy`&My;AiU4i>A9}P*gm)qI-Iz{h0XmEa(~;ln;J7 z{(za`%7_2Hk*HZl{O23wIcx9=7U|CvsA247TFqiPk4(-Pe_`Fw4BJ_G1x+E_m02in z{#>m5v(haORy*%8)YrO%G1^e~VIdV;3r<(ZNGWykr1{O!il~xBHC-Y9!H&6p_cQ%z0a84*7AvoEG)}4g|rzU2Yo_@@jht6jyW)LS7vtkR69rgMq(ajdQpPrWk0=&lX=J@n0LUc~lTqhSDlq63WA9Qu0)-kD&`I#Qkhc(1)G20wB1t$$4; zAVn(PIb$9wP97|pS@HjObtd}n*Us4mc(9|b$W%92W4}%>khiG#1rK2kw^OjGqa^c_ zVerOfD*hV9nRA4kHj5Y{BC~opyv({{ywW@rL_~be3YMWB%$v{>siS-q@UQ7yS}fmb zuQV^&xefDDiu>^c4^xk{_K3Ei3a|r`V&u;4R^8+M@lI}0_iQu=5U*D13K|Sbjhupo zC_O53Sdf}(&R=Hb-qcc@G>mxK(U^dND7wPWggQZ;BqJ95YKmRZ_kE(>BBH}rakF8l zpCrnUK&aqnzX{sP!f%2Ye~gI$3@O~QO5uqG=P(U((#PVo49)-SFqR|4E;p-z9Ru3+ zMl#Ye89Kqj`mo6hGdBHdCScEw^xyFQ1g5O=r5E+GZYKo0+UXOmswd8CREE{tKFcD4 zwUiZ9X(S;vHAMA0v4Yz?|7?bl3@U_NJ{i=qnkmrMJo*f(qo+vZMN(9xg`YCyTqLxI zSc@Ns%4Y!{Pls>g=}xiIQ%2WW9$@a|Fp!4SxOTD!88m8Z30EQ$8qp-W>_L4U!vIS> zaA=(yi zcARqQyt^7?!VR(Siec?Du>4df#kay28V$czz-eRIIp#Ikc^!si4T*7GO3lPy$35Zx zShg|W0X=Ai26bXA6dlbv!dw4omG`H=S-KehThS7bAt6F99leirn@SE47srJOzYDhdYkkB6q$I7~v8MnVK5 zz?J?FUlZD$$2Iw}#4W5?zUv(^H6?3ewo^upwXp>EMRB@x4W5tntc@p-WE6q-@TN-I zIzLAIKi>!_c>IyZqK`y8!5u9B1;!1T#U6HZAx4>-g zKYfUx=om$FffP!IypMh&GwZ%xTJ^6QOw5x$G2)o|hWX2wzH9v+KLdyUpDIfB*`L9@syUzMj= zxAcWq74ZyZzj#6&GY}P&pK@0!Cd1h|wQq{jl1SA@vid{+>FV!Czq|o{`UI~8r#`LM z3UNj+bC#fvcB#z7JzI6a&@8#M-N!cfK|)9DvfUB<@C)T0ENBvE#jEA?*Xzm;_ma1t zR@dCk!EfeH;_I4oBmc!)sbO}sT!1pA`J+iynkq#X5A;oCT0DTCMUMx0@LKqCcVG`T z=-l`n4tZ8CRD;~wHG35P1aHrO%ulP7wqFl?P;?PeUq18Ke0`tCh^yZ6n9lF~%4Qza zI+QkdhK$k9Y1dw%Rd-Krct6}2lAzg4*xg%3bmS!f%zKX~x_q7`&KMMW8<)+*f-5lE zu`Y6xX5*uT90y1rApUk;z@E?u1pV=Kf$ZAM);R}hNEYczqDQDQnR*lI^61IBU5j}$ zj8>ZF_1=np_@&r>^Ks>5c=Z=eF^n4Vqo{~K^9)h@qV4v~l!et<`eh&J9KAs6MtC&zO@4)azM3n{!xOZRC#s> z_U>fE{t?7F0RZC@`tkgSDhNAHA>U6 zasIHbTL(Hc5-=oh^kE&iN_CqB-Nzx8G(k&tFC3y~aVaxs1N%~EuU_vCu9dq#6aG}t z?J*i+9NT)eu?O5u;H)9@ia+CmX-pHYg@hSLVi&2IEgpXd2ouTP3 zX>Q+rVjoTYZHm-?Y;=JIuWT`yy}wSNe0{AMMCmL&wKot>b5ZIPfJjSzZV&k3V^V!> zqo^+J^zc=oN-%c+IK&n*6R9oj6cnEuH{Dx3p>4pM(;^h~-uOC2fxUt$kEkA|LQWSe zn$2gipN)#NdRb{aY1=ZYkqsPifgrH)KWLGi2y|2B5DzKRQX=>NaFt4q?3>1aS-qN{ z=0*EcEmpa2%J}PU;}T2J?lEv0R=X7y{yC96lb+yMc$X@y6xKe^%BNw_oaJhHq{Gay zhf8AeWjVko?%D#I2-lWb`bpBa9n3J5mC2BxZcDM_BuRs9Uc4CkB7%!Wr==)?Ba!3{ ztM6bM-yzv?xO}oFQG)2>h$wQfDDmj};eVh&kjJnfqPjUbw14~&phLE5$~|qB%4tEd z!gUFF%ksh@W=i*90c0xO+v@COa`2v=CY z0bfBER=N(5u<)qWLw#`_@wK)+32iEsb0O*Vn34 z<;f}3HyA7JD>-r=<@~yUfVpug!s;b}eh9oM`-`g}e0tQ6Y2c0@SKz)r-&a9euR){c z0UW?}kjPd;YYJ0$<^V@k)ux&qX$U}E*E4G|GBp}GIUHkmEYjr!BUio4zBgXc!qczl z1^V*7M944r4)Ij;j)ZWf?ui$shUOmCMHO^M(7xLoBV7IXO!G#lCq8FShA24f)Nwuq zOb>Mjt=Th|&j?o#%C&UC$~9#J6pQ^P!`gC2TsankYD<@{H~0-aDR|8sC68zrUSs5Z ziO`Sw?ZNtR0W#lIkN6Pg){aTO=A~lOupU1HLHDqs*XLXp?WzBu88$IqdkktxmbGnh zgy2Y@*ce0oB%MpC!1EZM0F4Ilc@fP5h#THCWlVKm#C&Y+FF|aFRk{M!Sv$DJ@%FDL(jiBXbS3|SM($#gFlI;G}%hA@Dez8Xzq1x zw&bY*x{*2ilO6xwbmol`B#z(exhD7ZHvHCl@+@i%Kq;4D%nw}qD+Fi`&3S$Q=%c{U zOF%v*G~Mt#eYpsJ%Y0y`jyk8}Ijn~9lO4I$0&bcW0_c^|AUxF?Su{VSR65T`^dOUA zw((0GzQ}8fRoTUh?czzfd<3ne2_MCTzo@`l13HO%B3~Zvb*7ktCv)wrP^1(J= zD}hNw@G5jx%mB<4EQA!9tgtxVGNpJna+STPL0?H~hFNgeRl;P_+SbZr)%hHVMYd~= zgz2V@4}8fXAiAP_D z85Lrbrm+UyD{YD~i1->Ejs`-vZP`_{`SX!95Du$O72! zX~`_Va9<>LT6X2D=GtX;x-%S*DB5>N_J7j_c7AqLKKQGDU?>VaIjdIwt?5plSaWA%n zzQ?wx$wZU;K_>i@N@2v7*7-*pLj0438j06hBWAx_H?u-2&w>|Xzy0`!1SH*Hk^P?; zfrQgBB@SiFv`^YV&-428Z=evbR4tJy>hZe-syMvBPFV&}#Zmi9 z8pNl7@}Sepds;bt5<{+#KGk|w!>eP)!;uBO25@EBM=$BhHNf;KqEzUoI!$8fq?)g+ zoq*~4X#CD{U*rdUanZG>{xU}<`b{G)5xoKtp=uwkZvl)hs$fMD7yN-snwAvs)EuK6wIoVuwWzt`S17H2X0Q z*5AA6gj)K+HFJ*H>#0+ErSWO7Dp^V%U% ztub6)vsDKkR}vqzEM!K=?{4e(Ivv>ZZXS_ox{qLbYEE+f>w%PZy%y_8;2*><<}Y|c zzTfAIMcp9-`+ku>xAIc>PWUw?8-OY^j-tG%sF6TDlg&%*B(X!eb)~gxrtK^4CgIRAu|#JKzN100nG%yNMiOs}4>a6+&Bwz^jA<_F zfW7+O=qZrP1$G6XEcYBh^DweCtVJ(~QGG;%@`F-#ICcFiP@63fU*U0X?2_FafkdWs z6mdd{)K47JQf9swd*7TkR0ENM-C%0_5ishj54$N@Zfk?UmU2N`P=hyEHoH99!-NC2 zK;P^6hC(*Q7Z@fuN8V*3j;9kkmW~w=wVz2NC0G>!eVer_?Kaw5^q1HM5U|wfuKvGo!mbkqZgCiw5>Bymw7e zo_cz}1g)92>tL{l1oLJypPe(h!atmey?~xd{E(UUJAaQo>YC6lbEp#-KJA|Y$k{Dm z>L^!Pjy%Jm2~L3|iJr`4&#(0M!hXqTNNgEY?h$&va8}6Z@QPrfO^GR~f<<;f@-zPk zQ~x>pB^%WWkF6`M>)Ztm{~~dZXaRNS_#F~P8@{>S8h=Ajt3a`0&*ShYYsb0hWT+X; z6pR6rczV?Aukj&htruSh3N4Em0cZ0gK$(k%#q3EL8?Fy}W*Ut-|bjtewDEur1J9kEHzJ|bhO~3tB zn&j|`*Ho|?1s8&GqW$!UTAyl8hU#^k&pp5IuQ~Y|RwbmVC>@O>q)fA>K2s`s9k#^l zTNOH*$ep!=yq=)M3PsyKuzqCzmX}swxec-Z<-l14*3DQIJT{C$NA0ov<5wRq&M&gn z$fM?18pPG#`JL)%U2RkBZsWSIQ#I&Rz7|Fio5FvBj(jaFi2J4;?CAvlp&$idvzVAH zXz1oQEpI-L(7j8!5LOI?QVpgGR#3_pIez6}gr1NH*f~u(m*TPU^C&@LTbfZ;m(!IU4bcXi?Fs9DN za?^~T9!!>jER4vWiu;E-uYr<=KfB=5wHeL(C@3bvV$t3k?)Ch(7Y21)I3du~e zgg>TIlU_M~>|b(R(Z&f~<%g=zB)T+GLC~-=^svm&J3oKK7C;|x8slGCGpo{_IRc_^X&{evxziXfl^o$h|4{4sls&l{pz#M*|AU3SkE1G!}3XYZf#O!LPc z+g6*HvkWle{ zl_Q1*JH6aRT&Cl{6PnT-GT2#!8%YfUzTr$(s|3SQ`Oa>Mh|K_}VC4>{fQBhs<0s;; z7ZVifcmK+SNbF0uR~!50sXtki7q+;m<{;O!Lg9=pUhnXo^pK#zn<}xOuPQHKmBSzF- zj~~~m5hxrRSKgDsKnZKkUg3zEIF0vBxDW(Ng7eZI5dUU(miWG{)|A{M-q04M*c()y zjN;y#nzmG8t&kqr=Xo}bZh`sSq1;aUdVPK}M$d?By7AHDSh-12=M0@(no?kJW`Z}8Td(@;= zJX7uzs%iFnD)Jr-rQ+@wJx_2m2O9(#{fO1C}rD2e`nU>plg^tWNu_1Wp^Z~=E*2E9)c zS_Zd<80Pu|rj#|=Xjttw=CT^l@`t)|DfrZM)CDo?s}RGjeS@2%QDnlmP?gfm_qV|y zwpQD~?r~mIO%rHW5PjqrZ2D=5ThBRe{J-Y_-=9qSl{B<6jL;Ke)_6Z$GSva6&3vmG zZP-~63;Ln1KammQHivEXA@ua9&w<)zXjHJl1mrUaBEX_s66R!}Q7c}tMy zGN!PlZ11kIM?3q7T2q}lNe(WhP3=sgR!i*J11T)8UkOgQ5#Qc=4#eFP6g6ZE)==Au z6Z}2KDovAPL{Wd^kGu~2T&CZC|8%8_70y;SUm1&h>oGOQ>?3#%Dy-O}23QqKd9zck z?JUGpLi><=fK@~P0N>iQYK6o4NjqzrzEnfHSzIyV9OA7vB}8+3aOm!Lx1Q7x?(Llc;hAog9M;QhpA;DE1oN>REK%T^Gjfx1cBr*mptYYV zDYzq&D0#Q{w(COCexF-W5G_d}>;P~@jj<-yb&gX8O|7?%2L1*=WSI=qE~`vowGopx!)Y6 zWf>%2s3`g`*~#TVlVd0LZ9q*qwDLabhByccuE3>4FhDgG7fs`*Q88LF2QqJdHI6K| zcOQ(on9-isy1d1878G?=5M!*9^_ZachF2E|;x{5{a#G}`_}iKnt5w57#qU3%GYfKB z_VpoZ4M|jTKe8!sT5AJ1b?0prK)KY5|GLjY^rJx1bw^L zh6<>$M}G>((tRA~gVTQLj|DNm^yp6eyr@?-D6Z0BUDm*mU}4XXgI-NV2#LDI^1d&z zvQu7xSwE%guAOu9dnKR^&qnn+8SB^oer-15To@EedOupOZXhf2)F6JGvi;ES`L$^> zw}s-1{T{*WofY61Mi0=&-=AR!d$0$;7_wK~_6#|=0}?2GDG=Oqk@^-MG;Il5?ukx% zW^wOhE81rq2Dy6H)GNpIaB{Y!mt?tD?LepFXd;F6^qm&tq$`iN!FRVSU}m!>*jWz6 zY_wnW--NYJSzuDDK@)9$yPFQb9d{UEN4JSYp(_{Z`ja=w&i+4|fxsM3#w16N=0B+Y zCeXq#&?pB3A%2X^ zBQfT{&vbRRA7Ij7tv({LMw?(h!W($`YeyrpCH&Y~8{l)NfZ4N0Ij9s-jkK)}6`B#V zz+#I^L(MAk*JUuF7iAOD>1^CQzsi{aH-Pwt=VHxp?gLKep)?zT-;cNzb?jW5P;- zPBr5{6=w$eAK@o^Y>P}V-WI3l6d0TKUV!JXzG=jVVo*6g5<>YLf@aKyv0Z>|ocq0v zi$N39^ctIF2LAkNx<|jv%9rW3@Qo+)%>evb>0?h|Ov;0MrC2GEr%Kv(!gFLl`Nqte zp0R@-pjHUtsL8F}O9JYmTa2X#?WfaE=i$0j_+YB>;h^Ys>Y(6RPHk(nSDvWyg|xK! zUm7AiFt>ey0D+3tUX}0}1Ts5uT!W+1?w)EHTPP!-2WniU3qx*KRGTo*u^+3U(npU= z>GKSZ8t|O8DlS#rtwEw5;@F;}))DJ0&+r^kP-62mbsf-0&SbqWNat zR2!}K$^ENfI86bHiDp?Bzx?LW5jb zIw{e8Fjd;(iT08^)RC4>eg{&(YtR{>$4U{$aPpozPa zl^6uzKc*;+<;yeYQE5hvoG*aS!`tJ|wX7gk8neHS!_=|puUaFy%>r`@&( zQY!oIm-AtBrIy>%@;5q$jxuEZ+q+sY)w^_LGov`+%m7K>GN6b0da~;O2&D4(H-LrQ zq9!Ta178(wHwTp4l$ttCxEr^3Z z$xr?X4|t}v|D}>eEST#Usfj*6hnlO zUf{t6wTcZ}1fJKi8;gN%msd&wiDwHT_4hB~wqpdtVpltjX?`V{(=@w8-j14+b4sW@ z^=L1Ddiq?q{H-W3BIv7EqaRQPvky5HdjH>yV1EE z!t|}9nYH&`mgX@^YQLhStyiy%er={WL-uqDC&-+rtZva=kI6p4?+l!cH>hUa9Xzmb z?&!AT-Y~YJcnqoBd)K5SV{Sh4Qy$lW!EcY=kEEw{ExBL8AopJV#;3>u->Q$DPaxZa z@Lc>jX=H8Z#ubz349DAW@#B@3T#+Vq$D*OO`#8C7|2 zo_#uJ8E5yU&4WH0yNS{7*`)U=ES-c?qj2yALfl;NsH#ITTl1^2RB$@uKwuIst(nwc z5KHyJUam6|EyC^pP))vr>U|Bp;;B<*D_OQ_+-p)U=AIEw;-+RrxC>9ZQ#?oO92VLx zxxko^U4G^YI>`Loc>N+ay*_i{@us@L+m^7lmgIf;pSpTK^Qwy@&QaCA!#b(&UVY$6 z6g%al>J{jUPZ%{L*?xqYbE4j2Ra&eACseJ^ucX z%U3RuGVGW8D1jx(60y(gS@fx$L7tI8y|gj6-by$a#x|&wOQbcwtA$b{nM2?BDiyG+ zz4w+X3j1R)+p1Qd9`=ldK&EJ{8r?U5fq9M%3T?sm*~N%mU47*O-Tv(vFK-DmhQ}I3 zlzfenc!dfQfoR;U!yt&+J(n%~E0V{$BJCNm9l%OS)juL~{QAZIlv3nj$7u$WlHn6S zuPK48+!jtR2zxJ#g}5^t$p3YPLu{Vj+iau@I5^@sv}0nM*@|~2ikFHAYWZz2M#-ML zd+#`c49jnW%Dm#Iprg1`<9V ze~8m#ftgN{nOZ$ub|%@)Z}ACtUiHKN!&qCnKhi(hvXQJwCDSkcYR{ln8kyNo>67P1 zu@l^+31zbRh|A>!?BrhQ^TbhsPu|2@*$Zu$=kZeB!PqzFdE-&S8S}1hECseA^i(J>#=h_~Pb(fcUOpxhd`k86qz63bQ2+8IUpx)$+?`3# zLU%Zcwhi(tx5*dXmvcSo5j(3mDYf@xDFuz#%;P<|`bF3(is`_XJlNOjErJ6x-U)Z} zGyG~{v2L~#MdYY|eWYd=8+xwYIS0@!YMlqurhfQ}f(#q1Gre~8!sv)gQ0geLl>C&` z2kGPT$ZL9=GjD6xy_e>Dtk?4uFJ(9Ly(u{=M`<8fD$dcpjI^K=gQ@at0RL%owbSLE|WhuE!sK0TF7`YW>00U;G@qtgdL2$6W!NiFyjdE{TVuQx>L&Nix^T?wgPtcCh)vAo{%j4u@ zv_AXvN9`ku^al{HjR~fW<291IYB5l#{sW?_M9!uD@TX3w9ycd9PS@{Mz)H7aiiqL!z51 z9uf%T1umZ!iXI*VLx|p%6`3ZlOr=h8Kieizd^7Vgi*X7Bvs^lrQnjJa0@8f9zXEG+ z{V2*@4mn{1rDr^n^U&UR;F)l2&ozoL>ZZ*K zt2oOxPs8squKU!Iu_Kk8EoM?Rj%<9 z%zj4;u-eixPxCL3AKH_iF*dhe4YyEe2Z8N&fqdX*r)cEYkSpz|VaaH8iN`pt)w)gu z{XhQ8V^X-oW8*5qY{E)lPEg$S%Ap(cJN>#A7#l0M9BtHSv4&tu-V*~6?=mZ&Mdb`N zb2*db0cy`giD?N~w2X`8VEsp{M>ymb0%vZhO001m8T4?a(qC$^n3YEFAL5PorAAq_ zs_Qyt7%~vQ$D3|nv=vP54s^xRPpfx}3n9Fu02cEY>%UL307W%=517hK%l@4A%N6JQ5T`P}!hy2y$S!5j>+cgFc&&ko%T<=jWP;ox!@ zc?tZ6@Mlt@k?V>{RyHXr+9q#za|WF#_WeXPwaK`)h4{$Wi1pcKo+5D|kS*Iyj^NE$ z=KIyt@L&~a8s;c}e;LmseE&EJX^{PLRCca@r&PNeImD|^K9<`8vju4=A~_epBfN6U zuEq8*D8(PXN&V9E+}mS#Lt=1e^6}airXF{Y;d4<7Qnpae7iz_hKIl)JlTz){89N=y zo@Q|*g~qDxd~cZD;fg<9m~{(h3J5a01JJ<;Ws&ygck3AiFL1kV)cA~P4*hCw0Dhg* zn{4hM(0g&XgtrEeYe9Alo(+eYSi$f{L58`DnNSvgrAvO)1Tb6ac4>+I%}WHW)Hg?^ zGiF3YM$?u6)HLMVLuOM$Ao`#N##9V!Dr9Ou)|-4ju6M8@&iMo?N5sR4%E=$@Z^Pc= zuQ%2>*}n_RvhmXE8TpdAe2gy6*0V}k`d?=A%UML%DrGePej z{-Qo0pnTw+a^L0b&#$ciV*$8fpeXKb`xQnh)%b9;e3sz5OMd&|DHxxunftEx#Bh~c zaedhag-!?o9d#V^+R1=PXhKn+Ibf*^xA2NSME{A;&~vm0qH|u?tIsV*>k_)3N(#=r zK<(EUN2$0Y;|wV_(eYrGG5kIG+eD4aCs9#Oe*_j@xXsv|-+G)uLs-Ygt{l?(9Bi;s z5vB1Qd@vqej2;xI63l%x_Q|7jmDG z-+zfJ;b&33S??dF&@N!LaU`g*eKmxZ{46_KFc>Q8$ot@0`ob)Xx%j0G8PPC`ceDd`!q>i4&ucKXKBKB zJU-;p9sen~-a}NxkS(L1G7zsqKC<=nQeFBnx5SXB(~zb15)%qd;|s8EVtJ|2lMp&4 zPFN8EYLPaGuf)ye6kIHXcSykP{44jf7xU0%{ek-(Zkg3o!*K1YqefilGzxN6 z8jSx~aA+KQ2$XOU@zu`mnUE?XNJyBzUQ(IBri1J1@17u!-I}S5*Cx+A>Wq0`QAnL^ zbn3Z*x*9yjh2U!|9`$XkV6DKLll$}LtBH zZhyD0vupp0{Qr;hx-ka`qt}y=VDQD*BR~5qW&PjSj~%0~2(0gizn>(S+|c%e7KukVcVDa+%YC#&dw}yt z5@WBHvk$o;P|wdrPFZ;L%QMLN95oDeA=>ZHCFk%6dDa)hIQ7(}H_-y0{vHC1v6Z3X z`J;{-EJ_N>^sgLz*sXzHMea~;CQkB-26cM*De8w5nhc^q9$B=I&ao3aEqt>cTIO|M zj$`x&#yfQ4)J53SF7=2v^_$9nL8nYW*5a8VW%u;Ol>o84HsK{d-fwzwRD}N&7;6l5csXCzW zss=0THjYsS?|YvIG_d0UDflx9CPkB|prMOpLmF3VR!6V;MVsg*$Mor+$1O~meKq!2 zd>7_VX(C_ZAshiW^0B^?9TDpM6-Xu)?O6*JVTr^jOxf5zQ7R1Qp`jVKLJFi8`)N1L z_9J>pT-gG-)DY{4Ud0~@O=t}Dizm0X<~Eh_v;_`^yZt!ko>{3}S>QgROckHB@paM- zN%r}h3Ft2V7O>OnLwzy^0+Va^a=RR~fq2N5m#*ctvsU;sDpZtcFS1OkezvM<`SNCu zo32u?9f{VP@bG0H;aL+Qv%ManncuW+0pE%xpHy3yW<+n#T11j?oon<{L@l1Vh;zCC z|1=LqRaZ-L8|SbI$4q$PyQ#P16$}m>zYqz7Y2Gs>VhAMZ`Ck6AxO|)y(XLGgEwrZH{(G9zE9&E) zQ?qrj*dS3L0IyjP-Y1_?Gk5(v?QC}R=3Tb7(NP5c(=5S}sG#qg18%EauUF{9P5cd> zP5f02Kknoy$Cu+8@ni500Y(V({AY-*o2H*sXvuWFiCIsl=R8uGI-k2c)q`fw>4tdX(yEZWYKWm)FCIn=nKK%_A5+bYu+zZzwj)1BF6M zrA{9fnaE_Ap!K!%1iN4}pVHhy(TM$*4PzzpZ#S%=Q0@cMdopft&A!W;M`5u4Ipl9t zMQLZ52$@vkY1l}lbB+nWNd$n7sqnqj98r|Se3xti{{?@CM;Eo%CL(QEQ29z|IR>>MF& zV09Q3`nF6XP9OWA!gX4#v85REZ9nG^lqxerm^H;=p}Ogb+B-=R$NWF9hN?53YZ4~m zlzq2Mck6C*k7Ada+x?x$HPzg3}NKsgA3REk7wV5yMc5xx}cmi&J|DwLb+1SxZ#n@i@) zQChuo%ra(#(+R|mK_!p$_c#5VsG^;_llqb!wCOX1(97Me{0u&Bt^Yf>1cV;>Drw1A z!BAE;?f76T^C!XbNT#z(nR8xhslYHy*BOfhyXStriPVZiiCnaIp`-px7A`7CV8?ik z?@C1yWj@D;6jexYZ39u|zavL%^Dx97lQ01Y5DI?(WEvkzPz)-i<91S0nixrdx3v4u zU;}R%3i4X7;KMvY=M8gEmG=AL2vmAyvqC6I@M-?<>;$!!`<^SkQM+b-BXa0J695&x z=Ny9_N08xpriaLVNFVPRpY9)!g!#ny%Q9vaL`E?%4EGlY#n~$iDvJzI*Z+5zdoVF7 zWh^nVpw2KWcaZ#N+zd-iAvz{0^T%q}ap@S#{A3?GO=Mm~Ik`;~8}rU?CkO_jE|32? zR{iQ67~G%zu%!dp!cRiGR<#L2p|_c&X`AtReRtISkH z&Nw6rDP(VlLx*H5qf*LJ%e(}DGu5f6SY|oHJkacJ#Epi%rwWLE zbRG06P8VhR?+@XOg+DT|GJIqo5QTlk8o$NRGqAAzs{b-5O9BW5d+z)e#Jf-XJu6mE zXa6s7AUL_n7uKI&%Dr&EPNV+a7p6tt7f7S*&qe*0aV)LaMNX?CL@25VpChEBkM0sA z2)qsX-@^Zyxl$HzrBA%2ETVn`I0RZ+F)gATlm2Y7>}#@w7Q5Pqw>>d>l+u505IL*e zCez4T!bIlkQv1I+cUxTW;$i8+=Eb(MPDy0#=_}~YKC!9O#@hMMJ2at{4{QBswZW-- zrqBp|J+|Qt;R)WNScabH^}iY4xVv^mFCQDCX9gK9LWk1{iexHg6w*`R91hP*Sb)x6 z069S%Yo)GrG*iu5zS+AzEmn-j@bma^tfG(x;g)hg^2Sh05 zcm6+ep5db&G}|9b2}Ad&Bm}cNw~m#ZaV1aM-r~Wu zUtzL~cOJw1K9Su755Tr4-mm3SFkNQwwT@Yh$ZL$Kh6^*4iGvOJl~0ML<;Ly zfEF;>8HhHY7|L;GMc_&NF2_cuT4@aSmIy=FPFLcvLt)d;_`847G$aD=AgZ(#mVS4p zZqB1ZPk{XuC*mwpog%vtm~PK&$v?6E0Z4BpuLb|j*k*V}RC46}0>4o{c9#K6c%8}4 z0df1HZ{5)c%p7>Hd@`x{EpHtcuQw*nMF5$V>}&j^caI0I=0Ytcs8d}GsfKoYKs|J02-Ls7zM!D~$o|_rz~`$1 zJ@X>Sfc3FM9*mFe~5VWsS^W&~2+SONAh5+^J zW)-NQ=6ib~QpLTm=K94DU!R$ef3+5{8J_`f%yWQ6ad)5O=>}LY^-}*WF)V8A1Kyyo3JV3rYL0#K4{bFxd1fGs)~vEz@ID8kqq;P} z|E{cnBL%tjvz}@|RZ^wFHJ<4MSo>%MqZfyk4#gvQZ3?YKlv1Xr5PxNNLrsfSmE-Ea; zI>w1??6zy)g(NkQui)IXg!>1ORb!n-t4j9)R7*Wi4kdxBM{l18oX9@+Gc$8$uUG>X0UG(K7iDS{ zlBxei%*9~jhum7mL-HLms>Jv$(WTXOR@Alik16|Sk((e~-=Id&%qzCBn5+Tg@QNR? z!og=uc9rVZ6Ww0De%GaR4EB?sWtcWxyJx0i(CBP2fQ8>a%ZLnnJD|rsyQ?FhOA>j@ zy3Y8t93iU%Kc~VMg=(>AJ4BZ^et@2gIaDQ2sdmxWsV;B7`KR{RQNSFpyqS2D**SiX z^yls$m=sKihq-_rDdgCWo|ajS%h(QQ3=*IXC*4M%^MR7B*V+mLhy0Z{*HI$~KQ8sy z8h+%A6(9#ut+wy$lzUi`emN#c4+6vCoqw*w`GsNbiC>b#m?PMAHUW;BiKz&f3Y4ka zo3m2XsisM6u($w}(LoILLz}?Px8{@q_ZbLV(@AY8#B4Yr+lGGk?3;k!I2C+UKknX%2 zb9q3&2ip5;&kQ;rSb-F1^Dn{{q210L`q3_jxs7%{>b%e#_k7gEH>S{;@%Nj3s?VXO z%_5|4WK*I@Vi(NX^#`!UrY(mlX?B|uw-(U%1N7FuJ>2V_SOG>F`#g}dF8@(zjzA7$ z9s5Lu`0>VP$Z+n2{%<1$>DA;BP9vpOH-XVD>V|hK>n86m#NV$1U7g>%oV3Hre3a8( zN8oW+aR`4Y5Wi|6cX!c#=QfY+Pu&4sJYu8a=RbWg$9c2|O$RC>kC~n{XUu+LFDv{P z)VIzpX~R=Sbul#7JLd0-nHP;g8mz%fdhmw^Df2JRDsQ7+Ea^+W4h!ci(5@DUo6*cU z!Pi6R#1NoHs=3T@lqKxaIGicWr_-0alpxS0Ab>0qgbN0+Xcy5qNF|XK;tEQ2=b8X7 zTz+m9uH5NyE}qrH0^S9`2GGI%oCh(2=pC=uFl9M21c%DCG?b34u15_Bk+;UAHiqxSXMg%|Oq77(od2PYjbvmaN4Gr#ZH_(auHg)+V1fAe zCAWguCj6xQZxEW-TLvr`lJvE!YVZ7S zS3hBErze<4h_(Ir=jmNIHtZC>=MU&dgq_zWtn2WBBsz~aDl%FO$JsPKnWp#1?%VIaP z`d5Xaj(=Ke;?Z_V`hqR(aST1nd^E~}6taG!?TmdKD%`)@>JXq}s#q<|dho5&4K1z@ zX#mUq`TP??n0HUm4L~;EM5T;fx_UnI1iy?(?4Mu`T6peUUf<;ig; z$HKEaSLSMyfrxTIQL;r%AcI7k&NxRQ+~EbCXw4er~9w{ndj@xt!a~17u?vTm)OIsa-!6)CcRfqR9$jVSf0Q`)Tk zKxHOEhDcK}m;NH>;;;UfcI;#CS|ekKY?&awvbP~C2vlFQ8w1~D=U=F4nbFL4A;J;X zLPOaA+~~dDp<>_17r0chnW$U&?ZGPKaow}pc)fFdL!*=$$Lv!Fd!m&i6Csb^Y|rX< zz3M54D59wmABd^gw{ zz*jy_zf3gIN0IP3n5!4506Vcqa!}OVukR+bEOG9vpws`V(q(Cd&41` z^={eB^|5ELITC$Y@$Sv)wQR{I`sp3WHSRQf*OQd7Q3lzygR_D@T zi;VF8W7mJcyeb$;&HbQqAakD51VXnLAydMeZoloq2b(P!?0?EJc6!}m%V8D# zDc6_q2o5)e%np9)29;_IK+K+@X-~^Fdm+8maeRw3Gvx>bL8-WB&!B%}yy!FL2eNa| zP7A=L)}dbZ$sHh??cI&A+U?*0S9x7!OL7Jhig;lwIx+S3y|7-~1(o+teSH2xo6y zHISv6mT6igqvnyFScS!C`Mcx_57mD1+(4JFBQIxfN9BFOk=|4Ev5G8*&xouEHF)c) zxRUF3Xz;(P3Jp7Tsrb||8Rg_n-NxM~zZKls9naM>TB$DjnXG+*OfdJ~FgM9IqGYey z6aMq=VW|4-a1xd*6oviHlsKyk6a-OjRRnGuSVq z5ePEztv@2&rc}&Er{vj2SWl!Fj`~@ZS0B8ETwfh27VX4~Wfj*Mk-8boR zAEtb>?(f{rNju<_Q=M3U@zEy#Q49@J+~1}P7A)Bk12;;=wf6U6S|34raq(pQ-?p=0 z*t-P#Srot+h$7db3Atjxw0PqSVr?Gdx$;NxDpF1}zJBn0hho#H(IYADi!TkH<3my& z+uk)icM+27%Bk+Dp4L0#NayopxX{X_$}Ync4|G^Hn$uEEch2Ls2b~^|2n~MOOp{Wn z6zq&gv*_`>=~F}7(;!OtC=wExt%qUt%PiLr55!FqWOduHFlBsW5MzO_H5Rhy95^4l zioe-h{lwGb`ING9eKlWD?48rXUWx6hifyjy#e*ux>ut*ULn|qNd#Jmz-#&dV=9h*7 zm&9cIxSSmc&l~y`h2kjAQv#ZIwX2lhHXCkg-CU3#!H@jk%uzZB4us@S30Q0$3pmC!#a6l->huNJv zl>0CFyl_|N3{Qa^`AEY3=*{pU<*$C>hMY@vp}bkPNG#pL%@67=nn#630bJ zDSO5}gY20ZjRyBq>nLU=NrcI+%?b-zz7IKu1DwP z4>Opz-v0J)%i@L&Z_P>{Cw*-36C7e#XE%?m?EY5k@qjl%961EtQ-o#aticPws`1>Q zx^lX3LfX{7*#4}mW*Gwy?IahbO-?E0h|JMNbJocqHH&RVKrtm1Fad~)Dyk2u0W7S} ztLf4wlWg}J(16d)1~UN9j(dQoIZU_Y;1LY4R=)Q^{;$4lW}+HJk0WT$as1*idzVvT zy0{79gVbm46=u@X- z4=zmk_<-&%gEG||!n&!4Uk+=t7S6*GB`OR#i?4W~shxm|=|M^W@ z5@FV$@cxhd2w4ceG)1ndndf#ET|hZ-Z_|icP7}+nid|qc-Wm4w%7ghnJ~(o z|1WGlwgE9mHmxvL)^nI~xmV{)tIhaEdX9B1hz|1t3BG5JoONf(`zRW<)4Jxe%0=%c z?cJel7f2T>^+|f5{`U;$Dr{a)06+<#_s_TVR(G$}Q)?CpZSk1>_)x-;qW1VwJqG6p z%_qy@(f7aCKAn!yAcr*x9N9yRow>pGWh(O}ppoHS?o?sJD^?eb%HHi5OeCDARH(EX zYcLz$0fo&);BM2E(FRvnM*#k%xcl`R*V8@DS8lQ`=Nzl9HgZMPebiVccQ|LXWd}MzGO7%9LJ@pmrcNO4ttaUR&F0&Tfr~9F z*6ozeaKc@1>&ox*FX-ketn0UGqJg2bjAt5L#@kmQ3Xp_;SwAcmlL==km4G#RyzE-I z)_rgQgb4!IB(#FY0ZOiSxR6fPh|*lN{`NmEKyO-m8T&95rPnYKqG>{;M->1zQF-qI zRIR^BaWky?w0Ew1rleDMiub=bUVEAqw$55U-)JW$V3QAWFXrXWHHwF)rfXPB7{U8b zd0@y#f18l@_y1=@47`!=;;k=<#lbQxa#cs)s$OShK5u zSbO$kbh*_loKys|_BQ-!$0c1B$)*}Yk7<;J+;?&BEJ>g9=#quRG1@hC@v($2t?S4( zfxF)4;2#ivh>sGpQ6DgIH;g_a&un~Nue|)@bbf*XmbUULLgusJaS9?3ywFBS>YPLW z?6p9`a4y*QGXi5AhVaQET%Buzlz~!|*Qn*-VU6l>Psl<}fQ#Xl^J=S=YtlE`iTCMi ze!#qPexLiH#HW+v!+APqjo5~S%070dywzUPq^-brp{f{_wFdx2P}<8o%5AnCSL+C?Ut+EPfeGN=SzbD#Id-W7 zd%h?H?Ee}2n^V8rrZmhKZ9wLmZ&P{9ps_dkGr#fz_q&k{kRbN;(1x>9;1lVNj1dny z?B{l!oR1+xABuXXk8UMhENF zfbYv{s>KW3on_Ee{n+kQ9|nss2#1FYMlD1?yiDK3ByuU!2ga3_lM8NZ>*nLQn!~J! zfvlMNSWF)68!=ugz;#*`<+w}3Rs;&+2)4$!{##;#$8Ed9g_))8;@ED#XZm7efoZjK zYDGqw?)2@A6o@;(hN5qTS38+7T+w!c8`gH-*$dQ{30QaU1J;>^yLO5|f}_$(goEA)E|u+IbC*>WRkzOJ=Dz+HfwDvdN2 zE-H7r3{Su%cwMuliz-1N@>P@a@XMt>>&HDOmLKi}QP=$itZey}@6F2Azz278Vx6zm zNSMGoe5FsY=~y3d2Wxh`?-cOMIhP_fKYBi-@ApS$*Njl$|K%t#r-L3YQLmpaGWx5s zqkVwH97HY*B<82Y-*{)mRKgG9hd4|}`Ga+p_d8%x?qw(wW(D1}q(V!B^CND5XGD)# z5CkgO7P-$rT(0>;2Hb~%W~G*V(591F2J-du{1925Em4^rG)Iu7w$KeaqtmrOt$R3- zQu3|63L->Iu}^WBizL0e0l@I%$~>jtP0#vf>qKM3Br<~k zLm%!nRR8e$0poww_U?E&DKs(yd-1eX66Xj10#5vL0+y=vD~ z()6D7$m$6Dyd}yF&1h3e0{u2r8*LsyO!nlf^!C35ZbqGALc8|y9(i>4#JK)?@~H{p zjlM!W%$+zB#4dMxCPzq;UH%bbq73X956>m=jr0;_NTUBD_p(UTLLu^@=!R zQGG3OvaF#De&q;V6e4vf#VZ078QvFcHmn0q)6qof$bAL+mSn=%#Y!o-V`mk&XLIxQD_I%VdbkSki$%ak(MyWg9o1o(y^m+bf0${Exe4xh>&XmI z6B=LBAn|ez;6jPu=NPF3e|+7HJd-MYcYj1MDN&sj*r(FmHwd83o7Z7@dx zr?}Elh^Xb70$nuoQRh^!2Vxh`^PIFF2n;@QqPz5>PDQ!|JlM?K;vNSt%(q^>^K$do zffTynd*<%XQ2qzMiTg>(?z*SYl(nZ$?&u3kXYQtjKHCa{EmcqM;#*q(wteb6(5b&u z>CyQPqx?KsHo~)EclJ~2e(%A3Kvn*Y(x&lm;~q&|?eZ>vw|+xqr1kDkGIz=uW-^s4 zZD*YG6V~2)XbH*Ztef`;!~o*f1#0+O?E)(Kl+1tDNQiuPOt+jJxsW|+@|Fs7KrtuV z$X!w(I63s{eODHq#0(t~WlyO0ZBTeIfTpqzx~wN>N`G-OjxydwyIdXI#)(aLzDgN6 z2b?2JA#3*Dk@E1klpYQp7#wea|BUCt&82+v14cKl-e(4)==*`mn8Fka>HiZ*F&9B< zhh4cJmvPCLce)emUgYd22%N z`MN-S{gy69JY^^B)J2Keb%IZ&G<46(fZQkNFf;wtzv74Ld7z_0u0XyHu@~Q}B3|#? zw8@#l=jZ32W#8$FkbJoRBPmcmzd4}o6UyApo$`8@<&c=NfK$51jbT(DV62zZ zy8EI6^Yan?h!E@gh5MJ_nAlALq(pBc-dZ8h9hnfI2Zxe|hz4PT% zl?+#s$qrP8+|{nMI6~YBKwH^~SnH;!r#WVd2e^SCh5>;YmPtBS0&K%P~LZSf_ZJvC+NlA`1Cg_8?hSbvsAJUw3(% zOFo_uToZhUaj|`wRw1IwFtrZ?VfGr&-5#~Qb3yGcg54;Mzrd`7W7+*WrC`p9{-h9d zdAe-JN5cJEYRapEX~x0_>%XSYGbggX@w8oa>Hfa<-n{PdzU+8F_dJ52g_}i-gg(eu zmLVCV+#lB`mg=L2;*3Ze?`O6Ld1*C->bk8)#G*{v)C+#1*Z6R6<#$!=DDBW18j(GR zK)ra5HZ09p|HJQHjAO6BTh^!5Ssxf+6*JDtLOXJPC2C<0JGfY;J%dd9ZWoGVW^PhO zuKD3wuI9_PQBCAOfh9dUL++ILh$D8u_4$D+vVeW0xneSa2V9Z6NQ>Rm(MXyOlIc?- zZ*BV{(KmnB1a?<@Z}zC|Wm1E?Rei<;Wuw`4n7|`s+Pq8dbk18g!s&T}J6HGxe2Y^p z)l|L_HR1Fdr)?Gd-!?8+P5b|>uTFz2tbTNE=|K+{%OXFUtykkxbBjLfvE+Q2!OSJV zWXO`&zd*&Q3d1TVdw0Dy~AF_68ra%f#(Gl!Y;|S@pIbEI8z{BBKm9^)J0(!@R^Mcv+h2ty?+gcgp=%-wSPd0j?1Ky&Acu6LTGZ2PRg-W}fJz4}01p zF&}N*Z&k2hWseioDvr;vP;>Pt5U;NUaO=EAF^=2`-+JhyR>RkL6G@RMcPU4=k5=d6 zTSu{xu+>hzC8-UhurU+q><)Fn++ePRqYAL2D5i(e-4_m4dA6_^&*`MYNThv?$+ads^6S0bM9IDXj{KtIj9ngdaN89^w=NU zcXpy;ymB#!VY3RMox0gEzgf%S^o=t+$hESbM#uhmIJLDaaNRG5x=u6HM(tYAwYEK= zu1{?be2EVs$jiCyGgQxMgm%}sYIyUu*$8D65?Q+|e0m+s!oR(l=eNB7?FzJAS&$lLbS30(gAN_6nkXT*2r`{G(5w)BmNgiBX&OM*J&OA|aKtd&F_M@o4 zjoSZ$@1WY!;^^lJ&lX>?wXCDaCZfSf10Q!jPvFhDHGdin9My@&nYHbc8(7Tq-qx{52w!5daiu}WHsPOqd0oFX9yc_G1Yk@-k3-E zHQwMv%S+|hBx1{uPiS)D9TC~XAp79_N=`nETq>6vVj)nD>lYF|pzlT+ZD0TjCX{ z&AliuqffH*0>k2=M*)9y2;|kkJMd62Qbgc9*`ZIR8joE#8<^+)(;{& z_MFK~PXksH7c~WJ>haBCz@xcc#a{ZKZ@?SWM|uL*k=*Idy=u)D1}EXZVQV%$<0BIi zgIs`3p|7xNF_tRwG>-8`7iwgy5UhRse-SYfd4I*wVtq+P=-by z&|d$68J4N*1Gj*T3osDb06itiY-#sm+;w(O;+#O%qkT#cqD#YB{;d)q_E}Ck@o;i> zHpvLENs!{VWG+9u)JY@L<4_rr+l_qfH0J82%7KGjMXv~0W|oK#@|cs0REEUes;2z^ zX`scyO!76|8LzA~V@8hfyAs$c(z-KCao5kHhd zCN|r~mtyGzl@$N?7*aq@SmGKr0adwRErKtlc~UD-yyUr#vMk~O)z~t+9!OkE(M2kv zrg=Gu$jV@e{5!*C|D8uViaoaH#@UM35%l#PIVwIIfZHP0)efg9%8q0hMeZW2^S7#y_(*)Yp z#buX^aNyxz1AY=gzR(ZNB}Rwz2bNtwC&8z_G^oR?1ffzXCKYhu>q@`A{q_ZYz>UUA z@~{E&Qjsn6Q2`S2RI_})+R$<{V(}sy;I|DNvwL`TKxORWd7T%tDtt~yN%SG4&wD=G zf$OSE1}mYh8oTSBc{B6V^_R7!-W+S@MnThjMD}hnP2%!hh={b83)ZPP4|9-n^LFg1 z9*sNT#`w+UUG%@XzHL^ZXrxpgX7fqA$lEJKU)UC34?h2^Kzw|ICwWh4hd=qx#Cqs@ zmahd%L`iyM|9Vg4i;V(*o)i8PHt4;+!rUZdT~8vI4)E0@BO7&SrPJn>)BpiYrCb-? z1%T!6dgdgN%ZT=DyaJUEUO!E#^7mUHtcr*Gbk-$G{oJdsh#I$h;x9E2P?UAc;llv} z=}r2_>C7z@Cpo%1J{BY)nc{%c!lr7M`eli)>W>Wqp%o4fXERZ1!Lr{awh3~bGkX4Z zz?&})Z=fpBfj=~^TAKVQzQOj^|F1}w6npEiW64}cmGt-u z`BpzC-LD~@wq=R!RA@vY`dwg9!>lT~V2zuz9&FA?ve(ON_bZ?4>{VCi8XQ6chh1KV zC}tsT-g<2XNpi%t29)uzjEP51zp3WYz4wfUXfze2N7ajSh~z(a`?le))#I(-uCEq6 zwE5-vJ}>`O^84YF#9iASvm~iGM^T^c!`8p?*3I9Fix6Sn7G}O?C@Zi{iqzo2h3%fG znQMU;i%uNuWPn1Y@Eg7HU4)wq==ihgkfO!2#gK{NLU}ho;1=&85N;`O9o?lCjhS%^ zmcSv7>09Pi(H&v0`yvv11JudyoUJ;@`)1u-;$?#Tk?F%k?!Eo@y8R9zZ8$#}F{O)|f z*lM>3SWtg<1moz`pr^3>aREE!uo^)s*bNcG+i3rIWsrP5f zw}YKbLFuD<;ID6^x{F3GL%Uc9f0byC>R~_=_2M)L%E_6kI}O12q{5z=7bz3&CwM7I zWKU1g6SvXU|8D+8vhp>cf3rRIs|fW{n;z$#*F2zhVrQPUV;L<(SIyf&f#6ZWT0*a- z)V37ZWEy>d`>VWqZ9nrU&BwM#Ui{d|2DYxmLjbg94qY7GIuEBVl^GCTH?(EaD>ypg zijuDMaXKJ~sHir003xEctcq$L)#sTO%24rMyhHzF@@8C9qz}KN9A~4lR(x#)6ndz5 zm!3l$ykSmgW78fAk~>pBs^=+N7nJ@|eGc}zqf2M%bYx458OVeu53HG2!gB~%$ARM?>+ zjFb!V;>V{n{$ww>bQRUiK5qp}2IB0VAkLx-eV_Er>E;5^B{y5_DsB7)CiUB78IOC< zi&Dgl3{ju;I8{~*4SQzv{iy2HZiA;m@d2WTz|YT0Z7d*-MaNFN>v-XP=%SValaMgitPTryi>#u<2(c`^U`+)_Oiu>RyL z=LoBVrV;N3%s~?fDZTX-%Q+iCv>fcWKM|mG_#3sR8o0A$dme+Pq9tYHcHj0poEUkz zTN*JD`vCX6xT(p+(o_<69B*(m32T#WGUqws#GrBIaT^VzX69@Of!c@_>H%s#YR>*U zd56p%zZY6BZK-nB+xol-tumEJj}a9oj3CL|In0*8IU$CSXS;l_as!L0t5YTAIH99; z*5{Wx!N3(H0v3&Ktk$&3&+i$LZOJi;aN%FUU7R_Q(1?76Q9eUuO(og z(n`mFg`qDbPnV^g>62vJ@wzH$8~2sbz(TDt4N$ zTqAmxPi3`NCt36l2r0`oaw?6|5ID)H%Bwkr)WA^a0E9;dNbGTeR8#DYyK!Q9W_zrh z_VAFgx8N`SI$o?T+FrE_Lr z>B>lhr16J{M=ceUWY_}ZW`N+)^q6>d+T8|2{7Lxtiaz9};y7Cqs!RzDE4NGEwb zQ+?^K`Si8VhN2NDrp&3dP#4>E+a4;>&!WgB)^Kpli-zn|?N0`0-iwp^^3;Figcy1HWMS&o&xUtBG_8zd7@Dq?Z?*}&5{~K5F2B|GseB9V!-(#5uJ)}WWZ@I{7 z5hsT{L9mU{DX}MOfxp*kh7+OO#@Ua1tU3(sj9hdA^UGgRYYBV0ZU1&hq^MRjlF0_9 zRowC!e~%pmmFSK;H1p4nLNI@*n_=_Po75DYlQfW3jt!n(#-ywQjm^Qrd`TXjSKS`L z!*zdSPPr^a!wBMp;Kq!Z^8`&aR9+H&!*~g6+#=Wt^_wZ6M^@q@m~pWq`_LljZUa=geF?bSEF z(>oEo_2HtKipus)G~J^(f*${^oC>NOXkWatclt8H{y8!q5m*t92(1pqQ02pp@ePcx z=;OAay?zFEP0-H#stJW@k;W*`RFv_fk516x8W)SI0>M1_>Ky~tb^2KLzH@wM+z06$ zd8YkE{;E|D>QcJ&^yR3?|KPWSV0$ZhkUtah4Ln^z!t*08p+(2vLTcPQ%|P9~Smpp0z{0;1vJ z-c6Rfg`#_e^-K3OkSMa7R9>J^Fi?lX4BzqZoc2Avv--2z?+K1SyW%^+gP32blJ88n&R1?nZ%Ix)EdJ_) zZy?eTnyC;OD344-0oh$)Xngs=vqV`z5}YNImx@DltM+kfXsIrSb(+*fLot9%|AUTu=V_G*g_ zjk?@-u2Ps{cxmC$pYPH~dgwX%kO#7Dh|oe71x@ChHjWV@Brz#rf*Wo>Ea(0&!Cx00 zLl=~}b)d(HSCqd>&bp`$iUASX<0k8@uI2%Wh(e{J@(c9ZwgItH%;!#M6UBjjrk%0=OM*#+@X+lnoEA@Dxww9;-t} zlK0v0Dc^>NJ1xzOimW*R;`IK+)K_y#kUMdnE2oAr&4e#R-XItgZVMorsYNEN8N-%B z$+gi%O3)Au5?n_ih;krx_#?#giiq;0%ETM^HCD8KC+x9`s8ji#sZ6*x9%jJO479vhrOkR&&4X&=F0@M&1gwSZ&NiZh? z%r@sm5AcB-LxY-QJ}v|UypnB7yGIo~9CarvU&hf1;dUk`XF16-o>XVZz#2$NQuen) zL2zkAe*f%!!kEwh4)smjgG^Aarkt<*T)7_lqw6j?vKH{4s?b|fn7vkz4KX*@2)b(& zxSmf(qc1RqE92w^TrjN60)G(>v;)`X)9K_1p_LQfTab^8Y9KtUkW!dIVD3yklpGvW zn^XVb;8wX_<3KAw`m@Q*X*Ws%2J+OS(Av9i3||Zeo6Jr2OdQGd5tH}M2{mQbxgtxCGlBHvLUlm|O_KD*vA7;aA1B~Kp<*wM#`0*wntDV+=4-$~T=e|#o_PU- z;UTg99HEJC(b(aW0lz5J<%R$;y86`T{4-j}!9(!U8Jd)(CrjwTbR*+0(Q($BUuSWB zd4vK#i`qoGlGDqhg73MG=Y+WTS)>!VmIN4nO4BwFQT*X7=2YLoOdtnC?b%I1=V4;v zvdG%mms8@TcseC~9c6F<*<>?xZ|J9B1EApphf|?-++R6B>c&|)l(J#MZ0b*gID8fV z66>%XGTr+YW{qq1mbb^)XUigu3^DTqRDiQSr?Ol`A^#I7C(sz}fT>dI4bCfFS#oOO zJz_=b*u$DUtKK->F5h@=a00S8V`h=g* z3)5b~UnYSJ8W9p_H(ViNq1p3zVY9WyF$7iS#kJY9ngQB@V4cRJC#6?@QF={H%+&E( z2U{MlX`GY$*`jg5BWNk`C z-3=@=T0}m0BO*thU#f#xZ&{zqz4; zhX#*49?**+h<6=wMRYQcom=g>qp*BeB@k|!1DCl~#pFWAlzJcyr6z;RZ2_>_ecGyk zE|}&un+FueQW`7W2b<_3m^z=ZZ5AH6 zgeAev=f(mn@GK6d#!p~>Pan<$ytS{k${-(5w&^2>s1Rqb$lW501HPNMA6_Uewk;KJ z0O$)%CDCi#(h}mP(QEFZ_lYZJQevD(?+Y1aci>5`yKoRJmm>pZcI_!A*D&_{HgneK zwumreNjHbLZ|zuYK7zapr~~OE*SM$4fY~c^vtGjSg)lPbsMp}z(bkfb#qf|g6Fn=( zS|FQ6gmY~D$kPZuSWrv6`vrhs8Hzy2X3*(XhH22=qo3d!g@fGpGc`#z8A&}~R^y%%h!a3m%( zY2*>(trj0kip8C9gHU*zaDQhHmiP%q5x>MXMyf<@A~@Z>#A9br_0`e`Qs)@9 zRxYKbC+zby0;5FGEr2QF>wcQDU%&a36be%Yg+?c55cppUS`w+0pVEb?s58sKhK(5R z;0x-|uNZUEl|9x>j=76HoOI%e;t1j#&6E<4jUWlqi-OMuYi-TWJ;33Fe;5!ullQpm zfkKfOr(Lf7;VJGcQdURC7u9%`Dlee}T^>^YzU|m$S-=ZzV~exT(4AW?{H1Ybk>9J! z-t3uCr>iFnITMLst@X_Te3f4L^tFq6kxgYFKMx9C`8YpVYW-F(avDjIk>cZW3N+ye zrfCnJ1?!}_&*mAK39~A)gkW&U7Zx1v{L%v7S%h_Ht@n^`&h=)`QrY||&S-ssl8{3U zc*dsmb6f^NPZ?GR(=9D2af}2_Re?CrZa+o1u?4tnvvl@zih*Go0joksf6M$rNcw%GvElfoLf`u^K22s?90UC*nQI8O!9nX|G=&irG4c= zuLh_u_BBCT=`o$x8JuF@G4|HgH9r#Hfu5Xj4Na_Ps@KqdTxEwKhR+~$T8^Lp&=))+ zi*d#SgyXyvrj1(n3>gQZf%V@gkE>bc(?Ll-spZ8pW(4nBS|B6H8!jPC(Z#eNR9LJm@i8fR^ZPp=C7(ts~A#%I>U>bV|+ zCEDw*ad`7^4D62QY3c$w-!Nepl%qBWzdrdxXDA-RShw(s7AO7>W{{G?3 zqTNQa$cjwK=`y`%2DfEjBCW`sx&X*t6 zEWjv1DCMMDs}(%x%Ro6*iIB7Ix%6f|YQ+ZMMGlHvj!ZQM=p%+UVjD0o)VRK50YIiN4WU|B$1N^OpXY*c?lyzX>CT*BaJl>)xN$)K$Iwy* zjVS8Fb=>6smEqv|-t1ixxHcqg@6hpmvOz$0ha-9qATA~JF;`Gl5wUpu*O>dMgT4t; zl?KO3ebPC$Z}O4Nv?dajOh|lEtw9C*2LOx+XqhqZDn_@;2ePzZTj5cr0D*U*H z&I;d-t`>O-Gy604Ckjc?pCD7aHAt~gM+=?ARtP$($J&RVKF+bY{^p0iXssbm?pgfa zt0@T!?t(?6RTJMMByy%Xt25?aSDM7wxE2KW-0}5~>+ov6(C{ftp65sW|EmO&JoPxDh$$8yx zu*fj^S=!3VPPpMJlMY*fjM5q2N~9CB^@f@}cC=gti$=G_$o0eOaq8%FisBcxN*G~# zb*)ovoPGVo*057O-$A4sH1*wW)}QqSbZ2*E zC^@4zSA53%(M4BYcB?bn_uAQ@V(s z!2*O}^os~&uaRZ;J*h6Y^s(|sfYLR9_Wx;j%$8&Vn}YHe8sWGd1#p&X4Yqc2f#1Z< z&&)xmM;oB*0u;0sTvY}RWxU0|mp9MKS(5I6Lt7sgN>DU90Q$@IFF=mFHF*|z_9?Mp z91w)B1$(bDL@cn2b)mtie%{{9;v8|5(la58ic)Jc8q=LF*B1zP3fnjH_d&lSvN^+j5==0@MxqE0npJcTBy1cimq z!I{X$cZ#+~C!C<#=W-({yoEedU=;-_2JH9xr3_*kc7%l>B7 zoADml4E^LXJ^rNiXvbyaT8e1l52Xq9G}YZwbo#wA<*(mIM>+UzA+F(3AKx0K6j@I` zK$FjbwpOz+T^x4!)4fBxx}XQjb7MZ|4XG1#QiDX!M2oVZx!jBN7E#|mN_Be@PNs}i zXVNS*i?^htn_`c56y9%)y0Vq}&KvmYO)Ie*tyxzznWXrd8@#Kl(@;AlqKrXa=_fqF>eBeo$@S^P6&rZMoeBfv|8q8k!m&RX_xK}-C zK3HXDYdj@1Pi*0Q=8kgEvUppR*7w+Xzw32qh|R`(scyOAt*=jO<$KRF+}d1FNUa|n z-{^3aTrRClE#i11I7+w+Z=2%y#pq#>OAuIm0yi}{<@fp5R7kY0tSJ5OH)jn~o`v5( z=X4d+`@xr=3dOPOz4;z2=9V>zWscnV%I(OA5li7(^hrJTnvOQOawS-zc&oakUZhu@ z?d<~(t~e~CdvT}o&7x@~y?j=s2PsuHEUBxLI7xD9hckG_|K{Q9?L9pb4oUTDulvkysfUDwX?bPqCi|@ z?CCWdDOpnd zgxSxr%J4#prX~)U z-Q&RP6SBqF5PnuCpGMNNz=TGdJm17@d`vyw=atdnqNDOGPCG6TkLORqzr7s%ILn47 ziy(7L#8~gK8m;UnV^XQXEjdTQIQCD14GyFJN_oP@w1I5T=*rJIvG8Gi$VYXq8V-h3 zyqUFb5{?UcWSF;uX^Ot1npy|8GzxEpMj6#PjzI% zS-UdN%$M=QP!Yq!M&&Dc`~?5L-435~dX>?L{-3Mv)7J(arh16eZMOInF-DHqBE3KC zm~~t0bQxlM?GX06549Qx-MQ_lg99P^#4ypH1V#=MztB0o(WX`S#pJ)BQ zimt?;>Hm-GRD_0~D@Wg%Nvfqx&UCmwgfAsWu~6iQmLtb(Us2{}j=4rWAZg5 zSE$BUvm8y!u{Jlu@6+cWc)uR+*X#9sJzuZ)>+^c?(#}vZgWz)7?g~qNf9ZmUa$R{z zG3VfrwEfvI4zs#pc4B>HWkna9fK~k|e-?1g?ubPkFvB2#I1O3nx>>I(Yr{wU=bxQ+ zK~3)z3KraOK7%uXu8a`p>>?Gle+-0oWRMKdb<)<6FVw8NydD~Y%MPtGrB2;YT{3co zz;Ld{7I_D{(EJ2DcM;cH)7O(>K=c2eUeV*^mzq6P?#kMG?AWo6*@Wvnn3B%d>Wu-k zWLr|iyF;eF^V29XPQ>F%_bgvxy<#gQe&fwlk$buf zaBnDiE92?pTsf7BkIm7Q1`^${ei2^WR@YLyT--g_KWcwYO@!V2^WJdE>u##;9@U-+ zO~=Y3jJMaas>|$#-FtcQ@%u5hw_kp6vG;5RS+eh0IseviRLh&hRDIIGu~s*(t?JZf zbc@mHSn$-xD?rANE$qfevrnK1aHx3gU;UoEGLulrCuC<&SF^pkvbAi^egdrXzVTq) zBsi>4K2$(hP99o{AtN4d@mm2DQ1|bDS$n$-U3;N^uZIGbx3-Oc2J6c%vJor?J~4#_ z+IMc|aOsJcw6?WUQ>}}uWBYFV)bgk`)&fgksLqQUe~ma04Pg8-2OtkA-h&6|>Z>~H zwuOo^6bnLLqLJa@EO4-r1nOIfd~qGZ%n${Jfpx)Ij;2p`PGzUurd+3bg2IDO1cf&? z8b;LC*6my>=@X`*hxNj(YAp_e-YH}i${Z9{oqp`0x9XgiG}sdsQVm0j0VsXAlR-7) z-qnvrCIoE>-9~S1H@8ysd)yQ~{&B)>HK70U5Y*4H86(f@%Tg1_d%GEGHZq8Zbwa;@ zk`5?nxXfs3#iyXS8(9hqm@3BBPwdXqsD&^pbFqX(BB?{CD*sD(+vp@<&me^1XD}sy zG`x^T{HzVLmAeckcr?_A(+Qu6zjOYLmfuoX)eDXs0{#Mg#S?IiuVT;Wi^z_3U#|v9 zo*$!93?&n6l_w0tjCs#;T%=29038sS_l7(3>$WzCE?WY%m4ShQr9WGeJt4e!yc27- zt?Gc*#D>)YvV<%rR8hJ1c<%Am z>+iQ-8?z4zQJt!4W-hYQh)ix<3wI{aQp3R^L=TE>V+Ir@;!${f*7lBK{{>~8aCd)X zi?+OQ+zs*W`!jXauGt<@5-Q~lk^H0G zS*F-No(IEu-VmaX-CTTrJ{{_#T+_z3d8AD3ysWJay*$K?_E|cj9G?lNh8Q-(kbCm&#J}Ki z;n#h6iDc9EiD!0$;R|Mly`85B&wQhtcnV3^6m{)Bob zJd2KA?CMi3)UdgWv$^JdPHZa}3|eewT0*RoOmUBkw9|N!8uF{=J!fn^g+k=62{Rw_ zFVOOZc5L2!+5G45_s;ICaUx-h^55^o#<;5J4)^QA`bf|uj2Gs4krdFIQpt)_!G<-O z9cK@jy3c3S-?!lNq1g}yAGXhY4jA?T%fNp2l5lA_doBk*4YNLBGZUE@0qZv)(CFs} zOhT zDr1P89ZbEQ+dUiGDPJVjU1;gzMK|jDS)=zOQl})?!D1Ndfx9|PymE2XxWz)cu`q+Y z(Ycd9R5mv^*WnYQ$FaJ``t}W@?&EQaSbvEBAwt9jf6KAT?X8@hFI=(}b*7i^Sxo0f z!=}YgZX7G#|2rSTQ>nN)7ga3&eXIGpQ(gOChlHsZy9C~a7zZpk z#GzB|ZX^xY>0TR#s$RatC$5|Md!C++&WH8OPMt^R1yR5;U`I04^t`0HIeg~mX!VHW z@D+El2(T+<(s6*9OSy-B``My?v&|{{hq+mCp@hFyP#OrkLx+AcZdH7ZFfr_Mp1iy( zZY>K!tpewlJI~+Vs#(c%FR;TOdw%JO2_AO3?wfmiS0=p*Z9DwZQ_1|=^vTq3+g7|c zPfruHBk6Znnb!(moKJD;*K<%F8H}QZOD22YB*+}TF3KN`n3A3T74Jh(D3yZj{+<1! z`wc}O_sO^=U2xd;~5%@uP?LOOQl*%#Q zmPwMgE@H^zHG7inqGNkdpcb?urJsS!XR_;aqq>iCHN!pcGHr`^MV269b0Lk~u@V5F zzCNdWi3AB(t=Hf!79wDk3oIbzg1vf0K>J89h5Lg;R&OFS#bi+>?h>OFC5d#9+X zy!^Iq==^9mbV~h|mamI&V$GnI{-GN1LFJS>Zb6V$Kd&1*EhHZ7G`gbcGnRJa`|soq zT@iOcNQyhZlSS@G=Puvt2NdBNlEu`qrV-+bdJly0oFF5wm7+O=N0%ctE(IqWUtZY5!i7@KU#}ww7-KZu63bNLX*J{hCNte{1+V z4c_Zn1PC_u((B8AKJkS8FYY1TK%A8nPRJHRC$D$4vO&7p>IZwO28>+h$FTQ(&D&U9 z`Npw&NhBX)(rm~X^+zlOl~q*|j6AxoK9;1diaaQq+Yd5~h}H=e;=OQ<677}j-Pd5` zX^5$3ErcRMsZ10WT!)3L`QjS|g<_9GQ6jGY`o)@s+m5P_RNh|8xnCI4#C#rHlg z2ZqnRq$b58m~u_OfBgFL2CfL>2-UoTb+HY;0-J13P=PTd5m=W@WqMn=$j}YHW@{6U z&gopZ5LaVkuNn-UTEVvMs)JcXkwG5{bE1cZ76?~XRFDt}Qw^Y7*qYIc>F+zRD$R8T zpKF`#^ZL>U33>ml2*snsXPhMd&OHV6CWI&*I0IAVlQPOT6g$-c;TUi`xT89ajr2+q zp~Sxpey{bUXn*w|gH`E#N;g{l0*eCKRPrUqA7E3-?lntJ2FYgDAa47hxY0%;NWd0U z%~LRULqb+cZ{EC#y;!nb2SGoQ;hHu~zmN{yv3#7F(H5?l1v_1gVIY(g6zO_9H->9f zCok>Id8=HLDxRF2EGFuq#<@73wXDYGdyqI2F2l7wBX@Hi9i>{M(c7CV&TXfGkxn-6 zk)8D5T12ZiNP?DP+V2F(1m1=Butu#0Nf9Qy~5W4>2?F{lg^OoY#r|U$~I~Go1D*3Pll`StxWxAcm zuk|o*NgC|3#iqWs)o?BJpt3O*6ZXvFn`d6OmaR*GM#=1TOWQw5jVmKi%q!kj`#N-DPivPCn*@`rq!T86;%O0Vo}c zzr9{gkf4zK>O-+P;PUsOj%X6-z|D~bnj~Gc$0(;a@7x8shcvn?O?vF8AJfXp#cRIQ z7Hkzril!TiP?(NZy_zM(bxNfy)zxj}gt6vI@NH*{+y4KPM;zx#7sDtDjAgMC{;=#GJ`gu7t?hkys5MsG( zHoJPsaoFA+oEF>S*fi2GzOZwvjm0Hrvf(duWP4aiyPlv+t$-|g48K1A>({TiR7E}h z8!*0fKzN1tu&{}VrCJ^hLvbr8PuVDbJRj;#%F0d9n9S(X?ac-lZo*tAD^_dR2c|yb9+Y= z!n^ItKoEoUPx@9$y=Hz)qU;wE+UpINT)q*o)@y3l@*j9(XQ9f*5z9YQe<$EU%==u< zVx9ZggA&&P`Da6K52`Ubt3K&x==ArLKfu(+r1Hw0C;tbG-S`{; diff --git a/plugins/window/build.rs b/plugins/window/build.rs deleted file mode 100644 index 0b339c43e2..0000000000 --- a/plugins/window/build.rs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -fn main() { - let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); - let mobile = target_os == "ios" || target_os == "android"; - alias("desktop", !mobile); - alias("mobile", mobile); -} - -// creates a cfg alias if `has_feature` is true. -// `alias` must be a snake case string. -fn alias(alias: &str, has_feature: bool) { - if has_feature { - println!("cargo:rustc-cfg={alias}"); - } -} diff --git a/plugins/window/guest-js/index.ts b/plugins/window/guest-js/index.ts deleted file mode 100644 index 23c02a8680..0000000000 --- a/plugins/window/guest-js/index.ts +++ /dev/null @@ -1,2347 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -/** - * Provides APIs to create windows, communicate with other windows and manipulate the current window. - * - * ## Window events - * - * Events can be listened to using {@link Window.listen}: - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * getCurrent().listen("my-window-event", ({ event, payload }) => { }); - * ``` - * - * @module - */ - -import type { - Event, - EventName, - EventCallback, - UnlistenFn, -} from "@tauri-apps/api/event"; -import { TauriEvent, emit, listen, once } from "@tauri-apps/api/event"; - -declare global { - interface Window { - __TAURI_INVOKE__: (cmd: string, args?: unknown) => Promise; - } -} - -type Theme = "light" | "dark"; -type TitleBarStyle = "visible" | "transparent" | "overlay"; - -/** - * Allows you to retrieve information about a given monitor. - * - * @since 2.0.0 - */ -interface Monitor { - /** Human-readable name of the monitor */ - name: string | null; - /** The monitor's resolution. */ - size: PhysicalSize; - /** the Top-left corner position of the monitor relative to the larger full screen area. */ - position: PhysicalPosition; - /** The scale factor that can be used to map physical pixels to logical pixels. */ - scaleFactor: number; -} - -/** - * The payload for the `scaleChange` event. - * - * @since 2.0.0 - */ -interface ScaleFactorChanged { - /** The new window scale factor. */ - scaleFactor: number; - /** The new window size */ - size: PhysicalSize; -} - -/** The file drop event types. */ -type FileDropEvent = - | { type: "hover"; paths: string[] } - | { type: "drop"; paths: string[] } - | { type: "cancel" }; - -/** - * A size represented in logical pixels. - * - * @since 2.0.0 - */ -class LogicalSize { - type = "Logical"; - width: number; - height: number; - - constructor(width: number, height: number) { - this.width = width; - this.height = height; - } -} - -/** - * A size represented in physical pixels. - * - * @since 2.0.0 - */ -class PhysicalSize { - type = "Physical"; - width: number; - height: number; - - constructor(width: number, height: number) { - this.width = width; - this.height = height; - } - - /** - * Converts the physical size to a logical one. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const appWindow = getCurrent(); - * const factor = await appWindow.scaleFactor(); - * const size = await appWindow.innerSize(); - * const logical = size.toLogical(factor); - * ``` - * */ - toLogical(scaleFactor: number): LogicalSize { - return new LogicalSize(this.width / scaleFactor, this.height / scaleFactor); - } -} - -/** - * A position represented in logical pixels. - * - * @since 2.0.0 - */ -class LogicalPosition { - type = "Logical"; - x: number; - y: number; - - constructor(x: number, y: number) { - this.x = x; - this.y = y; - } -} - -/** - * A position represented in physical pixels. - * - * @since 2.0.0 - */ -class PhysicalPosition { - type = "Physical"; - x: number; - y: number; - - constructor(x: number, y: number) { - this.x = x; - this.y = y; - } - - /** - * Converts the physical position to a logical one. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const appWindow = getCurrent(); - * const factor = await appWindow.scaleFactor(); - * const position = await appWindow.innerPosition(); - * const logical = position.toLogical(factor); - * ``` - * */ - toLogical(scaleFactor: number): LogicalPosition { - return new LogicalPosition(this.x / scaleFactor, this.y / scaleFactor); - } -} - -/** @ignore */ -interface WindowDef { - label: string; -} - -/** @ignore */ -declare global { - interface Window { - __TAURI_METADATA__: { - __windows: WindowDef[]; - __currentWindow: WindowDef; - }; - } -} - -/** - * Attention type to request on a window. - * - * @since 2.0.0 - */ -enum UserAttentionType { - /** - * #### Platform-specific - * - **macOS:** Bounces the dock icon until the application is in focus. - * - **Windows:** Flashes both the window and the taskbar button until the application is in focus. - */ - Critical = 1, - /** - * #### Platform-specific - * - **macOS:** Bounces the dock icon once. - * - **Windows:** Flashes the taskbar button until the application is in focus. - */ - Informational, -} - -class CloseRequestedEvent { - /** Event name */ - event: EventName; - /** The label of the window that emitted this event. */ - windowLabel: string; - /** Event identifier used to unlisten */ - id: number; - private _preventDefault = false; - - constructor(event: Event) { - this.event = event.event; - this.windowLabel = event.windowLabel; - this.id = event.id; - } - - preventDefault(): void { - this._preventDefault = true; - } - - isPreventDefault(): boolean { - return this._preventDefault; - } -} - -export type CursorIcon = - | "default" - | "crosshair" - | "hand" - | "arrow" - | "move" - | "text" - | "wait" - | "help" - | "progress" - // something cannot be done - | "notAllowed" - | "contextMenu" - | "cell" - | "verticalText" - | "alias" - | "copy" - | "noDrop" - // something can be grabbed - | "grab" - /// something is grabbed - | "grabbing" - | "allScroll" - | "zoomIn" - | "zoomOut" - // edge is to be moved - | "eResize" - | "nResize" - | "neResize" - | "nwResize" - | "sResize" - | "seResize" - | "swResize" - | "wResize" - | "ewResize" - | "nsResize" - | "neswResize" - | "nwseResize" - | "colResize" - | "rowResize"; - -/** - * Get an instance of `Window` for the current window. - * - * @since 2.0.0 - */ -function getCurrent(): Window { - return new Window(window.__TAURI_METADATA__.__currentWindow.label, { - // @ts-expect-error `skip` is not defined in the public API but it is handled by the constructor - skip: true, - }); -} - -/** - * Gets a list of instances of `Window` for all available windows. - * - * @since 2.0.0 - */ -function getAll(): Window[] { - return window.__TAURI_METADATA__.__windows.map( - (w) => - new Window(w.label, { - // @ts-expect-error `skip` is not defined in the public API but it is handled by the constructor - skip: true, - }), - ); -} - -/** @ignore */ -// events that are emitted right here instead of by the created webview -const localTauriEvents = ["tauri://created", "tauri://error"]; -/** @ignore */ -export type WindowLabel = string; - -/** - * Create new webview window or get a handle to an existing one. - * - * Windows are identified by a *label* a unique identifier that can be used to reference it later. - * It may only contain alphanumeric characters `a-zA-Z` plus the following special characters `-`, `/`, `:` and `_`. - * - * @example - * ```typescript - * // loading embedded asset: - * const appWindow = new Window('theUniqueLabel', { - * url: 'path/to/page.html' - * }); - * // alternatively, load a remote URL: - * const appWindow = new Window('theUniqueLabel', { - * url: 'https://github.com/tauri-apps/tauri' - * }); - * - * appWindow.once('tauri://created', function () { - * // window successfully created - * }); - * appWindow.once('tauri://error', function (e) { - * // an error happened creating the window - * }); - * - * // emit an event to the backend - * await appWindow.emit("some event", "data"); - * // listen to an event from the backend - * const unlisten = await appWindow.listen("event name", e => {}); - * unlisten(); - * ``` - * - * @since 2.0.0 - */ -class Window { - /** The window label. It is a unique identifier for the window, can be used to reference it later. */ - label: WindowLabel; - /** Local event listeners. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - listeners: Record>>; - - /** - * Creates a new Window. - * @example - * ```typescript - * import { Window } from '@tauri-apps/plugin-window'; - * const appWindow = new Window('my-label', { - * url: 'https://github.com/tauri-apps/tauri' - * }); - * appWindow.once('tauri://created', function () { - * // window successfully created - * }); - * appWindow.once('tauri://error', function (e) { - * // an error happened creating the window - * }); - * ``` - * - * @param label The unique webview window label. Must be alphanumeric: `a-zA-Z-/:_`. - * @returns The {@link Window} instance to communicate with the webview. - * - * @since 2.0.0 - */ - constructor(label: WindowLabel, options: WindowOptions = {}) { - this.label = label; - this.listeners = Object.create(null); - - // @ts-expect-error `skip` is not a public API so it is not defined in WindowOptions - if (!options?.skip) { - window - .__TAURI_INVOKE__("plugin:window|create", { - options: { - ...options, - label, - }, - }) - .then(async () => this.emit("tauri://created")) - .catch(async (e: string) => this.emit("tauri://error", e)); - } - } - - /** - * Gets the Window for the webview associated with the given label. - * @example - * ```typescript - * import { Window } from '@tauri-apps/plugin-window'; - * const mainWindow = Window.getByLabel('main'); - * ``` - * - * @param label The webview window label. - * @returns The Window instance to communicate with the webview or null if the webview doesn't exist. - * - * @since 2.0.0 - */ - static getByLabel(label: string): Window | null { - if (getAll().some((w) => w.label === label)) { - // @ts-expect-error `skip` is not defined in the public API but it is handled by the constructor - return new Window(label, { skip: true }); - } - return null; - } - - /** - * Get an instance of `Window` for the current window. - * - * @since 2.0.0 - */ - static getCurrent(): Window { - return getCurrent(); - } - - /** - * Gets a list of instances of `Window` for all available windows. - * - * @since 2.0.0 - */ - static getAll(): Window[] { - return getAll(); - } - - /** - * Gets the focused window. - * @example - * ```typescript - * import { Window } from '@tauri-apps/plugin-window'; - * const focusedWindow = Window.getFocusedWindow(); - * ``` - * - * @returns The Window instance to communicate with the webview or `undefined` if there is not any focused window. - * - * @since 1.4 - */ - static async getFocusedWindow(): Promise { - for (const w of getAll()) { - if (await w.isFocused()) { - return w; - } - } - return null; - } - - /** - * Listen to an event emitted by the backend that is tied to the webview window. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const unlisten = await getCurrent().listen('state-changed', (event) => { - * console.log(`Got error: ${payload}`); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`. - * @param handler Event handler. - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async listen( - event: EventName, - handler: EventCallback, - ): Promise { - if (this._handleTauriEvent(event, handler)) { - return Promise.resolve(() => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, security/detect-object-injection - const listeners = this.listeners[event]; - listeners.splice(listeners.indexOf(handler), 1); - }); - } - return listen(event, handler, { target: this.label }); - } - - /** - * Listen to an one-off event emitted by the backend that is tied to the webview window. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const unlisten = await getCurrent().once('initialized', (event) => { - * console.log(`Window initialized!`); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`. - * @param handler Event handler. - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async once(event: string, handler: EventCallback): Promise { - if (this._handleTauriEvent(event, handler)) { - return Promise.resolve(() => { - // eslint-disable-next-line security/detect-object-injection - const listeners = this.listeners[event]; - listeners.splice(listeners.indexOf(handler), 1); - }); - } - return once(event, handler, { target: this.label }); - } - - /** - * Emits an event to the backend, tied to the webview window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().emit('window-loaded', { loggedIn: true, token: 'authToken' }); - * ``` - * - * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`. - * @param payload Event payload. - */ - async emit(event: string, payload?: unknown): Promise { - if (localTauriEvents.includes(event)) { - // eslint-disable-next-line - for (const handler of this.listeners[event] || []) { - handler({ event, id: -1, windowLabel: this.label, payload }); - } - return Promise.resolve(); - } - return emit(event, payload, { target: this.label }); - } - - /** @ignore */ - _handleTauriEvent(event: string, handler: EventCallback): boolean { - if (localTauriEvents.includes(event)) { - if (!(event in this.listeners)) { - // eslint-disable-next-line - this.listeners[event] = [handler]; - } else { - // eslint-disable-next-line - this.listeners[event].push(handler); - } - return true; - } - return false; - } - - // Getters - /** - * The scale factor that can be used to map physical pixels to logical pixels. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const factor = await getCurrent().scaleFactor(); - * ``` - * - * @returns The window's monitor scale factor. - * - * @since 2.0.0 - * */ - async scaleFactor(): Promise { - return window.__TAURI_INVOKE__("plugin:window|scale_factor", { - label: this.label, - }); - } - - /** - * The position of the top-left hand corner of the window's client area relative to the top-left hand corner of the desktop. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const position = await getCurrent().innerPosition(); - * ``` - * - * @returns The window's inner position. - * - * @since 2.0.0 - * */ - async innerPosition(): Promise { - return window - .__TAURI_INVOKE__<{ x: number; y: number }>( - "plugin:window|inner_position", - { - label: this.label, - }, - ) - .then(({ x, y }) => new PhysicalPosition(x, y)); - } - - /** - * The position of the top-left hand corner of the window relative to the top-left hand corner of the desktop. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const position = await getCurrent().outerPosition(); - * ``` - * - * @returns The window's outer position. - * - * @since 2.0.0 - * */ - async outerPosition(): Promise { - return window - .__TAURI_INVOKE__<{ x: number; y: number }>( - "plugin:window|outer_position", - { - label: this.label, - }, - ) - .then(({ x, y }) => new PhysicalPosition(x, y)); - } - - /** - * The physical size of the window's client area. - * The client area is the content of the window, excluding the title bar and borders. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const size = await getCurrent().innerSize(); - * ``` - * - * @returns The window's inner size. - * - * @since 2.0.0 - */ - async innerSize(): Promise { - return window - .__TAURI_INVOKE__<{ width: number; height: number }>( - "plugin:window|inner_size", - { - label: this.label, - }, - ) - .then(({ width, height }) => new PhysicalSize(width, height)); - } - - /** - * The physical size of the entire window. - * These dimensions include the title bar and borders. If you don't want that (and you usually don't), use inner_size instead. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const size = await getCurrent().outerSize(); - * ``` - * - * @returns The window's outer size. - * - * @since 2.0.0 - */ - async outerSize(): Promise { - return window - .__TAURI_INVOKE__<{ width: number; height: number }>( - "plugin:window|outer_size", - { - label: this.label, - }, - ) - .then(({ width, height }) => new PhysicalSize(width, height)); - } - - /** - * Gets the window's current fullscreen state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const fullscreen = await getCurrent().isFullscreen(); - * ``` - * - * @returns Whether the window is in fullscreen mode or not. - * - * @since 2.0.0 - * */ - async isFullscreen(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_fullscreen", { - label: this.label, - }); - } - - /** - * Gets the window's current minimized state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const minimized = await getCurrent().isMinimized(); - * ``` - * - * @since 2.0.0 - * */ - async isMinimized(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_minimized", { - label: this.label, - }); - } - - /** - * Gets the window's current maximized state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const maximized = await getCurrent().isMaximized(); - * ``` - * - * @returns Whether the window is maximized or not. - * - * @since 2.0.0 - * */ - async isMaximized(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_maximized", { - label: this.label, - }); - } - - /** - * Gets the window's current focus state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const focused = await getCurrent().isFocused(); - * ``` - * - * @returns Whether the window is focused or not. - * - * @since 2.0.0 - * */ - async isFocused(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_focused", { - label: this.label, - }); - } - - /** - * Gets the window's current decorated state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const decorated = await getCurrent().isDecorated(); - * ``` - * - * @returns Whether the window is decorated or not. - * - * @since 2.0.0 - * */ - async isDecorated(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_decorated", { - label: this.label, - }); - } - - /** - * Gets the window's current resizable state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const resizable = await getCurrent().isResizable(); - * ``` - * - * @returns Whether the window is resizable or not. - * - * @since 2.0.0 - * */ - async isResizable(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_resizable", { - label: this.label, - }); - } - - /** - * Gets the window’s native maximize button state. - * - * #### Platform-specific - * - * - **Linux / iOS / Android:** Unsupported. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const maximizable = await getCurrent().isMaximizable(); - * ``` - * - * @returns Whether the window's native maximize button is enabled or not. - * */ - async isMaximizable(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_maximizable", { - label: this.label, - }); - } - - /** - * Gets the window’s native minimize button state. - * - * #### Platform-specific - * - * - **Linux / iOS / Android:** Unsupported. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const minimizable = await getCurrent().isMinimizable(); - * ``` - * - * @returns Whether the window's native minimize button is enabled or not. - * */ - async isMinimizable(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_minimizable", { - label: this.label, - }); - } - - /** - * Gets the window’s native close button state. - * - * #### Platform-specific - * - * - **iOS / Android:** Unsupported. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const closable = await getCurrent().isClosable(); - * ``` - * - * @returns Whether the window's native close button is enabled or not. - * */ - async isClosable(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_closable", { - label: this.label, - }); - } - - /** - * Gets the window's current visible state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const visible = await getCurrent().isVisible(); - * ``` - * - * @returns Whether the window is visible or not. - * - * @since 2.0.0 - * */ - async isVisible(): Promise { - return window.__TAURI_INVOKE__("plugin:window|is_visible", { - label: this.label, - }); - } - - /** - * Gets the window's current title. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const title = await getCurrent().title(); - * ``` - * - * @since 2.0.0 - * */ - async title(): Promise { - return window.__TAURI_INVOKE__("plugin:window|title", { - label: this.label, - }); - } - - /** - * Gets the window's current theme. - * - * #### Platform-specific - * - * - **macOS:** Theme was introduced on macOS 10.14. Returns `light` on macOS 10.13 and below. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * const theme = await getCurrent().theme(); - * ``` - * - * @returns The window theme. - * - * @since 2.0.0 - * */ - async theme(): Promise { - return window.__TAURI_INVOKE__("plugin:window|theme", { - label: this.label, - }); - } - - // Setters - - /** - * Centers the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().center(); - * ``` - * - * @param resizable - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async center(): Promise { - return window.__TAURI_INVOKE__("plugin:window|center", { - label: this.label, - }); - } - - /** - * Requests user attention to the window, this has no effect if the application - * is already focused. How requesting for user attention manifests is platform dependent, - * see `UserAttentionType` for details. - * - * Providing `null` will unset the request for user attention. Unsetting the request for - * user attention might not be done automatically by the WM when the window receives input. - * - * #### Platform-specific - * - * - **macOS:** `null` has no effect. - * - **Linux:** Urgency levels have the same effect. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().requestUserAttention(); - * ``` - * - * @param requestType - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async requestUserAttention( - requestType: UserAttentionType | null, - ): Promise { - let requestType_ = null; - if (requestType) { - if (requestType === UserAttentionType.Critical) { - requestType_ = { type: "Critical" }; - } else { - requestType_ = { type: "Informational" }; - } - } - - return window.__TAURI_INVOKE__("plugin:window|request_user_attention", { - label: this.label, - value: requestType_, - }); - } - - /** - * Updates the window resizable flag. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setResizable(false); - * ``` - * - * @param resizable - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setResizable(resizable: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_resizable", { - label: this.label, - value: resizable, - }); - } - - /** - * Sets whether the window's native maximize button is enabled or not. - * If resizable is set to false, this setting is ignored. - * - * #### Platform-specific - * - * - **macOS:** Disables the "zoom" button in the window titlebar, which is also used to enter fullscreen mode. - * - **Linux / iOS / Android:** Unsupported. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setMaximizable(false); - * ``` - * - * @param maximizable - * @returns A promise indicating the success or failure of the operation. - */ - async setMaximizable(maximizable: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_maximizable", { - label: this.label, - value: maximizable, - }); - } - - /** - * Sets whether the window's native minimize button is enabled or not. - * - * #### Platform-specific - * - * - **Linux / iOS / Android:** Unsupported. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setMinimizable(false); - * ``` - * - * @param minimizable - * @returns A promise indicating the success or failure of the operation. - */ - async setMinimizable(minimizable: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_minimizable", { - label: this.label, - value: minimizable, - }); - } - - /** - * Sets whether the window's native close button is enabled or not. - * - * #### Platform-specific - * - * - **Linux:** GTK+ will do its best to convince the window manager not to show a close button. Depending on the system, this function may not have any effect when called on a window that is already visible - * - **iOS / Android:** Unsupported. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setClosable(false); - * ``` - * - * @param closable - * @returns A promise indicating the success or failure of the operation. - */ - async setClosable(closable: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_closable", { - label: this.label, - value: closable, - }); - } - - /** - * Sets the window title. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setTitle('Tauri'); - * ``` - * - * @param title The new title - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setTitle(title: string): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_title", { - label: this.label, - value: title, - }); - } - - /** - * Maximizes the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().maximize(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async maximize(): Promise { - return window.__TAURI_INVOKE__("plugin:window|maximize", { - label: this.label, - }); - } - - /** - * Unmaximizes the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().unmaximize(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async unmaximize(): Promise { - return window.__TAURI_INVOKE__("plugin:window|unmaximize", { - label: this.label, - }); - } - - /** - * Toggles the window maximized state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().toggleMaximize(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async toggleMaximize(): Promise { - return window.__TAURI_INVOKE__("plugin:window|toggle_maximize", { - label: this.label, - }); - } - - /** - * Minimizes the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().minimize(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async minimize(): Promise { - return window.__TAURI_INVOKE__("plugin:window|minimize", { - label: this.label, - }); - } - - /** - * Unminimizes the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().unminimize(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async unminimize(): Promise { - return window.__TAURI_INVOKE__("plugin:window|unminimize", { - label: this.label, - }); - } - - /** - * Sets the window visibility to true. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().show(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async show(): Promise { - return window.__TAURI_INVOKE__("plugin:window|show", { - label: this.label, - }); - } - - /** - * Sets the window visibility to false. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().hide(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async hide(): Promise { - return window.__TAURI_INVOKE__("plugin:window|hide", { - label: this.label, - }); - } - - /** - * Closes the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().close(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async close(): Promise { - return window.__TAURI_INVOKE__("plugin:window|close", { - label: this.label, - }); - } - - /** - * Whether the window should have borders and bars. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setDecorations(false); - * ``` - * - * @param decorations Whether the window should have borders and bars. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setDecorations(decorations: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_decorations", { - label: this.label, - value: decorations, - }); - } - - /** - * Whether or not the window should have shadow. - * - * #### Platform-specific - * - * - **Windows:** - * - `false` has no effect on decorated window, shadows are always ON. - * - `true` will make ndecorated window have a 1px white border, - * and on Windows 11, it will have a rounded corners. - * - **Linux:** Unsupported. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setShadow(false); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setShadow(enable: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_shadow", { - label: this.label, - value: enable, - }); - } - - /** - * Set window effects. - * - * @since 2.0 - */ - async setEffects(effects: Effects): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_effects", { - label: this.label, - value: effects, - }); - } - - /** - * Clear any applied effects if possible. - * - * @since 2.0 - */ - async clearEffects(): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_effects", { - label: this.label, - value: null, - }); - } - - /** - * Whether the window should always be on top of other windows. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setAlwaysOnTop(true); - * ``` - * - * @param alwaysOnTop Whether the window should always be on top of other windows or not. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setAlwaysOnTop(alwaysOnTop: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_always_on_top", { - label: this.label, - value: alwaysOnTop, - }); - } - - /** - * Prevents the window contents from being captured by other apps. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setContentProtected(true); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setContentProtected(protected_: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_content_protected", { - label: this.label, - value: protected_, - }); - } - - /** - * Resizes the window with a new inner size. - * @example - * ```typescript - * import { getCurrent, LogicalSize } from '@tauri-apps/plugin-window'; - * await getCurrent().setSize(new LogicalSize(600, 500)); - * ``` - * - * @param size The logical or physical inner size. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setSize(size: LogicalSize | PhysicalSize): Promise { - if (!size || (size.type !== "Logical" && size.type !== "Physical")) { - throw new Error( - "the `size` argument must be either a LogicalSize or a PhysicalSize instance", - ); - } - - return window.__TAURI_INVOKE__("plugin:window|set_size", { - label: this.label, - value: { - type: size.type, - data: { - width: size.width, - height: size.height, - }, - }, - }); - } - - /** - * Sets the window minimum inner size. If the `size` argument is not provided, the constraint is unset. - * @example - * ```typescript - * import { getCurrent, PhysicalSize } from '@tauri-apps/plugin-window'; - * await getCurrent().setMinSize(new PhysicalSize(600, 500)); - * ``` - * - * @param size The logical or physical inner size, or `null` to unset the constraint. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setMinSize( - size: LogicalSize | PhysicalSize | null | undefined, - ): Promise { - if (size && size.type !== "Logical" && size.type !== "Physical") { - throw new Error( - "the `size` argument must be either a LogicalSize or a PhysicalSize instance", - ); - } - - return window.__TAURI_INVOKE__("plugin:window|set_min_size", { - label: this.label, - value: size - ? { - type: size.type, - data: { - width: size.width, - height: size.height, - }, - } - : null, - }); - } - - /** - * Sets the window maximum inner size. If the `size` argument is undefined, the constraint is unset. - * @example - * ```typescript - * import { getCurrent, LogicalSize } from '@tauri-apps/plugin-window'; - * await getCurrent().setMaxSize(new LogicalSize(600, 500)); - * ``` - * - * @param size The logical or physical inner size, or `null` to unset the constraint. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setMaxSize( - size: LogicalSize | PhysicalSize | null | undefined, - ): Promise { - if (size && size.type !== "Logical" && size.type !== "Physical") { - throw new Error( - "the `size` argument must be either a LogicalSize or a PhysicalSize instance", - ); - } - - return window.__TAURI_INVOKE__("plugin:window|set_max_size", { - label: this.label, - value: size - ? { - type: size.type, - data: { - width: size.width, - height: size.height, - }, - } - : null, - }); - } - - /** - * Sets the window outer position. - * @example - * ```typescript - * import { getCurrent, LogicalPosition } from '@tauri-apps/plugin-window'; - * await getCurrent().setPosition(new LogicalPosition(600, 500)); - * ``` - * - * @param position The new position, in logical or physical pixels. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setPosition( - position: LogicalPosition | PhysicalPosition, - ): Promise { - if ( - !position || - (position.type !== "Logical" && position.type !== "Physical") - ) { - throw new Error( - "the `position` argument must be either a LogicalPosition or a PhysicalPosition instance", - ); - } - - return window.__TAURI_INVOKE__("plugin:window|set_position", { - label: this.label, - value: { - type: position.type, - data: { - x: position.x, - y: position.y, - }, - }, - }); - } - - /** - * Sets the window fullscreen state. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setFullscreen(true); - * ``` - * - * @param fullscreen Whether the window should go to fullscreen or not. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setFullscreen(fullscreen: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_fullscreen", { - label: this.label, - value: fullscreen, - }); - } - - /** - * Bring the window to front and focus. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setFocus(); - * ``` - * - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setFocus(): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_focus", { - label: this.label, - }); - } - - /** - * Sets the window icon. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setIcon('/tauri/awesome.png'); - * ``` - * - * Note that you need the `icon-ico` or `icon-png` Cargo features to use this API. - * To enable it, change your Cargo.toml file: - * ```toml - * [dependencies] - * tauri = { version = "...", features = ["...", "icon-png"] } - * ``` - * - * @param icon Icon bytes or path to the icon file. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setIcon(icon: string | Uint8Array): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_icon", { - label: this.label, - value: typeof icon === "string" ? icon : Array.from(icon), - }); - } - - /** - * Whether the window icon should be hidden from the taskbar or not. - * - * #### Platform-specific - * - * - **macOS:** Unsupported. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setSkipTaskbar(true); - * ``` - * - * @param skip true to hide window icon, false to show it. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setSkipTaskbar(skip: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_skip_taskbar", { - label: this.label, - value: skip, - }); - } - - /** - * Grabs the cursor, preventing it from leaving the window. - * - * There's no guarantee that the cursor will be hidden. You should - * hide it by yourself if you want so. - * - * #### Platform-specific - * - * - **Linux:** Unsupported. - * - **macOS:** This locks the cursor in a fixed location, which looks visually awkward. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setCursorGrab(true); - * ``` - * - * @param grab `true` to grab the cursor icon, `false` to release it. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setCursorGrab(grab: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_cursor_grab", { - label: this.label, - value: grab, - }); - } - - /** - * Modifies the cursor's visibility. - * - * #### Platform-specific - * - * - **Windows:** The cursor is only hidden within the confines of the window. - * - **macOS:** The cursor is hidden as long as the window has input focus, even if the cursor is - * outside of the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setCursorVisible(false); - * ``` - * - * @param visible If `false`, this will hide the cursor. If `true`, this will show the cursor. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setCursorVisible(visible: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_cursor_visible", { - label: this.label, - value: visible, - }); - } - - /** - * Modifies the cursor icon of the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setCursorIcon('help'); - * ``` - * - * @param icon The new cursor icon. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setCursorIcon(icon: CursorIcon): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_cursor_icon", { - label: this.label, - value: icon, - }); - } - - /** - * Changes the position of the cursor in window coordinates. - * @example - * ```typescript - * import { getCurrent, LogicalPosition } from '@tauri-apps/plugin-window'; - * await getCurrent().setCursorPosition(new LogicalPosition(600, 300)); - * ``` - * - * @param position The new cursor position. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setCursorPosition( - position: LogicalPosition | PhysicalPosition, - ): Promise { - if ( - !position || - (position.type !== "Logical" && position.type !== "Physical") - ) { - throw new Error( - "the `position` argument must be either a LogicalPosition or a PhysicalPosition instance", - ); - } - - return window.__TAURI_INVOKE__("plugin:window|set_cursor_position", { - label: this.label, - value: { - type: position.type, - data: { - x: position.x, - y: position.y, - }, - }, - }); - } - - /** - * Changes the cursor events behavior. - * - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().setIgnoreCursorEvents(true); - * ``` - * - * @param ignore `true` to ignore the cursor events; `false` to process them as usual. - * @returns A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async setIgnoreCursorEvents(ignore: boolean): Promise { - return window.__TAURI_INVOKE__("plugin:window|set_ignore_cursor_events", { - label: this.label, - value: ignore, - }); - } - - /** - * Starts dragging the window. - * @example - * ```typescript - * import { getCurrent } from '@tauri-apps/plugin-window'; - * await getCurrent().startDragging(); - * ``` - * - * @return A promise indicating the success or failure of the operation. - * - * @since 2.0.0 - */ - async startDragging(): Promise { - return window.__TAURI_INVOKE__("plugin:window|start_dragging", { - label: this.label, - }); - } - - // Listeners - - /** - * Listen to window resize. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * const unlisten = await getCurrent().onResized(({ payload: size }) => { - * console.log('Window resized', size); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async onResized(handler: EventCallback): Promise { - return this.listen(TauriEvent.WINDOW_RESIZED, (e) => { - e.payload = mapPhysicalSize(e.payload); - handler(e); - }); - } - - /** - * Listen to window move. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * const unlisten = await getCurrent().onMoved(({ payload: position }) => { - * console.log('Window moved', position); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async onMoved(handler: EventCallback): Promise { - return this.listen(TauriEvent.WINDOW_MOVED, (e) => { - e.payload = mapPhysicalPosition(e.payload); - handler(e); - }); - } - - /** - * Listen to window close requested. Emitted when the user requests to closes the window. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * import { confirm } from '@tauri-apps/api/dialog'; - * const unlisten = await getCurrent().onCloseRequested(async (event) => { - * const confirmed = await confirm('Are you sure?'); - * if (!confirmed) { - * // user did not confirm closing the window; let's prevent it - * event.preventDefault(); - * } - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - /* eslint-disable @typescript-eslint/promise-function-async */ - async onCloseRequested( - handler: (event: CloseRequestedEvent) => void | Promise, - ): Promise { - return this.listen(TauriEvent.WINDOW_CLOSE_REQUESTED, (event) => { - const evt = new CloseRequestedEvent(event); - void Promise.resolve(handler(evt)).then(() => { - if (!evt.isPreventDefault()) { - return this.close(); - } - }); - }); - } - /* eslint-enable */ - - /** - * Listen to window focus change. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * const unlisten = await getCurrent().onFocusChanged(({ payload: focused }) => { - * console.log('Focus changed, window is focused? ' + focused); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async onFocusChanged(handler: EventCallback): Promise { - const unlistenFocus = await this.listen( - TauriEvent.WINDOW_FOCUS, - (event) => { - handler({ ...event, payload: true }); - }, - ); - const unlistenBlur = await this.listen( - TauriEvent.WINDOW_BLUR, - (event) => { - handler({ ...event, payload: false }); - }, - ); - return () => { - unlistenFocus(); - unlistenBlur(); - }; - } - - /** - * Listen to window scale change. Emitted when the window's scale factor has changed. - * The following user actions can cause DPI changes: - * - Changing the display's resolution. - * - Changing the display's scale factor (e.g. in Control Panel on Windows). - * - Moving the window to a display with a different scale factor. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * const unlisten = await getCurrent().onScaleChanged(({ payload }) => { - * console.log('Scale changed', payload.scaleFactor, payload.size); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async onScaleChanged( - handler: EventCallback, - ): Promise { - return this.listen( - TauriEvent.WINDOW_SCALE_FACTOR_CHANGED, - handler, - ); - } - - /** - * Listen to the window menu item click. The payload is the item id. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * const unlisten = await getCurrent().onMenuClicked(({ payload: menuId }) => { - * console.log('Menu clicked: ' + menuId); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async onMenuClicked(handler: EventCallback): Promise { - return this.listen(TauriEvent.MENU, handler); - } - - /** - * Listen to a file drop event. - * The listener is triggered when the user hovers the selected files on the window, - * drops the files or cancels the operation. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * const unlisten = await getCurrent().onFileDropEvent((event) => { - * if (event.payload.type === 'hover') { - * console.log('User hovering', event.payload.paths); - * } else if (event.payload.type === 'drop') { - * console.log('User dropped', event.payload.paths); - * } else { - * console.log('File drop cancelled'); - * } - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async onFileDropEvent( - handler: EventCallback, - ): Promise { - const unlistenFileDrop = await this.listen( - TauriEvent.WINDOW_FILE_DROP, - (event) => { - handler({ ...event, payload: { type: "drop", paths: event.payload } }); - }, - ); - - const unlistenFileHover = await this.listen( - TauriEvent.WINDOW_FILE_DROP_HOVER, - (event) => { - handler({ ...event, payload: { type: "hover", paths: event.payload } }); - }, - ); - - const unlistenCancel = await this.listen( - TauriEvent.WINDOW_FILE_DROP_CANCELLED, - (event) => { - handler({ ...event, payload: { type: "cancel" } }); - }, - ); - - return () => { - unlistenFileDrop(); - unlistenFileHover(); - unlistenCancel(); - }; - } - - /** - * Listen to the system theme change. - * - * @example - * ```typescript - * import { getCurrent } from "@tauri-apps/plugin-window"; - * const unlisten = await getCurrent().onThemeChanged(({ payload: theme }) => { - * console.log('New theme: ' + theme); - * }); - * - * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted - * unlisten(); - * ``` - * - * @returns A promise resolving to a function to unlisten to the event. - * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted. - * - * @since 2.0.0 - */ - async onThemeChanged(handler: EventCallback): Promise { - return this.listen(TauriEvent.WINDOW_THEME_CHANGED, handler); - } -} - -/** - * an array RGBA colors. Each value has minimum of 0 and maximum of 255. - * - * @since 2.0 - */ -type Color = [number, number, number, number]; - -/** - * Platform-specific window effects - * - * @since 2.0 - */ -enum Effect { - /** - * A default material appropriate for the view's effectiveAppearance. **macOS 10.14-** - * - * @deprecated since macOS 10.14. You should instead choose an appropriate semantic material. - */ - AppearanceBased = "appearanceBased", - /** - * **macOS 10.14-** - * - * @deprecated since macOS 10.14. Use a semantic material instead. - */ - Light = "light", - /** - * **macOS 10.14-** - * - * @deprecated since macOS 10.14. Use a semantic material instead. - */ - Dark = "dark", - /** - * **macOS 10.14-** - * - * @deprecated since macOS 10.14. Use a semantic material instead. - */ - MediumLight = "mediumLight", - /** - * **macOS 10.14-** - * - * @deprecated since macOS 10.14. Use a semantic material instead. - */ - UltraDark = "ultraDark", - /** - * **macOS 10.10+** - */ - Titlebar = "titlebar", - /** - * **macOS 10.10+** - */ - Selection = "selection", - /** - * **macOS 10.11+** - */ - Menu = "menu", - /** - * **macOS 10.11+** - */ - Popover = "popover", - /** - * **macOS 10.11+** - */ - Sidebar = "sidebar", - /** - * **macOS 10.14+** - */ - HeaderView = "headerView", - /** - * **macOS 10.14+** - */ - Sheet = "sheet", - /** - * **macOS 10.14+** - */ - WindowBackground = "windowBackground", - /** - * **macOS 10.14+** - */ - HudWindow = "hudWindow", - /** - * **macOS 10.14+** - */ - FullScreenUI = "fullScreenUI", - /** - * **macOS 10.14+** - */ - Tooltip = "tooltip", - /** - * **macOS 10.14+** - */ - ContentBackground = "contentBackground", - /** - * **macOS 10.14+** - */ - UnderWindowBackground = "underWindowBackground", - /** - * **macOS 10.14+** - */ - UnderPageBackground = "underPageBackground", - /** - * **Windows 11 Only** - */ - Mica = "mica", - /** - * **Windows 7/10/11(22H1) Only** - * - * ## Notes - * - * This effect has bad performance when resizing/dragging the window on Windows 11 build 22621. - */ - Blur = "blur", - /** - * **Windows 10/11** - * - * ## Notes - * - * This effect has bad performance when resizing/dragging the window on Windows 10 v1903+ and Windows 11 build 22000. - */ - Acrylic = "acrylic", -} - -/** - * Window effect state **macOS only** - * - * @see https://developer.apple.com/documentation/appkit/nsvisualeffectview/state - * - * @since 2.0 - */ -enum EffectState { - /** - * Make window effect state follow the window's active state **macOS only** - */ - FollowsWindowActiveState = "followsWindowActiveState", - /** - * Make window effect state always active **macOS only** - */ - Active = "active", - /** - * Make window effect state always inactive **macOS only** - */ - Inactive = "inactive", -} - -/** The window effects configuration object - * - * @since 2.0 - */ -interface Effects { - /** - * List of Window effects to apply to the Window. - * Conflicting effects will apply the first one and ignore the rest. - */ - effects: Effect[]; - /** - * Window effect state **macOS Only** - */ - state?: EffectState; - /** - * Window effect corner radius **macOS Only** - */ - radius?: number; - /** - * Window effect color. Affects {@link Effects.Blur} and {@link Effects.Acrylic} only - * on Windows 10 v1903+. Doesn't have any effect on Windows 7 or Windows 11. - */ - color?: Color; -} - -/** - * Configuration for the window to create. - * - * @since 2.0.0 - */ -interface WindowOptions { - /** - * Remote URL or local file path to open. - * - * - URL such as `https://github.com/tauri-apps` is opened directly on a Tauri window. - * - data: URL such as `data:text/html,...` is only supported with the `window-data-url` Cargo feature for the `tauri` dependency. - * - local file path or route such as `/path/to/page.html` or `/users` is appended to the application URL (the devServer URL on development, or `tauri://localhost/` and `https://tauri.localhost/` on production). - */ - url?: string; - /** Show window in the center of the screen.. */ - center?: boolean; - /** The initial vertical position. Only applies if `y` is also set. */ - x?: number; - /** The initial horizontal position. Only applies if `x` is also set. */ - y?: number; - /** The initial width. */ - width?: number; - /** The initial height. */ - height?: number; - /** The minimum width. Only applies if `minHeight` is also set. */ - minWidth?: number; - /** The minimum height. Only applies if `minWidth` is also set. */ - minHeight?: number; - /** The maximum width. Only applies if `maxHeight` is also set. */ - maxWidth?: number; - /** The maximum height. Only applies if `maxWidth` is also set. */ - maxHeight?: number; - /** Whether the window is resizable or not. */ - resizable?: boolean; - /** Window title. */ - title?: string; - /** Whether the window is in fullscreen mode or not. */ - fullscreen?: boolean; - /** Whether the window will be initially focused or not. */ - focus?: boolean; - /** - * Whether the window is transparent or not. - * Note that on `macOS` this requires the `macos-private-api` feature flag, enabled under `tauri.conf.json > tauri > macOSPrivateApi`. - * WARNING: Using private APIs on `macOS` prevents your application from being accepted to the `App Store`. - */ - transparent?: boolean; - /** Whether the window should be maximized upon creation or not. */ - maximized?: boolean; - /** Whether the window should be immediately visible upon creation or not. */ - visible?: boolean; - /** Whether the window should have borders and bars or not. */ - decorations?: boolean; - /** Whether the window should always be on top of other windows or not. */ - alwaysOnTop?: boolean; - /** Prevents the window contents from being captured by other apps. */ - contentProtected?: boolean; - /** Whether or not the window icon should be added to the taskbar. */ - skipTaskbar?: boolean; - /** - * Whether or not the window has shadow. - * - * #### Platform-specific - * - * - **Windows:** - * - `false` has no effect on decorated window, shadows are always ON. - * - `true` will make ndecorated window have a 1px white border, - * and on Windows 11, it will have a rounded corners. - * - **Linux:** Unsupported. - * - * @since 2.0.0 - */ - shadow?: boolean; - /** - * Whether the file drop is enabled or not on the webview. By default it is enabled. - * - * Disabling it is required to use drag and drop on the frontend on Windows. - */ - fileDropEnabled?: boolean; - /** - * The initial window theme. Defaults to the system theme. - * - * Only implemented on Windows and macOS 10.14+. - */ - theme?: Theme; - /** - * The style of the macOS title bar. - */ - titleBarStyle?: TitleBarStyle; - /** - * If `true`, sets the window title to be hidden on macOS. - */ - hiddenTitle?: boolean; - /** - * Whether clicking an inactive window also clicks through to the webview on macOS. - */ - acceptFirstMouse?: boolean; - /** - * Defines the window [tabbing identifier](https://developer.apple.com/documentation/appkit/nswindow/1644704-tabbingidentifier) on macOS. - * - * Windows with the same tabbing identifier will be grouped together. - * If the tabbing identifier is not set, automatic tabbing will be disabled. - */ - tabbingIdentifier?: string; - /** - * The user agent for the webview. - */ - userAgent?: string; - /** - * Whether or not the webview should be launched in incognito mode. - * - * #### Platform-specific - * - * - **Android:** Unsupported. - */ - incognito?: boolean; - /** - * Whether the window's native maximize button is enabled or not. Defaults to `true`. - */ - maximizable?: boolean; - /** - * Whether the window's native minimize button is enabled or not. Defaults to `true`. - */ - minimizable?: boolean; - /** - * Whether the window's native close button is enabled or not. Defaults to `true`. - */ - closable?: boolean; -} - -function mapMonitor(m: Monitor | null): Monitor | null { - return m === null - ? null - : { - name: m.name, - scaleFactor: m.scaleFactor, - position: mapPhysicalPosition(m.position), - size: mapPhysicalSize(m.size), - }; -} - -function mapPhysicalPosition(m: PhysicalPosition): PhysicalPosition { - return new PhysicalPosition(m.x, m.y); -} - -function mapPhysicalSize(m: PhysicalSize): PhysicalSize { - return new PhysicalSize(m.width, m.height); -} - -/** - * Returns the monitor on which the window currently resides. - * Returns `null` if current monitor can't be detected. - * @example - * ```typescript - * import { currentMonitor } from '@tauri-apps/plugin-window'; - * const monitor = currentMonitor(); - * ``` - * - * @since 2.0.0 - */ -async function currentMonitor(): Promise { - return window - .__TAURI_INVOKE__("plugin:window|current_monitor") - .then(mapMonitor); -} - -/** - * Returns the primary monitor of the system. - * Returns `null` if it can't identify any monitor as a primary one. - * @example - * ```typescript - * import { primaryMonitor } from '@tauri-apps/plugin-window'; - * const monitor = primaryMonitor(); - * ``` - * - * @since 2.0.0 - */ -async function primaryMonitor(): Promise { - return window - .__TAURI_INVOKE__("plugin:window|primary_monitor") - .then(mapMonitor); -} - -/** - * Returns the list of all the monitors available on the system. - * @example - * ```typescript - * import { availableMonitors } from '@tauri-apps/plugin-window'; - * const monitors = availableMonitors(); - * ``` - * - * @since 2.0.0 - */ -async function availableMonitors(): Promise { - return window - .__TAURI_INVOKE__("plugin:window|available_monitors") - .then((ms) => ms.map(mapMonitor) as Monitor[]); -} - -export { - Window, - CloseRequestedEvent, - getCurrent, - getAll, - LogicalSize, - PhysicalSize, - LogicalPosition, - PhysicalPosition, - UserAttentionType, - Effect, - EffectState, - currentMonitor, - primaryMonitor, - availableMonitors, -}; - -export type { - Theme, - TitleBarStyle, - Monitor, - ScaleFactorChanged, - FileDropEvent, - WindowOptions, - Color, -}; diff --git a/plugins/window/package.json b/plugins/window/package.json deleted file mode 100644 index 576cc49fab..0000000000 --- a/plugins/window/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@tauri-apps/plugin-window", - "version": "2.0.0-alpha.1", - "license": "MIT or APACHE-2.0", - "authors": [ - "Tauri Programme within The Commons Conservancy" - ], - "type": "module", - "browser": "dist-js/index.min.js", - "module": "dist-js/index.mjs", - "types": "dist-js/index.d.ts", - "exports": { - "import": "./dist-js/index.mjs", - "types": "./dist-js/index.d.ts", - "browser": "./dist-js/index.min.js" - }, - "scripts": { - "build": "rollup -c" - }, - "files": [ - "dist-js", - "!dist-js/**/*.map", - "README.md", - "LICENSE" - ], - "devDependencies": { - "tslib": "^2.5.0" - }, - "dependencies": { - "@tauri-apps/api": "2.0.0-alpha.8" - } -} diff --git a/plugins/window/rollup.config.mjs b/plugins/window/rollup.config.mjs deleted file mode 100644 index 99a3dd3190..0000000000 --- a/plugins/window/rollup.config.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import { readFileSync } from "fs"; - -import { createConfig } from "../../shared/rollup.config.mjs"; - -export default createConfig({ - input: "guest-js/index.ts", - pkg: JSON.parse( - readFileSync(new URL("./package.json", import.meta.url), "utf8"), - ), - external: [/^@tauri-apps\/api/], -}); diff --git a/plugins/window/src/api-iife.js b/plugins/window/src/api-iife.js deleted file mode 100644 index eaa20f408c..0000000000 --- a/plugins/window/src/api-iife.js +++ /dev/null @@ -1 +0,0 @@ -if("__TAURI__"in window){var __TAURI_WINDOW__=function(e){"use strict";var i=Object.defineProperty,n=(e,n)=>{for(var t in n)i(e,t,{get:n[t],enumerable:!0})},t=(e,i,n)=>{if(!i.has(e))throw TypeError("Cannot "+n)},l=(e,i,n)=>(t(e,i,"read from private field"),n?n.call(e):i.get(e)),a=(e,i,n,l)=>(t(e,i,"write to private field"),l?l.call(e,n):i.set(e,n),n);function s(e,i=!1){let n=window.crypto.getRandomValues(new Uint32Array(1))[0],t=`_${n}`;return Object.defineProperty(window,t,{value:n=>(i&&Reflect.deleteProperty(window,t),e?.(n)),writable:!1,configurable:!0}),n}n({},{Channel:()=>o,PluginListener:()=>_,addPluginListener:()=>w,convertFileSrc:()=>c,invoke:()=>u,transformCallback:()=>s});var r,o=class{constructor(){this.__TAURI_CHANNEL_MARKER__=!0,((e,i,n)=>{if(i.has(e))throw TypeError("Cannot add the same private member more than once");i instanceof WeakSet?i.add(e):i.set(e,n)})(this,r,(()=>{})),this.id=s((e=>{l(this,r).call(this,e)}))}set onmessage(e){a(this,r,e)}get onmessage(){return l(this,r)}toJSON(){return`__CHANNEL__:${this.id}`}};r=new WeakMap;var _=class{constructor(e,i,n){this.plugin=e,this.event=i,this.channelId=n}async unregister(){return u(`plugin:${this.plugin}|remove_listener`,{event:this.event,channelId:this.channelId})}};async function w(e,i,n){let t=new o;return t.onmessage=n,u(`plugin:${e}|register_listener`,{event:i,handler:t}).then((()=>new _(e,i,t.id)))}async function u(e,i={},n){return new Promise(((t,l)=>{let a=s((e=>{t(e),Reflect.deleteProperty(window,`_${r}`)}),!0),r=s((e=>{l(e),Reflect.deleteProperty(window,`_${a}`)}),!0);window.__TAURI_IPC__({cmd:e,callback:a,error:r,payload:i,options:n})}))}function c(e,i="asset"){return window.__TAURI__.convertFileSrc(e,i)}n({},{TauriEvent:()=>h,emit:()=>b,listen:()=>y,once:()=>I});var d,h=(e=>(e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_CREATED="tauri://window-created",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_FILE_DROP="tauri://file-drop",e.WINDOW_FILE_DROP_HOVER="tauri://file-drop-hover",e.WINDOW_FILE_DROP_CANCELLED="tauri://file-drop-cancelled",e.MENU="tauri://menu",e))(h||{});async function p(e,i){await u("plugin:event|unlisten",{event:e,eventId:i})}async function y(e,i,n){return u("plugin:event|listen",{event:e,windowLabel:n?.target,handler:s(i)}).then((i=>async()=>p(e,i)))}async function I(e,i,n){return y(e,(n=>{i(n),p(e,n.id).catch((()=>{}))}),n)}async function b(e,i,n){await u("plugin:event|emit",{event:e,windowLabel:n?.target,payload:i})}class g{constructor(e,i){this.type="Logical",this.width=e,this.height=i}}class E{constructor(e,i){this.type="Physical",this.width=e,this.height=i}toLogical(e){return new g(this.width/e,this.height/e)}}class O{constructor(e,i){this.type="Logical",this.x=e,this.y=i}}class A{constructor(e,i){this.type="Physical",this.x=e,this.y=i}toLogical(e){return new O(this.x/e,this.y/e)}}e.UserAttentionType=void 0,(d=e.UserAttentionType||(e.UserAttentionType={}))[d.Critical=1]="Critical",d[d.Informational=2]="Informational";class m{constructor(e){this._preventDefault=!1,this.event=e.event,this.windowLabel=e.windowLabel,this.id=e.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}function R(){return new v(window.__TAURI_METADATA__.__currentWindow.label,{skip:!0})}function N(){return window.__TAURI_METADATA__.__windows.map((e=>new v(e.label,{skip:!0})))}const T=["tauri://created","tauri://error"];class v{constructor(e,i={}){this.label=e,this.listeners=Object.create(null),(null==i?void 0:i.skip)||window.__TAURI_INVOKE__("plugin:window|create",{options:{...i,label:e}}).then((async()=>this.emit("tauri://created"))).catch((async e=>this.emit("tauri://error",e)))}static getByLabel(e){return N().some((i=>i.label===e))?new v(e,{skip:!0}):null}static getCurrent(){return R()}static getAll(){return N()}static async getFocusedWindow(){for(const e of N())if(await e.isFocused())return e;return null}async listen(e,i){return this._handleTauriEvent(e,i)?Promise.resolve((()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)})):y(e,i,{target:this.label})}async once(e,i){return this._handleTauriEvent(e,i)?Promise.resolve((()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)})):I(e,i,{target:this.label})}async emit(e,i){if(T.includes(e)){for(const n of this.listeners[e]||[])n({event:e,id:-1,windowLabel:this.label,payload:i});return Promise.resolve()}return b(e,i,{target:this.label})}_handleTauriEvent(e,i){return!!T.includes(e)&&(e in this.listeners?this.listeners[e].push(i):this.listeners[e]=[i],!0)}async scaleFactor(){return window.__TAURI_INVOKE__("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return window.__TAURI_INVOKE__("plugin:window|inner_position",{label:this.label}).then((({x:e,y:i})=>new A(e,i)))}async outerPosition(){return window.__TAURI_INVOKE__("plugin:window|outer_position",{label:this.label}).then((({x:e,y:i})=>new A(e,i)))}async innerSize(){return window.__TAURI_INVOKE__("plugin:window|inner_size",{label:this.label}).then((({width:e,height:i})=>new E(e,i)))}async outerSize(){return window.__TAURI_INVOKE__("plugin:window|outer_size",{label:this.label}).then((({width:e,height:i})=>new E(e,i)))}async isFullscreen(){return window.__TAURI_INVOKE__("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return window.__TAURI_INVOKE__("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return window.__TAURI_INVOKE__("plugin:window|is_maximized",{label:this.label})}async isFocused(){return window.__TAURI_INVOKE__("plugin:window|is_focused",{label:this.label})}async isDecorated(){return window.__TAURI_INVOKE__("plugin:window|is_decorated",{label:this.label})}async isResizable(){return window.__TAURI_INVOKE__("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return window.__TAURI_INVOKE__("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return window.__TAURI_INVOKE__("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return window.__TAURI_INVOKE__("plugin:window|is_closable",{label:this.label})}async isVisible(){return window.__TAURI_INVOKE__("plugin:window|is_visible",{label:this.label})}async title(){return window.__TAURI_INVOKE__("plugin:window|title",{label:this.label})}async theme(){return window.__TAURI_INVOKE__("plugin:window|theme",{label:this.label})}async center(){return window.__TAURI_INVOKE__("plugin:window|center",{label:this.label})}async requestUserAttention(i){let n=null;return i&&(n=i===e.UserAttentionType.Critical?{type:"Critical"}:{type:"Informational"}),window.__TAURI_INVOKE__("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(e){return window.__TAURI_INVOKE__("plugin:window|set_resizable",{label:this.label,value:e})}async setMaximizable(e){return window.__TAURI_INVOKE__("plugin:window|set_maximizable",{label:this.label,value:e})}async setMinimizable(e){return window.__TAURI_INVOKE__("plugin:window|set_minimizable",{label:this.label,value:e})}async setClosable(e){return window.__TAURI_INVOKE__("plugin:window|set_closable",{label:this.label,value:e})}async setTitle(e){return window.__TAURI_INVOKE__("plugin:window|set_title",{label:this.label,value:e})}async maximize(){return window.__TAURI_INVOKE__("plugin:window|maximize",{label:this.label})}async unmaximize(){return window.__TAURI_INVOKE__("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return window.__TAURI_INVOKE__("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return window.__TAURI_INVOKE__("plugin:window|minimize",{label:this.label})}async unminimize(){return window.__TAURI_INVOKE__("plugin:window|unminimize",{label:this.label})}async show(){return window.__TAURI_INVOKE__("plugin:window|show",{label:this.label})}async hide(){return window.__TAURI_INVOKE__("plugin:window|hide",{label:this.label})}async close(){return window.__TAURI_INVOKE__("plugin:window|close",{label:this.label})}async setDecorations(e){return window.__TAURI_INVOKE__("plugin:window|set_decorations",{label:this.label,value:e})}async setShadow(e){return window.__TAURI_INVOKE__("plugin:window|set_shadow",{label:this.label,value:e})}async setEffects(e){return window.__TAURI_INVOKE__("plugin:window|set_effects",{label:this.label,value:e})}async clearEffects(){return window.__TAURI_INVOKE__("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(e){return window.__TAURI_INVOKE__("plugin:window|set_always_on_top",{label:this.label,value:e})}async setContentProtected(e){return window.__TAURI_INVOKE__("plugin:window|set_content_protected",{label:this.label,value:e})}async setSize(e){if(!e||"Logical"!==e.type&&"Physical"!==e.type)throw new Error("the `size` argument must be either a LogicalSize or a PhysicalSize instance");return window.__TAURI_INVOKE__("plugin:window|set_size",{label:this.label,value:{type:e.type,data:{width:e.width,height:e.height}}})}async setMinSize(e){if(e&&"Logical"!==e.type&&"Physical"!==e.type)throw new Error("the `size` argument must be either a LogicalSize or a PhysicalSize instance");return window.__TAURI_INVOKE__("plugin:window|set_min_size",{label:this.label,value:e?{type:e.type,data:{width:e.width,height:e.height}}:null})}async setMaxSize(e){if(e&&"Logical"!==e.type&&"Physical"!==e.type)throw new Error("the `size` argument must be either a LogicalSize or a PhysicalSize instance");return window.__TAURI_INVOKE__("plugin:window|set_max_size",{label:this.label,value:e?{type:e.type,data:{width:e.width,height:e.height}}:null})}async setPosition(e){if(!e||"Logical"!==e.type&&"Physical"!==e.type)throw new Error("the `position` argument must be either a LogicalPosition or a PhysicalPosition instance");return window.__TAURI_INVOKE__("plugin:window|set_position",{label:this.label,value:{type:e.type,data:{x:e.x,y:e.y}}})}async setFullscreen(e){return window.__TAURI_INVOKE__("plugin:window|set_fullscreen",{label:this.label,value:e})}async setFocus(){return window.__TAURI_INVOKE__("plugin:window|set_focus",{label:this.label})}async setIcon(e){return window.__TAURI_INVOKE__("plugin:window|set_icon",{label:this.label,value:"string"==typeof e?e:Array.from(e)})}async setSkipTaskbar(e){return window.__TAURI_INVOKE__("plugin:window|set_skip_taskbar",{label:this.label,value:e})}async setCursorGrab(e){return window.__TAURI_INVOKE__("plugin:window|set_cursor_grab",{label:this.label,value:e})}async setCursorVisible(e){return window.__TAURI_INVOKE__("plugin:window|set_cursor_visible",{label:this.label,value:e})}async setCursorIcon(e){return window.__TAURI_INVOKE__("plugin:window|set_cursor_icon",{label:this.label,value:e})}async setCursorPosition(e){if(!e||"Logical"!==e.type&&"Physical"!==e.type)throw new Error("the `position` argument must be either a LogicalPosition or a PhysicalPosition instance");return window.__TAURI_INVOKE__("plugin:window|set_cursor_position",{label:this.label,value:{type:e.type,data:{x:e.x,y:e.y}}})}async setIgnoreCursorEvents(e){return window.__TAURI_INVOKE__("plugin:window|set_ignore_cursor_events",{label:this.label,value:e})}async startDragging(){return window.__TAURI_INVOKE__("plugin:window|start_dragging",{label:this.label})}async onResized(e){return this.listen(h.WINDOW_RESIZED,(i=>{i.payload=W(i.payload),e(i)}))}async onMoved(e){return this.listen(h.WINDOW_MOVED,(i=>{i.payload=D(i.payload),e(i)}))}async onCloseRequested(e){return this.listen(h.WINDOW_CLOSE_REQUESTED,(i=>{const n=new m(i);Promise.resolve(e(n)).then((()=>{if(!n.isPreventDefault())return this.close()}))}))}async onFocusChanged(e){const i=await this.listen(h.WINDOW_FOCUS,(i=>{e({...i,payload:!0})})),n=await this.listen(h.WINDOW_BLUR,(i=>{e({...i,payload:!1})}));return()=>{i(),n()}}async onScaleChanged(e){return this.listen(h.WINDOW_SCALE_FACTOR_CHANGED,e)}async onMenuClicked(e){return this.listen(h.MENU,e)}async onFileDropEvent(e){const i=await this.listen(h.WINDOW_FILE_DROP,(i=>{e({...i,payload:{type:"drop",paths:i.payload}})})),n=await this.listen(h.WINDOW_FILE_DROP_HOVER,(i=>{e({...i,payload:{type:"hover",paths:i.payload}})})),t=await this.listen(h.WINDOW_FILE_DROP_CANCELLED,(i=>{e({...i,payload:{type:"cancel"}})}));return()=>{i(),n(),t()}}async onThemeChanged(e){return this.listen(h.WINDOW_THEME_CHANGED,e)}}var f,U;function V(e){return null===e?null:{name:e.name,scaleFactor:e.scaleFactor,position:D(e.position),size:W(e.size)}}function D(e){return new A(e.x,e.y)}function W(e){return new E(e.width,e.height)}return e.Effect=void 0,(f=e.Effect||(e.Effect={})).AppearanceBased="appearanceBased",f.Light="light",f.Dark="dark",f.MediumLight="mediumLight",f.UltraDark="ultraDark",f.Titlebar="titlebar",f.Selection="selection",f.Menu="menu",f.Popover="popover",f.Sidebar="sidebar",f.HeaderView="headerView",f.Sheet="sheet",f.WindowBackground="windowBackground",f.HudWindow="hudWindow",f.FullScreenUI="fullScreenUI",f.Tooltip="tooltip",f.ContentBackground="contentBackground",f.UnderWindowBackground="underWindowBackground",f.UnderPageBackground="underPageBackground",f.Mica="mica",f.Blur="blur",f.Acrylic="acrylic",e.EffectState=void 0,(U=e.EffectState||(e.EffectState={})).FollowsWindowActiveState="followsWindowActiveState",U.Active="active",U.Inactive="inactive",e.CloseRequestedEvent=m,e.LogicalPosition=O,e.LogicalSize=g,e.PhysicalPosition=A,e.PhysicalSize=E,e.Window=v,e.availableMonitors=async function(){return window.__TAURI_INVOKE__("plugin:window|available_monitors").then((e=>e.map(V)))},e.currentMonitor=async function(){return window.__TAURI_INVOKE__("plugin:window|current_monitor").then(V)},e.getAll=N,e.getCurrent=R,e.primaryMonitor=async function(){return window.__TAURI_INVOKE__("plugin:window|primary_monitor").then(V)},e}({});Object.defineProperty(window.__TAURI__,"window",{value:__TAURI_WINDOW__})} diff --git a/plugins/window/src/desktop_commands.rs b/plugins/window/src/desktop_commands.rs deleted file mode 100644 index a6051c80a3..0000000000 --- a/plugins/window/src/desktop_commands.rs +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -use serde::{Deserialize, Serialize, Serializer}; -use tauri::{ - utils::config::{WindowConfig, WindowEffectsConfig}, - AppHandle, CursorIcon, Icon, Manager, Monitor, PhysicalPosition, PhysicalSize, Position, - Runtime, Size, Theme, UserAttentionType, Window, -}; - -#[derive(Debug, thiserror::Error)] -pub enum Error { - #[error("window not found")] - WindowNotFound, - #[error(transparent)] - Tauri(#[from] tauri::Error), -} - -impl Serialize for Error { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: Serializer, - { - serializer.serialize_str(self.to_string().as_ref()) - } -} - -type Result = std::result::Result; - -#[derive(Deserialize)] -#[serde(untagged)] -pub enum IconDto { - #[cfg(any(feature = "icon-png", feature = "icon-ico"))] - File(std::path::PathBuf), - #[cfg(any(feature = "icon-png", feature = "icon-ico"))] - Raw(Vec), - Rgba { - rgba: Vec, - width: u32, - height: u32, - }, -} - -impl From for Icon { - fn from(icon: IconDto) -> Self { - match icon { - #[cfg(any(feature = "icon-png", feature = "icon-ico"))] - IconDto::File(path) => Self::File(path), - #[cfg(any(feature = "icon-png", feature = "icon-ico"))] - IconDto::Raw(raw) => Self::Raw(raw), - IconDto::Rgba { - rgba, - width, - height, - } => Self::Rgba { - rgba, - width, - height, - }, - } - } -} - -#[tauri::command] -pub async fn create(app: AppHandle, options: WindowConfig) -> Result<()> { - tauri::window::WindowBuilder::from_config(&app, options).build()?; - Ok(()) -} - -fn get_window(window: Window, label: Option) -> Result> { - match label { - Some(l) if !l.is_empty() => window.get_window(&l).ok_or(Error::WindowNotFound), - _ => Ok(window), - } -} - -macro_rules! getter { - ($cmd: ident, $ret: ty) => { - #[tauri::command] - pub async fn $cmd(window: Window, label: Option) -> Result<$ret> { - get_window(window, label)?.$cmd().map_err(Into::into) - } - }; -} - -macro_rules! setter { - ($cmd: ident) => { - #[tauri::command] - pub async fn $cmd(window: Window, label: Option) -> Result<()> { - get_window(window, label)?.$cmd().map_err(Into::into) - } - }; - - ($cmd: ident, $input: ty) => { - #[tauri::command] - pub async fn $cmd( - window: Window, - label: Option, - value: $input, - ) -> Result<()> { - get_window(window, label)?.$cmd(value).map_err(Into::into) - } - }; -} - -getter!(scale_factor, f64); -getter!(inner_position, PhysicalPosition); -getter!(outer_position, PhysicalPosition); -getter!(inner_size, PhysicalSize); -getter!(outer_size, PhysicalSize); -getter!(is_fullscreen, bool); -getter!(is_minimized, bool); -getter!(is_maximized, bool); -getter!(is_focused, bool); -getter!(is_decorated, bool); -getter!(is_resizable, bool); -getter!(is_maximizable, bool); -getter!(is_minimizable, bool); -getter!(is_closable, bool); -getter!(is_visible, bool); -getter!(title, String); -getter!(current_monitor, Option); -getter!(primary_monitor, Option); -getter!(available_monitors, Vec); -getter!(theme, Theme); - -setter!(center); -setter!(request_user_attention, Option); -setter!(set_resizable, bool); -setter!(set_maximizable, bool); -setter!(set_minimizable, bool); -setter!(set_closable, bool); -setter!(set_title, &str); -setter!(maximize); -setter!(unmaximize); -setter!(minimize); -setter!(unminimize); -setter!(show); -setter!(hide); -setter!(close); -setter!(set_decorations, bool); -setter!(set_shadow, bool); -setter!(set_effects, Option); -setter!(set_always_on_top, bool); -setter!(set_content_protected, bool); -setter!(set_size, Size); -setter!(set_min_size, Option); -setter!(set_max_size, Option); -setter!(set_position, Position); -setter!(set_fullscreen, bool); -setter!(set_focus); -setter!(set_skip_taskbar, bool); -setter!(set_cursor_grab, bool); -setter!(set_cursor_visible, bool); -setter!(set_cursor_icon, CursorIcon); -setter!(set_cursor_position, Position); -setter!(set_ignore_cursor_events, bool); -setter!(start_dragging); -setter!(print); - -#[tauri::command] -pub async fn set_icon( - window: Window, - label: Option, - value: IconDto, -) -> Result<()> { - get_window(window, label)? - .set_icon(value.into()) - .map_err(Into::into) -} - -#[tauri::command] -pub async fn toggle_maximize(window: Window, label: Option) -> Result<()> { - let window = get_window(window, label)?; - match window.is_maximized()? { - true => window.unmaximize()?, - false => window.maximize()?, - }; - Ok(()) -} - -#[tauri::command] -pub async fn internal_toggle_maximize( - window: Window, - label: Option, -) -> Result<()> { - let window = get_window(window, label)?; - if window.is_resizable()? { - match window.is_maximized()? { - true => window.unmaximize()?, - false => window.maximize()?, - }; - } - Ok(()) -} - -#[cfg(any(debug_assertions, feature = "devtools"))] -#[tauri::command] -pub async fn internal_toggle_devtools( - window: Window, - label: Option, -) -> Result<()> { - let window = get_window(window, label)?; - if window.is_devtools_open() { - window.close_devtools(); - } else { - window.open_devtools(); - } - Ok(()) -} diff --git a/plugins/window/src/lib.rs b/plugins/window/src/lib.rs deleted file mode 100644 index 90dbd710b2..0000000000 --- a/plugins/window/src/lib.rs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -//! [![](https://github.com/tauri-apps/plugins-workspace/raw/v2/plugins/window/banner.png)](https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins/window) -//! -//! Interact with the Tauri window. - -#![doc( - html_logo_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png", - html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png" -)] - -use tauri::{ - plugin::{Builder, TauriPlugin}, - Runtime, -}; - -#[cfg(desktop)] -mod desktop_commands; - -pub fn init() -> TauriPlugin { - let mut init_script = String::new(); - // window.print works on Linux/Windows; need to use the API on macOS - #[cfg(any(target_os = "macos", target_os = "ios"))] - { - init_script.push_str(include_str!("./scripts/print.js")); - } - init_script.push_str(include_str!("./scripts/drag.js")); - #[cfg(any(debug_assertions, feature = "devtools"))] - init_script.push_str(include_str!("./scripts/toggle-devtools.js")); - - init_script.push_str(include_str!("api-iife.js")); - - Builder::new("window") - .js_init_script(init_script) - .invoke_handler(|invoke| { - #[cfg(desktop)] - { - let handler: Box) -> bool> = - Box::new(tauri::generate_handler![ - desktop_commands::create, - // getters - desktop_commands::scale_factor, - desktop_commands::inner_position, - desktop_commands::outer_position, - desktop_commands::inner_size, - desktop_commands::outer_size, - desktop_commands::is_fullscreen, - desktop_commands::is_minimized, - desktop_commands::is_maximized, - desktop_commands::is_focused, - desktop_commands::is_decorated, - desktop_commands::is_resizable, - desktop_commands::is_maximizable, - desktop_commands::is_minimizable, - desktop_commands::is_closable, - desktop_commands::is_visible, - desktop_commands::title, - desktop_commands::current_monitor, - desktop_commands::primary_monitor, - desktop_commands::available_monitors, - desktop_commands::theme, - // setters - desktop_commands::center, - desktop_commands::request_user_attention, - desktop_commands::set_resizable, - desktop_commands::set_maximizable, - desktop_commands::set_minimizable, - desktop_commands::set_closable, - desktop_commands::set_title, - desktop_commands::maximize, - desktop_commands::unmaximize, - desktop_commands::minimize, - desktop_commands::unminimize, - desktop_commands::show, - desktop_commands::hide, - desktop_commands::close, - desktop_commands::set_decorations, - desktop_commands::set_shadow, - desktop_commands::set_effects, - desktop_commands::set_always_on_top, - desktop_commands::set_content_protected, - desktop_commands::set_size, - desktop_commands::set_min_size, - desktop_commands::set_max_size, - desktop_commands::set_position, - desktop_commands::set_fullscreen, - desktop_commands::set_focus, - desktop_commands::set_skip_taskbar, - desktop_commands::set_cursor_grab, - desktop_commands::set_cursor_visible, - desktop_commands::set_cursor_icon, - desktop_commands::set_cursor_position, - desktop_commands::set_ignore_cursor_events, - desktop_commands::start_dragging, - desktop_commands::print, - desktop_commands::set_icon, - desktop_commands::toggle_maximize, - desktop_commands::internal_toggle_maximize, - #[cfg(any(debug_assertions, feature = "devtools"))] - desktop_commands::internal_toggle_devtools, - ]); - #[allow(clippy::needless_return)] - return handler(invoke); - } - #[cfg(mobile)] - { - invoke.resolver.reject("Window API not available on mobile"); - return true; - } - }) - .build() -} diff --git a/plugins/window/src/scripts/drag.js b/plugins/window/src/scripts/drag.js deleted file mode 100644 index 2bcc3ee61e..0000000000 --- a/plugins/window/src/scripts/drag.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -document.addEventListener("mousedown", (e) => { - if (e.target.hasAttribute("data-tauri-drag-region") && e.button === 0) { - // prevents text cursor - e.preventDefault(); - // fix #2549: double click on drag region edge causes content to maximize without window sizing change - // https://github.com/tauri-apps/tauri/issues/2549#issuecomment-1250036908 - e.stopImmediatePropagation(); - - // start dragging if the element has a `tauri-drag-region` data attribute and maximize on double-clicking it - const cmd = e.detail === 2 ? "internal_toggle_maximize" : "start_dragging"; - window.__TAURI_INVOKE__("plugin:window|" + cmd); - } -}); diff --git a/plugins/window/src/scripts/print.js b/plugins/window/src/scripts/print.js deleted file mode 100644 index 1e83376675..0000000000 --- a/plugins/window/src/scripts/print.js +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -window.print = function () { - return window.__TAURI_INVOKE__("plugin:window|print"); -}; diff --git a/plugins/window/src/scripts/toggle-devtools.js b/plugins/window/src/scripts/toggle-devtools.js deleted file mode 100644 index 42c4bdba6f..0000000000 --- a/plugins/window/src/scripts/toggle-devtools.js +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2019-2023 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -(function () { - function toggleDevtoolsHotkey() { - const isHotkey = navigator.appVersion.includes("Mac") - ? (event) => event.metaKey && event.altKey && event.key === "I" - : (event) => event.ctrlKey && event.shiftKey && event.key === "I"; - - document.addEventListener("keydown", (event) => { - if (isHotkey(event)) { - window.__TAURI_INVOKE__("plugin:window|internal_toggle_devtools"); - } - }); - } - - if ( - document.readyState === "complete" || - document.readyState === "interactive" - ) { - toggleDevtoolsHotkey(); - } else { - window.addEventListener("DOMContentLoaded", toggleDevtoolsHotkey, true); - } -})(); diff --git a/plugins/window/tsconfig.json b/plugins/window/tsconfig.json deleted file mode 100644 index 5098169aa9..0000000000 --- a/plugins/window/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["guest-js/*.ts"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b164242d17..22b63fd505 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,9 +66,6 @@ importers: '@tauri-apps/api': specifier: 2.0.0-alpha.8 version: 2.0.0-alpha.8 - '@tauri-apps/plugin-app': - specifier: 2.0.0-alpha.1 - version: link:../../plugins/app '@tauri-apps/plugin-barcode-scanner': specifier: 2.0.0-alpha.0 version: link:../../plugins/barcode-scanner @@ -105,9 +102,6 @@ importers: '@tauri-apps/plugin-updater': specifier: 2.0.0-alpha.1 version: link:../../plugins/updater - '@tauri-apps/plugin-window': - specifier: 2.0.0-alpha.1 - version: link:../../plugins/window '@zerodevx/svelte-json-view': specifier: 1.0.5 version: 1.0.5(svelte@3.59.1) @@ -140,16 +134,6 @@ importers: specifier: ^4.3.9 version: 4.4.4 - plugins/app: - dependencies: - '@tauri-apps/api': - specifier: 2.0.0-alpha.8 - version: 2.0.0-alpha.8 - devDependencies: - tslib: - specifier: ^2.5.0 - version: 2.6.0 - plugins/authenticator: dependencies: '@tauri-apps/api': @@ -429,16 +413,6 @@ importers: specifier: 4.4.4 version: 4.4.4 - plugins/window: - dependencies: - '@tauri-apps/api': - specifier: 2.0.0-alpha.8 - version: 2.0.0-alpha.8 - devDependencies: - tslib: - specifier: ^2.5.0 - version: 2.6.0 - plugins/window-state: dependencies: '@tauri-apps/api':