From 53044e7d40ffb04b033f97d120b6a87878658d23 Mon Sep 17 00:00:00 2001 From: lashman Date: Sun, 26 Apr 2026 17:50:04 +0300 Subject: [PATCH] initial commit with full project --- .gitignore | 28 + package-lock.json | 6085 +++++++++++++++++ package.json | 35 + src-tauri/Cargo.lock | 5660 ++++++++++++++++ src-tauri/Cargo.toml | 26 + src-tauri/build.rs | 3 + src-tauri/capabilities/default.json | 41 + src-tauri/gen/schemas/acl-manifests.json | 1 + src-tauri/gen/schemas/capabilities.json | 1 + src-tauri/gen/schemas/desktop-schema.json | 6463 +++++++++++++++++++ src-tauri/gen/schemas/windows-schema.json | 6463 +++++++++++++++++++ src-tauri/icons/icon.ico | Bin 0 -> 285478 bytes src-tauri/icons/icon.png | Bin 0 -> 118631 bytes src-tauri/src/commands/analyze.rs | 165 + src-tauri/src/commands/mod.rs | 3 + src-tauri/src/commands/process.rs | 312 + src-tauri/src/commands/utility.rs | 422 ++ src-tauri/src/config.rs | 36 + src-tauri/src/ffmpeg/commands.rs | 453 ++ src-tauri/src/ffmpeg/discovery.rs | 190 + src-tauri/src/ffmpeg/mod.rs | 4 + src-tauri/src/ffmpeg/probe.rs | 162 + src-tauri/src/ffmpeg/runner.rs | 303 + src-tauri/src/lib.rs | 153 + src-tauri/src/main.rs | 5 + src-tauri/src/recovery.rs | 59 + src-tauri/src/stream_server.rs | 167 + src-tauri/src/types.rs | 204 + src-tauri/tauri.conf.json | 41 + src/app.css | 198 + src/app.html | 12 + src/lib/components/AdvancedOptions.svelte | 387 ++ src/lib/components/AnalyzingSkeleton.svelte | 245 + src/lib/components/CompressPresets.svelte | 318 + src/lib/components/CtaBar.svelte | 473 ++ src/lib/components/CustomSelect.svelte | 246 + src/lib/components/DropZone.svelte | 295 + src/lib/components/FfmpegLog.svelte | 70 + src/lib/components/FileInfoBar.svelte | 116 + src/lib/components/MainView.svelte | 166 + src/lib/components/SegmentedControl.svelte | 97 + src/lib/components/SetupWizard.svelte | 533 ++ src/lib/components/Slider.svelte | 156 + src/lib/components/StatsCard.svelte | 276 + src/lib/components/Timeline.svelte | 659 ++ src/lib/components/TitleBar.svelte | 189 + src/lib/components/Toast.svelte | 68 + src/lib/components/ToastContainer.svelte | 16 + src/lib/components/Toggle.svelte | 62 + src/lib/components/VideoPreview.svelte | 282 + src/lib/stores/app.svelte.ts | 238 + src/lib/stores/config.svelte.ts | 52 + src/lib/stores/theme.svelte.ts | 56 + src/lib/stores/toast.svelte.ts | 34 + src/lib/types.ts | 143 + src/lib/utils/format.ts | 53 + src/lib/utils/keyboard.ts | 51 + src/lib/utils/tauri.ts | 117 + src/routes/+layout.svelte | 202 + src/routes/+layout.ts | 2 + src/routes/+page.svelte | 5 + src/routes/settings/+page.svelte | 774 +++ static/fonts/GeistMono-Variable.woff2 | Bin 0 -> 31368 bytes static/fonts/NunitoSans-Variable.woff2 | Bin 0 -> 49648 bytes static/fonts/Syne-Variable.woff2 | Bin 0 -> 34608 bytes svelte.config.js | 12 + tsconfig.json | 14 + vite.config.ts | 13 + 68 files changed, 34115 insertions(+) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/capabilities/default.json create mode 100644 src-tauri/gen/schemas/acl-manifests.json create mode 100644 src-tauri/gen/schemas/capabilities.json create mode 100644 src-tauri/gen/schemas/desktop-schema.json create mode 100644 src-tauri/gen/schemas/windows-schema.json create mode 100644 src-tauri/icons/icon.ico create mode 100644 src-tauri/icons/icon.png create mode 100644 src-tauri/src/commands/analyze.rs create mode 100644 src-tauri/src/commands/mod.rs create mode 100644 src-tauri/src/commands/process.rs create mode 100644 src-tauri/src/commands/utility.rs create mode 100644 src-tauri/src/config.rs create mode 100644 src-tauri/src/ffmpeg/commands.rs create mode 100644 src-tauri/src/ffmpeg/discovery.rs create mode 100644 src-tauri/src/ffmpeg/mod.rs create mode 100644 src-tauri/src/ffmpeg/probe.rs create mode 100644 src-tauri/src/ffmpeg/runner.rs create mode 100644 src-tauri/src/lib.rs create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/src/recovery.rs create mode 100644 src-tauri/src/stream_server.rs create mode 100644 src-tauri/src/types.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 src/app.css create mode 100644 src/app.html create mode 100644 src/lib/components/AdvancedOptions.svelte create mode 100644 src/lib/components/AnalyzingSkeleton.svelte create mode 100644 src/lib/components/CompressPresets.svelte create mode 100644 src/lib/components/CtaBar.svelte create mode 100644 src/lib/components/CustomSelect.svelte create mode 100644 src/lib/components/DropZone.svelte create mode 100644 src/lib/components/FfmpegLog.svelte create mode 100644 src/lib/components/FileInfoBar.svelte create mode 100644 src/lib/components/MainView.svelte create mode 100644 src/lib/components/SegmentedControl.svelte create mode 100644 src/lib/components/SetupWizard.svelte create mode 100644 src/lib/components/Slider.svelte create mode 100644 src/lib/components/StatsCard.svelte create mode 100644 src/lib/components/Timeline.svelte create mode 100644 src/lib/components/TitleBar.svelte create mode 100644 src/lib/components/Toast.svelte create mode 100644 src/lib/components/ToastContainer.svelte create mode 100644 src/lib/components/Toggle.svelte create mode 100644 src/lib/components/VideoPreview.svelte create mode 100644 src/lib/stores/app.svelte.ts create mode 100644 src/lib/stores/config.svelte.ts create mode 100644 src/lib/stores/theme.svelte.ts create mode 100644 src/lib/stores/toast.svelte.ts create mode 100644 src/lib/types.ts create mode 100644 src/lib/utils/format.ts create mode 100644 src/lib/utils/keyboard.ts create mode 100644 src/lib/utils/tauri.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+layout.ts create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/settings/+page.svelte create mode 100644 static/fonts/GeistMono-Variable.woff2 create mode 100644 static/fonts/NunitoSans-Variable.woff2 create mode 100644 static/fonts/Syne-Variable.woff2 create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..20f2313 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +node_modules/ +build/ +.svelte-kit/ +src-tauri/target/ +dist/ +*.md +!README.md +.claude/ +CLAUDE.md +.cursorrules +.cursor/ +.github/copilot* +.vscode/ +.aider* +.continue/ +.codeium/ +.tabnine* +.codex/ +.agents/ +SKILL.md +.ccmanager.json +.copilot* +.windsurfrules +.windsurf/ +.bolt/ +.idx/ +.replit +.devcontainer/ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..79d5287 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6085 @@ +{ + "name": "cinch", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cinch", + "version": "1.0.0", + "dependencies": { + "@tabler/icons-webfont": "^3.41.1", + "@tauri-apps/api": "^2.10.1", + "@tauri-apps/plugin-dialog": "^2.2.0", + "@tauri-apps/plugin-fs": "^2.2.0", + "@tauri-apps/plugin-opener": "^2.5.3", + "@tauri-apps/plugin-process": "^2.2.0", + "@tauri-apps/plugin-shell": "^2.2.0" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.55.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tailwindcss/vite": "^4.2.2", + "@tauri-apps/cli": "^2.10.1", + "png-to-ico": "^3.0.1", + "puppeteer-core": "^24.42.0", + "sharp": "^0.34.5", + "svelte": "^5.55.1", + "tailwindcss": "^4.2.2", + "typescript": "^5.7.0", + "vite": "^6.3.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@puppeteer/browsers": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", + "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.4", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", + "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz", + "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz", + "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz", + "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz", + "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz", + "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz", + "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz", + "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz", + "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz", + "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz", + "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz", + "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz", + "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz", + "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz", + "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz", + "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz", + "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz", + "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz", + "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz", + "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz", + "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz", + "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz", + "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz", + "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz", + "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.55.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.55.0.tgz", + "integrity": "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.6.4", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "set-cookie-parser": "^3.0.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@tabler/icons": { + "version": "3.41.1", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.41.1.tgz", + "integrity": "sha512-OaRnVbRmH2nHtFeg+RmMJ/7m2oBIF9XCJAUD5gQnMrpK9f05ydj8MZrAf3NZQqOXyxGN1UBL0D5IKLLEUfr74Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-webfont": { + "version": "3.41.1", + "resolved": "https://registry.npmjs.org/@tabler/icons-webfont/-/icons-webfont-3.41.1.tgz", + "integrity": "sha512-XPbuQ1KR3HsK9mnMgW8NHNHbzfS85UVwDRkLT3D8I2TaiDkxpm835yHEx7SuwDcZqy263y0C8jORpKApZi4Kiw==", + "dependencies": { + "@tabler/icons": "3.41.1", + "svg-path-commander": "^2.1.11", + "svgtofont": "^6.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tauri-apps/api": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.1.tgz", + "integrity": "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.10.1", + "@tauri-apps/cli-darwin-x64": "2.10.1", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", + "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", + "@tauri-apps/cli-linux-arm64-musl": "2.10.1", + "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-musl": "2.10.1", + "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", + "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", + "@tauri-apps/cli-win32-x64-msvc": "2.10.1" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.1.tgz", + "integrity": "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.1.tgz", + "integrity": "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.1.tgz", + "integrity": "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.1.tgz", + "integrity": "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.1.tgz", + "integrity": "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.1.tgz", + "integrity": "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.1.tgz", + "integrity": "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.1.tgz", + "integrity": "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.1.tgz", + "integrity": "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.1.tgz", + "integrity": "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.1.tgz", + "integrity": "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-dialog": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.6.0.tgz", + "integrity": "sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-fs": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.5.tgz", + "integrity": "sha512-dVxWWGE6VrOxC7/jlhyE+ON/Cc2REJlM35R3PJX3UvFw2XwYhLGQVAIyrehenDdKjotipjYEVc4YjOl3qq90fA==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz", + "integrity": "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-process": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.3.1.tgz", + "integrity": "sha512-nCa4fGVaDL/B9ai03VyPOjfAHRHSBz5v6F/ObsB73r/dA3MHHhZtldaDMIc0V/pnUw9ehzr2iEG+XkSEyC0JJA==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tauri-apps/plugin-shell": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.3.5.tgz", + "integrity": "sha512-jewtULhiQ7lI7+owCKAjc8tYLJr92U16bPOeAa472LHJdgaibLP83NcfAF2e+wkEcA53FxKQAZ7byDzs2eeizg==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.10.1" + } + }, + "node_modules/@thednp/dommatrix": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@thednp/dommatrix/-/dommatrix-2.0.12.tgz", + "integrity": "sha512-eOshhlSShBXLfrMQqqhA450TppJXhKriaQdN43mmniOCMn9sD60QKF1Axsj7bKl339WH058LuGFS6H84njYH5w==", + "license": "MIT", + "engines": { + "node": ">=20", + "pnpm": ">=8.6.0" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", + "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version has critical issues, please update to the latest version", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/auto-config-loader": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/auto-config-loader/-/auto-config-loader-2.0.2.tgz", + "integrity": "sha512-0V8gZAGGqiFDP15d6d4/Emi6Gpozbr1S9lSfxJ+lNV8nF+7grhcgbHIgn3O/DQKybS+cDqVMC3rxH8k+o0ISpA==", + "license": "MIT", + "dependencies": { + "ini": "^5.0.0", + "jiti": "^2.4.1", + "jsonc-eslint-parser": "^2.3.0", + "lodash.merge": "^4.6.2", + "sucrase": "^3.35.0", + "toml-eslint-parser": "^0.10.0", + "yaml-eslint-parser": "^1.2.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz", + "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.0.tgz", + "integrity": "sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz", + "integrity": "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.2.tgz", + "integrity": "sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/basic-ftp": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.0.tgz", + "integrity": "sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bufferstreams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-4.0.0.tgz", + "integrity": "sha512-azX778/2VQ9K2uiYprSUKLgK2K6lR1KtJycJDsMg7u0+Cc994A9HyGaUKb01e/T+M8jse057429iKXurCaT35g==", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0", + "yerror": "^8.0.0" + }, + "engines": { + "node": ">=20.11.1" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cacache/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cacache/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacache/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cacache/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-bidi": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colors-cli": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/colors-cli/-/colors-cli-1.0.33.tgz", + "integrity": "sha512-PWGsmoJFdOB0t+BeHgmtuoRZUQucOLl5ii81NBzOOGVxlgE04muFNHlR5j8i8MKbOPELBl3243AI6lGBTj5ICQ==", + "license": "MIT", + "bin": { + "colors": "bin/colors" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/cubic2quad": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", + "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==", + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "dev": true, + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.1595872", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1595872.tgz", + "integrity": "sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrap": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.4.tgz", + "integrity": "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@typescript-eslint/types": "^8.2.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.0" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "BlueOak-1.0.0", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image2uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/image2uri/-/image2uri-2.1.2.tgz", + "integrity": "sha512-3b2zRma8I3zulb4OCkZruRw1VsnysT9phBzOJj+x3lPkwybJtNa5Sz6Dw8jSQI6OL7Ns4H5h8Y26EJbwq4GhQQ==", + "license": "MIT", + "dependencies": { + "node-fetch": "^3.3.1" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^9.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/microbuffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", + "integrity": "sha512-O/SUXauVN4x6RaEJFqSPcXNtLFL+QzJHKZlyDVYFwcDDRVca3Fa/37QXXC+4zAGGa4YhHrHxKXuuHvLDIQECtA==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.26.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.26.2.tgz", + "integrity": "sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-gyp": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/png-to-ico": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/png-to-ico/-/png-to-ico-3.0.1.tgz", + "integrity": "sha512-S8BOAoaGd9gT5uaemQ62arIY3Jzco7Uc7LwUTqRyqJDTsKqOAiyfyN4dSdT0D+Zf8XvgztgpRbM5wnQd7EgYwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.10.3", + "minimist": "^1.2.8", + "pngjs": "^7.0.0" + }, + "bin": { + "png-to-ico": "bin/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/png-to-ico/node_modules/@types/node": { + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/png-to-ico/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer-core": { + "version": "24.42.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.42.0.tgz", + "integrity": "sha512-T4zXokk/izH01fYPhyyev1A4piWiOKrYq7CUFpdoYQxmOnXoV6YjUabmfIjCYkNspSoAXIxRid3Tw+Vg0fthYg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.0", + "chromium-bidi": "14.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1595872", + "typed-query-selector": "^2.12.1", + "webdriver-bidi-protocol": "0.4.1", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rollup": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz", + "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.0", + "@rollup/rollup-android-arm64": "4.60.0", + "@rollup/rollup-darwin-arm64": "4.60.0", + "@rollup/rollup-darwin-x64": "4.60.0", + "@rollup/rollup-freebsd-arm64": "4.60.0", + "@rollup/rollup-freebsd-x64": "4.60.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", + "@rollup/rollup-linux-arm-musleabihf": "4.60.0", + "@rollup/rollup-linux-arm64-gnu": "4.60.0", + "@rollup/rollup-linux-arm64-musl": "4.60.0", + "@rollup/rollup-linux-loong64-gnu": "4.60.0", + "@rollup/rollup-linux-loong64-musl": "4.60.0", + "@rollup/rollup-linux-ppc64-gnu": "4.60.0", + "@rollup/rollup-linux-ppc64-musl": "4.60.0", + "@rollup/rollup-linux-riscv64-gnu": "4.60.0", + "@rollup/rollup-linux-riscv64-musl": "4.60.0", + "@rollup/rollup-linux-s390x-gnu": "4.60.0", + "@rollup/rollup-linux-x64-gnu": "4.60.0", + "@rollup/rollup-linux-x64-musl": "4.60.0", + "@rollup/rollup-openbsd-x64": "4.60.0", + "@rollup/rollup-openharmony-arm64": "4.60.0", + "@rollup/rollup-win32-arm64-msvc": "4.60.0", + "@rollup/rollup-win32-ia32-msvc": "4.60.0", + "@rollup/rollup-win32-x64-gnu": "4.60.0", + "@rollup/rollup-win32-x64-msvc": "4.60.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", + "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/svelte": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.1.tgz", + "integrity": "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.4", + "esm-env": "^1.2.1", + "esrap": "^2.2.4", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svg-path-commander": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/svg-path-commander/-/svg-path-commander-2.1.11.tgz", + "integrity": "sha512-wmQ6QA3Od+HOcpIzLjPlbv59+x3yd3V5W6xitUOvAHmqZpP7wVrRM2CHqEm5viHUbZu6PjzFsjbTEFtIeUxaNA==", + "license": "MIT", + "dependencies": { + "@thednp/dommatrix": "^2.0.12" + }, + "engines": { + "node": ">=16", + "pnpm": ">=8.6.0" + } + }, + "node_modules/svg-pathdata": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-7.2.0.tgz", + "integrity": "sha512-qd+AxqMpfRrRQaWb2SrNFvn69cvl6piqY8TxhYl2Li1g4/LO5F9NJb5wI4vNwRryqgSgD43gYKLm/w3ag1bKvQ==", + "license": "MIT", + "engines": { + "node": ">=20.11.1" + } + }, + "node_modules/svg2ttf": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.0.3.tgz", + "integrity": "sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.7.2", + "argparse": "^2.0.1", + "cubic2quad": "^1.2.1", + "lodash": "^4.17.10", + "microbuffer": "^1.0.0", + "svgpath": "^2.1.5" + }, + "bin": { + "svg2ttf": "svg2ttf.js" + } + }, + "node_modules/svgicons2svgfont": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-15.0.1.tgz", + "integrity": "sha512-rE3BoIipD6DxBejPswalKRZZYA+7sy4miHqiHgXB0zI1xJD3gSCVrXh2R6Sdh9E4XDTxYp7gDxGW2W8DIBif/g==", + "license": "MIT", + "dependencies": { + "@types/sax": "^1.2.7", + "commander": "^12.1.0", + "debug": "^4.3.6", + "glob": "^11.0.0", + "sax": "^1.4.1", + "svg-pathdata": "^7.0.0", + "transformation-matrix": "^3.0.0", + "yerror": "^8.0.0" + }, + "bin": { + "svgicons2svgfont": "bin/svgicons2svgfont.js" + }, + "engines": { + "node": ">=20.11.1" + } + }, + "node_modules/svgicons2svgfont/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgpath": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.6.0.tgz", + "integrity": "sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==", + "license": "MIT", + "funding": { + "url": "https://github.com/fontello/svg2ttf?sponsor=1" + } + }, + "node_modules/svgtofont": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/svgtofont/-/svgtofont-6.5.1.tgz", + "integrity": "sha512-qhKdsOBV83o3elEQP//lnEqyhyVfwvnspIqtnPSSxJAHK1Ze8/ELo13Ax28rJiN+2NkikVQEYePsM7ECYHJXBQ==", + "license": "MIT", + "dependencies": { + "auto-config-loader": "^2.0.0", + "cheerio": "~1.0.0", + "colors-cli": "~1.0.28", + "fs-extra": "~11.2.0", + "image2uri": "^2.1.2", + "nunjucks": "^3.2.4", + "svg2ttf": "~6.0.3", + "svgicons2svgfont": "~15.0.0", + "svgo": "~3.3.0", + "ttf2eot": "~3.1.0", + "ttf2woff": "~3.0.0", + "ttf2woff2": "~8.0.0", + "yargs": "^17.7.2" + }, + "bin": { + "svgtofont": "lib/cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@types/svg2ttf": "~5.0.1" + }, + "peerDependenciesMeta": { + "@types/svg2ttf": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toml-eslint-parser": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.1.tgz", + "integrity": "sha512-9mjy3frhioGIVGcwamlVlUyJ9x+WHw/TXiz9R4YOlmsIuBN43r9Dp8HZ35SF9EKjHrn3BUZj04CF+YqZ2oJ+7w==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/transformation-matrix": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-3.1.0.tgz", + "integrity": "sha512-oYubRWTi2tYFHAL2J8DLvPIqIYcYZ0fSOi2vmSy042Ho4jBW2ce6VP7QfD44t65WQz6bw5w1Pk22J7lcUpaTKA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/chrvadala" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/ttf2eot": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-3.1.0.tgz", + "integrity": "sha512-aHTbcYosNHVqb2Qtt9Xfta77ae/5y0VfdwNLUS6sGBeGr22cX2JDMo/i5h3uuOf+FAD3akYOr17+fYd5NK8aXw==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "ttf2eot": "ttf2eot.js" + } + }, + "node_modules/ttf2woff": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-3.0.0.tgz", + "integrity": "sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "pako": "^1.0.0" + }, + "bin": { + "ttf2woff": "ttf2woff.js" + } + }, + "node_modules/ttf2woff2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ttf2woff2/-/ttf2woff2-8.0.1.tgz", + "integrity": "sha512-nWSZLaXOgYtvgY6G0SFI8dVHsGWIchlnNMNRglT3Amp2WGy0GSPd9kLAkFd+HvEOzZ/aY6EUrpOF66QaPbipgg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "bufferstreams": "^4.0.0", + "debug": "^4.4.1", + "nan": "^2.22.2", + "node-gyp": "^11.2.0", + "yerror": "^8.0.0" + }, + "bin": { + "ttf2woff2": "bin/ttf2woff2.js" + }, + "engines": { + "node": ">=20.11.1" + } + }, + "node_modules/typed-query-selector": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz", + "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz", + "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", + "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yerror": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/yerror/-/yerror-8.0.0.tgz", + "integrity": "sha512-FemWD5/UqNm8ffj8oZIbjWXIF2KE0mZssggYpdaQkWDDgXBQ/35PNIxEuz6/YLn9o0kOxDBNJe8x8k9ljD7k/g==", + "license": "MIT", + "engines": { + "node": ">=18.16.0" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e814a1f --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "cinch", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@tabler/icons-webfont": "^3.41.1", + "@tauri-apps/api": "^2.10.1", + "@tauri-apps/plugin-dialog": "^2.2.0", + "@tauri-apps/plugin-fs": "^2.2.0", + "@tauri-apps/plugin-opener": "^2.5.3", + "@tauri-apps/plugin-process": "^2.2.0", + "@tauri-apps/plugin-shell": "^2.2.0" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.55.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tailwindcss/vite": "^4.2.2", + "@tauri-apps/cli": "^2.10.1", + "png-to-ico": "^3.0.1", + "puppeteer-core": "^24.42.0", + "sharp": "^0.34.5", + "svelte": "^5.55.1", + "tailwindcss": "^4.2.2", + "typescript": "^5.7.0", + "vite": "^6.3.0" + } +} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..5c64625 --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,5660 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "cinch" +version = "1.0.0" +dependencies = [ + "http", + "http-range", + "percent-encoding", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-fs", + "tauri-plugin-opener", + "tauri-plugin-process", + "tauri-plugin-shell", + "tauri-plugin-window-state", + "tokio", + "uuid", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser 0.36.0", + "foldhash 0.2.0", + "html5ever 0.38.0", + "precomputed-hash", + "selectors 0.36.1", + "tendril 0.5.0", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever 0.14.1", + "match_token", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever 0.38.0", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "js-sys" +version = "0.3.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4c90f45aa2e6eacbe8645f77fdea542ac97a494bcd117a67df9ff4d611f995" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.13.0", + "selectors 0.24.0", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", +] + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril 0.5.0", + "web_atoms", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "os_pipe" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.8+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser 0.29.6", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc 0.2.0", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.0", + "cssparser 0.36.0", + "derive_more 2.1.1", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen 0.13.1", + "precomputed-hash", + "rustc-hash", + "servo_arc 0.4.3", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shared_child" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" +dependencies = [ + "libc", + "sigchld", + "windows-sys 0.60.2", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9204b425d9be8d12aa60c2a83a289cf7d1caae40f57f336ed1155b3a5c0e359b" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.18", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed390cc669f937afeb8b28032ce837bac8ea023d975a2e207375ec05afaf1804" +dependencies = [ + "anyhow", + "dunce", + "glob", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-plugin-process" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55511a7bf6cd70c8767b02c97bf8134fa434daf3926cfc1be0a0f94132d165a" +dependencies = [ + "tauri", + "tauri-plugin", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8457dbf9e2bab1edd8df22bb2c20857a59a9868e79cb3eac5ed639eec4d0c73b" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars 0.8.22", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "tauri-plugin-window-state" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73736611e14142408d15353e21e3cca2f12a3cfb523ad0ce85999b6d2ef1a704" +dependencies = [ + "bitflags 2.11.0", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever 0.29.1", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.1.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 1.1.0+spec-1.1.0", + "toml_parser", + "winnow 1.0.0", +] + +[[package]] +name = "toml_parser" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "toml_writer" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6523d69017b7633e396a89c5efab138161ed5aafcbc8d3e5c5a42ae38f50495a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1faf851e778dfa54db7cd438b70758eba9755cb47403f3496edd7c8fc212f0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3a6c758eb2f701ed3d052ff5737f5bfe6614326ea7f3bbac7156192dc32e67" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921de2737904886b52bcbb237301552d05969a6f9c40d261eb0533c8b055fedf" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93e946af942b58934c604527337bad9ae33ba1d5c6900bbb41c2c07c2364a93" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84cde8507f4d7cfcb1185b8cb5890c494ffea65edbe1ba82cfd63661c805ed94" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +dependencies = [ + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.15", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..b55b81c --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "cinch" +version = "1.0.0" +edition = "2021" + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[features] +custom-protocol = ["tauri/custom-protocol"] + +[dependencies] +tauri = { version = "2", features = ["devtools"] } +tauri-plugin-shell = "2" +tauri-plugin-dialog = "2" +tauri-plugin-process = "2" +tauri-plugin-fs = "2" +tauri-plugin-opener = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +tokio = { version = "1", features = ["full"] } +uuid = { version = "1", features = ["v4"] } +http = "1" +http-range = "0.1" +percent-encoding = "2" +tauri-plugin-window-state = "2.4.1" diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..261851f --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build(); +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..00db037 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-utils/schema.json", + "identifier": "default", + "description": "Default capabilities for Cinch", + "windows": ["main"], + "permissions": [ + "core:default", + "shell:allow-open", + "shell:allow-execute", + "shell:allow-spawn", + "shell:allow-stdin-write", + "shell:allow-kill", + "dialog:allow-open", + "dialog:allow-save", + "fs:default", + "fs:allow-read", + "fs:allow-read-file", + "fs:allow-write", + "fs:allow-write-file", + "fs:allow-exists", + "fs:allow-mkdir", + "fs:allow-remove", + "fs:allow-rename", + { + "identifier": "fs:scope", + "allow": [ + { "path": "**" } + ] + }, + "process:allow-exit", + "process:allow-restart", + "opener:default", + { + "identifier": "opener:allow-open-path", + "allow": [ + { "path": "**" } + ] + }, + "opener:allow-reveal-item-in-dir" + ] +} diff --git a/src-tauri/gen/schemas/acl-manifests.json b/src-tauri/gen/schemas/acl-manifests.json new file mode 100644 index 0000000..df272bb --- /dev/null +++ b/src-tauri/gen/schemas/acl-manifests.json @@ -0,0 +1 @@ +{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-ask","allow-confirm","allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines","read_text_file_lines_next"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file","open","write"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir","scope-app-index"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists","scope-app-recursive"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists","size"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the application folders.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"},{"path":"$APPDATA"},{"path":"$APPDATA/*"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"},{"path":"$APPCACHE"},{"path":"$APPCACHE/*"},{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the application directories.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete application folders, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"},{"path":"$APPDATA"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE"},{"path":"$APPCACHE/**"},{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the application folders.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete application folders, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the application folders.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete application folders, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},{"properties":{"path":{"description":"A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}},"opener":{"default_permission":{"identifier":"default","description":"This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer","permissions":["allow-open-url","allow-reveal-item-in-dir","allow-default-urls"]},"permissions":{"allow-default-urls":{"identifier":"allow-default-urls","description":"This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"url":"mailto:*"},{"url":"tel:*"},{"url":"http://*"},{"url":"https://*"}]}},"allow-open-path":{"identifier":"allow-open-path","description":"Enables the open_path command without any pre-configured scope.","commands":{"allow":["open_path"],"deny":[]}},"allow-open-url":{"identifier":"allow-open-url","description":"Enables the open_url command without any pre-configured scope.","commands":{"allow":["open_url"],"deny":[]}},"allow-reveal-item-in-dir":{"identifier":"allow-reveal-item-in-dir","description":"Enables the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":["reveal_item_in_dir"],"deny":[]}},"deny-open-path":{"identifier":"deny-open-path","description":"Denies the open_path command without any pre-configured scope.","commands":{"allow":[],"deny":["open_path"]}},"deny-open-url":{"identifier":"deny-open-url","description":"Denies the open_url command without any pre-configured scope.","commands":{"allow":[],"deny":["open_url"]}},"deny-reveal-item-in-dir":{"identifier":"deny-reveal-item-in-dir","description":"Denies the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["reveal_item_in_dir"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this url with, for example: firefox."},"url":{"description":"A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"type":"object"},{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this path with, for example: xdg-open."},"path":{"description":"A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"definitions":{"Application":{"anyOf":[{"description":"Open in default application.","type":"null"},{"description":"If true, allow open with any application.","type":"boolean"},{"description":"Allow specific application to open with.","type":"string"}],"description":"Opener scope application."}},"description":"Opener scope entry.","title":"OpenerScopeEntry"}},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}},"window-state":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-filename","allow-restore-state","allow-save-window-state"]},"permissions":{"allow-filename":{"identifier":"allow-filename","description":"Enables the filename command without any pre-configured scope.","commands":{"allow":["filename"],"deny":[]}},"allow-restore-state":{"identifier":"allow-restore-state","description":"Enables the restore_state command without any pre-configured scope.","commands":{"allow":["restore_state"],"deny":[]}},"allow-save-window-state":{"identifier":"allow-save-window-state","description":"Enables the save_window_state command without any pre-configured scope.","commands":{"allow":["save_window_state"],"deny":[]}},"deny-filename":{"identifier":"deny-filename","description":"Denies the filename command without any pre-configured scope.","commands":{"allow":[],"deny":["filename"]}},"deny-restore-state":{"identifier":"deny-restore-state","description":"Denies the restore_state command without any pre-configured scope.","commands":{"allow":[],"deny":["restore_state"]}},"deny-save-window-state":{"identifier":"deny-save-window-state","description":"Denies the save_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["save_window_state"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json new file mode 100644 index 0000000..b896cf7 --- /dev/null +++ b/src-tauri/gen/schemas/capabilities.json @@ -0,0 +1 @@ +{"default":{"identifier":"default","description":"Default capabilities for Cinch","local":true,"windows":["main"],"permissions":["core:default","shell:allow-open","shell:allow-execute","shell:allow-spawn","shell:allow-stdin-write","shell:allow-kill","dialog:allow-open","dialog:allow-save","fs:default","fs:allow-read","fs:allow-read-file","fs:allow-write","fs:allow-write-file","fs:allow-exists","fs:allow-mkdir","fs:allow-remove","fs:allow-rename",{"identifier":"fs:scope","allow":[{"path":"**"}]},"process:allow-exit","process:allow-restart","opener:default",{"identifier":"opener:allow-open-path","allow":[{"path":"**"}]},"opener:allow-reveal-item-in-dir"]}} \ No newline at end of file diff --git a/src-tauri/gen/schemas/desktop-schema.json b/src-tauri/gen/schemas/desktop-schema.json new file mode 100644 index 0000000..6f843f6 --- /dev/null +++ b/src-tauri/gen/schemas/desktop-schema.json @@ -0,0 +1,6463 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`", + "type": "string", + "const": "fs:default", + "markdownDescription": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`" + }, + { + "description": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`", + "type": "string", + "const": "fs:allow-app-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`" + }, + { + "description": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-read", + "markdownDescription": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-write", + "markdownDescription": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`", + "type": "string", + "const": "fs:allow-appcache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`", + "type": "string", + "const": "fs:allow-appconfig-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`", + "type": "string", + "const": "fs:allow-appdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`", + "type": "string", + "const": "fs:allow-applocaldata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`", + "type": "string", + "const": "fs:allow-applog-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`", + "type": "string", + "const": "fs:allow-audio-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-read", + "markdownDescription": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-write", + "markdownDescription": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`", + "type": "string", + "const": "fs:allow-cache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-read", + "markdownDescription": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-write", + "markdownDescription": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`", + "type": "string", + "const": "fs:allow-config-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-read", + "markdownDescription": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-write", + "markdownDescription": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`", + "type": "string", + "const": "fs:allow-data-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-read", + "markdownDescription": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-write", + "markdownDescription": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`", + "type": "string", + "const": "fs:allow-desktop-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-read", + "markdownDescription": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-write", + "markdownDescription": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`", + "type": "string", + "const": "fs:allow-document-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-read", + "markdownDescription": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-write", + "markdownDescription": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`", + "type": "string", + "const": "fs:allow-download-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-read", + "markdownDescription": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-write", + "markdownDescription": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`", + "type": "string", + "const": "fs:allow-exe-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-read", + "markdownDescription": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-write", + "markdownDescription": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`", + "type": "string", + "const": "fs:allow-font-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-read", + "markdownDescription": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-write", + "markdownDescription": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`", + "type": "string", + "const": "fs:allow-home-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-read", + "markdownDescription": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-write", + "markdownDescription": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`", + "type": "string", + "const": "fs:allow-localdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-read", + "markdownDescription": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-write", + "markdownDescription": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`", + "type": "string", + "const": "fs:allow-log-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-read", + "markdownDescription": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-write", + "markdownDescription": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`", + "type": "string", + "const": "fs:allow-picture-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-read", + "markdownDescription": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-write", + "markdownDescription": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`", + "type": "string", + "const": "fs:allow-public-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-read", + "markdownDescription": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-write", + "markdownDescription": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`", + "type": "string", + "const": "fs:allow-resource-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-read", + "markdownDescription": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-write", + "markdownDescription": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`", + "type": "string", + "const": "fs:allow-runtime-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-read", + "markdownDescription": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-write", + "markdownDescription": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`", + "type": "string", + "const": "fs:allow-temp-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`", + "type": "string", + "const": "fs:allow-template-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`", + "type": "string", + "const": "fs:allow-video-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-read", + "markdownDescription": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-write", + "markdownDescription": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`" + }, + { + "description": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`", + "type": "string", + "const": "fs:deny-default", + "markdownDescription": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`" + }, + { + "description": "Enables the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-copy-file", + "markdownDescription": "Enables the copy_file command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-exists", + "markdownDescription": "Enables the exists command without any pre-configured scope." + }, + { + "description": "Enables the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-fstat", + "markdownDescription": "Enables the fstat command without any pre-configured scope." + }, + { + "description": "Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-ftruncate", + "markdownDescription": "Enables the ftruncate command without any pre-configured scope." + }, + { + "description": "Enables the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-lstat", + "markdownDescription": "Enables the lstat command without any pre-configured scope." + }, + { + "description": "Enables the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-mkdir", + "markdownDescription": "Enables the mkdir command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the read command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read", + "markdownDescription": "Enables the read command without any pre-configured scope." + }, + { + "description": "Enables the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-dir", + "markdownDescription": "Enables the read_dir command without any pre-configured scope." + }, + { + "description": "Enables the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-file", + "markdownDescription": "Enables the read_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file", + "markdownDescription": "Enables the read_text_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines", + "markdownDescription": "Enables the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines-next", + "markdownDescription": "Enables the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-rename", + "markdownDescription": "Enables the rename command without any pre-configured scope." + }, + { + "description": "Enables the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-seek", + "markdownDescription": "Enables the seek command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Enables the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-stat", + "markdownDescription": "Enables the stat command without any pre-configured scope." + }, + { + "description": "Enables the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-truncate", + "markdownDescription": "Enables the truncate command without any pre-configured scope." + }, + { + "description": "Enables the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-unwatch", + "markdownDescription": "Enables the unwatch command without any pre-configured scope." + }, + { + "description": "Enables the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-watch", + "markdownDescription": "Enables the watch command without any pre-configured scope." + }, + { + "description": "Enables the write command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write", + "markdownDescription": "Enables the write command without any pre-configured scope." + }, + { + "description": "Enables the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-file", + "markdownDescription": "Enables the write_file command without any pre-configured scope." + }, + { + "description": "Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-text-file", + "markdownDescription": "Enables the write_text_file command without any pre-configured scope." + }, + { + "description": "This permissions allows to create the application specific directories.\n", + "type": "string", + "const": "fs:create-app-specific-dirs", + "markdownDescription": "This permissions allows to create the application specific directories.\n" + }, + { + "description": "Denies the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-copy-file", + "markdownDescription": "Denies the copy_file command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-exists", + "markdownDescription": "Denies the exists command without any pre-configured scope." + }, + { + "description": "Denies the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-fstat", + "markdownDescription": "Denies the fstat command without any pre-configured scope." + }, + { + "description": "Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-ftruncate", + "markdownDescription": "Denies the ftruncate command without any pre-configured scope." + }, + { + "description": "Denies the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-lstat", + "markdownDescription": "Denies the lstat command without any pre-configured scope." + }, + { + "description": "Denies the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-mkdir", + "markdownDescription": "Denies the mkdir command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the read command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read", + "markdownDescription": "Denies the read command without any pre-configured scope." + }, + { + "description": "Denies the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-dir", + "markdownDescription": "Denies the read_dir command without any pre-configured scope." + }, + { + "description": "Denies the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-file", + "markdownDescription": "Denies the read_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file", + "markdownDescription": "Denies the read_text_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines", + "markdownDescription": "Denies the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines-next", + "markdownDescription": "Denies the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-rename", + "markdownDescription": "Denies the rename command without any pre-configured scope." + }, + { + "description": "Denies the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-seek", + "markdownDescription": "Denies the seek command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Denies the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-stat", + "markdownDescription": "Denies the stat command without any pre-configured scope." + }, + { + "description": "Denies the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-truncate", + "markdownDescription": "Denies the truncate command without any pre-configured scope." + }, + { + "description": "Denies the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-unwatch", + "markdownDescription": "Denies the unwatch command without any pre-configured scope." + }, + { + "description": "Denies the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-watch", + "markdownDescription": "Denies the watch command without any pre-configured scope." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-linux", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-windows", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "Denies the write command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write", + "markdownDescription": "Denies the write command without any pre-configured scope." + }, + { + "description": "Denies the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-file", + "markdownDescription": "Denies the write_file command without any pre-configured scope." + }, + { + "description": "Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-text-file", + "markdownDescription": "Denies the write_text_file command without any pre-configured scope." + }, + { + "description": "This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-all", + "markdownDescription": "This enables all read related commands without any pre-configured accessible paths." + }, + { + "description": "This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "const": "fs:read-app-specific-dirs-recursive", + "markdownDescription": "This permission allows recursive read functionality on the application\nspecific base directories. \n" + }, + { + "description": "This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-dirs", + "markdownDescription": "This enables directory read and file metadata related commands without any pre-configured accessible paths." + }, + { + "description": "This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-files", + "markdownDescription": "This enables file read related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-meta", + "markdownDescription": "This enables all index or metadata related commands without any pre-configured accessible paths." + }, + { + "description": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n", + "type": "string", + "const": "fs:scope", + "markdownDescription": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n" + }, + { + "description": "This scope permits access to all files and list content of top level directories in the application folders.", + "type": "string", + "const": "fs:scope-app", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the application folders." + }, + { + "description": "This scope permits to list all files and folders in the application directories.", + "type": "string", + "const": "fs:scope-app-index", + "markdownDescription": "This scope permits to list all files and folders in the application directories." + }, + { + "description": "This scope permits recursive access to the complete application folders, including sub directories and files.", + "type": "string", + "const": "fs:scope-app-recursive", + "markdownDescription": "This scope permits recursive access to the complete application folders, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.", + "type": "string", + "const": "fs:scope-appcache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "const": "fs:scope-appcache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appcache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.", + "type": "string", + "const": "fs:scope-appconfig", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "const": "fs:scope-appconfig-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appconfig-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.", + "type": "string", + "const": "fs:scope-appdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "const": "fs:scope-appdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.", + "type": "string", + "const": "fs:scope-applocaldata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "const": "fs:scope-applocaldata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applocaldata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.", + "type": "string", + "const": "fs:scope-applog", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "const": "fs:scope-applog-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applog-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.", + "type": "string", + "const": "fs:scope-audio", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "const": "fs:scope-audio-index", + "markdownDescription": "This scope permits to list all files and folders in the `$AUDIO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-audio-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder.", + "type": "string", + "const": "fs:scope-cache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "const": "fs:scope-cache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-cache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.", + "type": "string", + "const": "fs:scope-config", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "const": "fs:scope-config-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-config-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DATA` folder.", + "type": "string", + "const": "fs:scope-data", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "const": "fs:scope-data-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-data-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.", + "type": "string", + "const": "fs:scope-desktop", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "const": "fs:scope-desktop-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DESKTOP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-desktop-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.", + "type": "string", + "const": "fs:scope-document", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "const": "fs:scope-document-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOCUMENT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-document-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.", + "type": "string", + "const": "fs:scope-download", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "const": "fs:scope-download-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOWNLOAD`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-download-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$EXE` folder.", + "type": "string", + "const": "fs:scope-exe", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$EXE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "const": "fs:scope-exe-index", + "markdownDescription": "This scope permits to list all files and folders in the `$EXE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-exe-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$FONT` folder.", + "type": "string", + "const": "fs:scope-font", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$FONT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "const": "fs:scope-font-index", + "markdownDescription": "This scope permits to list all files and folders in the `$FONT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-font-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$HOME` folder.", + "type": "string", + "const": "fs:scope-home", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$HOME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "const": "fs:scope-home-index", + "markdownDescription": "This scope permits to list all files and folders in the `$HOME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-home-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.", + "type": "string", + "const": "fs:scope-localdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "const": "fs:scope-localdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-localdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOG` folder.", + "type": "string", + "const": "fs:scope-log", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "const": "fs:scope-log-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-log-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.", + "type": "string", + "const": "fs:scope-picture", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "const": "fs:scope-picture-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PICTURE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-picture-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.", + "type": "string", + "const": "fs:scope-public", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "const": "fs:scope-public-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PUBLIC`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-public-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.", + "type": "string", + "const": "fs:scope-resource", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "const": "fs:scope-resource-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RESOURCE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-resource-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.", + "type": "string", + "const": "fs:scope-runtime", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "const": "fs:scope-runtime-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RUNTIME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-runtime-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder.", + "type": "string", + "const": "fs:scope-temp", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "const": "fs:scope-temp-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-temp-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.", + "type": "string", + "const": "fs:scope-template", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "const": "fs:scope-template-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMPLATE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-template-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.", + "type": "string", + "const": "fs:scope-video", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "const": "fs:scope-video-index", + "markdownDescription": "This scope permits to list all files and folders in the `$VIDEO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-video-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files." + }, + { + "description": "This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-all", + "markdownDescription": "This enables all write related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-files", + "markdownDescription": "This enables all file write related commands without any pre-configured accessible paths." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", + "type": "string", + "const": "shell:default", + "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" + }, + { + "description": "Enables the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-execute", + "markdownDescription": "Enables the execute command without any pre-configured scope." + }, + { + "description": "Enables the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-kill", + "markdownDescription": "Enables the kill command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-spawn", + "markdownDescription": "Enables the spawn command without any pre-configured scope." + }, + { + "description": "Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-stdin-write", + "markdownDescription": "Enables the stdin_write command without any pre-configured scope." + }, + { + "description": "Denies the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-execute", + "markdownDescription": "Denies the execute command without any pre-configured scope." + }, + { + "description": "Denies the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-kill", + "markdownDescription": "Denies the kill command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-spawn", + "markdownDescription": "Denies the spawn command without any pre-configured scope." + }, + { + "description": "Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-stdin-write", + "markdownDescription": "Denies the stdin_write command without any pre-configured scope." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "ShellScopeEntry", + "description": "Shell scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "cmd", + "name" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + }, + "additionalProperties": false + } + ] + } + }, + "deny": { + "items": { + "title": "ShellScopeEntry", + "description": "Shell scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "cmd", + "name" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + }, + "additionalProperties": false + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ], + "required": [ + "identifier" + ] + } + ] + }, + "Identifier": { + "description": "Permission identifier", + "oneOf": [ + { + "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", + "type": "string", + "const": "core:default", + "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + }, + { + "description": "This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n\n#### This default permission set includes:\n\n- `allow-ask`\n- `allow-confirm`\n- `allow-message`\n- `allow-save`\n- `allow-open`", + "type": "string", + "const": "dialog:default", + "markdownDescription": "This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n\n#### This default permission set includes:\n\n- `allow-ask`\n- `allow-confirm`\n- `allow-message`\n- `allow-save`\n- `allow-open`" + }, + { + "description": "Enables the ask command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-ask", + "markdownDescription": "Enables the ask command without any pre-configured scope." + }, + { + "description": "Enables the confirm command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-confirm", + "markdownDescription": "Enables the confirm command without any pre-configured scope." + }, + { + "description": "Enables the message command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-message", + "markdownDescription": "Enables the message command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the save command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-save", + "markdownDescription": "Enables the save command without any pre-configured scope." + }, + { + "description": "Denies the ask command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-ask", + "markdownDescription": "Denies the ask command without any pre-configured scope." + }, + { + "description": "Denies the confirm command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-confirm", + "markdownDescription": "Denies the confirm command without any pre-configured scope." + }, + { + "description": "Denies the message command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-message", + "markdownDescription": "Denies the message command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the save command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-save", + "markdownDescription": "Denies the save command without any pre-configured scope." + }, + { + "description": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`", + "type": "string", + "const": "fs:default", + "markdownDescription": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`" + }, + { + "description": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`", + "type": "string", + "const": "fs:allow-app-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`" + }, + { + "description": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-read", + "markdownDescription": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-write", + "markdownDescription": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`", + "type": "string", + "const": "fs:allow-appcache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`", + "type": "string", + "const": "fs:allow-appconfig-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`", + "type": "string", + "const": "fs:allow-appdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`", + "type": "string", + "const": "fs:allow-applocaldata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`", + "type": "string", + "const": "fs:allow-applog-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`", + "type": "string", + "const": "fs:allow-audio-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-read", + "markdownDescription": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-write", + "markdownDescription": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`", + "type": "string", + "const": "fs:allow-cache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-read", + "markdownDescription": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-write", + "markdownDescription": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`", + "type": "string", + "const": "fs:allow-config-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-read", + "markdownDescription": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-write", + "markdownDescription": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`", + "type": "string", + "const": "fs:allow-data-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-read", + "markdownDescription": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-write", + "markdownDescription": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`", + "type": "string", + "const": "fs:allow-desktop-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-read", + "markdownDescription": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-write", + "markdownDescription": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`", + "type": "string", + "const": "fs:allow-document-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-read", + "markdownDescription": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-write", + "markdownDescription": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`", + "type": "string", + "const": "fs:allow-download-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-read", + "markdownDescription": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-write", + "markdownDescription": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`", + "type": "string", + "const": "fs:allow-exe-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-read", + "markdownDescription": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-write", + "markdownDescription": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`", + "type": "string", + "const": "fs:allow-font-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-read", + "markdownDescription": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-write", + "markdownDescription": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`", + "type": "string", + "const": "fs:allow-home-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-read", + "markdownDescription": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-write", + "markdownDescription": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`", + "type": "string", + "const": "fs:allow-localdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-read", + "markdownDescription": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-write", + "markdownDescription": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`", + "type": "string", + "const": "fs:allow-log-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-read", + "markdownDescription": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-write", + "markdownDescription": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`", + "type": "string", + "const": "fs:allow-picture-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-read", + "markdownDescription": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-write", + "markdownDescription": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`", + "type": "string", + "const": "fs:allow-public-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-read", + "markdownDescription": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-write", + "markdownDescription": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`", + "type": "string", + "const": "fs:allow-resource-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-read", + "markdownDescription": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-write", + "markdownDescription": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`", + "type": "string", + "const": "fs:allow-runtime-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-read", + "markdownDescription": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-write", + "markdownDescription": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`", + "type": "string", + "const": "fs:allow-temp-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`", + "type": "string", + "const": "fs:allow-template-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`", + "type": "string", + "const": "fs:allow-video-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-read", + "markdownDescription": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-write", + "markdownDescription": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`" + }, + { + "description": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`", + "type": "string", + "const": "fs:deny-default", + "markdownDescription": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`" + }, + { + "description": "Enables the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-copy-file", + "markdownDescription": "Enables the copy_file command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-exists", + "markdownDescription": "Enables the exists command without any pre-configured scope." + }, + { + "description": "Enables the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-fstat", + "markdownDescription": "Enables the fstat command without any pre-configured scope." + }, + { + "description": "Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-ftruncate", + "markdownDescription": "Enables the ftruncate command without any pre-configured scope." + }, + { + "description": "Enables the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-lstat", + "markdownDescription": "Enables the lstat command without any pre-configured scope." + }, + { + "description": "Enables the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-mkdir", + "markdownDescription": "Enables the mkdir command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the read command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read", + "markdownDescription": "Enables the read command without any pre-configured scope." + }, + { + "description": "Enables the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-dir", + "markdownDescription": "Enables the read_dir command without any pre-configured scope." + }, + { + "description": "Enables the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-file", + "markdownDescription": "Enables the read_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file", + "markdownDescription": "Enables the read_text_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines", + "markdownDescription": "Enables the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines-next", + "markdownDescription": "Enables the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-rename", + "markdownDescription": "Enables the rename command without any pre-configured scope." + }, + { + "description": "Enables the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-seek", + "markdownDescription": "Enables the seek command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Enables the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-stat", + "markdownDescription": "Enables the stat command without any pre-configured scope." + }, + { + "description": "Enables the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-truncate", + "markdownDescription": "Enables the truncate command without any pre-configured scope." + }, + { + "description": "Enables the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-unwatch", + "markdownDescription": "Enables the unwatch command without any pre-configured scope." + }, + { + "description": "Enables the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-watch", + "markdownDescription": "Enables the watch command without any pre-configured scope." + }, + { + "description": "Enables the write command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write", + "markdownDescription": "Enables the write command without any pre-configured scope." + }, + { + "description": "Enables the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-file", + "markdownDescription": "Enables the write_file command without any pre-configured scope." + }, + { + "description": "Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-text-file", + "markdownDescription": "Enables the write_text_file command without any pre-configured scope." + }, + { + "description": "This permissions allows to create the application specific directories.\n", + "type": "string", + "const": "fs:create-app-specific-dirs", + "markdownDescription": "This permissions allows to create the application specific directories.\n" + }, + { + "description": "Denies the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-copy-file", + "markdownDescription": "Denies the copy_file command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-exists", + "markdownDescription": "Denies the exists command without any pre-configured scope." + }, + { + "description": "Denies the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-fstat", + "markdownDescription": "Denies the fstat command without any pre-configured scope." + }, + { + "description": "Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-ftruncate", + "markdownDescription": "Denies the ftruncate command without any pre-configured scope." + }, + { + "description": "Denies the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-lstat", + "markdownDescription": "Denies the lstat command without any pre-configured scope." + }, + { + "description": "Denies the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-mkdir", + "markdownDescription": "Denies the mkdir command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the read command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read", + "markdownDescription": "Denies the read command without any pre-configured scope." + }, + { + "description": "Denies the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-dir", + "markdownDescription": "Denies the read_dir command without any pre-configured scope." + }, + { + "description": "Denies the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-file", + "markdownDescription": "Denies the read_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file", + "markdownDescription": "Denies the read_text_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines", + "markdownDescription": "Denies the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines-next", + "markdownDescription": "Denies the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-rename", + "markdownDescription": "Denies the rename command without any pre-configured scope." + }, + { + "description": "Denies the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-seek", + "markdownDescription": "Denies the seek command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Denies the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-stat", + "markdownDescription": "Denies the stat command without any pre-configured scope." + }, + { + "description": "Denies the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-truncate", + "markdownDescription": "Denies the truncate command without any pre-configured scope." + }, + { + "description": "Denies the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-unwatch", + "markdownDescription": "Denies the unwatch command without any pre-configured scope." + }, + { + "description": "Denies the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-watch", + "markdownDescription": "Denies the watch command without any pre-configured scope." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-linux", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-windows", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "Denies the write command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write", + "markdownDescription": "Denies the write command without any pre-configured scope." + }, + { + "description": "Denies the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-file", + "markdownDescription": "Denies the write_file command without any pre-configured scope." + }, + { + "description": "Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-text-file", + "markdownDescription": "Denies the write_text_file command without any pre-configured scope." + }, + { + "description": "This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-all", + "markdownDescription": "This enables all read related commands without any pre-configured accessible paths." + }, + { + "description": "This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "const": "fs:read-app-specific-dirs-recursive", + "markdownDescription": "This permission allows recursive read functionality on the application\nspecific base directories. \n" + }, + { + "description": "This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-dirs", + "markdownDescription": "This enables directory read and file metadata related commands without any pre-configured accessible paths." + }, + { + "description": "This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-files", + "markdownDescription": "This enables file read related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-meta", + "markdownDescription": "This enables all index or metadata related commands without any pre-configured accessible paths." + }, + { + "description": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n", + "type": "string", + "const": "fs:scope", + "markdownDescription": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n" + }, + { + "description": "This scope permits access to all files and list content of top level directories in the application folders.", + "type": "string", + "const": "fs:scope-app", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the application folders." + }, + { + "description": "This scope permits to list all files and folders in the application directories.", + "type": "string", + "const": "fs:scope-app-index", + "markdownDescription": "This scope permits to list all files and folders in the application directories." + }, + { + "description": "This scope permits recursive access to the complete application folders, including sub directories and files.", + "type": "string", + "const": "fs:scope-app-recursive", + "markdownDescription": "This scope permits recursive access to the complete application folders, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.", + "type": "string", + "const": "fs:scope-appcache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "const": "fs:scope-appcache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appcache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.", + "type": "string", + "const": "fs:scope-appconfig", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "const": "fs:scope-appconfig-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appconfig-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.", + "type": "string", + "const": "fs:scope-appdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "const": "fs:scope-appdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.", + "type": "string", + "const": "fs:scope-applocaldata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "const": "fs:scope-applocaldata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applocaldata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.", + "type": "string", + "const": "fs:scope-applog", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "const": "fs:scope-applog-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applog-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.", + "type": "string", + "const": "fs:scope-audio", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "const": "fs:scope-audio-index", + "markdownDescription": "This scope permits to list all files and folders in the `$AUDIO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-audio-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder.", + "type": "string", + "const": "fs:scope-cache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "const": "fs:scope-cache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-cache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.", + "type": "string", + "const": "fs:scope-config", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "const": "fs:scope-config-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-config-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DATA` folder.", + "type": "string", + "const": "fs:scope-data", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "const": "fs:scope-data-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-data-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.", + "type": "string", + "const": "fs:scope-desktop", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "const": "fs:scope-desktop-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DESKTOP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-desktop-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.", + "type": "string", + "const": "fs:scope-document", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "const": "fs:scope-document-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOCUMENT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-document-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.", + "type": "string", + "const": "fs:scope-download", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "const": "fs:scope-download-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOWNLOAD`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-download-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$EXE` folder.", + "type": "string", + "const": "fs:scope-exe", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$EXE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "const": "fs:scope-exe-index", + "markdownDescription": "This scope permits to list all files and folders in the `$EXE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-exe-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$FONT` folder.", + "type": "string", + "const": "fs:scope-font", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$FONT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "const": "fs:scope-font-index", + "markdownDescription": "This scope permits to list all files and folders in the `$FONT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-font-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$HOME` folder.", + "type": "string", + "const": "fs:scope-home", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$HOME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "const": "fs:scope-home-index", + "markdownDescription": "This scope permits to list all files and folders in the `$HOME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-home-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.", + "type": "string", + "const": "fs:scope-localdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "const": "fs:scope-localdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-localdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOG` folder.", + "type": "string", + "const": "fs:scope-log", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "const": "fs:scope-log-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-log-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.", + "type": "string", + "const": "fs:scope-picture", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "const": "fs:scope-picture-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PICTURE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-picture-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.", + "type": "string", + "const": "fs:scope-public", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "const": "fs:scope-public-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PUBLIC`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-public-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.", + "type": "string", + "const": "fs:scope-resource", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "const": "fs:scope-resource-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RESOURCE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-resource-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.", + "type": "string", + "const": "fs:scope-runtime", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "const": "fs:scope-runtime-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RUNTIME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-runtime-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder.", + "type": "string", + "const": "fs:scope-temp", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "const": "fs:scope-temp-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-temp-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.", + "type": "string", + "const": "fs:scope-template", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "const": "fs:scope-template-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMPLATE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-template-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.", + "type": "string", + "const": "fs:scope-video", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "const": "fs:scope-video-index", + "markdownDescription": "This scope permits to list all files and folders in the `$VIDEO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-video-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files." + }, + { + "description": "This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-all", + "markdownDescription": "This enables all write related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-files", + "markdownDescription": "This enables all file write related commands without any pre-configured accessible paths." + }, + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n\n#### This default permission set includes:\n\n- `allow-exit`\n- `allow-restart`", + "type": "string", + "const": "process:default", + "markdownDescription": "This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n\n#### This default permission set includes:\n\n- `allow-exit`\n- `allow-restart`" + }, + { + "description": "Enables the exit command without any pre-configured scope.", + "type": "string", + "const": "process:allow-exit", + "markdownDescription": "Enables the exit command without any pre-configured scope." + }, + { + "description": "Enables the restart command without any pre-configured scope.", + "type": "string", + "const": "process:allow-restart", + "markdownDescription": "Enables the restart command without any pre-configured scope." + }, + { + "description": "Denies the exit command without any pre-configured scope.", + "type": "string", + "const": "process:deny-exit", + "markdownDescription": "Denies the exit command without any pre-configured scope." + }, + { + "description": "Denies the restart command without any pre-configured scope.", + "type": "string", + "const": "process:deny-restart", + "markdownDescription": "Denies the restart command without any pre-configured scope." + }, + { + "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", + "type": "string", + "const": "shell:default", + "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" + }, + { + "description": "Enables the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-execute", + "markdownDescription": "Enables the execute command without any pre-configured scope." + }, + { + "description": "Enables the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-kill", + "markdownDescription": "Enables the kill command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-spawn", + "markdownDescription": "Enables the spawn command without any pre-configured scope." + }, + { + "description": "Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-stdin-write", + "markdownDescription": "Enables the stdin_write command without any pre-configured scope." + }, + { + "description": "Denies the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-execute", + "markdownDescription": "Denies the execute command without any pre-configured scope." + }, + { + "description": "Denies the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-kill", + "markdownDescription": "Denies the kill command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-spawn", + "markdownDescription": "Denies the spawn command without any pre-configured scope." + }, + { + "description": "Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-stdin-write", + "markdownDescription": "Denies the stdin_write command without any pre-configured scope." + }, + { + "description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`", + "type": "string", + "const": "window-state:default", + "markdownDescription": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`" + }, + { + "description": "Enables the filename command without any pre-configured scope.", + "type": "string", + "const": "window-state:allow-filename", + "markdownDescription": "Enables the filename command without any pre-configured scope." + }, + { + "description": "Enables the restore_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:allow-restore-state", + "markdownDescription": "Enables the restore_state command without any pre-configured scope." + }, + { + "description": "Enables the save_window_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:allow-save-window-state", + "markdownDescription": "Enables the save_window_state command without any pre-configured scope." + }, + { + "description": "Denies the filename command without any pre-configured scope.", + "type": "string", + "const": "window-state:deny-filename", + "markdownDescription": "Denies the filename command without any pre-configured scope." + }, + { + "description": "Denies the restore_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:deny-restore-state", + "markdownDescription": "Denies the restore_state command without any pre-configured scope." + }, + { + "description": "Denies the save_window_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:deny-save-window-state", + "markdownDescription": "Denies the save_window_state command without any pre-configured scope." + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "Application": { + "description": "Opener scope application.", + "anyOf": [ + { + "description": "Open in default application.", + "type": "null" + }, + { + "description": "If true, allow open with any application.", + "type": "boolean" + }, + { + "description": "Allow specific application to open with.", + "type": "string" + } + ] + }, + "ShellScopeEntryAllowedArg": { + "description": "A command argument allowed to be executed by the webview API.", + "anyOf": [ + { + "description": "A non-configurable argument that is passed to the command in the order it was specified.", + "type": "string" + }, + { + "description": "A variable that is set while calling the command from the webview API.", + "type": "object", + "required": [ + "validator" + ], + "properties": { + "raw": { + "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", + "default": false, + "type": "boolean" + }, + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", + "type": "string" + } + }, + "additionalProperties": false + } + ] + }, + "ShellScopeEntryAllowedArgs": { + "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", + "anyOf": [ + { + "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", + "type": "boolean" + }, + { + "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/ShellScopeEntryAllowedArg" + } + } + ] + } + } +} \ No newline at end of file diff --git a/src-tauri/gen/schemas/windows-schema.json b/src-tauri/gen/schemas/windows-schema.json new file mode 100644 index 0000000..6f843f6 --- /dev/null +++ b/src-tauri/gen/schemas/windows-schema.json @@ -0,0 +1,6463 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`", + "type": "string", + "const": "fs:default", + "markdownDescription": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`" + }, + { + "description": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`", + "type": "string", + "const": "fs:allow-app-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`" + }, + { + "description": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-read", + "markdownDescription": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-write", + "markdownDescription": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`", + "type": "string", + "const": "fs:allow-appcache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`", + "type": "string", + "const": "fs:allow-appconfig-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`", + "type": "string", + "const": "fs:allow-appdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`", + "type": "string", + "const": "fs:allow-applocaldata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`", + "type": "string", + "const": "fs:allow-applog-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`", + "type": "string", + "const": "fs:allow-audio-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-read", + "markdownDescription": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-write", + "markdownDescription": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`", + "type": "string", + "const": "fs:allow-cache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-read", + "markdownDescription": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-write", + "markdownDescription": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`", + "type": "string", + "const": "fs:allow-config-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-read", + "markdownDescription": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-write", + "markdownDescription": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`", + "type": "string", + "const": "fs:allow-data-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-read", + "markdownDescription": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-write", + "markdownDescription": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`", + "type": "string", + "const": "fs:allow-desktop-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-read", + "markdownDescription": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-write", + "markdownDescription": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`", + "type": "string", + "const": "fs:allow-document-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-read", + "markdownDescription": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-write", + "markdownDescription": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`", + "type": "string", + "const": "fs:allow-download-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-read", + "markdownDescription": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-write", + "markdownDescription": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`", + "type": "string", + "const": "fs:allow-exe-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-read", + "markdownDescription": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-write", + "markdownDescription": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`", + "type": "string", + "const": "fs:allow-font-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-read", + "markdownDescription": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-write", + "markdownDescription": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`", + "type": "string", + "const": "fs:allow-home-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-read", + "markdownDescription": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-write", + "markdownDescription": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`", + "type": "string", + "const": "fs:allow-localdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-read", + "markdownDescription": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-write", + "markdownDescription": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`", + "type": "string", + "const": "fs:allow-log-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-read", + "markdownDescription": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-write", + "markdownDescription": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`", + "type": "string", + "const": "fs:allow-picture-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-read", + "markdownDescription": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-write", + "markdownDescription": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`", + "type": "string", + "const": "fs:allow-public-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-read", + "markdownDescription": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-write", + "markdownDescription": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`", + "type": "string", + "const": "fs:allow-resource-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-read", + "markdownDescription": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-write", + "markdownDescription": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`", + "type": "string", + "const": "fs:allow-runtime-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-read", + "markdownDescription": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-write", + "markdownDescription": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`", + "type": "string", + "const": "fs:allow-temp-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`", + "type": "string", + "const": "fs:allow-template-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`", + "type": "string", + "const": "fs:allow-video-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-read", + "markdownDescription": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-write", + "markdownDescription": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`" + }, + { + "description": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`", + "type": "string", + "const": "fs:deny-default", + "markdownDescription": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`" + }, + { + "description": "Enables the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-copy-file", + "markdownDescription": "Enables the copy_file command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-exists", + "markdownDescription": "Enables the exists command without any pre-configured scope." + }, + { + "description": "Enables the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-fstat", + "markdownDescription": "Enables the fstat command without any pre-configured scope." + }, + { + "description": "Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-ftruncate", + "markdownDescription": "Enables the ftruncate command without any pre-configured scope." + }, + { + "description": "Enables the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-lstat", + "markdownDescription": "Enables the lstat command without any pre-configured scope." + }, + { + "description": "Enables the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-mkdir", + "markdownDescription": "Enables the mkdir command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the read command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read", + "markdownDescription": "Enables the read command without any pre-configured scope." + }, + { + "description": "Enables the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-dir", + "markdownDescription": "Enables the read_dir command without any pre-configured scope." + }, + { + "description": "Enables the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-file", + "markdownDescription": "Enables the read_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file", + "markdownDescription": "Enables the read_text_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines", + "markdownDescription": "Enables the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines-next", + "markdownDescription": "Enables the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-rename", + "markdownDescription": "Enables the rename command without any pre-configured scope." + }, + { + "description": "Enables the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-seek", + "markdownDescription": "Enables the seek command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Enables the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-stat", + "markdownDescription": "Enables the stat command without any pre-configured scope." + }, + { + "description": "Enables the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-truncate", + "markdownDescription": "Enables the truncate command without any pre-configured scope." + }, + { + "description": "Enables the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-unwatch", + "markdownDescription": "Enables the unwatch command without any pre-configured scope." + }, + { + "description": "Enables the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-watch", + "markdownDescription": "Enables the watch command without any pre-configured scope." + }, + { + "description": "Enables the write command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write", + "markdownDescription": "Enables the write command without any pre-configured scope." + }, + { + "description": "Enables the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-file", + "markdownDescription": "Enables the write_file command without any pre-configured scope." + }, + { + "description": "Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-text-file", + "markdownDescription": "Enables the write_text_file command without any pre-configured scope." + }, + { + "description": "This permissions allows to create the application specific directories.\n", + "type": "string", + "const": "fs:create-app-specific-dirs", + "markdownDescription": "This permissions allows to create the application specific directories.\n" + }, + { + "description": "Denies the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-copy-file", + "markdownDescription": "Denies the copy_file command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-exists", + "markdownDescription": "Denies the exists command without any pre-configured scope." + }, + { + "description": "Denies the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-fstat", + "markdownDescription": "Denies the fstat command without any pre-configured scope." + }, + { + "description": "Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-ftruncate", + "markdownDescription": "Denies the ftruncate command without any pre-configured scope." + }, + { + "description": "Denies the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-lstat", + "markdownDescription": "Denies the lstat command without any pre-configured scope." + }, + { + "description": "Denies the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-mkdir", + "markdownDescription": "Denies the mkdir command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the read command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read", + "markdownDescription": "Denies the read command without any pre-configured scope." + }, + { + "description": "Denies the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-dir", + "markdownDescription": "Denies the read_dir command without any pre-configured scope." + }, + { + "description": "Denies the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-file", + "markdownDescription": "Denies the read_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file", + "markdownDescription": "Denies the read_text_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines", + "markdownDescription": "Denies the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines-next", + "markdownDescription": "Denies the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-rename", + "markdownDescription": "Denies the rename command without any pre-configured scope." + }, + { + "description": "Denies the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-seek", + "markdownDescription": "Denies the seek command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Denies the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-stat", + "markdownDescription": "Denies the stat command without any pre-configured scope." + }, + { + "description": "Denies the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-truncate", + "markdownDescription": "Denies the truncate command without any pre-configured scope." + }, + { + "description": "Denies the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-unwatch", + "markdownDescription": "Denies the unwatch command without any pre-configured scope." + }, + { + "description": "Denies the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-watch", + "markdownDescription": "Denies the watch command without any pre-configured scope." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-linux", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-windows", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "Denies the write command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write", + "markdownDescription": "Denies the write command without any pre-configured scope." + }, + { + "description": "Denies the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-file", + "markdownDescription": "Denies the write_file command without any pre-configured scope." + }, + { + "description": "Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-text-file", + "markdownDescription": "Denies the write_text_file command without any pre-configured scope." + }, + { + "description": "This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-all", + "markdownDescription": "This enables all read related commands without any pre-configured accessible paths." + }, + { + "description": "This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "const": "fs:read-app-specific-dirs-recursive", + "markdownDescription": "This permission allows recursive read functionality on the application\nspecific base directories. \n" + }, + { + "description": "This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-dirs", + "markdownDescription": "This enables directory read and file metadata related commands without any pre-configured accessible paths." + }, + { + "description": "This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-files", + "markdownDescription": "This enables file read related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-meta", + "markdownDescription": "This enables all index or metadata related commands without any pre-configured accessible paths." + }, + { + "description": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n", + "type": "string", + "const": "fs:scope", + "markdownDescription": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n" + }, + { + "description": "This scope permits access to all files and list content of top level directories in the application folders.", + "type": "string", + "const": "fs:scope-app", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the application folders." + }, + { + "description": "This scope permits to list all files and folders in the application directories.", + "type": "string", + "const": "fs:scope-app-index", + "markdownDescription": "This scope permits to list all files and folders in the application directories." + }, + { + "description": "This scope permits recursive access to the complete application folders, including sub directories and files.", + "type": "string", + "const": "fs:scope-app-recursive", + "markdownDescription": "This scope permits recursive access to the complete application folders, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.", + "type": "string", + "const": "fs:scope-appcache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "const": "fs:scope-appcache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appcache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.", + "type": "string", + "const": "fs:scope-appconfig", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "const": "fs:scope-appconfig-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appconfig-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.", + "type": "string", + "const": "fs:scope-appdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "const": "fs:scope-appdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.", + "type": "string", + "const": "fs:scope-applocaldata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "const": "fs:scope-applocaldata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applocaldata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.", + "type": "string", + "const": "fs:scope-applog", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "const": "fs:scope-applog-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applog-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.", + "type": "string", + "const": "fs:scope-audio", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "const": "fs:scope-audio-index", + "markdownDescription": "This scope permits to list all files and folders in the `$AUDIO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-audio-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder.", + "type": "string", + "const": "fs:scope-cache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "const": "fs:scope-cache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-cache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.", + "type": "string", + "const": "fs:scope-config", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "const": "fs:scope-config-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-config-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DATA` folder.", + "type": "string", + "const": "fs:scope-data", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "const": "fs:scope-data-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-data-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.", + "type": "string", + "const": "fs:scope-desktop", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "const": "fs:scope-desktop-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DESKTOP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-desktop-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.", + "type": "string", + "const": "fs:scope-document", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "const": "fs:scope-document-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOCUMENT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-document-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.", + "type": "string", + "const": "fs:scope-download", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "const": "fs:scope-download-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOWNLOAD`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-download-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$EXE` folder.", + "type": "string", + "const": "fs:scope-exe", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$EXE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "const": "fs:scope-exe-index", + "markdownDescription": "This scope permits to list all files and folders in the `$EXE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-exe-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$FONT` folder.", + "type": "string", + "const": "fs:scope-font", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$FONT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "const": "fs:scope-font-index", + "markdownDescription": "This scope permits to list all files and folders in the `$FONT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-font-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$HOME` folder.", + "type": "string", + "const": "fs:scope-home", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$HOME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "const": "fs:scope-home-index", + "markdownDescription": "This scope permits to list all files and folders in the `$HOME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-home-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.", + "type": "string", + "const": "fs:scope-localdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "const": "fs:scope-localdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-localdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOG` folder.", + "type": "string", + "const": "fs:scope-log", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "const": "fs:scope-log-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-log-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.", + "type": "string", + "const": "fs:scope-picture", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "const": "fs:scope-picture-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PICTURE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-picture-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.", + "type": "string", + "const": "fs:scope-public", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "const": "fs:scope-public-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PUBLIC`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-public-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.", + "type": "string", + "const": "fs:scope-resource", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "const": "fs:scope-resource-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RESOURCE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-resource-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.", + "type": "string", + "const": "fs:scope-runtime", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "const": "fs:scope-runtime-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RUNTIME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-runtime-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder.", + "type": "string", + "const": "fs:scope-temp", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "const": "fs:scope-temp-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-temp-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.", + "type": "string", + "const": "fs:scope-template", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "const": "fs:scope-template-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMPLATE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-template-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.", + "type": "string", + "const": "fs:scope-video", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "const": "fs:scope-video-index", + "markdownDescription": "This scope permits to list all files and folders in the `$VIDEO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-video-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files." + }, + { + "description": "This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-all", + "markdownDescription": "This enables all write related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-files", + "markdownDescription": "This enables all file write related commands without any pre-configured accessible paths." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "OpenerScopeEntry", + "description": "Opener scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "url" + ], + "properties": { + "app": { + "description": "An application to open this url with, for example: firefox.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "url": { + "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "app": { + "description": "An application to open this path with, for example: xdg-open.", + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ] + }, + "path": { + "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + } + } + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "if": { + "properties": { + "identifier": { + "anyOf": [ + { + "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", + "type": "string", + "const": "shell:default", + "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" + }, + { + "description": "Enables the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-execute", + "markdownDescription": "Enables the execute command without any pre-configured scope." + }, + { + "description": "Enables the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-kill", + "markdownDescription": "Enables the kill command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-spawn", + "markdownDescription": "Enables the spawn command without any pre-configured scope." + }, + { + "description": "Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-stdin-write", + "markdownDescription": "Enables the stdin_write command without any pre-configured scope." + }, + { + "description": "Denies the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-execute", + "markdownDescription": "Denies the execute command without any pre-configured scope." + }, + { + "description": "Denies the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-kill", + "markdownDescription": "Denies the kill command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-spawn", + "markdownDescription": "Denies the spawn command without any pre-configured scope." + }, + { + "description": "Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-stdin-write", + "markdownDescription": "Denies the stdin_write command without any pre-configured scope." + } + ] + } + } + }, + "then": { + "properties": { + "allow": { + "items": { + "title": "ShellScopeEntry", + "description": "Shell scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "cmd", + "name" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + }, + "additionalProperties": false + } + ] + } + }, + "deny": { + "items": { + "title": "ShellScopeEntry", + "description": "Shell scope entry.", + "anyOf": [ + { + "type": "object", + "required": [ + "cmd", + "name" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellScopeEntryAllowedArgs" + } + ] + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + }, + "additionalProperties": false + } + ] + } + } + } + }, + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + } + }, + { + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ], + "required": [ + "identifier" + ] + } + ] + }, + "Identifier": { + "description": "Permission identifier", + "oneOf": [ + { + "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", + "type": "string", + "const": "core:default", + "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + }, + { + "description": "This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n\n#### This default permission set includes:\n\n- `allow-ask`\n- `allow-confirm`\n- `allow-message`\n- `allow-save`\n- `allow-open`", + "type": "string", + "const": "dialog:default", + "markdownDescription": "This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n\n#### This default permission set includes:\n\n- `allow-ask`\n- `allow-confirm`\n- `allow-message`\n- `allow-save`\n- `allow-open`" + }, + { + "description": "Enables the ask command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-ask", + "markdownDescription": "Enables the ask command without any pre-configured scope." + }, + { + "description": "Enables the confirm command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-confirm", + "markdownDescription": "Enables the confirm command without any pre-configured scope." + }, + { + "description": "Enables the message command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-message", + "markdownDescription": "Enables the message command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the save command without any pre-configured scope.", + "type": "string", + "const": "dialog:allow-save", + "markdownDescription": "Enables the save command without any pre-configured scope." + }, + { + "description": "Denies the ask command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-ask", + "markdownDescription": "Denies the ask command without any pre-configured scope." + }, + { + "description": "Denies the confirm command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-confirm", + "markdownDescription": "Denies the confirm command without any pre-configured scope." + }, + { + "description": "Denies the message command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-message", + "markdownDescription": "Denies the message command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the save command without any pre-configured scope.", + "type": "string", + "const": "dialog:deny-save", + "markdownDescription": "Denies the save command without any pre-configured scope." + }, + { + "description": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`", + "type": "string", + "const": "fs:default", + "markdownDescription": "This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n#### This default permission set includes:\n\n- `create-app-specific-dirs`\n- `read-app-specific-dirs-recursive`\n- `deny-default`" + }, + { + "description": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`", + "type": "string", + "const": "fs:allow-app-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-index`" + }, + { + "description": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the application folders, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-read", + "markdownDescription": "This allows non-recursive read access to the application folders.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`", + "type": "string", + "const": "fs:allow-app-write", + "markdownDescription": "This allows non-recursive write access to the application folders.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app`" + }, + { + "description": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`", + "type": "string", + "const": "fs:allow-app-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete application folders, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-app-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`", + "type": "string", + "const": "fs:allow-appcache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`", + "type": "string", + "const": "fs:allow-appcache-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`", + "type": "string", + "const": "fs:allow-appcache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appcache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`", + "type": "string", + "const": "fs:allow-appconfig-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-read", + "markdownDescription": "This allows non-recursive read access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`", + "type": "string", + "const": "fs:allow-appconfig-write", + "markdownDescription": "This allows non-recursive write access to the `$APPCONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig`" + }, + { + "description": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`", + "type": "string", + "const": "fs:allow-appconfig-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appconfig-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`", + "type": "string", + "const": "fs:allow-appdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`", + "type": "string", + "const": "fs:allow-appdata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`", + "type": "string", + "const": "fs:allow-appdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-appdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`", + "type": "string", + "const": "fs:allow-applocaldata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`", + "type": "string", + "const": "fs:allow-applocaldata-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`", + "type": "string", + "const": "fs:allow-applocaldata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applocaldata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`", + "type": "string", + "const": "fs:allow-applog-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-read", + "markdownDescription": "This allows non-recursive read access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`", + "type": "string", + "const": "fs:allow-applog-write", + "markdownDescription": "This allows non-recursive write access to the `$APPLOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog`" + }, + { + "description": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`", + "type": "string", + "const": "fs:allow-applog-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-applog-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`", + "type": "string", + "const": "fs:allow-audio-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-read", + "markdownDescription": "This allows non-recursive read access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`", + "type": "string", + "const": "fs:allow-audio-write", + "markdownDescription": "This allows non-recursive write access to the `$AUDIO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio`" + }, + { + "description": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`", + "type": "string", + "const": "fs:allow-audio-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-audio-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`", + "type": "string", + "const": "fs:allow-cache-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-read", + "markdownDescription": "This allows non-recursive read access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`", + "type": "string", + "const": "fs:allow-cache-write", + "markdownDescription": "This allows non-recursive write access to the `$CACHE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache`" + }, + { + "description": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`", + "type": "string", + "const": "fs:allow-cache-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-cache-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`", + "type": "string", + "const": "fs:allow-config-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-read", + "markdownDescription": "This allows non-recursive read access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`", + "type": "string", + "const": "fs:allow-config-write", + "markdownDescription": "This allows non-recursive write access to the `$CONFIG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config`" + }, + { + "description": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`", + "type": "string", + "const": "fs:allow-config-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-config-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`", + "type": "string", + "const": "fs:allow-data-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-read", + "markdownDescription": "This allows non-recursive read access to the `$DATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`", + "type": "string", + "const": "fs:allow-data-write", + "markdownDescription": "This allows non-recursive write access to the `$DATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data`" + }, + { + "description": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`", + "type": "string", + "const": "fs:allow-data-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-data-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`", + "type": "string", + "const": "fs:allow-desktop-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-read", + "markdownDescription": "This allows non-recursive read access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`", + "type": "string", + "const": "fs:allow-desktop-write", + "markdownDescription": "This allows non-recursive write access to the `$DESKTOP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop`" + }, + { + "description": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`", + "type": "string", + "const": "fs:allow-desktop-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-desktop-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`", + "type": "string", + "const": "fs:allow-document-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-read", + "markdownDescription": "This allows non-recursive read access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`", + "type": "string", + "const": "fs:allow-document-write", + "markdownDescription": "This allows non-recursive write access to the `$DOCUMENT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document`" + }, + { + "description": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`", + "type": "string", + "const": "fs:allow-document-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-document-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`", + "type": "string", + "const": "fs:allow-download-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-read", + "markdownDescription": "This allows non-recursive read access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`", + "type": "string", + "const": "fs:allow-download-write", + "markdownDescription": "This allows non-recursive write access to the `$DOWNLOAD` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download`" + }, + { + "description": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`", + "type": "string", + "const": "fs:allow-download-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-download-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`", + "type": "string", + "const": "fs:allow-exe-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-read", + "markdownDescription": "This allows non-recursive read access to the `$EXE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`", + "type": "string", + "const": "fs:allow-exe-write", + "markdownDescription": "This allows non-recursive write access to the `$EXE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe`" + }, + { + "description": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`", + "type": "string", + "const": "fs:allow-exe-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-exe-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`", + "type": "string", + "const": "fs:allow-font-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-read", + "markdownDescription": "This allows non-recursive read access to the `$FONT` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`", + "type": "string", + "const": "fs:allow-font-write", + "markdownDescription": "This allows non-recursive write access to the `$FONT` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font`" + }, + { + "description": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`", + "type": "string", + "const": "fs:allow-font-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-font-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`", + "type": "string", + "const": "fs:allow-home-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-read", + "markdownDescription": "This allows non-recursive read access to the `$HOME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`", + "type": "string", + "const": "fs:allow-home-write", + "markdownDescription": "This allows non-recursive write access to the `$HOME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home`" + }, + { + "description": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`", + "type": "string", + "const": "fs:allow-home-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-home-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`", + "type": "string", + "const": "fs:allow-localdata-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-read", + "markdownDescription": "This allows non-recursive read access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`", + "type": "string", + "const": "fs:allow-localdata-write", + "markdownDescription": "This allows non-recursive write access to the `$LOCALDATA` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata`" + }, + { + "description": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`", + "type": "string", + "const": "fs:allow-localdata-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-localdata-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`", + "type": "string", + "const": "fs:allow-log-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-read", + "markdownDescription": "This allows non-recursive read access to the `$LOG` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`", + "type": "string", + "const": "fs:allow-log-write", + "markdownDescription": "This allows non-recursive write access to the `$LOG` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log`" + }, + { + "description": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`", + "type": "string", + "const": "fs:allow-log-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-log-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`", + "type": "string", + "const": "fs:allow-picture-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-read", + "markdownDescription": "This allows non-recursive read access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`", + "type": "string", + "const": "fs:allow-picture-write", + "markdownDescription": "This allows non-recursive write access to the `$PICTURE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture`" + }, + { + "description": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`", + "type": "string", + "const": "fs:allow-picture-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-picture-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`", + "type": "string", + "const": "fs:allow-public-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-read", + "markdownDescription": "This allows non-recursive read access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`", + "type": "string", + "const": "fs:allow-public-write", + "markdownDescription": "This allows non-recursive write access to the `$PUBLIC` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public`" + }, + { + "description": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`", + "type": "string", + "const": "fs:allow-public-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-public-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`", + "type": "string", + "const": "fs:allow-resource-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-read", + "markdownDescription": "This allows non-recursive read access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`", + "type": "string", + "const": "fs:allow-resource-write", + "markdownDescription": "This allows non-recursive write access to the `$RESOURCE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource`" + }, + { + "description": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`", + "type": "string", + "const": "fs:allow-resource-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-resource-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`", + "type": "string", + "const": "fs:allow-runtime-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-read", + "markdownDescription": "This allows non-recursive read access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`", + "type": "string", + "const": "fs:allow-runtime-write", + "markdownDescription": "This allows non-recursive write access to the `$RUNTIME` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime`" + }, + { + "description": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`", + "type": "string", + "const": "fs:allow-runtime-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-runtime-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`", + "type": "string", + "const": "fs:allow-temp-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`", + "type": "string", + "const": "fs:allow-temp-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMP` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`", + "type": "string", + "const": "fs:allow-temp-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-temp-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`", + "type": "string", + "const": "fs:allow-template-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-read", + "markdownDescription": "This allows non-recursive read access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`", + "type": "string", + "const": "fs:allow-template-write", + "markdownDescription": "This allows non-recursive write access to the `$TEMPLATE` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template`" + }, + { + "description": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`", + "type": "string", + "const": "fs:allow-template-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-template-recursive`" + }, + { + "description": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`", + "type": "string", + "const": "fs:allow-video-meta", + "markdownDescription": "This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-index`" + }, + { + "description": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-meta-recursive", + "markdownDescription": "This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.\n#### This permission set includes:\n\n- `read-meta`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-read", + "markdownDescription": "This allows non-recursive read access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-read-recursive", + "markdownDescription": "This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `read-all`\n- `scope-video-recursive`" + }, + { + "description": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`", + "type": "string", + "const": "fs:allow-video-write", + "markdownDescription": "This allows non-recursive write access to the `$VIDEO` folder.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video`" + }, + { + "description": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`", + "type": "string", + "const": "fs:allow-video-write-recursive", + "markdownDescription": "This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.\n#### This permission set includes:\n\n- `write-all`\n- `scope-video-recursive`" + }, + { + "description": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`", + "type": "string", + "const": "fs:deny-default", + "markdownDescription": "This denies access to dangerous Tauri relevant files and folders by default.\n#### This permission set includes:\n\n- `deny-webview-data-linux`\n- `deny-webview-data-windows`" + }, + { + "description": "Enables the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-copy-file", + "markdownDescription": "Enables the copy_file command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-exists", + "markdownDescription": "Enables the exists command without any pre-configured scope." + }, + { + "description": "Enables the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-fstat", + "markdownDescription": "Enables the fstat command without any pre-configured scope." + }, + { + "description": "Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-ftruncate", + "markdownDescription": "Enables the ftruncate command without any pre-configured scope." + }, + { + "description": "Enables the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-lstat", + "markdownDescription": "Enables the lstat command without any pre-configured scope." + }, + { + "description": "Enables the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-mkdir", + "markdownDescription": "Enables the mkdir command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the read command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read", + "markdownDescription": "Enables the read command without any pre-configured scope." + }, + { + "description": "Enables the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-dir", + "markdownDescription": "Enables the read_dir command without any pre-configured scope." + }, + { + "description": "Enables the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-file", + "markdownDescription": "Enables the read_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file", + "markdownDescription": "Enables the read_text_file command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines", + "markdownDescription": "Enables the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-read-text-file-lines-next", + "markdownDescription": "Enables the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-rename", + "markdownDescription": "Enables the rename command without any pre-configured scope." + }, + { + "description": "Enables the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-seek", + "markdownDescription": "Enables the seek command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Enables the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-stat", + "markdownDescription": "Enables the stat command without any pre-configured scope." + }, + { + "description": "Enables the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-truncate", + "markdownDescription": "Enables the truncate command without any pre-configured scope." + }, + { + "description": "Enables the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-unwatch", + "markdownDescription": "Enables the unwatch command without any pre-configured scope." + }, + { + "description": "Enables the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-watch", + "markdownDescription": "Enables the watch command without any pre-configured scope." + }, + { + "description": "Enables the write command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write", + "markdownDescription": "Enables the write command without any pre-configured scope." + }, + { + "description": "Enables the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-file", + "markdownDescription": "Enables the write_file command without any pre-configured scope." + }, + { + "description": "Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:allow-write-text-file", + "markdownDescription": "Enables the write_text_file command without any pre-configured scope." + }, + { + "description": "This permissions allows to create the application specific directories.\n", + "type": "string", + "const": "fs:create-app-specific-dirs", + "markdownDescription": "This permissions allows to create the application specific directories.\n" + }, + { + "description": "Denies the copy_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-copy-file", + "markdownDescription": "Denies the copy_file command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the exists command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-exists", + "markdownDescription": "Denies the exists command without any pre-configured scope." + }, + { + "description": "Denies the fstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-fstat", + "markdownDescription": "Denies the fstat command without any pre-configured scope." + }, + { + "description": "Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-ftruncate", + "markdownDescription": "Denies the ftruncate command without any pre-configured scope." + }, + { + "description": "Denies the lstat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-lstat", + "markdownDescription": "Denies the lstat command without any pre-configured scope." + }, + { + "description": "Denies the mkdir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-mkdir", + "markdownDescription": "Denies the mkdir command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the read command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read", + "markdownDescription": "Denies the read command without any pre-configured scope." + }, + { + "description": "Denies the read_dir command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-dir", + "markdownDescription": "Denies the read_dir command without any pre-configured scope." + }, + { + "description": "Denies the read_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-file", + "markdownDescription": "Denies the read_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file", + "markdownDescription": "Denies the read_text_file command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines", + "markdownDescription": "Denies the read_text_file_lines command without any pre-configured scope." + }, + { + "description": "Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-read-text-file-lines-next", + "markdownDescription": "Denies the read_text_file_lines_next command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the rename command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-rename", + "markdownDescription": "Denies the rename command without any pre-configured scope." + }, + { + "description": "Denies the seek command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-seek", + "markdownDescription": "Denies the seek command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Denies the stat command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-stat", + "markdownDescription": "Denies the stat command without any pre-configured scope." + }, + { + "description": "Denies the truncate command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-truncate", + "markdownDescription": "Denies the truncate command without any pre-configured scope." + }, + { + "description": "Denies the unwatch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-unwatch", + "markdownDescription": "Denies the unwatch command without any pre-configured scope." + }, + { + "description": "Denies the watch command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-watch", + "markdownDescription": "Denies the watch command without any pre-configured scope." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-linux", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "const": "fs:deny-webview-data-windows", + "markdownDescription": "This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered." + }, + { + "description": "Denies the write command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write", + "markdownDescription": "Denies the write command without any pre-configured scope." + }, + { + "description": "Denies the write_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-file", + "markdownDescription": "Denies the write_file command without any pre-configured scope." + }, + { + "description": "Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "const": "fs:deny-write-text-file", + "markdownDescription": "Denies the write_text_file command without any pre-configured scope." + }, + { + "description": "This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-all", + "markdownDescription": "This enables all read related commands without any pre-configured accessible paths." + }, + { + "description": "This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "const": "fs:read-app-specific-dirs-recursive", + "markdownDescription": "This permission allows recursive read functionality on the application\nspecific base directories. \n" + }, + { + "description": "This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-dirs", + "markdownDescription": "This enables directory read and file metadata related commands without any pre-configured accessible paths." + }, + { + "description": "This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-files", + "markdownDescription": "This enables file read related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:read-meta", + "markdownDescription": "This enables all index or metadata related commands without any pre-configured accessible paths." + }, + { + "description": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n", + "type": "string", + "const": "fs:scope", + "markdownDescription": "An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n" + }, + { + "description": "This scope permits access to all files and list content of top level directories in the application folders.", + "type": "string", + "const": "fs:scope-app", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the application folders." + }, + { + "description": "This scope permits to list all files and folders in the application directories.", + "type": "string", + "const": "fs:scope-app-index", + "markdownDescription": "This scope permits to list all files and folders in the application directories." + }, + { + "description": "This scope permits recursive access to the complete application folders, including sub directories and files.", + "type": "string", + "const": "fs:scope-app-recursive", + "markdownDescription": "This scope permits recursive access to the complete application folders, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.", + "type": "string", + "const": "fs:scope-appcache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "const": "fs:scope-appcache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appcache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.", + "type": "string", + "const": "fs:scope-appconfig", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "const": "fs:scope-appconfig-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPCONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appconfig-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.", + "type": "string", + "const": "fs:scope-appdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "const": "fs:scope-appdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-appdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.", + "type": "string", + "const": "fs:scope-applocaldata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "const": "fs:scope-applocaldata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applocaldata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.", + "type": "string", + "const": "fs:scope-applog", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "const": "fs:scope-applog-index", + "markdownDescription": "This scope permits to list all files and folders in the `$APPLOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-applog-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.", + "type": "string", + "const": "fs:scope-audio", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "const": "fs:scope-audio-index", + "markdownDescription": "This scope permits to list all files and folders in the `$AUDIO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-audio-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder.", + "type": "string", + "const": "fs:scope-cache", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CACHE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "const": "fs:scope-cache-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CACHE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-cache-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.", + "type": "string", + "const": "fs:scope-config", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "const": "fs:scope-config-index", + "markdownDescription": "This scope permits to list all files and folders in the `$CONFIG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-config-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DATA` folder.", + "type": "string", + "const": "fs:scope-data", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "const": "fs:scope-data-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-data-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.", + "type": "string", + "const": "fs:scope-desktop", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "const": "fs:scope-desktop-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DESKTOP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-desktop-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.", + "type": "string", + "const": "fs:scope-document", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "const": "fs:scope-document-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOCUMENT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-document-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.", + "type": "string", + "const": "fs:scope-download", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "const": "fs:scope-download-index", + "markdownDescription": "This scope permits to list all files and folders in the `$DOWNLOAD`folder." + }, + { + "description": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-download-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$EXE` folder.", + "type": "string", + "const": "fs:scope-exe", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$EXE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "const": "fs:scope-exe-index", + "markdownDescription": "This scope permits to list all files and folders in the `$EXE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-exe-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$EXE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$FONT` folder.", + "type": "string", + "const": "fs:scope-font", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$FONT` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "const": "fs:scope-font-index", + "markdownDescription": "This scope permits to list all files and folders in the `$FONT`folder." + }, + { + "description": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-font-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$FONT` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$HOME` folder.", + "type": "string", + "const": "fs:scope-home", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$HOME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "const": "fs:scope-home-index", + "markdownDescription": "This scope permits to list all files and folders in the `$HOME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-home-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$HOME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.", + "type": "string", + "const": "fs:scope-localdata", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "const": "fs:scope-localdata-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOCALDATA`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-localdata-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$LOG` folder.", + "type": "string", + "const": "fs:scope-log", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$LOG` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "const": "fs:scope-log-index", + "markdownDescription": "This scope permits to list all files and folders in the `$LOG`folder." + }, + { + "description": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-log-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$LOG` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.", + "type": "string", + "const": "fs:scope-picture", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "const": "fs:scope-picture-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PICTURE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-picture-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.", + "type": "string", + "const": "fs:scope-public", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "const": "fs:scope-public-index", + "markdownDescription": "This scope permits to list all files and folders in the `$PUBLIC`folder." + }, + { + "description": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-public-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.", + "type": "string", + "const": "fs:scope-resource", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "const": "fs:scope-resource-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RESOURCE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-resource-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.", + "type": "string", + "const": "fs:scope-runtime", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "const": "fs:scope-runtime-index", + "markdownDescription": "This scope permits to list all files and folders in the `$RUNTIME`folder." + }, + { + "description": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-runtime-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder.", + "type": "string", + "const": "fs:scope-temp", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMP` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "const": "fs:scope-temp-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMP`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-temp-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.", + "type": "string", + "const": "fs:scope-template", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "const": "fs:scope-template-index", + "markdownDescription": "This scope permits to list all files and folders in the `$TEMPLATE`folder." + }, + { + "description": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-template-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files." + }, + { + "description": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.", + "type": "string", + "const": "fs:scope-video", + "markdownDescription": "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder." + }, + { + "description": "This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "const": "fs:scope-video-index", + "markdownDescription": "This scope permits to list all files and folders in the `$VIDEO`folder." + }, + { + "description": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "const": "fs:scope-video-recursive", + "markdownDescription": "This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files." + }, + { + "description": "This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-all", + "markdownDescription": "This enables all write related commands without any pre-configured accessible paths." + }, + { + "description": "This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "const": "fs:write-files", + "markdownDescription": "This enables all file write related commands without any pre-configured accessible paths." + }, + { + "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`", + "type": "string", + "const": "opener:default", + "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`" + }, + { + "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.", + "type": "string", + "const": "opener:allow-default-urls", + "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application." + }, + { + "description": "Enables the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-path", + "markdownDescription": "Enables the open_path command without any pre-configured scope." + }, + { + "description": "Enables the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-open-url", + "markdownDescription": "Enables the open_url command without any pre-configured scope." + }, + { + "description": "Enables the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:allow-reveal-item-in-dir", + "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "Denies the open_path command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-path", + "markdownDescription": "Denies the open_path command without any pre-configured scope." + }, + { + "description": "Denies the open_url command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-open-url", + "markdownDescription": "Denies the open_url command without any pre-configured scope." + }, + { + "description": "Denies the reveal_item_in_dir command without any pre-configured scope.", + "type": "string", + "const": "opener:deny-reveal-item-in-dir", + "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope." + }, + { + "description": "This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n\n#### This default permission set includes:\n\n- `allow-exit`\n- `allow-restart`", + "type": "string", + "const": "process:default", + "markdownDescription": "This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n\n#### This default permission set includes:\n\n- `allow-exit`\n- `allow-restart`" + }, + { + "description": "Enables the exit command without any pre-configured scope.", + "type": "string", + "const": "process:allow-exit", + "markdownDescription": "Enables the exit command without any pre-configured scope." + }, + { + "description": "Enables the restart command without any pre-configured scope.", + "type": "string", + "const": "process:allow-restart", + "markdownDescription": "Enables the restart command without any pre-configured scope." + }, + { + "description": "Denies the exit command without any pre-configured scope.", + "type": "string", + "const": "process:deny-exit", + "markdownDescription": "Denies the exit command without any pre-configured scope." + }, + { + "description": "Denies the restart command without any pre-configured scope.", + "type": "string", + "const": "process:deny-restart", + "markdownDescription": "Denies the restart command without any pre-configured scope." + }, + { + "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", + "type": "string", + "const": "shell:default", + "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" + }, + { + "description": "Enables the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-execute", + "markdownDescription": "Enables the execute command without any pre-configured scope." + }, + { + "description": "Enables the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-kill", + "markdownDescription": "Enables the kill command without any pre-configured scope." + }, + { + "description": "Enables the open command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-open", + "markdownDescription": "Enables the open command without any pre-configured scope." + }, + { + "description": "Enables the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-spawn", + "markdownDescription": "Enables the spawn command without any pre-configured scope." + }, + { + "description": "Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:allow-stdin-write", + "markdownDescription": "Enables the stdin_write command without any pre-configured scope." + }, + { + "description": "Denies the execute command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-execute", + "markdownDescription": "Denies the execute command without any pre-configured scope." + }, + { + "description": "Denies the kill command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-kill", + "markdownDescription": "Denies the kill command without any pre-configured scope." + }, + { + "description": "Denies the open command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-open", + "markdownDescription": "Denies the open command without any pre-configured scope." + }, + { + "description": "Denies the spawn command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-spawn", + "markdownDescription": "Denies the spawn command without any pre-configured scope." + }, + { + "description": "Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "const": "shell:deny-stdin-write", + "markdownDescription": "Denies the stdin_write command without any pre-configured scope." + }, + { + "description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`", + "type": "string", + "const": "window-state:default", + "markdownDescription": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`" + }, + { + "description": "Enables the filename command without any pre-configured scope.", + "type": "string", + "const": "window-state:allow-filename", + "markdownDescription": "Enables the filename command without any pre-configured scope." + }, + { + "description": "Enables the restore_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:allow-restore-state", + "markdownDescription": "Enables the restore_state command without any pre-configured scope." + }, + { + "description": "Enables the save_window_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:allow-save-window-state", + "markdownDescription": "Enables the save_window_state command without any pre-configured scope." + }, + { + "description": "Denies the filename command without any pre-configured scope.", + "type": "string", + "const": "window-state:deny-filename", + "markdownDescription": "Denies the filename command without any pre-configured scope." + }, + { + "description": "Denies the restore_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:deny-restore-state", + "markdownDescription": "Denies the restore_state command without any pre-configured scope." + }, + { + "description": "Denies the save_window_state command without any pre-configured scope.", + "type": "string", + "const": "window-state:deny-save-window-state", + "markdownDescription": "Denies the save_window_state command without any pre-configured scope." + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "Application": { + "description": "Opener scope application.", + "anyOf": [ + { + "description": "Open in default application.", + "type": "null" + }, + { + "description": "If true, allow open with any application.", + "type": "boolean" + }, + { + "description": "Allow specific application to open with.", + "type": "string" + } + ] + }, + "ShellScopeEntryAllowedArg": { + "description": "A command argument allowed to be executed by the webview API.", + "anyOf": [ + { + "description": "A non-configurable argument that is passed to the command in the order it was specified.", + "type": "string" + }, + { + "description": "A variable that is set while calling the command from the webview API.", + "type": "object", + "required": [ + "validator" + ], + "properties": { + "raw": { + "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", + "default": false, + "type": "boolean" + }, + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", + "type": "string" + } + }, + "additionalProperties": false + } + ] + }, + "ShellScopeEntryAllowedArgs": { + "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", + "anyOf": [ + { + "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", + "type": "boolean" + }, + { + "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/ShellScopeEntryAllowedArg" + } + } + ] + } + } +} \ No newline at end of file diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c627e8a4286f1e27ad8636b09f8a741f19026b01 GIT binary patch literal 285478 zcmeFa2bi2!l`YyBIZ5iSuBy(GBjycn?!8>*JqDP$0|U;oa!cK@dK{_9lrU)9yEmaUdb-?#Nw=c>QX zT6^tq_Q}h8UtXs?{(E2EwRs=9wo~4%c>Ix%*pKh~U|!w~eD2z7-N%J_c_p`Y$}7Z` z-#-aI`Y+X;@;+pLL0;Y^_VfHO_b+z`a(5ti2Xc2HcL#EJAa@6HcOZ8Ma(5ti2Xc2H zcL#EJAa@6HcOZ8Ma(5ti2Xc2HcL#EJAa@6HcOZ8Ma(5ti2Xc2HcL#EJAa@6HcOZ8M za(5ti2Xc2HcL#EJAa@6HcOZ8Ma(5ti2Xc2HcL#EJAa@6HcOZ8Ma(5ti2Xc2HcL#EJ zAa@6HcOZ8Ma(5ti2Xc3yUGBj9@LSqs#^k-Pwbs_Z<^5c{yy)C7$=!hq^bUk#xwSa; zzrVIN?~-$E{@-iuW4w={ui1V60)3lvFDrKkny>qouoH@71AMEcVqHJ~Ze9JqpZYib zui{0?cWO^-?cdk$*Vmxe zTD&GPa6;HU!1tw%Q&RY$Bdv+tbG`8HK!9_u%dmCJ_07)*>)fqgw_?ZP8xD_q2y)^S9jh=<`eW8k86G%6s8I=Et>awU#6BIk|_trW)^kid}dsE%%Df zr#ld=x74*5;M}d-TC8JyPbk&{d^kKOVcKD~wm$DN+Kc#@2Ao_LX4|*tUEa*j;B#U( z;CeQuzbE8xxW60rocK9?-ugNME=uJJ+ymYZ{7f^QqxX;ZGWGuAYe{^N%T=|^EYVGSteSJP}@O}tCcv_>@ z@q%)t&kuMnn&||-C;oes!UudWbN_O8prtzyVBTL#sd(r5<9gJqu2Ei90}I|gzwNL8 z02_*Dha2K6f#E#C@up*?T{a!d>v9a&V^8LF*;!xQ)mk2|H2d*^19|xe9?i?Ie=e^p z?ZBgP`B*;Bueq=Dd(xVIU+}&B9dYk>+TY{#-+G<+<@W^11Rk^SKM>)Zw*w z{6UTo9>eR_d$D~xbc&~ClplOv;Jx+lwf`RQy{M&u2h{MnfVc6+2k&i5iy-&)i|!7{ z+VIy4AL}~ey28gntjcv4tV66x#k%j;buFt8mo*O`T@Oq6;k?d*YhZ;qt``G#1%DR5 z$B)Mf#LmPD>guBrTD`Nwk3zd!gKzK738 zpBt~o@m%?wA5{+G6|ae}Px;EeZt{cWIo=cA8_^QV3(yXFAC(V$t>9|}z9(vYulSzn z`-hJM9^hk-3og2ao_oQ;9cYGmT`zJ?!MxyIu@0Tu9P2k+PG6=t7eDUwx32X7-@pU0 zVR4;Tpm?r-IvP=2`Iy~bUl60!f4(4g^x^z?U{B*Q?8J$#MJFChwuALui$m=UJ|AXj zzCZQ%%E$bBF#c^Z?>X@~^11rYpFEZ4D4#*bTLAwR3XTmKfX{QES0KKlH4)#uIE zLE~%E*GInKYbHdz|Bf zivsk@?Y`!t2CT*VkIyCfdci!_3Nf#7Cw;u&9r-Kj(PJ)F=Ncs5#jiWOE7s}X9;Pm* zA6Fml{5LUReQ~_v!R@2S4OJ{NEea4m36;Bk;A z&~gSo;X6&w*SO2d1U35FvDfKSbE!Qw{PQ6UM z%{9*T&b3d!ss5Q5!CJm{pTm%1_{hTrA2@QR-~-1_7vG?E=(9y1Jn>Y~2akTP=>IzY zX#8)EKN0_%!;i&3wEyAQ|9$jvYX={V{VffD=Wmakj{c7$PdLNl0}n<2r`Tt44KsXQ ze#ZN`%T=jYH$7|qg;cFs)90OO8JNTOU z+I^l-O(EP+PYrQpg~lAh3)BlPmf$^S48iw6`G9=P_Xt>*dW7l%zL&}c!UJA>fR80_ zC_DfT$nn4h!2|)1lhafEJ^7zTf57!XBkrjm1I)wM6Z2eCXOPe48uR_T=GJ`ejnifP4ifI}aPz#y?#|7`qkPJID5`~QkQ z`0y8tKXB@c1s{0ug~;`%|E=`8N4_4p_K~lbUi-+GBiBCuQsFg^y%xRtu@|j<{?+JJ zYLDQtZ~A%t-Uq)_c+G?Oc^ZG0Z}rbdu6yu>lIu@BTOfa%f1j8?^)z@1JizA|@DBNh zufZ9=CVZh>;dp}ggIdMviqh+-Bd8(Ble~w#m%OLs1>R$FD`N=J2+T3SQuP7fGro6x z4>eBE7=iD#zV8|va6OO{p6fvLz4P@+vAl!%`N6N2T>k_x zOx!&I9H0J1>2>x0T71KUUoQIK$!DYgW%lrHg4Dv-Lc`G*lyTf*uIVTL=XD5X;<_hZR5_^ z{=0X__HN!2+r4Q|Z0F{^(QRAz#Wum#ZQU1NwRL}N`S$&>MfV(v&)sn_Hhbrh_{2TO z3Wx4K5gV}QWUT-0Q$@Y@)yHoQkx%NuL*x#A z?kKo|uUWa`BzS@vgC7fr;9l{b@!qLsV0@vRz&JwrfUy+c3!e`pzvyy{%qKz*c`-t1 z7xDo650W&2%MoPa0pLc~*9DB9j{MRBpD(zlmIIHI)A^p#m=|WrY}gSuo9=<_j2rNR z*k)We?~a=-dlI&FZ`_F0;hMF@%;vq;w%`ix_$#>Mx10Awe-0k{;g)@|SHK-FY}+3@ zz3pK1@I8lOcketJTekb&_|!eeiw5tnkKJ`F!sb`>OL5_X&-k*X6(go5!P{(0HCXC-w8pOL1MPkC&JoYY*RR z@eU2k*f;R$@MYA(#QNjkf*=2n(rX`lF8-l?_r*T3d3S8UhHcSFtM87jUvXFL{^e_; zUx0mk+3M)8VSmMAvvNJ~yeVeZq}XbFyc&34wZR&A0pBaugliK%ZUP@PuG$!DT)im@ zi#7PRc602Vz_!HR0bjgx*H&xmw#l{Ou5GafJZ@OO9k#>Th8?j+Xop7ViALxIwWdwG zVl=a9H+W!A%xtNP8DQQ(Czu_F;^v;iakJ|P>}cHVK2~Iad-)vnMAMf2u|Gpoyt(~Q z?A7gu;!i_Q9NB#=zH;}8=(zp&#d||jeT*DHKDZa$a0D@iWJ%1MZC)@DB|E+Yy6~aCQ%_FmQl1Vqa~ya6!}Edt!|=@BytsY%i{~x>y7Fp>gZ} zxY>3fE*!DzXpz}_Z^FOmIOX&K-y^v+TpKmZS6h59 z!*%J(sNv@pEsr*W2O5^t!f;)@GTOLgWwZ$#A*MXA44gn-0RF|m0jBmYYb$UC{>1_g zaJoSBK`IAOODG2@{&`Ku0g8X00~G%r2L$+cIskEi0sh6P34#~_+JO4NX@n;5Koeqw zrfvJ<H@}Td{6n_@;&Bz&G%etw8{g_5r`gOESQoTAP+b# zAnPlf2i_YLTzr2uqtB<-4`O_m&u86U<9l*G>&Sw8)R!46GG^r3V2zqNCf28@E9vK@ zriOK;KAzWmj>kW}a${^3eER(hmKJ_*{*uDKE?oity)xFcWJQb^Hw%|Wn-(sMHqh`f zuZ_4ikpsl={lLEg_Ql8#-~h2^9N>5$9S0y65ays42#gaD2N=Wv1{@%IfSLdt&_oW{elXq$YoLJ-8g?9xH&GkZfeZHEXL$j9 z@E61u-$PE}Bx0-S2Olf?=VQ+m+))2Q^lIi1lneMC^1bAHD!Ey_$HD`6&xHrD2Dlcu zCR7h_t#HjSP7KQtX5fIF7C5(j6kwk^%xSS8$EQ8I^!d!|aL*ZQ_lN~i6Snca>U&_75T_|Mct8tC@e_dMJ7u@V9Eg(&!iFE{gni(K6tc{v6l&OJIwm z4Y)QefZ^IC_+JVhz}IQy1hr-y;CSF{I3Umg-~!DNG>Zj%9RNMh+E^fn2UH7$#{$d; zTB8OC(*XeofCrj$0Ac{f0X9aU9)M97G$E%zE@%Mu8>kV;2M6jcCm>Gv&Frn@-*e>wt_7_jGA`g+;hN#v;Tqyv(wKm2OtpaI z1rqB})+UyJjswmO2Q<_By#J|spE(@zcHr}!)@SaA?=kE3^!Lo+v$m|bXU__KJ!4AN z-I%xAdN}^+rE4N9=PfS$(wqf_e_8}Q!Ti|=kJ|^Z3g$Ka-TmxJSToYUyTq9g7q6M&a zlC%KU7Guh09FU6#&JE%dzcm#5E@*MBMgp*5RhBjCdyoiji3JK}jE{5kM$?wnuPh-(A5pb5A)G;ly*#6NU^=mFsY z;2(Oy@<1vFKo6V?9S|N1kO$6vEWq4g5D$17fH{H8Iv_L_XwCtyuAm%%x`6=)s5K!T zXu!t}d+v>!gY}LJ?v4L;?}^x>`yYsnWK6*LfbTUQvnNAy1gZzPMz~fqCSa|AYl&-0 zW*9gvz!;Njk83bPeIT)dbC2432byVq_4&-rl8*zuk6J$GQ81@V{#Kt)ea9Ry-t+Fv z3rlYf>hywp)RBn$y${4cx@2|X;yLpo-~0cVZ4HtxSa-gNk3@W82}pX|LazJ_aoae>|EguWuI6|Nbs9mxwoKXOe; zZV>T+_78IH1$n_V9DqfydBN7M|BLzild%t7mCo<8f6I^c`95(jhQ|5q#h1J}kSYMaBeNGh92G z7vP!_zk)iU<^;I*q(&H~19Gvz+3=U>e%ANcbLHwR!G1l}{Jj4X>tl8d>v~CgA3Yze z`7*~tZTCF1{>Hl4&CvNz&z=(%oKK%o*f@Qr;NQUaTT>2jJkX*J&|CnoK|VlZ0p_Hq+aJ*8SRhLd2&)T(!~)C>2C;zE0cH>ChSUSd2{bS!fF}6E-czv+vj32K6~O~s zOPU+x8sl2yn&aA|_9O>L&tNUrX7b(v@nKlU;DcNo&@zK1<@?B?qWgn9{|%Shct3%C z_4|y|7_YIngE>Ct_UZFC?T>$Y#>~hUXWuEfZ=5z=uy5e|$pc~;IpC~ffh_6*?HLP% z=>V@T5Yz@y54h-K0pK6LpV+q?Kpr@OnBcy6}_2*o~YtjW2)ye^!b%emBwef9h7oKlIYGB}a~zNn_Q4kux?lZ1dMmV-pEXzBU+OK^_7(f| z``XXLz4xr?K8yVRoeK*#PMd{m9Kv6^8eX;e@H-xptUIB6d*BsZL>Hw}ujRmwnK=uz}4U2}wnr1AJ z(*Ob9{Rau`;~vTV!hK_(CApOQc3E?k^KDRn39t_i7R`_MgLyvg31zSTjMvky<$JF%k|ZxuSc=Z9$sRfd%>sAh&)Z~Po5lU0QQ@}0ptO}e<%mM z2eH7sMdy1gkfv8ybAs46+-&c#rv;kn0L~C#e~{NB@;$N_3@{$=KfY@m|`Pw{^cZve z$1u}&+Vsc^GvL!FO^&<+{F4I=I3NlC?ZN@=5DReMfbA6o7o_F`-t$<%?i&jF1jAwh z{(z104qhj_@LUkjVLk#Qd7;XPuSv+x*@h)?=9Kqu=M8>Z#Ks zUzmpYe$u4KJ1|}?{(TN07o5vjAgoU?LrySbk5E`F5VmKijq?LSV*$<)(7l7QZ!nDx z(0qV$0OyD}9>|yv2+;vP2Lw6*`-NKMfUsDAGXzri4rkdPkVPy&Eg(7odBHC*A6Sok zAlD$*qVxy29wDw(zc+v!keUl%9^fL+1vJzBh>wCEALdY~`;+p0I2VHZc%&Z#^%%xu zpT$0Ji|t>a`)i%=_xJSZK3?WjH0I~5XU^#1{yom);=Vn^`}a+QPoFR$(m?F1 zDgF@)G}i%61Ds#6fQtuGIiNjbfw2AnFDDrE391H=eS@ut1$-Tli339F0=^D7Z({++ z0jv+&d_e3t_Ybk=#9mXbO|DVq0=Q;vF2L;@u1(GbaLuQ1z{Q0Bgzm5P^8KjwOTM3b zdN7ZX8j5=^IFmtRe&$^29*lqJrC-J?X3dSPXKru8_(%irPYy5>X^sa14me+80qqk+ zpKxlgaJ$3;ZPWqT#{#Z4=+6;q$5`O(<_Bbv4+!fM4CxQZCKh17;8ElQ_B{~WaPo^d zlLYgH{CptSEZ45Y0a(knHz@CN)c~%>b+OJA4}3qh5bs5j@2Bp^K1;3hb1xs`E5=#O z_5bUev2F{OM@CPWP}n$rT%?Hx4iNkc2ehaISQGGa0qs#6Y;8_ZIY8!z_kshy1jBWJ_6KC>5z>5s%LTNhKfu=knezdDU4Z+A&e5Ks^!))%hzFVuK3LRv z;DOkfddwMST~KoYT(dzOzQPKp&2(eLJlzFiGQC1(&_-I4W662K-iw4O#K1M z0o*r~G)IW}fRMUCw)ucI<^;2wE1b{(tPeDsAD|rYUc>^D6U;&fWXK6}o)Gs5h-JzL z*qT7&e#{>{@Id_Mhdx{QNuE)}vktX4i2Z@AS#d3MO>2K}QZ5ksSMhLBfFE^FzFz5t zaK2w_{ml7sFF$)JshybbKlu!NKe(0JiuINUzZ$uI(v-q~nLJUj-vIm@!GEhbAf-0w zYk|~0!S?78%2XE!7^tS)fQVgaWEWS*Gif~+{8wdV`8Y0nTeK(-tZ77MgC zCusWwZLe^B>=~YI$~DS;!(6jmyIjLu%eFtbvBVn3kV0CU$H=& zYJ=}eERa$cI9IU%^#Jz^(QI#!)C8ChFR;-{}*~sP~iKa0g~c=^5Q19pI>r*$e}XlC+9Zc?C8f|D!XRgmdMTH$3}iPZcK#u zZ-NQ-g#+mS)v}HSd>xS7C)BJq*dBd?ZHfib)CIzHKv-?CJ!65^&JSp9ED%x~%swBG z!U5UV22)}InJL)HoFMSugnfhDJN&yt55;d}PY};L=i22OKFHocmkZ;MvCl=VpFD7Wsg7hy|btWPSkl3_Vf*LiyF&8`xX} zXdWQZ6GUHl5ySui_8Idq@25F`>-$T)uy0a)KWZo3U&%bmo)bkMeCbE=in)uTlgE!O zG^0mG8i9XufN2*FNa_zr!T)<$7YL07$OZ3qe}GpPNWW*Og}uXJIv`U%poRW`%yoej z9q?|(0@yRi`J($DicS>Vqc@Oim}@zx2V#wLFI%bxxCrt90sj4*zs~aFOvTiCA9H@} zt=fn4TcGj(W84^r|4|nI!T~lGNY()w2ec|Dm{J#bFZT>J%L&^0;91WWZ(~j{U0onK z9{>($ZB8&#k5EV~5ZWi0Rj;tOXNda->{(->y}~$OC^%yzY0pqLbpe?r#ytY@*VrGt zANZFwjM}wd59C_6^MbCqBCHnR@&Ff9IRF~R=KO1|@7K8=wTSy!8-4WAyddWv_fU5=QoDjwUUL0^C;Xm;GF4jrx?MK{i`OxM3(KkWu#QoLvPnKS{ z^WMlufbky@@1sUU8i{`~j|18*7D(z7WGn!iYWswyhH*f9)CRN22`0w^4*y}Xz`K|e z?2xfQ*q)*G;DF@10OpIMFYvzj4|z7Uo-f4yHPrw-Uyy4)=m~UZ3Oa0Dh%-V0{EPPY z_Vz!fdweiYRrdFBZ|`%l?(FsX3Vr{K$m(&U3yJ*(7_S!phv4@I1 zl=bMP*mbh-!(&Dj{DA&`sY|c z3HrUl&GG@6&KU~J31-R%gv0`Et_`01Siow4`(xkdT#6G9+WEnTe78u~)&--mZa|2#;qR*e_Ey|hPn60=IzW=pf6qjLM_xv#<3(bgOkw)O393cL` z84qNm1J0^8=;{KlPwS)h;3xPN1*+mEXBDAiFuyPk?e+6`XcK6n2SAxSO@l-;Qx)_ z-*LbwPX`3~z_5Hkd(;M#`U8mni#Qetn;+oC0vYoG=UXg*vxjAtU>FCSMNTkj@9=T< z1wsQn6d%f*Hs@AwjR!r!So_C-0nWG87=RcdRunfKyaFcyVXL);hKlV%R zuP?rV_#Z#E;DOO2#P>IV0~iB{z4to6)dkMmSRl)NgJH2i8*_r8Iv{D5n2QBkn-gqh zEYRxt0m1>gXDHV4xx-<7f*E1~oGoWr`cF7|O?{#V5P@FDR3#J}T!Y;-`g{(#o@3a8Bp z`aMDk9S}N4C@dCmv&DnC;y80q&KqsZnWN2mgisfdd_bC5pgnVfE$9G0C%9?@urG6j zG#_wo`vd%ZK+AK4h<)k+cTJrue3m)@_~(oOv*%>|SBFo>K7l z_yA&n`{N5vK2uVP{vU|}{9b^at`~sV&^iDy)4^+jN%)u8-<{{-&-IjCC~N-6jdIV_ z)323ZJ!)jZ^P`~mhYc=p_%9F+81CtSASVExc<*w8$+1AzIv`U{Fl>fMrktSD0pWFl zEIFXHvB2u6SxyZQq60!XASo7TV@@!OSRkoCptbV@+9MVS>klCQkq6v+GWHzzv2%@c zt+N+^YoGgq6EOhlfG!5Oknr!~8J>f5+2Pu2u6WGP`=2Qj?azL{N4^@pYUPH=XMp>+ zVZ?vau))^<4<>Iolr?}v3{WQff>{S3CWsAUguc>Yro+Ynj9qBtF}@b+8s<1z>tN2aE+y}; z+JDlNf@LG&=Z6j|Xc#s~IDk9=|L-(FhFBnL9dJ%!fkZqI+8+=W3xu6DHah|yh$Q6& zW@GQbY-j-5otgTDL+XQezW{RrFw7NPKwD~U;j%)UH)d_o@Je&fe*mz**%`5~ zmbNaCMSnop`~buR5(DhJFSgW=0kjT4ED#f^y+Fi{;;5t50rYv}nuLGG{?hLc-E-mu z=6j(Zf_jMff9|`n?juJOJUapyA6iq;01hxd2Usm|KE(pe2Wn0bSM~<@^+BB}-w;4y6O zLT8I2m@Vi`^Mf*9Gz%_J9^f_L0-pygA1qs42rhuFDFhF|)+Vg>u0n7DY+WJF9(1<8 z5L^J;KqD6v%K5{IGl;FlyFvzA*cPvgi?N)%<`=`vye^xV&I$PB4rE!s-HE zEI|ApKn$?w-q^ET>&yZ0D!oAN+`y#$0QSslnG2#g>R|W}Vt=P&WX4ym^!)HlkG%Xx zT-}d*{TLVVeAT<|iT=Z|n#iw-d*HuGuEGJ53$QxC(*muH1=_q{z|9p6oh`2T56&6V zx&ZY6A6uI`4cK=k_;(zD{S5*B$pg(e0Qk3hz~cai|JjQF5Du6tTEKFEoh?cZa5^AN z3qTWuX@NyP2jH>j0mlVPsRx`USO#4n1|C>Wb6il1Yc2RdEQt$v7Ag1uJU}B42p90& zAvuRU!2y;Bzy({P&CeOyp53{_t*r}ek-7jl0Qk@9yg}VJ%qy|)@Xvf8Okx1+3y?a1 z%(KIq=h|l-kXRrlWJWMBasl)LHp9QfHPrrY#uv{=p#DMbqheou}Q`M%WtjB}2k$t%zq zU#$DpohtYM@jrT0!Lbp*_K@m=2AFBi0lp4kUNB8gP-_BSpWrC=2dZVWUqCqkzCYX9 z;*%y7;OsG&_6)-RvuC)OfdeKxT|h2KoU* zJ8}L9V*@d*8$c7x)!F0F1=2&{;)5hU@Nxwi`M~1@n=7y}LMkWtF~V|*50Enu9-tlo z7o_mOYNrX3IUs5R4rqf8$UH}g`vzfw4j>1l^a!;gCkRd8>HzVhC%;@$${u&W7m%2c zUOCe1;+{V zzzH;Rf|%+A@WKM+2IvIg2E+-}38EFi2h1HTMw~#6Ack0B3G;~12}_|5XrdFS5t6vT z#snG{1RNlF0jmQvCQu$|cJ_E1>jKORYCbUFfNW=rhsOeqbtj9=&g1ca=US)#*Iqzk zLFWSpGXY!3vyR|m1IZ6~@qpw9 zT`WKjQ2g`Sj00R<;H>%s&N3E&|8H_V}#m4Z5$patiX)J_t5P3;tI}CBY#YQmY_|XoG{c# z!4I&h1>go}({QCtFECToW)y%MU^A^v!*$v$n&SuXLZBN0Za}^fnnBEIhFQ=IVu> zt09iK)3Z6KH;AFuFqgL2+Po#mJ35=cGy;BzKrg_SCk$t~nT55m6%n(DT0!*zbpg*R zOW^^j6F>u`azJq2Si8ppP79o6EO5`^cms0)`%lJZJcM(C_el=m$_kwgN^B4#eh$E4 zNd13D&;SK+A}`{SO7?TG!qZ%Rwh^LLc^9|Zgl8VC(Q zvs$1z2c(S!(&PisODMeoUOphm1%&Mz%pw*TKMptr_LT$lF|Xrj_&RMYIAiSC0y9Q! z3?9QqtKsvb^=rK1XJ}(-_&sXM6T%hB5#WXKjvpp~A7~T73u?*{!V}65K1YBXra(K; zrb0WYksrhyKaeA)gCA%!zzu3M!4H8cNAT)##B6c|xIs-hVvffVbIA|j1=@UYgXIIn z56mSSr?>^XrJJMXV`8lZ#h1xUufjbnnIf9?BW z|1)c#V4B!g4p6KM-hp8s?}GEu1!mOf zd^2iPff<>N$@k-Dz!7TX2sPmnG~o&8hlwz9#3XRT zB*YezJyU*=D>!0`;|b-6sXj+|Jdwl|;E5SwTtS{t4MC1jP9PtE2j)9nAh`p{6?j^J zeFM@v)LaLoiv?QM9}qfAEQ|wE_6vk@K%zgOfjNL(M`JJXtU#U@Mhxg)0AfS-0$@Kd zeWt$`06L(f>;(#9fARmW?~n72@v+SKu0!9?;d-0IG z692*hP6M<{ED)jt+EN!72P}#KgTa;ln*Lk;J25;e-;5lYZ${8YK${GQ=@pNMrI>t; zU#E>Mz|T4JIRn3Uq%-A)Q64vpcDx`u0^Ber6F+#|Fdn&w@uDG+pFr+GZ6fjyYLoDI z5^|H|h=3=c9VR;?H>gd8h7bcMkRzt4IUO+_I)X-C5N?2Om zu>OeHfN=r)4pj%RMi9mUK^(w-;qxdK*l`Fs0MrBTIU4`X{)b~9V=pj`SP)Dg2SAJv zD>@H=7-9_2LGT~M{(Rny{a+;h&tPAJ%=yfdGrbw_)IC&Ge&E5vYo7m4oar~OphmD? zSRFXe=PL0k1BQ!~q#{ zf_^LzI#V=LpP=Rg{8+&49o!zS1Db>baK7-q`-`fNKT%Z9^R0*lVnSwuxjrCbhS(v7 zh<~pJa6ab%n&H0|I!0#wIs9wxkFS0AiOBUoG37;=?Z13TRm9ZvFK7V%sR6{2I3SY_ z2+arRzM+~y5S1rHN{4c>4yA(v$5TfJMe5A9>d1c#ygwP4LQVwji1;JImCob zz~c#%oK40RHjy?Z*(OcxhB(05TKrRZpbUry32LiopCdE@}*|fggkJ=rDo>5C^!K1hy?|bPn;(l;Bf&%O88OyofV_hy_0fNMA|J z5IZh^PG8y)G(doV$5~0a|KrE=3V0qm^BpIjy0U_^zP^GvpTmdd-%I>g_bX_qCjQl0 zqXSyV2Q;e-gvA2z(?MR);{fdw#5_Xu3_5?$$MpNSqHoE@_R#Gk;O~bGBmSdi;K0jF zzkcsGbLalOIdy7<`TEzNG(Y|6cgv-&5&ILXAc**s|g5&^!4PvAN*8l?ii~fHuQTscFx`vyMNgA2qK=wo}z3xAi#e}T|n{gUj_T{ z`PjE4THj*7(Ddz_XJ*a%JM-1AK5iNs-ZA{w)YK%`+<)osfZikCvv0iexT#(9cV^7w zJmdxv93ZiPs|~O|s67Iyxqxi;3~gXj7%a1*#z)*h~xd4ThaBkkTjU=>Xz? z@4e^)IvW29=K-;p)o# zpFsO3@b7a#yTt-&H~<>93(es2_$JI~$N4#SGvVz;H`WE~JzMuGS;#D+&&jBtckdzO|loM=Y zEYQ;YfYHD?F|UT61@Zfe{oxM#hY!t5!oB)5`DE_DtnL8s897sV;Qj~aiVm2yAS%5C z>^WQz76-5tYJQ7-YJaQwH*Tz!^{u`>tHqxCrnGm!>ZJzx`kwvO z$O*g;_>UU)53yHBdW1NKgmD1pi@2H~Il$%uv!5T}b3jtBu*LyC2V~tJ5E=_K?mjN_ z07kJ7Xb)yz`DcT{-zUxnbTxpEf`6B%wD_04|HQ0s?sI0Ilk-pcnty7_iZQcuWljHx z8PKPoVW5ZqtaU)E>jG`#0KvTD0QLJLSk*4V_B=}x6&@`+!wOG z19~ri_3Jm#OMH!)dS_?U1+nj7sqGtPO)xbNAaQ`y1A+gr86sY7pxJ(b_RI;&{D9;h zAw!690v!59)glKfFoSwC4M= zUf{WJZ1D~-7T~`pp4w=}PRWA?h)GS5dkLrkY+sPwJFFUjJpnv}T<{;p0qhTQ){Fx} zW{D;B3w!y%yPM?%Q~LyyV*$(Q7b%o-r#eVGNIH9&hVP`S(k&{-fI0RPFk zf9QW7|D12Y+CS?YGV=qu{}=zesC@9i{3omF|B3%Thy$nrJRK0k0e(K9wK>7o<^w`< zf{J}=e%1Z-{lkW$r>6$JF{3NYFMs)ltkGP&FSnsx|I>R)4KQahdJ5)r!4(?7^#v`# zOhT&x+$oF$f26G*dPz^@53=K#MhK>Q~-fcR$(0C|8XA9}v1+@A$P zj1Vgwa28M!{&nWZVV(Jdx<(*7udT(sBdFysv{JCEycR=HSU3Hb{4|*T) zACtX>+%F{igs@*w=8t=M0GkI)<^ZV)`11tctymy2KL9m=BD3v4>>HH9%s7 zb#gr$7`cGU9G1@a8en?-%gi5p#y4w!`yPsQm)hU{!Vkmm|ALsuwF$;Nz`5gq7IZ+S z^92O|z&$np2#NXW`^f`Q(f;-IYh;bKr2Ux}xKGIT1#^Cg?FZm&QON;72Z#os4mitLASox<+Vcg1USXLj z)N~JO0Kosx4n0!xzx*0ta5lJ`2i(!|A9mIc=bn5PGe1_YE&OC+`|1BJ{_$8e zfYSkfED)L#d>3K?;(a8|VPEhM><>dNVc1aMzgM35!tUJbTdPAt}xFT2sprt z1G1efeD<+Gaz0?ozIc^0cMu@jz;ypgnukazKE6#s3hC|Ce8S zQsC9tkRJc^n_v6d8FTdLVsr4|9CP^a+$1}Cbb<7^0a*vIvqfd5Fy;!|ejt11pmKnp3uwjxnPP#EoM0RK1DbTMF!lmhvJY5# z05}iJoe5;|pO?H3IFbK9ANK&Y*!!breR1F4cTxMpth{m5{QY|tG%62B48S;mmKqC$ zKfc=i&gMLz z_=TS(_D~En24k2l7{iRPIL;q{O^f5~0oe37&K`lyur?jn=`)?p!WA}yHalT6u_tc^ z4WFAnJBIyzG0YT;0>^n~#j1~E57Teba)4_2H-7w@89wF;Gj0;jNWtHqIx{A}OMdSh z{BGFHIYnk7_5*W2Aol|CpT17{0RJW7e-idr1igSB{uu+v4AI270@@R-=Z&cjXbT6l zS1ho(F4nLI=YwJ<(88y`0$nUUK*cf(kXRvR?786BJC7b9d@OT-SYJOM@vpW2THB}4 ziSr9(h5`5e9*74sKY8ZC4$S;x?H~U3?yBAq!9O&B3FUzEAQq6GLB|1n%($Pv-{QZ} z^y-=L{|zbnUw!`%fA|Xa0T-Ie{#{Jfz^>>Q%17NWA3Tt6hR}wnp%z-%$-MaD8Cmwa z<`o0H>gSFgU1)kjH;ft`msug42g12w<1llOb4F$Eu+A99><*nD%2~o{dJYlihWfKZ zc@Bxr5S95~ZYG$_2%AxWuN9ji&=2=NxTwYF`Sov{fzQ7b^F<0}?$D&^m^;S5$KR=Q zL2#WiBOjlSnKyp?s{Bsn5Bb1*-Sq!sh=1SzV?O}r3{ zwZSkQ(8^e#HG7A#f2e`y17jb+CiVbuFI;dQ2xox;GqMjDXXfcFP=~GavImIx7Y<0l ze=YIv&HQAalb-j18GlCx!q4~XQP4pA3kM|f0SO(TaR9I9qCX%sAK=dqU|zu0`+WRE zKMWZJ{6oj9{!fqpSApw@!+*Z1R{Rf2Z~(brFnFaBa{^v`DIEXm6aVs;x8ckGr>UyC z4D$xChl%?V9R36BW2TRP&VZahE5sRNm{ZE%;o+Y%f+h?8qb=kATMqx255O6uoHe=-eLzwJ zz>J{ad=Z>4#B;{%S%a-Oa}>C5>)v6X12Xjo5dYiZe`uY4UCh7%`OP%IVDf+%_z*J#()oYY6F>X; z>zE}HHG_wAk$GXnKj#8+wlMK8XOO`6%b7zwZzu)#0p{U{Go35KvqjW6JDj>eH~=%h zCQZ%9jF7nb@BjWmMt@EG4;gVO^uL`k#(9G>rx-dy=Y&xYOq!10huES;|4;l+#GYW_ zpYw=`fA#^2{|El%ydlN_)Bx^mu~u_{-ye`BA8=N&z#iZqXM~{!_}Jsf{}KP3hpjz; z#0;@R{OcSLVoPy$UV$G^hR@6I{bk*56I4`&U( zz#hN=|G)_SKQSXcfWVN&QnNW==M@E{!$0SKY{yI!zNX!-_m{bj$6qSE2DSfhGUf;V z8~gRhXC5G#16mmiv`c?LSS$d%4}&(>nIiQ4jQs`wHNZb|`7gg@^Z%Lje?RD!zJ0o2 z4p_datn4Zrz+6BTcz|4BtpNQ*#QzfxQ_1y2#n_MENZ_BdMLAoT{-5Uz=y^lb{;K)U z_RLZ8fN%hGdh7B31ZohMVum1|BhNc<93V4@p#`W1IAe7Dj!2cU9#Q*UBqcJ0F zhTD({&IUdE_kHaV8AL`$;>-YQj z048oH{v{6p4oI&9*e4X!2j9(D09dy(h4MxB3;yA!2hsm$iT~GM|0b|sfI44iXaKy% zeq9mgcZC*k20g&X1JTdat5+w?4fE+LvK|?P^Ju!mWqWR!~ zeCT(}1LOj0n6EOSD;`J9kN)cwdF^TQf51Oy1S5>t|A@7D?x>tUt}%dz{pqRr2M;LzE$)>AfPa?*(6ht@|GxhJX=eTZ zAK(6xsT$M?vxTEDZ~)Fv7!95pgLq&pauqbz2FVL!C&jUk>OV8$|5f52eFHP*M3Doq z=MK%+9spMZU=Bde9+x_Rhkw=sQaM2O3bmp?Ad?OV;egOsU{98_>|~e&c0S=hsrSFu^Z$Z>?)~9;-#qgOz5nd}tz94cM4#Kc{-z&r59~J) z|CR$B540f`Xj4uwQ-6RL3n&Mu@2B?92LD{hnzLWIqS}1?@AJ&9w{(JCVs5(?cH1T9 zc4s|q?_@stPl#)0{6pHAfxiA9IMBmC=8bb6DbFU+{QqR++XeqF4wyE*5VimG8h~2B z=K%76`h8#fvrb4o!81c7{!fE{eccTWe>Dpi|AV;$eF`;0E`@b6HA6d@LBl$k!N?2H zm>=xjKhJF4G00&*xt73BYCa(q|3MFs)&N-p0RBY-IQ+|;U{3?c9$|?ESRZ6<(BeO1 zEa2;aOdQa{`~b!Rhz*)}z9{w${(9eiu}>U94>0F|5hJ<>pauM&Pd$L4_}4SPc&>@! ze;0cHpL!`?v1nQ0KliyU|LwlF==+^_7;}?V0 zp9xdHFFgUoK72pVASM3CPC))I4gUSt@QYvk(Cpbe!7NzxaWik>N6q|2))p-Os9CW1 z|20dN|D!p6VxIZ^TW`uM)q9rw+HEf6)z_XfBjNw2-wFSZ^Fvqzlpa8bfA#?~2Ou0E zF#zTRa!-KU7mzjfv|K0$xa zPe9LeqD10sbAyAsrVl>sH@EZ;@knAH)dl1TL;iMKy(0mfm|=3#sq;Lpe_KW zX{rZ=6C581?(vwP6W@>Tr|;)^f@8*IgMYqu&OlDCWu(47``WX^KlcwzpAGz@E+I34 z9sU;)|EvLc8h|qaWG(=%&2#{;pBxJ$G{CzM3p8!n8^a!ecpu{b6!5Qm0Ero5hZvF` zAg>3QwKfF*9TNX|T~~AN=cGvmgNXayx8yg84oJ%ZniEW^4ZfSP0PzpZEB0|-f#AQI z_#aqki2s*f46pyCuJN<|*vEfmf1C|g(^YbSi~)Gg;3%F?LJfdEV0#X^jRmL$R1aue zAbg;)K}dX{e4yOG>ttYGeLv3?9W}O#`AG)-f3~mJ|9RyP>VLsM{Xg-~9ssEU;+#On z0Ne}g@Gp5l&IWZHAUyCM#R7h9P-cnkL=FJ>zvpn#pp#!NDdir(3kCnISy=yH+_erf zjn)4X|KESBv}DYf$e6w!{?l?mJH`TS?GKPTzv3U*7yJYJ#DC3ui2we;e|2?N$pJ_m z5E?-8009S}rp|gGVu1;+FGzX7=YmO27bNikaIX6W^h(_GdnUr~Phi~+znA9*o-g>H zkD1_tf7Sqqe;V_E#J|S@fd)v41rj@vsQzbcv(xSU9X+C8GW~zATk;#B0T>5}WsU_{8%)swUXM_a6GWZ8y<-7l z-p2h2?O%;P-kO0CbNemy|91a>YX6V#zuM!m@BjPuy%IS<^bkS=XdaN~jVcE)7N8aw zE9aHlya4%t`9U?t2x3kjOhlYOqedVvh`GmtdtiS&YxlrD&lnyt3i$s?c>S+EUa$W< zeE&aO^*?(QwFZc@f)`>Qp!5NI8elok3QXaEP#w@L7D(W~U1EXeIYHC_<7WH*_~bJ$ zm&qPrVuZfZp8?Vl^}qOknfs4(KV1B;_~)6QBZueDBG!A}oZkozU>uMo2e2-XzCR$~ zfOhT=5d1scKZt%G*cbexUjLrqzt5G}Q|S7L$pPpEP#wTnfIR^`kC=4+4mV*4B+XK)c;(rhS4};Tq#>rOf{U`p14T&rW@PD(ze^wm8d_ZOnNLLqVYk$BX z>>DEHRrd$@M<0JR@sF7v@0S19+~6;M@gr#eBJ>e;h6ccXBJL${I)EHt&mlxk0CfT3 z0^tMp3ELb2^90Hb!VlmD_7BsPALI(G6YqRX%#X&`xzBhcety`9F8Erh`Q@AcC2m@u zoA0yR^RfE>R}lXT{%0lQpJxIE_-72D8i3eWOVI&-EFfoyIs7L$pcSz|798O38A3jw zaT{lX?u##Y?8UBve`17Kq0dzOcSQd$`G3K`o&6!Re**k>Ekgg?vOc#In4UM~H}nGj z#agWcQeuIyoM1b}0>r$U`hJ{Sh_gx~<~G6qyOaO(Ylt&v{)4&w_Di4vFf#x;fO`p; z4`59|<_b7HFckGc<%8ion;iQExMx5NXPS(FasNLg-_9#IA+a4gC35FPeIe;a=Kh5R=F&kX*?{t8~1DSGy zVX;7K`vWrd2-#Smf%r!s&@$p*&H*C+IVaD}0O9=13jzN!`^Vv*vwz@AR}=qt-00yy zMF%A10=)hJ=@F&|5FL=h0bV{J&;hzvfLHbihxG|(I$r=i`2qG-`vdz`g8xE?|92<; zC!7=qPdstZeEQRQGFM~(dWU8I06BnriJ%3@1C|SHY#=j6pbe-G0z=(kD9{TuZEoFO)KW>n^f1o+2!0L1@7 z;-7UuasV{IGM*1cQx1RzNX-ZMIv{g@K%zc)Hn9M80OA3`|K_^rs)zqQKd$%}tXzor z$9zNTf8u{oWn{hL9~!{=f2RW^7jO<@fwtxZYoPz>^HukY|0n*jkFTl{_`fMT{ZIeM zS=?O5>5Tcqmi=g=pJvMF0EvcRfIJJ^V`_ki-8{o(+=90Zs?_b%B<1g6$g%;LIV5|2?sF4`T+{ zg^d5Y$GR4Az9DD-8Ph#h-LGI%Z~FhwrC)frq|7{W#T>`|Kk5KD}=L1v=VX*+}1=1(nEEZs&VCLFj zHnBh`2e|VEYJhq5`-=a8{T%*p%)@^DO#0vAhC)X;!bQ zG;5sQwWi9{*RMCf|NXB8CYi9HIMSTkAOHA!^X+ec)x7l5)AC$i!aVX+d->%jF{h*z z_I3BYyu!Zzji=3bzx!45_S?UA&#(E6UVUDA)z|RWTfZ`ooZeuzZmTkzw^o|1+bhks z9SPgHdoW^&J%)45?7!xml8XN+9{!~VkoZRqZ~<$84*#|mXz`!K0nh{4Zd8T%GFNF`T&2iv;QNFIYNdEk}{mA~!mY!NA#ZQ&-1FU^OaW-|6^V`@y|H~+5SXKnmFF#f(U)7KRCJp9k;bASEymrV7b%TPDOjPh}X*fWedz>}ibKjds` z6n#c9>?Q1qIY1@mH^2Rv{F>CibApMwfZ!i{fp@;}qewJN|I>&1`Tq+8|B>i`UirIw-z54!8UJmL1^j$KNPj>U zb%9L%0g8W#`-y$n03ZKf3)lY%47_4`_lyYs`(g%2zdo1&hM%W~7yxb=2;*Ep=J9*= z!2F-DgwOx+@pZmGR=mFW(&vyfycD%V%>EdIJxb&9rGJq9MBGEfd4QY^JdX2!Cbm5P zhyFjnKld#LJwU)ea)8VMum&h5IRK0Qw&(!AE|ArD!~%&qLYfcAzyUmW zko`f)JwoqnCH{9@Jow*nEOMPOk!WSl{JjDGKb_A!V1R$g2V|-VxY}S+e}J1G)c1B5 z1NglG+%o{|xAlAh;-8oo{1f{$Vjn)dHTdtj)CAqJ3GK<5a#^M*wW=$WIwoqx zp=RNo{nfcl@n2I}w72s164U3FqIde-T4egF-G-i4+U><+{d*Lf!0sqEm9(DL2H-lN zm$iYti;Wm!>?*ascnqti^|MyfzZmg6tkT+`0mWv}fD%}-89XpyL#lATjaUix{qk{< z*kD`-4=h420Dj*9TnChz9=BYI{@ieHm(hrI<}rjQu|)X3oMA&8F)%tQHwxQgtrfp2vnoZ?KZSCFVMr?Dr zxr?^N+PbafMs5AJa-+6kd$|d0N4eR!qx_wF4s_$$Ca&HzZo|Ao^3r}e)8 z|NV>hSo{~i)903A;NRJ8z&%azk83mhI}QlNKX@R4{}N!|S-%ofL+fvC5UztNtqlhL z#RdZFv?^;uaUEK%AATD`0pJD2gDHn$H4)x z{s|ihZt8i#;r~g@|LlVP;$ry!IQ)N+aKN|;jt9U6<0ckE6U3njvcdl|$R%8kc|>Kv ze~H6?shPi+_%8$g%h3N<1`dF&EW!Knti2NN|Aj|Dpj}!2ym3$N`oQ zR1a9})Bg+p;s5V||9`m!|Nr{yuR!+~A-5Mr{2w#@dPRi;r~@j+s0rfG|3#7``07`} z=l^#U-_Pf%{`$q2p1@fpIHzc2F>(NL;eb(N;>ZIQ0rSrAcofbr9fSQuKl-oC^Z)7p zN6`NR|I_LJ=feLlNZ^05hyP{3|8fuiwcr84zvF-v-~lmkz)G6xfJ__!J)k_`bHLgp z9YFk32jHss=T-5~EAYQ#e|O9R1^(0I|1T8(ul@gu|C)Y9J1cK5h5j#r|0fSv>w8-X z@DBqw^i%6m0uA8ojuONGu$~DU(5nP-0IYWj@b9co33PxnPXkm3I-nFDzYO~S8G&Z1{?{7To4@=iV*WD3_Jz3O^+Bhw z9#{!p5<`4aNyEpt-`2%^=R0ky{}FTN+VnNG#6=qWeDC`&ngLavv3H;Z_%8weOHcD&|J}^5f0McX_v&lUK>x%4&m#We|67B9_5Zl8pgH^t_Jso~%qnoe zs&%-ox3(JB)f=2`tT1cTHdUClw7U~_7d3#>0ip$*4j>PN=zw>&Tl^>Lf7m0Fss2wN ziyC0ZnE&O)|GNK=`2Vdbh#~&pQF&Ve|9ye~z<~dLG>3ocgl716954Vp5a1si&G4mDXdJt3>rC^pkLH=reCks4 z`Me+3PUgl>cQQ9QyZOe;%>VgBo>{h}zXz?BdTbJY*88Dz{!o2;=0B8p?rYZeH@Be| zxqs#5rr&@|O(kr=Kv;D2U0=8~2I|E2K%Wzhd+ z(EsJo|K-sC<Hp!^4Log}VP=@jrM# z@z(ypfA5=18pQuY0|fX77YP1+4p9G(tN4E(|BeF&dibw`k5&Kg=K!+x|AKk?e%N5S zCh$K<{XcSsg8vNu->zSagTMUcPv-O^b!O#?p=R0AfoA!#DpM;~E!UN`gUo%WHkr5D z(Et0VKmEac@4GLWZ+zof^Np`RgX=Tqo3w8>w^#5vu~%@-WUsof^9p z0GAK&@h{l7JkYSCPVg`NzqfbajMhLDB-S2QRV^y73_`+W)D8UB6zI(z;a&F3E9Yo<*4F!ubhukZ@w z6EDX(LYJeT@Cx)5USVpgtqsDyJ+VPo;M`K!U~5Bg9Wun)(4kjgZ?Lst!>+*G06ca! zY*=T^42hY!b3bC9e!9-#-#(A<=cu1;=lwt6qG2BXXU-`xcg`*mh{qJG`n+t>vPz~Vuf9QaQ?ZE%$-Q}AY|117= z{+G`GxDe+5@HKI^5%>QZ;2$yd`hK^S0sp1&|BM4*w_59qYhQ2!tsim(V!(bs!9O?v z*ry2x0Q;35{s(yYCl4t8t33QO4yfr@X03l2H~>~@Z7{Bbfoa;1foh3-0CfR5!p8r| zCsvk2|6iUq{#OLpEBF5*KBuLL)A{w5c_M+QT|1}a9HIB2h8QtJhm@KT!^_R6k>zIe zs0z&dsxaedV=K(~an>f_I$=C)LWP+~n`mtku9GGuZ1Us^oJo?fNq9UFU!O3c40A!y zr(AuBIdpJ_ysT{bD&1@LKOg4z^&STPANU_W>I(RO=>M6}|8wB~Q}GYqZ({&p-^ahF z1D4bOtF7&ZSO9jHwUxN8TxV_7`fkVtz&3P)4uEa6wg%TVo2;$9yBj#b+Fj88Vov`{ z902?a2RQsQ1|a^o5&wHC)=~cx|2qH6&i^j%+R^iWod20L|L@+yYXtvQ#cPQF-Zy#p z2L}lD9sc_f|BeItg9oht_k2G&K(Ws&u%Co~=lg{Nfd7C4n&kl!_$Lo2{*?m;g9kJp zz$^0vtQ}Ufme?x%>qmziNhkzX5z+}cRw)kYzwHo6q} zhat~4ery>yz}fgRaDX%5d7|3HGMq~Uo0Mv$_*^Nt0^bXpFtHrhZs34U=DFvN$cxeE zbat;S^H1yFU@Ri|*Z4ocf4Nz>qyqlG0{j0efd2~Q0Equ?V#`-`LoLAB>Taf%w#M2D zTm}D*0|ft>IKc5h5(j__(sMv};NRN%ZQX%=v4(AXq5t=ETm7%V|A7aS=l{w4-;S*R z<@}H2`QJN%{~w$D_|Te?<^67T{{Lp@|A~K(1Nwmnlmi6+jsq&81H_yLXr}+221wHX z-~!eE$$3EN0MGv?;a_l14FI3-8S!63{KJU<+i%L&|7Tv`*?iU426JZrGwKLka29zP zIH1G~2lht}x7Z)+u&=mRyerlx0rP@&hxf_A{N%~jrr=8B$5W6SkC!B#D6gV|3aAm9diB;=l>J`!v~ix z?00Lq>2*_CWAB^Gp#Kxr7rY>LTN&{0>~>sX{b@a{RpMHChqVDc%a8|v^(sRSz!~ao zRkS|Vs&TFEYpt37cO2mB|5X349ANPeK5_p4_M5NBQvaVl7&Pbh-~asv&Lg}Udk5pd ze~B43gucJjj2Z#I58pp-417I&{sj1Z+C=z!Vn2cVa-2Pwuql(vfqB>zYg2KZIyGVX zdCLP<2aFwC434&M zN!WVgUpSz9x<+30n{aGN`e1UGjbSW^O0rH{bj&^Iq+W& z>_e-MhfSbnFNe?;qD117^J;b$kp#)DHvk1odfpWhY0>T?T6 z@7aI08UCj`{ND-u&nq``iT}kG|BIG&ga5a-bVYaQe`l+@BL;A`8dq5DnuM)b+Z}NL z?5^(60I+q|R^hq|xTg{OYKnheeGUllPaaSXa6GUcT(ExYRkX$}yRJ5y_ja4b`Jama zd^IAn^a> z0o4G?0nYbV0`oNW|I`4Y104Q^1Dpn^^6+1+IY3^UvpppnK!yomZP}dn+a>{+a(v#(&-w%>Q?!^MBoQz0CUmye>G` zynwHXXB*cYjb8oT-*+t@JGyvu-7@!>b-?QH3 zhyh@Iob@e74B)I^IWz#Qf5HaA_lr6IuR1_E!21640RL}T{10;YA5Q=8@IP*}=lhee zk9@xPeq52uXMTT*XH%zC7_q6q6^wXK;sEeMfPeUZ)&fS4F2eag?*aZtI{eQpGcz6j z=K=rX|Ce-=9N-e>0GAW{-Nlx9I-r>b@O6M{fNXU@1`ZG%;B$b+0n7z%>E3krJy&7= zf5oUXFLy1bZ`AX@iJ4=^^12X19RUA%>`A0H@%?`-p8F=ehU3Q_{vYa6vg=gzsxQ6O zrDXj0(m{O$|K-3xcmT$a`#=-Ws15qwYK?hbcp(o*CB%FJ-&|3{(rHyX9Sv7=GzL(Px1zKN*yO+uZI zHhEGv^a(hdj4Ny^ZHl#NQ@a80&ZhBdd0^T!a)Gre;E2hH6&OoQ0Jl*8zc={r4F8Yk zh#cU|+2zpx70~|`z<)RRf8rn7AJ|v?3-$y2UuBlBgn1gEmiTuZumbTw5C?z*Bo6T6 zfn*(U6=DI{#;cGEaJK0x2%z)lUpo9V{ulh$!~f&8?RzNJ{mVb^QaXKlX>Y;(O=aT$0}gQb z@8huF7r3Vh{(<{`ihtm~e=7bR_Q?SQX{rMTascFj5d0JSuo}_- z+2No0agAY-F-VH_a%cN_rx zTRi~1;PB5lV#4_B@z2+k-D^+Z_oP41`rojT3H;9>{^tV!3o4-hE&dk+|BF5RFI{n! zSw;iy#a0pju+`RTaTQy074`)`S@Rx9S1aR+JyB zbby%S0P+9S08R(2gBE}WXi^=p`)I|@r-^^~M&h4XA!d^B4@^01>HeSd$NA%#sQ*vG ze=YTYX_xKC^9oKp9*OS8YdiAUShpu$>|DNJNztcz-&po`pPMSc0ToTW_PN>FEfvuJ z&Tg$R{b;vY>yK;y+pSgNTG_+d9TjE(t*5hIxWWd~dRwc)wW^P^z7>cAVEwGs;7VUk zvvB}90KUJnn_P)|Y65=Fejnlp@I`h1Zoq%%jQU^K^lyLrOH;Rdk(o8^Ml)^l|1mSB z{*#$Wn`UkH%ukyg+oqYH{p^PV2K_l7GfDWzeqs9m!NmVy?4Kk4;s3{stT1D>?=OV| zG!_W(?{h%F1B?fl3rNHUd_08)t-wA(_79GS|F`&0pa0j_@bjPlz|_@EGfS3y+ALo3 zPiE<|Pnu=RKV=P%SFXI-oH)4zv(Mkm@Y>z^AFn=(^GSgJ>D{FUIAc}?@ZSx4fV!Fa zi@GBQ=#Cm-cjN%AEvdZ<8~}s=7agD)fLG-JUk3pHNgUwef2HUDSE>JZ8lV{mDE@I( z4p;{c5d3exs);oKaKPI;kCc7t_!FJWi49`p|7Y(#z~j2EYhk3=>Sj|VK@h#O%4yF@ zEQw+f3wrOJ=$!-z5E!tEs#ddPs#~(;m~o5ZU$HGGbP_#3`;Y86i5>s(i(|zva_qz{ zcH%|=_pPH^_a0NCf4NYCt6aE4VHR{O20LhFb8k z9_xO||K>Gbd&?THqZMc~*w?-W{Q#f?941f?C|DOL$nj|CvfSsIVXh%=Yop&_{*TUo zeeJyG(ZPc^$o)fjkD^5$xsdoz51{$~)Jq9(G4qz!f&U4@|Hts&@V-``{>;iXx88TvMtJ{kBKKnr&~lk@D}Vnv;eqmf0sp`8 z57<9o74{&*UIb1LkRG79AzTC6p#kky17d1{)dTGjs1}g(0_X$tzHpzpAKY)n8iR(0 z*! zKoR&)NF5MG1Kb+G@PCc10kCEr94s#|s6ebJG^j+ZEHbEqr&oyo=hx~1zyt~c9=R0PB$T0tSgydFLOGs)?=8!*|9ABL|MdC(5BOh% zeZX2kH@g?j!fNVtqj~_+MYY z82^o5|NQ4aj{A{f?{BP2XvW&47W^)`-j4YLUQ1v=KY=xi(1m~g#^U?`{Vn`|E&V_8 zzsvs-=KpB^-{rsb0l|6Zf9nCJ;R6KFfDoblN1TBM2&@nA`A;vPKEQf`s6HUJ2F%?7 z{v-eY??+Fs$|5Jo4RVBBA!o=Pm;aVq=Vkp5F$(AZDVzWC9#Fsddw}via-Gw2f4L$F z^Lu|&cyk2*p#uf@9#Ob0K+*O!=mP*d)_BFl&HyF1tU(@p}tEZuFf2izyXd&1>E zbwK%FVYx3F;PAf+^?$X`f1?YP_*(h~tRIRKy&X4Q=6(LJqR;;+U;pW!zU&pEPq~-- z7+`%;3D+iJEm9eJh(7;C2lz9~u>a>LZT>eLikANi!T(aML977(tHA%7s_UQut5FB6 z##(^Y=mo67d?0cz(Aoq*2Z*KUL5HIWJXW-!pUCS8na9azUULx3|7*Vf!WTXX{?qHD zUclM}!+&@P_z3AE&`*H(t>AxKdm{G#{Ia}V^-jTi590RM&iC)XhY zx2;1j5V+mqj&-O5Ebc_kC+=D|cgKCnsQ;7x<|BW;Vl6qL{MUPbpHlvVOU(bue{$`- zO8(}>`1}Xof9;gzKd)buJwR;!=l-U=&f#<4zVuq;^B2kgJvXhM)%-91e?cD*I-vZI zq5&n)0@Z+0=z#FwYCsuuK==<0C?^~Zko@mxfaZVln;`cC*xKLr|0)i zmr>(my)*YT!dgYq0IW$=4WJGf@Mp+>b3YN~P{09m&pqbR zL!IitYS95|fdE?2qOh7E+F(6`dWAOl1Q+ZnlK0J6U(gILH=@^ATXXLGPyUxzu;ypK z5d4R4XoZfn!$(j93>^M{V+s7P59j}21pmh;tp+InT@A4OHyW@G{vSB94jN!_lo|jW zGnhe~Ic{(m@$dfN?z&_W7hyw*U1BeC~9cX1Q0eaAkYnEEt)_C7o0{`nG z_%Hc?Kl1;W$^Sn8;R7b7kpId5C>o$Ofb;^@15gJdHNf(pI-vYNY`HHQpt;}8|JDPz z8gRn$AAVr=F7O{cz~{L3=h2TD{>$DUdhOrogs^*mk^AJ>g~0zaXUrM^&HuUw0Ivb! zHNdan8X&CCd9v{4wcef^!T+10@Sk)LNrVS5DBqh14`5JHkO&R1C`|M!6-9|&6@lCyAkc&`|6jBg^M9Aeod5IvKlzWf zOS`bI(O#@oE&vKq2NahSfi=qN1Da6_G}BK&3m6-lu%5UD{(mX_ zZ@66ie{bI!uiyIr(F1D@{|_d42Pc5ZB=i8m`>AyX(}=*Kki`rlFh$S?tW|&xs1{U13u-D? z8$c6ktS(R+YM~3%28HTFJ$yp|=6mP~f%>AcKFQmK`;i5^#1vuP5*BWYX;qa`h4vF)iqoJ{wI08eTm?I zBI^IOp5cFzHwONXlmFm8A^cbFyZna^2=^`jrw=Ei4+tDF2qA`!S{zG8AJF1BB5?Rb zfFrjiqZR;8CZi6pxGfoV008b2%Kzhc%JJ;o52Sjx-@Eos?)^jl>)t=)3OPgWkVBSB z7Zm?B|8xB!uVe790mAwQUIX+4FJVP(<#pr2|C`pFjg|i;_d6bd+!sXfzXUoUfCiKj z%>O_cJb;f#51{;aHNfG2rIY`qAHco59R0|l13g`qqKt)j! z{Qng({XYk?a`>qyPkR63H-6pwz2Cmb``zDq3nK74Z}EQL;)Zuz*EYJ-T;Y;uYeasYi~KW1jw%CBM!G9_aOU?D$o0&z_5c zw|aZ`zSS!zATAOV6(|XkpKIU|A$QeAK9OT{(q4F$Ho5} z{)cIR`hUi#{-62Z^a7<1D7^si-_d}>@B*p`lhPI&Ko-(l|yUwGjh*FM?#KkQlF(C{{R|8-tp z|5|Tga4r0Qk~gw{9qRveSOc&Q{@>u>p=9&`fGLB?>122SgF~TY^a6mHWYhr`@c&az z4KS_#pYd4ALJweT09ONq|5gKzp%xI_mV#O!1#ok zg`6RGghM8mp6~om(EdN-uaf^<0~87w{`+eH@g5)j=q0N^glhn>PxCwW+_dH=lJ_I{ zUjQErja6Q1H8esE(IXF*<27vb!F+2c!0x|i&^>Xje&wNNm z`eOW#oX?KM8N;dYUfN%%k+|zfduW_++r1}4UefER6R}lE$5B?9V z^#+HMaQ$DBHwykA0RP7v{tNdV4VZ)u`22?sEYJYu{{jt2K`#Ih4S)_DH#mGE1$_X6 zBe$lY2VijYWC}ch!7)T~-{t=aa3A>bLr+}y4zB%w7Mys@@}FE0{*yb-+COkg`~T2&HK##7B2rwSOXBZBuOn0wFa;rKzx9s0lo(i{wKlz2dF}hmzuz@1++$> zA6O^({{zq7B{W)$|NH?y&h_xI5x(AMsobQui2a<4{k>QJSTt|Gl-EiAF7_Ig-?5%c zAAjzT??lhw3UEIey+81On7JSPKLGxZJN%!7_mAX$4E|5S2Q2Uajs}GH0_g)B4S*Ib z&;W=3M=ke71Caj_=TF|13jQa5>)~ft z{O_y*;=K&GuIZU)F29m%0Hof*{f^=B|E6Fo_wpM+21mjLQE&1CrqXlaTu@ zb|M0X`zDq`2TFGtlMlU z{yznC0l>7uA;d!=gDJ$R8G~uW>BAOBkn>%@1I!SP4>;`bpE{r(;7BwLApdVqnY;a6 zY4rbJdHt9gyBc8mPaRPHPbv3p4EUdl8Xy(?w>XyS z9VU(kIC3Hty+GhrgQF)?Q3qJumWteuBXj@Y zjPjpcQvQ=;=RN;Xr^stQ6U+f{4iKD|HGq#iYt{gG-m(?w%{^XpGx&ew+F3vUN8vx$ z2?OH&SS_vV9zIn%>iN!z{={9#OcDV$;kgn;C~YQzXfUn)&&JO8x$fIZZiDH>VJ6uort%r!#V(qU5G&0ZU=jC43zH;P*JcBbpTMf4jup~3P6r)PeA$s>Un(Vp;pxWE4+b$RN?;MP%?6VGQ58ZynhOEe~LFY z4jfGJ#({&AsXiufJaNci5>YUP2ppPr5W+DqHDhr&6}h8h64)!^vKG}HhF#}I+J+wM-s-2d7J&iy~lxj%4%bARNBT=(~U!bQRzlS9w@ zxj!oa3;56Z%X^g|EUGX!F>YUUql1ukKYarxGnW(_dL3KE9d^X zCzj0pfg9wA;eYx?7t-9n8URGO4j6qvGY3fi-pZR|Q|Dgj>H9+}~ z+&`)LUvs~c|0DS?+@}Ws{5~N2f$RZ52ZaAt16&V4FJL{u+=)BWu?{Hp70&%V`^iXmrT zKL7cTc~eur3-04OLwJ5O-$(AJSnj7H_ot#K031jK{|&|trosPPOdtXWCj(3zN<%FG zOr^mCSWKs(4gf+1Q;1VD2GfVr-~kLmN8tS}W>5$CAomsE{}Dp!fONkWIBGOt_T*g| zxHmxRXFvMlC9BB+z3zwH(78YGKDh1&T;jaih0K4`19Ywf!o7g*k$ZtAtSZ^P_UXc{ z;LMHd&XWIO8W7C`MA3k7{s;L#=mA>pJNz$)4*2|s1_<|E{zC^AXn?N+4*#(Rfa?In z3s@bfDNU7ok`?S&`!}lxq8OeQx)c~LW&;XbJlaU%=`A;2C{!csnXCFZLe=HsOpEW=_Gyphma0Kzl z34^1zreiJuIGJ|#j(ak_lXs>*{Q_$LQ@rj6T#$QyMBMYozwYlsmU=G^C)*8xG-me-Ue9wPsD->@+Mvo0vW{D6;}lTil%+YE}fC!+?i*pUn$03i1h z;sKEROPK#{?hniVn)_}3cllpQ?mPUif)6m>KN1+pi|M2=XLqW$9(||x)HlO4SKrrajzhQUc}yRgT9`8&qr^**RSZqF)+~YU?ATc zbTOFk4G}|(dGPn?;5_bOjD3N5Z?XP<@*cfD@O}`Uf6(UrVbuI1;J)O3jM_k0NV#N8bJOVm>K{YV7V_EVEGSEFnjymnYivh`OulK zCoE_FCl|QqKe-`$euFE_{~i|q26Kk1I1$%*O5AdZQUVi1i zwl!sYZ)E;YM*lB)e(#ORr~wRo-ctjV`gBDd0b$H9!iqAO$sm z#hw&+0E@jT@Bl!8K_y~kp+Oa5Rgpn8Vs)_r>jCP4pad}rYD!bQ+OkyKM+nb_b%W*D zZ-CbhOXNNRypE996gsFZ!P;U0_8s6pWY`y&s8*D%@oI>2gIdJe3X94$ULApJeHHb% z&R2lzcN-M7IJRi4!*#d>uFY+7(A1JE>vf4%qS>Ggv8~0T6_IF5#6H0R zI@%Mlk6e$XQ3WI{lBdNl>0vamHUW?2=xGnQUkCKh*k@z4+zr$`T)S@fAImT z0pS0UThr&^0nq=;@a}prsg(EpC$VbZoTe$@c#Scz109OmIg@fcljTS`_KUG0Wg{#fZ@LI zf2kT^`7b(P`CkR@6QTjA^?m+R2O{`igRcef0yT;<99z`FAJmp72dKc;KwYIp6(Uft zs7~=395mLXz)x7zrg%+?x)gW{px&Sbv8BPFwK2t0v^C+FXimX?LKZD4xOV{1sz`;O zNC6PrQsEuK(b9a+|7ocG(*EJ&QGMGYCOwXiaF2EpkINcK*K_reE%plGj%di@dfjR&H{|}$YKpnv2jQL}? zWugX1|K6#muiJ9^4A#Mh_5KnrkKFS+WWE1|#DDfFnE(0OSp$Uc1(e|L1;o9;c+ayB zeRgGH!OiPlD!7R?Kr(uOq65AMh^zsYqyg&x8Ik|p9$*={@9@7IUSNR-h~)zu4e1ln7GRs-RD8+o6C+QFhd1$Bc(2O^++mk7RhIlL$L7w{k4kIH}HKK*_K z_no{ioG0%!{~rMN4}kl`IW)l60r3BzqXE={1sY&=K==>dPbvSw{b}VtBltf8W^cVS3+sQ=U*h#|*b^sFdw*unpM-^b{+Jwkq4fUMmYDnx4Iuw@FCf_q zOnLwb=6>L)d+xD&0hRAgdZK7+n&p2A@;?AQ@PYn7f#T*A^Z+cjrJx1?wg)KQfts7x z3ExkM|EC5x`Ct5hsu#w6)B)oEojO2j09yx04dB!Pz6YQeD1pDH4mhCi7a+&iSV+E? zoX@Ml!g=t%dtVwr&Zl`jiY^=jz1;!&deYDv z1bPGXqrO)RpuZ~9lRa1E^1{^W#Q^N-%&1-kAhOar9;NB&0)TL;AYMz00_ z@C#R9?ccnj66TpX|8-eZU)1&?I^Y-3 z0Oh~r{(%3rrKw&x*#8SqNA4>$_bdOMyw5t{@Es^|(4hZ)x z|J$Jf0&u^BAnz3s+?SjmneT1R7w(h)zykg|8sPIE8qg075U{^TSndxZy4)XB?lTJi z)1d+B!h7Mq<$st4KnvU&An*YZ8UQU24FLBKD*s*XTmBz{1_)FG5QYD)20#lIXaIB| zTmv$F{zC`Q`^)r>-J0=}dml@D=ks5<{3?!pazNMpxV1lhGr42?=oiAep9TCE4N(3& zdjZJ(0Q6cw^Z=ejE%d~nEKAH(Dh^a0WMueqQ6 zx7?p1_Z|LEllKbs0Ei2GfO-J&{o(`WPTY>#|76DBy$^f+bIh~<6@qh0e$ z9)*$X!uTS*1~7A(xE9E+1Hg4oyxu|g17!_>^*HDOq@xB%#a;lZ=m7vX85C?yMGfHK z=2X-H7TZ$M1F+bh>J<|^49I;Sjs}!QYJm9vG}HlU;C_J0f;7|s7KLfJ7Qmti5vV4L zElSc*0|2E4wTQK426dSCSJYRef%8CR8hG!Z3Tp$1Y9ifhLTsurXs$^|&bO#bhv&Db zM+90MEE*AkHloR(y*VA6H|Rj@XffD_xUbcq6S1?+psPI{e&3+GBi$41Lj-z=PK&N| z+{ZivKHyXPz?i`pBKdz#4WJgN53m}*IzTmmHGrG{ef~oSLgc>X|BS5#j0ecX zJOJ{)1?C0d{j;&|H|_B=-#7FA9Q(50AGq*FnD>v6C7=J+$H;!b_u{%Hb1jg$C#bFi zApaX{lG+Py6#mccxgmo8&;jMY&wKFS=RNrk-V?(AUql0TFXVrP!~M!=+;{k2104|l zTOAPo$IyT}M*~C$!21S5xUU*O?n4L2eFZe2g|Pf@MQkPi9SsofI~vdq9T2DnSpIid z?yCmuv-}qwa5SJxHGokxAVV~ux0Bot&mK@_Cr)2= z?H~Q^W!Hp`UAF}}|GRr{OhXNjiXMQ~0P6z^mY@MH_e0FDnR+m(iT008$1 z=6{9n0~XT&&Hb^s5B}G|1Nd0X2Ura-`QK=O$^Xy*aGnqk0M0jS{%2JFTMcM~7Z5-L z+6m=9qU3+a1Na&M?)&@)_dAvU;QT`V2R@(|UO@7{^#ZO2^g{4rS{HG2m{~2e%dx7Tu zqnYzZPr&;h&-l*0&#vD5EbjNmF)w2u9AG^h&HFpG|AokZ+5z7Ku%Dsp0K%>Xz`Dn$ zK6H)jfBc0XUVc^K_LM&@+?s)FfzmJ!kcJw-0&@dk^{`*X~n=9=GFYyLwC7t%F95!T=T((vEre|H{`^^WcdP9Ma1KzN>IH6`l~ z7T%PB{GWy%Ky2;{|1I}L104Prf%}ANfapLJ4RCXRIeEW39l0NzmmWYA?mHSF{C70~ zS`bqMTpa-K>j?0k{1+(qZ4~a4|3H)U0W!ktfLidMsLMbdU{Q|Yk}SS0-t*N((C@>tCwFjdJy*nxFPMw zfVcOCG+YZ{G(hsclmBDoe&xRKAGx30kMse)2Y?T7H9-8ol? z_ZBtq06rG;0agQi{?h}f23X$vxu5)Z@_*0=1mB?n%Kuh!Utu*s`0wa|^1t2Te+T(* zxxaw_@Bs_>4;|=%1_)UHD{LRY`2TSJ_gU_X23YPd&;W3MFj507|EUA62Dtp+5B~eS zck{pX0j3X-1^ye1Ba-`J{D%$*|E&fH|E&hN{HG3(_X?N)A#z_~HDCr2{GUI3EDL>r ztpB|Kz3YC5^M2gxSNi_;KEEN%iA&!<`d35r9%TOkpIi*0jv)YFW_rHhVlQgG$7Ldga5UJtpn;1jsMR;1j-HSD>C2# zEGjdg13;BQV|51nKTyN`Z=tzAGXKK|`22?sv_S&|;D0-z`JXX@|6v-S{@>OB%72Lw z9zZpKbwJPywA^R@2PF49`M=-gKXU(o=6}Xls{xw(V`zZi14RD!dw|jlh^_$#7xMwu z1B7WnME-aAFWe{pk7UiBxGl#!b|Ul4hrWotelW(vy?>N7e>V4%H@=g;a1X*gfSm^n z_5@3~f_*@@2EaP_(Za3Z{|)Kr0R-IN3+@vI;Jrfm%oTucL$|32@@{{`I7fCtDx zEkF-|Xi-@}9RLb5Fc%0E8B`-y7aP=+WS|FNP+OV-4FJe_1-M`D!t%cXQTT5)pb9JbAPao}gRwE>eS&%4&HeQMZVf;W5X}cfs{^8WfN1_-d;q-v?YZ8`yE8`V{k8AU zF(35((@ozW+yLj@H9v1S{%aqQeuq6z)&R2a3GRFN$RAyO%_pFd6EY8w_T7RTGf)Gh zqXsY<;O2hv-_8Gp;5_kKH6Sea3-?V8VEn(~zVKf8A4>zE1u->1b3Zjexv#k&QFu@8 z15E@xfTEfF7Yzt{0L_saVEIoSQ2w`p^X&@DeP09cwQ4{o_%8tey9jdMLb&hnpE{uY z?*Zp~y0Xv%fDUvc0(}npd$QmKfZi-`fao(A?9W0Ez+xZ^Jpf?PU>I?D$Urzx-dpaI z|GoxT9SG9^XhC!h$cFbfIEZ*~!eC-D8#REzuP&R4-U?v;A z0N}7e=twsD0D}1=$8)?R$Fjcj!24Ej;$DBxVvKXI503e0eg8Ki|NTCItpRi%fNOzR z1AG+sJL5VC_j&-#+kK!29$*h^fEz6Tp#!P`!hJ^rT>p>y0sX(A24EfF*8;2oY%QQZ zfYJ8?>i?w%VE$j2`@{Ipyzih!J%Gc1>cFBtAeR4k^S{*qpZ`_^THpl)js}Paus*=` z0KNu*@9nAq$o(Cf{~4A4jH&@v2fCpHz6L-CB>zWffZ;zizXaG1bH9%Vy@_&GC9CvpZ^z6%m1{m~qBIgtE0DTJ0|Dplm{O`BFs{c~x6=z!G#YJslk zY5ce^mb(%9q2{``g;Nl^k$<50QxNYvyuND4B!|TA_fhH z5r>BiMuxLd2N;ZwWTOuNjAkSMTkOyF4iEwa@S|Kz7G!TmjP&s&Ubv)*^*+c@S~ z|C0OuwZ7rCe@rf2pbz*S0PmT5nu!OX|IvE`@czKm$Ge`qWX-&n@V4sml;NVAvalAw z@Sptv0rEfB2)Mc5=fBPWMacbxdVpfh|BTB2C>lU5Pz@08@A`kq{{i?foTVEJz~U=TW>{2zi22=5*4Qv;Oy8kPTy3p4=S-@k|k zEXe)72Y?Ptfcr!=4X`?JP7MJ6Lo?a4Cr;+!9-kQ_pZ!k4+jzeVS?`B2u6z7*?1#(Ep{MUlOBVgA1&3mRb1Sd|6-8#GmC zf&T{0HCgBZTGS!}Erj|2C;$5zfZR|1hiQQ2zT|(0|I`7W|ImRh)&RB+5dZJg0OY^a z051Qf56B)MbHCFEbUXn4fa?RoG(dAdqU8Mu{=3{C(fqGbJpkjY)d1H2(gQI3pM(bZ z`QQ2g;XXZp^#N1x0_p)6=>eu@a^{X4L+(G8{k2CKWl(KaGvPz%>hgt!0|wz!64#bzrhgV(168Y z4s^f*_x>Frh7CqXa*+QG_KzY0`}YSpfMdY{L|}{z10?s` z{9g_o(A-bnD@^~-^Z~;>fM`IV12HuKysx!z`7gXz{v!(a7tsLq0K$Jq1N__%4-nM< z;61#6%YWg%)qoCYfFP3pt_E2CQwO@hdjUA#?ZDLlpa0N+KC1!3ef9u|9&n!!4G6d| z8eqBaYk=|}(dR#OK=^MpU=%u_{AZ*F2qJh-?nm-}%;Ep|!CdqJEGBZ{1As{bR|Ay) zhg|OCn7kM6Pv_1ZK9YxP|8l?n@cXaKeD+h9U8A|5V>@il?+v)#?;IK>{1*=Z{)c&h zkli2rQL`TCz1SD!e(M2nEzMZ*)*N_%%vsI}2&@M9{+}K|^S|Z4=s-jb;A?<*fGn#6 zSzg&K7Q3>%a$>hZ#hxtWev7@x`Gn+t6E*isMDDLr4-m@-L~4M;{RO!nbwDHG)&V$< zr2*mt!fF6`0OWo`GyuGBi^%`32JC|l2&@l~{7(78b{%T_zbm>4bpSj7`vLR=L?N-&pa`+(<^aXpvd{+r zwp;ATf(HP01}FvZ6`}#)ep#djKnqj@g#T6ps-Oc^h1ou;i?ZSW4Qh%J0Y*UyB2Y_| z8q}3#qZTlzFV98|090hd0|1oA*q4Jk0O+*n%0Uefpszazy#NE>1HcCu4KUHwfW`d3 z&wpD3#Ht0BtN}jngZyv!AK?R_1-=*1S^&9Uy#V6e;iLJ;{W)KL=p)x8`*puw=ZCTF zUgt~yYklw=x$hTg34H#C)B~J}mU~&;W&>`{@BJ|I2LtFGubtl>dwiG(dDfdjR1Ypxh7RJ@~J@ z_oMPZng&1%d=0Strw;i1SKeFhOZ`v&iw5LC2Xasc01Xz6h(LQ&fR5%I^Z|gD9B2U0 zYS4)&XanaJ?clru{O?g%4d{gi2%_;{{lCOq@IM@beYx-fK!2_`L<|@V59XolfJyRxGSA=;qQ#-9 zJoE#A={)oTc$|yAAL{-)Gn!cU>wLe-{lWg8lKah=m-RmEhrLO1ziNT60n|U%0lY^D z&&v~-6S)KZQQR9?)&%mpfcu}lWcBC%BVkqPj?DkZuLErU7atIz0fp27a9-i(|0QaG z_S0OJMJ12DSzKb8jgxnDH^`G0{ASb_#f{H!fEVJqk@ZlYNxb9}SRcWA zB5k;8UWZDpy=jo)B(UYi|yH{0W5Z8 zqXw|pnGFwMaZ5IO02aHl(F3s9o$XZ+do1>5BmY|zAQDauzn%>1K4|ob6telA0(&)xGosy=`!rK zIZ=FbF6IKVW<>|2{&%!kLj#JT0Rr&9L=nk<@V?Zd47^u}27vqJ5gOq0A39J4 z{tK)IR2PEtMFu|a$$#)(@e64{6z(@e1AOi~8qfkASipbkKtnF_zeQs%@;}gI(9xWW z{BN)iQP7f$9stm4(1qC5X3>sFbmXE35TIvYF8TmKXD&Pd&}GnvDCh>~7399c)&ai% z@5_V#w-`VqaF0-8m>4n`LG&@42Mqv54EB%aK?4j9?9W3D0367}9H7Nm9%=w!JRAoP z=D`P8OyofWEc_ZEA2mQe_-}xE0J(ny_WI5`^hJ!(FyD`T{dIp2$^B-GznOEtN}FgN zwa;A-p!W*YH9?#+;hIT$DfUy&ymI-K=;41dOaq+UUkJ_ssTR#sRPh}Qo`nc zKljrEs0LW>lmF$&|HJ|xU_F4V1J#ZP@HIelzmxxKZSGeO!07t`c!32zAesg!?`{4U z?vwvOD?ETeJ%HN-pbm%!a5Ml~;A;SQzmKro_ccKIkJt_V`%n!~{zuUOYC#{kF97dF z2NI6vY*`Om2QXIzQ~_`C=IeclWI^YJw>3GNf%zk%UC zeE-LJKhM(`qw4!PcB8HJk=$=<{x@mv_ccKIAF_Rbkkbo1Eo%aBPegbqt_gVL*~_l^ z%r_ENjvZRJxoB(lzZTt;10Rq*SAbZE`9V_yAl{q<{sY?#iV=&q2PoN*1O6M7?#zJ( z7?dHF-C|I_D+e_Iusa9--(n9UvDcuoAP4^6pbAmI{I7rys3FwVy2>4*pC2cYHvH!++|4@ZZ${aK6*wKl8uK{~l<70Nn2-)C0IaK>1G( zV7cEf+|LU%Kzo2v2Urh4FF^h~8sO)BdVq-BuNvU;f4_PFMArk1Mfd<;12pe5YVOwv z{^NUd)1mcVD3t%rcRjFr6YGACQI1vm{s(ZcTaID+S>}E_w%@EhKjnN_B>z@TEL*CHW&FHsLMtE2f%y90{`EbCpADvQy%Jn zgMH0;@c$Mqh(KqnMH?c}MYJ1qcjTc4FzDHr2mf!-i`d&~(1+O9WzgT9hum+`gGls} z{}#yq1M~pkyg@!{0gHirXaF#1Ffx=6|8FoloDctRF_Q1?Cq@kp?9WI3w>W?Zj5!z| z%SSB$jOTj?iGvo*`3@xaoBTh2=urOr^vwFXqbJfTIoHp*DyjK7RxxJveqQ9hUf;_x zuKj+F`!F)RIlu7vAHun@=O=7kAbY1=H>uYL-T&w%(hI;oe8)<+5_H20n&*pz< zKrx~GM=XI4@Db?&R0F{GG7IK^g=m0!09ON`1)Bfe+|NFMoBQS1a$ht6{I6Y#20#Z~ z4G{h-?-7;vepLQj4GZ(}F9uTTwOjHLk%|9dR=RRb7R1NxNzhy&oi z4`{$3(U)%k-Vc)d;JgpZ{a2#_2cQE2YJkK0F>qd?{HF$p4yXno`Wj&UKk9(lBS$x4 zf8U(LZq5G@dwmbbtUuT9uJd#F54y+sZ!|AV1E80`Mz6$cqu4X$d1M`hJ%Zn+dxdeo z(C=ZtV9eFMw{%-R)&XRnH8p_a|7{K6^WWt@kD31!^!|?j7au_XPq-SO{MY<%qw=3I z&;aCocmaXU|C;;Bd*Qy#{mlOg^#F{qd_XJ>@N>VL|08^W?*ZHzKr{gLKRp1rPcZK* z{QM8@cM+EV-H6@r0Rr^_(KGE_ww4lQ@D?x^rvv`3dg9_{1~$w zyK;Tsn|rQ*sjkM?0D1t`0D31gZ^FI85-!(%AomL5{nNOgYU%c@kCkp;k9oixs{y&F z1#-~?u-KLh4`8u97x^F9VNkj=7d1eDG8~uPVo<&-7yLJ<*qw_Sz@TzZt|!=wNEBEU z=EDC6sK#-%)B=$jkZ1jW9%=xC`m#Luf1uo;fw3YF{C7~92OnTjm4`Y2s5WRuY_2hA zsm+7`H)yTPLk$4b8?+$`8W1hoSp!&T4bah?4-Lo%{{wWk=A#Y(+Va8w0Nw5R;J-mn zM?QK07W)t_dOPz`3jkgD@Bl!!L4Qv^{C|Lf-h9*n2EGS?7x4W*G(h~ntpP@$1M2@J zg7=~U;5_-Sh*k^4(g5-QZVeFR|9Nu%@Zn8d@AD_z&+DmA;96CTMZKc2BV0h!xkfm7W+rn zqZeRs0P(*8Gucd^x^3)?W=V-b6p^dw`I7fDo<`R1H8Ml|2<|EawDx-XDYpeE4%$ ztm3|^n9uvuGSvXh{p7#H{Sq8Y{;I((C_Mo1UupnG>jS|5I!6QO1>F4aYk=l{oB!S1uO5I=JpiNY1Kj-Y@}GSG zQa;Qnx= z1}Og#_k;g}DBM2)-V;&zAE5!L2~6If%6sAA53Nb$^}Nb`vzO<>ejm9nJ~m$SFIB=s z8`T528o)Y=n##EpofCK-^Q-K)Jca9oUVsKrlTpwAN!j)dxHc$v7XE*}=;l1k1Lj!` zK-``O{#)$G1NR;5%tH^r;+8zGoY-Zt8_}X-PaZS?*qaCcZ&82C@P7&uS39soXI9+*8mv)Mzx|2baI z`^=fkujD+RdVcYw$V)oU7q+L*Lhi?N|Ke(}pbiiXg_deR(A5C?F0BQg!{@?&0M_z6 zU50)@(bhc73*^oP8bBQ|8X!6V?w44Ug7<{*AG|NK@c9oNr~v;JmEgZX`OoNZzsli$ zwesI;Ky7ipCny2miBf}l@LyoL-+-vRmk8cBIQ(x^{+~kwg!7jF!utsBQwMzhyEQ=b zdUybf7DS-4H9%L}dei_0-H6@o20e&99Txi#iO%)V0E@2mr~xdx*CYP}Jq81ag5LF* z2e9ZP|1J8#dBXAkz6RJDU<7%e@aupGA0YgXq5pY*|@3VOyc`S0SFV6kNxv!6gX@Khkbba6xjt_8qg8Xc7-Y>`Ad`C;R z<$J(<(bnAApa%fXLjzn7Kn)NdU^SrB;eS~~{#X7p|N9z%<0|l901c=nBKS`YsJ8i^ zK0xb#;{(WldI3b$07mlP(SSyH0L}f8+@}Xv%m>8Mfc8l4yZmojk2+w98eq9E8lc>_ zu^0ST^g#mz4*&ZiH2}OHuowjIT?~Qy1{Ygg#R%# z!1e!;-1ln%tpgYrsR8`_@A!YW{#PH+Ne{4?512~^g{;(ks3fB zpgN!$0PYX^{5Lw_`v7P`EDhKXE!YnY5V#ru-XE|~{^RR;)C9BBQ=7esgB!m+J(E%W z4U8q;ulpH{tp_p2p2k>{`_{zp{2Z$hYkcB)e@T>I@Iy=10M5DcbK&{`?i=uc(SS?G z4kfO~{N4-H0C)k`0<*>F5tb-+@}U6+3;e&-0PAi3M=V>9+#jF;$AXIWUZbKC$3Rn+MfH0004!?O zdo4t5fY!S8=mR*YUymMuMZo>wQAmsP}dmT0Joq+iktP#RB!;fN*C9V~wM|3fjKm)-0Y75Z-t^XOd2VnaE^^*U= z{YVV}?;8lqdvaf({I@Zd2DCy8l>a{O9sajPXaKc9HNeyW8_){?B>y`apu9)yR)GIK zidY%|9q={4a$ht+xo@M-f9e4EKSU`18C3%;|Az-Rq6P>sI=m6JfWdym{UZhkMmItS zfc=ac=1>F7PEBscoZrSDVZV>*k73+=xLi2UMsdQNYD1jvsYh(-@kaMZ{2TWZtqjn zfU=z%SPM`C=BWd|2cQ>#2Oxz1ks6@+-+BO-|5fC^<$pCifIvNf@*kY9u^{&qbtN|c zlmCte__?1RAR_lSg7bvy0h$~S(0mRbAUXivM{>V|+;{m8FW~zC_54z%>51;$~VCO8#GpIKn(y?Zt$8ERX7Hkt1W5}6}1~s2Lx!vaciAHTm1&q z00!+18&CrPjT^vypvgdTKJ&gsC!%nFDH`DLpEZEX{XXV@g1lEm^8r=^#QW3#N96zE z{*CAZ1~5GU@E<;46h1(}yzk_G=)fH6f!Xl`o8}KqZej25tJBk&t!Mr^VfhO$;krHK ze7P4Daz4k9*81A#qvzMPJsg8Exc{mKcl?K!bOypSfISwTf6;+6W`2;LO$hy1sRy9f zr=bI!AE1su_L!Nw!RK`;*9z2>XOAJzf1`5OM%4Km=1X?u&k{cW$$J;jfC`190hQ1J zL8Jy)?u!Ok?nl!A$^Fd#;sI0xHb4Ua@LmAUH#krY@O2 zbimO7(E+Og)B@$dpZi-jiVk$OZbT2jq7BiayL}`206@n^_yCK28=(O}r$JxWM)2RD zA5qY~(Hl_o;F#z&7(^WGvjFdh2ymYW*8szRqXC;-4VZ-vfcGZf!}ou4;!xfs*YjXZ zgynpW8IB#^qtm^HS89EXHGkY;490tXOXBY9^+Vwr03Q(M1?)N@tq06{LF)yaHG|J# zKN0-i#dq9yO-fBkZm48u{wvghid#0$m+o9IS^yoGXYP;8|C0MH|9$RL1Hk_(h5CSK z8i3qiqxqjvxo`Pj4<8_a2WTKP|11BI_sM%7mizPokv>2)!0JF)?uQO&?pN-&Me;v} z4>0*3{8!#HD(?}y3CsT;M4$iEfmj*<&i6YI-dp|;A`15{|A(Lf0!IUe2R0cEVEsS1 z$zTX^Xwy7&V0IMo;DIgk6XRRh5BNU^#`BNg^Z1$!jsae~1!g=%oXZMd_9&h}5 z^!PT<<63|(j8EnCKlJ`o=t}P&;e+|EHq$#Q4Ij+t1K4q-)cZDbfA{}S6CfT{@2m_mu<8)z((-j zLB&S&01TQcH=+*!R2eiQHdkBJAObB!ZGhIgjpzXwv>~?D2WW5Dh&}+&xDh%4G=b|x z^Fj#!eH~y8un9iEpc}Ef-Jqvq6FdO0Zxi?*ps#ZidH@z(h!*|bo1gTU&IhHu4IJWHglI!?zEMpJ@JKpDez1h9==R2ntV9h38Ahhmcezw$i ze%9I>5FOzCMjkZlyYRVQ24L+#^2Ykg+;Q~yUqt`!r!{*wd)0e4%~$S5zhKvfIn)7X zp#z8;;1?o%fU5!Ee6@v}|9$R51M0wkh2(xG|7#yWJOFs#;PAf@+$X{`K>3d-+_(I1 zg$4+e|KNSA!+q+2&wpru@IQ(MbV3V!?n?~-&XfBJa^K-Ubs(w+L~y?!{1<@x0}ACo zBl#a_z&x~I4n2Ugj3a}ay|K~j=g0S7Pw)Q|%>Vzz*umV9JMKx$e+8fAzv46H+C5$` z#(T@~GY@KfGoR0~5yBYZSmBt7=lrFU@R$6P3%o$cYBfGfx!1UQ0e-gh14DQ5-s@a5 zKpjXha|O0Pa4-6VtPRe5ec5v8z(s%k{bkFChSvRdT}93ztn>ME^Zq@f zpaZT3MCSfBaGvlrKs|uf0PzBj4+z%)=6_QI2=^oTzf=v-+^_s+?AbI=pbs#MI^ZlY z%iO zKJgNc1&#@h4PpWBji-#~{9iK3&++FMYCtHwFF+5cI>67{?-9cDac-A7zT+7KhWByw|Gor2@Uz;YEgmpmTLg~)O{gl^ zNDY{U|36zTapPQd;l}xz!j0$wI4ItT8UQFUr~~H}#{VzWfJW$m@&B8U`!^x?162;H zaSSvQH3lt+g4#{c0E@a!UYnwRlh;l(STt@z{_p`$NzRlj~Ah~}1{QjZqy`kPsKgBwruizS= z$HynL8;>K;b1xo#MxXs^0_yl{CD-#aMXUxy~6h3q9?J4(__Z%nqIe%Uc zU&pzB4)UEx4=<_%{9IKBg1R8#V$!EfZe7j(%ZwvbY|2f#d@g?N=M{p01ea!JZ_gt$(eB?~Ra(a7$pA|XJ z>+_iF`C0NaH9cU{*TWcy>ht5gKaZIF+Fr_%bs%JYAM-%yiG+)J?*W}N;Mx!74DRcu zzJT>3YXpup&K+5Aa541Y;urq@idCWGNx41kSq0daV-jompRO)m|5@n5H^Kj(*Fy^$ z%C>loMEMr4p>#8R{w8PyAzok(eSov*0i3Nb*)WS5KmaY6t1H_$S6{wy4!yv6Xuv!? zz&!K6?*Xh25dK>YXn_U@Z2tFizpDY3`{ci9fO-H#R|Dt)H2-(P0|*TF=ivc}IR*NF zvjlv=Eb9NW2Ak)o1AU#~bJrGcu={#%xbN-WNdMa<4)tD-9^mGmp$G5^a{lK~+ds8` zIB(+6q0FKqcO`Gs{vG+w9M3);KLgnd&ert&jQCmcGo!!PUOqolYP{xpe&(9*$@w_% zUmMxZ)8CG&0U@V1z|UR%K(Lk=I)FY9$BXI!^9R-tUVi$FSxcbafNR6=$2h$AG2=Hm z7C-iv%U1AuQF>AKoj(4hgq647dsW)dQ2IODTXO1~YjekO{qBR%hCfE1|F19y_zLp> zkKqyKsR_-M*9%$@34YyDiSJiz@tP_&3pDp5QUeroIG%&|pGE$6aTXeI7Ct}#4LGYn z?msK2M^rRyI*U4Bw!P5+8Zb-X>p8?Z=)hb@^QL*!0pz^oeCGO|_AT)CTfDw~*Lwq< zK-cx)_}jf9V6f-y!uy_fYQUx+1K-9vpufR<-}6}GdkXt^jU70cQ!#Zsav1VSvSxtTm)S9A?zRdu7|EkK7@Ok3=CxL=xooa zZ)?gQ#-3d#nrhac!rJ~1Vx7;QHB@f=Jh=W3z`rz2 z_Ui7#eK@NpC)2kdxpUp-+fS`cJM|}5UiTH;C)b{fi`l1t@hiA~3+IaGj9`A}HQm~? z7rtY@PJBJiJwF52+w(JW^E^L4m-GC5{ahb~^LQye$3_F zhc!I+;CJrEUOsnXZ{ORxI@aHceLRoh`u!ugm&XkD?VsrD$sfi&I=Y7ka$1J^bLvJ% zvr5OuGj~pgGJb!2D&x0~-=4DJ#Qm!?PrdiLr020GD|>PDKIF80FBkEc?~%QEzUNbT z?>q+&%Dx)cUd406+MS+C>vx{RkG_a|X@4{UTu+em%eh;>hi5+r<-F#3-{0dil+SYM zyyqB+|9fMf0oC}Jo`5+*;c9`_2+S)SYpMrNz#p(y2H@^RJ{yiSGnFZ~4hM4nl#ke;OS4Ury$pq>zKi2;2)GV1R$ zQjg^Mbv~Vcm-oHlYdM4d8($lFO-*CoR0P?)>?=tdQIpH*38?{Vx zH(xj3gT5c~o9|KHEB9&8d~VMN&kfI!&du?>>3QTi)!dHXGxPMemgi?djpk>g;Aa+# z^LWhv%%cs6`1jtFXTTp593KjdD^njZVoc%t3$%b^&({N7dk|F&P zhEoYrN0?e7@D9`nb599s1$>0?$8hMQIA*U~L4G~`e1b)wA<99jlbdF74o1eRlS9fzb-<$e&^PbHdyvuW*8?MVxZxzXP)?>=|b8()Zoqmpt7}YM` zl!H9}rk8XE{Bh!rA0D4e514;AE(OR-9Ipc8DqU}&V_L_!MxApY2cCE$n1>`k@H^+kK_ zlE?Yp^nD`g`;Uw~S3GBekaI3^jK}=iOpoyi`=80{{%OabFn$KkeFog|w_tp7ocem; zj%OX?i1-;Fk$i~!+U3xq$K>1V0f)1T{k_Q78TqyQ9z)K1k9KZ&&LV-2A?!S#`(ug! zMEnf=QqDlwIE@^~?$;dq`gIr&Tz)v(fS(neh~yT(*2fs5J^ot0cdqAlALnr>5}_cE z<8k4(``-0?Zp0@Sb{>BzpJe=x#?Qd(cLpNIvwZE2`EwnIX@tY6^X2>Jdj0O>IIU67 z$Ln{xQ5E&p`YP#Lqzd48+es{0zj;K>Q5E&p`YP#Lqzd48+es{0zj;K>Q5E z&p`YP#Lqzd48+es{0zj;K>Q5E&p`YP#Lqzd48+es{0zj;K>Q5E&p`YP#Lqzd48+es z{0zj;K>Q5E&p`YP#Lqzd48+es{0zj;K>Q5E&p`YP#Lqzd48+es{0zj;K>Q5E&p`YP z#Lqzd48+es{0zj;K>Q5E&p`YP#Lqzd48+es{0zj;!1;3qy!gL2&l&hM#~ro_kN$5~ zN98-CKR%<6WApAP|6bOI6L`nr1^<2;Je-iQZo$Kz^Xt)`z<+V(Y2F$61Yy4(!|`127j;N{?X^(gE! z__TgEh+!`<_;zsQyukV3yTMT?_<<-dKkNEOG;k@E&- zg6{@L&PN=4(>?P4e$=;@kl??;sBh1CgHb*m{+)ID2hR0))YFrY;GdwE-B%qP`zPqr z!S~!F{{)@u@fr8Gf@A*#2Hy%l()Sns-QX+xc#PBQpWqm$*FVAMdOXJI^*?~u`gn|w z$Nzv{4&HJ2k^O*P>*Jpef7akD`vJe!$7h0P3_r31;9QS~|C0Na8368g!jE5<$72pJ zJHXEMc+BBt2jDOJ@tDKc4)9<0<1y)B3G(0l_{-sA%Kb_R_-23n)9x7wKNbOrKOTNk zoUhJ{^E2bTpol{e==kFiXC?SDetwW)aW-OxaTq={P=aLFVFe>GvR+U z_{!GLpANngekAnwyx02p%i+%&eDyl@A7T>3HmJ_^c+3I3&U`-SdOYR;d#CyRb3Gn& zfQ8KO$NYfp!{>Z_COGBpk^T5%e!%wQKlkG=yU!XN+mF}t&h>bV56JH?#`pl%>HCjy zg5Rl+$2h?ueLThq^dCOw7I3Zwjb*eh80*ZCYT>k~wr z8~gnJGerMw`6)hw|Kst4_!;!nyan;Cg42iuzCMNT6KC)<_Gf<;?}qn3{QvzQUeB-cHQjYr!XDKGXnDae2-oN-_L*RKfLB&=WBlMxr9rHA-}mH-Gw*(S<%18se`V7%&#lV-#24}0!TWe!J`ax7r=Ci<>=iHJ z(z{PB+cGwJ#r?wvmi^2AgUh|i&D_&5rFY+BE4_!FUgbUf{#D*X?_1?P@brp*dCwoLy8rPH zE!*-O&eKz$NVtrD`?Y))<>ltJfAu>FZyTR_TX*lkvVR*ru-qFST|Peqj2u{g7Vl&B zz{K+T@k7h!4~CY{AHw_Kdzd~U@4>@+@Q&TN!aM#hd=`8U_pO}2{oO0)?|f+GJl@Cb zJ&&$Dd*9tty^my{y+5(=i6uRea=4n+r^+$#iPe1hmC{Mv>z&i zu$kUoY3c1 zm6V}JqsY)rd!il`8CGwkEzzE6ONuTi11N*_;a%F{f&EU{d605EuIYO6RVS6uy}mQMh}V%)Po|!cs&SPvgu(+_`|keYSz*RCf=pty=JCCUY#5zuU{?7H9zA}OL-CI@bke!$1fZQwxIX_2{0YV0IG4)Vl z(?dlCZK*~>{7%I0M1OX|!bQ&XXJ_JfMr*q>@jG)~b;gn|XX?O(^QsH|*@eEqw#EtF zc0CB69%DSq;*#Tvx zYUCG8gehH8T1J+H%xnocc@lC9B;*xKD4Z{$s8m96xrCAm31u}B%IhRlHb`h*GRZbK zt#!1`ts6AT`e66z_1m?>^Z{&rOtW5$snEf9_`p3%jP*OUV@{^(WKOyo+360$lmWTf zV`L~4dT>N`_CzdM@^c&*T!sS&mf_%`ZX7<`jYEgK*p}hYkuDs0g6+vJJaKe6jviZ~ zw5N`B;pj76=7+pRgd>$KWYU?cw9+K{lX z(~u@?dPL)$Zd84ck*Y#QnuC=xASdG+8Hx)Xk(GHLmM)FK&70Siy_hV^-(yc^yH`Bh zzd4qAn5fv2SRcM6!&a^doLBpIXg+x435~af_9HOfP6y%|+XPGZw6L^9)fH2+3Z@j5 zOc{h86dCfUhoXEfjL8y?9$lwkK6~~_y!6sOT)Xx)WZ8;y=bpovGduC>ul6eK-0Lt8f&*}uIwDthK=~< zZSe~qA^v;o8mB#Ej91;H449XslG9TZJ=kQREfwTykdh?f+2dOj3~8xa%$_ab^5wVi z$ImY!H-8EWi|#>5+5IT35bZuxR8Pad{plh;`uHuF=qD95TIJa@FKyXuowms!i#1NjuxYPjqQG{ib!_HL+x%2qFf}tNR)r)X z!(7ThJ(xyh$ec$%$kZS)PQtOLHz^o~hlgOb4lCzxz4bCu(QnhlJk+J+u620hN${G59V z5@xHwCJQ+f84^@Tqdy2eWSbljA1mSMqc;3sef2s1{og-T@ciX3e?m*kFSt$zqNXO4 zaZ)JbzCd&?orS;t$DfpYzWVA@{PnM&E9Wn~xJj8)JGz`~u?A!B(O5&ot!p*%YR;=` z2OJ9oe&GY+c&pDSev_&=VU`N<(JDDn;HMtw55krpd^&5MBjRZ9&pf?V!BAYNgDK6C z_J3aaduZq;=cOCpYT`Tb`RL>Gm|vnnb4#f5_o>rcQCcN2R&x4g|G>C)nTYvp@e=V1 z8&Vew%y)x7FH>8b66=iQSZCQ7=Yq6&7ut^t(o6nZ9x(F<4evr2GAex&au(Br}|1n}eUw-)+{_>YEl>1+JaRBAj z4`9hMZ#EBfF89FF6&_f&$^*++dtybOr@Z=MFWQgWciNAA{wd6J&Pa}SL(*(F+KwAi zs;hiZTI!DX|L_{;&#%zalZ=6FrHU-4Ufj<0VJg}!zG&~H4wibuvfP{a zz3Btqa(AycZO8}fx49+={C14ueEdhO4Pp)Ec>T}BSspi&W_!|xJc-|vKHy0iJZVFo z$WHU2Z%?KF?o==)OTKa=p`hi~Jv&pv=L$r-6)uA-l3raK}-tlinu@%iT;C_a*q zz__l+Z3O>Ll$NW|zQmt0PzTh*k}eD{~@s5Y5fw{#rkWp zIO!8+d0k10_M#5FWaAt!q|Nohym)WgkTVL@!TGqdSO3Ko!XC+&+oy%zH!nPKk%NHUOIr+UVBEtf8zN~#P5K`9RXOp#E&xg z(GUFS2Yy)E?I$l^<%jOoepd!|x$6ZsfpPq}kNNwaK}h#)*x}?s>=%=xeUKdOZ8gUD zAT`d1I`Dxh!3UW}KcvJtp`$fTnIi>|9~Qsez`Av5sHvNdw)Q}@b@)>TfBJzxb>L6@ z{?_i*f#~k_zqsQ`Cyx=^zY~5*#CT6$kW|K4pA#vw{gD*yJDd{hOZ>jX?@Ro?)PWze zjQ;d%SF|-H;lRE=9N6EBg9p~)@ZdTeI?#thgS|L>un$KLu^sNi6Gzr4@t%nJo_eZ} z=Y8nyO+t0G8x}1J#G=*!v@I4o2%ruEse?fJa^UdF-eBSnII-hZNhPq28S7h~mX<0p zwq%O;S!0Y2K;kUF;bh8@I>(@NLR5db9+(Trj8FQ$Sm&5%|9{1A)j+oE=Lv@u0nidA3shRj&g3!_ygvISa#2-XI z2%-!@!##aEtXvbYMt~g{_&X8*-|=Jj@4RduQ_?R2AX+lzFvbQTEsl8O1CX8=K>UHo zObJBpykHb$=unugLvgMi<~%)03iK!|)}!34M`fuV)#ZBBRO(Sztw%j$iUswdXlxKo zhsMTW$`Fj^MZsuk4MtmAFnu9}GK64BX9&7h=&*Xdze#|;Q|vZID8&bsuhDuY&kDSh zJS&L!gJfe&5OolQd2@r1o)CnLq#)uCLbfpoIcY)2OAkUpW-tn~f+Qej&x}6(8-<4^z;GU zr7gR)o_AyWb{R%(C?Rl_Fkz77>;9r5c>U7Tw6u5yr9|sKNtvai4nnM{u{xy9(b0x_cb zlXdiC9mijXJd+Oj8G7Q^qbNsD{In(7QE8FQmMTi@wiJq*s!-w&{gy2?Eeu6-Qz-F= zv4vWfSPbY~7WT=iEuO(*&b-sSe=Aw+I><>2C@@BcA|+aHHO|&s)8^=@13l8?^~g*L zMOI2Ea#BO-2cgJM52X!-q9{9*HWUhTei%v$!{`fPw4pFml!Q?SVW_DHLv2+UZ72*2 z>I`V8H&6!#;#ZorwKd#ou|%M=ORvN{Bm4GS!Mx*lLIxqbDKWS$HO7FnSc9Az8#zx>#2od7_~{qL1^Aar0)^>7p~?r=qXXj(^M(zFX`u$Bv80v#;2oa%yb!@vp89 z{`-njeN34-+*nm&$gDJn=Tw%3=hT)PG8a^Z8yD6aVp>{4erj3i>$ic=oM)cc4o|#O z;1>Ap-~Hb_noOqqX3m^B!Mny+7UL^MT#`hc7GEL#obCU! zIxQjhEt?`L|M`(W_t@5hyI;S=S||230_Xn$7NuYNI|hHNQEz!%?YD84dPd(?^{l=D z$D}m_>a=y+)v5iDI3{l1tNz87!;VqAo>2P@p48AIgl&+swei#63x|TA`4T=qv8P}4 zPpuYp4>{XYJbuhtl50!4HN&EQLDXN2aJ4cy&Y`sfnrq}YKi;rgb87QG$DZwnru{Sf zpC~YVkM&>Va_-&nr_rT#P?yQG6Q@_9wHMMFhdF)~G@WZU> zkjY=m91EFsH8RJ+UIQVs4n@?`$mAqMEzs~fa-^H~Xsx@CkSBdydq%u-r2pIMLfDy* zy|PlhrLt0~&A3@n$=VXuWz;QDE42Wk9>dO|i@F|B#~^ee>M)c#5>b~#UPsjO5Q9w4 z|K{!^&KUTmmZX?;uju18HmTrZJwVw7|0dN8~13jb-(t?BZr-SYPZYr7?{XVaGA}jrA7H_ z6y!M!E4;j@El@BxqLN%)Rqa&NHcaDKOe2nIXl|dzdV*=hp~8}G6_&1c7{TzZaj@~# z`!!2Nzau^|9>P5zvUV*uTlJja*U5(t69e)2l%gPET%bZp=Ipy{1a}`cm@M$8SI{qWR6W0WHyz9|CVwgzo-bvI&2@JCE3)bR% zxNC5V+lb&}F(~Kl?J8Yb;PaQ5s|%nz=`5ILlyM^}-T zZ^hv!+VJdis})Y>#L0E|-MOdm_B$ug)INzdHRRvvo2=y!by>7Y&D9-)PP*ImUsW~v zXXNCD6n>ZdbS8Px9On2;srTcp-=D_rU5nAPG6Nrf{0_3RCXnxu$Ro0Tp?m^9{pKfX75{oI?!uwc;xN^Q=FZ;Dzw zWgH&fsg4%?kDH5>{`0a_bK}YH5d-tkDp`y}I`f?=3HRg8bEnBmZo!sKwMswlz4toa zeDg*8{`W894}W-F`EK`~TD)*-E8e+q8num+pwtJ6n!g^6tjyKxHJl?gb8pvwQND9r za*PX%bI8plxX9_rF33uojx=(-zd!d9jy|;&n>W=feOsqW1C zYB~PTDt(B5KK&Rte`C8H-fRt@EU8M}6NVr6$eKKkea>m;VqFDBDB zA3$!73c@D(`wKA0nw1L|UQud?Is|V-{;spzTkcxr&3w7{Q2(~+|0v`iXMalnO-;_h zNwYk!ro?zr2VU~L1TW^3ePEpHj5mIJ3W85Ld~l=UYlF<`@7-g;qkApPk4dua z^-YO>9md%~%q<5Dr_Kq4DL#^J2qbj0w5PytHgeu;rw4QuWM*>Xm%7$VHp; z$!RbTT|PgQ^0OYI!j^w-s0+hF@)*oL%gj07T)sS#{p4RU3PL9Qw@$hDOQ zxxU6Q%-r#C^TKdzr)37(+YKkzt@Cvp>1?dskMI8*3>IHU=Cb=!=NPVKCq*$Q87b!& zBbbYfU_P69NaiBv=SENm5hyE)K&3g7I*3GlbrhN!X2>ngKcW1Q*IHW*{r0}c`TVW= zwtpuuD!MS60}WZpVI5h?;m5O6A}-~mMqFh+bf_RBl6lZ5l;lS-ml!3N7e@_Ml}28z zt%$m`pf>V&Q)5JX`?5fT?S&TcuJ4lD-nacYia~rK_|u*qjk>PR*RQHd|6pZl=tI>d zq0zOKp|k4hLLX{u)c@V$#eTj*cjMx#AJVrSgJj`2jQGpHF+CM*F+NiRfQx z!iI0v?AJ$*cX-wRJC~IC`>*_cqwjSL|NP#W%&Yh^SE0Vl?1^aSBx$N>XBeOFmZbad zrk&xv_UFD}mPIt?L85L*(yrk%_stZ2;S9Gr{OBb~a%A&kyW2d482dZ z;oivwy&I;pp2S5KzrEn^X1*HurER}7@~qN#aj|M&d8x8DyguJN!CG7*$rUw{T)R+` z8`~tgW99u;{tn{$_Q$#B+ppa>7K89#?kg@8Fs3iapDOqFXX4m1y?Ex?)p+*#UOa!Q z7kl<+vChtc^_foC@QC)(;Giv+Al_3~ruJhjcr`tBDvAqS(!#Z@T$mJh-bwoKXa;qb$2(6@l%kW?Iw$Qk9Xer7wq0sk4GP? z=kx!9v#%XsosEaQv`5*;-PpKWGct!sk~v>vNQs?(BQ4$;1=)V`OJ@$^owt9DNB1nk z{(UWY@4d4)`?eAG|mayYnm%~-oWdOF|Ecpjhtb0 zl5;Yg|+SIJO-qjt3Wh-@i#j`^HcKgXr_MMR$qyKYua=2KF$GOiq6P=R6JKnyM1E#2tk2zTNk$DOVMASwUf27$*cSGv*I z;3CRl?5nB?%ZhGE9DZYj{+}0zt?!!3E;w#tu4C@O2}+*qV8rR|+8CUFI%Jgo-!HuN zcXewbC=~dS*j=%lKYwVxcQ~sxZlNEd$=TlAtGE1B2CW`3i~e`9b-Hh5SS4ahj(aVL zUWxSf{l!I$r$>s~)*2C=H1SM}OI?5N zSjzKsI-^+e-;pO@xUu3s|LeD6E!bclb28JTF? zOE5|^5_~Z{sT$p~h3IB;;N6bqxf4;cbyU;7th=w;ynCONbvETw8e(<)F0~ST5JEkU-#A_f!-$b zpDQYJ|Iw8DYMiL18o_n2;mL*VzpKSkdyKA0jBH1uLx#+>&@JUC%GkxH=20~-71us- z8Wd0b<7N2pL-PoqwSUj$h^tC@su-8Yct43d|MaCN=pMNS%p_G#7btHXooMbrm=cB4| zP3wn~uV1#7lsqBRPWKd2+_P!nWqi}Sgk!xW%0xH5$zQIA>F!~!vVmliv3J4l-t7{d z?eTBI}dKcMS^#Boh7^C?jWckNOVJFd6C(}iBuK8 zVQqRtE;OSia#6|~|1apYo&QE(*?lj+15V zxm9%A;j(&>-Q8f-n~Qn zrk98IIgCcxCqh05fqQdzCrZNDGr z<`t>2Ren{MjFH{+Lu(2hqb(2764lPKd%kat4z_~lGWqcBxqH4lm=PzGMSTi7$hSMT z|1waIqkPaU*ofLKdRX#8eKE`$Mknj0;wt-;5zm6;^7p0QQx36*gz>p{W08U}X_5WL zvhE!#XdP^y{D<6oQahz(-WeU-(i>!}V@TN4Z$5pAU3WlU#FAY-eD&2O_xX=w#&2}q zd%=$auC1vs{wlM_7Y_f%kk^3C z!gGyHSW(6_+Rx*uU1G&fVh$VZw4e{_OBr!BS3De~-uuV&9W^LMW%r{iBw~z^|1Dlq zd1Ox#HgzJ&o1MoGH%~jZJpK*Z|KvxxXl2vLk?uy!5|*o6y{$HYRJE;T1~I9gonVo% z59@K?C`9D)PU%aFWY=<;i)&8eKP4;wT!FJc1blzusuQ~S@$A&c?{5fEoadF>pRR@u z2+vD$aOE=ZdF5k0SIo+v)A21ma7fZdDW3sVM7gLG%U!JHs{$9gY0gCp0zgNUtrW>^#UF#5gQ37F+lx=m; zqtxJ#kNU|_x;@&ps_NyIemo=Ho1>^H%qC^(t~A9RLu4&a%(kBTxZfEKl7Sn!KZZzIsYb|1W3aj@n#FaMRk5rQTKQV)Nva;MS6lv-w6-8Er&fMLKz{ zcg8e|GxF3ldU*bG&l664L@0_bxu(K* zhh}VYZ`I?7V@aEn-w2qZi$e@i!C(#!jd7 z-c2|Bs@y5~x%OdiN!0A<6Vsi8Ux))EbCMH{J^yYnT))#~88x|41nTn7lWh0eRVixN z0=LOZB$Awvo%;14yq8WE=k+m*;s|ax%sW2W21%?Lkz8b1<%ixYkF+aZ(hE6{Z&i^C zLR}pvAIZqb+`){2shV&ns$+gcxp#1^`^q05 zvXeK-8J%*HwSKznwM@1S_&0ji&X(s9XPv9Q>qv4hpsF)?vL;r z4l>gjZrfy|t@8PlmP$YFY2bLId0+4Rm9o50z9m}i4&z%CeVjV>En`+-)b*23 zeBm5HB?nHx?nQ6LJ{NZ92Iu#OyIX!(h3(5~=DdoY3nUA_!|mGpxnuHf$T5k}qPWw& zMyz*rxiO7@YvLM*kruz^^B%)cSu60ovbPg6r614 zW{5{Q{jAJfgxD7*2giT?qL?->2U70Jwm{=;We2dD?IjSs{7QN2wj;a6^8+0E6R)s; zu3nPMUNaO?nOmN6j65IR)^BqldUYn{>8;>inxJO&{;5lCQ>uln!E+P37bYIxGYzfA z{pf|~4@dpR=uA2jPISMA$LvB|82Lpm@Gkp-g>pOlMeJGoHrfe$6YQn87ndtKKSZo{ zgU^-q zHOO`K!}3j+{*SX$!NIAHf!5dtbM)>iwIy zf0xwD#Hqs{-F+9!4r8Hq&e&M4D~(r%2ip z(CTdQlx=J~rR_t|;HXO8qyzR%XIa`?edCNgFlt_8Fo`t;$q zZOYr-uLl#ZMPR2Df6dgiq5@~9S1Yc`+;I7XuF)Te8;mlu5N`E@QBj(M{HW)He7-B| zre%9-<;RE)%di!J<);WH`OE;4m@}ywZt`RQlHYAO&nEWtHl-Y;omp9zTFu@QS2tm@ zek1hn+AEsBi*XF`);g#XkA3YGBwC>2$~00gYooWu6sQzb#1?254jn#_c3cYc*dFmF z6fdPXoN@4dGrqze@IoKA}>tYJUMnzFlD|8ulx;~e$z?w9&qL4zABD#BTza&(+q-$?%U zoQyLH*2#r;MicCO7Pa1L_r`5JI8ij3pJo@Dydeu<-F{8x`?H%@-?)Fu(9`O^wrQ~P z<^*Rq)~)CJYGBan&*gKQU}~P`w$tlK=`%U|YTnB+!fsCZ9?~zpzG#28vc#cqvs=)a z8frh%`D7T0gHJyBG)i*fdvqSva^gE|Ik9u)=B|ORb}Nt-qhBL*kB1EUYt}4A$!{uy zx(+*FR+TonnLT!`oo;isCXR7pMVf!)iU<4b{Ll}1k+bqaswrxHm&dp^fr;dGmt?#@ z59zdAjb_zZvy4Q_#i~AlAd$V43l;0_RG~`QosVDQpBzmMio>_i_XJS}j^SHndRqaH z7HEX*s}OZPLQhBzyZp7}ByVX6{wkGCRT+GQjCl5G& z>+8)_?XsID=g?-HWlZE&!Qjw*&`te;ngo+KDUEuMbFn*udCt$OhvpvoNaJkMyM@b7 z;7WzvhZ`{2Qc`S26b+f(r_eWt5_HXpzIiH>@q(qCg|k+c&XO?|1dzs62J zZ*(W|L*bF4oNuPU>>#q^s1iw?S99$c=FO?X=sbwXXz13;Yq0B~$DUcG=NtD7kLDf> zzB(sNh2Y-bKXJnYrh7&QaK=LerpDh_a=3|^KWpNGUvLryJNFtaWhT_0_mgPU9`*Y5 zYg5kVT<+==ZlRW^mUYawJ{jjEgNq13AS>lZbkTiBQ*n*`9UAsp_%OwSM>`&C7$k}l zq#e+^6Q61u*sT9QXwh3$eHZt>65~GHlUK63gnY!wD5Ji4g0)r08 zB4(z~G9E2HcXX^>;+k1l$c}!v{-MF&C8a@6Wla8`bcxo<>qSrCHPW`2+I|9zhP33!EtoJH=?YYaoyDDwF-$JCxWqUa>#uqq; z>ar_Ew3zL5i~-o>Dg`G(bfzg&wvW~&b+YwlvNgg zM%5=zz(eGh=wk#+seACnq45#TcM}u7258g&cw6-TAt5j0P5)E%IBu8gOxlPD#TmGw?Dn;1OS5|F~#84wKW~T>D4Wq7vq@*ve zl@3aSDC66*vPZ5v=Hl!cE?4!G5JG1QrNgYOcf9UM5x=@1o8fqgN_{kGt0r)ukhHpbKU7 zxODpovLTcRd62nf1t>X|tP%;r4j5hdk(xPc?|gDqM&EE*I!>c1ZT5U@`(Q@Q={f3< z_?)??6n*Op&M}zQNpBLQtEusmN5;Q2O1ylDp4%HeqT!&=^bJ)G(5hbG`70SV*dz9Y zmemES-jYz-yusiBYf%}1OrM*LUu&R0kEVK+Z{`kQ<6^2mui8+<&R+Eks4kj+ci5?(XqDCpy9w<^ z*qyoiN^hn~_{2{%R)m6m>vBA!)6Gkdf!&qf9YINx6SS5QWukKseK+As%G9AAjb#`BN0i_o29A2Xjz#-wT>Zra zWls{xvlPZsLmN`_^`Q{P_=_+>?*^A&anF+rV;+#TlNzZT$XVgWtMr)1(wOKMscr>Z zZMH^E<)<427C4HT7pfwjx#1r}f9(#w7& zaNiC92__wOuIC+9rML2wryoEUDAM@H%HYSUqY*G?r+28Ut0LaZAUI5$4=0x?HM||2 z-BbDf5jANBV8O@?iLWL2a{JQwB5bEMaxC?araZ-1s-qE2w_KIw>Iw64NXq~*5%VBn ziQc4j&Q$jPjv(dDtFx*(3$x^`m5RGoHwt5Z2y{#itn?(D|7$b0=}FLU7W?^}Pp0;_ zJAxveLBX_vrxB zdF4KHss&?utfib?R;k<0s5eNfzLnrcsSi$a$yj`jef=qD7H?Sj@%cx}v-!UX4Icy% zUct*HzqF(WM}L0R0>q+%Zp+zXC##KJ?k6{P?cAE|?@3GB@pk#4)`!&P2wgyvD@J+9 zlhO`p;~fy=t(d}C0|1CFD>ln;mpY{ZTwn%k8Vb5oTM2gz5RV~)L{R8N!i$jnI2Y5F z%WIT4=UKrMLlG!q0iv{~btM~O=|NQS@zWivZFq8~;ZTVbKE90DL&_}622Qh$`NU#~ z-iI>;bp?vPaZ&bYs~IuMVJ$@T5u_(fndStC}_Osc-BZjnriOdk3tCACkJS=Znq zCD?|Hu4)Wco-VguNb=*tBj!_%cUr<&@2T{O7h~3;ZLiOAA&4 zZr7O5jw|-u%&}ChzV;3Q$98y?75M5p*-1LlM2odi(bkW}S;dgEBt@#Y)-vO)|430s zzN|o*)$>vy&3@!V^y1LIUPn+&!~`U9$|%^zI!jmVkk#jk>Ih6ODgZl?3z}Q$CE_~~ zb(5&&Uy~12SXvZv-DFH?YO!cQljX9^mfA55Y*(WQQ+UUo$w#X@LEgcRZTb0~OeLk* zgwBp$gi@@&hnTisjsD+X?%@}v?|m8nLinPilM-|w+FR6haoSNdm(Vt=wI|G<@BH^# z%aBy4xm(@srX1aomp=a4&PJ^!E9(FYOT= z^Cg>kh*}Q#I(wIf9=oFXa|0nQLw$$c&$|Ryzh6oD8&NFK_*nAwx9gd?cTz;co6J8h zHCermS9RZ2hVS}V;wuh^gOxP;2Jcv6VH#mYmQHI$z<`%?!G8BtQJw!#fJwm-M`;Zx z;#?P1W<_n~8>#=}q;=?xZ;98jeH}x^>pFGgSF95s=YOhl{?z4e1m47p8w{0@7{w(j z?3>-~2}6vz{C#rMC)leIg|ig#y;B!%o+%NrYu1dw;&&g0ibH zzq4c9%m2dkneYqOE-yC4SNeD*D#tE0vAwQb<3%LMpM7;zR_%iG>bpj->4#ekPy}MM zNws9mfa^_%@6s$62_GMNiNtv2y2)2!n+ep7IWfte$T($ZX8U0g3iv5&f^q(pl0b|5B`ok_UyczG#woEFX3*YTDA82Tn|ez;$7uId%%-nG-4 z08yMIOR<@LLrv>-DNpTnsS)n~YOOfg*-dFN$+|y9(CVjM$F$HRyh1LN=+LcAkv>>~_Gt0~H*OOila{~(zUW=B8=P+fx7u5Q z$Gw{qp284h^&axSAvB_Qq<9fx)w(U*Mf+t<=Qz84{rN}ab_R{ey#H!5mZ`WQ>grxs zE0nK?balvN-LF7je9gGnVEiq2f0O`gq^Uml7jG&%`37=dC+52Uu8nk)XKl+~eP$7~ z)3y49lc4ZIel&)6G#gXnEh@|c6b?t0ZCs|{zG08Vlg z@QfciD|X0ftk#MFTlnG-agx<@Lf(T!J9pe$uyFOKgb+D>z*e@UW*yE}ytJ0E4Ma;t zAbBy{0h*?(%7d1IHnKF4awKXiyx-6c@J`}c<77y%&4;)fbs>YNpD)0xk_-?^97hS_ z_C-Gnl4~p2c5hro-B@g)7#w7!c(JBbltp8d&sp8OOE`J&uKuOXWRy|qdmsO9%X?P5 z)e&~5DVv93%GSNf@Fy3?j{wZ zh1_D}3df?BAukbq;75t{N}gt9Q7g86D!H7)?sr=`>Cm*YcDcqUWGAljWBG0e*F~M% z1L-)Mnc~HtM?x)60B-JNLft^Re==p^K1O#`MzE7)j&kYCOrh%OU^;D&5l?=!k9bWK z|Metk7ib#79#IAeUWGF7LF`1rkD*c@0rfSj(jF2+GTXtm@{iymc&IE5W(BL^C(5Kr z)_Cj>gu!<3UF%}WdPp9$gwqrEEr(^OHtRq2gQ-8vFGC{r_VJi zo_#K#dFJ^e$sC=RHC$hr8x!*r`6FLODu<1@DUA6T*+5VI*dE$-Gal~qH1Ak&`YSPB z5oymsk_+;N2P@ewfPUSJDNzi4M^#m!|4zn{n>h9Kl$7~GL&4(VZ1Sdo#kVf7qvEB$ z-hMZy(vs1JIyZaTsk!1s0N-{?PrmI2_|01AC|zkdm2c_EvQ+NKfF z$xrf#aTi2Gm^w|ZgeD0hlILtff5>+{0%&ifJrZbv(EFR;&`T!e2vA&r7}t;aewWpQ zhFnIrci!pxtM&Vf$_3~+ovTfkfd}=Pd5`>M&k8hHemdYq;&M$qZc^}@iFv$s9%3i$ z<(c@z3*u!2l#OT43vF^<-ZCfeh=EXLxn~0xh4^!9c5lL+`F`owQgr0Nos!5a_ZXYA zWGh5j%k{lt6y+G{lB0#_J^x{TR~$|R-pn~b`|wB5pw9kqmzcY{+EXtbWjl(y>buFC zH>@(~V@hOydC8mndYe7lOgl0A*8Swn8xcBIVYcYpHWYjA?NTJf(<_fBnm|O2%L!HU zfBx?*0MCYuELA3PSVB&TIKE9BsZJu}SvKn9#Zg+*Iay#u90ectF_H&3jW4VER_i(9 zAG+c83aA!R6F#2?^2>`&P+Tf{yQ9(*se|17eDuz^W9IbFw8WHBu0n(<_Yk}8HC5sB#$P|D?+GCk;J3X;phIjM{X`x0dL=Z(=tF7&VOrYGvYeg ztM4^md&F*SeN>5Ci{bW7#L&pJb(c1cTtz(FqJ9_TtgE_Ef&NlT@v$|y;zHV|%XCKU zeEXn@Izk?@!hPqMGG7y_@3o84wyoxvMQ6+}n&(v~3Esl6sF#o{y$Eq^2tE^Wu3}DM z_VqcBe)}O|u#NQJd;h9gFP;`Gn^)5n?;kl+ej7=%y)~13F!YcY;aN)(&Jfb(9a$l- zga54?!T?+biE4~6N%a4xQVTphS$gA@@*Ry##R#eBkEYs!ID68L?cg*s#Rw*e&7eWf%nT`I}je4&p|s?U~AhABd@`@+fw-T${>BMeluB6sUoDLO1q7{T6kJKYk3b9 z(g`Ud5oa#q41#hW&sR+2M)JSD5*!=qY+d_27#67*aek;B=AhX`jIYSjBP7QS5fg#( zc2U1}++bvV-n1`Ls2yke!lyZW|2n~jT_eXfO<5e{yl;uPkwVDei8Y0o+#E%)OtR5@;d0Xcd#<&(mnxah7hWOfb0I(XUXzyL1Y>TbsZ9r>=FS0Er za2JI5-(a4~KYI++O92sh_JS5sT(ClwLQ~o;uOA6SGG8+s;6~;#A0j$Ba*7-@jtyKO z*OD(lO7%pDttYRZKrhJ#E|MN+GG&M_zBP1y={yvE#rI-MjD@?u|Mk3(E1X4D%wB4o zv=q!t$jNx89J9z-S9kODI(&WX4Rdu{X)!7BX36-&mg+gsK~uHy;m4a+j4Wa0Bwp;l z=rym+kvCHiIB(u`oA+R-sgiX+_?bs`3V1uj!?@=s%Ua25hKb+}3)Aw1-|`yQ36xmm)W?aT zx+c4X+uoX{d-T@)x`_!~&6q4^E$TX%uGjw7J#luu@IS@g0W{lf=cMUJ)nBN{b*~S3 zg>tQy{JT&dEh6wJ!5NGswJ#3mCMhn&XZ zG4A%08bRPSeFrHBO={-VZwE*9=&upR+2ngpBwt-)`HtAGwysIbI$Vqt9-&M^8G_pd zL7*AsisluT(bV9x!W;vD_qa&|4@FAz5+Nl+;~kC$sEpm94^b)&P9=H^62-H!79Og> z=PbY7E)+39`|E7W-T)`!IZ5?i?pTo@f~mNLt!UVL6={3x zECzV(f7?@kc@CThQUdCeOAKJCd9=i}Da*h}Wu zdM!`2SFhV|z#ZqToejeu0lCUCYhZ2Tp*Je(zY$dN4m7ImZ>*=I_~&e(*z@%T@x3mw zyr-SeUvCM=Bu944L``{r6r8pBld<@f@h5FDx#aC1yMa!5#_4(FgL!O&2>b8;NFlBW zi-Dt(bbk;p-UI}w*yt_iC&;nHr#q7&zz#U1j8g*AYzf{O6i-i#?Kl*5)wYYWQCl3Y zyPHi^eabiL5VgkNP#~$GtDm%Dn2aNJgxkuXX(b8?vT^cCkO*%x68;I6{FyzST{guL zct_c8bw{jYncwm0q}WNMbh7<4_ubLz_!2e3FQ`n@BQyx@qA z^ak2NXper&Q`YsLgeG!7ZrxsX2Y)4eg?sau?6SM;+$y_P()10dvoSc%Pn;+@RG8EC zCid%*L!$#wOdqL0m|s5#8_uperUP@B*EFh)3k%OvCp5- zG%%@2%{41U9i@c$t^|ZpiI?;OBqLW2t8XLYD$OgaMrHr*ZzdvHeoTft zRf%zWcCCmxb;>s3t=r2zOHuYeSUplCQjH-nu`=X}BGqjmFs{MP?8r<9=twUP;SqwC zDhRVl}*n%f?KV`;~4mt zpHQLFL>jC|6TN}K(!Xdm?~Bk~mu7*#4V~zZz8Jo1uSq$*2rB0i9}!thQ3u)$j>DdP zRe`yVNTw6AU2SHTbTje{Jxfw9Q}n_A8&(jpoWVG+x5hmSujd8qyz>yJy1-4nab)g* z-dg!jHP_Lrv)`6`YOeWiTH?(4PxafEmJidk!-Q8<6ydF7x2$8o3uKlUFx#bpw7?%r zO_Dq*SPx6FizIC2)0{+Xop5JvdxDeFCydl%2q#IjyMRas#tC#xCcj}24a*^I&so|- zwkudVRu8m__0naPX&KAUr)l35-8hPM%t~p{Z$(nzHGwQ;;Wy)J83xdLcFZ)n60~aI zyCuN8azR|Ji(teIXjH-%Sr~PCiSb4m!8%=4_5(=F8_q5Q9TEmiEE>wzepRy}mUstA zjv>$ad29q|q^H~QwrRqjNOpnap8edJdvp8UTYZu4`|5q~cpR6@HLKP#ph@JOs8;wE zyxzNgN1NCI&k{7f+#n|h=_X9d-`mRCd2Oa_v*k`&OjwBMN!YJ_r{A$lS;gJhr3V(# ztTNe*Wx;Tb;HMNtg2X`Mw|83uQJg109HpaZo{0C`fe7&`NHqjvJZA>O*1CKXY_d)oc=MfA zK@LgAvX4;!j8B|qHNFAQB;>A0s9zZ^N#_}50r3c5H2T&8@ue~#%Fwag=Vs|^t9>o- z?U;4WanC;`b`*`o;qtmKWAm)&S($jWx~B>#5}}s~N)O^C;KQT1i@q>~1kMP}RP!56 zmYeoe*@m!~Nj-2^g3FcYkolMPw$da;>DvJb^CE{@QPu3><>@|!EXk}0*#lFt`p{o0 zX?zAK?i@@MQj!(JUoUXGrpIj7$kg1;OY)BF?_}3TOL#Ce?B0F2M+VcJo1Nxm>OTNsNxB~@`=E-wq)fC3-bu#<0aMQd8!jb zwC!7c5nqaQ17#>CC^&kwB$L06hvY{mLl+JeuP>4?=IWUtNzTC0b>)>5X)oAT8=M7Y z^NrZ&otP=~_Pk&zNP=y#f)y1!d&ckN7&}Ar^Q|dsdBj{n*Xvn@d5jO8KLwwF``e)Y)VIp5@c$y(Jv&1B4u`}&Kg{Wrg50nxbUzl9nU}x%BT)4TUw9WRj9rlgP z*(lei)JV2!97&sfg6$#&%thqJ1(LmIb-*?xoswcLtYlIQSvraT?ij~5#FRMXi@OPH z0CxIU>j^YTlGJVuNaTwr{n0b8YQ7jF&0HYfv{4+*05USNygiX^d2x?nm4IHda9{0l z>{PsCq)#p`nI)M>N73&-+_SSO*QX9u>ZjH!l66d^ZHQjbhGVgM$^%%eG8}El@ zBvab;N^g60XHreks&F8)ciwz%F4&d(Amz_f+GoUD*0Mxc8urjP8a|d7p_~P!O!HeH zygUqPl4@n?jcDKu&JDc+66@G&gAN>19l^5jA%qCGW!L=p=F&ZE6Z@{b5npNDgTq z(TASoiGPQE(*j^LHRF7r6kbz91x{VNDpVEFAI9s1RKe65&^N0>5b?+AYF>&JK921S z;7usr@ei^D2xX(UA$tLD2QCEiOpo=-(d9GNWW zk-`JcIXe-$7w{e>E3gy3=HH!W#0$3ifK(|qR{_#Mz@L0G)|Z!O?#5&J>87x!4$*lp-&yhx52T+W#kGZndSH-x1(~ zZoGV8?o&jODo3IsQ=syFR`I~OPqr+%_LVM)evQ?C?zJ+>*JHO|o7wXIb1V?L3PiMt zsk7$VyusF`AGyu2HQNXY=$S_;_v_75*W`sfvq>muTCS7`D&P% z+L`TA00X3a;p3-`h{im>HaJO_eQXz4&z9fEw(rB86#;Ds%4_o6vIag##v`#~#|2tu z)>F6R81rE*+07iE*>}(Rdk1YY>Wxl*7bzXW8!M{Yh%txoD^kWKvfr;cl2oOx%~#BE z1IBn0tqdHa#1AfGlqB+ZK5=fxuB`P*hg6VbgiDiGt%X*y6h}7w3R@3pyZPMTtvqRY zIY7*pA?9!QL|d_u)Bl<+1yra&d>4pTAno91DxrY|!3czE2+x?ZsU=Mtd0xT3{AM5~ zZ!7P>8H;rSo8T&hM=b93G$v#1xdh(G2efX-%X%W}n86d=-(~PA1blKITi!nyPxvfi zE5lD9^RZtt1zF6>3a}$eSYGQ&MHS+^ZI)pBkC-@e2kI@LoCMix&o%Hr5UCx0XmtZ{ zycR>D3DpH<5}%v5r8Mh6NXV|xkz1KzET+7HBIUkB^ALWoqK5{l{7bR5d3G1~;(F47@yG@?;Z`u>|hDpRm+Jjq8;fbcK^y<(^` z!R+)9HbP*x(!L$|uHcxepdMwQN%95W3iO^-nqLjEQ!v+fh%bOF;xyfdNOI|X(L`X) z%83%ZYekc`bNzlJI*P!xIblKBv6!?TXTL&DAJ$gi6+tTD_I=9gC3nT{!_?YnWQ zA%Of@8J#wS(72IUTW&S5nf>Rg-m*MGLz^C%Lx~6@B{R-=XRiIt#qkVUB%_(vX^vx= zB9~UqvyysNn>}&SRAL`bzH(qZD&XJaM>c`21MaZnaG*d710VmLe|Mu0@pkkHZ@}~} zK;tlAL&Pq&BMFN*Q%@XTz(g*W1cB6A#vTFTP&R3wr7GPR+QOA3;r#mu)5V84u(JYP z&Plvf3c7O^TCY- zV+wL*vQWPv@c=lk3<|Y{Olx7d%X)|$0|Q=T3!LDYjuB9lcyvWD@-nOO_ea2qWK1>e5AU0Fgis^pzAV$-VQu{>XtN!70Nnk#%xECp%N>Q3m?-a%>-O@lENRnSo7BK zwGbRlQTCAkRuMFXRQOG=z<;5K^!Q^@)Md75goug$K_Qih>Wb;_*lvgInpH5Sv`f!G zCy;nYXy5pD;kAp<@0AX*QdC)v{-!G)z$!)qu#NKCpC*2K!3hmjom93(u!`Gj;@)!- zk3SG993sNV1+3?0XrbJ+VK<0BBux^515Km>B)ENxl~i*P7#kU=rn-xC47E!`idm%2 zKTk6ETpRyf88uyh;`&u)f=%i9Sk~RY!3w->`!$$Wq~x&g9ps>4f(rQCU_O0U&x#x1 zL+o5s?BOhAu6eMr10juHSaS_RGa=Rfwh&84*3-?^fxyB?*v+`!^x@CjrwRvW>WY@U zK8Gqa)$D=fexLo9H8wRGt<54J{n}!`qWWkR7V);6&l9 z0>g~%qe7BnTYSYj5-|t3LIgXi;L*`xtHd)>CS86mP5KSVZ$zeU;^i%2tpTz|?mZ-N zT9P7{4tKfRfnF`VfBSEc;Q2Np3{B`@i6B{=we(mJ-UeN#p<9g~Px&+Wh@@d5jb@ zyOr}KVxY@BB90&T5;CBa*xkR2*Jfv`b{y+>%TpzpowN7Xr$_-(bcqOD2U5obg|CH% zu@l*5!YuLOujidZv0G*oz(B@ z30vjD0RrNq24Ty=NEwiXXfYN=1UP~S`@?xs(2_N&b4_5y3U1!ASm`5x*pjROa@%&& zMMU^5p*Dy;QcvqJ0A+J2LzpVQjg+7;in)Tbs2IYfubr1yzl+Zj7dqe~VjEID3FxvU z-OxM}q=AXgdvNzUaDsK5!38u$j>E4WOLBL&RgLO^oBk0m*dV>ps82Upt`kgFo&{36r{uf*@EnCUu54-4@TAiYr z3b~c6{b)OrP*;l~3FEwVJ3vy6As=I2p#(^z?%|A8f}-kkOg2UZ{U<=;K2JFlh%m9f zAj^uC+)C>-5c22Aa&b5nril}s7G9MRrFqsGeYhZCr$xCh3z~&EP}2(kEkMW}>!Tfj zhYmd;B-|nz%F#<(rJW}RK!2ArVfaJbldQ#vT_vzV+fSaHA5gq$bfwV_F z`WeC_gO9Wz*^LIbup!O`ts$E<*jk=WZ?}O8HsZy2^1Indv6z$m)Cq0`8jjn+RgCaN zjAn_mhZ1FR@Zb{+PdYq@q9hfs8GFIN_Vey@)kkdIHjD@toyzJt%+NE8`wH12TkscN zrY>$-B$EmG(!4g@<=@gY_DYe9jN0+hU@YG}PT(NqeCE7kkHIcb;Kx^{(X&OC^XX3`H` zx%535W4;u(-<&hDanF`*HlhW!cpn7oUJNW5&+IGO4)x_qg)D-dTMl23A}(a$_~}%Z zd*JmNZ1s=1V&UT)?vq#Hr8j!i)pQfnC*hNW)ieKy&(ZL??%-Px?TZ&US#AWfIRYV3 zmV!=dQquXiA^d;2B82uRVl+?I;Q&ujo|%+Bx0ffJQTk#lz$K0XFX7QPWa_)=c7^9s zBz>;mQHql((nPr*%0mO?m~bQRD;>cbZOS*{OiG)ZS9&5PnJ8^u{-H(hf<~vrm+MU)C33Ry4n_W#ZT#JV4fa`iwgy~f;b;-zok zSzne{mnLE5;q&g1-mP9B^=rI_lBTiwP=n5wX5)zfL_l-TRz*6_d~ch{kqhD41=)S1 zrfJ3wp*}QMS955KmiXE~$k2emy}|EiyeM?QhIm1?I5+PQGXg zcfOJ%@^)1rlSjAD?s0oU2ph=6zHT3If-}|NhJ$RQ@l3g20+g@=h6jWx!Lcm(l@xum zzg)-kTC$l5A3GHM1d*x@NG0NQLTe004oP)QXf9Q$KKC(CLO9bm!W?4-kC63ps){=9 z*z5QBIwRPnWl=%Nis${8?UTAji#HcPE!n`!-WR`4jxN*~f)a{Gbd4h|mkr zt_ti`RD%@0WM?3v6rxz+Gt({siZq>x9R<^@N^jUsK#ryP3PpHJc5;;ZqA)G%&-ji8 zXOVvFdP`DH)uua$Q|K6JI6<3t0tq@~RUn!IpfsXAx|QJiE>eiFFCD_7=Xc(gcb^`A z&|bP90Z*T;tmPta>}Ng-=#`A`D30$dzXp%o`Ou5%{XfLO(UklD5OpTdQ2qb^f8Uug zj3tD!q|t^@WUZ8$QYjHx(mqNs=V`+hxN&)4JiyosYR@bS%j(>~Ij)>6fIxpVm_i6Ica`k0D} zo_;&AYGfMjyse^{_kZ}d^LY|C{}zDI*Q#~ez;&O{&V>o2kI%?4-|~I@#RF94Jt~}2 z)c$K=jHQdozW#)>0*s!rKDaYB0Tlru1D$ z$W|}1feSV?%09zJ(0a;23kWgLYw%^F#p1*OdE&2&AG&oK-b?<3JMOduP@=piN@f7v z)MyOeE_@3R|MFM-jHMW@#@=Ca`?bk0TBeM#r{6l;6&g04+4k1z3wMFQPo@%+r*+h@ z!!>%?3m)!IM$pq|KLt(sb3K1OpleS%3JK*{;<9~bYPo9a*{N@r5q$I1H|JH43qP{5 zKhE|8r*EZViezchlpgHA%Kb^}-b1iCRW+(CP2hB0&|}Ck+}X#a$5YjYQnO}|-hu3EN7=JSh8=Yn zpYW-AG*88#YI0Rwz#??sp+5yCV4t9&Q4&9oX)3+2L0QAX`6F^mn5Kn&HWsEevY#Ks zHKlUG?#qz2#s;Up#2Gjo3g*ss5+sf=cnqc9YISMX@`0YlczdL5d8U*J7u z`gRAQ_lEwYEI;h%Av`vNdpnVR1|<(?VP7Ri z0pOz&wzeqB@Cp<)Odj-lIsaKAFLq$LWOPROUcCAZaqBECsReL6K?=etBHo`ij}y=x z8+{~ywwT9pMn+zjY3oX_EGBa*8F7=zCcr|Tsf}&PGY}t}qQ|mSB+1>x8i|lKlH}8v zsU%=w)5KwOjAdc*ORLa(P+mnPUAJYuH#lqsV6&zHCJ^SXKX42ty-E*KJlIEgQVrbY zEaDJ3k&?QYJhQQN;lI_BIXYlz5NXCzt+}gzy-S=M*)^fcn2@)NkhFL=&e)ExkJy@I zjr@9pe57#hGshnDvhqQg3Gba>D()CMt)W5WjU*c4(DLl?Grw1^6^9>LB}slg_989v zwV=Y%JoM1t2UH?Ndpb)IF2K+tmMN*#Oebp#>lDbKu;-AnpHxwLM(8%AA~Yp4EBWR` z>zOIe{Dt2d>E4KOYA!9xOGUv8(T$14^5lGD=)Q1ddRv$|jVn(VO`4m4V%rPF$oZ={ zx8U@i`{~^DA&DSg8OTLFp}F?lhc+bLR-0PCdU3U3=~^RvtCE2)c$}JUcN?a(JDTQ*>VlnaZZ z$+r0_h@IS&P95=nF({H#n>WyKYihGlBNny!BcR)oYLtyV8~Y3XD1#NC?MWr~vu4AD zjZI}oU#^alC9%c)Ym5VQ-N$*n#zEBX;QWCBBDYRtTB5a-IS-Vv?W#)pD_i1(QjRo^rB z8LRC?4jT)lR);!u6dOFwS~6ASg2zA&*zSti>-PRS{tO+hVY8-LC)D|(o-}+1pV%D5 zC+-z>^pOx^6*bDNma@c`fY|`TwRi8V@VAE7Q&%|N$<~8EZ<`d zndhCGyDsOG&*E*XeRS@RQuka3|-l4~Q!FTCy!S zjWt_S8-o*WcI|ZJg2wx~muA``B-}$04q+|Cn`z`m|ExDg##EFfJscWC--OXEQ9sfv z7qY>`Kdnrm5^*t94nOHUBUPrlUBK9wB6}7MXSY{RkU8rr=sFnf3q|}^*qXqz_Td4A z-gsqjJsk~fXROr%OtkSlcOQ5;Yo^h)a6S5JhnroO&SK_U$H1@0yes=A$=i1#M+_R* ze{E;9PnP^Q$rZnK4elK=qff`0nuiLbp7+0~sK`I7dQ+R(N5~d6PF~Z@h0Cj5U07(#GcRvf<@Xn*D>o zVJIT>s7w;KOkD>&^?~*sFo1sg{ouo-lM8?j!wT8=Z;-RvT+(wuSUH92NuMG~9H_KD z;;!UIog=_n9JWKyunRn=Sya%eL{vQp?6>t}vV(Y6#$&QR(m$MsME1o&_P+(XTmK4> zo*_>W{cp-`=06fbTl#=x@D0482?`Sz21{uzMtO~X<5${bdM3Tlp z^)>w0wM1#>2#dJuv+dbgpslzneB!276J>WqMHGYi{w(m3JDNO{PVl_By^9z|3FX{Z zgYlEH&X_ALXcYd{k2T#Ka`xM1?u@XBo+C^4w{wpG=RintNG$o_mSrdR#>{=-^d_;- zb{8*gNeMDvsToY9@13 zJ=Fb-UQYfb2{p^X4N~wEC0eZco!kUCY!~0IeYsJnH@}lLw??`TB*n4@CpnjyJRlfk zFQ*2+K(gjB6{QQMhg8I^XQ%u;sM7l+W-;u$X{i1C zDy~kVUA&K@%Jra18|v_j2}d`H$09c>VKHcxBE0oJ6v2msO$&bCXqHz_GiGk!_(DUy zkg-nw(G2m*i&~cQa7DnMG$R%&^$33D-k+7#?38?Pc9Ys`y5MXC13N6&c8&UK8+PUJ zHJRV7X}irt{~|`i>ikcVf-`5M>POA*vg+dT@;Ci2hKE<5{pP$}Tr$hNJLH|ghD@zt|IMz_yNVZl+{$UoWzAz?DB`l}CXm&y_rS8gU?UZ7}1}qdOpFDpwI(j>~gYSL05uGD$jviWVwb z{L#9a0BO>7AEcQPeznu>JQjrvlGy6E7p17<@@qRAPS&Wo;0N@RSDF=T%In|R^->a> zIICMK%r))Yq1fPcdQahDIo?2Q&(tdB`)$mWXx^ME>gHywiM`_$ZXL0c{Hq6mE!DQqy4w65!w zm=PE0~%`*Vhtl*eO-^a>fXLRvH!-G2%8KS zFbE-Jj1P?@+O0Qv9~mG@PpW!I7;stN;rVv4@R<4O!^6dXXw*H%=Fgv*_#Yg42z6x(m{@fS$;E zifsWpfNyprP^(0J;$~qX3hrLWLeZEyOs#?6i%>{XCEcbPK;N@QbOBL=yPyWDI-m^h z8aKg?aK%*UTiC67o)G^=m)IitH*r*~#-ZZM&@1mR%=%InYS`SQ<(0epbx`r9@uS5D z#z%`Cb9{U<=OL1a?BOVL?&d7L>;PWf$XtQx^%&G`op|!V4o(9vG?u%VBExiqyTH@r zV+YKALlwyo!KI>6qQp3^1&C`-X4D9eY55vHQb}@^Gtdx|g^b?=7CX~9zs)N~d`Q2X zuJK+ao%tQPclcrTT>pG*DqtijAK0p5yO92tiY%?8e%^2b{kA5ei+=1!sPHX4;&);i zE-NQKoXY*fIHgziD@@kbHqvv%RJI5(!VdlQSep0kk+XQ(AZuN#<9Qch?jYL&u@4Es z6!)AFyQzTNnV{-7_as}o8Fux zxHYM~)%(Vie*YJL>fQjxw^mMS_IjWE`>(b^+9cDGIL$)DVPeY)^NeWLFpZ2QU|RTE zU1_+o_yig3V8oT5mS?8iV>sYO73L|4pK#bG&a;OPul6T^zR~4CENl%!8HZikRodXOyBi$!ybOQd}zvWlwy z+6L+8p%p({eL}zQn3(y!qan*aX}=4I&wIrTH5` zr4-RbQKm|WGgMH?hW}ETwpFNV1<|kDh(au(twJ;wF>(N>h|wTbakL1^rHBogpOC`H z_bb5WDMoG)QNf`V7K7)5{KN8dX1pL>o3nFc*$9-O;-?Kg5j|5ahYcE6X&Hpl4(4Np zVRHXX>rWg`j531+W%*=i9d4z9-&aBf`d@P(MnJrG4f|?W?5IPZ#!GiyDf=Gc5r-(` z0wAETRn!I=xWcrqbdl(6AKQ^Ns5AH!Q46OLU3B`G4_&sTk50w;nY?OcD-;eRHG zvG`a!y)NECSvD2E7fGr_KT>!c_8iiGDVL9q(QPPaZ0d05nRuMKZ+rQmWY9<>%J|4i$Kp8ZSr*@b z%AC=CLm-QK-i!2n7PbQ~C{Dv2RWJ%e!-P1L4``7OXR7&8nH5lEXyEPs#ABq_+7ytc z_osRT=+K}{Hrc(M@D+==*;&GdQA^)f-}VL>((%#NqXpg ztMXT~*1T-l-oxDcWcji-q;$W&XurIw_R8LY#(Cza6}BA)^Y6mt9UeUTBZlqm%7uSl z3yxqd=J&X%#iTa5H5O{i3x=t_4ZSyveAY2$E$=y^@UiskGc=-4^%L$rLJW@1IrfKm zKilEt4TgAf6IawgC2k&hnVC0X4CNS{zEu>A6QAb*-rgsOhHnhlj3lkQ`jM^^y(f+$ zCcpJV>lJRD0PsKyMWjzHb-+V?xbe5$^q(M@a;k-s0fy&l{QIBomIXE(Z{y`kzPCWI zLg9|fmSE54&O~_t_X<={ zGN4gnf3C`O`8i7Y3wLp^q|9}M5k;bsVC-eP{gc-Q5P92!2wma=tipXjxgKw#$e{nY zL4!B)#h50VHx;* zJ%({pm!ura-73eaB@D&yelzk)_X`vAP2gn3P!WHDqp1aNwzs&%}2z*oWD zRI-`ue&_>U=>ixM`eFH_A3Q;_C7Q!8Si^S1ts1XnL(-u*KnF@O=uGFpYi%iMI8fN5 zg&YQ>YND3%?8>?;%25wQ{HE@1C`4C?;|+;#Zv}2%q@!Qm{PAC!n5~Si4q@XqV4-q$ z3PhF$>;BQ@>HZy+r>R75xUfNca4hwG1k|+TB!)@3?aH~$x7K%QoHr~rba6d9b>n=N zC%7*tfh^9%AOoNeX2NzO3Aw0$bKpMb8pdgDs3=h4p;cGvmyrv-jz)aCqR*Ik|LTj| zPp?0NA=sZQvFtw4dZ5*l~Qejpdh+gqT<>=5H$w1#cXCi8ZHCOVmK(e|7e+;>~ z^Mhzt`RyA=|Da#U^Cd=|i4e{h@zS+As-n?ddY-M;lk0Oj@r?vWJ>E-f$ z63xdHIF_WDQV(tXv4wcCShYzDy!E=}9xwi|U}|TgWIQ zC4Hcrk7m(-&LtM!k;4u|vl&h-jl64e4|afO zTA)F?BFs$qWA0~VP>b7L9%P7%p!XZwDl6KRQ%=0wb>wck_>Jqg%V=@Xp{FIZA|ikN z&&MI_=MuXILpuH_F}a&A#zN=oE~qh}MJPvYMHF0!I|3i7!P<#}3N|3hb^U<$V0unu z+Z`&W$^wAMdSIZzqj1s;nHYCYez(dilS186lc%@KzUOQ(FUk4fW0RGhe>T|M>p;#s zpODUwhllBqAhV-0)D-^1q|E zy=Q+4QP`~^ouf>tHNm3Hjvffq^8MtE{Pa6^%8+P(%1s;BBlb=_BT~m2C1}^KQ)Tr;FSLa-}Rtu_1?Ym^Og)aNthFSdX3b3 zif;{hGSNDWyJMmxhK|8Df8Lcir@-E>U?y{&l5aEM_R4x5BFw{}XvJ`5QB*y}zzQ~N z0cCA@f5$PXWVlNP7;vbZeVjY9cG^bc=y_`(*G6G#2|hcOl{w9gvh7K@VwW$SlS3*y z{8LRlsxsI9dUiIO&;M$VIqGz1QQ;L&-+;*-p3D0Ti$pp4fjZ`5!gLdxuatha0UTvi`K$&!%YT(&UhoLOx3_7Vf0oLgzHRDGruovGygBi^} z&oG(P^F#R*wRFZSv6CO}`Emr3od?NDh;*ML7G1%0@grOec>vv(3YSWZmmeFnD~Xi; z&0oPvSM@@q2ck2dABg_!kNnxKCAfW0TKxuv6ZNGs^>)Ub)ydWPnF*pYb#izqL$wFD zb0}=6!7nMoM1>sSPUSTJd)QK@AeZ^X65XSvfOk{Gaxj-?O2o|}4KBLMb4ZunQT&8Z zAWg~~>aJj?5-RC}g2EKSRPUr9w|J8ma%P0}q+OY0xo6X#0v!YiuLlY>c5ymjmlnq~ z5bRu_i=D272{j|@O}FBzv8WF>&Bz55kd%*(-_jM0o|8`j_}M_QdBYrB34?>8*cA1e zMnd&D@?L5K(EY%|v4IVpLp2*wwJWwlD4&78FmVl^`tk+8yf6Ta2E1G-9&@xJWIJxk zE`4OB5*PAf(G3K#5#~rd-GP-&>JzFf7!g5>yb!?-<%WaAc7rH4UXZO?;9a>}CyYox z6ON^~GZ>Shd#7)Zeel`?XwTGB#?gB#_{6Uz1MjQpZO`+2?MTv9l7?nd+qU^1A#UYQ zQj-?L?Vn`X39=wfR_ERhNyv|snuqB7WpMq+z#lP-#ny;f8~%iv$_{A(2&l-2tbFXf z(3a^-#RBl#{f~B@`mg}|!(#`5!a^Fa_8f4(cpin5x^K?JaRs$hqFq4ua0o^=iVszy z^CdlGY}G)T;lCyqiS$B*Dm+eFHLt-GiD3L5fw0Op1m=t!Q#1&zA)&zv7F{BS&0llt zeR}u;7hp?nqquA}@Y{aHsZ3qcvPvPK5r%ORAb})*xhH$Pl=P#8sdmEiwqdP zq~)Tqr`L3Ell5u+ZOIwh|0(>t-}D?Ns>mzQQ=PN6$zgh=hOqZ1ST#!M@hx40sDs6ns%Ms&gzq_?T_#^A8e}bA4zi%GiZU6qdo(UxAx!_* z2Ynk+Ox_1RZo{6KJbCkKq10}l)}|J*$@`pf+j+gAwG^}lx0)cVR1m5uGE+K7tbp$v zVLb;Ac<@5#OYw5o8`k7fm7%>y$a%-jn*(zy>q6!?Uv25@enF8dY*_#0SN*g9V*vyW z_1kf~TKqPx(G48cXq;^gl%+Df!&MK8y+tWgo5{Rpr!2M}$UvUYP(GnDV<7yo`W{CQ zxFM4PRf)E)zG|@Yl~@P2VCA87!#8ELwKulgl9Lum0~U+*1epR=%&s*Sz^Yma^Ui)j z2t&bGLmDec)IT7c98J`}(4h3UTCk2+3HOf#j~S~Y1BC0amva<`<(BJru3s}Y&x!P7 zoHz1*ka0$2ex}=eM8-;dMkpo8(EXL8T%xIC*Nkh#>x6HYqi9Z2+tmioP(%i#nscVw|)j;n0=Vnu%=*}>yO}xm&HYt-bGG=Td%Y<*o=1J6=$OiR&(W6d3mLWb zwwucJu<}t^WF?WWdAM3~by2jN4sc9RS7x4g{t*J>mLS9cg0KUfiad4zQTli-%<8~T zw1`mlJ0RLsL_`Y*>Hnj~#H?t9BXHBfmhGJC>e}#?o=-|5{Qdt`m0Yke<-l{-#Jqwox0~n$n&_K@(j;~LOmhh=urjtvaw|I0^gg&dO4UgQg@oyT>;|~ zQ>IRc#}2ce%n=LI$@C)Jb-OlhlY#{9JH#PzqS=9DUz_Jm0@VxXgdZwL%$h%DlnWy) z#bm+yDHg=~DbUII7WVfc>L5lY{>U+Bi6`Syh{fW`b^+sXGz^B=Sh;{I+ByZvjg1-> zj~!Xx#^&)>4K>l9QkTkT1Cn@*u}hr$ld%=y303bP@QnQzT%y|8BSUEs+G5XeTEvN7 zw}Z0Buw7uh@)AOalIZMWyy=!!UvG_^`hITWu>8?krrex+(#9ksr}8MNBnH5%&uouW0CO zNSQa#Bk1YS-Z@ci>B8H)tDUZgh)xxen71&GhjQ+5oov6atj~e<(+F-dmdS&gqxW~G zkJp8RwE>{f41+Kp@^UwvCpY#fIdXN@ur#O)OR}OgYKlHBYXV0hhBB$m__%!(;L zO*Vl03W7ADkD;%Hu`)aqLf~KQOaR=nAj2luSUT0sC{h%}^0`u@>0+)r%=^ZL#js3W zg*#a{tboLkhZ@WmFE}W3I(2LTcoUUBXl@kd}zZhxg;YJsf3)f z0}%T;_EX{lV}?@s9b9Bb;cAAznn zOR$okpgOqg`^!`GT0Dcs+`zL2W)k@YzS$%=*=wFcrxiHM#@$?Sr+&%Ef(ePsR!3~! zKf9mxu80eJjo{G)81<6_x4C!y0l^FYBf+P}pHP>;F4WEy^H)$H`(8lfa5R4X-PPy% zxSKEc63>bl<}#~saqfBa2#?|}RIQW7KjDFm0*wv6>l8Vmb|i~&x-~dHgXb}=+BbFR z_VwFeFTh2MIvSco^3A6F4hq5Aul~98*8f+!zkS2&)WYB8;FNi$W#mM z42j}PXq||=1Mxj%OUBYOi6C*jtMr?|O&dY*vUHuN?9OoKXCBYWCk_nttn|GcyVp5} z^_HPJP}n?=<;0BtY;sbQ=0}`0K+x?ic-vO<&|zcN(`!lgb{vv#ehaM^770dLswZ;Amu#qha?ng-_PrAwAxmZrx11v$s~b=eS29eGn5AieVpgVuB0 zEn480Mam#{wKhi8$8Xc6^O3fVAiU;_e`Nf3$7CAr6<5FysVo?I0A{3971vge_E zRox~V-{7`ZgRd70=B=%K=nSI9&mJ_(+S>TCU|AmR$uZ9xyEWnrGs|}GBl*_1xbU9q z<0%h#sBO6TkYy)&5pIT4=DfHA=J}KUDCjFi!&F8kxy04KLe7cAN-Owh{l;C*@0M%a zYbjC$4M)%1d={|swRZ3N(+kz^P3b+@t^8Y=XK!e!N~k*#hg`cu0#@sq53LV6Plr)XPdGd%Q(?FtFMOb^xNYao^(K?gbyM9l4@*tA$FeqyXXm-r6r|GBSOxhO z#h;qatunpOn=SiB<#ebJzc@8)j7`Fqk~#YtMzW}9O?s8QlXTmIvYW1xrQ1ms0yiqg zaf8b^I#UaTEjy|OEPl?g@^pC(!&AxsJ9q*;*%Vbqv z2P>XUb}v0MTu~O|-EF?lnpIf#du9wjGc^Md2JEbN1u^U&J{scg8v2h6WTQXHq&Om* z7`K`;Zr?dlOR^ANdF@E^aKv;1Z_Sd@q&v;J+1C99A+wGr5>IRR+nUUn%xQLA`b0?+ zkB|GnyOqcqKDzrJKaL z_OVer$BBbi(A`vC0BLXhb4Hr^bdU2xdFbBjfnr)?^>qB=g(IKYT$bjM zpn}R{+?eh~X+H#EI@oBC4!BFRD1wg@>rf0|U*@v{{sMSzLi2lDezWT46A*&crSjsq zDpAQ3ll{bn(`4VGbKDbB)it4Zvg{hzrIuR+fLT6Anaqd9}QS`hMg}Q+%-b3|mbdh`$8r9ej z5b<8q{1yfgf5ESv<2Dv%Zgqr@UX=1^=;}Qy2EMs1dF&MPahzwOWO3Jr zG|!VNjy;Tb72uaXa~JQH#wOz5JJ%DzBDco`T59m({^(NCORNvG}Wo;@m z9T?`x>aJt0@&-lV0mXM5G)mE&cGRbXZ6ga3j?Kho>41BPdsrn{{(F#|r38qRoourq z^M_IA84V=&R&M%qsI4U!R>2hUSDI?gKJty!FPQMK!FuSETfWsx>$or0S5hAlo%8Xr>!R!-ALD~R`f zJoLOChQ-0OqDpX;SM<5_3K}s@(Y!b3HTt!V&BFY^>X}(ZVE;mQKO}IOyYUYnl2ttx zx|N(%H072-u;5O`!%q4wuN|huM2aDX0HcR zMYGU_xdup;w59J>d;ex7`**N!;}P}fos2UyrVYNed1M5!aK*&0KHWc;&4k^IfW#%^ z9e{EQf6WPv=BFZov>0xSxLUw9^B!aC%AS3}7tWFUJ&sx;b+GgM?68(^@7G1Y4Q3GY zW6%+xxlBCURS$RBRZ^;geZAIf=<9@C{X}?qf;EB?L8u;}qK=YDqgJFD*?wAxg_-o4 zcj+!vF?lLU%5Z!%Z^?Pwa*>aSkzd1a88?3|^?b_;7LUF*+_0}*{FLr@mpiul8TY7z z*=?j{qXF(x%^nh4MO8E(?6>4SYEg##VJJdQns~;YWZ7Mr!1)@@()c?>*3?Mqg|i7u z_RPfJr77OjkZxWjHX0yXI3tP^2T57#NglGD*G_T^{x)ouNS-6!eixgFU&F!pmmL`A zFXN`lMypZtjYgwA0yj!D-x6%7XRU$v+uFIpv$L4r$*+h#!nEMz;KJs%{#L_P-#ABa zWYjODMXY-FCY!8yr{li+di=u9yY6k@kqcYMjoo&juNgn}gKdMH=4_{OZkX0k7Jh&} z^=tiPhL3qGmV!YCbh)Htx>&Bbz8Q1eRbu~~eEG%w7rCB6uUUcM@<#iYr#B5fFV?$! zdPhe>$HU^QpAIIYYVg%Y4BuGDxIKy<(LuOKVG0!t7Ki*?j?Bt2IabSU52p(y$qDRyeW zcZCxHtL=*$598qmmc(b(^#K*Cv)8x!M3e=3lYZIFW|?hYx&h2{7&2srD`IZsHY)Fl z#3;s|piRG3HWpkN=?uCJ*z2e~k7YUUJ!xsP$GfseOqxp83(SS-;8|Y*C#JbKyU9cA zhuxYrT0vH?Lt|q4>mRp?SxA~H{wU}z_r7;+0OKGCw$EMJH-6ZkyI=Uli-R<7;P6vGR1%_nl*i6Sc?eoZ5%b(8 zhdf@;+TLp&Bxy_2k?rpV+>deGO5iJErEC$gpTPg-%cck$xVk$CEvcc2{}o z_w_=^yo!dD=b9G%=HxO-GtGF_G6$Q15k`3+-Zkko_cMlJ<-g5hDI~&#uLr=o>UNjTgxSzC+%K2dlW{69cr_7RSiM-)GtUh{D zw_htjeGO|9|E{ovS6~HpUFWfWWU8QkfO_2zQ4?Qt!Ia?Yr^01v>;u&4xA_C&U^YAy zwW+>_&Oj2|i3)WqSObNP2`4SZU*2>5%!We056#7rpX-9o4d3M~Y>#hBL9WpyJ$c-+ z0XKgJ!K9#Z;q_RNGLz~%%Z5zNry52btOcP@hY3u?of5jedPWqOeJltWt~?hRarQ%o z`0`AK)F)+11&b?xb*OjqzN(RQ5Ja&SMGD=tp*X;7NP+OQt|;h)ylK3{2YCVrl@>*p z-z2TR_v`1aCZOqI$jMm-a5E(i$E_HpF#0afM5nhU}Q=m=kb%KVFv9_M%9EoJxKI77j2O4X4SpD*kHJ^nn-T`;*zl_HmlSZK$Tur$s{=&c6H+{jZ5grJL?f#o9)%U#UojgHv1S4iO8^?l0rZ zx(nVTktc|2>P!`xW+eCy41V7=WZL2xHzw>JMjavLnK92^?`2(F!>;=T)PxB%aGskh z&%A`Oj}NeeVa()fT@b0xO`Rx7orx<*UMx)JdOS0ocB=+27og|4=0gS3Kuts^@qJT0Mj;TiXZL z5r2OK9MuJNpkc{vVv`x!MaK_FcbGp$?%hf8!`$F-e5F#-Sv`Sj;FRheS!*9^Drv*`|6JeG7&r_kXjCZws!Fz^NKmQXDp939Df#C4w8E7Uc zm{>|~>|YOGgJwSL{1%9ASvKKsKE2|)&(2BArYpXdq{IjchTq8Cd#~b~)=;rETz*Ux zvmf2j)PX8OBhg7Xa{j^H-4xUx9M<44L#@H^vA}{>dG{(#!H8sHje0El?+^L^fBno^ zjG#Wv<_Du0HGuL6Urjz*b-p~8cC>06G`xfZHLMu=X7I})YOpDxx|$OxZF9TnaCCtE zDJse&hEW%3kMu@!;yv@IpUmXWUC{+jliYi<>S}|l!^GkRGVamK{sa-VbxY)-fC}e( zxOpR16gudg8h1ebXxfN5TVx0TF; zS?UL3oWZtcmV3|!;uYeq1H$V0hox5iFu0^f#61i&a}LGDboie&k@E-76{hp#c{T{A zI|jW&#`7q?PSS%Qq8Pn7Vb{FmT?PFhX?HQqbBE{V1AJrM|)Lj$he{ zhj?C$pj?Q0{`-vuG>=>q7b9)3II-&4YuJ@6IA`;vGGT%Qb@v9}g66%uW=i8G9!@;- zjA8X-VRL`4?4?x{B=9)RNtu4qs6d6wDc_4xpII2MVEA;iIWJTP%$9xu+}SeEW;daa zu3qWMu54NjBm6^1{&dMXWZPrDLSPyq6{;SQ-hhMA@_Sx>KkYaN$5;@aTj=wJ zm1Bu{xGy%i+sltbImpo#+1Vb(A)tJon{ODR@JLhoLE&i2!<}s(ntijMwiLJ;)1p=> zX^Q@uwS9kbftP7j__yJ+(8r+JFQ>(0R|#uq_iFdXPLF~V^JycoRggwwz-?GS*t@Bm zFeWU-yJ3N$ULb!f^E_m)d8E5zUPFkzv|~%h;^In;4aA?w*_y*A17`=7xEHB2GZA40 z8VaO3;=5D<_6;agFJWk-1!-;kM#q~o)_m@qx2TLB^I$>L68m!sm;Xr>@s~G&+NY|% zT+HlShugHxoO~CV)9btBU@k2RwxOLdihd1Otdv_BTyCRl-1ZHj;I92q+6&ucC3q}&9 zKd79TXto~a97M9+<{05v9LB$B^dtRpNDH&9>VDHsZms*Nd$pwt#a*;rDjr%dbm#32 z%2srvNtgTB{IGK@)6FQa{>c1p3-V}4(nH8knzO_+$q6_SU;cj%hUZ z$8ZCH;$7j$=}LMvasC$4TeKON={1G~kW!R;L!;l$&DgtZhS2B&msGAg?Yyfr1!>#R zk=#KUJQ`?Ze_{6qo?Mg?9<&}0dP~49#YjWU3HE|aAzje|QO4u-iz*V0V!1E}8ihx@ zkYPLcfrTrANeB z5n5pdE=-KFjfT(mybZXQ+(!ib_(7aNrSCF2%gdYEMw{xMb}tG9ze`Ep{XvU-(lfmu z9nWrgF;i`q=ZvQ|G|xkuX5wdB1x8kdKa*+9niC5+58!QMDA29oCn@0$8jXRs0fO!z zT3LD)Ld0EiiPm;R7kgl!VW7-(7lm%XFF!2dpmPc8ST{Gmdz7AvH<%XK@4$W#P${SI!XP6-lddMKm8kG^mwp2VVs+sR z@wc6!Y2@p-u=E&I=PrEJ7Ojw1pn}CX{7@0zF$A83Hk`ByVi?i@|fG&G^xau1w~>+$B`4rD*pN)N_yU?}bS4zwF57dFXE z$jmClNoHBE5&GC1A?Dyp&_hu8OU_a!i1JosH?KV;rX5BSXZDp_CE zPz_po*>2~i+|Dw|1_SV=0sux&=uG*@ufuHyT}Z@r197XfAQL_g3Yy!6)$bV%6l>;g z7hrwHkhzBONk9*v1X>;ZKNg^Iau}&cpEPspfLIrJYJ*I5g^Rf71k8+ih|fA53@^DQ z65>A#n?%H$!RoaaG{;T%jnQ3^Gm9_><6aSm<+~0aevTqmh@7(Yq; zDGjKLkC8AQt4ffl0j7_nfs@T66>KNj=#%-83;Oxp@#S$`J~-21TI_R~$J!_ey9wq9 z+**_bv0T$p`hQPr7>lJXWsGQahb39?G z{&N6FOOPieH%VLRV2PabN|mIub9(ca;ZEO(gEH1qLY*o|eqA+;s>{BJ>AUb7&r0(h z*AaD_mwxEr9u_aqFn9>%=YR_qQ+^FkaABrzA;yk_21?s%uyepHzuRwY3#soAlND=QDyleu6cK2eU#-; zXx7aws?%o@TkmTR?h%B2mEB;nnu(BJ`}t8mV{G#u4HfJS9sDfGv-b=+$y#c}lGk0V zQ!>dTEHq26#r%9@THz$m{E@G@jc?QsJ3%(zp`_OS-mXU!p?t54$K>QG!e~IMdU;~U zD@NfMUu*o^eyXo|JolB7u&dNf8!Qf@Ms&D!g!Y40#CTQUfPv-=YM_EmZ=YJ)`N;d% zDKPp7?kBZ*=4A2PWeissuXjUR97z>uYq~1z*%{Y`(Ubg@!GP__gx>^ zy4}$a4pw!Suey`Ev#q_U&&M>o&Py-*o0omIQ%>bJ^D2A&{`uo)14t-NNfxe|KiBxA-$mZ=F?4Evh^RUO~@%u%UwIh2op6ZW9HKV z{=T8uZbM(LA8EN*)kOSSnI}NxMLJT|b|HQAWZTzy#;cBRym!(`f4%;UM)mA{ZcRW< zlt|&Rf>JaOf;d;fmpw78tfSJlcX|zXW7^XHs$Oxxj7F|?Hk|3YBuEVR1Lx+{lxV5# zxUM4~@g?H%8{Do(u6lx@ON9FefB4?h5O7IEbWL{uYEsCX-CeL$b`z}d2fKw~H_5x9 zyBy6OoL0RmT|6CjDIF})l7$=Hs0CuLU+#-@zIy8T=vUPalzHavHQARDr*`q5LlD@-lBY)I7Z^MybctfJZn;s^3fU-`7=VhaAbEqS}{iKj25br zxZXrq1q^*jyRzl#n$Am4eH`hfvd9xKzd`|heEtuqdTFa>!nzledT9ij#sWnBH>w&*^7Dz2@#+8p>zd>Ly_A8sg4`F zbs8d79rz!qFS0CzsjIr6HIhx9_E1K1-SJPwR~AGBuM0Q~f?sdkWIAypPhOBoX?K8~ zhkZSkBhvABo##w!F}#gpwN&)#0`Uc=mbHmj!<{Iaw|dAFi8fid_~4Rz7kqK=qJrJ7 zGu6vQUoKw+Z@lSDb@0qCOr&)hdG(HpW?`YtyvV#OE8}P?pwPqj60xVzos3N6B^j$uF&k7hBOj3APD%5{qgO+p~K? z)ec-mFt#=)dC0pHvN9%M+!)T3GMu`K&aUkpYh7ExoAZcT-t4H? zHlR|`^7kk@YXkI&{)&XxnM3&d8CDfV{4m{8F8(Xt4*Z1p%Qn}aKTEeq>s(Mqm*}M5 zsLS4gJ@v{{5g0EtS~&=e<g)bTRd@{os70N_mI@|RWv~Sx$R0jbg(E*f7U-&nDw5yi3hpQiL2OqD*9MBMW&a_8hyw~=B(ta z7CD3(duiK$WJPd}^jV*f32@M8h9;C$(u2o(M$KIHQ}rD8<-Am}J$Xp?(xn*`F3u{jQxbN_3a~~!>$KNC(Zpd*kU`sAP;GNyXgmW zVC#$t8)nTz!tAegRJ5(OTUl6kq3~1INzf*A3rBxz{6;%Aop$6~Me~AQ?m2mUnfSG2Onq2%upqrolQnYL^f>+Sm5qyAcjqpIO7bi0#oyDZc~`-` zr*WY>cCQKjdNh%(ZsJI|b_8SsNz8gj)HgEykf8}-QH}fJe(5RpO@#TVjtC_$F7)Om zMlvobk}G)soO%BO%lO}9IJ||R#f(*VY5<=KcO^m%yeqIsuke31}W+TEdTShjfTHVsEXESOt~bqiCju$e$19DfSJ%c?U4|-y*+y1cnBY_}_*Tet z`nHsBO#G%$MU97s2=|Ht-BZn0@ia(+jc$8?PsPA2^0N3g{-{UGe)8=mD!0#^7%CI$ zP)*$wg=!9?hYsg6LMvb9_J*Fad)}~PWnp9K+FPas_a{f4tYczl9xR-1ZADXMx27t8 zK5)etNxOQ4U8$f;-=>P(lXTOPFN-J*0J9#@LTnJ>82g|Fl5x|4(h0~^QgS?5 z@J1%UhO>z@`UO2V{BB5xE-QrKIqKFI=rQB?{e#OU`9X`6Zx=LJPv7d966PHRYoAxY z_mnT(n|%mOrY0yKI##gcJy4F9O02w|A$w@(fJ4r~4gclb$wYQbnWS_mocWJlEL~wQ z_MZNnA)Z8k&ZLJ(bh5o!l@BN>m-Xc}-Z~Qf$a>`2CbKN-dD$);F?E%thJM|+%aZMD#716B&EJN{+pINawYwC8E< z5j%NcI$P1D?}YX&u$)6STK)Vg%4I5Pbc*pEVjjJ~al#+GkxXBP-?=fvyp7{sc22>V zI_L7eDWSv{r-<=AHzUfg2@I!(A)$5gN~LJvne!$!3)0$y zs4hKAvQo3mIc~p{|7o@fapb5fvY)(**otQ9lo^X$P}b1)dlw)U{fliZva5sih9DVt zBUJ2V-hsGBITm?(iNSUnCL->EV$pJe>@-v2uCJ98JDI-9y&*LUx8pL531|L0J>F%@ zZ@l%rCQmkTowiIT8BFNQm$exqao2GSea@5-cukjjSwiE=Cj_`i0U+xcXI6yz%GWFMc&K#ghvJVeL9o=g^)Z+2Q@^3}T zEE4VbT7q|MgqU&TaGaMqUFr`pqrV1Zwq32KsS#1uCOGJY?P?dWp5lxiocY}H+viIA zT---tbeKb17)ru*mYCxu$IP&&3(RN6^p~*8ZY>B4O&sjRl zgz_>$ZEpuutlSJ3+ zn5oxW3+ExUrCYK%n#k%3;Xkyp-FF(Fat3Jx|MeOJsl;29rXgLwy(%71KXy)wsl+eV zq!r8?s__@Km}C4oD*dWGHn|-Ve=B)W`J%YPBMsie5tkDvsq6?=6{$&V(D6SrqdloUVUpI;yQA~yVom=l4d zERp!*z&<$(m8+<;qMw5#{Wjzhgv{&ixWyd)!(f$-RGcJQ&cJLfBSOEITfR(Z5hT&8 z*pyFN#y{BjyR$bre3}S-mSj*Dc4+T;#;AMhJ@as{ZF*46GSQuqtUoKUKf81@ugw)w z?hkR}c$;LbJ1ZZDq7CDB1+;C0hV1P!5izd%ZE~^F<%9$0a)ybA&~KM_HErv%t$O^Q zM|B>_sv_iOF~O_x!v-;*T}8ItcZw>z!GKD-N?r)j^J4Fyk9Bal=Q+D1m%84ru}^`X zR~Rk@-jKBlbuN)P8hlO+qG5d=s)gsW9RI96Wt)4hu)L*Yt>=rvqfeG6PEXUfhZzpe z%)E2AHMfQNJTo$GXJKZ)npN)UaX(#pDzOU5F+hpfiv7?cxA!|4RYf{9H|Pk~jm)*8 zS7-lj9###cqnr+R*C$_?6y^?b{$ZlgSQcD|2omPai9gwZ=_i*O1LH* zQwT?Fs4El+e{I0TUex~G0_gZE3Q=6-Z5XB?j*KcExT15UsFaGsaP@yMf^pUGlGz%K>}4oL}Mi#dlZB_Pl2snhYCm zjywJ=h&=UaQ|yC%s~sa$r%98SBb!Wecg(0vEAr3t=ax=)Lw9g88%`EpdnguPb$1>) z{`vb(?K=JOjD0+9gu*MGI;1NzwCidpVhW<`x3D*dC zL$r&msGm#DV0r0W?KW%Cuj8+kj&6u1)mvMK+Z`^pJTLqC<&w#FV!R`ug|s>1kAkri z@>m+(g87rAU(y`_<WelJo zfxaODWv~aF+_x4)LJ5Z?I+4IwBOZG6x7sjk-EMaIE-XRB4f{4w1xbp?0n(b_l$2M zW72jT%VsBxfx({%C)|XXq9x(hB#9RPO^!tT$#j3@@`rl~cfYosyqttWu*Z(vbe=v` zo+8=bKo8M$+h9lxG$+(`8J`VA;X>djv4Uxc{1I)Jb55u0~MRr&#Hr2$r zh7~UJYv4%7O5&uV?SiS}@~4c#x*g7h&4G=AcdiY^I5zQJbmnJE`rEUAJ9Mhf{C&`# z=akOv_}TKkG~m{JSjtEnz=Ga5oYfiriR^Q8%WbGryLW4bIkB3^gOXHw ztr4v*-B&th~E%>xsj6aj*rFk?4z2&^>nIEJGz+rZt{n_+c+&{tOhhT*f+! z7FY9zL=1pqFr+WKL{pCHX?UrFba~91!bX|lgQcUw(`2+8mwdXG>GNLQ)tIc%-C1f@ z$5@%r-dMnVcY!pR)>EIEY$INZeInA3>{z!To6I)nm^aym0s7UlmcqfCDHnx=y?bRi zzcSJ2>y*#BR62G|ErlhoV}jV$MA)5dTdvnFEz|cx=|Lq$268`yIV*0PG5Ea{ZIJqB zIti6GdH}7YZ*CB3T_3KX#2ORCV)c|~er#)R^x()Y{L@(RZq2zT9wutM#D5A`xDf8f z4}bZQe90YdT1nc(6cGn)?yX&7C(YoOOBdOfPp0n&`%Z>|H=I|fBzl0rEfk$9Bb9Nd zAdL7#57)oO`?<#OIvHv>j?HnC;Zr``{8P_!Eo6guCB6htr;tR`?7?^N(* zI%seMM|MWk95n0F#}*@sd|i|z+-z$6Hw|72s7qZ=YUO(kwnn!auTXTRpkHgP_Cw77Gr_p`j#CGMh%>Jun5C+fa*00=pM_ zP{9F2rWRP5F|i-XPDJ>a4uLKS^Z{kiDfy>?P1JYRuO|lcnFSN2tEwSAL%;%RhoNQS z&~h2L9&1CPKw;--`-UCoyCQd|ro5>0UNQ(V!3(dx>o+;wo^_R*Pv7t$mdH=rEQF-} z5pj0HKb|^?zSgmh;ebic{Mj{Y9&9oS z^Scs6s0=&z?;EvNlKmv>9$c53vuAyQG`zg{DQjFN(;FC%ghFombrzXrsm$v{S=LkP zM}YqyW~4Ie4>e!v+X=X=1>co~;t7EEdq-U+B{6H+;=3Ek{X&M~zBA6o^jFjZT_jvP z2LgH=4R~G!(ETq>1p75Quv=GgRRyFnM;y8)s|jartN}OV!ApeqSK59^z&&xleZ24R zi6#8Mt$Te5JMz++6Pm;ZkDJghXy^%AZn9Zg082f}58Ldu-WfFo+f%#F=m!J^m*g8i z*>L*PrhU~4w%Oxn&%DqUkn;YjzUiqRStN{nXyOPqq}yZFmv$w3f0E!&)c!fQAZpkh zV3OTBl!S4!?e!(bVtJb~dV0&0p{f~ZfNh&Mc|M3FEYn4w0e@KG!G&&E7qvk$d&#`? zf)*2DlB~1f%E``~@TQ`gm!qCM^;3s>dD52!0ll0s@ZS+)`1)A!w!cmTQDMF&ixNW( zO`ufP&4tizt8ts;riz?W)|fKo-Dv`^nsmWqNwglclj%ZI*p9bO%$Bo{ybfpou_LW4;74p;qqEqJ3AGKXL=jrZi$J_%8D3N9J-Tp|)V% z_m%QFLs-%<K^@um$M<#;Wwh@kC{zs0!GaoJ(OQ2$$5WZ-M}e4eWI@ilwxGvk`Yksiy};ZDw~Jd_9V$I;Fp~uADks9&@OJgg^GqvL;Gw=+$)4 z1+G4der;f?B(I@kVazA@fSW4F>cjJn@}{7O0;cKXyCfjB zWyD)_2IpAUF&{EJT|`5h-kyIIRhmEehrwxiOr@V)GgwFgaG&zAxl9H1_aeqUENG8} zS!8y|to&YRg6Xo2wO8|3@?mG2S2V1q&0i8AcP}!bSy3_l2QKQ~J{tB@S2pPp0cH6Ki?ipieD9!m9V}4GkORl>9Bk zk{xIo}fNsItcjMl3tS|Fz;}4J&Gs5yyb=iX#S+^2uZ7QzW9_hOObic=s zlh>AB?(7r6DWZZ3%F?NpAi{rZ75k5iKgieJmm#cQsZ|d)nq{suCp`G~X&Y}H;6Sslv97Ct-=96{!}4{N`GRRhcul^MLvntv6@lllX4`b#T+>1 z1*<^aB8iq&Npbrfa}kad8nUFAwT6ETso)W|dSpK~B6mpLYQKQ~KH50@Me{|hwK9fx zF5E8a&Q7UYRz{$Dx2Q(MqWONpnhyUq>PhL6EzE_(1GJj0g1}Z=o+P{MRw&^=XMWTMT`Ic! zp^VkF4Uay!CuWtIUFgGNvs73Lv=7S_$rkfsIpTOYsaLD?8a>{YkEH{c6Y9HGYP=U}q1mA8R<3 zOGTCEi%XXXgg3Yr&!xQfhgkdMbzK0VkBz;Yi)KBw&U4$=6w2Cu9x~?r`{`8%Qn3v% z6&}WdpPrY1niq6G)sn9xaKHXcCGnP5gA+%1kFR-qn=r^GtU`LG=+*ROOG;;t#CoAH z#j4C+87)bvId~@s9{y|tI<_wWV*Gxps8CD7Zz&pF51Z2{i-$G@;{%@8p={zXf6AGi zxKb5^Ogf;Q!~dQfF#OQ+*F;{%+6*gh7rtPH%}()`w{DrbPI+R1yirg#BiNX&7gfG_ zQo-mT*cSw`Mp@{M*bnY`kiiy^|0s?7a?3hGfiCz}yRhR^M}NN~Df+|Zj+XVSoz@O< z`^*SU&%iwc{%#!<`sW}(&R#H;WSg?X995ukqHtHCv4_~=o*Rc+i+$!Ioy7TKu{YWP zcdqXv%NZu59h~>;A2~3*{+PD_yx)vxw(Xv=V?rov1@sH73{n<(zS5QVTU0(sY5n39gXx27vPhwolvX;94 zPTI3o_;qD@xTcH?K|}k^9nhvno{1MzdHZc&6^t=DS&r4e@ z39J8p?eyP3`nX~$%tt{(#9F`RIis)~Oc0R=8Ppp$8*d}G5 zDi9MWz+5N*mC>1)D;f6>W>yO>o})csy9SMQS&kg2E6LZK`%o@46;E{L-UJ7fU{;Z0 zWEjEH0qM*nH9aQXgT4@fBzjjV-T|z9zl7b^A;wKsyeL1@cplmLgbIDRqfMMv z%}_pF$y}e0tZV$6n{idOkIZ9oJa{{>!u1yN|I!|k*bd;m99l8m*vnJO_{W=_5=!t^ z^M|~;>c2|{gnMwj`O-5F7=fkCUsK+~_UygU+jx&2Zt>gZbFmfVRQkRKHHAua$O=6~ zJ|7MQ3jA%x3la91UH{pHE!e&ntSVJrP!6qG3mecz%y7V0g^d&fZ9Oe!8e%!#PPqjg zV7wrAs1P;*FS6n`E)x;Vo_~8lK}HgNDtD%1y?El)ZKE#eRisMM3Y=MBZCQID{1s9* zOgTZICj%RE);kNj?M}NE{G|XHsC?yFtjxdI{E-voC zp?O&uNMN>Rt)OgyRW8a#n6U5le(3 z7N{plB-2|#q6N@>s|u#>Wx7>0yu;IdnkdUs9rNN&&s}ydd!~Ddqgpz}{7!}nXQ5ssh zxqAEc|MIpMdmI`&AgDA+VUE8kKf#E!IsChE`K6X^sOaDd_Ce`2_JOUPVFW*Q_(!L8 z>6#Xx=|Srq5cUdbw}NFG1r+p16p2?YI`xY=i4DJ6sjh$ZvEHK9vOg`pzQ^^J2+n)o z(c%vAVV$(#ZQo@xXGUxK1U|YCnRY+-9M@K_%f2_58bRZqSglIs z4ao^sFX6rI>2GBw*y9CbHyl?L98K`S?AKuLjtE<#`@gF%m|VRQCtfL)_?CVM9IreY zcQ=%nQXZo^IQ~tly5_X)_;^-IO_0*ypFVA8dO!9$CBjdAQ0<#x9yd9tzkO3En5>qP z-h^G(Y@%&kwVf1OE6KcpFr_e<#%ITqu_5R;0n&a_z{yZfH z<1&-0FqmzPx%h);?Byb@vo3^;8emN3_A)!7NW+z1``w!&pb2jruz$e5s&pK6}9`#<^+KMs*$bB=dA`@VI)(AryLOt zhBF9Pfn6=1!i@aBQUaU2N87}|;!gkJo}*VGfxf2j^um--KdILgqfBpYzh5S6_|PEP zRP9_z1S`QKz8Lql(=X?zvh2nQ7;fHSvfk-}^lRF)XM+*qv-c2Q04&bh3-yrgq;N0( zKB8f@f}L~R7XGOqpt zAK){D_hskLoghDCM%sZninCM5i$&GH)!&&z7I*qDv=DzAjjD}V+K71G-DcK*)WFb3!(=Jf_GQnDP{@KCOT?nYOZKYA7Uk!kCx}ffygEab4H08fZb><-S@~cAkU3lJgR@Ur`^V}^>9@9{p za0&3HhB=u?_)@fUSNg&Hl{{RwCnFH$jt3m>hTegbOeRvuppI zN&l6CN8gZ?er@^zQTDIOeS3b%`???33py{!loIAFN6{wc8dzwRbPH;ypRAZ%N%Ttv zraUz=naWIr|MZJl{Fy$mg(l3z=Ge^siUcLXjk%2i4hLTzyAZ}gC-AA{0jtti z2Y%zL{#te7$D&=Hv1%_YV9B^h?7|gBB5pWchbQ+utGL{XYD1NnzQm0C%!m3|Mcqk*HA)o=I!qC`%d|#dkcG=9WRD z>kQBs%cC^;aNE>%)n-lWPmv~*MYbZ@+b6~g7L)fPg0sD}CQ?--@El@!%>~sPu;1kI z;iPlC$9LX<*E#8~aYCV8xT^hm1OhG9J=hX@DBx?;J&q7iWnfL%Su^j}KSHX<%pM}) zsdlvmj9?dEIevP+G%mR<1P^w=2>g>UfJP0d2sSSG6f#EyZTtK1KwUPGX2y4K$c_j@ z6FWiG17w z$U?Ib&&w-|{LZ@4oWIS%Quc128Ct|68fo*!?D?;(^CdxHadUIC4K*s}cH19_D~1`I zfBQDqc;}uSQdgW>x--$Y0hF^vi#MK$@7%Kwx$-x+##_f=yJuv+os)i5QLg^#)S_EO z=M@)M;41gl&q(r~RGL=>FG_tr-KfTUXNVjAz(<{#!*josN^8aChuRt@`)V}%I|x?} zhvbI1SCmy%N~Lvm*ByAIGc!|GRV$Td-qoN!H%nVpDxMLaHtQXz?W0b#E}rTAAI=)1+CK+5pD>y6pQRgh7u zfe|qmXjboC=MDz;(L#wbGBd@`nO&kxB)Sva%{)`Wy>=qy#A0DXdFfN$O>#pv#cl+d~Muxe@&yI6%JRDQWoSogVf;u_+K-oSE$m8VJSzFxfK`d!;0N9-q%U zY)=2wn^fjmur%$->I(+<<<36Yl6q*(z8cwIB|C{>i!e>>z4dNxBMtZA;Qw{UiX||j zf8QzFKXf#s{D9e>7tu>vch?|_p{wF_bOKVm($L4x#0w`K?~jp+#GkF++I>%djo1AU zXRqBw_oLSM_f&Zfd54yzX`L)C@{2u72n;j0P_2_!_Lr;iiWk8Q5-_tbNek}@_zZl> z(cTJ){>r0jt)&Gr+_s|9i;pjmn;gs@sN|W4#v9}vDRJ1jhao-jxG3R8dTRZLciZ6q z2QB|DNhvS#q_u>vn?V6oJ`tcCZn0z=S|?Ny*j~)tI4u40J`_w{*&=k9X1F#V@Lj)EcXr8 zvFlDZ`ZfvKg;qvHdJB3rDDJO&PEaNyqYQ47wjNY=`w#3P66sD#pI4(Fbm;sW^2(^| zM=4bAHR;gW=!oD$2fJ?tgI9?RIs;{Op|!Q8dgov~^jYb6=H(~MbVSA%Et*b3OObX4 z-lk{w_ZMwKb9pEDoWy)}hchx8BoD-5+F12Z}@wpH3ZWq5P9{u~s#>Xd%eLFK_TZ}wO0yRdzOvH8Ovmq=_;d_=iw z|NF>{^5c>T&2lnpOVK05g(c+aayKzyb4XK1PALVAF40r(QVZ{qDUB$;R=nw5tT`>!QuOimO?sh#+ke zv#ns&nLFAsRLpyN;wJxa2USB*0cUn9yL&0P+}=(SoOQBlWt~k$1vku8_fzaK0;W@T z(%R8Bw$M%4KXld2xumft2@ZaBwvJ_zPoFO zl#^4-em$6Tii=ZXL@)!%SXKVASwyx5nb)YYsPak^^Wz4bCYG`l;uy= zl1xhR+AZ3%B%Mt(@h1$=eIJGNutCA&TkR`@`Kx(h{ezoWm%9A7sl?LziV<1YwL`i%KW*hR06Gpg!(qynsGtiLs|J;>{I`P<6 zBLTD+=&S?g{}fAENCtiH)xK+^sB5(19dI6D?**TV(GI{}3tuD&G!4;-S@IA3p%GD6 zQB-Kn@++O`q}g_W#lEym3yUFAFz+i4Uq(K z+&diMas&I}!#t((Ce9VU&X^7_{iuOYe&OTq#!bCD$pbe?dm=g=Gol6WR%3JJxHbN3 zlyUL=sCoU3?>m|thF9}PZ?OO~k3h?tqwp(sEaR&z%fBsb zK8`triq%Udl|8SNQuOIzE7i`d`N4XZ8VwhsA)8OyN zrk+NBBpp&lk64SJN&jmQzA7sy&IGGpG>ZEd+g*%L!Wkq3*miU$vGy zzPn$3-`)k`vb%(xz9UA^CK9I%0?BtXp~=O~oGpqqEAU=W=}*^?Vp4Ae0LNqEIkz`u zJFVs3x8Jy25O8i^`xvW+)Xr@KiJitGMe~LRgUYCzo(WKYc^sOL@wV8X_8G$dpD9W1 zwbvE`VxZtz?WaVlo%cGAOLBczTJ{GYQ{LRH&rR-U5w1D+pLmPMI;4Gv)P6M+{CcwM zAS76RP7s+on>dn-ZlOf~n+l)p3L>2(3tZ|tG&p0yFeu7p|hrf*lqD}l?gjdi{AHFjG`d47$^Gfzi zg<1GOUi$RJS1(mGHW+9%gTW)}GBEbtD&i0^rG<)y$)=1WOK&-T5=595VCwBe?kLgn zb}U7s5b<;Hs}BHs++j-0gRh)(tm^TewBjj-1->mSt4d*!t=D7~C0LZehKLigd)NW= z5GAw;Y`pp1mpibcjSxg-Q&m726+K8mschRw@=j%NmvW{gP$xF*g3&#f9T{tf zm`Paw5lvHS$5QA{EWR(Rb;rEn+axJ^Y$`kZy2>IqX0Gn*M{wjnrcFKcF)tIy&EEgy z-E{P(c%g^Hd-`FC&Aq$!Zx5B+h|iQV{<0pL5Zi~8(Wc6h3rJHPm2CrW>rW}|<4F5Q zRxp^n#$U1%mrlU1n`$$C`tU=?dCB>*Ggckg$CKL35P?-dp73=+_UQ5Hw3}5@d`9{5 z`KD~cSG=9qc2WdY(TWiDr?MN>_aqo>dZe)%ma}$=B|dIGLcF`5=;sRB73l{>(HA7K zA&ZZ%e+Qu-0aprzZruMdNrySLsROBbrQ3KlRA7R<3&A(VfKfMtNk-emCNle)poEHw z#FkRITXB!U(oPJ=*O&0_`7T%h*HyqE)|TSf6JckY4B!y@u(sc`2G|G=2Zw>Irv0y}@4x z4~DC$pp%XWp0{Dr;vvj)5|F2rd6J)3vxA`A+-#Hi#hMh=5z@&*#fkoJTIV?rqfV@r z$73ZDe)n8vG4j5Cq!z#wU$p7hd!zhU%X&ZDdtGDr=XMk$`0YuZf*V& zp532NnUFA_{QR*>^H7r3pHQRxCuEzcq_8I1L6cpCVR>sH`%R?mpz7vm9pH?w{@3;W zI4NCurCmQUVOJKWx)>FWL(-UC>Sxhj|w-L{gH$ zZ6~w}$(TB)WalJGZkCcxkHsiA&DlCV>?ZsWJCbn28h|L80{EVt3E?D85;Y`ar3ITnsoaNpT1mv z3r9f4atlQixt}#vCw3QkV8$bDMGrh-KBJt#v(!Q>O7`6y+31~{Y+AKWUF~?=^S%Fo z<0h+b-}JjXLi!~u&W41Zb8}Kn7(NnQvH4Ms^0Pa)PdU*2Ma)AloUb^=%NGivfDik` z4?Ag3=3Uyo~vh9US|H|{rzkbcz;HEZmGmDz5`} zL+Wu6iE{MPql8=5fcQWZYKYa0iDeNMgJWN{NAXvp=p!H{sZT_Qa!eN5tS)aD>@oUn zG?-L%k~DeESH)h<%*;V$)^waQkZrL}D}kL~BUo5Es1`B&reOEV#^*Bpv-w>;`4D?u z{d+ON^$}uu?d4r&%Qi9B*qrDOL(3)JGbc5(k+N)&M*;NpK7qh^6fJEA!?N^pQp!}k zDR8PnwmuUHA1^ix2r!E{snOm5X{Yl(sfV~1tGyq>sJN$IQUeuIB~J7+p|_k*O>Nlc3zi0Q;Y_0Gmg$ZhFjQ;Pp;1M#u$yF! zS0}7CpMEDthx^Ctl!v#$390dm%Z$NBV)# zJX<=2o{s#(gqNZcF!*%WVRZEN+!->Pz;xuNNAZRtH2*0QJgX}18`HgH`iI@t74>>h z?wL(06vc%HCq;zpZ^+U!1^bIhTq1J^zqq`)1qQC03?Fu%W~}~~ZPW7sy!sK-qN!@N z*qzAP@v-${)~o_-_LgXp81}JK)N>D2j&l_A>0*CPFRg{qDZDcScR2C$qvp2e@#@;l zK3*f2;nKHAVurL&u_yAzmA{=o6LPQE<#I!x=)!5&&^>DRdOfaCg#ziQT0NIvs* z(5RtwuV^MpjEr!@@B#I!xPy;BSbhf5B$myM9he*zDn2I1zyD;rSj5LKI@>)@rw5U> z_GTI7-(PMs)j28JU6#xW_!t!uK&I|%Ncz&}jWK4F^p*k7lQU)yZ?*UFDgy_;rAjBUbl`C-F}&aVi-(j1TS;+^LmoFW1(cf^1#2v+uXni1XLnK$G`8} z^#{EX~v#ePz;ODay?DQi|RU2>l(_SYVeq`G`yvp81_>rWMbvMqS9O9jB7G+yIvn%Tmo zFH!MORGv6#&23Sz$s6;H>`zPlu!iCmQPusSn=)_>CZ5(x-RDinG7U}SHfXnN)r{@l z<#*I;Npv9j_Sl6c@cenxOWHq6f6<(_Kx9~!zgK3YGWRNKie$b;+*pumBgnr#yOJ1g@O~I-N&dntrAK%* zLgzbiMc)font*Ks((^&r7+3p_Nol>vQqG$BBXMQOB_>x!Su-7RxsamPB;$XHs((z5 zUP8S0JRQ*^rud3ROG=_9MEY)^K1l^fkJii5UlZW~d9EI`5_c}$-qm-#{1IV4ewzb1 zO^d7GpLxWnl`c-C>#|YWr7c)Dr0Yho{h#ieE)6&E-TV$vLm8}k=YWN;Mty^ePu5Y4rRbR;pEEAq{peG)*6la?f19u?z>Q*wO49@ zmTXLnm6r()J-^`N zP~ah|j3l^*+(5)6h$z%K$lTWhdq~g2ECy2$nHgpt)ceTsZ|<@mz$9Pd2n2>E!s+q{!$qg6)W zqjW!E{fn$fUSuoanzQqlE096vepTR3fG9*W(1^NvitRwrD3{>&9!1{ZyfkFziZtlW z;nobw<>>7poa|?j`H*vdX5ksD^=tz&utZ0xVKwAE#*v&Z+61z*0d@#qsFlF9{v-$4 z%Rxn<+a5iIr;=z2bWl*}=Q!C|`h)6dr_+ONN&?R+6`%)ghTzW)y8Y|R*dIB%*`Q}@ z8B!IjlOVI8ztH#}E6;PWv5N&a!QK9Z!O}avM4r~37i39vVW{{RO;#wux3E2(l{%YW zz+iJO)Miz_(2l(KC|imbwGk$5>(9`u@_jCi_m^s$$jI56pm|8D{C@IFxVL{`JfZ#y<9~GAe5eSzBl(QiPDbWF$pOl#&Yb6qQ1> zkW@ySwW1{27|K!+g(#JgLMVG?nB~2H?|c0JALfHEj^lam`?;3$Jg@U=y!D0lY1(g! z)y!r!%hKg{NvziSXci?Nn1s4mQ`km*5eKzRupTA%X{IbfGgq1#a99l-*AL7G^LfRC zj9O8Wyf6=Wpx*vnEAmxDO$BFoRz7_P)PEJ{q`X3waxDBsR4w?Yd_O98aK8<&{d!BB z>EdIM5{{$c0G&p~hq7Z&3wg=@;<(;_+550B;k69@_4T3sPiEvm1IooBhra7Z<^65a zBSyYzoB7#S>?$o9x83~j**WQzZQ5J?4z75Oa>IjM?I3Y#uoZ|~2v=#rd>346-zpg# zuU`} zLZYJ-BmC7wOP$-X9cei}tCSxcIsfF3pExHw7(U%QL)jqk6%Sm*^lKk?MK-c!ERL&7 ztftWVqYrx{cjFhop{m>4-fsH5@!2u{P;`Mr$Gi4{Z^!4TUy~U#E09zezbcNBz*kbB zUasuIPzc-G%e$&x=7I2EQ}FYZ3eSZAu-`_fw(9lqV2 z@?V=zb!M#jUpr3jjY7mzjXkEFta__3y=d%`1t3XURno>9WIf`{b=q-x6ym&Yue5to zG^FF{S5lRC+$PwkeO>e|xkv9lkOBwdGGcTh^JLgjs0-L8NKr)hV*Jj7w}e2_gZ{sJ zzCC!4?0q$G(c^>5WZoBG1*h(2bd-A9i~P!`)9q84K?7@-zrT55?Md3<-`$+ii;C`X z6_*u0&%~H6oC`=Y`2AdVHbC;24nH8GdZt|0oY)&+4qqt_N{ASIOL}~SY_M_l>cGu^ zno>UZDzllJB8ja=GKfibCQ^|*eziV-Ya9~D%Z~9=oU!X?XkXgl!m^j?sp5gT+P2-T zuHYbmHQvj=lv0l+;R-V(qmHcm`iM*$GJa)$4&`Z@ih=#GC;pHG>NKq5NE`Oc-mhZY&Qzhax za*(-C+&zi~qb#$EFnCOYt^u)^*F|8#h#zES`!AJYw;e&0_mmtgKkhs6)9%#gy>F}Z z7tVR;xmK4nQIcD22!3^1Rcv)~qyAv_DH%)6YG9aghaYy*eAqSc4Zerw*5x2~4 z*s5LA;xVWA)wJl!1ZRI?31i8^V9}QV^2`=Xd=s{PwY144aSpd#`Ni#9gxXt@t?wYX z@H2D8u(1q&()uhrO)obeC8IqA6Q$DJa*Y7)`y;y-qxJ?Gpd2$XMW?y%GW^@bO`Z>z zv6Y-;VU#~|CO*#t2`{te`g%OgRk-2h*(-@3EK`! zvd!T*Up%nU6waJU{3^~i!qh*|mJnCAA!|((SVjs^W1upU7t`_}i z6r~XP3-~&tU&r6^DsoPLjnWq$?QNh<><>KY@AZm8MqSu__uiL@Fk3(K=jPW)B*n%V!Sh%_g-dpx%h>*R7dPC#`k`v;Tz_28 zuehES(ZO0KmX?Kt72;PcBwe&FW~P&D|LN_?zO!c&RfnD(d;ibC^PI95qpJpNMw=YW z2*$UEpOqY0+-;j#87s<}JNiD#x?VANN0jVX**@8^s}lQXUUH}IpX#=XTWS6DM=DtY z%wuoMvV%m0w$gO-c&DirBWB_3fFxee4+%|S8SD^)i;&xk>@pv?pECHs&sc?TO5L}F zDGLr8`S%u{c3lkM^WsxF32n;VydUUa%NZ46&!3JmR4WV>C1WB>GfsD0J*;4|w zlXc&e=2TmYYlrPSVHH2AHQS?^px}$;eo7H3Kv%8y!&&_}=E30e#seQbg}-mbKYZj< z6zj43*Z$OhE|XTWIfYEvH2W(}r4PX}fi4&s+Bm2mCtBkAeaqvpj&BznRYui;UCf;DOks$D*Fx~!3YL^yF}Oxzn=qHVOqZxv zuL1)ZQQ;-g6Uf~p0msNxl`1kgmW`G~UYt+Sx`E}+Bf7eD}2_-vbL!2*}0Qz^T~nbE%JO(WMx5bvMKKx-R0)? zwNv6kfT!_#?o!ZPdQFTSNBB&@xdVS~j>tW@pJJPP_p1NTgxbC{mE$E@^M_wmt#yx( zzdSXrA@N{=!S6q(w;emqPBpX*k%;}Xk#E$mM>W8f9@@=T#bA^7@`Q_C?{2O) z5h)VEyJlH|j{UIraQTAr`gU>my=V6oi=1zZnxpHh11#eeNR{JelhrQf@yqvcBgzbA zNnhWlFq9*(ug{LZtJ^k10dCxQoJ8LDsn7bG4gp2Mn6!G&1LAvih>=Qng@f{NNP>Ru z8oW`Z$IG*C$}7M8x8+V`AXPOdSY2cv#IK)+2k}2H#a*Gzjx zN)@P3lB5=P{(0nwVq2u4{I>VEE#jr2Kp;8|w2&7iqY@5ibvr%KWSt9GbN~Hw4p%`2z z78L5XiDJRz^{lAUxTot|#A^`&5tqUZzj~Z@tzfR{vsw~=pC`S0xrP8IVCxr>8Vl)( zbh@$E5qS(R#bD(wmJKA)ZfgsF&^Uu;E$r*JH|Fk`SsvO|rlt9BbX^Q*Q8G83^U)dG8JuR-CWpM|?K0K6^SiJm|{{x&1pDgpGR*vDPfw(V-N^3TF6p zi6gvTOufMyRV`OJJpRdM+X3=e&{(5T{i%Z63ktac%d1pK-%o5JvR4w}Cm9x4?kC7Z zPg~|bJfrX9FXQ?E9}AA1e`@Tq6uGbAYU{|W^*{DLoN37^8qdGSKlNL5m0xHJSJFvI zfNx;roZv-4Y1Ud=LQBPj?Xl!RW@7waXi^p7RSjLnNv zQ_8vDkaH~U-rs=Y(uu#nFWDCzl)@C0&EjG=%!&_|G1*2pc=GR`kFJ6BtY-ix)H;lz``y99oR!mw0`{EJ_yvkd~f?63(-xP zB}_?BZW}1Ex@*bY&%gNOp1$p?YWwz2vd6;vzJ!K7Um8aU4B<<`$fre2+P(Nc-0`RHoVWa!foKx4uY^gg+ zfOF%wd!4dRqs8Jb9}YdpD%2<{qWTww>KQ$7C)74gz4HH6aOa-XgRnlsYqZUxYx&>| z1u8k3kd*p~zY5G9`n8|DXu)#jY!66*4hgQ;mb}i1{fnWc*qWofNwuV>DO(3x2AbT0 zA?pp~s-CnsECZUlz-beafv>mrp71R1_PCN?Dsx0dgvYUZw)~0eYZ%x!dznfX!{bq< zS}%b{B7{xvLkjnuaAiR#1b*L_)TD+5Vk<;Hb|n|`w8llI27WL7Et&J7t4=s^MuK%AkX9RrqKH^VYN~nd%zE-7Up#7I|Z^-@;j2mbHMlsN`-JO=&U&0$0R4s_kD> zDShtD%wv@oeCPD<(Z zPqcjrL9;vfTcLD?u*)|^`;5SsKs7q69a7(d;nEns81sfkFKNz}SS44C3hRr8Nf4R~ zt!xa6MV91>_a{vP@|^(E-XDGg^rq@7n+mw8zvJA4O_^-Z>VkDem{-}&;7B(GP2s+z zNEBk|bP|qPV7ZjQ#ekeGqU`M6W1KC=+Vp_9iD1Hfa2=9>S|@t9Yw`*NmM{IlwRc2i z-<0kF@ZC$qmP)$)5N%7u=xuz9SIiARTLQXs<|>i}R-e^rZGW2$o0v<6_;d1qPW*WF zTq0%3i39Udc+x-lb1g(Kq8@YJ1oX5=&*iBs_$ddG7?IaMsmk8j;9qq?A#I>Z_d{Np`Miu5e%LZI2ftWs#wk$z&Uzc1HN0yNwV)w?RJDPb?`KUf`~w94U&h~ ze0vxye=S^$4Z3U}zmoFgi(1M845vdHiU%A;jDDRsr~v5DaVJ&C9=aLq)<#GNI&x5Y zE6FxOb0TekKbiH}3ZY#79{ute<8^3ScS#5ON>IshZz6xoPUgDqr-@wVnF1HjH7cL8 znPE`5t0i-?LI>u3efgRvV3O0NPppTP$ITN1Y)eRMZ;QdR3zqUQT5C^_26_o0Z!a!? z!GdiHDe8bP!|5)sR@=bf7bv{NtmDg)3qCrT#5=0bB^!C%eJ$FcMI}yl$_ff?m=izq z7<+dLpDklPerpAI3oKRvlZ#L`tFJX90}k{9*NOD#1~8UKe(zsR>;Pgf3Tg9UG1`+Q z5`)lApjVX7>QmU6ye^lSw%@Uqg%KxUq&HcCrs6`}ZTDuM9F%Rm@ZV*54?m;HV~;TW zL;zU<)E5IKho)95-M=nT7ZgbNFBy1E3e5OCgYMIOE0MB*`A&wtRUm_Z8)F5|K3Rq@ zyH&~CySPp`QXafjU-t1I|L$Au{oj@l*ynWyW>_+n8_$1t!~)k7;F%nk zvQ5IdgcO~k3QfvXQRWgz@&!DAbVm$Vkb;`vKXN1-H6QI#TQDGy90{JEuU5-K z=_35tq^pz}NM6$bO9@Ix!J`eTv}0$EbDtJ@Ud?#6G^#YMLGWX*rvt@8xLQZd zJ34JIGAJwq^L35tV6FsDMJ*VehW4j%qhQeWz>^+5F^7)PfesOex(8b?uJW)aIpO3X zUy6jpoX*$Iji<(u0FB}V`=4!sK(Po+=HEI8z)gsFqpcJud?F+*-6m6a50yvEqcdZcR}omqxE_`GfjfnJiiP`{SQvia;a7`2misg3 zPq%bHjNahdy+q*K=30ZlCPe0&6LSHclgZ4OQ)%-T?ZxX<>7|eQ1FoY;V&Yebs!$Vs z(Jo5TXTVc=ElKad#3KgP_Fj`|unck?a)_KPDSrZgtB!32CjB%FQ{A>pV;GzyLAK5vz%N7Yv&$N=>j$HoFj%&x zKY!Iw$h?`h6YPDjMwU_7w0cx*V7MLfFQpLiAH_28z0*^^jsS`MGH&2&qE<@+RSG06 z?Ss0K*#Ue(@$5wEDW=`Z1T$Z!eeaH6T>g( zzmRpiEkEjCs^d3E!SVG#X<`~5&8hy=8emWr(qOZa7zlt^t9$A;uaBWQN<`@q8uj5b z0iH{y>q2GHiSO@XThGpzM?oaVi|u+o6gUPquq5xEjY{~r$|+ z$t%Z2yGKg0stugJmTVT~7x6DW8jn&hP_9$^Ti}R%aRM(vfnEHD>6Ra&;Djv#E4qQ9 zK0)WBC|}AHsL#1eE>WI-fxvp_M}jmWJ@>(a|9yj9?Sz|pFIw|tZSR*++dr)Xs&%na z?fjVds^lBD8`S3){|@l8DJmHM0RdTWV!m}oc!_YG@j=#}zn1+i;zUC-I)VUk_=eK% z15;3UL-}*w7lQA~9tS8D3nZ{j4FcXYu@*z#c$7v5O#)K^Uy(NJwwdVWRKKwX?LPl$ zuM^~&#ZRl0545LUttP`wQg*crcphF~6SEA%b4gGh`7NzC_dAK`93>jbYGqwDoY3|V71am@l-U|$Q`1uK^k*^Q+VFU4)n9BWAeFy0>V zlw!bw6e5%s23*rDUjWXEr_}(p|9i zg&nj@TY25tYt7>K5krfasDmU^ntBMB5tw%oA$#o#re5DpJrc=}KnY%kqYr7uB`aD5 zqZ_)wMKY9A3hwKNBY1nv`?((_EIi+kz9yWQWe9)UL&Bkk`}>ymE}m=2hWd}%>w<%N zo^dxu2+In`w>2?NgOmyxUP{3s#&(GOk|%}=k8O~w0IFTUHWh~@!Jw|V6;#3Zk|tP& z0bPxEDF-=0vUq~=Up zs=oHZ9xJ@X2-J<|-z#K0F-*zaNK>Bfn=c2pjd ziTEv4kNAf82!>Ob_j&E!!srgs>T5&Hmxkp-YInVbK_jdu10|lq4TMtNGAOK%xA10?_@Q%`?~ zNWqF18S+Z_k{4p^ra#ig)dZ_6nV0tBlE5*^B|xxT?$u`Oaq~i;>);q&;=a&PDln^B z5>q%VPVXe7|6nd?Lvz8sn0tb!ZH8-re0Is3(VebgLLy~o^o$!rJJDgfNBU;Y07;Xa9rbdEx7O%^CB<*s<6{rWD1w(bqQtm6ArO#4uq_R(ywTn8g%uLvzYIe zLF+X*ppY&J`uAY$YM=I$=%b5>pwD2hN`tX@6-tVquGnQ$LULtdSUF&DpA~6!wpIw{hZo3!oIXzd&d-kpEMzjXHwkG%c1L>q=~##oBs zxd1vuP^HKGUPv|rq~1=t7qGc}x7hkm4-y+&H~sUshuoNNVSWTqjsjoSTmG4;{xrQ7 z))x}OD0hg{Lxk#rYb72STW=Y<5qV$khR&$I{I{<>%s5O7!!N$6(@R=JweI+Y2FbK8EBnawd?qhJ2H!47Sn(>ri3&U!hjC3)vOz26huGS&OCz zb;AX}w>>_w_kLljzn$kb&-)2Kn*Hr+hY!2Gux~%+vCTf*q};`OLw|{8bsfLr4hHTE zL46^(J&Krsk_jW}6vSWI%%r|*&m&4U^seIiDdgfv=x7Lk7v z3rqP@n_=vrMtn_EyRK7j-Xp1lN`VSeSniV?py%F{BxDiHE9j+nRZcDor|i2XR`Vp9 z93<6xVkpr~!n@TOVJ4@K6+E*TTDK^V%4UTMbyUdvJTL|Em`zkY@h0w{CKk~3SG^tF z7nZ1@W$9Z*^RWh*A~2D+O+EyrDFn8W1?DSuq1+oI3_(rs$Jrzr618ihxQnC7jsJn6jQ8`!lF8sInC}Y6MBZ z7hIOWkC-7>0}NHU+g?a@PQ^`MW0vNUwv(1VC068UDDv})x^v;YUArR z7o6nC2=CZV%4gQ=_-@@5w%gxZ!>87Bm62ocHlETeH4G0ZEEWR-CIy33cGvrSfa0#Z zj`2>coeUJowvl1 z{#F^U7u9V=$aK8XWDnFmiDTXs8DACY8GNq0YZiZl7xCemaINs`>1UDe&=l39i0*g3 z0t6`f%vMRTM4AVCt8}GQYo6I35lDAhHBJYFRFqVl*v*;O)$2#T%!jbZ7PitQ?efR z{$oWn5`KoC14PLjGAar(< zG<7~?^~=wLb2Aa5-5-?l|4v-DIdDb>0JcZSeq(D3el@Xe zXOI5FwFD^S)(z35YWBFN@~%!RRLO0lbhP;q5T2E35k9 z&jzD6{1sv*TQE6Po+bfXhZ>u)7=GkxWbt5l8m zcPX|9wofm2z65cNPACo*KDRCCuf_j9Yl=Rhvo>A7oa|Y6dU@lgDf`Kght=+aBessN zR{lO7vey>y9#7dkRqUBshOZ^R*FZzpL>wK?O7OE3#b)P%MH$;F^7ud*FAa3 z6enE!)67uz7Ji*_B25}ANC-wC@XY4uhfHxne4k-fmFaXu<2~WcV9`J6ig{mU>m;5C z*tCN^+80;hX7XRp=d44Gmp)uUa4Aa}<6K?TP1lGvmc4dhZfsaoYZE?T%$*6{#;H4oaykN+j zPl^P$V$lXMNW|93!g@s?c}Sv+4OjG>KG(6AlfB2xL5fmqjytK7Uq{n%eJogyI-hKE zI4Q`j_48Ftsb_~DIY}H+6#1(u{1v2e8rG~y;x#-8Pq6CY-Jg0{xuxf)Dr$%*yCH=X zc(s+_b{;#o3>M956QLl1i4@QJLJb%!ViK^h7REjPVW2NzCP#;FzW;4oZcK~n?9Y<3 zPZa;VYIkkP2H&5jzAX?|?3`luW*$G%JGrsSRa>;^IIPTwz+Qv^-cOT)q%Oc`PHp@? zs#P`MN@z1;YPMr|DF4e)k25S)Or>>K)x9HZm7UbSX93J!GP>cDj zPv@NG0Kb{U-oh)^HfyS0KyZ`;i(rb0o0rRe$rsVrQCM;2$L>`4cemkPE_Xm6V2Z4k z+8mR4;U&pUcqBFE)tMd#H|zDtR^{|NPgNG8#JVRu!J&I;Qu^?TZk>!#0u%K_RfZ!lU;KP2YKm7r%S3|&fgzeAi>zCwe51bSjpHZz#0qPg~HbJGG={jiH?=&XXC zxqz&s$t2au&}z#Mzx3*^w9NXloPbm2oS@V(lZ0I>T-sk<7bbk}(r5L$smCO~hM)X_ zKXYN=)WwA7)JM!Y*Vwci?oI-@-W7+b?8jzM9|ydhIBILGn9oU^yUq}pNMQfIts{v> zX`T`>_VLjwky4hb;Ar4hT~gi#WAVHV>%4W-89RX<;F|vQj zV9o6xtho$rA$jYOk;Ivb$F(jQUXgK+6(1A_)^>hS_g5=EIUIDL@_`Z7S@-nfSk-#P z2TqH7`@UVmr>0~6aSJ3N+Y}Jyu#`c%sp3??>jv}|Jl6y47hWVyTCImbhfIJ_ z;l=T8bXA4h#GurSNraIU)>UTFTgJWF)FDQQPzpG63rQp2q96WTK*Gam^6|4=(Rlpd z3p2NU93XNwlx!pRQgSWrNEatBAdcN1${+9Ks;|2Ywfh_Fm*c0!B%Z&sZ*Q+) z=s=5DFqs@Vsx%PT_xsF_&jNY&M4x=ERNgQ799+d;e{=Tg!Ztf^o8Wv8 z&-{;rj~9;btR3y18oV7jcs0Lwv})Fi+hWyYE{s>J|G?+XD2#6BzISC3(q4?&ubi0j zIGJ;LQA^iwS6K`D5+hDB{$Ks@s&1EbQ!Fc=h@YZtt%{L>^m@KkL4UR7UEVMjXp^BU zmfp;;p1AUnf24@QE)qIpY>E|Aj?isRWe2hW50`=Hg-CP~`16FQXYT2lM?{z^u!f&Q z3v<5`@X@;s5lg<5{ccIlvuEgUh*%66$NE@#>NG3n!ehdouvsrk)*BVIoM%X*$rXe2 zBH^9y{5H+%2NSMdg0h{*ti?>k{|&Vf>9VdcbU!ccIV6&(jeukj=Y9kc(4u0FC{Q#| z5-&FY+7o)^Ql!(!k~yCykXpKgYzvZpn%<6Q#PN=&2%jD?a*qHI| zo(nR&t-qK4cyTemw_$Fyfi^>9jy^Xz`s?6WXJ?JtZ< z{0R6sO#<(DSHLUrs{y*DXzZE0w@_<3gZVI&UuY>9@2w6mv=ZD+6CVCwl0B=+MMR5} zX1CS_5ulr4Jlj6Tx^(Km9$>Ffg~lEUlk*TclJySo{Ioo0I2RqxO}34O*i@$bLQZk9ftN7&^~zU;Hb>oqm$+_|EQ zo}LOsrl0b6s{^K7G&6k4hcW*MnaX07i`B2Lh;%%ART#q>AD~@Qs}d|5>*%c2_Vlvd zVP`|i*3#+vC{y!kH@W-?y+F1@>ZYIbpYU^Aby`0m8v?yZPy61IE5@f7)svgOk=zIW z97jP<3re{CJn)@P+iFN)OOZ?bBzwzkrz7a>p{6BF-C5&L7qWGZp*I#tu)}9YmzbOdE z%C?!$zjRDw+r#n^{w(jBX*o3Ly855m89b1m*@*xc?8GK9Li-@=dRc`gO^$G|uc3za zihI}$ipKS)$C>Cdf0YV-kD(z{dNx+@?u`tT5U$L7p*Bxju$S!Rc`{;y26xjtSzd^@ zTgJ^>>#HUVxbK!&oU=7hJwwZ~R$2Rr78<+VXZGjpuc>;bswhrq9lP&?ZKY0tSa0U; zF)Itax==yNy*c%DyR`fLX3y|thAO}JNo;(fn0X^MJy!TIPfZaXo6}?7qdR%xXqiqa zPGrZD6@jgR>k|IcE-gkXuIg;5KIR*~SeaUYmL2}3i-|0qo$6T&g+28wQ_`3YyYXMD z_aAz=X>bI8+r1Jq3@rZjH0WkmOF|YXYj+8UYui}-$OTCK3Jx|z94LW+fV0hlMc{i} zxM`GmdV~7RdWxemC;+GCBf>XRZqOu-+P6`&i3D&PE8tug=0vGQj?AW z8+UR_IJc@*3+|oN%5zR=VNUP$ySh%eY$gJ!;htV$=v|z)8>0_~XO=sC*x#<|cbxR+SIhnN zq1>ry%Onn(a5wvp0+qZ#?Cx1=eROo=7E~JlN4#9o296BQ?9QuRnynbu5Q-t`+v`+@ z*a?jcO9~3Jh6d`W5_>)3Cq-}8cFDO)+e>Vuuw__=Y!8$po%P6ro53IoGF9>Yv;X0~ zUE{`D%+k}FiiCG(KJb6F!69-w0ptj$70V-CG7;N}S5Jp0^X7JYyY;SkesKT46$_d6 zDk_>xWtJBwxt{IwCg+1X31#}|kIG%sh1K&XJFhUcSXRQau5pxY!k0>&$kf{{blK1` zs$bvI{8Cn``|0ivAq`87`ufPka1!Ok{pPU@ZGK=AC!au%*-TTG{nthcT&o9BI&7d; z9>Pdhj8AgT=~DcWhj(%2y3px^_9daonv1isQNwtUdBS1GKK zQcI69>s;-z?UP-M^jhBVH068ICJ$b|ITIs9hdoYqGLN@MrRtB<#z`90cLcYd++Mzc zf}lL+nnOcljM*Hmr?M4TKgKyIf%I#3Ry2!wH({()61II}K8_5Vy0OrFt`Kd;SxKa> z!|S!5H!A{$l4IVf>~V9yY00R({VADn?bwJweOV*NFCc3KQC>- zFbLhNuQ4t~a~s+QubwM%mvu`ldDEadILGgkfpZt9-ICNei^FcF6X_QT>_@287hD|( z;G<#xvuE8r7wFo>wsUWLzUKQKPTS2WbeCZr&`ZRP$gh<+St~U%WwkZ_{}K2`^H*w2 zNI$le&S09YU?LZ5qYoo%-2Z4kWQ=Bs)x3}9Cd_W-j#ve}Sq2Wv5Tvha8_5eIFYg3) zc7`76U2?^sczmO!oV#RwnjziS1sl;59c~jn`B2?TD9sYpDr%md(b?X#Y#57Ni&eH`)CulbGn%#EWDtZ9!@#18VXM`iz+hSE>04W3 zz1O)HdLd*hi-sW{q8!}rOW=q4XP2GhFGvCteCe!9opQ-mkQ5{|+TFD?C2Qs)JVmSfTz3j@7x6dx2`=r4?U=Iv-NdjS zc1@*)VsKLopMyKmAcij#hdW}Fk`+KLRs{*XBv$Of^J^HK<=;NYWO>eh{rX`zS}jQ?9ber$TmS4U5%yp*d9L7{45hY?NYobL2$l!m)Tfz2zlSB$F7qzUKe}7A z#Z&mCLsakXDcrWNiTSRpiOC|soS!s%Ip#ow!F8xdxv~(fqZWo@I5U=S*^@b~y(C*x zV6!6Ll1R<28sA#M-`Iua+K3pMXBLM4VyP$a^uwE2P9Z|);70)_LZj%P=N%-l!EN6r_wM{p1FZ76qVmn($q#A2#~TvgGE4-O z1z|iv5s9Q^!O60=C@wJ;{aX%nFWpt&Hx@C2g!l3h1!sO_KQ~lZ5U`HFlSE#v)72){ zY1Q#6s)t+u{4xr(>>x{G>3VUvj;Y@QL>g@nF-UmoZ;WovESsS%o|+STSj6~fX=E-a z4HQZY8lo@%|8@lIu+u7xZoHLO^56MhDPn5%RhTh%j=3({&krL+M(QWZ?-Ln|-YjD3 z64?%t$H>Pdk8N52-wy+RfPla4F?&@Vx?Z?xBqEhx+|90&W`SM$2ToloIChRWp6tKeAbM+{3Tp`&+fMs}}E{ z4V@Y}yqn0(-h&!8QeVYup>xsiC_iWBwf9_|gMktlARZG*5=Im9*YZ~MM9HHNJwd>g zZj0l#Nb3B1qw%IVrX*p6j?RfdR3w>D(t#>x|I0vwbk3;q;-g#s9iADrmkPws1zAkJ zVVH?=_ljfow;De@U+p33?t9fE;gcSQ@}dlJcMIbx7AQbe7r8XO8I&J+fSf5YJz16Q zgqVOgZb?e~*dHwCe+@N08WP&*EB#_6Q!Ora$%3;{lEO*Wf8!E&-mq-~Nvd+-^-jt@ zmObE80>73XbJ6CupC7n$$CG#-K+(xfHt4!?9LUWYc$%&t&%@2$e>Q}#DBsxbUG(zYzwoxbqUd6|+-S~Z z5O={vK#;5pA#!1YD*Uv<&P%}8N5^Me(2KpYpt`v{zPZ6)X}9pZ#Z6^@rA@}q^fFKG z{o(9)sq(F}i>lXV3;PeAo~Q2Z@pt!Vv-diA{FrX#ZnvlQ8TG-Rj#POFlH#nj95<;R(h^5?K4^C(iQ50xgDRGQ# z(Ra3E7iF>ti_}eW@k3a6^V*KN}+owi*q^e$Siyzfm1i5Mm8a5@sK%z$Vk{23oXC22E{t*R+S1Q3iQk2$A$YMjjt2`+DFxt z#jK6VTn;UdPI3GmW`+Gy9J{wwDyPG#rfm1qrHQys`=+A9Mc(fBeID;9_tJX$iNfPX zT_O;#sqE3As*vxs(UII^jro>!xH^q#`bV|=YFJv)vQRGj(1(hMB{4Jmc{fBqZ@MFu z9>)2IST8dqBOIm;U3Z(^)=9eeZw1zvJKM4nD=5ttnb+~X`dA7bS|Wqyo@H6p-9h|w zJf%L1X6+?R^H?*CauJ*eZucF*nVeq4w7?3sD5AMH2zn}xODenh2Ks(Q*tS-j##c? zg(Mz9!H|x}dQw~rvLqIu&}xWetqe!_6s8E< z;}MG|kSufsvyN+K!n_D09lFp>A(`icIidhBN#IVhu;AT1__PR`V$XPT?}?>98tU{E zh6-nkn3wx$Hdg%+o`NrLY3p_s@-OXt!1pRU(y;gJ=W7|&)I|!MJvad}`aTdiKchm^Wvwj70k*XCxPnE`io=vGaMy zVk{-{VFZwRMj84|!A%hYP#2i%Rc#PAJ=*3aFkB)s_hQ!fvx=6?I(4yNq{``$-i-7qWq#O{8E{$@9S?c9rWPkrPXL}O`jpH{zKkN=5e!FPw$oaky6>cNwKFZm!s z_!8%(sVKEDwTA%Pwq%LCJr}?Ogl`aFmpG*C>1s*hH>@1XPZccLsLk7E#9TA!YB6%9 zJ)5?fUz`yCIJ?Axg#-W@v{N9g!U#i4QHlF@<&8%zs?bGy&)~g3(wn#E?ru?a(}+lI zeI1GZTcGr+L^Y+y8M7vXN8YOkt~AqrRN+~!MV;xp2$Nt>*thfVV(eX8ex>yr6X@@EipC%C z%{2Zwbx-zKKYPp6wqVi-?C(fD>Xi>)Q9pPmaLeaw=m8(~xCRV6_XP1(EIou_BQ3JD zgf4_LKTY|M4B0+ntP5vXi$k8jMf}{h%G*_v`?D+) z76_CSK@LdPDI_|oL84%}9N{6Uvd^*d$zvIzFyo=mNnXYH(LP%8KsC>$@`x4*5C zDmhF^50s=^tO=n-1Eo1oXft!NZ>P5YanX%k?otHQX&J&7aq1;um=t;*UJ0)Vab_B3 zy^9i}QcCtN-H`r&xB{|FICEwB>Ahi>g0b|ynL=gQF!xg#ShJ%Z&8+wrp}A`FraMZx zQ+9sqSQZ!>A6bO|C$Yxm;Ubr*5aVswfxhB>K_c1cjOy(p)t_RE4pcAyH-L7W&Gw=0 zXzlQcYMEKVbF;s^YyH&>0?v5usy$aa^VM!tTd*)!Vj>w|e#Qmer=0EEM7PlSYu%|Z zCa{mI&ZX`6$k-+rF#1>W-r%2A>J1|O##K~VQC)RpTi;_zl5{!MKaplJf10g&UDrHg zk9TUHxfYU{P`pq)N8KizQ@H8k&baR}7F@*+j>{+9*v~F!eaBQ>ia@$Zk&_j$iQUWd z8FVj|?(-G&`7nEb*aum1Z7LNLnQHtssrshltTzJ;f%w<2p7NdT-byeQ-9%vctl>Ue zQ`6ZdR`q@P*!1Cqk`jqnfemMLR7?aaRcRAb(I?8D6X#7^jD-~Yu!ke6GgPLK3eu2- zA5((elk*{=UJiZ3zJg>)umx{XadVXDBJXy+=3KP=+jL;$GTh!1X zBSjV_u7Pp#b0EXWXW@X@rFQ{V7*+7NS_az_BudE_{0S2I&hBBpTT#9AmZ+;Mh}qUP zyckSUSa%6|iAb`C^wN#-Z3{$aW_uXS`CFgt6JzXB@wYm>dgb372a6qwyolbX@eOwh zJuf}YTj8SX#ay>kj^$ga9>D!nvH14?uyp3}P`&T}zt7AV`%-oarAQk>v@p}Eg(!JT zixG)bmQ-XrN7_{?i4>z0q6n#EnNit_kVLkbQnu^{v!3(2`~1Ft^eFyl=G^DruIqZf zUYB;fwbxy@pyLP;(EDTUPfn?6^z6FvtHrsMt=|>ezPDi+M##;MMK(h@SD&rZ@vm%l zw!b&2<-cmW!hOY&EkT{*hxvkhH1*6c!^L0)3DoaKJk#!j z**Me;mq;~{woBwYU(_;$607Hc=s^KY!N)6s$v23{e{Ybvpq=%%@nOPeyaj+%fm5BC zQ2+04+FXgR*#vXYoj5pu+Iwg82~~))ECUAG(evNl$&kWK)*L8~BRr?jSE#V#c+e

0wdSTzrs!_lol%Q3ERVRSvtw_{JVJ$*^TK`whl!blHZHl* z*1$5|NvZx5QCAU9gy5vezrM8C+oq_j5^Z+*JbXAL)9$kH`IgIev+g#Ng2qZtx%dqK zhi>3LSSzOi&z+ct1u$qO-dh6C6zF;7ux=#q1-_zyfJAurYT{MDxMdgI5ZH|fm%D3x ze*27ksQi zQy5qAT-@-oPx<7~xeaL~Y_}vK{wm9@O>W!Q?c!hnR37to{+Viz3JBOw@P~3$4wdU% zyVJ@|zGgx(QcI{bKQ=dN*H%ZQMlJK1iJVMmU{scXX)H_FID}jN3 zwkhpYh-mK1LO|+-ZWMZEpfRtXd9)2RiolD^iPUQof0q*1Bk;lr(ZwN7Ja~!z-9nVF ztBmmMWJS=gd2y*)uQeoH3#&mKpTg03Q%_mSU5^8r^`9`#cLH+KT= zzmohzmrv-%$CB+nnjdRXsIzZ2cM$!(DRg~$f9B0qN$YgQ*K3T_iOyuS6|S;o@fKj# zz@UJF`7jkM=GcVIl^tJ{u({`mRakCrj59Ns%T4M-pcELK#xgqVOuwe+4ag#DCX{pgolAWP9j!xX9MR%N?t8&;29 zuSy55u3LUzuNe&fNLecT<;dKJt=axAR#t`3NdLdqt2r4t_N^_xdeNrG`Ekt4b6aDI)s;)=g&L1n-i*Wc@pp_`qPk*kUf&Bl#=B zs|9%TazV*nDqj8Ww=W~7ojHv^6Of?}q?8@nIHNDHixS5-iR*3$D}jDJ8O?`KQ}9O` zWW`?^zif|iqoL5nSebYfvcF0hrbAO_^vBw1vBwC98DVDtKlk-B@o`=Y9`?jEp`B); zTfWX+dFA7GYI^{-0jxQt=?%;#hG11aOe?nL`}4(pV{yjm>4kIUmNtv;Pq;mrsChPF zTrzQ7f#Ws#xF96N?MX^$b$hDgjc2W0GAsW?Eu68#Q{)|)T4*dnuDEwJXz$$(Cq8Rr ze60v`1?*#TAVgScRjSz)a&ZMl{a0vu2=>*#CYp6Y`SIU%s2oTcV7!2rdutsxa z{j%R}!_FtOto7XL8CKCAgYX&mROPm=OL*!ZNb$`$_ARr(I;P0ou*~Dl(;v5XhP{x> z|MllRt>1sE)!a1?22f7hH5F$iU3@0+=~!JN6Ifz_XQ_bx9|!?vvqWz(>y;E;lL-6P z!!nvoiWk19%Nug)9E0n11lG*G2!~l=t}P)+X(!;oD2-9aDn~dbk;Co8#`sz?+eZ=D zyO8M3s)zzs=yf;A@=>>C(Q$(zAChk9HKb;5-<$C4 z=$85>$KvG1?+V|Je)^GS zpWhfK_aS%*QMK=(U0%eCq?vF==P`75=D(@yG>UL4=W~K=gNZ}W5UyV|m0KwFKQ@bY za5h01ZCYb1JYyN$fA^FsSaoPTM7svhGq1uo1~RMgcSDRFVBBgB$^eKgxJ&Vb(DV98 zA7daME5?6s4{~@Yqqj$r+h@90(#2PA3AK{h%E{JRZ!S1`bezApq5DgH@a2lFMI8hC zyWPcSmYT3Q{Pldnxl{BF?6&WuoBI}@5c96^%1ed-HU{9e5n-#(1MQ@AD;?n3%tAm) z4C{FwuY7Mf9#L&GlCRHK1)l4w;r0>PAo)F^{CK^SZBPV^5siVCcCZe#L1-b_OtDA! z9~7em^&?-j6HVtDGWVRdD_Ts;=o6)~k3qJ5)^aTQlg(`q2 zYIIvgcD_tCh5JbwOgIR-s*BJr4Y@zNeadb^nR$ z9_IYByNjL=`DJO2-11%bcHL3!RV#lkK<`Bd`08GJ3JV9-^c|r79`Id^5I&o1h6`j2xUZXC#@6WqE=aP2@M#*WVp5s}W>3(@ z^n2thVmlcMw#4{|2^1aLNMUIfDK4O^b295+*<1;Ms&VvA-&g`;^yc}eLR zs;TxG7frV;*X~sAXtl5Axof9_wb6>D2uJEn}!*8Co=&2>)kV~8#tGvTB58xNwkSy-i{6$2_$UL0Y{~=wmX&qiM z9v81(%G@OdV2>x}b`skKizJ!J0q0Jz6e#$TzzHh1S#`r45L8q2PgWyWHkE(4zdomb zn-uM-II_b#T6=7!(QL-adcZm}F6!&S{@iMO^&6o(?8&4e(gn`l1`ptO*(_t0Cto21 z+$mF*!|L&pf+6D;JV(%07tGo_5z?!v$avA$`Ai{U%=4>Oly8>cm3c(Y${f9=p-$Fw zP)?OcLhjj#s7aC361ocAz>JQ)rmlx9a))q#7=D2B?_H8X(_*>}jNOs5y&7!wxXRCf zZG*69i4fpfj>ezZ1K5@+)Xj^y+k*T5QI5`;!ZSpbp?>`#F{quU5@e8#!!J@m ze45Nr1@Pe*z(fb}lWPBn;Z0D$g|MH&$FD>wsp?llMhDHc!SW=z$`1qkyZ{?G!UWkkR3>gFgT5cA@&WM&gneBya#mDSglEj> zcSc`bA=qBj)ApLv_|buhu$AOMjS@CCo);ozN>g1P{_ESJwIJxG1{gjHCV?4*+idQy zfjy1toJxJ4Kw0M}TI_b>pp(d+^I|dWYys=W#IimokiHdx%CIZPFxc975vc3Pl?D(Z zD@@|VW}2q3bVPA|&}B#W--&iodK{C?%@N#2c*kmPb9?O z-4IAQL`?p%Tb;;y+sV`|e=XGSUra0M8e!%^GxX>ws~-GvAF9IaY}C~2RIYFu6;#EjJ297-G7h{w7uz?zT~it=3UkS5A`DI2eddTtw`z-YbH3Dz z9RU|+fMOb!0|dGy$p8y>Y$mjkd^x~`qB}uupOev)uSqpCuW)SFasK8#>YU@(lFu>6 zhsm>8`Fe8sX5OrYxr)Iv;6$#Cq^}Drodf*yp|ljV9n=Odi7|8FIVWuUbUt9O{Z87) z+7Fc_!^Be+(U?}vvZxjZ5j62o?CqCjE3KcAmI2X9;PP3!Mev$S4Y!ARwI#r&9^u;E z0S+%zfPvf2Xs^L6$&I%VLMpKx$~rWe@N*5(T#auoo(J}tPvxtB1>PDkJ-8FeTMLqR z`$M`OA6$bL2{jv-dW|0tJCnXQTBx;UGI_ z-8KXkTjgfe+gP6AaOv^``&LJpLhXWU3v_gtM{J4|K(n&({^r`hK3gGNx_KT!lvhaR{A56f? zhe&&rvoesrp$&NV)`PM(F#dICn=ct`;2*AacVTUk2im5BtA{jpMju>raMD{-qzbZ6 zE^_)XJW(vHXqMwfAOpedTpiHFKNE|t7g~RrkS}0q3F79UYkS?6Mb`1ur>q@%dWO40 zs6P@|jaGh<*GY&YrG62nB>OI6u<23$8{K)1FiUG)v4LgpW&slwAmEg2(_B@+haGQm zUkQ5mrNlHhBih@FnD3s9-s=}zJi{9f(|#78!0Cu5E$s5_uuQbz#FAxz9{5Qasfd6L zSwWbZi$HMB2}+ERe!f zjn5C5tf64y0|5xvfQ%iM1I%+TUvir_X@H>kdF86UpzGvF>{e*0_6lZwU6P~ovLv}Z ze~zJZ1)me)4Yx~N@Xy39Tc=pvS$-E4aZ?A8BgeT*mSq5gYGUg&$Lj^&+74s!;_Cd| zN$C>~sG0W%;}m26n+897NiqZfw6CbC&3>JHJ&;_bib02izB&l9f|XWKM+;_j`r`L{ zlh{Uc!0EpDqqMs{{F;cm#g^09~tjq1sd=sEjApKI^hVx(`FYL zu)YT2LP2Fus(cK$V=quS7s)>=KCEUplN=`wS_Hxj4)WX0Wx+Q2^wQD~TYy10-hE&) z;nBp-esM_AZ~LL?174_x;6M(sR}x(%zJGmyqvAxi{6~!ru8{_12dOm86w{Q?eizZ1 zjW-?YNFc0;sYCRpF!YG2XXvp3(;EWaOZgTNM|t}{w7E_^E@?#KC&E|0?Qb-%qS-+i zc;kAD#dH}13nW&;)p_y)TmTHT5vnusdfZom7P!0QUGg^QwMzo0<3Yi@}&SA00 zP`U;n0nxJ+;qD8r{L!*N9W)(p3dx>*vJEtqI_Q5k24hCRhB;4`s~k@TxO2C%K4FkY zI;*T;sS?7}E4O)l3@wd|>UrAEAcL`vS11$)F9JJsJcp^!dF^JO5@@2FI#cYhQelHU zm_EZ@^Z|7|C3gBEURDlG*^=rRsqIdxV}Ai%8o9R=RSHv>VlLYTNMwb(i!ep0cUyoK zo04t)%EyV4vohf`qp_RfX-YJ) zpfSX2*IaNn37X_&fu=>fh$237FR^iq$%OVM@P=m+A%eDg3OQ)er>sk3hZl~S(i>Vx zNG4c>BNyR%d8{3;FI zINfvT<-jB9pMfkM>7NbR6C$aQirv0^jD$7Qc2F=Mo=m!KKH^b)7XT0P@+xAeidHW! zf2YoR_le;qf%3TfyF^(p#P_Sia~YRf@D4u5U(BVwntDt$tt25m(#qAfK6J<|{c{(1 z0B*%$kXf-I(;KJ7Tj`L{eYhm(7KJW_Wy}R(dTXW;Vp${Sm&d!HOCjOBSt>Yk>gm|x zQ(qY9(?G{vdAwrVp`^mez*UPLR7_U*=y{5ve^{)fBtJ^guBn}JGoGW^)@6&#%a&Dr zX0&US)v?0ICcn=qR;1a;9&BDR9L3u$EGgOsb%jlEfNswcXTYru(-7T7tAQCjZeZqA z>KebMN$f6%q4!>sgY+~n zEXj*LWy-(w3+K@xRtVE(eFGuRcoX&|RS0WI_C6pipgqc@O1I&7V$`?#6pX& z%W7xUQ9%mZH6H;cve|~G?yQEiv-@knr+s4(NhmT~zY5Z|N5(fVt2{L4>HD_qPg<_e zKjkcSNz1V*d8hgFXH&1!5uZK(0l$|d%m&n6CO#HdXs57zSI@7Qs=vQt{r$dcDVwaE zZae?UD9e@#soZ24zusqxS#yL0gNeR<2;Gm&r;6Ck_iVv9Ep%Woi@n=jNvc7So7zfB zd#y3fRSnb|rWfx%v+7L4!pT(=Z54TE-{uwE6!#>dV(&rX#dDBeexJl%uMRYzN&Zn2 znB;3WfI3xM@Z{kPV^(j4pw8 zipcgNeuq`T#L1AO_E82L$enZP{ovsuDLTk*)BzvUPPPtNeSB5ktfh80anpu#Qm#@< z<)qXTomI9}v9GeSzTR~SyK&03>gT1xQ*WO>niDPPd%$B^U0OsZVRFzdOKb{@Iyfz! zxN#Cq>5Wcl*N+(Ss2rat4$aG6vv-QpP-AQn?ke9`w}0E8-3{mhD1DZtu3rM^`;oq5 zP@>xa>*)Dk$C|Yq?h(s9L=A!IPqI`4HueS_r}`dOwV7BW-%9#2qY-rW)vDr{BA3?X zgHfn*dG?Zm(4^aD2kX_rEmbhQ(0~f`UQ6AAhBV`Ohm?9ACC-4C?g(}_@gI+}dge_o zUc_pzxh}c*h(*3%ji)T8y-R}vnlzv=h7dnf1J$Da`G#p(dKKM}bltk6Y27~$&vC8v zet~q^LXbY2F8xOp+bIW>Zrg(W&~xk8O>T*c{y1~J_;TL;0_JCMtMU~*uin3io=a)J zPwb=Omb>Bqe{z_S^q`&QGSx-`7O1++a^P%Crk|XFl~*paVn&DZ@|0=nGjn{2d9?51 zrPME4IiL2bCyW=69Hf59p1L@e1zW6CpV$lGixZYkz!D~ab}EB+Q~2uJFm2$we|lLW zErn&DBYbv6U{RD*&x~}y0Eu);j_r#mfaGrJo9=LUt!tEkxY3i-vwOaABI^k5Cmwk` z(MWPjN)On(?sidxhD~Yqcw4}z-$iFsSv>3(xQ&SSQ3hl+paElZL)g3K#&OJT8NkTc z5g`+*y-T2g-t2ojTJyA^lh!g4ow0w?`?$C?`K$*||3{oGyHOI~J$pILcUM=8-eGyr zue4p3t_P|^bh+8U)0m9?&#^6EG&l#k@ziL8c_kmFx}GV&O|vz|9T z9NMagLQKHkVubdomV@u$D8vg}{THH@{O;)nH86B>h>;j(`Er*d@DKS);%*(k=;jdv zMe=0hlyc~rQ1lB@_4Va)>elM-2$++V$LzhMTG0@T%j&OTB) z2|GkUweQ)qo=i?)AY3g9E@`X+6gr*0mgmK)>F!o)YxF;lihDu}aiK-{FeC4DOS1uJL*hVC zUrc8=^Bg}m4UPOw{xZpL>$d16f$J{A#L8WwTx;Rep1-u}V`v>8I@kHXMld5OFjVRO z;h$dUm_;EO1iWMjgCkB!F=nAEtA;?tUmy5eO zug)AS(FMT-x=tEXI(uA?AzC&(-4Cxh_7ZA~J-%p0|IlwID~^het$E~Qfx~drNx5_c z`|;z=zoBft+RNScksWslGA5fPuR82qe5ssH+0mX|lc%R2y&FhCug73-^5y42`o=*c zNgd8BX%hRyVQC-*luM~v@gV%a{~?7bQglCj2kE7hm1T6PB-F-u-8syhPOLZ9xuDi>g{ACn`z?0gJGUe0R;8|0`=Ke2=k5C-?4D^lpnnJ6;&@s1DFlQ~ zn?kcG=r+1%Mr8V;otCkfX7XBm!(_&~L0^3NY^rG)p*KGN$J9BF=9exVwi-aV!E=D# z(^)Vcho!B*uLIsX!A*4@8C(Xk;F1C~F}n}Ftz_9|sYsac=Yj2{pqY=UM>OfK)4ijo zq`)4%>7qD^YVWCBMqdklrelC(>+vs-*;vnjVeg9a#!j-AJT^*62el*{DM@&f=^iXgF@ROBO4Qj+?heke%4?St)th~=UHq*`387P<|ITMO%hC$}Fxg#0E zi3qWA0kZG?KMK*0V5~vdfw;vN+@;qV&~;{XeK<7VozaC?B#Wo?ThCN@KNFXH(bS_| znFZ@diQ#RsQkZmreSW$H_+a_JFGQvzp0#qYKnGzsx)ShQA`ODN0QT5^lqEk#4l)|j zJDp_Q%qNVC2GDsog+J!c>Q=2Gb~6SKob-iicX|{RGsi zbS|IiDtYxjKXWU?P%d!5`wg!(*?{{Zmt4aebT%W{4Sq zk zF;A5TUi$>kjp9kS1@ummmMO5=uE7s0Xw3hJ-w}jlFuQ&IZ;pq*mL>K4C_fTpYRu4A zLe35W`g&5WDxiW$a7&*kB7@FPXlxXRlQ+qEmKK$}#xftI%{1 zBok>rt9PZ07q+|ES5K@0IW@~yCl;;1zP1aRokSVUH7Bpr4ttAx)kMae&UTIl&{-oh9uHwoWm5Rx zp-S^|%XP8pi07xha-d#(Bbqii=BC?fr(?I~&XpY1%?4Nu{p5tWnul=JNc6cdW%{gv zscn0I3%%iwmjN4=y~{#`+c!%I&1;m1S=VSdPDG*VQ~0#XDaf?mU!j@&S*7hkb?MukL18}Va@R%Szu7c zJMWvW88GaBSrh*w`a0`Z51f-I3{z=vxXH;3oqcF`luzdUXSXsE4WPYs4snj+rnWeF ziMmMahYG;6Y6)WSxt*2(X$Eh!dkxy%#JnLma8G>13x}tkn)y`LJNhLs#$lQ9|1{ot z0GbUq1G@4C(+y4wvH;(e9jW+oK1lcdgBaM$V&MyJDFTDkW(pm_YIYSZi!lNJjL<*+ z=MvBya%g?|@qs4d>UdNk;H+x; zPJiS|7B~%>6i4lRRGI>`npR1}y0jsJ^}VJIZl(FKSO`f6I4?tkVa0;zhP&R7egmhK zL+*+3;P*8~FO7;Xq=HiTOXgn5H=gaK_HYj>X&$L;N?6(aL#{D;Sq*sELo`meNjJ!#8$QlAE>_yi2L$BPQ4BxSD|b_i zJutAB+#O)7LSNtVwbT3jKvA#aai|^{E0F=@HDqit1?<-bGWOucd|1P{Fdyi`61N@^ z(rYi{yeygoe>^a0@x2`PZ$#0xQ<`4{2Nt4-Sg7TP=z3mNEvHFO72F&pH(rg%9aqCd zb-ns`VKP(8mQsGfgK}XfHsFX2tQoL9BI^ttrR{z0j*<*i3;<>$(|(bB@`O^lTN3F> z4A`J|z`(hKLREPgg-lsN8?}b9#mt@8iHYM?aoB(oCj1~>H%nnzyN`6hf_d?*6ZgXv ziQq-#u$LZ*blNfhxW_2sSwQ*!c8|-Exhs){WGvSOR=ZR|^{MZ)mUh(Xbpfk8u|k-J z4#5~}i8u5iacUrHJ;oKs1gtbCMW^?5XqlXrEvcMj8%qX<$n~ZqFLnQn?@ntf{x;>p!)m($uJ%{Yu_=q%q;g8+f z7JN-fyYF2nG8s~=_2vO!GhWju)&=ZL$=^K)-LShc zpG0@pUjB&$KITt+)5O!DtwhOoJ6VI3H5!?n`ilhpuC` zGUKabO3eH$=YA)4^f?8Rctr@ih2Sj~me)M7FO}*UxiDe=BjWZbFBjZxb&wpDoOhe_bju zon1_$QhxVkGrx-;WIy@DkOIdv=pJ%BqCG-+d~M#}{aU*Y?h6|0B3*Nw8@G8+)u|Me zHDgRfoGVcMe6O`#7dFE>Uw+Lo^>Os3V?>zbRTHGt^-`aHdqJ2 z_wr0T0Yzo9cim4X^WXNCg4_$@>?YhX4P)4A0++^LTHJfSELB>!a08n%r371&gR|fg zmzpjME0gBG)y#D4WR(yjMVluuo}jZ8u}5UCE>NSMeq@s7YX*YqA7KY67i_qA#o&^O zL1^81+o?gaL(NDKzlm(N$Da`3Gq~XfQJfC8_%xXw!xDJ!*JQsyt{bua;di}NQagIw zpm38CCjFMmmYIE|3v@>UF~aM(6wnm03#A96p6yJEB!qlMKl=frwdTu%+<3+-=lDBD z>~F|EYh-+BIz{u33}!?(tcjVIf;hITa5LFGDtj$%U|W-3YOAPAiFrMoWZc^-Q6{-2 zQS&bor`i=-SPlmY?OB@DXrrMiqjl=u@+R*kEu1EhPGyfzx9!%!5?iakFoy}nz=}uz znt~le*s{)y7pMew91`~k_9G7$D$>haL9#D)gNiwUS61K~PHcaNjL)5T(0xl^cf?dy zP+$$@CMrB$L@SIx;Ku7>XYZ2u>Z+>3?FvEROFgNc((lNgmcWL(uL&4P)7!z3+emsL zpdNwY+;;Bz-bH5JAUT+wjj)elbt=a0Crh=i^v*HsbgB;1OwKs2X^;9~~=aHf1boWO_l{Y~?w~*JZ$e(prwK zpE`W#t+T#$Xdd1-ThXs8GjQ4A&I-5ufpbiunm@_wbJC#TbFB_Gmz=VkZr)1KN&)+% z_Ws%mT-9A$ofA)J|61oKmz=Zs;(gLS_4aFlGRb}HZ32rpax_`2>Y1Ore3LZRfe)(p zu`Y5hKOB$@9SD3hRlfT-NY@3sDBE6ubXochAcdzZ!XeHiX5H?=GE8xUxaZU6CvWdr zg5yKC$p$;-fkhO*&ud>J>8c=A2e4XL%YPgDbuba!n4B(2+!%c%f%a^}HpIb_w(eHh zsQ|eh$Z(*wF1SkytMFNP0nDKq#IKcFUPd8JP@|A1BC4nmmZw%J%+aCMjs@r*zis3A)5x9vk&tciS|tL z%VDhjsI(%xT-yrpbhzX4rs;9m#JQ={ig$^SA5bAv*@AXD|5= zGx1pGiM&15U(^3IW!jR_`p0iX<;4rw*v@8-!J(#F%Wne{iB{o-1^+cJ+y7WU%Euss zk=qK^XZ0tl>nPGwL&$VvU?-;tN^tvc#1o`FMi)@|KId77+%qMIzTsWJnY&-*YgX#Z zi?@zwJDjx|EchN}Y!o^A{t0xjfAXA~u4xVUYG%Jb?^6VxH}{a~-tJ3C3I>Wz-@ysp zgxQotYO=vBaMpl3&Otxsg)xL{X5a}76qcY9cVe5J8oYHer=tLx?>Xg4o-ReDKXFpT znnHl)Af6anzh88Biy$SrCBtt!bkkV8jY>6+!M(|5jF zo9-r4omJBNMlO3cIMGKa`h0D=>@oa%XBAnshNS zXUlltYAtNkP=)l0$ZTtLqEN95;L%R(7OA~+)tvdHg$wB4<^%S;12VT<$SRrOsHqbF zXaVx|3MgMWWw`CE(M&4MEkgUtp_h{slV|ixr7Ghj@ zM)+!Ihi%2p)^}5Iy^wq4qFvq-EjN?AiKmN&Z&&4g z8eH01<9auR*}JUP_r6`lp1ptG=BVWsIyilA9ccNU_myC#cJki!9ul&xD^`j_m4+6u ztj8mYN9s)^hMjMQ5_J7}!Rl4Qx1Z)l9dv~s`p!Y$&E;n9>-RbDcJO4^5!$+KL;BsN z2gbrBu2Cv@+J_Gn!&f&_p*u61)Z~jbP(91bk#s5S?j+{~Nb8A-@z^FJw~w7t7W`0E z88Mv_bh0@nzc0TL-p2G@^I2>DOr-}N2VONwC$x#7!3PT;Q?Y|2OC7-0xL|$@G4KcP zwYYO&N0SKfIu6rR3RYy_c2|uS6>k^(d73EGM4R9`!!rEO-+}uiTJgl0t)e1D%v@la z2;b!a^2>HFU>BY5!Sp}sk#ZkH?#ulo@ZmPrch@Uaiue8t_E8 z2+rd$#de2ub-tnF`YdODF<$#TP{OwtHum6(Q?QNXpy9%*Oa0-zvdM*kir_JERTA$7 zu6NT`8h6mr6Dp8%;s&Zgr$74Rcf7ypHagSV6`8?pCP zgX8fLWO^Y;j-}fuC7S^ih;&fa+K(cy9@}s~9>{lW)%mMmoj`kxU$!U~ZdvRmS!nk> zI!y|VZpGi%aok4&rHPIA5O~|k)He7|-zn`0`*OZ@V&KCbyg~)JMNssCj2`YCyM3dM z!D~E^27>Dc#Z#xI*(`Z+#0JIw0j4yUS%+@qr!8Qo4sOyZ{WJeXxQ9=H-eoG-;fZ{! zos*vWfY-iqH<@k@o*-dsvr}1bZs{AfaZG->c}~l39Wf;nwgKGujo9235toa543!_N z(bdRZ*T#UBIUAdgEifX}y)eNhI=01MfzIa#fP+dT$4n*CBQ|v|_4FKHLuDWwOH@lrgjiECn5)AvaX{I(b3%*Pp>nGD}?nc$-Azl?FQm=`AvTdot_gl>K{_1kXeZXG6OLx%(v-&eNpE?Wc!>ezhap5OMJE zk($fSGEEm(e*@fg;Dw7b6|{gSK{6^Fpk;F;4pCZxxd(vjW(JWewK8O{QN;351W2e~ z4pu7$y|1e1ywktGf3sfltQBQ|85!ia*$=%oseE>Fc86%01HO9PS_kuatM&4-{uJ%a zT}#lesPgnXFrdz}4y^EadE^OI7pQHgK6gsjo-0uDf; zVhmWChXQaMgaoOT&mpO;28M0GfM%plRdec%09+3IjjzaAOJx8|>U#u9{g}2BG^Lw% z=wlvNXN>*P03j>y7%DH`Jx2q>X#SwKaknD|yEN(o#nb=h95bR8Px)3b&J7$Uj*Z)6rX-?fo)H23(6$eDPSSqUsu&GO zb~|yE8M+$msH6m@)kf^gjH9L%SV9K#NjnZ`gRL^o?cn+y8_#8mL9_ftVx!wO+?|7z z9ptjEGphdZGBU7-v!dh2%%D_MLs6w%GRrgASM68WZZh}K$XIxT)9Lp9pUZP4nn&G6 z0?E-i3tz8dbB>U=ZDsG-n=Hj1j3}tu$t!b;+!J`>q>o41PgT3NzwjNnWs3G8-0+29 zQ44Ja_&tpBcuulJJ(XV7Ynmd2CCT-Jx%62VSv0JTd9s-0FzD1Gna59{ruQ#70#2Wo zddYR@Kf$K3sq;wRY_-kERUm_keFQM_JOJ;v)u2BQQISJlP_bf?jv`2q^0WdfR5kb4 zzk&~txmx4i52vg$alh{yqaV&l>^4Sgm|PMs|F3p)yg)lfHrOLvClt?LLKvAMG!G*pir4Qs$)97}6U_})BYm_4 zdtsafY~<6;sL8?Lf)2La5`1w7_tec!x+A8=TpQ1o3Nq0}!Slx3jJ7OWnv*e`LG`R{ zIm~R{C^FSL+@a6bw|j)_^Y~~5w%nnz-_2LKXvDrwt!^$wh3r`2AJZt=^7WfE3?lQ| zE=P{d5T73iBaVOKX?-LndBi=dWc)G};}e1@)&;~Yidd=$)OiWFJD8Sg{cRX9a)w!^Ad;Ijgyfial&aOH7lZq)KDGt8iw2KLrqYWO(8-yOFpC)_8k&WEJ zC3O{&zOx4VjmLu&*1MkzDC4uX>*op7mO8yc_r}avlcTpT{O!9Np3UCEEM4r+lWWU0 z*hk3s{_ftPjOEMhucYfdM@B_=D}rVN`WEZh{R}C$jjg`;LF$G51dhHaAf$z8#!n)v zl{i8WOHLB1O@uQ=Eaq$1uP!!a4CkrE%6jge9*0k3*5 z>ldzqbr2QL3rnPKT}70j>C^`DEto#|O?i14i3u|#1b6RKWe{b9N%~>B@7jR4^6YlQK>R7Bre9eq4%wX}n=Tc@ z(*Zscru(kULztrPEb6Iqrf^}mDGSn~dP_OqYpnMUHMz1 zGP2PG>s&&`&Vmb};8Z)fWl29$({7=$2Dwg!Y2}Dp>MCc~^nN`-1{F>tL(lFDeD{ym zqn{%$5q5Y#zG;d>XGd{9#NLO^vEMNd4eBo%8B6ES z&KrB6JrbYOv_yw5e`Db=)~vwYioGS@`?=Lqwu*Gil?@*u!sFcHTb%%IQ6=HqE{sn! zmgljua`we%bkppJ<6ns`UjEfW;$jPH3z0!(w+{6q;w?F7ojb#2Ffa%AdBv)^#mtD| zi&u;X7PlG<6TK&;JuVOGo3ZObn2D|WWiY*qQV)jditJWPCFEV#MGA&l$%K?y!H+zl zL0|KQu`7!Md#h3m+yRvwbV;5}TE?Af0+x-ym|p3`GFwyVx7~?XdGRg6ZN0rggcSo-g3PMyBcCuMG#tIYmm%)9^DTGIBC&Ugo zycQN-V4e7iKciRbTZ3{F+vecxEN)^;!fi4)a!P?sX(4Ufh;1Wd8?hiN2nJod_<&oqDkb(!VKYx|mWI;JtB*=UFwTJt2;6JaVpCwfV9JX@KFfN3;yk zUhv{;F;4SP(&DGIz$w)|_^3a6kUF4wN|F9kE@QkgA^*iCY_8nb#4wud=aFcjCWUL2Ut*+oB*eOfaK#K2MMYrnSH?cMeHn>gu&(DC5c2g8>I+ixF<9|@fqWHrIGpR+_^JYi`eTQ7ztP8O~?VCcCDX`(FO z;z&PIH`lgMiwEL({5y-odyL0gzyXXEWobg!NiH7ZM#`9WG_A6qKYX^E!MQo)y>=vYmO-%9H#B14}NbOR# zgUn_}w(<0*OryTC6Z{K}eql}by~*Nb5o@Q*CO6t5Y}WpC@nx##vT{-X9YTvkvjm+| zEi{Za2ZXDN7nAmg7;dj8w?SmM8e3VYl&*~|l)K=RDZ9_>-;4QpBbh5z8u~Yoz-Kef%pBwtn76~Z z5%Ds358g<8(=66&p8DiB-hTnDon=*DkyxE2)>#h*TmNCn;zxwWJQg}0swB8=B3aQv zyX{!a`qn!ZFB55O|HXDY6|rCL zo~PBvm!6bzaPlkyH=W4S#`C1U_Sn!2SB3u6oD+pY@rDUG{q1b%6TF`q*6P&SKh_S^ z!Y2jt&rmsW@nbLB{d=#|d%lC9Ef>y*Jq5(_<#KmdA#p$VHAM*-R;z~?lAh52N7kFi zL-|Ml-`6a5qJ&UJDMCd_DlwBv3nD^`8m)w)Qe>HHR6^U3_F{;vSqhQu8f{Xa8f&(g zsmMCb*v2f^a$kLa_wT;%$Nl?b{-4Lp`+eT$yw3A=j@u3YF6FD-9RQZGdIp=)tS`X^ zkM+*fUSFb)@}*|&SoOWAyDt&_Htb@{bm&?@8ScJ9&6#93W2JIm4Qa|a@+g^-)PtY* zNH4ikScjDkAj#@USi;m^lu)m1##H0?fp3Bp*#suOzn-X^J6QLWFvpO&&<^;qpTDVh zzyDE%<0ZsrD{#KzTlly14Dht)@rGYzEeU$vhJdCNt#@J&b&!=`>$z+;dP8FIJT3_8cp)ICftv2#!p)v@K`0|I|0vvNKr8@M`O8f&dWe_g7w|yQkVxteSe&&Y2L8r zxvzhOm}Gk_x5Fi>_N6mOi9}9`=v%H(Ps`usg8&*h8)}4{eTdGLv`ypviDRaq@EO(0 z5!^W3m@W{uj1E1Vd=THnJ_AH0^~Cor{2A*+llh_a72Ja_P))0_AYUE}=XZbh0`& z`RrOk?TgIC_>eC00THHV35W8<4orpEEs|(u)7UG2a^oQ3ROm2;5o7-ho-!<0A=+LJ z9g&*wxqfigRdC%XB?mh_PsBTQ89FWFjjinO)Pc)($-kI_AHFd9FQPt+wy>`>)t_`| z>7E{_QXAR%iP*(UP{4=k=+eT;%C^9ODt|*8F_AblY{?ALph*VA7XF=*TAv;j|9yn$ zgQmZ-Xvqr6Z+&RLmwPZyUwCvxVd1$fWF!O|OBK)BOM4qATR~+>(}24H&`$Q?xO;~y zoKX);f%K#S``mz+%Fg$@pD^SC6y1ir$_OFL84Q`Xk3tZ+7mJmcXeCSS(yriK3)Q0n$DTgJqOYM*+anu)+ z_*=)4e-;O91@APmHKcO^D4>vieb_1t*M8B)IW&z-OQwU{phVe&yCQ_(`coZWOEY^^ z&G@`R>AkOjatZG5C}f(Os4>p~RavwF3*)A^+u+a9qLxL5RD(-l{lb(*qPR=%ZsUJA zp#agl$?=9x7`3Cdtx&RJ?8V7O@5@i{#qg&HV3Lt}&J&Cy+0Bic;8L`q=RoWS6p_X09d4FGl5GeZk{?2f*vMXNFcd7r@PQa_RY#!) zVHH02;yCt%r*H_G@`GZA79mA+*bf^LLeFO*sW-y;;ya_Ws7U6}TRD8J@XK^<>!3_2 z=<~Fs;DCdo6ZP?=QUg0tyuFb@E&#(PSe{7lJnTg+NQA#nTajYb;FT>DS9ldCv}SZR z{Pu3yxeS)$tRe|*TrLW=w|*K(%`@9L2X;(3BMpS5(?u;eVk_qojL$3XyGUNHph1gN z2)kPLZ*S~&OaIhC@_Lu2z-gN-J^M2^*qg#51~R3gnN4VebW6cvs!64A)?m_PN~X>C zRhDMv#uCwW){QvA3*?ysj8&dDZ@?FtwYFxuegqy8vQ&(30jG!_CjM&)m!0u(!e^8@ zt25&jEk!#Wg#FPo)H;meP#qTMcw}T=Y|xQR$BIwOC6D2%QV;e~7@ohsX!#xA)$OW( zQ)B9!*q(2FUphYD>$9xtv&5pJz|TV`{N8?V^ZbHyJH3a!3N5D1JN9;Xux;N^ga=Dt^@EkDY@rSQDq=4C=0rm?X#t$tRjcdarL8t!vT6e zRCzQ$-S?Gx3oI;I)lqS;BZ|lbbu{6bkY-IHINC}vk!9tBSHyM=>|O9N4){O?JxSu5 z_tKrE_RZ)LzTR$>JiU!TT{;lpPAkV8!GEd2-*-{Z5YEAgsYMa*?CB&F0pzI55ctyOEMZ2lfT&?;rK$(zPbLDBkr|4_E@N?Q3xR&-p(plVZu)lPG5?9RH zv>r@e3$%o^p=!=FLCMjX)MhkNR@sKS>ikw@mI4DqU28b(p!uR8=32rEL(W>lD`)?S zCG(BQUzxAT6rJm<4rjCI)^rLE&O2WG>lb@-&#@uL7p$`dmqZ(UDK??SGv)=->_0yb z&^lw_H(~YJy2HnGlY$l(f4F?WsdI^+i}b(?)_&8x!R-58g~>6iDtza*uPOWZc1YFl z*sZs8t48ntd>6}q-*I}qYp2dni}U%DIw9VifYrsSo4xN?v^4s(co(pWR#iCSC;X-D z37Mov)xpy@zY!1_2G2wuD>4dx(UH}>K#M<=%MeN1fP&sAN{o_0X_1#@Sdjz{?X<&Vy!+3dku+)_@&Z_hffHNh-Sq^3K-HDSA6_&p?1v`ID6S7sT4dN2>=I%2MBI}MxooxV}BSDL2D>8K3 z=vJ@1@3!Ch@aw>?&UvrzpRHIJWPUJy;QXVy>%#}mbf^|zR~z*9Tw3huY5Bt9cVSn- zxy{~p6ASO`H9zQ`{rN?~#lmwA2e$ae7kBs!@7a9n0^a!SX!Cv^tdU*Na+g);%yJ?O zlO!&2>}T-Kk5o7LyMa&%@|-UW8}*IFcU&N+dU*XnVjyTa=)Q2$q(@G*k+tL6U4jk= zZ5T+xUyTc*;rG7oyt|t^9q?$POlH1Nur@CPuHoJIbK1Cy^Vp7n7p!N9*|vi5{o&fc zA_d|i;1zKl@1_B>EVfN;$I`G1+g2V0j2_x;RYTXPN>@K&uJFW)k3#-r@K+kOPF`sT z{ITE!;@958Nk@u35d8;yP);`GgsCpKCFbd7eWttOC65BAxo73FimOE@E+44h%UVId z?)b=JX~lm9OA424`_g@2vu~#Nhj5*dlsiktQcM2dpDXLX5|=RVFz@{qB^G&WUaQm0 z*m(>5_3kPUk7ZbV@TQ+AQOxr3@!CeJCr`Uo^R%QzLrmVZ^xXg}j?#jz`9Q6kwadrS zJVh)V$VzmVeU3%-3lMKpP+#QIKm~g6{>XY!=yuz?;~NUhqHpibGNEyRr-CQ94VX8+ zb`c}1$4oiOF(iJ7dMT+7uwKDruDq>FQ)4^Hz@-Mj&=cU4i*gsYpUhmpBawXjOs_~Y zCE*YKT?Q3=2tZ*%>b!F7nR*QBa>ZA^y)Os5Gw+b4`3XZn8+N(%%Yb;$gjS?*^CYn1 zN}dYs#9Crr)k)5ZLi0~{pF`&Sci?F3By$y6^1MA4=z3uF&b!K$)yzL!<;S&}*REQv z`t@jB9}uy))XRUBg+cQdvj6S}Dx=RsRN~S|7qowT`QVM8E2I2--pii-B)m5X@9^y| zj4KMOE6FQ{Pjw*F6)w8Ns7Ug&DE#j~mc6 zGC*ZpEZ`|hZr08|;zZv3 zF137j)n+$;t2^zg>ce}txiPK2X91(mtD`UOUFLJI&HH-cWy^B9mG*--!Bzo(&5E@oedYvHN<+rdjxI*_~uqV@wmPU#w%2f28@92B3W1pqD za>v~Ep!(4Zr#0vrRo^Eo=ILonZt6-MIZT#Z{bklxuL9q#q%bL08H$6H?Hu<#=yW`F zu7qlW_YxL}+?N+1eak^y{H-ixylSGijIryIDMO0@4#;kCCypP(*Z{yR!b13-OmS1%g6v08t5gSS(xlMT(5 zygW?VfLIWs;k3GQg-2V|U6dE*6`h^EK+pE&v0e37^Yf$^%yW26W`}f6Z0zj4`M+6! zsO(zxSYm0ayV}4P^DwIiKy*C0%Tf@}tW$lU)m-?2d6>Qhsk*juZT|Uq)0vHhcw!LR z5ww}`(8kN&uIT)H2jIdg#!g$fGG0eqzXx$e{g}k$M)dERNBFrmY~ax$%mMs+nP%Fivt6(iH zU1`=r_lH|@$vVy=$HFv1y3)n94F@xdR|D>GH5vnB7rrjHud?e>%?T$?4v$q>79H5` zYcko>rob^e1bx>3F|vdPC0QhnJin1Xxh*3U0B;lWj*vlbyf)d^9XwinuCQRZp!72!PE`5pJi*_+OIhUCO*^dqcaQ3i?t)ZclkFQD?U*ax zL}mbRNO3$ypL6EBVzp1!k_;o;hBVSe?H?PG&9oizi^BE&-GwuA`E40o0+s1Voq1Bj z*j!uEHo)2nE`U!*gE~EIP3hbusn+n(C}N_cF*4{9$Y}k58oCk<|<|^v?Ht$1zd+W zVV$0XJ;ofWHh9bN%Scih>`+CqX^Y-q*I?*n?@;IK!!P(%*lJ-gQ0Tom{jT~zT>1kb z=86(C^u_k)-L!OKr0Vbyp3$K)&(4f&WA2rWgo|_d`Wf`E-<_+!54X7aH04Sz5R>Vl zIvSJnyBc?#PUuPeLXPpA!{NFk>qHT{@M1nM%UW7ffGqkZRdttbTn68As(?NZuo@@~ zBLViikyU=naEJRVBC|CRW0^2D-H884`kTOu9k|2NdkJ%k5=VI*aB>OXXx-f8VW9Y; zsaeZL=8Zl()@qZuTeOVFpAE=ecuKW_$8)b0dTRPm&05$LQN%;^`9-QeA_UMupZ)${ z2~=X=xr7`}p!!4TTCn<6YJ!Um$Ik}8CGp<-kCa$!_V(>5R4n*>xFX#9cfs$1`j3Yd zS90%e<_24iy$H(w@@(LAMRkMEYVu#jQbYbXpRD4d->NMWgaZ;?uuAlV>lu;yZX)r}wjhEqz%b_~K0It*X~**Og+NgjY&gy0dSHRIn?-QDCVm zJJLY?37`+f5p$6}+R*u0;Tg~eGBL51-Y@_dqc}fsg^<`npbgcWym^GoT&Yda{*TOA z%Lb|%cLC~#%(>Cy8ceSxe4vHkzu0&exwiSZ3c)Isma!J!65kj{d+BTC+IBHi-utO` zn=r$l{YEVTaYHw^psRu~^#=Nv#RBdXsGFRqN;t3J4Rg=mB1$*(=4M;uyRWHh``|v= z@k_-BIJBw3_uz--Y1^t0fJ>;^f1xUnX}7sPeWl^2UV@RHf@obvX!&)5%)2Ut=1$n8 zFs+^!`c|QBBN|myw{A;OS&-TxM*>blKe7HamFi%wJ)OT3+d~+(;Xq#rlKepW`N`ZV zTwkRSFh?i|tl@J*fV~${{do8$vj;k~ORi1ehrOCAO&{I}-@aHp0}=#O0+A`(33wPN z0f+upH_ZdqeIQsS0$Ku0$!{L;0mn>^R}jK9$V)adSBck(p5K3eyy=vGmqx>pjA5Eg z{OR(C(4Y*`!+6cqiqrY#>|Dt$VGA;4?t4sv!p^Zpz_fp}eO9D%AiayoII8#-^Pbl zTuG+ri=y@54R|kQuOL()Pvh_`F8Rz$}Ol68z#_oi=z{h&Kr{`DoG7pnQg+=E`5&E2(%krqb)?ZUgR&zrA)y_?8 zBzGG9%(p-1`sPa{+W_X1%F>mv=Y|>PK){ayOouL@pL%x0?;!SkUK=J`3-LUV}nmd50piQ1R&-lKD++r<^Xw`hmLg3Vbtd`W4WA5PrjyR)7NodIzGYYuW88=mpChGa zY(Ok2JG^G_3jjVRiwr+7xmW5`Wb?ahG9YK7B)Ee>xBfXbpW&)3_J64z=a4WpbJI$`WZ3@1giPpZixf@t&JDJ!lSkS3s9L+;>T*-0)N#3@7iFMP(wF z_-1_G*|7E9ePlUC|Hw6x3qN7*bAZhxd}`)}gG8DIq4^@Q%Y~%1@n2hg{Q$u_H!el1 z)b>tQWJ|hIGyAdYB*1?{8UYRuKhlvuP-~mivx@d6iPE9S=7`t$?hKHDLno&&oj1>s zZG2XN>VpLm6*bP4n2G}(tr_%Vv6HE>itxhTg%Vl7KJ=wVu{{s zy8={YYdi4%aDRW}6{;qDI|wtg@s(4==91JnXorBUdO#rDBii1A?Yx4zrw4x5?n^j) zt1c$Sz!RenKT5I!3{Z?ABO2#m1QU@0Ef@<`0q!AKrm}Ug8`F!FkwK!(*9-zY6>y)L z67k3)&e`w<%HhE8nNauttXB3FH54<@XPbqoP-;i$+Vp9iLgaKg`0+AT1^0V{MFpQ% z_=@!QNYy`SXXLsNWotyCqB&^SK`Vfq^{IEg!=spMJ{IGsuq@~bjk~o?WDJ~Te(ZJX3-S_ivK6p z=vg-3T~@stQ&L&^f$_1{{hN3w`!KFPg`!RT1BsS4v+-kasw8(jQOS zS-47{=rGd>@U3q((Z$w9Q1@YFQRTxAO!Qk(m1HNVXZy3)6glnF!n7iT3I8t7{NWqF zVl+f7`xazXDwR58=J!qdEC$SMrGDYF1y`vG{M?IZ_O-d%&3)Oyxt^L=1~pd$KL{CT zN4BI6!;Pa{ zy*Cy8pV&*LI9w)GLwxZu6^Y*wQkguLoQf{~k>G?Z(^j^wb;e{z1|1MkS`_YZC3!HH`8BJEz3V zmV<9FYBsjLoS?NxahLujUjpICl>%n&T z%pk7b>6T+5QP(25roV!d$Hl(a4S~i!#{C?INnqobcK47d<9-vO#AwpMHh&>evhFcmYgl_bN3)(mn%<-T4+G&Efvk(rJI5l% zc4E4W^ipmQuq&>iQqe1a*Za674vswVpSU zjr*(uPm=tZ^{0odNZ{CulHYiBJELX@=u2u`QE$~$aHaG`%duvBn8;xd{Qb@{P)q>1uiYJlyZ13t)deD#H4kr2C;FFZA= z`DxUQjFJ8x2Iojp?{=`d&4cfZv3GiqjFtN@vGrA`}=I z@P;19Z4n$_4xQ#%Wgv5hpU^dzMYG-xu`0?|f(oC(=~dJ(f3dzPtj&i6?E7^QSdQ;O zc(n;Qw;-?=2S2vx%wB9A{PEr{C|-e>*^p z>}x^i@I$Y`3w)>-dY~2lJ<#WS;s8_7P&DO5wHE|CYikAbgHF`d8DtuaS6px3Rp`^! zkr=Gu9lW#XRnVeCg+&M4I}IFOZ}tR4CkY%9zvNi()JBKfYi2qRZX-B+>j;Q*Jj0BI zQ*MQvHmPVT5QLxpSh2;!zOpO0)91C(vYAA0R!ha#g2p#dM{DZRul6+P5@Sfy+c;3P z8A+ld8w)Vnwk(J^&cO@1RYqV(GCMM-9Q0au3ae`={GfB=Xtk(h~-#7e^ zdoBFLp<9`x1)lTZmUe8OW-1i)navq0Ik8sypyx9_9K;*;J&DiSS7*AAIODU+QmM9s zjSrKchBgMp7Fa8?!R1!;wJD8^=Srph8t}-mjVmMvml3d)hG7b81UF#WIGN1QW5c$tDW3UpOtqA4frG zrM!h7+JZH*V2^0Di@tmPl|H|du+U{B|0Ha+9UGb}r$5B7RU6comXQkH6R#|4-l0I& zHJ}6u<^RxrV*1KcN^lf2xHu2m)X)c3*=YnxP^xtIgF|Q6P=y1;#<3itcytooI z+5v|fC~eqn4ZvY0RgrdLlCH-ez++R>Z3fQWa2?C6=uyQAT+WUPZT$fZXULtS?I!GgJg_ z9bE(rDpsX+5pLPiUg;c-E1KfK2DmkJK|WrVe4-zs>&M%2-Y(k`cNu%dJcTV0;(1pP znETuD@F{E*FawnuC|jgAOflz)0q!~g&%FLyDG4|+`QQrp!$!cBNl4ETHm>*!RpD=Z zwrGo-^2towC+;A>iCYuf`LUyYyBqGIA)V zD!`u|L9-tEci_1H%=sB9ol*|{Nf6s@rZ1Hp{JlbEs8J4GXVZ_2Qdak1BgTO^(=7>cT2F6mTM8kA$02dDJQ#(O-_uMR+{BMgI~33XXT4 z+KLSw8cxcB!Fv*37zR3Y5&A9w_YFDwNYlyt{C@zPIOSi8%z@jOvp zKl(r~3J@2ZMf>8!uxRf+)4j=8I-Z7jgvO+#aOgs_@9ktqjBey#`40P|GC>w^`Wcc$2+m6@;|Z7pBD z5EbrFuL>OT_!fvQ*&q-OOwB$QTX|<9IxM+lkG!*1tph!r1NII;tM>JPg}y!Xi;sQX z#;}IpkpAm*ViwzCEJe z68GDCy&dvb((!)f`f4Y}(sHm#`G2hHw%s{MS_9Rx9I_CpHSls+iY@@{xx9*$2eZjIP0fv@b9t2r_524b#Gj5Qm^-??M@i^M5$5VeqP-OJ|5 zBa-s5t=yD|^0Fe#FzvjO3|r%aP5q>%#*bpFY+#(;J&*I)a%}9AhR3&D;+bQf1a0^N zr#R;c--CSKFawI+cy-rO_ve3UEu3Y`0^D?scd#KfNr0>T!Evog?N8oNN+z1pvk}~+^wqmD&u&b#+w3QGK;r)PKDyl zcPmL}em;Un&fRj$Yw!!hm5ZqjQn>CK{60UD?%s|iG9lOLAsj<2oekKF-6^ZjY31!j zz664-#njd`h|)v#FQl6;rrs4KV&h{} zVHz~b#4646uycJ6DNrRb3H=Pw(IK6Fgb8as{ed z{jD;x+k;dT;<>~FR@xv9)%ZBX zKK03cMdxCwI}1Ov`vq1mk}swL7L#WtpzQd>S|D+Vhr4vJs9);~GLKg){b%1^W2fu0J}BfR65hNy`*c0-K)9N~>M&DnRGyFs-R7+6O;@Ow*KvjKnY zhPgi+9fDpEn&UFARewEjWHo>ptHIyQVv%d`dKL7?7RKj=G3eem+vGk~gR;U_R8eG! zkAzE~BNtty<`6tGky~YTHwWE!$V>hi^Ou%mJ$y}hh=#>L;}t%4o1jD;1ty(DytxY{ zRPE9pumtDF72)}k)O?=&8=DQ!u6IX0KR{m9Y`qFB&c7X1EvM!Wob^jYseQ#}yKO@a zXFs1>irS2TiKv4c8?9)^h7a)sTd~~!1Z$JM8069k2*#7}iP6@($?Or=C992J5O$aX z%M{-?F$2!DRcoRr!Y{RGwrqvMrKMJ)*)04X;<)!!Sb2m|Vh=v*(4^JxIz3tPn*%vk zB~!`>86~o!`_1Skk=iM&V^q$lCUh;|BM+VaJ@tTznfQ@PSCV?bp_7Bjly`BTjrN7%0;dQ)k##9(GibpoKWd^%Yt?1!6_vuM1vgc9SMx2Oif4RTM za3~-!`d>7B^_FLxynO}j?I@^;HqnUF|%Vn$<)1qmm-lq z$aS`~s9vq+vHoF8KW`?xByw^#S3GNtxZsJ)o0`#~mLaYhitpZDGnHB&d_G^yy~U+w zrPf;nVJ$?oSc)>*QJezUgvh<*(RHJ_k=@*q9%^Z7Js|#T57rYnHCRr=Wg9`%roJER z#AQP{OTU%>NXo(R$ta@RuXC_1yZW)-xnSneXYG`9D z03VCXM`D+wB%CjQI$62ph>W+*aYGNDK|J{FxcP%Tih%Vk6xH|uev$v11vor2l`b0U z7;;xay2=oT0|?Rn@0NJD{5WqY)LrWJNs=1~o}cAK?{%LxLJs|cU$UMhuZz^9+vZ?} z`3HX<(h!C$M1tKgCmGbY8P;pX>@F{8-bXUlagF1MVazA@O@%7p z8x84%2D;%1eB~LU!=V5;{QlCI8H zuha)oe`x{Wp1+{XCvtmR6DS=JY1X#2OoMaWu*_M^xmtrCwpdF_rC%}42!_cCq|GPS z@GWC^sD)|crpNRj6BEOeI#8o8qMA_GhJGk6hc2{s-V#4ZLTi=L+COq%c`h<$la1)i zLp?}*vw?)U@CoyN-;o!g9`>Ln-^x=S;3TK6-WBuDnIwm=!kd<<{6Ew*xA837cnf3x zZrOon)S(ct9q_n|yKW+7)D+q2>2h0ycl<9ZKcj!+9M&`)N`<=HUsIKbW}-LB&0@Fx1Dkhocqe#P z3K(hsrV*EXSic8TwwKQCYXjk}=Nr3lo0_)XM&Z^r%zVAPcjHQixNBun`4OZhWFfk_ zjhcw%4NxCRLXGERbv0Jx)?nagTt?sTsjA}~b6@Vm2HLQz$R$I8bD!p=Ci*DVZwa^< zv$i_sgT12Ym@X}D(pQ1;1TTkUlem!IR(Xv;E^VTpoI2k%8(lr>tLIt_Z9r;nAZu|e zmEFt@Cq@V-G!oGl(TAMm(dE*evq;cTOh-F9Ud*!-QS18}>*-GNFF6dI9=dHOnh z1XoM`51QDyoN7NK)FHz_S2O|4O{U1-vz`EH)BzJIA#6zzT%2)g)+Jj};^mlp-xV^~M#Z+e!zd+0#C}0OvK>v;5NrzXLG~#%U zxUvPk*~2D+YY?`eS$pJudly%{dvz|RcG~9Wp_>=6448U)Klb7WXg9{wtBu4m-wyR% zG+xeHN_uPe>CJa#960wkZYDB|u0r#aRrV$-NZ|NK(u8!$lO1~|tmc;L>1x<`LG&JI zsc{bk%bp{)R^^bZ0Qxw#lddoN!T|+&>e3|XbHqjm-f4#IQAU^G_Gi)dT%`N|L(is? zDxmQfp^AJ;Vh(IX#HB1{*G|`@_+f6wmS!R zQzs;VXQpkLoOzKp^GHWsjOQr6T>+d{S=vDRlait4VDr;(?n^)zbN0FqUB2`vLDg6N zS>~1Z1s&DD&bF2Qt&AhGPrEff9B~ua}wUH#0p$+yw(&fD3lSr>_6jsu? zy;d=!54dxj_LlhYKJ7g*`&J~s_zAywZ7b1Zg41$iQKioGg>ScOyEa6_(%UszAC_U) z$#L=9w&3W;(ON5ax#b7>u3WH$FKh+|x`smIAcsNsnJSiSfO=;!_09-o5-B?|lPW+C z#iDl2#a3%FAFLp$iP zm>PU;{-ky-mlyHL-6s$eyit=*JQA5bNA&sN8lZ=&x0pJ|5rlC4;To)L3i{;{64^nP zN@^D;rA8)GR0ondHqu2mnc;2_cmD3CJN!VPn)giASwdGN|3-UChS7h-j7a`>bN_9N zb1$DYnt8cjYfg4-7KlS~uqrdWJTKBi6^=`rzSoS_7t1bXAl@D51tOnI6bP|W7AqXe zXrLyiVauN(Z1ukb9q#L-mQje!BRKvp zM&Jd3N4hx_fNnIIntX*i4_)S74)3y$9Sm-xBI)tx|yP@ zHh*%jTsolCu?OysZhwrnePunnLe;AgUSHD7z9)NNoDW)6xDMRIKFxC7vECRV%Cl+p z$9HY@oR;3+}qO;+$N|sA|U(4xaEOU z8-{^v+1=mkvsiqn*6mbm zM;_wfj_O}WVs@i(Z8*-Ipt_sVrp>hl=hkhvn)yK(^RAT(AFux7G`4mHY_kR%Nrjfr zSQT}%(5gd7o1g|OB~+bV8RxSKxUe+wB*FEd@e#u9)hlQyE_J*|2M13{?JGBB>pXz> zY~j;4t++1MX+xi*fnX+|yK`I*$AVVTdcfzEX;459eI{GD<0^bSO{_PL#Hyh&t*HBn zwxJT-?&m7MaSy%yzks|~C1TCi(SR)Y#A2$hz+DZU9|-yrZq{P=gAY`nJ~Q6o)pqAW z&qM>|yi947o-DQw!9fjEP$*eW+&^|~)U9?U)Ywx;71vR@D5A5s?{|DTu_faW?Z$7Zx( z-Uk-AlEZwdx}LoK^1hYKVT3eEQONo>o`jy_aD`vp?XsCa91qaC)=5_*=%uTG;-*7Y^*J?NhA!nh=ns7e0gZpkk*g3=U%sleeHv zygdhWMatU1U~+%=aG!&}GWNC)(~z$ZBy4>H%sXftxpPmzsjX!CvyeE~^&X=>Q98`i zailhr=+}LQD_2Gv#>Jj(3M(xKw}s*QOltiG54mLm{6fFzekfVq&KY4ou@&Ide8w+1bfrf7ZSeT0>WKn&z32#Ve!dWL#CtL455K;G5qgd4jAoF)xMG!^`U6 zstJTkWF~h(Yab}!y%)Id6xdSF!>i5R675#B?_3XkrzpS{818ak(N}$9JlM)Lerv~N zd@x{x{rvvtrZeD&XXw}S(9-FlqY?A#vijCwTLv)=Y2P%(X@)Sd)A6#M4F$6`qS zS$H&O0x(_2~MA^bxo&Nk|JAd&`IU(<+d0V%k7FW?k+@+g2 zi8)7Z3L@0==gs|3jo9YnR*Cj93O|nUg2%^8)WKtc_OWkT|!ALTd z-)TK^a`K-Xe!_=p6$GjX=&8qgK<{hiSfE&{bo}2CkQ=e+!7JW!>b;SEULhA-%_^rx zbhwkzbX;Hz!m{?S9~q07#H~gOJyaEc%KM%4?tbjeNry|XW_(j@PE$G+WjSWW;r%MY zU6BFvMk)QzMY~UEW8}Bg$FhhtbWsEKIMDx`H5--@E<@HY3^e>eTyUAT$H}--)%w_F zE8L-TDKo$aKHk_j?BASop+dRJ#U-J<_0><>7M!8O9^*4WOH`A^bi5UD_yfc5EqxVU zWICV|8Cw|X3r14wou#;9fd{-+j6nw1i1hLiug!&sCOJ#&TRXaaw`|QcWFoo3qsHf8 z`>HFBjB`ew{6-c_X(370m0#$<^9G_kr4~0_ zE=!AAlGc+N`Fr~7ZvtF0{oj&yDiQOQo!R-Ykf{L<;>Vb_tR_aLo|){7+u=naJ?k%|>r zP0K;P3h2n;1$<(qO+IKwSBSiJf-8MZe4|bdYEJ)1!8SQgxd@S;X-O+U#Qfzb&lR@6 zOHJ7YpRX62%|%E4-LYsmfizLbB$${k@FS1{j+Nu9t``K35Skk@^lpFMwEI&s+xOQO3|IcFTqlMz14VbIaLaEeqJVwbAHe2=YLcPs9Eo7CU zrwg#Svel8DZ|(K^>u$G$3uM}k`rX8PeuSErmKnYK6qrVUA0fw9i+K4!?oEeVUPLO> zhj4nIrU=*5{ekk5!w>a?8KWgx-rm@?wS>XJD{u3mw<~)pJ=I}+&>EBeNL=Ez8`rZD zfdzSmp2;pEbPWn#l<*1} z(K>jl$LH?)#5K~ZfGi|JwN(Q{4;R3xZ?cg~qU}Smy)*C6ujK8hZJtcQQR<5WvtZmf z(tDD@^uThD$Qq+@XMUUvYS!K^>^gIJrep__@EQ_Ld>}SorWLEuikZd56EU>pOO{M~ zL)S5a|B%Al2NJwaOmPU~9i!ax@kM~u_}C8eGqLYecx=7MSNty)8wBjLFEeXyLWH(BANQaV&yBWCTQsJDUZ>G5nuAx*9^HA11 z3J0V)V|d#p#+p!Mh%BUv8^cY{BbJVBTRSrmHOE0smHHZQS7=tl7vR`og;sE)X{Gxa<*B`eP5YFt z@El8oLnM$4rtOosn`~pl|H(F;V0$7FR|-k>u* z1p$Y@o*Z{bfiS?@7>b zW4&a@3fq=5Xi11Y+Tl4qC&GLN7Ebppxebgod1 z5{e$a41z}ig?eMOYdi!Q@6e3$A(}@^@(|X)uG?yZcGCw@&U&YS z@RThU@*eL1Mik?NrZRw|nuBg8Q8$V38oEc6;KP9V6RjB$M)G7vfrCcn4M2rJ zxQz}vBzi9$3fWLaMyXW5rWeR`GEiUtAORE53k$Y+_>;CnNi7%^z<5&g0;&GHnKdFT zH(LoXrim&D^dz zYaaJ|E{`ti8pw~HsJr(DzPu7Rx>zLnW^$_YY-KI;5~{@Bo-_6AEI?aHEq_STO&|~a zq29-xdILb-$tkb{U)x0r&LR?ZcWZYJg<@zPi@u1r!vNzYBO0Z$)_-UTO&o;UA8GR$ zAdDEK@We>Y)0<#gx4;cT zA})z_;QcJh$YxhE^fsyXH^6+lzlnYFd+OVIE#L0;&0TCV9&y>V8D&+2;vsnHB3`_N z)0I;`8_?qZ^T8{DqZD8{gQdT=gw`yfr)H3y69+re^&3RK5g}VDeGU{mTIdP&t6K_4 z%)b)Sr2V)#R4bkggedR;O6nG{Z0uCU&D30i;CX7M3c_tZh_LomQ0f)icN598LL!cT$?8H zCI3dCL_9T**BvJrKp^-xdyR~NzR(W>)b+`RbCt4TwTQ))JGbRb`mKl`?2h1x*bLiE3zL zD=>}O5ET;Vyy`8_DD&SV+Nl2!JzhR|m*4dsSanri>T!kl8Ab0y)hCNO)F|wN2f`pY zbm#4H*aPR?xl5p(k6S%X5_ndiA*d+M9)$)Y00N-D;a!ONEb=GtxD02ZgWI)MB*>P> zIyMoXm3JhFCFl9lO7+J8h2gbb>`7f}65atQX1t`X-Gx-rSqNLv)GaBMsQxDj~S&( ztiS|~;qE|k^p=%6`Pyf|7T~X8Vj;Ca1t6naW((80G^{g+#B7n2V%n|L^#-0C| z6EjDucS!)t%6=D1Pt`Y1$msgsP3s%2HM7;E!N?k$j;pE?DCWhRjISnYX9UR0Nl-Sj z>e&ohcAVw-w(ShXVhs7)RSO;T_v8HG1xJbDx8lX{?Xwyg?K=tp!Y&(lFS~rU4bnl@#c@eunl2xH$v3`_)+f1{vJJ$ zO^vnwnSbWHfFU_m>S&uW6H%JKaUJ$~>B$!V{_x2HAEIzOF8SqV$C5J`D=V<;FNUvQ zft^R9%JEsY)Hgy@V;u0+F<_3e%XGex{AoAXC+Y6;gWhJZrAU#D;vR`^w5)y3*L9WS zp?uAr<5La8e6EHzLn~`3!}relfti5dc3ZZGyj@T=nT0e)U;=EZ+o5%blGXqDM@riI zAtaZuEBjd$6o3q0>G&`9@JgEqjbK7f2!JyXgJ{8SB*>E|&ZAbdK3s=Xj)59kROQ_9!IH&?-uLuCLuWpKN*hAVUQn^oiIML_$nrSUN zo+QAuX7w%JR&5*=I|luPKY2PaY_wauay)#0Aa(o?w+n*zFIHtawVpJCM)|5eqsJ06 zy3A4edNU0IZ%#qmN$P;09#J2p)fuNoXuYHWvuuHM_68WxBml5Mcoh2I95s}PWLWyl zYBvEk1RhJ#9IzdzxyKC(8o7uiO@nxtT{g2B5mM61QvV?-qf;}fxBed&Kzn%pJvr+6 zn-<>%j|V0TLGG0fbOR>*YHI=qMK$;!o&+-Z1}SK%g!Vc%fM)Zk3B`M40zx#h6Cj`3 z4uL{(w+Wp5kVFF3rlKI58EgGJxzowvA zi3B_W3Ms4`*Gmvjv9*f$?Wb&~Mw;>5r%l_*-TyG(Y{h0I5tqWaQ;uN!1by6_m~hU{ z(2;J*68M9iM6@LIxN!w$`4uTcI5dK|paH!AJMx15<1^?{5!WgPYwu_u@e!-PVDy4N zK6-?Zwe&97PyL?Hy%5*N^IUyjq9=7u>-aXXU849a)IB7c7>hx~YTZ}3;`(a595`okgQD@4iRT~{ILVaY`m+#4ej{Pxb&uM`UU z-xTsA2lm38o1`%*{AV~-{@B(Bq5TaZd@O2ERLaVeM1L9W9KcGmnG5P1Z2E z0zQ&2H$@pb+(oH$;m#5`@e!%sLL8kQ*>)N_BVx-MCq<-O<$3EQpgPDeV4@W zSvf}N`9q^K+U^X7LZEg!%q}ut@7YoBY>6hRDf1YmCK{7@{DC(OFx7ORcs3y}Mp1A0 z(ZY0q4hc$tYW2xF_HS{m^^uSoV6m&VW)4JU-qCRePCM3*7A+6B2T011FJ(ZosX1xY zsxvufFJ2j^*E4lV$wuA;kkOkFnfW&%ZcUThyFm(UtGcPF-QwgugfM7sP*SW}w zJLJ(Ri7NOV5j5fniwzl8j*%z5dHVf#69tj>FAGt>d-2^y_~-Fl;d5*~H7 zGc*Z>DuBHB2LIkIxoD63EwjXpRsV=bD$bsEj8UyJ5Q;>0*?`|L=4wb9~hAzCCs1 zTX~mi@aAkxf^>Dgn;pZ$|LV?@X~-&T>SLS`&}>#3QeQPnt+*(PI3@v(cAD&qXzlJFy#{i$3}9N0N=r?*)Fz!O96xc z5drsL7cc_g1&s|t1-4&qPzz19KN5Ix3X!)F7Dr<3Ji6mike&VIJf4o}ed(8b*xaGM zQ&JdNOxNy!Eg2)nPB8}SG!Ap#XxwQUjA*SA#p_Z0#9*V97l{)5$BbJR5pDKoVgCPN-Dp$l#}J{ z!z>9?Yk?o%51jZBz5+t~JM<{IS~zw+9-&kqfx|BcfwK|{AYalr<}!R%{?Us{xXc#_ z2&nX+QR8v5w0grg#Cw3WHg^-Qw9JhqHdf;uI0%DJ2e?)7tL1Pe0yk?9vi)BoBr$!# z#$=Fx=!^7Tq{2+7Y@Xgs6r}8g-EfH+%{@iB2vj+-;0WyxYzU93VHV0jjie&&atT@C zttUz&PjOOcm!$IpT5(hwPLQo%|f4aDR4VMKJfU5#x#jH)h@o5>0kG1rJ|kyofS?G zmjKr22Q*3x^cfX!kd;i)io8v_t_Ya$f~FM__ghfN&~Dv77ymm+NrVDDHv-_Se*+N7 zW0=u(tl_ElGgiXB`YHCO7}+_T!q*I;hw^gt zgd_KD0UJcWo6hg>GH5TJWqqSUIQWF$S@^rWa9a}~pmEU93ETU68gM>a0OG#$e3n94&h}={~D)09sZ=)bKCUz4tvW z*$Q zUec%JHm4GZr{zdid|^EN!rx&p;!ivUP-K1`ghVY0+C={lG%CM{_M^AXGW7SC?P&vp z13)2cfbI1ATE;p9v;doNaow^o=(S<@^4TO*#7;gd)EWaHcToLh-C}Tv^3c`NFRFH= zsNCc1ql=~+nW~AEcjbZoGu_1ok4@Ds*$NzG{NM6QViI(D4driY4Ce#n5`dBZ@aXnQ zaZtmy8WW|aH#pDMd>kI+rwAwGP_oZc_ip6+k#u+c=6-Gb6mKIvb?HS_D{wN-enG_0zKM#!w#MJ&f&|X;@{5CXB6lR*rNMWX zN?wXfrs#K6s%yW5qbPiYzmB46)fTEHZ1 z!1azD7vT}>OXV0qXa5crgyUAA;o6r!fEb;lVRFHW5N;ps*^5^|J)$2t>t2F;R9wL< zH!Wke`ay1Bjw!=p$m=Nv3kA?N9S?6aJosyl5TI-t`l+#^Z%%XE*%v>a{TDXuzkQbm zL~@q|rXfU_PUjIllgIXQ=uq946-YF2?)$GBLEmd8bTI`0SoJQANkjNXfvk938sc7w zoB(~WLfk%9Eu!cH=&QIi5~Z|@l{nDI-RUbp$`)|P8i0w3)N>)7o8S79|79j0?$QJe z5nsJYzkDUB0iP%aw~kNLD&Wg~!?LG6`N%Je-bv&V5H6z}fwnk`E03my1im?FZJd0Ft|Ny{EV~?uF{;vkeHa z*k0@>y{UPfr;nfFciC&>{6kL8n%zt38o_&msGhUtBv|^)@JkYrRFcDwvOIRAhZu}7 zFN(CBGpO74?xZ*st3r-DyokCsl>c@cZ7%+TZoZ{)hQ9$IWjQ#+}QDf7&yTguAS*s~u~U!(9|aq( zM9^Vd+8~QC(DFb#Acc{1VG1-a3<^@~Wjm^?0yWC`obp&J#EX0&Wd77>3e7|CLI6~A zx<)0kd1!kvDbR_e<;P^`!(6~Ah4Ni+4H*C8Kcd*DRV~V8x*Ie`G4P?~3S5kyi2EnD8dN> z!F55@oS7xr-c8pNhXSZSF&BI5(Obckn zbI2J*cquSFs?vYKW%srr7{u zE9&TEI;7eaT$8{yt)M>Em+`T`{G!KMr0#;W>5nFi##lal>Itn5m7!FJO5GN7d5|Ph z@R6=SiQNUFxlIegT6wH~scAf{y}$G9gwt29Jmp7&`%H3fwGn-><<55tNAP`k)Ad{+WvO6uKH_$)aG3kR0Fll}w?S$dh?O!vB3d_H`vFLSi-{#mrmf`H9zf#&SP zkk?l%{V#rNpVK|*CM|Yqi}~qG1{?l-|2g|v&|>)S@b1vP8m!Z728=jQ-SNblR26O3 zcK%CvVZB;JThff83hl65nAd3nfb|}2oa~Zd?eb_CaB*TsigGf&Xh)f}r(U#=uZeQb z2N^$hksbI38d^n`WP21u%wQ0udeW|fYjH6+p=+%TP`!HAzTpyP7knub^29swANjTi zvfA+@yx>vba=!E57y3(M-j&}N7Jm@t?tC83BS*z^D^XV9gc`ToNc|rQT-$)hO5;j@ zpQJir=>8sD_Qd?niCj5xaK~J#7zZ$r-oQSjS~!0FvY|DmsFqDRlP+2nw|91HGsI!j*k6k)V6GyKT7 z?j=)@9;2XQ53=Qs?irYnsY{Ouc(&&Pm17V}VQ#t_9I^tRHYl5Ar2ZYt>1r=zR`04t ztTby0s@tUMXX`}aNG_{Av{jY3_q~o)pKmsCN3V%;KZ;1?u8B-U6}aF2{ziN=XL=X9 zn*i}XhMFAMYOF(t(k0hJx+mHw{=pR({Cjf1!H11GTt8_t476{{72xHa(4LEQ7G4GX z5xK~(Y&Z>o5Ro{s#X&c-92>_eJCu(z!cwD*Q*}R(?CK%f+acK>O}N>TRpMr?ey{+$!G zjM~b`FpNuX8?E`vS7_UCcs60FBf28WWwW8z#@`I1Un&8^Jj4rf1+=JM~tO=)!O{__?LcwteD7; z(|CLir7Yf8{?OnlV>nip3%M#S%Wy>+bY7t1T(&@TVVbI5k0qTVqwNih1LAWN_XFl| zcx0ezZ*6g&yW%p)U}X(eyu%LUz&M9 zCk;6r0nN7I{N?GL@L*;hSK9b_G_}5wAIo^qeW?60@);H$_((OkxF2iTCYk9Q6!s4^ zU+J!eFe-EU+a9^BCgHrSyiR3P->+6-`EGm(QqyrIJS;+L^T%4sqOqCVb)89~z-idd~Acp^zpm6ng zBG-9)^z?bqcEUG0(})zb9aEdP;f}CfcZ}{IQ#welB904}+2^;8<{$qQdy6&3itWAG ztu!57{L_2^r+k=38Dp9Nx;)`{_~ODY!gtdEvDw$rwZE9^nQ)ahz3uBiu;zG8z1n8I ztEG21qWwE!|G`=4N*{M|exj1-^Bwcnd(5Uk-*XSr^Jpuw86LIw=2SI@#5GH}tdBk= z2<{)UkPn$s@g=SFMte=!g^!~*Chje6{i53&V;;|!je?#%iT6M}g+L0F z4qIdemH2gT^61kH3?SxaZ9!|_pA3k=M=|02kfPJc z*g)DH@JMo8g}$o-L%8rb!-x#pk!gt0B%(FC(LR_}0c?!tXl9qn7qB!s^SvN=E?R*x z<`z05j{O^haf0}=Wz0vt=zS$M(O7r10#A4Ib0KT#=*_ylojtw)bvx2!Jg(u7*0o9k$;?efS}O zS8ET4fvr^WE6EEdGoGjaINt|7@IL(~bv3vt=}L)5oca1qUT5-p39oaz6x)>tW=|YP z$Ipm&Da}43;2I&Q@*Pqhu^oD<BVzvL%s9R*>NqWdHH|gd0~ap>Ga-9Z<6H zC?9S;b|pTPe+jYzPQQHhI{l|v`ri~fbGUEob>4fKt8sScP0Q)a%s`omZemYl8SwWC zZ!qC5eQTg!d8n{>G3}vod$Ju?9KD*bobk$6StYkp&Ho1-x3H#-AhL| zgPKSgRCGPcb)i~ka^Wia%j4TF-akK0&2(=4b*!m-QxX(;`Vaf;^dHT0*9NkGV58a? zb*QZ8tJw7DbYa&Ko|-~_kMTEyCbCelu^4W_4sQF%@VWPryhPL>8)iznB2v7eVx2CM zcw9sEi1CLy?2P0j?nbJ=0R&48QG;*PCcJEq_HoPJmz0RD4XYGKcs-J)6VMi##~I$W zllp}6L0q*HeT@x*yVij`G-tPM)cIaO(qZ^Hg||NQcpwk7yjweI&kqS1ISu}b;G8_{d=Bc~bt-fpO0vBNC8gdAq9#^BXwWKETCDcS zK7-cCzCLgbSD{v)X-)5oiSCdiwIX&z18~z*(@XW<)42NDx@8Y9t@&r!oZ;0CZ-2Az zL`I9=D6)h zy5kM6#{+X#7Tv=Yy-x~)xKBntZq4=T%Nz6SJ5-j$ZslimnT%zLp8isTT9PKGC2Eec zhO97h`=TWVUCp-kq#iL8%+=O?<-dHUEn6Ta*k4MG{f9n%p{L;^p(ZVkgOpw^t{-P& z{P=NHPYdx69CF|<&cQkX@&c?z`wnp}F}do|_XKrW&=!ohD(gSnl`}THKzpd*gcL;_ z-i*e_S_{<8IaacM437U%pmg0%h>+WAC6=Gi=N6(W%N;^@n>!4lz@Gw~ z-==EwqayM1M;+wxRjga7!s1V>RjkMLRqWvnLC8|(HOYYsxe;oSen;93haQr@E{Y)( zlRoL*5R&}y{<{GS&Gz3>GIQ4$fnm{opJ8z``J@-go~cRJ4<_a!+_n~SKS&~B3RO?> z7jvJBrd<>>&rwlbWKZTUQ!pI)ZHN82k10@L=;rKJrY|Ox{%c3Yr4A1+>O$Z8%X*eQ zPTZ#Nt0C@N)U?V)hE+FT;+`j@tc~t;RczJ2svVTr(+Q)^l;~UIE516wqOMPBTS(fU z*7g^t{=;*cAnPj}9_=)~KLJx*VIOA$y z^o3{WW&tWR_`Uj)pJ03!gBdmLRlp>u77hY&g;<&z0To2D#x2%Y;$XeB2cUfVrVJ@h zt$47}YgwfUpc843a+UQWd*OfjTf^5+q#KrH5%-%!?*tE?8t+x8S*) zU1&ELU*qoZkp8P9e|#y2&ldKwF`vtqdu`nBI7!1Rwa8XmS!okADSG$yWF#oICQEjg zZNVX{p@Vm+zybL-D#$8(ImD%=?;BG4@oaAxD@TOkK?X5ROnT;=Nxno^hG5sn_I`T` zU&U7D&EfR@z}|eejxRzn98p%2trn6jG|sj$hxj0S;*DgC`tgfbuo@kB)B{O9ekERr z4v^~QDDt8o_N45_7{@EQHnZdg(zink?y&u#^B9hvxv0iZU(B=A60>kMEm6oV&P^>W z`VYOQR$qci)!F%&OojmCcggg3Uf#b#GL&PtWvphhck?qdY7vhZ@Vn#iIi=4jW>AP< z+Ci$AZ8>G)Z2yZ7ZI>lGFXrOPtmbRJs~m8#IN5KqOUq~**b<@&^Wv1kZ){aOPuylu zDNxvN));g?Z~DEeOKUxo{*;;?x1nrt`T+-x`+j5$i;~+e(t&jqmwFCuJ3j1|+ukbV&>uiCS_s@76BHv1;5;Q(Y&k5t@5etbYb%4vaQnu9UZy1vOAdC6ScBna+lPMXzdU$E`O=3 z{6y$E=2q-f*Hd!)c?bQ+lcBfPk&&((6H{h7dlODwdqY`$&1PIt7Z%vlRre$N&M%wf z@?O)|d|8_$F}&ulBRTvp^sCU}X+l+PMU?DrhdB9w*LHzcwz8A6Hmj-0^kXkx;c(d6FgRY zo{SZ9+)hsu+Ji5NKC0k6nCkp!7IH~OHe~UQeezi*ayEH5Gx_@3HhSzTS75G*U&?bN zZt<^oLDtHWpSZ)$^-r`%!h5g$3p}3(eC5BU=QP->Ihon%CpRP5Wk1miE8bIXY%o70 zj5R5+KsJ^=`VCO6^)a@0Ph*eFO^UG1c%=BKID4c??2 zv50#HYVMu%)2aoTbPhRaJ7#(e2r)ggOJB|dwlo?YW;{KPSfv$EyRwIH}i&OzD}Rb^sbRIM!e*|VVb&r!|` zswyF7?0YjyXz|KaRpqF#gZu}BqQAB(l`!v4!n3NZBu|c=yI^KSZimN54$k}h`}{0Z ztScGOS5ghl>_OssYj%uH>aM$Irg!f!kN6bM8VFBajP|g4TWF^ub4xkpn2Ua@DdraY z(U$u=fm{(-umA5dt=KE3jFL|UsazczZB~5kXLD`QUDjejG9aP6EensZ1BCw!(cBoN%m>gtm3Ui|AHE3`G~fM zDbrqGnWyeLdE6O-+~hlnHNqd{8`;C|c-0n11rq$uV$WE7u^`^4V=&~(A7+jA;BSLx z&F3+H%f5t6W0_H^WNP*B_v2H>hR*x#b2mtaB@S-s9cepWnvyaRH%BW?Z^^wU8j5E> zsUQud9TcraT^|Dua4#y!b#GO_{}R&v>cF0jR06Ve`5WM|CgvT_g4_!tb)~Gqm4-o5 zuMW5i-p5?6OJde@@|r`>Ts8Eg%X0f0=h&D2RxBw||FPGc<=1SDvgU$W_8xKzFVntM zhK!&7k{UmYxlD+NnZWrkpPY&;4#So1i<>9a*{o=-g^MK!1To7$(cs9=&md*%?y|Y$ zJz_1ac;@!Yk!_FH68{`8k-92ks#+WcUC20~-l=#mz3B*x%H&wZ8p|#_$iMhvsGi`D&b{UGdosWz@vc_+d>vG+LKPea)nH`qSYS|<`D8fY)vF-O)8|v&89O&$ zAd_&ne~>a|;S~f{u<=lOj1?=L15@2qTtI+vooZ7kIzV*i8i~2h%B~RRD$2QBn##wJ z_9)Z6AaCYrtZR_gyO2b`OVg}zpA|pU%R2J(Bo*bEmf694*5&%5OiMN5~#19GEK@$cHWu)v)y{k86?i&5t>*V7Xt88FH*Mye0K zJM>@&l|MV=Xq?K=RFZT}@l4A_Z}pEU<&(e6i*2QNWN;OI$%b;Pu4lb~bx&-U{CXrz|sG!nT#Gu!vu=2OG-EWyr8?xi*5 zo!!stx$YdKNx3U@-<-%f;qC6PyKnnKWxf9{p{1(U5@PciIW{7+fGG_zpkF>?emrQ{ z%-ZubBbMc}VI|}HS}Ap%x)R>tvdP#Aw%2FkWY0L8UF=9_GPQ2;y(Hj$&XGTPRauj$ z?+b@I31e+ukSP9gOmYvT)y=nFkG?dY=ultEme=b@(e{e;=y}r!m2{p-OfqQs+RB1C z&MQm6jb|9d7)t%I6SVlq()W>7JmD*wL9E>^*YiwK310%_nG2b_thk&kjW-9jSJJ@~ zes+HJ@-pJL+_^~n0);WQ(rG1mg{*upjw3&1yxjUUJH^Xow1G2_esxltex58M;`s)0 zyL`Sa$@y(ZAiA-p(s?j(p77T)WcZ5GbA_1>;>peL`i^6%GUU8-a2W)BOz>;I*tTM+ z*Tze?Se4|M?~3+Z7H1k~xu;Xd&)AycdY)A}@OA;9_E^;TC+Bn4C(4Q zX$oA$8JTLv~Sg3|PPf#J5zq|=>~wkYG9 z<{nm`HR7@2sJPBGufnKdi5{f8%Xg=;C-d@^-fX=)7V-kTHNQLWntMJD$)rb}Asx%g z26$)gu{bn$&+VTkdJ)y?`|s}iT1xPDeNk<_yiai#&o_A~qEM1^~wwq`j zkB1U7l*y-qiuW2ix39`dpI-TtdbUTjT58onhE&FeYALoo_-`mi{IL%d81a+FrS55J zMiyy`rbJ$ubVf(7V8*A}3a=M_E7~XFXt#$j;_oMw&HC2eVen*w6WOU@iPo2u8>@Te zm6mu@0vK2jZ?LSS$L`89WePBKeCGM99c;$;)$*<0&UM~G@akE!k5d7^dV;bB&RH&S zF}EwnrdIyTNQ=@mMaJ(W<5%wO1KeFlu{m3&bXl-vI(@Eiu??S->}{3%zUMql+hzr) zt{(YU;ATVq#Qv(3jtC2Mo`O6{m2ImX<1u*qU!?cRxG>oq*4ca%GnHrMO*Yn4`g-F$ zr}pEWK5yZ$t_rymKZ|bl(TrSR(O@}mcUt%nFP*1lRQBP*9gDM1)t|N9|1{<;WcF_& z?RoQBe(qZG1}kvy5-eH#-ipau@!gW;nDUpoxx0PCWMfY51*G zp4!g6*!sATW=v@HK<8DUi$}hp6wjmJV%XA@!TmM~{uI#{RpD=@EgOJ)6YnT6!SlV@ zhVRke>BVCi9u_ctp) -> Result { + let ffmpeg_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + + let ffmpeg = ffmpeg_path.unwrap_or_else(|| "ffmpeg".into()); + + let result = tokio::task::spawn_blocking(move || { + probe::probe_metadata(&path, &ffmpeg) + }) + .await + .map_err(|e| e.to_string())?; + + match &result { + Ok(info) => eprintln!("[cinch-rs] analyze_video OK: {}x{} {} {:.1}s", info.width, info.height, info.video_codec, info.duration), + Err(e) => eprintln!("[cinch-rs] analyze_video ERROR: {}", e), + } + + result +} + +// Step 2: Keyframe extraction (can be slow on large files) +#[tauri::command] +pub async fn extract_keyframes(path: String, state: State<'_, AppState>) -> Result, String> { + let ffmpeg_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + + let ffmpeg = ffmpeg_path.unwrap_or_else(|| "ffmpeg".into()); + + let times = tokio::task::spawn_blocking(move || { + probe::extract_keyframes_fast(&path, &ffmpeg) + }) + .await + .map_err(|e| e.to_string())?; + + Ok(times) +} + +#[tauri::command] +pub async fn generate_thumbnails( + path: String, + count: u32, + duration: Option, + state: State<'_, AppState>, +) -> Result, String> { + let ffmpeg_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + + let ffmpeg = ffmpeg_path.clone().unwrap_or_else(|| "ffmpeg".into()); + + let dur = match duration { + Some(d) => d, + None => { + let info = tokio::task::spawn_blocking({ + let path = path.clone(); + let ffmpeg = ffmpeg.clone(); + move || probe::probe_metadata(&path, &ffmpeg) + }) + .await + .map_err(|e| e.to_string())??; + info.duration + } + }; + + let hash = format!("{:x}", md5_simple(&path)); + let thumb_dir = config::ensure_temp_subdir(&format!("thumbs/{}", hash)); + let pattern = thumb_dir.join("thumb_%04d.jpg").to_string_lossy().to_string(); + + let cmd = crate::ffmpeg::commands::build_thumbnail(&path, &pattern, count, dur); + + tokio::task::spawn_blocking(move || { + crate::ffmpeg::runner::run_ffmpeg_silent(&ffmpeg, &cmd) + }) + .await + .map_err(|e| e.to_string())??; + + let mut paths = Vec::new(); + for i in 1..=count { + let p = thumb_dir.join(format!("thumb_{:04}.jpg", i)); + if p.exists() { + paths.push(p.to_string_lossy().to_string()); + } + } + + Ok(paths) +} + +#[tauri::command] +pub async fn generate_preview( + path: String, + codec: Option, + state: State<'_, AppState>, +) -> Result { + let ffmpeg_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + + let ffmpeg = ffmpeg_path.unwrap_or_else(|| "ffmpeg".into()); + let hash = format!("{:x}", md5_simple(&path)); + let preview_dir = config::ensure_temp_subdir(&format!("preview/{}", hash)); + let output = preview_dir.join("preview.mp4").to_string_lossy().to_string(); + + // skip if already exists + if std::path::Path::new(&output).exists() { + return Ok(output); + } + + let codec_str = codec.unwrap_or_default(); + let cmd = crate::ffmpeg::commands::build_preview(&path, &output, &codec_str); + + tokio::task::spawn_blocking(move || { + crate::ffmpeg::runner::run_ffmpeg_silent(&ffmpeg, &cmd) + }) + .await + .map_err(|e| e.to_string())??; + + Ok(output) +} + +#[tauri::command] +pub async fn detect_hardware(state: State<'_, AppState>) -> Result { + let ffmpeg_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + + let ffmpeg = ffmpeg_path.unwrap_or_else(|| "ffmpeg".into()); + + let info = tokio::task::spawn_blocking(move || { + discovery::detect_hardware_encoders(&ffmpeg) + }) + .await + .map_err(|e| e.to_string())?; + + { + let mut hw = state.hw_info.lock().map_err(|e| e.to_string())?; + *hw = Some(info.clone()); + } + + Ok(info) +} + +fn md5_simple(input: &str) -> u64 { + let mut hash: u64 = 0xcbf29ce484222325; + for b in input.bytes() { + hash ^= b as u64; + hash = hash.wrapping_mul(0x100000001b3); + } + hash +} diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs new file mode 100644 index 0000000..cee7085 --- /dev/null +++ b/src-tauri/src/commands/mod.rs @@ -0,0 +1,3 @@ +pub mod analyze; +pub mod process; +pub mod utility; diff --git a/src-tauri/src/commands/process.rs b/src-tauri/src/commands/process.rs new file mode 100644 index 0000000..153c06c --- /dev/null +++ b/src-tauri/src/commands/process.rs @@ -0,0 +1,312 @@ +use std::fs; + +use tauri::{AppHandle, State}; + +use crate::config; +use crate::ffmpeg::{commands, probe, runner}; +use crate::recovery; +use crate::types::*; +use crate::AppState; + +#[tauri::command] +pub async fn compress( + input: String, + output: String, + settings: CompressSettings, + trim: Option, + app: AppHandle, + state: State<'_, AppState>, +) -> Result { + let ffmpeg_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + let ffmpeg = ffmpeg_path.unwrap_or_else(|| "ffmpeg".into()); + + let app_config = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.clone() + }; + + let hw_info = { + let hw = state.hw_info.lock().map_err(|e| e.to_string())?; + hw.clone().unwrap_or(HardwareInfo { + nvenc: false, + qsv: false, + amf: false, + nvenc_codecs: Vec::new(), + qsv_codecs: Vec::new(), + amf_codecs: Vec::new(), + }) + }; + + let job_id = uuid::Uuid::new_v4().to_string(); + let jobs = state.jobs.clone(); + + let info = { + let input = input.clone(); + let ffmpeg = ffmpeg.clone(); + tokio::task::spawn_blocking(move || probe::probe_video(&input, &ffmpeg)) + .await + .map_err(|e| e.to_string())?? + }; + + let duration = match &trim { + Some(t) => t.end - t.start, + None => info.duration, + }; + + let has_audio = info.audio_codec.is_some(); + + let settings_json = serde_json::to_string(&settings).unwrap_or_default(); + recovery::write_job_info(&config::temp_dir(), &input, &output, "compress", &settings_json); + + let (out_path, attempts) = { + let input = input.clone(); + let output = output.clone(); + let settings = settings.clone(); + let trim = trim.clone(); + let ffmpeg = ffmpeg.clone(); + let hw = hw_info.clone(); + let cfg = app_config.clone(); + let jid = job_id.clone(); + let app = app.clone(); + let jobs = jobs.clone(); + + tokio::task::spawn_blocking(move || { + runner::run_compress_with_retry( + &ffmpeg, + &input, + &output, + &settings, + trim.as_ref(), + &hw, + &cfg, + &jid, + duration, + has_audio, + &app, + &jobs, + ) + }) + .await + .map_err(|e| e.to_string())?? + }; + + recovery::delete_job_info(&config::temp_dir()); + + let out_info = { + let path = out_path.clone(); + let ffmpeg = ffmpeg.clone(); + tokio::task::spawn_blocking(move || probe::probe_video(&path, &ffmpeg)) + .await + .map_err(|e| e.to_string())?? + }; + + let file_size = fs::metadata(&out_path).map(|m| m.len()).unwrap_or(0); + + Ok(OutputInfo { + path: out_path, + file_size, + duration: out_info.duration, + width: out_info.width, + height: out_info.height, + video_codec: out_info.video_codec, + video_bitrate: out_info.video_bitrate, + audio_codec: out_info.audio_codec, + audio_bitrate: out_info.audio_bitrate, + attempts, + }) +} + +#[tauri::command] +pub async fn trim( + input: String, + output: String, + range: TrimRange, + smart_cut: bool, + strip_audio: Option, + app: AppHandle, + state: State<'_, AppState>, +) -> Result { + let ffmpeg_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + let ffmpeg = ffmpeg_path.unwrap_or_else(|| "ffmpeg".into()); + + let job_id = uuid::Uuid::new_v4().to_string(); + let jobs = state.jobs.clone(); + + let range_json = serde_json::to_string(&range).unwrap_or_default(); + recovery::write_job_info(&config::temp_dir(), &input, &output, "trim", &range_json); + + let do_strip = strip_audio.unwrap_or(false); + + if smart_cut { + do_smart_cut(&input, &output, &range, &ffmpeg, &job_id, &app, &jobs, do_strip).await?; + } else { + let cmd = commands::build_trim_keyframe(&input, &output, &range, do_strip); + let ffmpeg_c = ffmpeg.clone(); + let jid = job_id.clone(); + let duration = range.end - range.start; + let app_c = app.clone(); + let jobs_c = jobs.clone(); + + tokio::task::spawn_blocking(move || { + runner::run_ffmpeg(&ffmpeg_c, &cmd, &jid, duration, "encoding", &app_c, &jobs_c) + }) + .await + .map_err(|e| e.to_string())??; + } + + recovery::delete_job_info(&config::temp_dir()); + + let out_info = { + let path = output.clone(); + let ffmpeg = ffmpeg.clone(); + tokio::task::spawn_blocking(move || probe::probe_video(&path, &ffmpeg)) + .await + .map_err(|e| e.to_string())?? + }; + + let file_size = fs::metadata(&output).map(|m| m.len()).unwrap_or(0); + + Ok(OutputInfo { + path: output, + file_size, + duration: out_info.duration, + width: out_info.width, + height: out_info.height, + video_codec: out_info.video_codec, + video_bitrate: out_info.video_bitrate, + audio_codec: out_info.audio_codec, + audio_bitrate: out_info.audio_bitrate, + attempts: 1, + }) +} + +async fn do_smart_cut( + input: &str, + output: &str, + range: &TrimRange, + ffmpeg: &str, + job_id: &str, + app: &AppHandle, + jobs: &runner::JobMap, + strip_audio: bool, +) -> Result<(), String> { + let info = { + let input = input.to_string(); + let ffmpeg = ffmpeg.to_string(); + tokio::task::spawn_blocking(move || probe::probe_video(&input, &ffmpeg)) + .await + .map_err(|e| e.to_string())?? + }; + + let keyframes = &info.keyframe_times; + + let first_kf = keyframes + .iter() + .find(|&&t| t >= range.start) + .copied() + .unwrap_or(range.start); + + let last_kf = keyframes + .iter() + .rev() + .find(|&&t| t <= range.end) + .copied() + .unwrap_or(range.end); + + let has_audio = info.audio_codec.is_some() && !strip_audio; + + if first_kf >= last_kf || (range.end - range.start) < 5.0 { + let cmd = commands::build_trim_keyframe(input, output, range, strip_audio); + let ffmpeg = ffmpeg.to_string(); + let jid = job_id.to_string(); + let dur = range.end - range.start; + let app = app.clone(); + let jobs = jobs.clone(); + tokio::task::spawn_blocking(move || { + runner::run_ffmpeg(&ffmpeg, &cmd, &jid, dur, "encoding", &app, &jobs) + }) + .await + .map_err(|e| e.to_string())??; + return Ok(()); + } + + let work_dir = config::ensure_temp_subdir(&format!("smartcut/{}", job_id)); + let head_path = work_dir.join("head.mp4").to_string_lossy().to_string(); + let middle_path = work_dir.join("middle.mp4").to_string_lossy().to_string(); + let tail_path = work_dir.join("tail.mp4").to_string_lossy().to_string(); + let filelist_path = work_dir.join("filelist.txt").to_string_lossy().to_string(); + + // head + { + let cmd = commands::build_smart_cut_head(input, &head_path, range.start, first_kf, has_audio); + let ffmpeg = ffmpeg.to_string(); + let jid = job_id.to_string(); + let dur = first_kf - range.start; + let app = app.clone(); + let jobs = jobs.clone(); + tokio::task::spawn_blocking(move || { + runner::run_ffmpeg(&ffmpeg, &cmd, &jid, dur, "encoding", &app, &jobs) + }) + .await + .map_err(|e| e.to_string())??; + } + + // middle + { + let cmd = commands::build_smart_cut_middle(input, &middle_path, first_kf, last_kf); + let ffmpeg = ffmpeg.to_string(); + tokio::task::spawn_blocking(move || runner::run_ffmpeg_silent(&ffmpeg, &cmd)) + .await + .map_err(|e| e.to_string())??; + } + + // tail + { + let cmd = commands::build_smart_cut_tail(input, &tail_path, last_kf, range.end, has_audio); + let ffmpeg = ffmpeg.to_string(); + let jid = job_id.to_string(); + let dur = range.end - last_kf; + let app = app.clone(); + let jobs = jobs.clone(); + tokio::task::spawn_blocking(move || { + runner::run_ffmpeg(&ffmpeg, &cmd, &jid, dur, "encoding", &app, &jobs) + }) + .await + .map_err(|e| e.to_string())??; + } + + // concat + let filelist_content = format!( + "file '{}'\nfile '{}'\nfile '{}'", + head_path.replace('\\', "/"), + middle_path.replace('\\', "/"), + tail_path.replace('\\', "/"), + ); + fs::write(&filelist_path, &filelist_content).map_err(|e| e.to_string())?; + + { + let cmd = commands::build_concat(&filelist_path, output); + let ffmpeg = ffmpeg.to_string(); + tokio::task::spawn_blocking(move || runner::run_ffmpeg_silent(&ffmpeg, &cmd)) + .await + .map_err(|e| e.to_string())??; + } + + // cleanup temp + let _ = fs::remove_dir_all(&work_dir); + + Ok(()) +} + +#[tauri::command] +pub async fn cancel_job(job_id: String, state: State<'_, AppState>) -> Result<(), String> { + let result = runner::cancel_job(&job_id, &state.jobs); + recovery::delete_job_info(&config::temp_dir()); + result +} diff --git a/src-tauri/src/commands/utility.rs b/src-tauri/src/commands/utility.rs new file mode 100644 index 0000000..e8a6b8d --- /dev/null +++ b/src-tauri/src/commands/utility.rs @@ -0,0 +1,422 @@ +use std::path::PathBuf; +use std::process::Command; +#[cfg(windows)] +use std::os::windows::process::CommandExt; + +use tauri::State; + +use crate::config; +use crate::ffmpeg::discovery; +use crate::recovery; +use crate::types::*; +use crate::AppState; + +#[tauri::command] +pub async fn get_stream_url_cmd( + path: String, + state: State<'_, AppState>, +) -> Result { + let port = state.stream_port.lock().map_err(|e| e.to_string())?; + Ok(format!("http://127.0.0.1:{}/{}", *port, percent_encoding::percent_encode( + path.as_bytes(), + percent_encoding::NON_ALPHANUMERIC + ))) +} + +#[tauri::command] +pub async fn get_stream_port_cmd( + state: State<'_, AppState>, +) -> Result { + let port = state.stream_port.lock().map_err(|e| e.to_string())?; + Ok(*port) +} + +#[tauri::command] +pub async fn check_ffmpeg(state: State<'_, AppState>) -> Result { + let override_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + + let status = tokio::task::spawn_blocking(move || { + discovery::find_ffmpeg(override_path.as_deref()) + }) + .await + .map_err(|e| e.to_string())?; + + if status.found { + if let Some(ref path) = status.path { + let mut cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path = Some(path.clone()); + let _ = config::save_config(&cfg); + } + } + + Ok(status) +} + +#[tauri::command] +pub async fn open_in_explorer(path: String) -> Result<(), String> { + let p = PathBuf::from(&path); + let dir = if p.is_dir() { + p + } else { + p.parent().map(|d| d.to_path_buf()).unwrap_or(p) + }; + + std::process::Command::new("explorer") + .arg(dir.to_string_lossy().to_string()) + .spawn() + .map_err(|e| format!("Failed to open explorer: {}", e))?; + + Ok(()) +} + +#[tauri::command] +pub async fn get_config(state: State<'_, AppState>) -> Result { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + Ok(cfg.clone()) +} + +#[tauri::command] +pub async fn save_config_cmd( + new_config: AppConfig, + state: State<'_, AppState>, +) -> Result<(), String> { + config::save_config(&new_config)?; + let mut cfg = state.config.lock().map_err(|e| e.to_string())?; + *cfg = new_config; + Ok(()) +} + +#[tauri::command] +pub async fn get_output_path( + input: String, + mode: String, + container: String, + state: State<'_, AppState>, +) -> Result { + let default_dir = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.default_output_dir.clone() + }; + + let input_path = PathBuf::from(&input); + let stem = input_path + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or("output"); + + let ext = match container.to_lowercase().as_str() { + "mkv" => "mkv", + "webm" => "webm", + "mov" => "mov", + "avi" => "avi", + "ts" => "ts", + _ => "mp4", + }; + + let suffix = match mode.as_str() { + "compress" => "compressed", + "trim" => "trimmed", + "trimcomp" => "trimcomp", + _ => "output", + }; + + let timestamp = chrono_free_timestamp(); + + let filename = format!("{}_{}_{}.{}", stem, suffix, timestamp, ext); + + let dir = match default_dir { + Some(d) if !d.is_empty() => PathBuf::from(d), + _ => input_path + .parent() + .map(|p| p.to_path_buf()) + .unwrap_or_else(|| PathBuf::from(".")), + }; + + let out = dir.join(&filename); + Ok(out.to_string_lossy().to_string()) +} + +fn chrono_free_timestamp() -> String { + use std::time::{SystemTime, UNIX_EPOCH}; + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default(); + let secs = now.as_secs(); + + let days = secs / 86400; + let time_of_day = secs % 86400; + let hours = time_of_day / 3600; + let minutes = (time_of_day % 3600) / 60; + + // days since epoch to Y/M/D - good enough approximation + let mut y = 1970i64; + let mut remaining = days as i64; + + loop { + let days_in_year = if is_leap(y) { 366 } else { 365 }; + if remaining < days_in_year { + break; + } + remaining -= days_in_year; + y += 1; + } + + let month_days = if is_leap(y) { + [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + } else { + [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + }; + + let mut m = 1u32; + for &md in &month_days { + if remaining < md { + break; + } + remaining -= md; + m += 1; + } + let d = remaining + 1; + + format!("{}{:02}{:02}_{:02}{:02}", y, m, d, hours, minutes) +} + +fn is_leap(y: i64) -> bool { + (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 +} + +#[tauri::command] +pub async fn init_app(state: State<'_, AppState>) -> Result { + let override_path = { + let cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path.clone() + }; + + let status = tokio::task::spawn_blocking(move || { + discovery::find_ffmpeg(override_path.as_deref()) + }) + .await + .map_err(|e| e.to_string())?; + + if status.found { + if let Some(ref path) = status.path { + let mut cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path = Some(path.clone()); + let _ = config::save_config(&cfg); + } + + let ffmpeg = status.path.clone().unwrap_or_else(|| "ffmpeg".into()); + let hw = tokio::task::spawn_blocking(move || { + discovery::detect_hardware_encoders(&ffmpeg) + }) + .await + .map_err(|e| e.to_string())?; + + let mut hw_state = state.hw_info.lock().map_err(|e| e.to_string())?; + *hw_state = Some(hw); + } + + Ok(status) +} + +#[tauri::command] +pub async fn download_ffmpeg(app_handle: tauri::AppHandle, state: State<'_, AppState>) -> Result { + use tauri::Emitter; + + let exe_dir = std::env::current_exe() + .map_err(|e| e.to_string())? + .parent() + .ok_or("Could not find exe directory")? + .to_path_buf(); + + let zip_path = exe_dir.join("ffmpeg-download.zip"); + let extract_dir = exe_dir.join("ffmpeg-download"); + let _ = std::fs::remove_file(&zip_path); + + let url = "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip"; + let expected_size: u64 = 90_000_000; // ~90MB estimate + + // emit starting + let _ = app_handle.emit("ffmpeg-download-progress", serde_json::json!({ + "phase": "downloading", "percent": 0, "message": "Connecting..." + })); + + // start curl download in background (curl ships with Windows 10+, gives us progress) + let child = Command::new("curl") + .args(["-L", "-o", &zip_path.to_string_lossy(), "--progress-bar", url]) + .creation_flags(0x08000000) // CREATE_NO_WINDOW + .stderr(std::process::Stdio::piped()) + .spawn() + .map_err(|_| { + // fallback to PowerShell if curl not available + "curl not found".to_string() + }); + + let use_curl = child.is_ok(); + + let done_flag = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); + + if use_curl { + let mut child = child.unwrap(); + let zip_clone = zip_path.clone(); + let handle_clone = app_handle.clone(); + let flag = done_flag.clone(); + + let poll_thread = std::thread::spawn(move || { + while !flag.load(std::sync::atomic::Ordering::Relaxed) { + std::thread::sleep(std::time::Duration::from_millis(500)); + if let Ok(meta) = std::fs::metadata(&zip_clone) { + let pct = ((meta.len() as f64 / expected_size as f64) * 100.0).min(99.0); + let mb = meta.len() as f64 / 1_048_576.0; + let _ = handle_clone.emit("ffmpeg-download-progress", serde_json::json!({ + "phase": "downloading", + "percent": pct as u32, + "message": format!("{:.1} MB downloaded", mb) + })); + } + } + }); + + let status = child.wait().map_err(|e| format!("Download failed: {}", e))?; + done_flag.store(true, std::sync::atomic::Ordering::Relaxed); + let _ = poll_thread.join(); + + if !status.success() { + let _ = std::fs::remove_file(&zip_path); + return Err("Download failed. Check your internet connection.".into()); + } + } else { + let _ = app_handle.emit("ffmpeg-download-progress", serde_json::json!({ + "phase": "downloading", "percent": 0, "message": "Downloading..." + })); + + let dl_status = Command::new("powershell") + .args([ + "-NoProfile", "-NonInteractive", "-Command", + &format!( + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri '{}' -OutFile '{}'", + url, zip_path.to_string_lossy() + ) + ]) + .creation_flags(0x08000000) + .status() + .map_err(|e| format!("Download failed: {}", e))?; + + if !dl_status.success() { + let _ = std::fs::remove_file(&zip_path); + return Err("Download failed. Check your internet connection.".into()); + } + } + + // extract - use tar (faster than PowerShell Expand-Archive, ships with Windows 10+) + let _ = app_handle.emit("ffmpeg-download-progress", serde_json::json!({ + "phase": "extracting", "percent": 100, "message": "Extracting..." + })); + + let ex_status = Command::new("tar") + .args(["-xf", &zip_path.to_string_lossy(), "-C", &exe_dir.to_string_lossy()]) + .creation_flags(0x08000000) + .status() + .or_else(|_| { + // fallback to PowerShell if tar fails + Command::new("powershell") + .args([ + "-NoProfile", "-NonInteractive", "-Command", + &format!( + "Expand-Archive -Path '{}' -DestinationPath '{}' -Force", + zip_path.to_string_lossy(), + extract_dir.to_string_lossy() + ) + ]) + .creation_flags(0x08000000) + .status() + }) + .map_err(|e| format!("Extraction failed: {}", e))?; + + if !ex_status.success() { + let _ = std::fs::remove_file(&zip_path); + let _ = std::fs::remove_dir_all(&extract_dir); + return Err("Could not extract the archive.".into()); + } + + let _ = app_handle.emit("ffmpeg-download-progress", serde_json::json!({ + "phase": "installing", "percent": 100, "message": "Installing..." + })); + + // find ffmpeg.exe - tar extracts to exe_dir, PowerShell to extract_dir + let mut ffmpeg_src = None; + let mut ffprobe_src = None; + for search_dir in [&exe_dir, &extract_dir] { + if let Ok(entries) = std::fs::read_dir(search_dir) { + for entry in entries.flatten() { + let path = entry.path(); + // check nested bin/ directory (zip has one top-level folder) + let bin_dir = path.join("bin"); + if bin_dir.is_dir() { + let ff = bin_dir.join("ffmpeg.exe"); + let fp = bin_dir.join("ffprobe.exe"); + if ff.exists() { ffmpeg_src = Some(ff); } + if fp.exists() { ffprobe_src = Some(fp); } + if ffmpeg_src.is_some() { break; } + } + } + } + if ffmpeg_src.is_some() { break; } + } + + let ffmpeg_src = ffmpeg_src.ok_or("Could not find ffmpeg.exe in the download.")?; + let ffprobe_src = ffprobe_src.ok_or("Could not find ffprobe.exe in the download.")?; + + let ffmpeg_dest = exe_dir.join("ffmpeg.exe"); + let ffprobe_dest = exe_dir.join("ffprobe.exe"); + + std::fs::copy(&ffmpeg_src, &ffmpeg_dest).map_err(|e| format!("Could not copy ffmpeg: {}", e))?; + std::fs::copy(&ffprobe_src, &ffprobe_dest).map_err(|e| format!("Could not copy ffprobe: {}", e))?; + + // cleanup zip and any extracted folders + let _ = std::fs::remove_file(&zip_path); + let _ = std::fs::remove_dir_all(&extract_dir); + // also clean up the tar-extracted folder in exe_dir (matches ffmpeg-master-*) + if let Ok(entries) = std::fs::read_dir(&exe_dir) { + for entry in entries.flatten() { + let name = entry.file_name().to_string_lossy().to_string(); + if name.starts_with("ffmpeg-master-") && entry.path().is_dir() { + let _ = std::fs::remove_dir_all(entry.path()); + } + } + } + + // verify and update config + let path_str = ffmpeg_dest.to_string_lossy().to_string(); + let version = discovery::parse_version(&PathBuf::from(&path_str)); + + let status = FFmpegStatus { + found: true, + path: Some(path_str.clone()), + version, + }; + + { + let mut cfg = state.config.lock().map_err(|e| e.to_string())?; + cfg.ffmpeg_path = Some(path_str); + let _ = config::save_config(&cfg); + } + + Ok(status) +} + +#[tauri::command] +pub async fn check_recovery() -> Result, String> { + let temp = config::temp_dir(); + Ok(recovery::check_interrupted_job(&temp)) +} + +#[tauri::command] +pub async fn cleanup_recovery() -> Result<(), String> { + let temp = config::temp_dir(); + recovery::cleanup_orphaned_temps(&temp); + recovery::delete_job_info(&temp); + Ok(()) +} diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs new file mode 100644 index 0000000..1120932 --- /dev/null +++ b/src-tauri/src/config.rs @@ -0,0 +1,36 @@ +use std::fs; +use std::path::PathBuf; + +use crate::types::AppConfig; + +fn config_path() -> PathBuf { + let exe = std::env::current_exe().unwrap_or_default(); + exe.parent().unwrap_or(&PathBuf::from(".")).join("config.json") +} + +pub fn load_config() -> AppConfig { + let path = config_path(); + match fs::read_to_string(&path) { + Ok(contents) => serde_json::from_str(&contents).unwrap_or_default(), + Err(_) => AppConfig::default(), + } +} + +pub fn save_config(config: &AppConfig) -> Result<(), String> { + let path = config_path(); + let json = serde_json::to_string_pretty(config).map_err(|e| e.to_string())?; + fs::write(&path, json).map_err(|e| format!("Failed to write config: {}", e)) +} + +pub fn temp_dir() -> PathBuf { + let exe = std::env::current_exe().unwrap_or_default(); + let dir = exe.parent().unwrap_or(&PathBuf::from(".")).join("temp"); + let _ = fs::create_dir_all(&dir); + dir +} + +pub fn ensure_temp_subdir(subdir: &str) -> PathBuf { + let dir = temp_dir().join(subdir); + let _ = fs::create_dir_all(&dir); + dir +} diff --git a/src-tauri/src/ffmpeg/commands.rs b/src-tauri/src/ffmpeg/commands.rs new file mode 100644 index 0000000..4916076 --- /dev/null +++ b/src-tauri/src/ffmpeg/commands.rs @@ -0,0 +1,453 @@ +use crate::types::*; + +pub struct FfmpegCommand { + pub args: Vec, +} + +impl FfmpegCommand { + fn new() -> Self { + Self { args: vec!["-y".into()] } + } + + fn arg(mut self, a: &str) -> Self { + self.args.push(a.into()); + self + } + + fn args(mut self, a: &[&str]) -> Self { + self.args.extend(a.iter().map(|s| s.to_string())); + self + } +} + +pub fn build_compress_pass1( + input: &str, + settings: &CompressSettings, + bitrate_kbps: u32, + passlog_prefix: &str, +) -> FfmpegCommand { + let encoder = software_encoder(&settings.video_codec); + + let mut cmd = FfmpegCommand::new() + .arg("-i").arg(input) + .arg("-c:v").arg(&encoder) + .arg("-preset").arg(&sw_preset(&settings.speed_preset, &settings.video_codec)) + .arg("-b:v").arg(&format!("{}k", bitrate_kbps)) + .arg("-pass").arg("1") + .arg("-passlogfile").arg(passlog_prefix) + .arg("-an") + .arg("-f").arg("null"); + + cmd = apply_resolution(cmd, &settings.resolution); + cmd.arg("NUL") +} + +pub fn build_compress_pass2( + input: &str, + output: &str, + settings: &CompressSettings, + bitrate_kbps: u32, + passlog_prefix: &str, + trim: Option<&TrimRange>, + has_audio: bool, +) -> FfmpegCommand { + let encoder = software_encoder(&settings.video_codec); + + let mut cmd = FfmpegCommand::new(); + + if let Some(t) = trim { + cmd = cmd + .arg("-ss").arg(&format!("{}", t.start)) + .arg("-to").arg(&format!("{}", t.end)); + } + + cmd = cmd + .arg("-i").arg(input) + .arg("-c:v").arg(&encoder) + .arg("-preset").arg(&sw_preset(&settings.speed_preset, &settings.video_codec)) + .arg("-b:v").arg(&format!("{}k", bitrate_kbps)) + .arg("-pass").arg("2") + .arg("-passlogfile").arg(passlog_prefix); + + if has_audio { + cmd = apply_audio(cmd, &settings.audio_codec, settings.audio_bitrate); + } else { + cmd = cmd.arg("-an"); + } + cmd = apply_resolution(cmd, &settings.resolution); + cmd = apply_container_flags(cmd, &settings.container); + cmd.arg("-progress").arg("pipe:1").arg(output) +} + +pub fn build_compress_hw( + input: &str, + output: &str, + settings: &CompressSettings, + bitrate_kbps: u32, + hw_encoder: &str, + trim: Option<&TrimRange>, + has_audio: bool, +) -> FfmpegCommand { + let mut cmd = FfmpegCommand::new(); + + if let Some(t) = trim { + cmd = cmd + .arg("-ss").arg(&format!("{}", t.start)) + .arg("-to").arg(&format!("{}", t.end)); + } + + let maxrate = (bitrate_kbps as f64 * 1.5) as u32; + let bufsize = bitrate_kbps * 2; + + cmd = cmd + .arg("-i").arg(input) + .arg("-c:v").arg(hw_encoder) + .arg("-preset").arg(&hw_preset(&settings.speed_preset, hw_encoder)) + .arg("-b:v").arg(&format!("{}k", bitrate_kbps)) + .arg("-maxrate").arg(&format!("{}k", maxrate)) + .arg("-bufsize").arg(&format!("{}k", bufsize)); + + if has_audio { + cmd = apply_audio(cmd, &settings.audio_codec, settings.audio_bitrate); + } else { + cmd = cmd.arg("-an"); + } + cmd = apply_resolution(cmd, &settings.resolution); + cmd = apply_container_flags(cmd, &settings.container); + cmd.arg("-progress").arg("pipe:1").arg(output) +} + +pub fn build_crf_command( + input: &str, + output: &str, + settings: &CompressSettings, + crf_value: u32, + encoder: &str, + trim: Option<&TrimRange>, + has_audio: bool, +) -> FfmpegCommand { + let mut cmd = FfmpegCommand::new(); + + if let Some(t) = trim { + cmd = cmd + .arg("-ss").arg(&format!("{}", t.start)) + .arg("-to").arg(&format!("{}", t.end)); + } + + cmd = cmd + .arg("-i").arg(input) + .arg("-c:v").arg(encoder); + + if encoder.contains("svtav1") || encoder == "libsvtav1" { + cmd = cmd.arg("-crf").arg(&format!("{}", crf_value)); + } else if encoder.contains("nvenc") || encoder.contains("amf") || encoder.contains("qsv") { + cmd = cmd.arg("-cq").arg(&format!("{}", crf_value)); + } else { + cmd = cmd.arg("-crf").arg(&format!("{}", crf_value)); + } + + cmd = cmd.arg("-preset").arg(&resolve_preset(&settings.speed_preset, encoder)); + if has_audio { + cmd = apply_audio(cmd, &settings.audio_codec, settings.audio_bitrate); + } else { + cmd = cmd.arg("-an"); + } + cmd = apply_resolution(cmd, &settings.resolution); + cmd = apply_container_flags(cmd, &settings.container); + cmd.arg("-progress").arg("pipe:1").arg(output) +} + +pub fn build_bitrate_command( + input: &str, + output: &str, + settings: &CompressSettings, + bitrate_kbps: u32, + encoder: &str, + trim: Option<&TrimRange>, + has_audio: bool, +) -> FfmpegCommand { + let mut cmd = FfmpegCommand::new(); + + if let Some(t) = trim { + cmd = cmd + .arg("-ss").arg(&format!("{}", t.start)) + .arg("-to").arg(&format!("{}", t.end)); + } + + cmd = cmd + .arg("-i").arg(input) + .arg("-c:v").arg(encoder) + .arg("-b:v").arg(&format!("{}k", bitrate_kbps)) + .arg("-preset").arg(&resolve_preset(&settings.speed_preset, encoder)); + + if has_audio { + cmd = apply_audio(cmd, &settings.audio_codec, settings.audio_bitrate); + } else { + cmd = cmd.arg("-an"); + } + cmd = apply_resolution(cmd, &settings.resolution); + cmd = apply_container_flags(cmd, &settings.container); + cmd.arg("-progress").arg("pipe:1").arg(output) +} + +pub fn build_trim_keyframe( + input: &str, + output: &str, + range: &TrimRange, + strip_audio: bool, +) -> FfmpegCommand { + let mut cmd = FfmpegCommand::new() + .arg("-ss").arg(&format!("{}", range.start)) + .arg("-to").arg(&format!("{}", range.end)) + .arg("-i").arg(input) + .arg("-c").arg("copy") + .arg("-avoid_negative_ts").arg("make_zero"); + + if strip_audio { + cmd = cmd.arg("-an"); + } + + cmd.arg(output) +} + +pub fn build_smart_cut_head( + input: &str, + output: &str, + start: f64, + first_keyframe: f64, + has_audio: bool, +) -> FfmpegCommand { + let mut cmd = FfmpegCommand::new() + .arg("-ss").arg(&format!("{}", start)) + .arg("-to").arg(&format!("{}", first_keyframe)) + .arg("-i").arg(input) + .arg("-c:v").arg("libx264") + .arg("-crf").arg("18"); + + if has_audio { + cmd = cmd.arg("-c:a").arg("aac"); + } else { + cmd = cmd.arg("-an"); + } + + cmd.arg("-progress").arg("pipe:1").arg(output) +} + +pub fn build_smart_cut_middle( + input: &str, + output: &str, + first_keyframe: f64, + last_keyframe: f64, +) -> FfmpegCommand { + FfmpegCommand::new() + .arg("-ss").arg(&format!("{}", first_keyframe)) + .arg("-to").arg(&format!("{}", last_keyframe)) + .arg("-i").arg(input) + .arg("-c").arg("copy") + .arg("-avoid_negative_ts").arg("make_zero") + .arg(output) +} + +pub fn build_smart_cut_tail( + input: &str, + output: &str, + last_keyframe: f64, + end: f64, + has_audio: bool, +) -> FfmpegCommand { + let mut cmd = FfmpegCommand::new() + .arg("-ss").arg(&format!("{}", last_keyframe)) + .arg("-to").arg(&format!("{}", end)) + .arg("-i").arg(input) + .arg("-c:v").arg("libx264") + .arg("-crf").arg("18"); + + if has_audio { + cmd = cmd.arg("-c:a").arg("aac"); + } else { + cmd = cmd.arg("-an"); + } + + cmd.arg("-progress").arg("pipe:1").arg(output) +} + +pub fn build_concat(filelist: &str, output: &str) -> FfmpegCommand { + FfmpegCommand::new() + .arg("-f").arg("concat") + .arg("-safe").arg("0") + .arg("-i").arg(filelist) + .arg("-c").arg("copy") + .arg(output) +} + +pub fn build_thumbnail( + input: &str, + output_pattern: &str, + count: u32, + duration: f64, +) -> FfmpegCommand { + let interval = if count > 1 { + duration / (count as f64) + } else { + duration / 2.0 + }; + + FfmpegCommand::new() + .arg("-i").arg(input) + .args(&["-vf", &format!("fps=1/{:.2},scale=240:-1", interval)]) + .arg("-q:v").arg("8") + .arg(output_pattern) +} + +pub fn build_preview(input: &str, output: &str, codec: &str) -> FfmpegCommand { + let mut cmd = FfmpegCommand::new(); + cmd = cmd.arg("-i").arg(input); + + // if the source is already h264, just remux to mp4 (instant, no re-encoding) + let dominated = codec.to_lowercase(); + if dominated == "h264" || dominated == "h265" || dominated == "hevc" { + cmd = cmd.arg("-c:v").arg("copy") + .arg("-c:a").arg("copy"); + } else { + // transcode only first 30 seconds for preview + cmd = cmd.arg("-t").arg("30") + .arg("-c:v").arg("libx264") + .arg("-preset").arg("ultrafast") + .arg("-crf").arg("28") + .args(&["-vf", "scale=640:-2"]) + .arg("-c:a").arg("aac") + .arg("-b:a").arg("64k"); + } + + cmd.args(&["-movflags", "+faststart"]).arg(output) +} + +pub fn calculate_bitrate(target_mb: f64, duration: f64, audio_bitrate_kbps: u32) -> u32 { + let target_bits = target_mb * 1024.0 * 1024.0 * 8.0; + let audio_bits = audio_bitrate_kbps as f64 * 1000.0 * duration; + let video_bits = target_bits - audio_bits; + let kbps = (video_bits / duration / 1000.0).max(10.0); + kbps as u32 +} + +pub fn select_encoder( + codec: &VideoCodec, + hw_accel: &HwAccelMode, + hw_info: &HardwareInfo, +) -> String { + match hw_accel { + HwAccelMode::ForceCPU => software_encoder(codec), + HwAccelMode::ForceGPU => { + hw_encoder(codec, hw_info).unwrap_or_else(|| software_encoder(codec)) + } + HwAccelMode::Auto => { + hw_encoder(codec, hw_info).unwrap_or_else(|| software_encoder(codec)) + } + } +} + +pub fn is_hw_encoder(encoder: &str) -> bool { + encoder.contains("nvenc") + || encoder.contains("qsv") + || encoder.contains("amf") +} + +fn software_encoder(codec: &VideoCodec) -> String { + match codec { + VideoCodec::H264 => "libx264".into(), + VideoCodec::HEVC => "libx265".into(), + VideoCodec::AV1 => "libsvtav1".into(), + } +} + +fn hw_encoder(codec: &VideoCodec, hw: &HardwareInfo) -> Option { + let target = match codec { + VideoCodec::H264 => "h264", + VideoCodec::HEVC => "hevc", + VideoCodec::AV1 => "av1", + }; + + // prefer nvenc, then amf, then qsv + for name in &hw.nvenc_codecs { + if name.starts_with(target) { + return Some(name.clone()); + } + } + for name in &hw.amf_codecs { + if name.starts_with(target) { + return Some(name.clone()); + } + } + for name in &hw.qsv_codecs { + if name.starts_with(target) { + return Some(name.clone()); + } + } + None +} + +fn apply_audio(cmd: FfmpegCommand, codec: &AudioCodec, bitrate: u32) -> FfmpegCommand { + match codec { + AudioCodec::None => cmd.arg("-an"), + AudioCodec::AAC => cmd + .arg("-c:a").arg("aac") + .arg("-b:a").arg(&format!("{}k", bitrate)), + AudioCodec::Opus => cmd + .arg("-c:a").arg("libopus") + .arg("-b:a").arg(&format!("{}k", bitrate)), + } +} + +fn apply_resolution(cmd: FfmpegCommand, res: &Resolution) -> FfmpegCommand { + match res { + Resolution::Original => cmd, + Resolution::P720 => cmd.args(&["-vf", "scale=-2:720"]), + Resolution::P1080 => cmd.args(&["-vf", "scale=-2:1080"]), + Resolution::P1440 => cmd.args(&["-vf", "scale=-2:1440"]), + Resolution::P4K => cmd.args(&["-vf", "scale=-2:2160"]), + Resolution::Custom { width, height } => { + cmd.args(&["-vf", &format!("scale={}:{}", width, height)]) + } + } +} + +fn apply_container_flags(cmd: FfmpegCommand, container: &Container) -> FfmpegCommand { + match container { + Container::MP4 | Container::MOV => cmd.args(&["-movflags", "+faststart"]), + Container::MKV | Container::WebM | Container::AVI | Container::TS => cmd, + } +} + +fn sw_preset(preset: &str, codec: &VideoCodec) -> String { + if preset.is_empty() || preset == "medium" { + return match codec { + VideoCodec::AV1 => "6".into(), + _ => "medium".into(), + }; + } + preset.to_string() +} + +fn hw_preset(preset: &str, encoder: &str) -> String { + if preset.is_empty() || preset == "medium" { + if encoder.contains("nvenc") { + return "p5".into(); + } + return "medium".into(); + } + preset.to_string() +} + +fn resolve_preset(preset: &str, encoder: &str) -> String { + if is_hw_encoder(encoder) { + hw_preset(preset, encoder) + } else { + if preset.is_empty() || preset == "medium" { + if encoder == "libsvtav1" { + return "6".into(); + } + return "medium".into(); + } + preset.to_string() + } +} diff --git a/src-tauri/src/ffmpeg/discovery.rs b/src-tauri/src/ffmpeg/discovery.rs new file mode 100644 index 0000000..49af998 --- /dev/null +++ b/src-tauri/src/ffmpeg/discovery.rs @@ -0,0 +1,190 @@ +use std::path::PathBuf; +use std::process::Command; + +use crate::types::{FFmpegStatus, HardwareInfo}; + +pub fn find_ffmpeg(override_path: Option<&str>) -> FFmpegStatus { + if let Some(p) = override_path { + let path = PathBuf::from(p); + if path.exists() { + if let Some(ver) = parse_version(&path) { + return FFmpegStatus { + found: true, + path: Some(p.to_string()), + version: Some(ver), + }; + } + } + } + + if let Some(status) = try_from_path("ffmpeg") { + return status; + } + + let candidates = get_search_paths(); + for dir in candidates { + let bin = dir.join("ffmpeg.exe"); + if bin.exists() { + if let Some(status) = try_from_path(bin.to_str().unwrap_or_default()) { + return status; + } + } + } + + FFmpegStatus { + found: false, + path: None, + version: None, + } +} + +fn get_search_paths() -> Vec { + let mut paths = vec![ + PathBuf::from(r"C:\ffmpeg\bin"), + PathBuf::from(r"C:\ffmpeg"), + ]; + + if let Ok(local) = std::env::var("LOCALAPPDATA") { + paths.push(PathBuf::from(&local).join("ffmpeg")); + paths.push(PathBuf::from(&local).join("ffmpeg").join("bin")); + } + + if let Ok(pf) = std::env::var("PROGRAMFILES") { + paths.push(PathBuf::from(&pf).join("ffmpeg")); + paths.push(PathBuf::from(&pf).join("ffmpeg").join("bin")); + } + + let exe = std::env::current_exe().unwrap_or_default(); + if let Some(parent) = exe.parent() { + paths.push(parent.to_path_buf()); + paths.push(parent.join("ffmpeg")); + paths.push(parent.join("ffmpeg").join("bin")); + } + + paths +} + +fn try_from_path(cmd: &str) -> Option { + let path = resolve_path(cmd)?; + let ver = parse_version(&path)?; + Some(FFmpegStatus { + found: true, + path: Some(path.to_string_lossy().to_string()), + version: Some(ver), + }) +} + +fn resolve_path(cmd: &str) -> Option { + let p = PathBuf::from(cmd); + if p.is_absolute() && p.exists() { + return Some(p); + } + let output = Command::new("where").arg(cmd).output().ok()?; + if output.status.success() { + let stdout = String::from_utf8_lossy(&output.stdout); + let first_line = stdout.lines().next()?; + let resolved = PathBuf::from(first_line.trim()); + if resolved.exists() { + return Some(resolved); + } + } + None +} + +pub fn parse_version(ffmpeg_path: &PathBuf) -> Option { + let output = Command::new(ffmpeg_path).arg("-version").output().ok()?; + if !output.status.success() { + return None; + } + let stdout = String::from_utf8_lossy(&output.stdout); + let first_line = stdout.lines().next()?; + // "ffmpeg version 7.1 Copyright ..." or "ffmpeg version N-123456-g..." + let parts: Vec<&str> = first_line.split_whitespace().collect(); + if parts.len() >= 3 && parts[0] == "ffmpeg" && parts[1] == "version" { + let ver = parts[2]; + // strip trailing dash or git hash portions for cleanliness + let clean = ver.split('-').next().unwrap_or(ver); + Some(clean.to_string()) + } else { + None + } +} + +pub fn ffprobe_path(ffmpeg_path: &str) -> String { + let p = PathBuf::from(ffmpeg_path); + if let Some(parent) = p.parent() { + let probe = parent.join("ffprobe.exe"); + if probe.exists() { + eprintln!("[cinch-rs] ffprobe_path: found {}", probe.display()); + return probe.to_string_lossy().to_string(); + } + let probe2 = parent.join("ffprobe"); + if probe2.exists() { + eprintln!("[cinch-rs] ffprobe_path: found {}", probe2.display()); + return probe2.to_string_lossy().to_string(); + } + } + eprintln!("[cinch-rs] ffprobe_path: falling back to 'ffprobe'"); + "ffprobe".to_string() +} + +pub fn detect_hardware_encoders(ffmpeg_path: &str) -> HardwareInfo { + let mut info = HardwareInfo { + nvenc: false, + qsv: false, + amf: false, + nvenc_codecs: Vec::new(), + qsv_codecs: Vec::new(), + amf_codecs: Vec::new(), + }; + + let output = Command::new(ffmpeg_path) + .args(["-hide_banner", "-encoders"]) + .output(); + + let output = match output { + Ok(o) => o, + Err(_) => return info, + }; + + let stdout = String::from_utf8_lossy(&output.stdout); + + for line in stdout.lines() { + let trimmed = line.trim(); + if trimmed.contains("nvenc") { + let codec = extract_encoder_name(trimmed); + if !codec.is_empty() { + info.nvenc = true; + info.nvenc_codecs.push(codec); + } + } + if trimmed.contains("qsv") { + let codec = extract_encoder_name(trimmed); + if !codec.is_empty() { + info.qsv = true; + info.qsv_codecs.push(codec); + } + } + if trimmed.contains("amf") { + let codec = extract_encoder_name(trimmed); + if !codec.is_empty() { + info.amf = true; + info.amf_codecs.push(codec); + } + } + } + + info +} + +fn extract_encoder_name(line: &str) -> String { + // encoder lines look like: " V..... h264_nvenc NVIDIA NVENC H.264 encoder" + let parts: Vec<&str> = line.split_whitespace().collect(); + if parts.len() >= 2 { + let name = parts[1]; + if name.contains("nvenc") || name.contains("qsv") || name.contains("amf") { + return name.to_string(); + } + } + String::new() +} diff --git a/src-tauri/src/ffmpeg/mod.rs b/src-tauri/src/ffmpeg/mod.rs new file mode 100644 index 0000000..86b9458 --- /dev/null +++ b/src-tauri/src/ffmpeg/mod.rs @@ -0,0 +1,4 @@ +pub mod commands; +pub mod discovery; +pub mod probe; +pub mod runner; diff --git a/src-tauri/src/ffmpeg/probe.rs b/src-tauri/src/ffmpeg/probe.rs new file mode 100644 index 0000000..a005531 --- /dev/null +++ b/src-tauri/src/ffmpeg/probe.rs @@ -0,0 +1,162 @@ +use std::process::Command; +#[cfg(windows)] +use std::os::windows::process::CommandExt; + +use crate::ffmpeg::discovery::ffprobe_path; +use crate::types::VideoInfo; + +// Step 1: Fast metadata - no packet scanning, instant +pub fn probe_metadata(input: &str, ffmpeg_path: &str) -> Result { + let probe = ffprobe_path(ffmpeg_path); + eprintln!("[cinch-rs] probe_metadata start: {} using {}", input, probe); + + let output = Command::new(&probe) + .args([ + "-v", "quiet", + "-print_format", "json", + "-show_format", + "-show_streams", + input, + ]) + .creation_flags(0x08000000) + .output() + .map_err(|e| format!("Failed to run ffprobe: {}", e))?; + + eprintln!("[cinch-rs] probe_metadata ffprobe returned, status: {}", output.status); + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + return Err(format!( + "Couldn't read this file. It may be corrupted or not a video. {}", + stderr.trim() + )); + } + + let stdout = String::from_utf8_lossy(&output.stdout); + let json: serde_json::Value = + serde_json::from_str(&stdout).map_err(|e| format!("Failed to parse ffprobe output: {}", e))?; + + let streams = json["streams"].as_array().ok_or("No streams found")?; + + let video_stream = streams + .iter() + .find(|s| s["codec_type"].as_str() == Some("video")) + .ok_or("This file has no video stream.")?; + + let width = video_stream["width"].as_u64().unwrap_or(0) as u32; + let height = video_stream["height"].as_u64().unwrap_or(0) as u32; + let video_codec = video_stream["codec_name"] + .as_str() + .unwrap_or("unknown") + .to_string(); + + let video_bitrate = video_stream["bit_rate"] + .as_str() + .and_then(|s| s.parse::().ok()) + .unwrap_or(0); + + let frame_rate = parse_frame_rate( + video_stream["r_frame_rate"].as_str().unwrap_or("0/1"), + ); + let avg_frame_rate = parse_frame_rate( + video_stream["avg_frame_rate"].as_str().unwrap_or("0/1"), + ); + let is_vfr = (frame_rate - avg_frame_rate).abs() > 0.5; + + let format = &json["format"]; + let duration = format["duration"] + .as_str() + .and_then(|s| s.parse::().ok()) + .unwrap_or(0.0); + let file_size = format["size"] + .as_str() + .and_then(|s| s.parse::().ok()) + .unwrap_or(0); + let container = format["format_name"] + .as_str() + .unwrap_or("unknown") + .to_string(); + + // audio from the same data - no extra call + let audio_stream = streams + .iter() + .find(|s| s["codec_type"].as_str() == Some("audio")); + let audio_codec = audio_stream + .and_then(|s| s["codec_name"].as_str()) + .map(|s| s.to_string()); + let audio_bitrate = audio_stream + .and_then(|s| s["bit_rate"].as_str()) + .and_then(|s| s.parse::().ok()); + let audio_channels = audio_stream + .and_then(|s| s["channels"].as_u64()) + .map(|c| c as u32); + + Ok(VideoInfo { + path: input.to_string(), + file_size, + duration, + width, + height, + video_codec, + video_bitrate, + frame_rate, + is_vfr, + audio_codec, + audio_bitrate, + audio_channels, + keyframe_times: Vec::new(), // filled in step 2 + container, + }) +} + +// Step 2: Keyframe extraction - uses -skip_frame nokey for speed +pub fn extract_keyframes_fast(input: &str, ffmpeg_path: &str) -> Vec { + let probe = ffprobe_path(ffmpeg_path); + + // use -skip_frame nokey to only decode keyframes, MUCH faster than reading all packets + let output = Command::new(&probe) + .args([ + "-v", "quiet", + "-select_streams", "v:0", + "-skip_frame", "nokey", + "-show_entries", "frame=pts_time", + "-of", "csv=p=0", + input, + ]) + .creation_flags(0x08000000) + .output(); + + let output = match output { + Ok(o) if o.status.success() => o, + _ => return Vec::new(), + }; + + let stdout = String::from_utf8_lossy(&output.stdout); + let mut times: Vec = stdout + .lines() + .filter_map(|line| line.trim().parse::().ok()) + .collect(); + + times.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + times.dedup(); + times +} + +// Legacy compat - calls both steps +pub fn probe_video(input: &str, ffmpeg_path: &str) -> Result { + let mut info = probe_metadata(input, ffmpeg_path)?; + info.keyframe_times = extract_keyframes_fast(input, ffmpeg_path); + Ok(info) +} + +fn parse_frame_rate(s: &str) -> f64 { + let parts: Vec<&str> = s.split('/').collect(); + if parts.len() == 2 { + let num = parts[0].parse::().unwrap_or(0.0); + let den = parts[1].parse::().unwrap_or(1.0); + if den > 0.0 { + return num / den; + } + } + s.parse::().unwrap_or(0.0) +} diff --git a/src-tauri/src/ffmpeg/runner.rs b/src-tauri/src/ffmpeg/runner.rs new file mode 100644 index 0000000..9ed998b --- /dev/null +++ b/src-tauri/src/ffmpeg/runner.rs @@ -0,0 +1,303 @@ +use std::collections::HashMap; +use std::io::{BufRead, BufReader}; +use std::process::{Child, Command, Stdio}; +use std::sync::{Arc, Mutex}; +use std::time::Instant; + +#[cfg(windows)] +use std::os::windows::process::CommandExt; + +use tauri::{Emitter, AppHandle}; + +use crate::config; +use crate::ffmpeg::commands::{self, FfmpegCommand}; +use crate::types::*; + +const CREATE_NO_WINDOW: u32 = 0x08000000; + +pub type JobMap = Arc>>; + +pub fn new_job_map() -> JobMap { + Arc::new(Mutex::new(HashMap::new())) +} + +pub struct RunResult { + pub success: bool, +} + +fn spawn_hidden(cmd: &mut Command) -> std::io::Result { + #[cfg(windows)] + { + cmd.creation_flags(CREATE_NO_WINDOW); + } + cmd.spawn() +} + +pub fn run_ffmpeg( + ffmpeg_path: &str, + cmd: &FfmpegCommand, + job_id: &str, + total_duration: f64, + phase: &str, + app: &AppHandle, + jobs: &JobMap, +) -> Result { + let mut proc = Command::new(ffmpeg_path); + proc.args(&cmd.args) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let mut child = spawn_hidden(&mut proc) + .map_err(|e| format!("Failed to spawn ffmpeg: {}", e))?; + + let stdout = child.stdout.take(); + + { + let mut map = jobs.lock().map_err(|e| e.to_string())?; + map.insert(job_id.to_string(), child); + } + + let start = Instant::now(); + let mut last_progress = ProgressEvent { + job_id: job_id.to_string(), + percent: 0.0, + fps: 0.0, + bitrate: String::new(), + size_current: 0, + time_elapsed: 0.0, + eta_seconds: 0.0, + phase: phase.to_string(), + message: None, + }; + + if let Some(out) = stdout { + let reader = BufReader::new(out); + for line in reader.lines() { + let line = match line { + Ok(l) => l, + Err(_) => continue, + }; + + let parts: Vec<&str> = line.splitn(2, '=').collect(); + if parts.len() != 2 { + continue; + } + + let key = parts[0].trim(); + let val = parts[1].trim(); + + match key { + "out_time_us" => { + if let Ok(us) = val.parse::() { + let secs = us / 1_000_000.0; + let elapsed = start.elapsed().as_secs_f64(); + last_progress.time_elapsed = elapsed; + + if total_duration > 0.0 { + let pct = (secs / total_duration * 100.0).min(100.0).max(0.0); + last_progress.percent = pct; + + if pct > 0.0 { + let remaining = elapsed / pct * (100.0 - pct); + last_progress.eta_seconds = remaining; + } + } + } + } + "fps" => { + last_progress.fps = val.parse::().unwrap_or(0.0); + } + "bitrate" => { + last_progress.bitrate = val.to_string(); + } + "total_size" => { + last_progress.size_current = val.parse::().unwrap_or(0); + } + "progress" => { + let _ = app.emit("progress", &last_progress); + + if val == "end" { + last_progress.percent = 100.0; + last_progress.phase = "done".into(); + let _ = app.emit("progress", &last_progress); + } + } + _ => {} + } + } + } + + let status = { + let mut map = jobs.lock().map_err(|e| e.to_string())?; + if let Some(mut child) = map.remove(job_id) { + child.wait().map_err(|e| e.to_string())? + } else { + return Err("Job was cancelled".into()); + } + }; + + Ok(RunResult { + success: status.success(), + }) +} + +pub fn run_ffmpeg_silent( + ffmpeg_path: &str, + cmd: &FfmpegCommand, +) -> Result<(), String> { + let mut proc = Command::new(ffmpeg_path); + proc.args(&cmd.args) + .stdout(Stdio::null()) + .stderr(Stdio::piped()); + + let child = spawn_hidden(&mut proc) + .map_err(|e| format!("Failed to spawn ffmpeg: {}", e))?; + + let status = child.wait_with_output().map_err(|e| e.to_string())?; + + if status.status.success() { + Ok(()) + } else { + Err("FFmpeg process failed".into()) + } +} + +pub fn cancel_job(job_id: &str, jobs: &JobMap) -> Result<(), String> { + let mut map = jobs.lock().map_err(|e| e.to_string())?; + if let Some(mut child) = map.remove(job_id) { + let _ = child.kill(); + let _ = child.wait(); + Ok(()) + } else { + Err("No active job found".into()) + } +} + +pub fn run_compress_with_retry( + ffmpeg_path: &str, + input: &str, + output: &str, + settings: &CompressSettings, + trim: Option<&TrimRange>, + hw_info: &HardwareInfo, + app_config: &AppConfig, + job_id: &str, + total_duration: f64, + has_audio: bool, + app: &AppHandle, + jobs: &JobMap, +) -> Result<(String, u32), String> { + let encoder = commands::select_encoder(&settings.video_codec, &settings.hw_accel, hw_info); + let is_hw = commands::is_hw_encoder(&encoder); + + match &settings.strategy { + SizingStrategy::CRF { value } => { + let cmd = commands::build_crf_command( + input, output, settings, *value, &encoder, trim, has_audio, + ); + let result = run_ffmpeg(ffmpeg_path, &cmd, job_id, total_duration, "encoding", app, jobs)?; + if !result.success { + return Err("Encoding failed".into()); + } + Ok((output.to_string(), 1)) + } + + SizingStrategy::TargetBitrate { kbps } => { + let cmd = commands::build_bitrate_command( + input, output, settings, *kbps, &encoder, trim, has_audio, + ); + let result = run_ffmpeg(ffmpeg_path, &cmd, job_id, total_duration, "encoding", app, jobs)?; + if !result.success { + return Err("Encoding failed".into()); + } + Ok((output.to_string(), 1)) + } + + SizingStrategy::TargetSize { mb } => { + let audio_kbps = match settings.audio_codec { + AudioCodec::None => 0, + _ => settings.audio_bitrate, + }; + let mut bitrate_kbps = commands::calculate_bitrate(*mb, total_duration, audio_kbps); + let target_bytes = (*mb * 1024.0 * 1024.0) as u64; + let max_attempts = app_config.max_retry_attempts; + let threshold = app_config.retry_threshold_percent; + + for attempt in 1..=max_attempts { + let phase = if attempt == 1 { "encoding" } else { "retrying" }; + + if is_hw { + let cmd = commands::build_compress_hw( + input, output, settings, bitrate_kbps, &encoder, trim, has_audio, + ); + let result = run_ffmpeg(ffmpeg_path, &cmd, job_id, total_duration, phase, app, jobs)?; + if !result.success { + return Err("Encoding failed".into()); + } + } else { + let passlog_dir = config::ensure_temp_subdir(&format!("passlog/{}", job_id)); + let passlog_prefix = passlog_dir.join("ffmpeg2pass").to_string_lossy().to_string(); + + let pass1 = commands::build_compress_pass1( + input, settings, bitrate_kbps, &passlog_prefix, + ); + let _ = app.emit("progress", &ProgressEvent { + job_id: job_id.to_string(), + percent: 0.0, + fps: 0.0, + bitrate: String::new(), + size_current: 0, + time_elapsed: 0.0, + eta_seconds: 0.0, + phase: "analyzing".into(), + message: Some(format!("Pass 1 of 2 (attempt {})", attempt)), + }); + + run_ffmpeg_silent(ffmpeg_path, &pass1)?; + + let pass2 = commands::build_compress_pass2( + input, output, settings, bitrate_kbps, &passlog_prefix, trim, has_audio, + ); + let result = run_ffmpeg(ffmpeg_path, &pass2, job_id, total_duration, phase, app, jobs)?; + if !result.success { + return Err("Encoding failed".into()); + } + } + + let output_size = std::fs::metadata(output) + .map(|m| m.len()) + .unwrap_or(0); + + if output_size <= target_bytes { + return Ok((output.to_string(), attempt)); + } + + let overshoot_pct = ((output_size as f64 - target_bytes as f64) / target_bytes as f64) * 100.0; + + if overshoot_pct <= threshold { + return Ok((output.to_string(), attempt)); + } + + if attempt < max_attempts { + let _ = app.emit("compress-retry", &serde_json::json!({ + "job_id": job_id, + "attempt": attempt + 1, + "reason": format!( + "Output {:.1}MB exceeds {:.1}MB target by {:.1}%", + output_size as f64 / 1024.0 / 1024.0, + mb, + overshoot_pct + ), + "adjusted_bitrate": bitrate_kbps + })); + + let ratio = target_bytes as f64 / output_size as f64; + bitrate_kbps = ((bitrate_kbps as f64) * ratio * 0.95) as u32; + bitrate_kbps = bitrate_kbps.max(10); + } + } + + Ok((output.to_string(), max_attempts)) + } + } +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..85702b3 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,153 @@ +use std::path::PathBuf; +use std::sync::Mutex; +use tauri::Manager; + +mod commands; +mod config; +mod ffmpeg; +mod recovery; +mod stream_server; +mod types; + +use types::*; + +pub struct AppState { + pub config: Mutex, + pub hw_info: Mutex>, + pub jobs: ffmpeg::runner::JobMap, + pub stream_port: Mutex, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +struct SavedWindowState { + width: u32, + height: u32, + x: i32, + y: i32, + maximized: bool, +} + +fn exe_dir() -> PathBuf { + std::env::current_exe() + .ok() + .and_then(|p| p.parent().map(|d| d.to_path_buf())) + .unwrap_or_else(|| std::env::temp_dir()) +} + +fn window_state_path() -> PathBuf { + exe_dir().join(".window-state") +} + +fn load_window_state() -> Option { + let path = window_state_path(); + if !path.exists() { + return None; + } + let content = std::fs::read_to_string(&path).ok()?; + serde_json::from_str(&content).ok() +} + +fn save_window_state(state: &SavedWindowState) { + let path = window_state_path(); + if let Ok(json) = serde_json::to_string_pretty(state) { + let _ = std::fs::write(path, json); + } +} + +fn do_save(window: &tauri::Window) { + if let Ok(size) = window.inner_size() { + if let Ok(pos) = window.outer_position() { + let maximized = window.is_maximized().unwrap_or(false); + save_window_state(&SavedWindowState { + width: size.width, + height: size.height, + x: pos.x, + y: pos.y, + maximized, + }); + } + } +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + let cfg = config::load_config(); + + let stream_port = match tauri::async_runtime::block_on(stream_server::start()) { + Ok(port) => port, + Err(e) => { + eprintln!("Failed to start stream server: {}", e); + 0 + } + }; + + tauri::Builder::default() + .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_process::init()) + .plugin(tauri_plugin_fs::init()) + .plugin(tauri_plugin_opener::init()) + .manage(AppState { + config: Mutex::new(cfg), + hw_info: Mutex::new(None), + jobs: ffmpeg::runner::new_job_map(), + stream_port: Mutex::new(stream_port), + }) + .invoke_handler(tauri::generate_handler![ + commands::analyze::analyze_video, + commands::analyze::extract_keyframes, + commands::analyze::generate_thumbnails, + commands::analyze::generate_preview, + commands::analyze::detect_hardware, + commands::process::compress, + commands::process::trim, + commands::process::cancel_job, + commands::utility::check_ffmpeg, + commands::utility::open_in_explorer, + commands::utility::get_config, + commands::utility::save_config_cmd, + commands::utility::get_output_path, + commands::utility::init_app, + commands::utility::download_ffmpeg, + commands::utility::check_recovery, + commands::utility::cleanup_recovery, + commands::utility::get_stream_url_cmd, + commands::utility::get_stream_port_cmd, + ]) + .setup(|app| { + if let Some(window) = app.get_webview_window("main") { + let window = window.clone(); + tauri::async_runtime::spawn(async move { + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + if let Some(state) = load_window_state() { + if !state.maximized { + let _ = window.set_size(tauri::Size::Physical(tauri::PhysicalSize::new( + state.width, + state.height, + ))); + let _ = window.set_position(tauri::Position::Physical(tauri::PhysicalPosition::new( + state.x, + state.y, + ))); + } + if state.maximized { + let _ = window.maximize(); + } + } else { + let _ = window.center(); + } + }); + } + Ok(()) + }) + .on_window_event(|window, event| { + match event { + tauri::WindowEvent::Resized(_) | tauri::WindowEvent::Moved(_) => { + do_save(window); + } + _ => {} + } + }) + .run(tauri::generate_context!()) + .expect("failed to run cinch"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..84d6356 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,5 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + cinch::run(); +} diff --git a/src-tauri/src/recovery.rs b/src-tauri/src/recovery.rs new file mode 100644 index 0000000..64ee8b2 --- /dev/null +++ b/src-tauri/src/recovery.rs @@ -0,0 +1,59 @@ +use std::fs; +use std::path::Path; + +use serde::{Deserialize, Serialize}; + +const JOB_FILE: &str = "last_job.json"; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct InterruptedJob { + pub input_path: String, + pub output_path: String, + pub mode: String, + pub settings_json: String, +} + +pub fn write_job_info( + temp_dir: &Path, + input: &str, + output: &str, + mode: &str, + settings_json: &str, +) { + let job = InterruptedJob { + input_path: input.to_string(), + output_path: output.to_string(), + mode: mode.to_string(), + settings_json: settings_json.to_string(), + }; + let path = temp_dir.join(JOB_FILE); + if let Ok(json) = serde_json::to_string_pretty(&job) { + let _ = fs::write(&path, json); + } +} + +pub fn delete_job_info(temp_dir: &Path) { + let path = temp_dir.join(JOB_FILE); + let _ = fs::remove_file(&path); +} + +pub fn check_interrupted_job(temp_dir: &Path) -> Option { + let path = temp_dir.join(JOB_FILE); + let contents = fs::read_to_string(&path).ok()?; + serde_json::from_str(&contents).ok() +} + +pub fn cleanup_orphaned_temps(temp_dir: &Path) { + if temp_dir.exists() { + if let Ok(entries) = fs::read_dir(temp_dir) { + for entry in entries.flatten() { + let p = entry.path(); + if p.is_dir() { + let _ = fs::remove_dir_all(&p); + } else { + let _ = fs::remove_file(&p); + } + } + } + } +} diff --git a/src-tauri/src/stream_server.rs b/src-tauri/src/stream_server.rs new file mode 100644 index 0000000..1fe67f0 --- /dev/null +++ b/src-tauri/src/stream_server.rs @@ -0,0 +1,167 @@ +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::{TcpListener, TcpStream}; + +const MAX_CHUNK: u64 = 1024 * 1024; // 1MB max per response + +pub async fn start() -> Result { + let listener = TcpListener::bind("127.0.0.1:0").await?; + let port = listener.local_addr()?.port(); + + tokio::spawn(async move { + loop { + match listener.accept().await { + Ok((stream, _)) => { + tokio::spawn(handle_client(stream)); + } + Err(_) => continue, + } + } + }); + + Ok(port) +} + +async fn handle_client(mut stream: TcpStream) { + // read headers until \r\n\r\n (up to 64KB) + let mut buf = Vec::with_capacity(4096); + let mut temp = [0u8; 4096]; + loop { + let n = match stream.read(&mut temp).await { + Ok(0) => return, + Ok(n) => n, + Err(_) => return, + }; + buf.extend_from_slice(&temp[..n]); + if buf.windows(4).any(|w| w == b"\r\n\r\n") { + break; + } + if buf.len() > 65536 { + return; // headers too large + } + } + + let request = String::from_utf8_lossy(&buf); + let mut lines = request.lines(); + let request_line = match lines.next() { + Some(line) => line, + None => return, + }; + + let parts: Vec<&str> = request_line.split_whitespace().collect(); + if parts.len() < 2 || parts[0] != "GET" { + return; + } + + let uri_path = percent_encoding::percent_decode_str(&parts[1][1..]) + .decode_utf8_lossy() + .to_string(); + + let mut range_header = None; + for line in lines { + if line.is_empty() { + break; + } + let lower = line.to_lowercase(); + if lower.starts_with("range:") { + range_header = Some(line[6..].trim().to_string()); + } + } + + let response = match serve_file(&uri_path, range_header).await { + Some(data) => data, + None => { + let body = b"Not Found"; + let header = format!( + "HTTP/1.1 404 Not Found\r\nContent-Length: {}\r\nAccess-Control-Allow-Origin: *\r\nConnection: close\r\n\r\n", + body.len() + ); + let mut resp = header.into_bytes(); + resp.extend_from_slice(body); + resp + } + }; + + let _ = stream.write_all(&response).await; + let _ = stream.flush().await; +} + +async fn serve_file(path: &str, range_header: Option) -> Option> { + use std::io::{Read, Seek, SeekFrom}; + + let mut file = std::fs::File::open(path).ok()?; + + let file_len = { + let pos = file.stream_position().ok()?; + let len = file.seek(SeekFrom::End(0)).ok()?; + file.seek(SeekFrom::Start(pos)).ok()?; + len + }; + + let ext = path.rsplit('.').next().unwrap_or("mp4").to_lowercase(); + let mime = match ext.as_str() { + "webm" => "video/webm", + "mkv" => "video/x-matroska", + "avi" => "video/x-msvideo", + "mov" => "video/quicktime", + "flv" => "video/x-flv", + "ts" | "m2ts" => "video/mp2t", + "wmv" => "video/x-ms-wmv", + "mpg" | "mpeg" => "video/mpeg", + "jpg" | "jpeg" => "image/jpeg", + "png" => "image/png", + _ => "video/mp4", + }; + + if let Some(range_str) = range_header { + if let Ok(ranges) = http_range::HttpRange::parse(&range_str, file_len) { + if let Some(r) = ranges.first() { + let start = r.start; + let end = (start + r.length - 1).min(file_len - 1); + let chunk_len = end + 1 - start; + + file.seek(SeekFrom::Start(start)).ok()?; + let mut body = Vec::with_capacity(chunk_len as usize); + file.take(chunk_len).read_to_end(&mut body).ok()?; + + let header = format!( + "HTTP/1.1 206 Partial Content\r\n\ + Content-Type: {}\r\n\ + Content-Length: {}\r\n\ + Content-Range: bytes {}-{}/{}\r\n\ + Accept-Ranges: bytes\r\n\ + Access-Control-Allow-Origin: *\r\n\ + Connection: close\r\n\r\n", + mime, + body.len(), + start, + end, + file_len + ); + + let mut response = header.into_bytes(); + response.extend(body); + return Some(response); + } + } + } + + let chunk_len = MAX_CHUNK.min(file_len); + file.seek(SeekFrom::Start(0)).ok()?; + let mut body = Vec::with_capacity(chunk_len as usize); + file.take(chunk_len).read_to_end(&mut body).ok()?; + + let header = format!( + "HTTP/1.1 200 OK\r\n\ + Content-Type: {}\r\n\ + Content-Length: {}\r\n\ + Accept-Ranges: bytes\r\n\ + Access-Control-Allow-Origin: *\r\n\ + Connection: close\r\n\r\n", + mime, + body.len() + ); + + let mut response = header.into_bytes(); + response.extend(body); + Some(response) +} diff --git a/src-tauri/src/types.rs b/src-tauri/src/types.rs new file mode 100644 index 0000000..231f179 --- /dev/null +++ b/src-tauri/src/types.rs @@ -0,0 +1,204 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct VideoInfo { + pub path: String, + pub file_size: u64, + pub duration: f64, + pub width: u32, + pub height: u32, + pub video_codec: String, + pub video_bitrate: u64, + pub frame_rate: f64, + pub is_vfr: bool, + pub audio_codec: Option, + pub audio_bitrate: Option, + pub audio_channels: Option, + pub keyframe_times: Vec, + pub container: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CompressSettings { + pub strategy: SizingStrategy, + pub video_codec: VideoCodec, + pub audio_codec: AudioCodec, + pub audio_bitrate: u32, + pub container: Container, + pub resolution: Resolution, + pub speed_preset: String, + pub hw_accel: HwAccelMode, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum SizingStrategy { + TargetSize { mb: f64 }, + TargetBitrate { kbps: u32 }, + CRF { value: u32 }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TrimRange { + pub start: f64, + pub end: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum VideoCodec { + H264, + HEVC, + AV1, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub enum AudioCodec { + AAC, + Opus, + None, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum Container { + MP4, + MKV, + WebM, + MOV, + AVI, + TS, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum HwAccelMode { + Auto, + ForceGPU, + ForceCPU, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum Resolution { + Original, + P720, + P1080, + P1440, + P4K, + Custom { width: u32, height: u32 }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OutputInfo { + pub path: String, + pub file_size: u64, + pub duration: f64, + pub width: u32, + pub height: u32, + pub video_codec: String, + pub video_bitrate: u64, + pub audio_codec: Option, + pub audio_bitrate: Option, + pub attempts: u32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct HardwareInfo { + pub nvenc: bool, + pub qsv: bool, + pub amf: bool, + pub nvenc_codecs: Vec, + pub qsv_codecs: Vec, + pub amf_codecs: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FFmpegStatus { + pub found: bool, + pub path: Option, + pub version: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProgressEvent { + pub job_id: String, + pub percent: f64, + pub fps: f64, + pub bitrate: String, + pub size_current: u64, + pub time_elapsed: f64, + pub eta_seconds: f64, + pub phase: String, + pub message: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AppConfig { + pub theme: String, + pub ui_zoom: u32, + pub ffmpeg_path: Option, + pub default_output_dir: Option, + pub last_compress_settings: Option, + pub default_presets: Vec, + pub auto_retry: bool, + pub retry_threshold_percent: f64, + pub max_retry_attempts: u32, + pub show_ffmpeg_log: bool, + pub remember_window_position: bool, + pub window_position: Option, + #[serde(default = "default_target_size")] + pub default_target_size: u32, + #[serde(default)] + pub default_smart_cut: bool, + #[serde(default = "default_naming_pattern")] + pub naming_pattern: String, + #[serde(default)] + pub last_open_dir: Option, + #[serde(default)] + pub last_save_dir: Option, + #[serde(default = "default_preview_volume")] + pub preview_volume: f32, +} + +fn default_target_size() -> u32 { + 8 +} + +fn default_naming_pattern() -> String { + "{name}_{mode}_{timestamp}".into() +} + +fn default_preview_volume() -> f32 { + 1.0 +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WindowPosition { + pub x: i32, + pub y: i32, + pub width: u32, + pub height: u32, +} + +impl Default for AppConfig { + fn default() -> Self { + Self { + theme: "system".into(), + ui_zoom: 100, + ffmpeg_path: None, + default_output_dir: None, + last_compress_settings: None, + default_presets: vec![8, 25, 50, 100], + auto_retry: true, + retry_threshold_percent: 2.0, + max_retry_attempts: 3, + show_ffmpeg_log: false, + remember_window_position: true, + window_position: None, + default_target_size: 8, + default_smart_cut: false, + naming_pattern: "{name}_{mode}_{timestamp}".into(), + last_open_dir: None, + last_save_dir: None, + preview_volume: 1.0, + } + } +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..45f3ce2 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-config-schema/schema.json", + "productName": "Cinch", + "version": "1.0.0", + "identifier": "com.cinch.app", + "build": { + "frontendDist": "../build", + "devUrl": "http://localhost:1420", + "beforeDevCommand": "npm run dev", + "beforeBuildCommand": "npm run build" + }, + "app": { + "withGlobalTauri": false, + "security": { + "csp": null + }, + "windows": [ + { + "title": "Cinch", + "width": 960, + "height": 700, + "minWidth": 700, + "minHeight": 500, + "resizable": true, + "decorations": false, + "transparent": false + } + ] + }, + "bundle": { + "icon": [ + "icons/icon.ico", + "icons/icon.png" + ] + }, + "plugins": { + "shell": { + "open": true + } + } +} diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..6b757f1 --- /dev/null +++ b/src/app.css @@ -0,0 +1,198 @@ +@import 'tailwindcss'; + +/* ============================================================ + DESIGN TOKENS - Cinch + Style: Polished Modern with Arc Browser energy + ============================================================ */ + +:root { + /* Typography */ + --font-display: 'Syne', system-ui, sans-serif; + --font-body: 'Nunito Sans', system-ui, sans-serif; + --font-mono: 'Geist Mono', 'Consolas', monospace; + + /* Type Scale (1.200 Minor Third) */ + --text-xs: 0.694rem; + --text-sm: 0.833rem; + --text-base: 1rem; + --text-lg: 1.2rem; + --text-xl: 1.44rem; + --text-2xl: 1.728rem; + --text-3xl: 2.074rem; + + /* Spacing */ + --space-xs: 4px; + --space-sm: 8px; + --space-md: 16px; + --space-lg: 24px; + --space-xl: 32px; + --space-2xl: 48px; + + /* Shape */ + --radius-sm: 6px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-pill: 999px; + + /* Accent Colors (same both themes) */ + --color-accent-compress: #059669; + --color-accent-trim: #2563eb; + --color-accent-warning: #f59e0b; + --color-accent-error: #ef4444; + --color-accent-info: #60a5fa; + + /* Animation */ + --transition-fast: 150ms ease-out; + --transition-default: 250ms ease-out; + --transition-spring: 300ms cubic-bezier(0.34, 1.56, 0.64, 1); + --transition-morph: 400ms cubic-bezier(0.34, 1.56, 0.64, 1); +} + +/* Dark Theme (default) */ +[data-theme='dark'] { + --color-bg-base: #0f1a1f; + --color-bg-surface: #162228; + --color-bg-elevated: #1c2d34; + --color-text-primary: rgba(255, 255, 255, 0.87); + --color-text-secondary: rgba(255, 255, 255, 0.6); + --color-text-disabled: rgba(255, 255, 255, 0.38); + --color-border: rgba(255, 255, 255, 0.1); + --color-bg-overlay: rgba(0, 0, 0, 0.5); + + --shadow-video: 0 4px 24px rgba(0, 0, 0, 0.3); + --shadow-glow-compress: 0 0 12px rgba(5, 150, 105, 0.3); + --shadow-glow-trim: 0 0 12px rgba(37, 99, 235, 0.3); + --shadow-playhead: 0 0 8px rgba(5, 150, 105, 0.5); + + color-scheme: dark; +} + +/* Light Theme */ +[data-theme='light'] { + --color-bg-base: #f5f8fa; + --color-bg-surface: #ffffff; + --color-bg-elevated: #ffffff; + --color-text-primary: #1a2b34; + --color-text-secondary: #5a6b74; + --color-text-disabled: #9aabb4; + --color-border: rgba(0, 0, 0, 0.08); + --color-bg-overlay: rgba(0, 0, 0, 0.3); + + --shadow-video: 0 4px 24px rgba(0, 0, 0, 0.1); + --shadow-glow-compress: 0 0 12px rgba(5, 150, 105, 0.2); + --shadow-glow-trim: 0 0 12px rgba(37, 99, 235, 0.2); + --shadow-playhead: 0 0 8px rgba(5, 150, 105, 0.4); + + color-scheme: light; +} + +/* Base styles */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + font-size: 16px; +} + +body { + font-family: var(--font-body); + color: var(--color-text-primary); + background: var(--color-bg-base); + overflow: hidden; + user-select: none; + -webkit-user-select: none; +} + +/* Noise texture overlay */ +body::before { + content: ''; + position: fixed; + inset: 0; + pointer-events: none; + z-index: 9999; + opacity: 0.025; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); +} + +[data-theme='light'] body::before { + opacity: 0.015; +} + +/* Scrollbar hiding */ +::-webkit-scrollbar { + display: none; +} + +/* Focus ring */ +:focus-visible { + outline: 2px solid var(--color-accent-compress); + outline-offset: 2px; +} + +/* Button press feedback */ +button:active:not(:disabled) { + transform: scale(0.97); + transition: transform 100ms ease-in-out; +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 150ms !important; + } +} + +/* Utility classes */ +.font-display { + font-family: var(--font-display); +} + +.font-mono { + font-family: var(--font-mono); +} + +.text-primary { + color: var(--color-text-primary); +} + +.text-secondary { + color: var(--color-text-secondary); +} + +.text-disabled { + color: var(--color-text-disabled); +} + +.uppercase-label { + font-family: var(--font-body); + font-weight: 700; + font-size: var(--text-sm); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +@font-face { + font-family: 'Syne'; + src: url('/fonts/Syne-Variable.woff2') format('woff2'); + font-weight: 400 800; + font-display: swap; +} +@font-face { + font-family: 'Nunito Sans'; + src: url('/fonts/NunitoSans-Variable.woff2') format('woff2'); + font-weight: 200 1000; + font-display: swap; +} +@font-face { + font-family: 'Geist Mono'; + src: url('/fonts/GeistMono-Variable.woff2') format('woff2'); + font-weight: 100 900; + font-display: swap; +} diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..e19e28c --- /dev/null +++ b/src/app.html @@ -0,0 +1,12 @@ + + + + + + Cinch + %sveltekit.head% + + +

%sveltekit.body%
+ + diff --git a/src/lib/components/AdvancedOptions.svelte b/src/lib/components/AdvancedOptions.svelte new file mode 100644 index 0000000..49270d4 --- /dev/null +++ b/src/lib/components/AdvancedOptions.svelte @@ -0,0 +1,387 @@ + + +{#if showCard} +
+
+
+ + Advanced options +
+ +
+ +
+ + +
+ +
+
+ Codec + +
+
+ Resolution + +
+
+
+
+ Sizing mode + +
+
+ Container + +
+
+
+ + +
+ +
+
+ Codec + +
+ {#if app.compressSettings.audio_codec !== 'None' && !noAudio} +
+ Bitrate + +
+ {/if} +
+
+ + +
+ + +
+ + +
+ +
+ {#each [ + { value: 'Auto', label: 'Auto', icon: 'ti-bolt' }, + { value: 'ForceGPU', label: 'GPU', icon: 'ti-chart-arrows' }, + { value: 'ForceCPU', label: 'CPU', icon: 'ti-cpu' } + ] as hw} + + {/each} +
+
+ +
+ + {#if estimatedOutput} + + {/if} + +
+{/if} + + diff --git a/src/lib/components/AnalyzingSkeleton.svelte b/src/lib/components/AnalyzingSkeleton.svelte new file mode 100644 index 0000000..5e86b39 --- /dev/null +++ b/src/lib/components/AnalyzingSkeleton.svelte @@ -0,0 +1,245 @@ + + +
+ +
+ +
+
+
+ +
+ +

Analyzing video{dots}

+

Reading metadata, extracting keyframes, generating thumbnails

+ + {#if elapsed > 5} +

This may take a moment for large files

+ {/if} +
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + +
+ + {filename} + +
+
+ + diff --git a/src/lib/components/CompressPresets.svelte b/src/lib/components/CompressPresets.svelte new file mode 100644 index 0000000..b592568 --- /dev/null +++ b/src/lib/components/CompressPresets.svelte @@ -0,0 +1,318 @@ + + +
+
+ Compress to: + + +
+ +
+ {#each presets as mb, i} + + {/each} + + {#if customActive} + +
+ +
+ { if (customValue > 0) app.setCustomSize(customValue); }} + onkeydown={(e) => { if (e.key === 'Enter') (e.target as HTMLInputElement).blur(); }} + min="0.1" + step="0.1" + /> + MB +
+ + +
+ {:else} + + {/if} +
+
+ + diff --git a/src/lib/components/CtaBar.svelte b/src/lib/components/CtaBar.svelte new file mode 100644 index 0000000..0291778 --- /dev/null +++ b/src/lib/components/CtaBar.svelte @@ -0,0 +1,473 @@ + + +{#if isProcessing} + +
+ +
+ +
+ +
+ +
+
+ + {#if phase === 'encoding' || phase === 'retrying'} + {Math.round(percent)}% + {:else if phase === 'muxing'} + Finishing... + {:else if phase === 'analyzing'} + Analyzing... + {:else} + Processing... + {/if} + + {#if eta > 0 && phase === 'encoding'} + ETA {formatEta(eta)} + {/if} +
+
+ {outputName} + {#if fps > 0 || bitrate || sizeCurrent > 0} + + {#if fps > 0}{fps.toFixed(0)} fps{/if} + {#if bitrate} + ·{bitrate} + {/if} + {#if sizeCurrent > 0} + ·{formatFileSize(sizeCurrent)} + {/if} + + {/if} +
+
+ + + + +
+ +{:else if canSave} + + +{:else} +
+ Select a preset or set trim points to get started +
+{/if} + + diff --git a/src/lib/components/CustomSelect.svelte b/src/lib/components/CustomSelect.svelte new file mode 100644 index 0000000..832e393 --- /dev/null +++ b/src/lib/components/CustomSelect.svelte @@ -0,0 +1,246 @@ + + +
+ + {#if hint} + {hint} + {/if} +
+ +{#if open} +
+
+ {#each options as opt} + + {/each} +
+
+{/if} + + diff --git a/src/lib/components/DropZone.svelte b/src/lib/components/DropZone.svelte new file mode 100644 index 0000000..136546d --- /dev/null +++ b/src/lib/components/DropZone.svelte @@ -0,0 +1,295 @@ + + +
+ +
+ + + + + +
+ Ctrl+O + to browse +
+
+ + diff --git a/src/lib/components/FfmpegLog.svelte b/src/lib/components/FfmpegLog.svelte new file mode 100644 index 0000000..249640b --- /dev/null +++ b/src/lib/components/FfmpegLog.svelte @@ -0,0 +1,70 @@ + + +{#if visible} +
+
+ {#each lines as line, i} +
+ {line} +
+ {/each} + + {#if lines.length === 0} +
+ Waiting for output... +
+ {/if} +
+
+{/if} + + diff --git a/src/lib/components/FileInfoBar.svelte b/src/lib/components/FileInfoBar.svelte new file mode 100644 index 0000000..aa84005 --- /dev/null +++ b/src/lib/components/FileInfoBar.svelte @@ -0,0 +1,116 @@ + + +
+ + + {name} + +
+ {#if res} + {res} + {/if} + {#if dur} + {dur} + {/if} + {#if codec} + {codec} + {/if} + {#if size} + {size} + {/if} +
+ + +
+ + diff --git a/src/lib/components/MainView.svelte b/src/lib/components/MainView.svelte new file mode 100644 index 0000000..94b6a1d --- /dev/null +++ b/src/lib/components/MainView.svelte @@ -0,0 +1,166 @@ + + +
{ e.preventDefault(); windowDragOver = true; }} + ondragleave={() => { windowDragOver = false; }} + role="main" +> + {#if windowDragOver && (view.current === 'loaded' || view.current === 'processing')} +
Drop a new video to replace
+ {/if} + {#if view.current === 'setup'} + + + {:else if view.current === 'empty'} + + + {:else if view.current === 'analyzing'} + + + {:else if view.current === 'done'} + + + {:else if view.current === 'loaded' || view.current === 'processing'} + + +
+
+ { currentTime = t; app.currentTime = t; }} + /> +
+ +
+
+
+ { app.advancedOpen = !app.advancedOpen; }} + /> +
+ + + {#if view.current === 'processing' && config.current.show_ffmpeg_log} +
+ {/if} +
+
+ + + {/if} +
+ + diff --git a/src/lib/components/SegmentedControl.svelte b/src/lib/components/SegmentedControl.svelte new file mode 100644 index 0000000..bb1fe94 --- /dev/null +++ b/src/lib/components/SegmentedControl.svelte @@ -0,0 +1,97 @@ + + +
+
+ {#each options as opt} + + {/each} +
+ + diff --git a/src/lib/components/SetupWizard.svelte b/src/lib/components/SetupWizard.svelte new file mode 100644 index 0000000..1547980 --- /dev/null +++ b/src/lib/components/SetupWizard.svelte @@ -0,0 +1,533 @@ + + +
+ + diff --git a/src/lib/components/Slider.svelte b/src/lib/components/Slider.svelte new file mode 100644 index 0000000..3f288d8 --- /dev/null +++ b/src/lib/components/Slider.svelte @@ -0,0 +1,156 @@ + + +
+ {#if currentLabel} +
{currentLabel}
+ {/if} +
+
+
+
+ {#if labels} +
+ {#each labels as stop, i} + {@const pct = ((stop.value - min) / (max - min)) * 100} + + {stop.label} + + {/each} +
+ {/if} +
+ + diff --git a/src/lib/components/StatsCard.svelte b/src/lib/components/StatsCard.svelte new file mode 100644 index 0000000..9c0f68a --- /dev/null +++ b/src/lib/components/StatsCard.svelte @@ -0,0 +1,276 @@ + + +
+
+ +
+ +
+ + +
+ {#if isTrimOnly} + {formatDuration(app.outputInfo?.duration ?? 0)} + trimmed + {:else} + {formatPercent(reduction)} + smaller + {/if} +
+ + +
+
+ Before + {formatFileSize(beforeSize)} + {app.videoInfo?.video_codec ?? ''} - {app.videoInfo ? `${app.videoInfo.width}x${app.videoInfo.height}` : ''} +
+ +
+ +
+ +
+ After + {formatFileSize(afterSize)} + {app.outputInfo?.video_codec ?? ''} - {app.outputInfo ? `${app.outputInfo.width}x${app.outputInfo.height}` : ''} +
+
+ + +
+ + {fileName} +
+ + +
+ + + +
+ + {#if app.outputInfo && app.outputInfo.attempts > 1} +
+ Took {app.outputInfo.attempts} attempts to reach target size +
+ {/if} +
+
+ + diff --git a/src/lib/components/Timeline.svelte b/src/lib/components/Timeline.svelte new file mode 100644 index 0000000..8bd3a74 --- /dev/null +++ b/src/lib/components/Timeline.svelte @@ -0,0 +1,659 @@ + + +
+ +
+
handlePointerDown(e, 'scrub')} + onpointermove={handlePointerMove} + onpointerup={handlePointerUp} + onmousemove={handleHoverMove} + onmouseleave={handleMouseLeave} + onwheel={handleWheel} + onkeydown={handleTrackKeydown} + > +
+ + {#if app.thumbnails.length > 0} +
+ {#each app.thumbnails as thumb, i} +
+ {/each} +
+ {/if} + + + {#each keyframes as kf, i} + {#if i > 0} + {@const prevPct = (keyframes[i - 1] / duration) * 100} + {@const kfPct = (kf / duration) * 100} +
+ {/if} + {/each} + + + {#if app.trimRange} +
+
+ {/if} + + + {#if app.trimRange} +
+ {/if} + + + {#if app.trimRange} +
handlePointerDown(e, 'in')} + onpointermove={handlePointerMove} + onpointerup={handlePointerUp} + role="slider" + aria-label="Trim in point" + aria-valuenow={inTime} + tabindex="0" + > +
+ + + + +
+
+ + +
handlePointerDown(e, 'out')} + onpointermove={handlePointerMove} + onpointerup={handlePointerUp} + role="slider" + aria-label="Trim out point" + aria-valuenow={outTime} + tabindex="0" + > +
+ + + + +
+
+ {/if} + + +
+
+
+
+
+ + + {#if hoverX !== null && hoverTime !== null && !dragging} +
+
+ + {#if duration > 0 && app.thumbnails.length > 0} + {@const thumbIdx = Math.min(Math.floor((hoverTime / duration) * app.thumbnails.length), app.thumbnails.length - 1)} +
+ {:else} +
+ {/if} + + {formatTimecode(hoverTime)} + +
+
+ {/if} +
+ + +
+ +
+ + +
+ + +
+
+ + (e.target as HTMLInputElement).select()} + /> + I +
+
+ + (e.target as HTMLInputElement).select()} + /> + O +
+ +
+
+
+ + diff --git a/src/lib/components/TitleBar.svelte b/src/lib/components/TitleBar.svelte new file mode 100644 index 0000000..64ea2d5 --- /dev/null +++ b/src/lib/components/TitleBar.svelte @@ -0,0 +1,189 @@ + + +
+ + + Cinch + + + +
+ {#each themes as t} + + {/each} +
+ + + + + +
+ + +
+ + + + + +
+
+ + diff --git a/src/lib/components/Toast.svelte b/src/lib/components/Toast.svelte new file mode 100644 index 0000000..55785b9 --- /dev/null +++ b/src/lib/components/Toast.svelte @@ -0,0 +1,68 @@ + + +
+ + + + {toast.message} + + + +
diff --git a/src/lib/components/ToastContainer.svelte b/src/lib/components/ToastContainer.svelte new file mode 100644 index 0000000..5efa292 --- /dev/null +++ b/src/lib/components/ToastContainer.svelte @@ -0,0 +1,16 @@ + + +
+ {#each toasts.items as toast (toast.id)} +
+ +
+ {/each} +
diff --git a/src/lib/components/Toggle.svelte b/src/lib/components/Toggle.svelte new file mode 100644 index 0000000..a21bd0d --- /dev/null +++ b/src/lib/components/Toggle.svelte @@ -0,0 +1,62 @@ + + + + + diff --git a/src/lib/components/VideoPreview.svelte b/src/lib/components/VideoPreview.svelte new file mode 100644 index 0000000..d4aa90f --- /dev/null +++ b/src/lib/components/VideoPreview.svelte @@ -0,0 +1,282 @@ + + +
{ if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); togglePlay(); } }} + onmouseenter={() => { showControls = true; }} + onmouseleave={() => { showControls = false; showVolume = false; }} +> + + {#if !videoReady} +
+ {#if generating} + + Generating preview... + {:else} + + {/if} +
+ {/if} + + + {#if src && !generating} + + {#if errorMsg} +
+ + + {errorMsg} + +
+ {/if} + {/if} + + +
+
+ +
+
+ + +
e.stopPropagation()} + onkeydown={(e) => e.stopPropagation()} + role="group" + > + {#if showVolume} + e.stopPropagation()} + /> + {/if} + +
+
+ + diff --git a/src/lib/stores/app.svelte.ts b/src/lib/stores/app.svelte.ts new file mode 100644 index 0000000..3be8d1d --- /dev/null +++ b/src/lib/stores/app.svelte.ts @@ -0,0 +1,238 @@ +import type { + AppState, + VideoInfo, + CompressSettings, + TrimRange, + TrimMode, + ActiveMode, + ProgressEvent, + OutputInfo, + HardwareInfo, + FFmpegStatus, + SizingStrategy +} from '$lib/types'; +import * as tauri from '$lib/utils/tauri'; + +const defaultSettings: CompressSettings = { + strategy: { type: 'TargetSize', mb: 8 }, + video_codec: 'H264', + audio_codec: 'AAC', + audio_bitrate: 128, + container: 'MP4', + resolution: { type: 'Original' }, + speed_preset: 'medium', + hw_accel: 'Auto' +}; + +// plain $state object for cross-component reactivity (class $state fields +// don't reliably trigger {#if} re-evaluation across component boundaries) +export const view = $state({ current: 'empty' as AppState }); + +class AppStore { + state: AppState = $state('empty'); + videoInfo: VideoInfo | null = $state(null); + compressSettings: CompressSettings = $state({ ...defaultSettings }); + trimRange: TrimRange | null = $state(null); + trimMode: TrimMode = $state('keyframe'); + progress: ProgressEvent | null = $state(null); + outputInfo: OutputInfo | null = $state(null); + hardwareInfo: HardwareInfo | null = $state(null); + ffmpegStatus: FFmpegStatus = $state({ found: false, path: null, version: null }); + + thumbnails: string[] = $state([]); + selectedPreset: number | null = $state(null); + customSize: number = $state(8); + advancedOpen: boolean = $state(false); + overriddenOutputPath: string | null = $state(null); + analyzeStep: string = $state(''); + + currentTime: number = $state(0); + private seekCallback: ((time: number) => void) | null = null; + private playbackCallback: (() => void) | null = null; + + private currentJobId: string | null = null; + private progressUnlisten: (() => void) | null = null; + + get activeMode(): ActiveMode { + const compressActive = this.selectedPreset !== null; + const hasTrim = this.trimRange !== null; + if (compressActive && hasTrim) return 'both'; + if (compressActive) return 'compress'; + if (hasTrim) return 'trim'; + return 'none'; + } + + private loadingPath: string | null = null; + + async loadVideo(path: string) { + // prevent re-entry: never reload the same path + if (this.loadingPath === path) return; + this.loadingPath = path; + this.state = 'analyzing'; + this.analyzeStep = 'Reading metadata...'; + this.videoInfo = null; + this.outputInfo = null; + this.progress = null; + this.trimRange = null; + this.selectedPreset = null; + this.thumbnails = []; + + try { + const info = await tauri.analyzeVideo(path); + this.videoInfo = info; + this.state = 'loaded'; + + // step 2: keyframes (background) + this.analyzeStep = 'Extracting keyframes...'; + tauri.extractKeyframes(path).then((kf) => { + if (this.videoInfo && this.videoInfo.path === path) { + this.videoInfo.keyframe_times = kf; + } + }).catch(() => {}); + + // step 3: thumbnails + this.analyzeStep = 'Generating thumbnails...'; + tauri.generateThumbnails(path, 5, info.duration).then((coarse) => { + if (this.videoInfo?.path === path) this.thumbnails = coarse; + return tauri.generateThumbnails(path, 20, info.duration); + }).then((detail) => { + if (this.videoInfo?.path === path) this.thumbnails = detail; + this.analyzeStep = ''; + }).catch(() => { + this.analyzeStep = ''; + }); + } catch (err) { + this.state = 'empty'; + this.analyzeStep = ''; + throw err; + } + } + + async startProcess() { + if (!this.videoInfo) return; + this.state = 'processing'; + this.progress = null; + + this.progressUnlisten = await tauri.listenProgress((ev) => { + this.progress = ev; + this.currentJobId = ev.job_id; + // don't change state here - let the await below handle it + // so outputInfo is set before transitioning to 'done' + }); + + const mode = this.activeMode === 'both' ? 'trimcomp' : this.activeMode === 'trim' ? 'trim' : 'compress'; + + try { + const outPath = this.overriddenOutputPath ?? await tauri.getOutputPath(this.videoInfo.path, mode, this.compressSettings.container.toLowerCase()); + this.overriddenOutputPath = null; + + let result: OutputInfo; + if (this.activeMode === 'trim' && this.trimRange) { + const strip = this.compressSettings.audio_codec === 'None'; + result = await tauri.trim(this.videoInfo.path, outPath, this.trimRange, this.trimMode === 'smart', strip); + } else { + result = await tauri.compress(this.videoInfo.path, outPath, this.compressSettings, this.trimRange ?? undefined); + } + + this.outputInfo = result; + this.state = 'done'; + } catch (err) { + this.state = 'loaded'; + throw err; + } finally { + this.progressUnlisten?.(); + this.progressUnlisten = null; + this.currentJobId = null; + } + } + + async cancelProcess() { + if (this.currentJobId) { + await tauri.cancelJob(this.currentJobId); + } + this.progressUnlisten?.(); + this.progressUnlisten = null; + this.currentJobId = null; + this.progress = null; + this.state = this.videoInfo ? 'loaded' : 'empty'; + } + + resetToEmpty() { + this.state = 'empty'; + this.videoInfo = null; + this.compressSettings = { ...defaultSettings }; + this.trimRange = null; + this.trimMode = 'keyframe'; + this.progress = null; + this.outputInfo = null; + this.thumbnails = []; + this.selectedPreset = null; + this.customSize = 8; + this.advancedOpen = false; + this.overriddenOutputPath = null; + } + + setPreset(mb: number) { + this.selectedPreset = mb; + this.customSize = mb; + this.compressSettings.strategy = { type: 'TargetSize', mb }; + } + + clearPreset() { + this.selectedPreset = null; + this.compressSettings.strategy = { ...defaultSettings.strategy }; + } + + setCustomSize(mb: number) { + this.selectedPreset = null; + this.customSize = mb; + this.compressSettings.strategy = { type: 'TargetSize', mb }; + } + + setStrategy(strategy: SizingStrategy) { + this.selectedPreset = null; + this.compressSettings.strategy = strategy; + } + + setTrimRange(start: number, end: number) { + const duration = this.videoInfo?.duration ?? 0; + const s = Math.max(0, Math.min(start, duration)); + const e = Math.max(0, Math.min(end, duration)); + // never allow in > out + if (s >= e) return; + this.trimRange = { start: s, end: e }; + } + + clearTrimRange() { + this.trimRange = null; + } + + registerSeekCallback(fn: (time: number) => void) { + this.seekCallback = fn; + } + + registerPlaybackCallback(fn: () => void) { + this.playbackCallback = fn; + } + + seek(time: number) { + const clamped = Math.max(0, time); + this.currentTime = clamped; + this.seekCallback?.(clamped); + } + + togglePlayback() { + this.playbackCallback?.(); + } +} + +export const app = new AppStore(); + +// poll sync: class $state fields don't reliably trigger effects across components +if (typeof window !== 'undefined') { + setInterval(() => { + if (view.current !== app.state) { + view.current = app.state; + } + }, 30); +} diff --git a/src/lib/stores/config.svelte.ts b/src/lib/stores/config.svelte.ts new file mode 100644 index 0000000..77bbeaa --- /dev/null +++ b/src/lib/stores/config.svelte.ts @@ -0,0 +1,52 @@ +import type { AppConfig } from '$lib/types'; +import * as tauri from '$lib/utils/tauri'; + +const defaults: AppConfig = { + theme: 'system', + ui_zoom: 100, + ffmpeg_path: null, + default_output_dir: null, + last_compress_settings: null, + default_presets: [8, 25, 50, 100], + auto_retry: true, + retry_threshold_percent: 2.0, + max_retry_attempts: 3, + show_ffmpeg_log: false, + remember_window_position: true, + window_position: null, + default_target_size: 8, + default_smart_cut: false, + naming_pattern: '{name}_{mode}_{timestamp}', + last_open_dir: null, + last_save_dir: null, + preview_volume: 1 +}; + +class ConfigStore { + current: AppConfig = $state({ ...defaults }); + + async load() { + try { + const loaded = await tauri.getConfig(); + this.current = { ...defaults, ...loaded }; + } catch { + this.current = { ...defaults }; + } + } + + async save() { + await tauri.saveConfig(this.current); + } + + async update(partial: Partial) { + Object.assign(this.current, partial); + await this.save(); + } + + async reset() { + this.current = { ...defaults }; + await this.save(); + } +} + +export const config = new ConfigStore(); diff --git a/src/lib/stores/theme.svelte.ts b/src/lib/stores/theme.svelte.ts new file mode 100644 index 0000000..e186959 --- /dev/null +++ b/src/lib/stores/theme.svelte.ts @@ -0,0 +1,56 @@ +import type { Theme, ResolvedTheme } from '$lib/types'; + +class ThemeStore { + theme: Theme = $state('system'); + resolved: ResolvedTheme = $state('dark'); + + private mediaQuery: MediaQueryList | null = null; + private mediaHandler: ((e: MediaQueryListEvent) => void) | null = null; + + private getSystemTheme(): ResolvedTheme { + if (typeof window === 'undefined') return 'dark'; + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + } + + private resolve(): ResolvedTheme { + return this.theme === 'system' ? this.getSystemTheme() : this.theme; + } + + private apply(t: ResolvedTheme) { + if (typeof document === 'undefined') return; + document.documentElement.setAttribute('data-theme', t); + } + + setTheme(t: Theme) { + this.theme = t; + this.resolved = this.resolve(); + this.apply(this.resolved); + } + + init(saved?: Theme) { + if (saved) this.theme = saved; + this.resolved = this.resolve(); + this.apply(this.resolved); + + if (typeof window !== 'undefined') { + this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + this.mediaHandler = () => { + if (this.theme === 'system') { + this.resolved = this.getSystemTheme(); + this.apply(this.resolved); + } + }; + this.mediaQuery.addEventListener('change', this.mediaHandler); + } + } + + destroy() { + if (this.mediaQuery && this.mediaHandler) { + this.mediaQuery.removeEventListener('change', this.mediaHandler); + this.mediaQuery = null; + this.mediaHandler = null; + } + } +} + +export const themeStore = new ThemeStore(); diff --git a/src/lib/stores/toast.svelte.ts b/src/lib/stores/toast.svelte.ts new file mode 100644 index 0000000..1d9cd14 --- /dev/null +++ b/src/lib/stores/toast.svelte.ts @@ -0,0 +1,34 @@ +import type { Toast, ToastType } from '$lib/types'; + +const defaultDurations: Record = { + success: 4000, + info: 4000, + warning: 6000, + error: 0 +}; + +let nextId = 0; + +class ToastStore { + items: Toast[] = $state([]); + + add(type: ToastType, message: string, duration?: number): string { + const id = String(nextId++); + const dur = duration ?? defaultDurations[type]; + + this.items.push({ id, type, message, duration: dur }); + + if (dur > 0) { + setTimeout(() => this.remove(id), dur); + } + + return id; + } + + remove(id: string) { + const idx = this.items.findIndex((t) => t.id === id); + if (idx !== -1) this.items.splice(idx, 1); + } +} + +export const toasts = new ToastStore(); diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..c7ed141 --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,143 @@ +// App states +export type AppState = 'empty' | 'analyzing' | 'loaded' | 'processing' | 'done' | 'settings' | 'setup'; +export type ToastType = 'success' | 'error' | 'warning' | 'info'; +export type TrimMode = 'keyframe' | 'smart'; +export type ActiveMode = 'none' | 'compress' | 'trim' | 'both'; +export type Theme = 'light' | 'dark' | 'system'; +export type ResolvedTheme = 'light' | 'dark'; + +// Video codecs - auto-selects hw variant based on available hardware +export type VideoCodec = 'H264' | 'HEVC' | 'AV1'; +export type AudioCodec = 'AAC' | 'Opus' | 'None'; +export type Container = 'MP4' | 'MKV' | 'WebM' | 'MOV' | 'AVI' | 'TS'; +export type HwAccelMode = 'Auto' | 'ForceGPU' | 'ForceCPU'; + +export type Resolution = + | { type: 'Original' } + | { type: 'P720' } + | { type: 'P1080' } + | { type: 'P1440' } + | { type: 'P4K' } + | { type: 'Custom'; width: number; height: number }; + +export type SizingStrategy = + | { type: 'TargetSize'; mb: number } + | { type: 'TargetBitrate'; kbps: number } + | { type: 'CRF'; value: number }; + +export interface TrimRange { + start: number; + end: number; +} + +export interface VideoInfo { + path: string; + file_size: number; + duration: number; + width: number; + height: number; + video_codec: string; + video_bitrate: number; + frame_rate: number; + is_vfr: boolean; + audio_codec: string | null; + audio_bitrate: number | null; + audio_channels: number | null; + keyframe_times: number[]; + container: string; +} + +export interface CompressSettings { + strategy: SizingStrategy; + video_codec: VideoCodec; + audio_codec: AudioCodec; + audio_bitrate: number; + container: Container; + resolution: Resolution; + speed_preset: string; + hw_accel: HwAccelMode; +} + +export interface OutputInfo { + path: string; + file_size: number; + duration: number; + width: number; + height: number; + video_codec: string; + video_bitrate: number; + audio_codec: string | null; + audio_bitrate: number | null; + attempts: number; +} + +export interface HardwareInfo { + nvenc: boolean; + qsv: boolean; + amf: boolean; + nvenc_codecs: string[]; + qsv_codecs: string[]; + amf_codecs: string[]; +} + +export interface FFmpegStatus { + found: boolean; + path: string | null; + version: string | null; +} + +export type ProgressPhase = 'analyzing' | 'encoding' | 'retrying' | 'muxing' | 'done' | 'error'; + +export interface ProgressEvent { + job_id: string; + percent: number; + fps: number; + bitrate: string; + size_current: number; + time_elapsed: number; + eta_seconds: number; + phase: ProgressPhase; + message?: string; +} + +export interface RetryEvent { + job_id: string; + attempt: number; + reason: string; + adjusted_bitrate: number; +} + +export interface WindowPosition { + x: number; + y: number; + width: number; + height: number; +} + +export interface AppConfig { + theme: Theme; + ui_zoom: number; + ffmpeg_path: string | null; + default_output_dir: string | null; + last_compress_settings: CompressSettings | null; + default_presets: number[]; + auto_retry: boolean; + retry_threshold_percent: number; + max_retry_attempts: number; + show_ffmpeg_log: boolean; + remember_window_position: boolean; + window_position: WindowPosition | null; + default_target_size: number; + default_smart_cut: boolean; + naming_pattern: string; + last_open_dir: string | null; + last_save_dir: string | null; + preview_volume: number; +} + +export interface Toast { + id: string; + type: ToastType; + message: string; + duration: number; +} diff --git a/src/lib/utils/format.ts b/src/lib/utils/format.ts new file mode 100644 index 0000000..13026e1 --- /dev/null +++ b/src/lib/utils/format.ts @@ -0,0 +1,53 @@ +export function formatFileSize(bytes: number): string { + if (bytes >= 1_073_741_824) { + const gb = bytes / 1_073_741_824; + return gb >= 10 ? `${Math.round(gb)} GB` : `${gb.toFixed(1)} GB`; + } + const mb = bytes / 1_048_576; + if (mb >= 10) return `${Math.round(mb)} MB`; + if (mb >= 0.1) return `${mb.toFixed(1)} MB`; + const kb = bytes / 1024; + return `${Math.round(kb)} KB`; +} + +export function formatDuration(seconds: number): string { + const h = Math.floor(seconds / 3600); + const m = Math.floor((seconds % 3600) / 60); + const s = Math.floor(seconds % 60); + if (h > 0) return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`; + return `${m}:${String(s).padStart(2, '0')}`; +} + +export function formatTimecode(seconds: number): string { + const h = Math.floor(seconds / 3600); + const m = Math.floor((seconds % 3600) / 60); + const s = Math.floor(seconds % 60); + const ms = Math.round((seconds % 1) * 100); + return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}.${String(ms).padStart(2, '0')}`; +} + +export function formatTimecodeShort(seconds: number): string { + const h = Math.floor(seconds / 3600); + const m = Math.floor((seconds % 3600) / 60); + const s = Math.floor(seconds % 60); + if (h > 0) return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`; + return `${m}:${String(s).padStart(2, '0')}`; +} + +export function formatBitrate(bps: number): string { + const kbps = Math.round(bps / 1000); + return `${kbps} kbps`; +} + +export function formatPercent(value: number): string { + if (value >= 100) return '100%'; + if (value >= 10) return `${value.toFixed(1)}%`; + return `${value.toFixed(1)}%`; +} + +export function formatEta(seconds: number): string { + if (seconds <= 0) return '0:00'; + const m = Math.floor(seconds / 60); + const s = Math.floor(seconds % 60); + return `${m}:${String(s).padStart(2, '0')}`; +} diff --git a/src/lib/utils/keyboard.ts b/src/lib/utils/keyboard.ts new file mode 100644 index 0000000..91b1a12 --- /dev/null +++ b/src/lib/utils/keyboard.ts @@ -0,0 +1,51 @@ +type ShortcutHandler = { + key: string; + ctrl?: boolean; + shift?: boolean; + handler: () => void; + when?: () => boolean; +}; + +let registered = false; +let shortcuts: ShortcutHandler[] = []; +let cleanup: (() => void) | null = null; + +export function setShortcuts(handlers: ShortcutHandler[]) { + shortcuts = handlers; +} + +export function registerShortcuts() { + if (registered) return; + registered = true; + + const onKeyDown = (e: KeyboardEvent) => { + // skip when typing in inputs + const tag = (e.target as HTMLElement)?.tagName; + if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return; + + for (const s of shortcuts) { + const ctrlMatch = s.ctrl ? (e.ctrlKey || e.metaKey) : !(e.ctrlKey || e.metaKey); + const shiftMatch = s.shift ? e.shiftKey : !e.shiftKey; + const keyMatch = e.key === s.key || e.code === s.key; + + if (keyMatch && ctrlMatch && shiftMatch) { + if (s.when && !s.when()) continue; + e.preventDefault(); + s.handler(); + return; + } + } + }; + + window.addEventListener('keydown', onKeyDown); + cleanup = () => { + window.removeEventListener('keydown', onKeyDown); + registered = false; + }; +} + +export function unregisterShortcuts() { + cleanup?.(); + cleanup = null; + shortcuts = []; +} diff --git a/src/lib/utils/tauri.ts b/src/lib/utils/tauri.ts new file mode 100644 index 0000000..bd13308 --- /dev/null +++ b/src/lib/utils/tauri.ts @@ -0,0 +1,117 @@ +import { invoke } from '@tauri-apps/api/core'; +import { listen, type UnlistenFn } from '@tauri-apps/api/event'; +import type { + VideoInfo, + CompressSettings, + TrimRange, + OutputInfo, + HardwareInfo, + FFmpegStatus, + ProgressEvent, + AppConfig +} from '$lib/types'; + +export function analyzeVideo(path: string): Promise { + return invoke('analyze_video', { path }); +} + +export function extractKeyframes(path: string): Promise { + return invoke('extract_keyframes', { path }); +} + +export function generateThumbnails(path: string, count: number, duration?: number): Promise { + return invoke('generate_thumbnails', { path, count, duration: duration ?? null }); +} + +export function generatePreview(path: string, codec?: string): Promise { + return invoke('generate_preview', { path, codec: codec ?? null }); +} + +export function detectHardware(): Promise { + return invoke('detect_hardware'); +} + +export function compress( + input: string, + output: string, + settings: CompressSettings, + trim?: TrimRange +): Promise { + return invoke('compress', { input, output, settings, trim: trim ?? null }); +} + +export function trim( + input: string, + output: string, + range: TrimRange, + smartCut: boolean, + stripAudio: boolean = false +): Promise { + return invoke('trim', { input, output, range, smartCut, stripAudio: stripAudio ? true : null }); +} + +export function cancelJob(jobId: string): Promise { + return invoke('cancel_job', { jobId }); +} + +export function checkFfmpeg(): Promise { + return invoke('check_ffmpeg'); +} + +export function openInExplorer(path: string): Promise { + return invoke('open_in_explorer', { path }); +} + +export function getConfig(): Promise { + return invoke('get_config'); +} + +export function saveConfig(cfg: AppConfig): Promise { + return invoke('save_config_cmd', { newConfig: cfg }); +} + +export function getOutputPath(input: string, mode: string, container: string = 'mp4'): Promise { + return invoke('get_output_path', { input, mode, container }); +} + +export function initApp(): Promise { + return invoke('init_app'); +} + +export function downloadFfmpeg(): Promise { + return invoke('download_ffmpeg'); +} + +export interface InterruptedJob { + input_path: string; + output_path: string; + mode: string; + settings_json: string; +} + +export function checkRecovery(): Promise { + return invoke('check_recovery'); +} + +export function cleanupRecovery(): Promise { + return invoke('cleanup_recovery'); +} + +export function listenProgress(callback: (event: ProgressEvent) => void): Promise { + return listen('progress', (ev) => callback(ev.payload)); +} + +export function getStreamPort(): Promise { + return invoke('get_stream_port_cmd'); +} + +let streamBase = ''; + +export function setStreamBase(base: string) { + streamBase = base; +} + +export function streamUrl(path: string): string { + if (!streamBase) return ''; + return streamBase + encodeURIComponent(path); +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..eb382b5 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,202 @@ + + +
+ + +
{ slideDir = null; }} + > + {@render children()} +
+
+ + diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..ceccaaf --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,2 @@ +export const prerender = true; +export const ssr = false; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..38bcebd --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte new file mode 100644 index 0000000..a563641 --- /dev/null +++ b/src/routes/settings/+page.svelte @@ -0,0 +1,774 @@ + + +
+
+

Settings

+

Configure how Cinch works

+
+ +
+ +
+
+
+ +
+

Appearance

+
+ +
+
+ Theme +
+ {#each themeChoices as t} + + {/each} +
+
+ +
+ UI Zoom +
+ +
+ + {config.current.ui_zoom}% +
+
+ +
+
+ + +
+
+
+ +
+

Default settings

+
+ +
+
+
+ Target size + config.update({ default_target_size: parseInt(v) })} /> +
+
+ Video codec + updateLastSetting('video_codec', v as any)} /> +
+
+ Container + updateLastSetting('container', v as any)} /> +
+
+ Audio codec + updateLastSetting('audio_codec', v as any)} /> +
+
+ Audio bitrate + updateLastSetting('audio_bitrate', parseInt(v))} /> +
+
+ +
+
+ +
+ Smart cut by default + Use smart re-encode instead of keyframe snap +
+
+ config.update({ default_smart_cut: v })} /> +
+
+
+ + +
+
+
+ +
+

Processing

+
+ +
+
+
+ +
+ Auto-retry when over target + Automatically re-encode if output exceeds target +
+
+ config.update({ auto_retry: v })} /> +
+ + {#if config.current.auto_retry} +
+
+ Threshold + config.update({ retry_threshold_percent: parseFloat(v) })} /> +
+
+ Max retries + config.update({ max_retry_attempts: parseInt(v) })} /> +
+
+ {/if} + +
+
+ +
+ Show FFmpeg log + Display raw FFmpeg output during encoding +
+
+ config.update({ show_ffmpeg_log: v })} /> +
+
+
+ + +
+
+
+ +
+

FFmpeg

+ {#if app.ffmpegStatus.found} + Ready + {:else} + Missing + {/if} +
+ +
+
+ Binary path +
+ + + {config.current.ffmpeg_path ?? 'Not configured - will search system PATH'} + +
+ + +
+
+ {#if app.ffmpegStatus.version} +
+ + Version {app.ffmpegStatus.version} detected +
+ {/if} +
+
+
+ + +
+
+
+ +
+

Output

+
+ +
+
+ Default folder +
+ + + {config.current.default_output_dir ?? 'Same folder as source file'} + +
+ + {#if config.current.default_output_dir} + + {/if} +
+
+
+ +
+ Naming pattern + config.update({ naming_pattern: v })} /> +
+
+
+
+ + +
+ + diff --git a/static/fonts/GeistMono-Variable.woff2 b/static/fonts/GeistMono-Variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..504be8626156df9ac8d3defd4b584ee42b80170d GIT binary patch literal 31368 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

B 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 N>=)1{`Dd&E003DOC;I>Z literal 0 HcmV?d00001 diff --git a/static/fonts/Syne-Variable.woff2 b/static/fonts/Syne-Variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e311600b11d12da9aa07b9ea731a7f89e5b9c2b9 GIT binary patch literal 34608 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

+ +
+
+
+
+
+ + {#if step === 1} +
+ +
+ +
+ + +

+ Cinch needs FFmpeg +

+ + +

+ FFmpeg is the video engine that powers compression and trimming. +

+ + + + + +
+
+ or install manually +
+
+ + +
+ + + + +
+ + + + Or install via winget: + +
+ + winget install Gyan.FFmpeg + + +
+
+ + +
+ + + +
+ + + +
+ + {:else} + +
+
+ +
+ +

+ FFmpeg found +

+ +
+ {#if app.ffmpegStatus.path} + + {app.ffmpegStatus.path} + + {/if} + {#if app.ffmpegStatus.version} + + Version {app.ffmpegStatus.version} + + {/if} +
+ + +
+ {/if} +