From ee2d5e3381acba1797b1ef80d8e5e14924d0dd1c Mon Sep 17 00:00:00 2001 From: Edneam Date: Tue, 9 Jun 2026 17:14:38 +0530 Subject: [PATCH] feat: rebuild Verric into a production evidence-grounded document engine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Transform the hackathon MVP into a self-hostable, open-source engine. Verric is now the engine; pentest is the flagship template. Monorepo (pnpm + Turborepo), 6 packages + 2 apps: - @verric/core — pure-TS engine: provider abstraction (OpenAI/Anthropic/ Ollama, BYO-key, no mock fallback), zod-validated LLM I/O with repair retry, prompt-injection defense + adversarial canary, cryptographic HMAC receipts, deterministic CVSS, NLI-blended claim confidence, pluggable Importer/ReportTemplate/NliScorer interfaces, and 3 templates (pentest, postmortem, ADR) + 9 importers (nmap/burp/nessus/nuclei/zap/ openvas/slack/pagerduty/github) - @verric/storage — node:sqlite, schema v4, async run queue + events + versioned reports + claim-edit audit + finding library + branding + template registry - @verric/cli — `verric report` / `verric verify` (bundled binary) - @verric/sdk — typed REST + SSE client - @verric/mcp-server — MCP stdio server (runs/reports/receipts as tools) - @verric/desktop — Tauri 2 native shell (deb + AppImage verified) - apps/web — Next 16 studio: async pipeline + SSE progress, claim editor (accept/reject/re-ground), version history + claim-level diff, finding library + branding UIs, PDF/DOCX/TXT export with branding Surfaces: web, CLI, REST/SDK, GitHub Action, GitHub App (fires the engine on verric:postmortem issues and verric:adr PR merges), MCP, desktop. Tooling: Vitest (215 tests), ESLint/Prettier, GitHub Actions CI, Docker. Trust contract holds across every surface: real provider or honest failure, claim->evidence provenance, independent grounding + NLI confidence, signed receipts. --- .env.local.example | 3 - .github/actions/verric/README.md | 69 + .github/actions/verric/action.yml | 108 + .github/apps/verric/README.md | 34 + .github/workflows/ci.yml | 55 + .gitignore | 37 +- .npmrc | 5 + .prettierignore | 18 + .prettierrc.json | 10 + Dockerfile | 19 +- apps/desktop/README.md | 57 + apps/desktop/package.json | 17 + apps/desktop/src-tauri/Cargo.lock | 4568 ++++++++++++ apps/desktop/src-tauri/Cargo.toml | 19 + apps/desktop/src-tauri/build.rs | 3 + apps/desktop/src-tauri/icons/128x128.png | Bin 0 -> 1833 bytes apps/desktop/src-tauri/icons/128x128@2x.png | Bin 0 -> 4188 bytes apps/desktop/src-tauri/icons/32x32.png | Bin 0 -> 629 bytes apps/desktop/src-tauri/icons/64x64.png | Bin 0 -> 888 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 1703 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 2216 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 2374 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 4606 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 580 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 5120 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 734 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 1046 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 1235 bytes apps/desktop/src-tauri/icons/StoreLogo.png | Bin 0 -> 801 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 875 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2565 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 678 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 861 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 1625 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 603 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1405 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 3437 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 903 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 2178 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 5272 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 1152 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 3098 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 7126 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 1383 bytes .../android/values/ic_launcher_background.xml | 4 + apps/desktop/src-tauri/icons/icon.icns | Bin 0 -> 46434 bytes apps/desktop/src-tauri/icons/icon.ico | Bin 0 -> 8097 bytes apps/desktop/src-tauri/icons/icon.png | Bin 0 -> 8613 bytes .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 456 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 737 bytes .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 737 bytes .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 887 bytes .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 552 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 830 bytes .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 830 bytes .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 1236 bytes .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 737 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 1197 bytes .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 1197 bytes .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 1865 bytes .../src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 14543 bytes .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 1865 bytes .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 2998 bytes .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 1024 bytes .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 2558 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 2768 bytes apps/desktop/src-tauri/src/main.rs | 18 + apps/desktop/src-tauri/tauri.conf.json | 42 + apps/web/.env.local.example | 27 + next-env.d.ts => apps/web/next-env.d.ts | 2 +- apps/web/next.config.mjs | 21 + apps/web/package.json | 29 + .../web/postcss.config.mjs | 0 apps/web/src/app/api/branding/[id]/route.ts | 37 + apps/web/src/app/api/branding/route.ts | 29 + .../web/src}/app/api/export-docx/route.ts | 265 +- apps/web/src/app/api/export-pdf/route.tsx | 839 +++ .../web/src}/app/api/export-txt/route.ts | 2 +- apps/web/src/app/api/generate-report/route.ts | 158 + apps/web/src/app/api/github/webhook/route.ts | 295 + apps/web/src/app/api/health/route.ts | 43 + .../app/api/library/findings/[id]/route.ts | 42 + .../web/src/app/api/library/findings/route.ts | 39 + .../api/runs/[id]/claims/[claimId]/route.ts | 271 + apps/web/src/app/api/runs/[id]/diff/route.ts | 90 + apps/web/src/app/api/runs/[id]/route.ts | 32 + .../web/src/app/api/runs/[id]/stream/route.ts | 132 + .../src/app/api/runs/[id]/versions/route.ts | 21 + apps/web/src/app/api/runs/route.ts | 29 + apps/web/src/app/api/templates/route.ts | 81 + apps/web/src/app/branding/page.tsx | 473 ++ {src => apps/web/src}/app/globals.css | 8 +- {src => apps/web/src}/app/layout.tsx | 0 apps/web/src/app/library/page.tsx | 440 ++ apps/web/src/app/page.tsx | 1327 ++++ apps/web/src/app/runs/[id]/page.tsx | 334 + apps/web/src/app/runs/page.tsx | 147 + apps/web/src/lib/db.ts | 29 + apps/web/src/lib/github.ts | 236 + apps/web/src/lib/run-bus.ts | 65 + apps/web/src/lib/worker.ts | 132 + .../web/tailwind.config.ts | 0 tsconfig.json => apps/web/tsconfig.json | 22 +- docker-compose.yml | 10 +- eslint.config.mjs | 85 + next.config.mjs | 8 - package-lock.json | 2914 -------- package.json | 47 +- packages/cli/package.json | 29 + packages/cli/scripts/build.mjs | 40 + packages/cli/src/args.ts | 45 + packages/cli/src/cli.test.ts | 219 + packages/cli/src/commands/report.ts | 158 + packages/cli/src/commands/verify.ts | 89 + packages/cli/src/index.ts | 41 + packages/cli/src/io.ts | 150 + packages/cli/src/main.ts | 15 + packages/cli/src/provider.ts | 45 + packages/cli/tsconfig.json | 18 + packages/core/package.json | 35 + packages/core/src/adr.test.ts | 173 + packages/core/src/chunks.test.ts | 139 + packages/core/src/chunks.ts | 119 + packages/core/src/cvss.test.ts | 121 + packages/core/src/cvss.ts | 70 + packages/core/src/engine.test.ts | 493 ++ packages/core/src/engine.ts | 616 ++ packages/core/src/importers/burp.ts | 103 + packages/core/src/importers/github.ts | 92 + packages/core/src/importers/importers.test.ts | 291 + packages/core/src/importers/index.ts | 42 + packages/core/src/importers/nessus.ts | 87 + packages/core/src/importers/nmap.ts | 38 + packages/core/src/importers/nuclei.ts | 89 + packages/core/src/importers/openvas.ts | 72 + packages/core/src/importers/pagerduty.ts | 74 + .../importers/postmortem-importers.test.ts | 142 + packages/core/src/importers/slack.ts | 81 + packages/core/src/importers/types.ts | 91 + packages/core/src/importers/zap.ts | 79 + packages/core/src/index.ts | 144 + packages/core/src/json.test.ts | 52 + packages/core/src/json.ts | 17 + packages/core/src/nli.test.ts | 150 + packages/core/src/nli.ts | 337 + packages/core/src/nmap.test.ts | 123 + packages/core/src/nmap.ts | 85 + packages/core/src/plain-text.ts | 68 + packages/core/src/postmortem.test.ts | 180 + packages/core/src/prompts.ts | 234 + packages/core/src/providers.test.ts | 140 + packages/core/src/providers.ts | 294 + packages/core/src/receipts.test.ts | 174 + packages/core/src/receipts.ts | 170 + packages/core/src/samples.ts | 108 + packages/core/src/schema.test.ts | 110 + packages/core/src/schema.ts | 231 + packages/core/src/templates-adr.ts | 107 + packages/core/src/templates-postmortem.ts | 108 + packages/core/src/templates.ts | 48 + packages/core/src/types.ts | 133 + packages/core/src/validate.test.ts | 245 + packages/core/src/validate.ts | 121 + packages/core/tsconfig.json | 18 + packages/mcp-server/README.md | 58 + packages/mcp-server/package.json | 31 + packages/mcp-server/scripts/build.mjs | 29 + packages/mcp-server/src/index.ts | 278 + packages/mcp-server/src/main.ts | 20 + packages/mcp-server/tsconfig.json | 18 + packages/sdk/package.json | 22 + packages/sdk/src/index.ts | 338 + packages/sdk/src/sdk.test.ts | 194 + packages/sdk/tsconfig.json | 18 + packages/storage/package.json | 25 + packages/storage/src/index.ts | 67 + packages/storage/src/repository.test.ts | 827 +++ packages/storage/src/repository.ts | 1303 ++++ packages/storage/src/schema.ts | 326 + packages/storage/src/sqlite.ts | 49 + packages/storage/tsconfig.json | 18 + pnpm-lock.yaml | 6130 +++++++++++++++++ pnpm-workspace.yaml | 16 + src/app/api/export-pdf/route.tsx | 437 -- src/app/api/generate-report/route.ts | 310 - src/app/page.tsx | 613 -- src/lib/report.ts | 838 --- turbo.json | 21 + vitest.config.ts | 33 + 190 files changed, 27941 insertions(+), 5223 deletions(-) delete mode 100644 .env.local.example create mode 100644 .github/actions/verric/README.md create mode 100644 .github/actions/verric/action.yml create mode 100644 .github/apps/verric/README.md create mode 100644 .github/workflows/ci.yml create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 apps/desktop/README.md create mode 100644 apps/desktop/package.json create mode 100644 apps/desktop/src-tauri/Cargo.lock create mode 100644 apps/desktop/src-tauri/Cargo.toml create mode 100644 apps/desktop/src-tauri/build.rs create mode 100644 apps/desktop/src-tauri/icons/128x128.png create mode 100644 apps/desktop/src-tauri/icons/128x128@2x.png create mode 100644 apps/desktop/src-tauri/icons/32x32.png create mode 100644 apps/desktop/src-tauri/icons/64x64.png create mode 100644 apps/desktop/src-tauri/icons/Square107x107Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square142x142Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square150x150Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square284x284Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square30x30Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square310x310Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square44x44Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square71x71Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square89x89Logo.png create mode 100644 apps/desktop/src-tauri/icons/StoreLogo.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml create mode 100644 apps/desktop/src-tauri/icons/icon.icns create mode 100644 apps/desktop/src-tauri/icons/icon.ico create mode 100644 apps/desktop/src-tauri/icons/icon.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 apps/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 apps/desktop/src-tauri/src/main.rs create mode 100644 apps/desktop/src-tauri/tauri.conf.json create mode 100644 apps/web/.env.local.example rename next-env.d.ts => apps/web/next-env.d.ts (84%) create mode 100644 apps/web/next.config.mjs create mode 100644 apps/web/package.json rename postcss.config.mjs => apps/web/postcss.config.mjs (100%) create mode 100644 apps/web/src/app/api/branding/[id]/route.ts create mode 100644 apps/web/src/app/api/branding/route.ts rename {src => apps/web/src}/app/api/export-docx/route.ts (59%) create mode 100644 apps/web/src/app/api/export-pdf/route.tsx rename {src => apps/web/src}/app/api/export-txt/route.ts (94%) create mode 100644 apps/web/src/app/api/generate-report/route.ts create mode 100644 apps/web/src/app/api/github/webhook/route.ts create mode 100644 apps/web/src/app/api/health/route.ts create mode 100644 apps/web/src/app/api/library/findings/[id]/route.ts create mode 100644 apps/web/src/app/api/library/findings/route.ts create mode 100644 apps/web/src/app/api/runs/[id]/claims/[claimId]/route.ts create mode 100644 apps/web/src/app/api/runs/[id]/diff/route.ts create mode 100644 apps/web/src/app/api/runs/[id]/route.ts create mode 100644 apps/web/src/app/api/runs/[id]/stream/route.ts create mode 100644 apps/web/src/app/api/runs/[id]/versions/route.ts create mode 100644 apps/web/src/app/api/runs/route.ts create mode 100644 apps/web/src/app/api/templates/route.ts create mode 100644 apps/web/src/app/branding/page.tsx rename {src => apps/web/src}/app/globals.css (88%) rename {src => apps/web/src}/app/layout.tsx (100%) create mode 100644 apps/web/src/app/library/page.tsx create mode 100644 apps/web/src/app/page.tsx create mode 100644 apps/web/src/app/runs/[id]/page.tsx create mode 100644 apps/web/src/app/runs/page.tsx create mode 100644 apps/web/src/lib/db.ts create mode 100644 apps/web/src/lib/github.ts create mode 100644 apps/web/src/lib/run-bus.ts create mode 100644 apps/web/src/lib/worker.ts rename tailwind.config.ts => apps/web/tailwind.config.ts (100%) rename tsconfig.json => apps/web/tsconfig.json (60%) create mode 100644 eslint.config.mjs delete mode 100644 next.config.mjs delete mode 100644 package-lock.json create mode 100644 packages/cli/package.json create mode 100644 packages/cli/scripts/build.mjs create mode 100644 packages/cli/src/args.ts create mode 100644 packages/cli/src/cli.test.ts create mode 100644 packages/cli/src/commands/report.ts create mode 100644 packages/cli/src/commands/verify.ts create mode 100644 packages/cli/src/index.ts create mode 100644 packages/cli/src/io.ts create mode 100644 packages/cli/src/main.ts create mode 100644 packages/cli/src/provider.ts create mode 100644 packages/cli/tsconfig.json create mode 100644 packages/core/package.json create mode 100644 packages/core/src/adr.test.ts create mode 100644 packages/core/src/chunks.test.ts create mode 100644 packages/core/src/chunks.ts create mode 100644 packages/core/src/cvss.test.ts create mode 100644 packages/core/src/cvss.ts create mode 100644 packages/core/src/engine.test.ts create mode 100644 packages/core/src/engine.ts create mode 100644 packages/core/src/importers/burp.ts create mode 100644 packages/core/src/importers/github.ts create mode 100644 packages/core/src/importers/importers.test.ts create mode 100644 packages/core/src/importers/index.ts create mode 100644 packages/core/src/importers/nessus.ts create mode 100644 packages/core/src/importers/nmap.ts create mode 100644 packages/core/src/importers/nuclei.ts create mode 100644 packages/core/src/importers/openvas.ts create mode 100644 packages/core/src/importers/pagerduty.ts create mode 100644 packages/core/src/importers/postmortem-importers.test.ts create mode 100644 packages/core/src/importers/slack.ts create mode 100644 packages/core/src/importers/types.ts create mode 100644 packages/core/src/importers/zap.ts create mode 100644 packages/core/src/index.ts create mode 100644 packages/core/src/json.test.ts create mode 100644 packages/core/src/json.ts create mode 100644 packages/core/src/nli.test.ts create mode 100644 packages/core/src/nli.ts create mode 100644 packages/core/src/nmap.test.ts create mode 100644 packages/core/src/nmap.ts create mode 100644 packages/core/src/plain-text.ts create mode 100644 packages/core/src/postmortem.test.ts create mode 100644 packages/core/src/prompts.ts create mode 100644 packages/core/src/providers.test.ts create mode 100644 packages/core/src/providers.ts create mode 100644 packages/core/src/receipts.test.ts create mode 100644 packages/core/src/receipts.ts create mode 100644 packages/core/src/samples.ts create mode 100644 packages/core/src/schema.test.ts create mode 100644 packages/core/src/schema.ts create mode 100644 packages/core/src/templates-adr.ts create mode 100644 packages/core/src/templates-postmortem.ts create mode 100644 packages/core/src/templates.ts create mode 100644 packages/core/src/types.ts create mode 100644 packages/core/src/validate.test.ts create mode 100644 packages/core/src/validate.ts create mode 100644 packages/core/tsconfig.json create mode 100644 packages/mcp-server/README.md create mode 100644 packages/mcp-server/package.json create mode 100644 packages/mcp-server/scripts/build.mjs create mode 100644 packages/mcp-server/src/index.ts create mode 100644 packages/mcp-server/src/main.ts create mode 100644 packages/mcp-server/tsconfig.json create mode 100644 packages/sdk/package.json create mode 100644 packages/sdk/src/index.ts create mode 100644 packages/sdk/src/sdk.test.ts create mode 100644 packages/sdk/tsconfig.json create mode 100644 packages/storage/package.json create mode 100644 packages/storage/src/index.ts create mode 100644 packages/storage/src/repository.test.ts create mode 100644 packages/storage/src/repository.ts create mode 100644 packages/storage/src/schema.ts create mode 100644 packages/storage/src/sqlite.ts create mode 100644 packages/storage/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml delete mode 100644 src/app/api/export-pdf/route.tsx delete mode 100644 src/app/api/generate-report/route.ts delete mode 100644 src/app/page.tsx delete mode 100644 src/lib/report.ts create mode 100644 turbo.json create mode 100644 vitest.config.ts diff --git a/.env.local.example b/.env.local.example deleted file mode 100644 index 6a3ff40..0000000 --- a/.env.local.example +++ /dev/null @@ -1,3 +0,0 @@ -OPENAI_API_KEY=your_key_here -OPENAI_MODEL=gpt-4o-mini -USE_MOCK_REPORT=false diff --git a/.github/actions/verric/README.md b/.github/actions/verric/README.md new file mode 100644 index 0000000..ac3c222 --- /dev/null +++ b/.github/actions/verric/README.md @@ -0,0 +1,69 @@ +# Verric GitHub Action + +Generate an evidence-grounded report — pentest, postmortem, audit — straight from your CI pipeline. The action wraps the [`verric` CLI](../../../packages/cli/) and uploads the resulting `report.json`, `receipt.json`, and verdicts as a workflow artifact. + +## Trust contract + +- Real provider or honest failure. **No mock fallback.** +- Every successful run produces a [cryptographic receipt](../../../packages/core/src/receipts.ts) signed with `VERRIC_SIGNING_KEY` (defaults to `${{ github.sha }}` so receipts are reproducible per commit). +- The grounding pass + adversarial canary still run; if a model gets prompt-injected, the action exits non-zero. + +## Quick start + +```yaml +name: Generate pentest report +on: + workflow_dispatch: + push: + paths: ["evidence/**"] + +jobs: + verric: + runs-on: ubuntu-latest + permissions: + contents: read + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/verric + with: + evidence-dir: ./evidence + project-file: ./engagement.json + provider: openai +``` + +## Inputs + +| Name | Description | Required | Default | +|---|---|---|---| +| `evidence-dir` | Directory of evidence files | yes | — | +| `project-file` | `ProjectDetails` JSON | no | built-in sample | +| `notes-file` | Markdown notes appended to evidence | no | — | +| `out-dir` | Where to write report/receipt/verdicts | no | `./verric-out` | +| `provider` | `openai` \| `anthropic` \| `ollama` | no | auto-detect | +| `model` | Override model id | no | provider default | +| `signing-key` | HMAC key for the receipt | no | `${{ github.sha }}` | +| `template` | Report template id | no | `pentest@0.1.0` | + +## Outputs + +| Name | Description | +|---|---| +| `report-path` | Path to the generated `report.json` | +| `receipt-path` | Path to the signed `receipt.json` | +| `receipt-signature` | First 16 hex chars of the HMAC signature | + +## Verifying a receipt later + +Anyone with the same signing key can independently verify a receipt: + +```bash +verric verify \ + --receipt ./verric-out/receipt.json \ + --report ./verric-out/report.json \ + --evidence ./verric-out/evidence.json \ + --signing-key $GITHUB_SHA +``` + +Exit 0 = signature valid. Non-zero with a per-field breakdown on stderr otherwise. diff --git a/.github/actions/verric/action.yml b/.github/actions/verric/action.yml new file mode 100644 index 0000000..0b9b10d --- /dev/null +++ b/.github/actions/verric/action.yml @@ -0,0 +1,108 @@ +name: "Verric — Evidence-Grounded Report" +description: "Generate a grounded pentest/postmortem/audit report from CI evidence. Real provider or honest failure." +author: "Verric" +branding: + icon: "shield" + color: "red" + +inputs: + evidence-dir: + description: "Directory containing evidence files (scans, logs, screenshots, etc.)." + required: true + project-file: + description: "Path to a ProjectDetails JSON file. Optional; the built-in sample is used if omitted." + required: false + notes-file: + description: "Optional Markdown file appended as manual tester notes." + required: false + out-dir: + description: "Directory where the action writes report.json, receipt.json, etc." + required: false + default: "./verric-out" + provider: + description: "openai | anthropic | ollama. Auto-detects from env when omitted." + required: false + model: + description: "Override model id for the chosen provider." + required: false + signing-key: + description: "HMAC key for the cryptographic receipt. Defaults to GITHUB_SHA so receipts are reproducible per commit." + required: false + template: + description: "Report template id (e.g. pentest@0.1.0)." + required: false + default: "pentest@0.1.0" + +outputs: + report-path: + description: "Path to the generated report.json" + value: ${{ steps.run.outputs.report-path }} + receipt-path: + description: "Path to the signed receipt.json" + value: ${{ steps.run.outputs.receipt-path }} + receipt-signature: + description: "First 16 hex chars of the HMAC signature (for at-a-glance log inspection)" + value: ${{ steps.run.outputs.receipt-signature }} + +runs: + using: "composite" + steps: + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: "11.5.2" + + - name: Install + build CLI + shell: bash + working-directory: ${{ github.action_path }}/../../.. + run: | + pnpm install --frozen-lockfile + pnpm --filter @verric/cli build + + - name: Run Verric + id: run + shell: bash + env: + # Provide whichever provider creds are present; the CLI picks one. + OPENAI_API_KEY: ${{ env.OPENAI_API_KEY }} + ANTHROPIC_API_KEY: ${{ env.ANTHROPIC_API_KEY }} + OLLAMA_BASE_URL: ${{ env.OLLAMA_BASE_URL }} + VERRIC_PROVIDER: ${{ inputs.provider }} + VERRIC_SIGNING_KEY: ${{ inputs.signing-key || github.sha }} + run: | + set -euo pipefail + CLI="${{ github.action_path }}/../../../packages/cli/dist/cli.mjs" + PROJECT_ARG="" + if [ -n "${{ inputs.project-file }}" ]; then + PROJECT_ARG="--project ${{ inputs.project-file }}" + fi + NOTES_ARG="" + if [ -n "${{ inputs.notes-file }}" ]; then + NOTES_ARG="--notes ${{ inputs.notes-file }}" + fi + MODEL_ARG="" + if [ -n "${{ inputs.model }}" ]; then + MODEL_ARG="--model ${{ inputs.model }}" + fi + node "$CLI" report \ + --evidence "${{ inputs.evidence-dir }}" \ + --out "${{ inputs.out-dir }}" \ + $PROJECT_ARG \ + $NOTES_ARG \ + $MODEL_ARG + echo "report-path=${{ inputs.out-dir }}/report.json" >> "$GITHUB_OUTPUT" + echo "receipt-path=${{ inputs.out-dir }}/receipt.json" >> "$GITHUB_OUTPUT" + SIG=$(node -e "const r=require('${{ inputs.out-dir }}/receipt.json'); process.stdout.write(r.signature.slice(0,16));") + echo "receipt-signature=$SIG" >> "$GITHUB_OUTPUT" + + - name: Upload report artifacts + uses: actions/upload-artifact@v4 + with: + name: verric-report + path: ${{ inputs.out-dir }} + retention-days: 30 diff --git a/.github/apps/verric/README.md b/.github/apps/verric/README.md new file mode 100644 index 0000000..0ab03d0 --- /dev/null +++ b/.github/apps/verric/README.md @@ -0,0 +1,34 @@ +# Verric GitHub App + +A GitHub App that auto-drafts grounded reports when specific events happen on a repo. Triggers: + +| Trigger | Action | +|---|---| +| Close an issue with the label `verric:postmortem` | Draft a postmortem from the issue body + linked PRs + relevant Slack threads (when configured) | +| Merge a PR with the label `verric:adr` | Draft an Architecture Decision Record from the PR description + diff | + +## How it works + +1. The app posts events to `POST /api/github/webhook` on your self-hosted Verric instance. +2. Verric verifies the `X-Hub-Signature-256` header against `VERRIC_GITHUB_WEBHOOK_SECRET`. +3. Routes by event + label, then dispatches a Verric run asynchronously (same engine used for manual runs — receipt, canary, grounding pass, the lot). +4. When the run completes, Verric posts a comment on the issue/PR linking to the report and includes the receipt's signature prefix. + +## Configure the App + +1. Create a new GitHub App: +2. Webhook URL: `https://your-verric.example.com/api/github/webhook` +3. Webhook secret: any high-entropy string. Set the same value as `VERRIC_GITHUB_WEBHOOK_SECRET` on your Verric server. +4. Permissions: + - **Issues**: Read & write (for posting comments on completed postmortems) + - **Pull requests**: Read & write + - **Contents**: Read (for fetching diffs) + - **Metadata**: Read (default) +5. Subscribe to events: + - Issues + - Pull request +6. Install on the repo(s) you want grounded reports for. + +## Status + +The webhook receiver is **live and signature-verified**. Dispatching to the engine for postmortem/ADR drafts is wired but currently logs intent rather than firing the run end-to-end — that lights up alongside the GitHub importer expansion in the next slice. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6980085 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,55 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +# Cancel any in-flight CI run on the same branch when a new push lands. +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + TURBO_TELEMETRY_DISABLED: 1 + NEXT_TELEMETRY_DISABLED: 1 + CI: true + +jobs: + verify: + name: lint · typecheck · test · build + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 11.5.2 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: "pnpm" + + - name: Install + run: pnpm install --frozen-lockfile + + - name: Format check + run: pnpm format:check + + - name: Lint + run: pnpm lint + + - name: Typecheck + run: pnpm typecheck + + - name: Test + run: pnpm test + + - name: Build + run: pnpm build diff --git a/.gitignore b/.gitignore index 3144148..0c8acab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,48 @@ +# Build output .next +.turbo +out +dist +build +coverage + +# Rust / Tauri build output +target/ +apps/desktop/src-tauri/gen/ +# Dependencies node_modules -.env*.local + +# Lockfiles for other package managers (we use pnpm) +package-lock.json +yarn.lock + +# Env / secrets +.env +.env.* +!.env.*.example + +# Logs npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* -# verric scratch +# IDE / OS +.vscode +.idea +.DS_Store +Thumbs.db + +# Verric scratch .page*.png .pf*.png .nf*.png .vp*.png -# tooling binaries +# Tooling bin/ tsconfig.tsbuildinfo +*.tsbuildinfo + +# CodeGraph index +.codegraph diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..eac37fc --- /dev/null +++ b/.npmrc @@ -0,0 +1,5 @@ +strict-peer-dependencies=false +auto-install-peers=true +shamefully-hoist=false +node-linker=isolated +verify-deps-before-run=false diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..9b2b270 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,18 @@ +node_modules +.next +.turbo +dist +build +out +coverage +pnpm-lock.yaml +package-lock.json +*.min.js +*.min.css +.codegraph + +# Hand-styled markdown — leave the author's voice alone +README.md +demo-evidence-pack +demo-complete-evidence-pack +demo-complete-evidence-pack-README.md diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..7be87be --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,10 @@ +{ + "semi": true, + "singleQuote": false, + "trailingComma": "none", + "printWidth": 110, + "tabWidth": 2, + "useTabs": false, + "endOfLine": "lf", + "arrowParens": "always" +} diff --git a/Dockerfile b/Dockerfile index a2f8718..f9aa455 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,18 +5,23 @@ FROM node:22-alpine AS deps WORKDIR /app # libc6-compat keeps some native Node addons happy on Alpine. RUN apk add --no-cache libc6-compat -COPY package.json package-lock.json ./ -RUN npm ci +# Enable pnpm via Corepack — pinned via packageManager in package.json. +RUN corepack enable +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./ +COPY apps/web/package.json apps/web/package.json +RUN pnpm install --frozen-lockfile # ---- Stage 2: build the Next.js standalone output -------------------------- FROM node:22-alpine AS builder WORKDIR /app +RUN apk add --no-cache libc6-compat && corepack enable COPY --from=deps /app/node_modules ./node_modules +COPY --from=deps /app/apps/web/node_modules ./apps/web/node_modules COPY . . # Telemetry off for reproducible CI builds. No secrets are needed at build time; # OPENAI_API_KEY is supplied at runtime only. ENV NEXT_TELEMETRY_DISABLED=1 -RUN npm run build +RUN pnpm --filter @verric/web build # ---- Stage 3: minimal runtime image --------------------------------------- FROM node:22-alpine AS runner @@ -32,11 +37,13 @@ RUN addgroup --system --gid 1001 nodejs \ && adduser --system --uid 1001 nextjs # Copy the standalone server, static assets, and (if present) public files. -COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +# Next 16 standalone output for a workspace lives at apps/web/.next/standalone +# and includes the workspace's own node_modules at the appropriate paths. +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static USER nextjs EXPOSE 3000 # server.js is produced by Next's standalone output and honors PORT/HOSTNAME. -CMD ["node", "server.js"] +CMD ["node", "apps/web/server.js"] diff --git a/apps/desktop/README.md b/apps/desktop/README.md new file mode 100644 index 0000000..f7afa97 --- /dev/null +++ b/apps/desktop/README.md @@ -0,0 +1,57 @@ +# @verric/desktop — Tauri desktop app + +A native desktop shell (Tauri 2) around the Verric studio. It's a **thin client over a running Verric server**: start the server (Docker or `pnpm --filter @verric/web dev`/`start`), launch the desktop app, and it opens the studio at `http://localhost:3000` in a native window. + +This matches Verric's local-first model — the engine, DB, and `/api/*` routes run in the self-hosted server; the desktop app is just native chrome (and a shorter onramp than "install Docker"). + +## Why a thin client (not a bundled SPA) + +The studio is a Next.js **server** app (SSR + `/api` routes + SQLite), not a static SPA, so it can't be frozen into static files inside the bundle. The desktop app therefore points its webview at the local server (`frontendDist`/`devUrl` = `http://localhost:3000`). Run the server alongside it. + +## Prerequisites + +- **Rust + cargo** — `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y` (user-local, no sudo) +- **System WebView/GTK libs** (Linux): `webkit2gtk-4.1`, `gtk3`, `libsoup-3`. On Arch/CachyOS: `sudo pacman -S webkit2gtk-4.1 gtk3 libsoup3`. On Debian/Ubuntu: `sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libsoup-3.0-dev`. (macOS/Windows ship their own WebView.) +- Node 22+ and pnpm 11+ (already required by the workspace) + +## Develop + +```bash +pnpm --filter @verric/desktop dev +``` + +Runs `pnpm --filter @verric/web dev` (via `beforeDevCommand`) and opens the Tauri window against it. + +## Build native installers + +```bash +# Linux .deb +pnpm --filter @verric/desktop tauri:build -- --bundles deb + +# Linux AppImage (portable). In sandboxes without FUSE, prefix with the +# extract-and-run flag so the bundler tooling doesn't need to FUSE-mount: +APPIMAGE_EXTRACT_AND_RUN=1 pnpm --filter @verric/desktop tauri:build -- --bundles appimage + +# Windows (.msi) — run on Windows; macOS (.dmg/.app) — run on macOS +pnpm --filter @verric/desktop tauri:build +``` + +Outputs land under `apps/desktop/src-tauri/target/release/bundle/`. + +### Verified builds + +This scaffold has been built end-to-end on Linux (CachyOS, Rust 1.96, webkit2gtk-4.1): + +- `bundle/deb/Verric_0.1.0_amd64.deb` (~2.8 MB) +- `bundle/appimage/Verric_0.1.0_amd64.AppImage` (~101 MB — bundles WebKit + GTK) +- native binary `target/release/verric-desktop` (~9 MB ELF) + +> The workspace `pnpm build` does **not** compile the desktop app (it no-ops with a message), so CI stays fast and doesn't require a Rust toolchain on every builder. Use `tauri:build` explicitly on a host with `cargo`. + +## Icons + +`src-tauri/icons/` holds the generated icon set (committed). Regenerate from a 1024×1024 source PNG with: + +```bash +pnpm --filter @verric/desktop exec tauri icon ./path/to/source.png +``` diff --git a/apps/desktop/package.json b/apps/desktop/package.json new file mode 100644 index 0000000..17bea35 --- /dev/null +++ b/apps/desktop/package.json @@ -0,0 +1,17 @@ +{ + "name": "@verric/desktop", + "version": "0.1.0", + "description": "Tauri desktop wrapper around the Verric studio. Cross-OS installers for Windows / macOS / Linux.", + "private": true, + "license": "MIT", + "type": "module", + "scripts": { + "build": "node -e \"console.log('@verric/desktop: skipping native bundle (requires Rust + tauri-cli). Run \\\\`pnpm --filter @verric/desktop tauri:build\\\\` from a host with cargo to ship platform installers.')\"", + "dev": "tauri dev", + "tauri:build": "tauri build", + "tauri": "tauri" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.1.0" + } +} diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock new file mode 100644 index 0000000..65f8e26 --- /dev/null +++ b/apps/desktop/src-tauri/Cargo.lock @@ -0,0 +1,4568 @@ +# 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 = "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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +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 = "brotli" +version = "8.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8119e4516436f5708bbc474a9d395bf12f1b5395e93a92a56e647ac3388c8610" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5962523e1b92ce1b5e793d9169b9943eece10d39f62550bc04bb605d75b94924" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[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.13.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.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +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.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[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.13.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.13.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.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[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 = "dbus" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b942602992bb7acfd1f51c49811c58a610ef9181b6e66f3e519d79b540a3bf73" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[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 = "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.13.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +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", + "foldhash 0.2.0", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[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 = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.2+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 = "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 = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[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 = "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-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 = "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.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[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.13.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.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[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 = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +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 = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "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 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +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.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.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 = "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.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" +dependencies = [ + "cfg-if", + "futures-util", + "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.13.0", + "serde", + "unicode-segmentation", +] + +[[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.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a2e3dff89cd322c66647942668faee0a2b1f88ea6cbb4d374b4a8d7e92528c" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[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 = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[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.13.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "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.13.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.13.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[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.13.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.13.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.13.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.13.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "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.13.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 = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[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_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 = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plist" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.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 = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[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.12+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-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.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +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 = "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.13.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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +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 = "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 = "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.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.0", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +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.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +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.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 = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "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", + "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.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "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.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437404997acf375d85f1177afa7e11bb971f274ed6a7b83a2a3e339015f4cc28" +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.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa1f9055fc23919a54e4e125052bed16ed04aef0487086e758fe01a67b451c7" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a0319528a025a38c4078e7dae2c446f4e63620ddb0659a643ede1cb38f90e9" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "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.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae6cb4e3896c21d2f6da5b31251d2faea0153bba56ed0e970f918115dbee4924" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48222d7116c8807eaa6fe2f372e023fae125084e61e6eca6d70b7961cdf129ef" +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.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b83849ee63ecb27a8e8d0fe51915ca215076914aca43f96db1179f0f415f6cd9" +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.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092379df9a707631978e6c56b1bc2401d387f01e2d4a3c123360d167bbb9aa95" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 1.1.2+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.2+spec-1.1.0", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[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.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + +[[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.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +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.14.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.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.0", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[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-core", +] + +[[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.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15edbb0d80583e85ee8df283410038e17314df5cba30da2087a54a85216c0773" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.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.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "verric-desktop" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", +] + +[[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.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[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 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" +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.14.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.13.0", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[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.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", + "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-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_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_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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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_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_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_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 = "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" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +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" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[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.14.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.13.0", + "indexmap 2.14.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.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +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" diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml new file mode 100644 index 0000000..85d46f5 --- /dev/null +++ b/apps/desktop/src-tauri/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "verric-desktop" +version = "0.1.0" +description = "Verric Studio — desktop wrapper" +authors = ["Verric"] +edition = "2021" +license = "MIT" + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/apps/desktop/src-tauri/build.rs b/apps/desktop/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/apps/desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf6dce052c8a788f8da796beff6338fec03292d GIT binary patch literal 1833 zcmah~c{J3I7XMnOMvR0=VI(nR3u$P`67%c#vlo(mtI;E-VV*5QzmPDL97`(Mvh?sm zhQXl8HX_^PH$ySgkYyM%8Dl)1-+Ax6Ki==Wd(OT0oX@%E+=Ek(ar=N|X}YEPv1@eNpAQLZO*6x3MNH2M z7tto6jFQ5&7F1ra$@gqQB5!N?T*rmnV-E1yFW+gdd0A5r*h(4v#D*L9vsdV!6|}Cn zjvmQ#uOSn{H&?{9?q)%*b4Gkov?XtPpf2B2cC|eVp(n|T(Ky>Vff`b1uwa)ue5i!7LbRF@R?|l!WW;?H~b-0m&I_A=N;vZ%+q@on;W~qbcDi|NIX-m-KToC3P70 zx(z$xn;h)GJM*SJJKrEj3?P!mkHixqcFoR3)bU$=)JK=u zeC+#$UgskpA-LhD?MPFpO^KY-HFJg7)5;kI-F(WPZPG<@!JdL)tP<{E6}Iu_3sOwL z9*3wVR5#2i8t$)!CY&1j>Ys>I&4J(B3XdQi6mJqK*{4Ewbjpwp`o%Ai_4rdnuPe)h zVO(9@jTF0yiu#hD&Tfa!Tc2t$$33Dl3TIdUwiUZOvec1T$dFaOs>d%D zolr0Br;cF819FvRqgs1nTq-gB3iN{LXjSWEY=TWU4i#8S0PC8$N-_0uQ>_0;_PazenVto8DFf?-}xjE&*oiTsm*{=;7WOhLt!wFV1Cz}pEZM&Z}h z)Ve}?I@$3Cdt7dIb?f(Jr{BY{fE!L%8#Qrtt1#(8~0s4!)u&eisnQZAu)Kz zMBI`AAW*4ot5OE48G`$CTIN0B!ROvJvO@OPeLux>4Jj`hBj=_bOx5olm-ji=Y#$sH zztJHUgA5>)qOyD^${9b(v_DPtl?{^)=SEY{G@EH}!q3k!t?Wf}L2kmp2r!Lqd&Z8w zyn5>gPX=tg=&tUQ$$+KqRE;ye8PNG+2cqRe6IfjU%L6Y@?u!FUw}zl^IogCk-8C&S zW$}H_ntzXLsrAT4-w73Rq7`hR}&E znhxpJyVd4*nzsIGZATe|IRJ z0A}(|E1tBz9XUA37-4Dk%BSd)8!FJBW2TL@ zGl0JF>mTxXYTOw#PPt(*Ro5L$_6p9%Jc(nV1qj1*T9tFYqqtXH|3el}#BoXAV%<>E zbUlqWW+xZ${x~>{hj)5o>EoS4NhEDt(H-Y18C;cYYpNPalkGq^vS8V8&^CMQ=M(Xb zI%*M?G8PGnjq)a_Oh!=WPy%C5(#f#%l)(;KRA}VO+johfm_3oX$yAn#yjB{pFGyPl Kn|dq1d;bFQ;#pk) literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/128x128@2x.png b/apps/desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90a83f70a17c96091062bc9e9e8cc9f84cb38cee GIT binary patch literal 4188 zcmbtXXHe7IxBZ3CG&BVPX^GPGs&G*$N=X!?N>LP~B`8W)dJT|(MlK>Ca4#rcn$naK zKm@5ly7b-&5HCsSLP85EkN>={@6Eh<_tQSJXV2_8d#!WU+HqDEMuNwsjspN7Xku(| z7XUyU#=X$#^*NK*GPbgvTO9QL_2sOwcU#Am3{UvMEJQ@U zwDT*RbF@n+cATMwwA~ogtifo+uzGuf2`ut4kQ6tSYKS-EZh!-rVV9I<&!+J8qkjltL89 z?>^yhQw8|=oxWK7zj!h(Xd_bo6FTahYxz?(gOj;Sl^QgeC> zx@V~8o}lY2#c_aoIvqE0&xo>UwT8@K2`z_Jv{F8O*0s%s_m`1T`2&a9S?`=e%YUi+ zA^D!w^EUSwG9z1C>rzjTkJJ)*t zP|;%JeHKz@Br!4Pe!KVt1QXG)J)Lqs5@~d3Y1EN;P;%@LRTDT-E zl*X+0L&LDUKQ`i$Emt1B6epBYWwLFclcZ14WhdJDYfqKpe@+WBzt!^2$N~u(kN3)k zMC+PEk_fXKojR_~X=Yv*)>60nSgzz6 zuAL?%IlE8YnUJaemJTV$Vla$lSRb6==+mwvrm;=!LiNFgb96sXAN#Y#@T@YsI)I|` z_p~wpWP%tcD^uTRoP_z4#CN?w%u{vLxu|{4<+;y~c*5vsp`1I+leaK~?M>e!Dv}QL z2EPYINBH?pO?cL1Wun48bu+Pc12HJ#F1+B=71J%SlQ>u1bE`tIQQ-AoYxWYn>r$wd zVjK@4qTg~0Jf|q6e%kZOD7CAr%itkxu7Im~6yDj@@ju*?Dr{72B;XbWsJ*Za}t5AH&kG8q7^#Y{hQP z_s&GUf>O6d23eu%F6+srwRC*`l9}bHvPLS)fJU^3gfIDi>*Z# za;Z}9E&RA(&eMCUfLqV8S3Yg!OL$~T3CbedrUVcXV0r5f#{|Z_$#~i0ul)oYsPYG@uK)wkx?pJqkNt#MUVr+NmKJfO9s={Shs+`49P zCIAdCL1H{A4lREy^~AsHP;A(JokT1s#`$#nOy2+i-Mv@X3A4B<>DJPNmFzFLL&>OK z?=5paz&K&$a@P<=zQV9Qg3VyGWmo}ug#s8)T^(&9AU7D z@W(n~5Cc8}{<-7n;xCh~8lr#ptxpNYdvKzO*}QLkFAUG*N2MewwcMF!%;3OOom67F zJRu}Qao_kb?4({F8~281G%qvGW>y%Ll8ra zr)t+Fm;;KuKza#9K;;2|>pxn91pov9z>bs#0Qdob`~R7ya(fAe+)dwTTx|@wpG{u?R3M61CZMvGWB$Z9aQX z@?eDI#_hS8TQgNr_*40RoiZ0z|6c;|e@5|NL;deN!IT>8)EMMTu^&rgkx8|AJ~9xl zoVf@ark)=uO`JAxEz!(Dw7H;DPlwloKUC-#Xt0`+rFS4Mk?&7^)3DfPqL#dLY%=;t z0WqNhv)!-W=AKDBDq^^01|UyT6pkSOuz2Eh)6Ti}`R^k9?NGV+yt^h)X)^Z_Q_!3v zp2hKYJPy3AFl^E6CCN|YB$~IkbU|Oib(9t>&LkYers>XnIG3UB+dde?5l+U zt{mLDl05uhysZCm+^}*6SxW$cGA-F_>h=Q|mPL`pHFYSDSw~p}YBY*bJl-@WOcCJY zre08rj}9w_{w?7`1+Y;oKxGEpr!hHQOAY}I1{or&I(p!CV1VH(i10#b1GEWJ6@bXT zc=T^Ln9Sxi$-oY>0HAT8Kz(yI&&j0s3L|D=+1niJ0SvCLW9(OnoRECitO^JO@@4wO zZL$-no-3M2uC&)owLhdh-95cm{_u3kt2y=?#P`|i<6s4clLB9Tc5lD7u=nyAy%r%F}#i_Cxm zBB;$y)OkZQA^kW&w>ffwJb?tqCaJghq-~RZ#orW_MK{T-m@YMNp6xEXGq+klLBfkD z&S_a5kr?ol_Ra3A=24Q-M1=nwM%jF(~zdt}pFYJS6 z!s(iIWi|I`WBOmd^l(&=kkO`y_?)(7)URz;1Ek20iG5n?`lS>z-xCj4Dce#{+E~8+ zy{)ay_~Mv#M@Hmz#f4KKMD=C|bd$N9@uyH@SI+n!$9f8~l@O zWw!ezjG8K&<1nj<4<=xbyfC49d^VRBE2Vh?RBgM8Uk$AYU~9U$lHtEh_kggmapLGd z-=4`lc$TFJPO%Gikc*XP;g2K4y|@Gc)P zoDd(CZ}lUsNUrF@ zE(t*)GnczIQ>W_(`Y*Arsj}54{t2(yC!Zmtd2+78^1=(_23?5-z~Tita*N1*4j)hEhoO=CH4TDXA3oV zNO>Fo3aA{452OBuao-H`!qW(2e(bFBTX5Bgnklorr%xVgOuw1?DW5%D#i)J;C2m$~ z3r}oA-@<@#oBd_>dtWtS*`31H^Nnt9s?4I=@y8JR{Zeo1o662D2jJ(eAC)6gsGBSY zb^dPlHUlfd-F#u(>KwD{rCBJNQ1X!-B5KW`)=t&J$5y>A;3uX&-}F`(Z8KO>w=qQx z!nDOt*N+rVKrJ`57ak}Bd3PWW{Zz#shdQCq*u&3y?Ea%=XVfN%vCfZW5M;+NRMyd6 z<_R8B%lt8$@5QZ&lNNgta^6D*ur}7pNuN1n%<2a2YZUVwD`n4{e|v^;)V`+M7+PSp zZ&Iu>GN1UUIB7e9KCP{`8`Ws`-DrovI-|>lHyd#3e`b|N@R5Oy&;w2iO{&}?GWBE^ zhLy|J60GShhH|X^Xy1C3M*jhQ96k;*cf-tRIXKMDNJK{G+)_Sn(c$)EA5Egn80XMD z+;^8E0Xr{aG2mocUOEb4Em^uiyV3Tl!@8enhx2Gr-K$rx?iDf(GlvsT5K=*d%*tGk ztdSR)xTVQ?*f_C7;xZr{-nS_Vy8K69SpkW_o_Slyizq-v}C4fL^)$?JGa z8pr(-yzt>KiS;dITTk-6rU1)~S45xop77NjxLI0d`*Ae*$X)<|$t??mvYXB^{{;ru BxUc{K literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/32x32.png b/apps/desktop/src-tauri/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d7351ab40091e76ef2b454886757433342663852 GIT binary patch literal 629 zcmV-*0*d{KP)1gh5T04DW8YaJ!inMn3fB~f0wqGc00kXy!7I@61iV7J)Ip+50YpJ5B8t=rQVK%s zh(!L0ec8=?=RG47al1yobCZ$QKAmU%eKR{dKbnZNtfbj&KGK}LC*s%4v?}kI<}21( z>d4o}#Oin5Zub<}DaiW6#Q}G_Qt+CySUn8SYB1hkpmw)k8nZw zur3i2Rgf4P{iL!SS3fAFHXV4iKyY&ZU6C~wgJY(fCa(I~RW74%6 zO#GL-D7n6-R=Z6kdv-s6rA8c+`Ckv<%;9!e4)C*+lOO_+emhF{`r;-y2mzcfIa_aF ziJtGMW+LDs>yPC*9{5Xdt^^8_djj_a^bD=cWM$7Gdh;THREh+XB^h5L!U`!wUIM6U zC@jeBX?k@@CL|SO5B9RB+UF8LNkvsdVL@(3dYz>hVXyHdC2p;)SYJ6F4u^{=$5}Iv zl8UOfkcK34t10LjD%YVdO01fUOVd`FN^Hw9*cLPqQ-Oi*p~79&H2UeBY683Aq^mjzZ#CS P00000NkvXXu0mjffNdZ> literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/64x64.png b/apps/desktop/src-tauri/icons/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..486740f7ada5f3204043299e7bdd3f140dea07b4 GIT binary patch literal 888 zcmV-;1Bd*HP)F6Eu*^a@5TP$b>MeH$Zzhw;%pNB{O!-Dy`X_Bijz7+?pSfqxJYwQ4ycQ8v zMAEu%#HoWHL%KX9HW2fmSpRIs72(3&m`*1FS^bpDwT`gwNpjfu8w&YOmL{=ey9 ziC`nLr#r)odbp-{>}^^rS1mPQPtfG}GS4l-&M5Q1p7;(= z)v(T=HVyE!k<_TYt-?BqYPm%MA_0+r@Ry&}*Kb)(0`fd}-9^<6Ju|N+0sVeoQK#Cf zDp{uH^ZDu!fUt+>0si%?mulQ!b3ZV2Iw0(Oy`Gw;Kh^C!cU79EN^5=UbVx!q)$lyP zFP=S7>Cus59rn7)SdwWpQsc)@izu7TRxbtMd4R8q0LOK}@UNr_0Js}T_zH{94V_v^ z)z_P$X8za+MFJuLk$^}*Bp?zH35Wzl0wMvCfJi_jAQBJ>hy>Jv0HSsgfF)`yUX}}( zD)6ExM(CS1gA#ysdn{cmzknHv&szY=j~Kk$`p^7XqW!TE!sNu31!NkX;#mK|y{^4#Z zC6)2|=mP|kPBzz2<(L$TF{>SvkJH1WYry_T5o#5c+YlAv4VI-v!zM)tCp~xwCkNZ* zG{7FHhLRGBO0WZkCGtcS`r5pvB~r@Y@9y5?!t+b2QSIh~D4uS)eEv6)G?CcfdEvzX O0000< literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square107x107Logo.png b/apps/desktop/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..80ee80f9c38fe70c8de80829afd1b4487281b829 GIT binary patch literal 1703 zcmbuASvVVr0)?YmC2fjYng-Px3~h*YL@|o`)S4pH5)*`2lZsj|q8OugLh2%RK}*Ug zZZe&gipt!Qq*EIEQl%=YDVo@s&V2JUuk&#J^KhQd%Q@LMUF<+W2oL}Ofb4Hvcl+uQ ze@ar~E2DaoPXhoFc>C*C$b`wYDnumGLw=C^bc=o3(8&G2bs7>H>cjnXBZ!k;Tg%{$ zX}Z;=L3$d^Y^I1F6_Wlbs!+lNJOh57uXbvHodðm8qpN~JBL^|MrEbI88 zpA}6Fa0MeqsR!B6D#pa8{l0b~Q(wx`%~V9Z$RkPh{s_q*EFd`)Zj5B?KT>4=pL-n6 zd+;PsbN=2lF#Jya3?A)!UT`u~qbp0N-XX;IKs=i7he1vpRpk|d1h=9_ca?iS){)PZ z*!$Hy9%TuAt1wROWvl}$|HOVdUzX@H4FPG0_g+;ol57tfIJ6v+I7jaCJk937anfwg ztZ6DNt2`;KB9d2V&^Y3-q7&I@1qhn2&ni=}G1owVx_KaHew9ymG=^9gub+z3@wzZ7 z!X8*O2-jaJQ=eDd{SsPdPcdd4^t}&fu=+T(<5Eih`NIpm<81LpAeK}JG6HQU)EJw>&voY z%NH~sSjJ%ghl1}RSr&43i|HmPJ29lW$HFzbWX&{QW5pV1d*X60J?L0j#;kiu{w|UF z#=Eii!^m4Ad$t0olBY<>eq6ehoKR}B7f>J+_SwAX_FHJT$j-CN3^>!5BY%IHNg42V zhDWGV-Z=G3!sL(omNdUK70SS3uH+X1PIX-DI|h~fo3%&hq1AE52G2Wrc$C-c%IUQ@ zI|)y!o3{_Dqt0KdC7R(xQ)~y55Rt>Ju3#DNPIK$6qgrAw8r;#?GWu=7*_(63P2-ht zGFN>aGe!_zG5f)sxooIR^7E=KLnr3z`u*b6?L#Xn^@@Znrg~jt6N#ix`x}Pklh~J7 z94k=EIV`?7>Ff3IZR^%$Rbt66)Z(^e7s0t3Z_ChYa3UR~!+Wj6EG z)Ab_+T4Ll;7IiV_q-P5f)NG+(Rar5h7ry3R1JAKy+@p}$y9lNm>V%h!znJ3jf5n?l z9TcTyS5EUj*35OoXVR6;wx3 z3du(oV;^t6+iXlvQvf>lj2Bn=2K^O_RIteBmFW-GrUw0rlT6m8cjQI*92L(qZDXsl zakfgCM!y}=BYkYgZ$}wDw2B~1>7wMt|54&qN@D}qBZK!%Gs7@emH-xW8@3<(efhq` z?OH8U*B%8CWm;_C;e+U8+l_$4?}zOvv0@yEREXa^A@-`$dyCKk4UXEYO#(k}vG=v; z{dO?bV<?m*-!-XY^wl42w{WQgb|~RfB5mpjm#Adh zI+GC%(vig*LChR3Tl6F5=Ht6Jq;@%PAr%+=@kegM%Fd45A7gH8uTCqhADVP*V1_$$ zmtF_mNmfO-Ij^fGr=gejXznG5AUWl@c7n}?d5=-i-JsG8Gw$skv$-s6=6yyO8*ykU Y9)|BJIr|O$>j44mZC$QEvi48^1Kk-g&;S4c literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square142x142Logo.png b/apps/desktop/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..80203f54dfcc797b488ebc419c3f6f161753a702 GIT binary patch literal 2216 zcmZvec{~%0AIFz?965#_9VJdc%IOUjdW|D-IDdbWxr8vAiD4A9lLB&OlQL?G;Xo5LPHv?^umVdQA`cZY5ynWeOtX zx#70Xf$-eQDvsMc51yMYr*4%7ZYp3S7HDF*7xwM8yR>jglf*vPWzBt?7 z@?>QyR1?U$=zDT!0@h$VZUjZb`(lvW$Tzf8B`B2cH%Py37u7Z0D=Y7CrGbeowd;?; zHdZz86wB+6dF!Q97%?4{9<|h|3n1<}Phc;o(2fY_ba|2BbVo0O# zXs8}2(-u6GkOz_P%?uQ8mfJMvzKDmqAm>x0PChN%&(ea=h_Lt96`xK+z@iE*(+P>k zTM}u0%$qByys*DtAS-+CQA>A9fS3T!m>$2&aq9UwU}UQqz9QaTDq|*gZcS`n!)45< zZV6x7G|(Yz^HnXJ(^D_bZK@AslaBrR1asmObxpqyJFuvD(Mg(Y3J^C8iPS&@wU;WN zVcz|rwn!y%J*zl-AuU*wt?h^sA-@YZEcUXtLUJ~8Q<|R-{67j9FkZJ%q^qwf5s-Rv zPMM=m5Xh+~0l)y-jsQ6U_@k2iky?P+!{le-U*#hkWGM{DFys&vR>^v>-`=BM}#A>wcEeGt;4E?_>*=%bl-f=#B7_RlF`M04SmH zX3~}R3cdZ*09^l%;E=^nCcl(lw0>gyMeC>Xo8w{fdx#`I;5Xs_9Ae)($Hj7k!DVTW zn>KtJMVjRCl{JfE>EAIilYUis&cbbW`IYkThA7#>6RTF5qj{Pe&UDjW-drX5{W~s6g^zwk+C{}1$X!pwgNXVz*R>y~iD<=|6 zv}jFd7=A%QSFe)pRNM1lQvG85itNio*q3!Y_tOxs1~cZ}<_aukBz|4=pL_p2@pEUc z`BH`Rk*c`bH^I007XZ(jaDo0dABQX#4iG7k!{l7L!H7avI~lD^jnQ%m#0>ozXd=y@ zZP0e)i?M``Tu@BE=4pXG=Q|c3N`vTl*$d;9ey0U1cunQI*xC_g3Sse=wZiuv1Ymfe>Bk_14ub*y1Z-6XZyOm-RncFkEiaknyJ|8bR5 zb{k#MSS-r8AoqlF;&VthpZ!`yI>Xl0w=0hfP$H6qG_~JZlV5fY<)|~<6FZ%1PT33B z#F7wpQ5}uvrO;uj7&QIm=x&b%=8eBw!Ff_9C0p*yRoA@u#laOBjoC=(B~k0FY3Em( zC`S2ci?Gm-hc_yx^St=i?CxTkRhdZxvUQ^96eo0zT2P}+nInTdsf64xj*ik_?ytke z^^hpE-DqJJ@o0#!F%A@do64`-^0C`6_E|Mn-Tg`NgS=HW&-fBN6d^BP%yd|7FATLJ z>uNw@;qMy1y`@A^1Rqs03Si~@$F*nPLjWpIfOXgL^m!b1o=0!QxTx*B$=1@8%rX%17w2i+?VP602V+1k;4@sssj2()xd}2vU%408G?s}ApC7y>m-wh{LNT^h4 zPoNmZgZSiQZ<4iq#@;N6P)j!-*}Ik?^ literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square150x150Logo.png b/apps/desktop/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..393494df55f3edad4bbbe70699a30ae5cd4cbce9 GIT binary patch literal 2374 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 Oprxj#TA}>t`M&`HL2kkT literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square30x30Logo.png b/apps/desktop/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60f4630a00c460ebe0cc1597e8027da98e1f4605 GIT binary patch literal 580 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 QIsgCw07*qoM6N<$f=)+T00000 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square71x71Logo.png b/apps/desktop/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..caa1d95e52f6c68449cbd969d9b9c20cf6651f0b GIT binary patch literal 1046 zcmV+x1nK*UP)6Ki18pVpa(tr1fIO9iTVOwOf=yQycmxpBp?v4 z5(GCyklkgM>9+neJxE|NF`-wNsY)i9%x1T@ep6lDJvIH0>9|F5Bsduw8ai*1`W-Uv zrX!jr$D_>DMQv)%(H^l|XQFwsJh#vByK=d_bJXwL_{jHTIrecfQtE#!KlF&%T*`mh zQTto!Ftc~buE`C5_O1Nm=~4fW!bv|UmHH+k=J$~?Qw~7f0Zr2cW?Kf39M&@uSD6xP zmlEf0OAxIb2E>QK3=i~OCu2Ss!=2W-I%n4non4cAPYuK3uXS~@_QuB6&ZnFQ=Y1`W z7%~gSP^WyOA=f&nIM$E=>adpT3E68tf+CYAA#^1~OaZ~bI^Z|_2M2#GiSpzdMdqIG zN}W_pi=>OyCD)Fg>+Y)VR`)(~N%~XFjb%wpV}3wlDy}){UMvIAn&qwu6TAHx8Lr3t zs8nPy=>P=|;DPy_!32-gj+<~X+056`86UF$3X7lcP8%!1tm1%=~UxPr~wVdnoI4#2#A^@7I7FH^NzBg5ek$s-o(>FK7` z)h~4a!NXGr6oBr~8N)fGIC5 zP~6)a49#0T>+4+S6xavWEz0CsfysgFe?sVg{H1k#q37A)-=; za)qOC6pq4CI0{GMC>({Orf?LF!cjO1N8u({Oa1@ThQKJ*~qd~$zt*Nww@!AggWK#{>(6TLQ z>n0Vw$fn*_xnxT=%4YcU25KP6qZuNe<5UL5?XBp(a*u?Ohuv4%S3YSrH#dJmCIyQ{ zh+Y&r*+AR_DaP@0a5;#Q;lT@whErLXB5GMsCicM{*4d?v@7q`Nz2vE$1@vPelL9pm zDqaM66%BA1tm^pQA9rmGASSk(Tf6%V0eI=`U}6|{~>{)Bv&DT(ohUx9q7kM zXe~w}mxAQv;U#Bi9^`VLFk(lkkdi1biQk8Xg>n(E-{ZS{P_5QCcPo1@d%C+SlA@xMzOS*1ApXz+KIFDWTU)2D}I;%q}fHy)ZU_`G2@KARYbM7U*-k9YZ6&b QEdT%j07*qoM6N<$f(G;KzW@LL literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square89x89Logo.png b/apps/desktop/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6e641b8bfe1821689e1e893b2a90c90ef9bc73 GIT binary patch literal 1235 zcmV;^1T6cBP)aE z6lK9CD9H;%atv5F#FNQPcjf%m)uXntWjyK&9{;~o#_Ws-nwAl&p=@ZjmS|j(YwOxIulEO!V z+A7b+8WW{y`X+U9EkyMe&}KW}*;CWkjj=yy=;G}f=wmIi+*1PsP8!+Hr8ibzY}_q^ zHrpdOitJB?)WGQ7UsU@Pk|gO@#fUbc7m*?d$I|*kH|jb99vid*jWkH#3}x_9$k8_M zrYX_Z9pvDUA_#aqMc@aH;5q7$;I@z^7{O&lw4My}v|+>9ah_btSI*VwNba0O@w1Sm zsd6=xWcaDoq4GCjB$tp$=_w<|RD|A`%XtxTz;t074$QW;6GR(}zx-FyCc%qT}6_?&F~%Rq`i1OxDq1|dT@ z4jfNi)9AH#;Q-eIZUC|i`)5Cy{bY)e37L>7LMCL2kO`TPDMBV>ijWDJkSRhYWJ0D0 znUE<$CS*dU2$_&6LMCKFrrvYNsH{Y5qS`*+_XI-D>VQ$#7>o|@dh#?*v0tIoj>( z1goqS#+y{R<9CeU*Q|OO{T`fO2)Sg);0muOy+q+2Fp?{bWHsYb$jO2?i=r!olx~ON zO}LT;ySo0*bGUJZl)>+{m(sq^9z1F> x?YBI)U;0+>?pwWvxgI|ik@;3Xe;42C{{hORB+@qYP@Vt)002ovPDHLkV1k+MW?29L literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/StoreLogo.png b/apps/desktop/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..24bb25a3701953c32080343ba90ec8e8d597ce92 GIT binary patch literal 801 zcmV++1K#|JP)fLKoMcG%h7yBLs=*o(|L%{Br;o*+{Oik%rD46IYTUohu6DfHv5I60w392NBR$WE3OPFmB2H)T3 zx?@hYdS&sh5TfePk`#nS!|GC-7(RDy`^Jf%ehks5V^1sQh{P^p;7xRY<4QX2u*|y9_mO= zu`V_+KoGRLV_Uj;B3Kajup|Qo_yb771(671QieF+M5kx!*@JMl7#|-4mALpXPOkry z`C6@5Pt62`A?Bon*2V@T^}2qqO5_aE$_vQGW7yx@gVQwif{{M%#Fk))*Uz59xc32I ze$Fnm{g$)mBT5oIjF5Te=C6@h20Braj-v8;>EJZqtKC$aWOY*D1^iDD`4yNu^COjSs;2jTLRD?2WVilumo!ivW-W6lzUHww7M z=JJ#)yYnh_vz=FFY_DPTZan#JKCHJ|mDzmo0?A=cCX=wYgYx@%yxRexZ_t&!aGXaj zI*2GW3spx**p7nYK6Y>b?qMWMTZBz{L4sJ_sVBI%BTqsBf+)M^iCxp8vAVq2*Y~S8 z1H0Fraw~@-wRGI3ufKgN@f^#%D>pMHbeBG5(=R;$a&h~PFSh1s3K@Y|c|HmAQeo?X)?T&`f_ f*$Zc(A{2fCwB|j9-d8gX00000NkvXXu0mjf3xjq~ literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..69e4af1aa46078b4771c726211769dc079abad94 GIT binary patch literal 875 zcmV-x1C;!UP)Wab6n^t#J84xKA<~vLY>>DBV%=3QQ1t*vWx)ly<^Zs%-~jXlUG)O&K}bl2eJQjK zRckx8XP9s7uxOGdaZ=k9M;gUZ=Goup_die49r(zGL_?xP5*usx_moO@7|~-Q=9ULd z_chTmXYwFQ)VuR@|8(3=Htvtkz2(ie=j?sU37x_ zVM2Pal$uV??6q{!WiO~!6WG$a}l{}BmYvfQoo6R3q)zNV7N_gXo|sw9!s zPN+sv%nfRxS!yT9LB8_Z3FWk{M)O)|)++YQ$X8N3*`r0%k)feMKY((&NI!9w_Y=4e z?pL&q8lu1cU{%l3*=ZqdKQK>c$7by8PJZ^-;v5?XzNRBXLo-j0%_{A&%?B+dI4S5(JAK`Atc@|YQL$B=Q$l#kuf^+#HxAC}UBx0MN48DmZqFBAh zM8;ftluc-;CX*r$xPWgcLJsW?!z(Gp7tfX3hPjtdjQ9fk`dMdo@PQU)c0m~L_`Qoy z6G>PiQT$y9@zIsyxiPFRTSTc@tU|_frJbIFKsIy~*K32ZsS-pSuXSLw(o;I!Fn3!; z{aNlDTYoh^@Fq(1%UlC^etKI+KTWc0NZb_?e*lq2gxIS=lgt1B002ovPDHLkV1f{n BlU4u# literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..00d6db3ebbc1551a516b154f106408c919319321 GIT binary patch literal 2565 zcmbtWYd8}O8&*0YUgtyR(5#TdiXrw!7&Eljp~#$#hIpMKV!Ymlv7&4y$ED;fQ>djJ zX9#mxhMdZh95NwlF`xJQ|6Sj8eczAgdF~(2b^myt`?>BX-2n*~6+R&>ARr)$uz@-4 z*GK=vu_ODrV_jBJKtQM;0W-fG`~GXuo2biUGHrvju&&@!+E$V_r4IKY$#1|B8hS=>KFlYdiC6?w9GF$}6EcOA#Qt6a6h(ni&wpU|#_j}r#3<-gcx@2J`2nUG@lR75N>jMk!`%S0G_x^3_< zZSLd87M0){ZWT*zxrAq4EC9`d7->75qx?wv(LrBoq<`0_|`P#Ec zd3WxQnAFFyhFWmNTwmgLd=mS*}YZ+8j`nhk5v z+QUT~@cHz{g+knDj9awMfF7iv;T{|QM2$&KQ2rcyQA-Xpfy(XlUF8aN8mj6581)|C zE(T`9yW(LuHvR$42=z>PQ-CmAk`o&BQW!6id!QsJm25chC@1@wvH~g$oqno>s^j4= zuGn-Ke++-@FZ^G4f&UC@LCxU8)iw8Y-W)#-KYnI)wiO%!u#2#KTLgeT$ZOnbt*6mVXm)GLwkLOWI&zn{u+E-bC~agdt1tI=l|H|41DX9Z zZqYc_#yYDtzwttaK{C0P-ek}n1cC@*(+Cf&+o*Mjg-@Nw z0|kKxRe`EN0pP*^6Z{V>PgCR~kPXu5u=|1KltyZnuXiYgg@w~YfhFe=pBDmxBK0Pn z2+;SPs=ni6)Ir}_s5zra*3kfZ*z4Mpg%2kc;x-yy+FF4SCQ#t3mAi6V#w*Q(S%-m5 zXJl`I-!$KJclIFf4<|!8X}al%5cEw16P3JAwHpxef?W{RM9VmDfL6lSd1(Ka5V5+K0W{WDR`9Vb?F27Z*8E_DfAKKYh{LRS;jw@tfXr#<-zAV~h6J<#{6d2P7=$N}w9`TjZ zr2F#pgoD^c{d&_3Z@r`7=5Lh~N$yQQt|T_%aA?6xz~PmAO{3elgQPdlbpvUT_M*gc|pmwr^TKgURbs7_Yf6( zbxV4)H!d~eV*dFM)(4N$t`9M>hOf)HWzH{VEv{LBPc%`9bCQ&)szhj%>TH?S_e&_T z&yp9Mcg}W;G}+R%<=LKE0lNWl6(DT|g{8e_6YMz^_fjtjLt?&FXZ9aE>KrK+Sccha zJ5cAnUY<<{&r3=w`0A_qYQB^K5M_kXD!lfk{{FG0`BL;>iiU3V4JP;5Ep5`SJvKmr9A6#^z`O{GG;-R&z|(;*M**+5m(ZzNMUHm zmveAHyRDUNvQ)7;_G3IuZeX74i9}?57dMC81-dEDB8PB%M^W+W@7NY3ndmp+7skUCM?FL T$4~FScLE42B^^{G$s(wb88T&moeYFM zxINV~nI=hJ@>|{Y^;ey$uR0kWz{pM@0>-n+Q^n)YyIhFk^QEdroez#;KpO`%D&P8z zVEaMOVp9F8s;E>ZIb$0RXI8IkDp+Y$!^kh1v^=cJ#(Bb6SXhgpk3;+85 zJqKdJ7U2q7>402h-9)#a9n$5D_Jg?|cr%+uC?_}YY2RI0urDE?WnUF49CnqL`&J%;$ zcaG=q_KCIIPPvovjrkT`|LaQ(mbOCn#+H9cg`_8$KwPc9P^RCx8-plxd`dh@QQPAP|2UeU&T;HF?cK`qY M07*qoM6N<$g5$P5j{pDw literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..939563342947d0d023ed917edb6decfbb2a41eb7 GIT binary patch literal 861 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 G=6?V=w+?Us literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7006ce9e70462c9237c5096faf03fc2fca9a53 GIT binary patch literal 603 zcmV-h0;K(kP)G5{x0ljBtFy$C!H zNL&IlBRH*p=bDx^5Aaf!qZX?OpbbPPg=PeJ9*}r#(a`X|p#d-O?4={CdNMvc_tH{U zBXG)1{jQ_q_-JnGho0EM`UNVcE<%+fSGWKG002ovPDHLkV1mf>408Yg literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa65c6a4d1417b07f38b728b75e79817602d468 GIT binary patch literal 1405 zcmV-@1%mpCP)2vigoIj6l5rCI+U6Yl4rHWu;>3xaiQgkxl{2b8-sj$P&-MK{4#6rl2ND1P z0KfnM0AK(B0I)L%z_zUJcDMbCa-3@_p)35;E-C8DpVmyPC`pojLh7NV)SXy|Hy-zf zKSy!gD{@ga?|*DMjh5SX-tBnqCs7o?s#JC-Y=f1Sr@jj1}_zfd?G;uv^&Amn}`v2zuQXtmt!IA%2-yi*YtkEoj&L;kb zdu?;Gy{F^&1wJ27xH79qjXFz}z`Uy*nn{E)B^TRn^Bq1v2ts{ev`Q8YAW6mVw7+MU zv%^mj@Ncael=#z3-rW%`*b{8IZu3n(|II*XnA)-!0IA#Ik}u*LKi5PIb3(_EA$Sbo zbuRn28N#1=AlP{u-1A$VZ^Z4Gk`M8pu4NE&O=!1T7sg}#BS%OoeJdSn}Zg5rR z^CA8zWmPni;6x(CygqDdobPd{8E4Us4UMPQ1c?kKJQwW>1CUOZ#Q7$)LeDv0=Qh%; z*?HEkFaS$>xJp6RS;HgNOtdQufL+g(qP^xCTB?=#G*j$b5MOE6^mZ-in!f@V&320e zP^t?(=dK6cMSKlK1hcK(|`@ZO)jWe`(Z+^Hj^k7Y!KqUGPNzecFTY5t(c)T=lwA51CE=JJJoudk zgF$5woGN_2xE(3^BL27E{Xnk&nBqv2RgyoJu?@?1Xyk3v2k*Z}`}_B3XJ?znY(4IAmTG`Zl$EK1 za+FmXj_((*z$C3|7if@5XDQ1>Su)cF%bc7m_f}NH6*9^!j*$8JGDTcwDOWW;U7kUn zMOC?}#A){2&Q`L_1sazwU0CY{8h`(Ds8$ZZB!r_Qf324&O#|RmxjIr_Tvn!FkzR!m zWLXfFsn%Ek^n~##0tNs800RKR*U)EK1exZxs4xJI)qBu!?v?1h;sA&qnOHrBqPZl=juNUA2u7DU-5q#DvrHPOg+ zZ0pXG{_vN=03=V=fKxRYpN5DiN8}?~4Thtyc-#NpLI&kWL%nAy>sFE_?FpdqGc6E} zM5~dn_h?c3LUS#MI3B&vshZyA_TU_4Nqn%U^hrw-8?o#8t3MciI2;Fm(4vy~$c0Q+ zpaV(OB-w&YO#lQ_@zvT-r@UG9>>0Ah*(N{MeTHzATlsV9|3q$9jT_uh z+>R;v*ZW7Ko3jKg_KdM@27&WrNvbA3zi7mdCi)4g2B{2>(-}J4;Ij7iEpa=hwe7n#a^>&mdsP)d{+LhM2Hfk1Uf7wndb=z$7!xOThPm#u;#5A zq_geGry2P=5OD|f$;ouKGmDSJJcRK80DuGl001xm000;O)YAS1*ladHjWdB500000 LNkvXXu0mjfroob# literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..aff30c26fbd4aaf80ef6c489a438a4d508b63613 GIT binary patch literal 3437 zcma)9c{J4T_kU}VFoYsT*-0A8mL=Ku2+7u9WXUoT+4nWs8H{WVVf?Jwm(j?yOc*<3 z-)d<)xc9mD#u*uEgXp>F0RRB$>S∓P{_I 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 dfIz@xoU3!9qVu64ly^Bh9!BC|O ztOWuBk)YJzMx+En8EH!q!=iid+}XMJ{y68%eDj_k=bQI=zeBRLxGKPRmJa{`2$-56 ztdGvL?~9lFXlELKZUq2%O-&J3Y$K;uAJPLQ>?9~L%%c3EwF=WQ1svnNq1qWNqRgm{ z%)uYOqvu}y0=kqL6VK+@FS}uQMai(bDLPSK$=39X^{qNSq)1h?S>f16*KkEWE#~gm zA@k7f{-8f~W_RH5=Ii~%m%C9!W(2k9;p|BO{dc%1fR_sdjD-O>IRJ40E>0jX3`XZYSU}e*oxoI47Y0C+lejCuqUt;al;*39Nq_NDkc+ap> zJ`Jq+%d?Yq2T~hg`I6TatFm8b&SpDc8c@2-TRo7Twx}9}6>*b{N(%Y7s&|YBu4G?IIeKCWu@SCQm!u~dvh z=1+{Egu0r5$5Xa@ev^=xUe$qi%t?Mr@Hk0g9IoScLu$Eog~m8xtClP6iEr*T@5`KZ zHbM8D26>>{9|k&v$~lbU?O0aX?k`>s+r>UHNB3()Bhd7SxC}M%TXrAibEDIv`84D* z9WS*QkZ_Cy_1T3+HF3dQZ`GjzaoXS8S{?sB3&L_vZMKQ@v6G$?z>Q>=^6-ds_` zF6t{7IPTKndKj)1FSBN1)*`lJaLjJ_W6!h*{TjB@YYojM*LEr8!8YI(^VJWR|F`WQ z&&auGyf5UQ6Ky+wH$;$A0A8$=^mG!t5biJ|j%`!EarjwY(j8`6C5;>jb}WYAcMm;WlOdQ!5H5 zGZuG!B4bc)<352KIi-q|Tz_(gpL7KKcj^H@VE<12zY6~|29Biv&V@L@55+(40(t-0 z%aX&$Td~s|#ASs)N{OZGWn^RcV=LV+FlzC{C4CU&s-#Jw@(z#WoGVCI31-ome%nk* zPalLzAe+!7xz4WPU4pM?6cOZja_81t74bs&oW*+~i^ciM7m+;Fp`nkd$C!k^4J2H| z9VCI*y~H^m!8B%JcyLr!v!o$>NwG*wls7=!d72+<=#v?IU${_} z(drk#{&*9^kzqwq{@m;w3pAoc z-cB1$f~w_L)~|=E`o*Z#htP|R3Z=Ab;3d16Z}Val$9)T8n+P zRu7@IJ9^-P7yM%w{CI-AWwQkMb-o)36J>a3Jz9%WKG}+7AU@Ow0yG6a_2Qf!sk&F6 z#j8T&P1>%u_WejX9-e-r*7ul4;eojC@LFR8+u=}z0l~D u7e5!T^fJePfIS-5f6wh76pG2laL!q2Y2~TX-XHxf0H#J3h#EuB_`d*PH{y8! literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..bb797c6213faf5679cda15d8e049598da2b37750 GIT binary patch literal 5272 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 F{sATevoiny literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7c0f0c7366fe336d2531fb3ca147e96bfc5fc4 GIT binary patch literal 7126 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml b/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..ea9c223 --- /dev/null +++ b/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..872d3d54b4bd6e5a83029cc991336c33008441c0 GIT binary patch literal 46434 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 E7r(;0i2wiq literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2965903a769044eae50b05911ba3b57cacbda69b GIT binary patch literal 8097 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa89fb52a191663f583a80dff3cb503e0afe9464 GIT binary patch literal 456 zcmV;(0XP1MP)&(82zmjK`VXWHH822p}`tJPma^2`Jg#6#uLB*s>&@XqiJkojRu~@M5nS z$EyR{6tI(~;6}sMwh}wce2$+igDp`#puVh;DcJqdA^39$X~y_t%bwFLhuKYW_VSAF z;Sh1F^)LO%R~wDYfxW*$+HJs;4s6q(Ou)LdcYJk>{A7rWOu=NM4JuO;=Hik@4e=5e z)zIi7b6{m8ZmrSQG;D-58`rkKt(i+x*Ho^V7NfCRghinXHkANpB`IXV$nLo_duL@* zw9m9PctL=tZOq4)mlW^lX=86CNl;@io#k1cuW$6!bOJ)efmIwGp;m&b4s~Buz7#{T ySe3S5EKCcF$JLjdYO~6=Dy@oRsHv}FDAq3&NYj-#%MYCZ0000jb<%3gg<1MiUn4i9UbsEYiI_2r0EvN}xoO zhQUCHTD^{U?>{1{9FdEgn;)!lWy8_TDGDl?Wf=|*GDPW*-No;_-=MTcC`MPKQtfsd zqB(P1m*sOVJ{gA!ME zq!~kSv{JE~96BK3V&k-@=H?))RdYl6NhlA)DbL4Xk zG1b`=D)V}dB@?TXKP|V^+FLu9^U#@-Q`)CsZO+b)v|x1xEFd!;Q-~#hQCYJR4)#w| zq2gc-pSAQq8V4oY3!xg>Bs-fTKsYjyO|tDuuMbJdsGoJn7JLI!vSH1hFhdBxC{szU zO$M@%iENTBF7|@i6RuBAvddbEPv*S=1u9qcrw2{+UtdG4JYLcp>uVyE*APDejb<%3gg<1MiUn4i9UbsEYiI_2r0EvN}xoO zhQUCHTD^{U?>{1{9FdEgn;)!lWy8_TDGDl?Wf=|*GDPW*-No;_-=MTcC`MPKQtfsd zqB(P1m*sOVJ{gA!ME zq!~kSv{JE~96BK3V&k-@=H?))RdYl6NhlA)DbL4Xk zG1b`=D)V}dB@?TXKP|V^+FLu9^U#@-Q`)CsZO+b)v|x1xEFd!;Q-~#hQCYJR4)#w| zq2gc-pSAQq8V4oY3!xg>Bs-fTKsYjyO|tDuuMbJdsGoJn7JLI!vSH1hFhdBxC{szU zO$M@%iENTBF7|@i6RuBAvddbEPv*S=1u9qcrw2{+UtdG4JYLcp>uVyE*APDeIP)6JtVRNZh({hahNFT>1!g zErb?XfU;Hau{12?(Ux+r_a7Lb6?M@ew)f6Snp~K6X1+ORUgw_Uc)nm=3WWk3$5GD{ znKWJuKf~zgJAD8471?YSl`PR{6pc;IXm3A_iw>wtS=_mO3vW{+ z5JLDR9yW)hvPE?l0z~RaByqR*9$H#ji=Y*-{zq!$4X$-}!E;@>{*R=T{-Y~UMWXvG zeR?4!`uYcvJlnYeEml@mJPq4@^@?8`vuFldY5$|g8_-I_G~-ik$FaJ)T9sP; zm$oC32*%Qr%Dg2DIA>|b9F?HJQpiFkvXN2E;Y@nmyU>|H806*a6e4@-<2}>UQ%e25 zh#-QJjmo9ABk&46^YcFtR9FhxxMeLYEJ8Fl?DKNDTqsOB7K_0N3oM1FMF$}h3v7Wc z@E`ZOojx^H4lpkqON&eD2*>@-)NN8-PW{Sw>xssq>(|x)3{2RXni?EBau_mJ3v;-e z*luUPzYW!~j$ z*l(PgCG4l0Hz4D?IpIt#3~(2I;^6%UstwOTy^a~Til;P7SQ(ES1y-W0#)E+=Y(T@s zOX=pv-15AATXr9|z!um7TVM-pfi18Fw!jwH0$X4UY=JHC&bfF{;*v4xpDw9SR08l? zNRv?BMLOJ2;+8St#ADrS;YgLBVRp**8`G6a@8V9mY1xJ_U_E00-g?i3Bfj}SYgIVn z%Ldlaxoj>RuUgi8(?Y!wKv-U;ne33=hb^!Lw!nWq%P^8WEW*Gv$*_4Lf)7i^hQ=mH z<_K_$Uk|`UaDz*Q%7>6lh~P;nNO98J#Z8lutdiLuOo(8Pz}D=Kz^uwX6WPc}*6^hO zF!6y84+n!*$*XDW(UJXRpc!w4Ey_$oN!r@`i42CHKMhOZ3+MY N002ovPDHLkV1ncVqxAp) literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..cdca11f9192eaa6cbceacb438c405efe36f8c0df GIT binary patch literal 552 zcmV+@0@wYCP)L>B%v+w>FVTTp^duqFN@K zo6+AtfZ4fujEs)K^E?QpZEtr68|$lPkp7Emn-IeME-Wr%YI+9Zn zCLtq{($KdzbL+Nsg>FSiA}O<^jF7;fNR2c7{BsL_kw`_={q+hOQ%_>IpkSX-ZaY3T7iq@EqNBD qK9x6TL48^)-An)EkS7}PE%N~uLm|uNyN@dX0000P)4tx~Cw<2d4c?)fu% z`s5KUE*AK=)m4UjaWvbuDU-?YzWrG?bn+A(J3hFH1;%*Y2!~}^v@oBiu`8o|X{pHY zfu`pWYhz4wmwJ2m@as1w*udc&)oL|yT^yjq1wh`vdz+@GZptqT!r&fD0%*{G9y&(! z_rk?Xbmr_il5CE2F(7BAe?cY%P@3#7fB`F601HOpQH1O1;S-dkQ2p0Xe)xEn5XJ)Z zNbZmrlS%aCpF$a)#h87Sf5R-iU3G($p$sOlfzj?rS=T-p_vI*4KTi zhD)L#d#OtIV%}{B57F)Hh}^0Z)sui69XU_^efy|X@|1ZOUhMAPLT}%Hpoz&_)Yaui z@@!;}!jpj9n}11PK7FKAryF?%gvcmw__Sl!Zlc^#@f)oV-JnzOBp|;Qi{!X2=3Y@7 zrHb#1(^CJz#*(YWFQd8y15W}n<*M;03~knj0*_C65pbdQ6xE}lCZbdXFnQE~8c+jj zKner2L^uNkhg-V6;%Vj6^T%U9}3=fC+5b>;Yz>JX?1g92#z; zGFDtf4SI8tAZb+aDA_F3$)Q3SHR$#AZnDR#9G74L6WAK1=CZ*4!M!^)H94;3=7CMy zL0&J+)78r(dTs}y-)!)CF*hqV_!J87V!go!{l#41ZyS7m0$WqhlE&u=k07*qo IM6N<$f~(zt8~^|S literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9af552b5ea46634fa44023a0a44d9373ee7d8e88 GIT binary patch literal 830 zcmV-E1Ht@>P)4tx~Cw<2d4c?)fu% z`s5KUE*AK=)m4UjaWvbuDU-?YzWrG?bn+A(J3hFH1;%*Y2!~}^v@oBiu`8o|X{pHY zfu`pWYhz4wmwJ2m@as1w*udc&)oL|yT^yjq1wh`vdz+@GZptqT!r&fD0%*{G9y&(! z_rk?Xbmr_il5CE2F(7BAe?cY%P@3#7fB`F601HOpQH1O1;S-dkQ2p0Xe)xEn5XJ)Z zNbZmrlS%aCpF$a)#h87Sf5R-iU3G($p$sOlfzj?rS=T-p_vI*4KTi zhD)L#d#OtIV%}{B57F)Hh}^0Z)sui69XU_^efy|X@|1ZOUhMAPLT}%Hpoz&_)Yaui z@@!;}!jpj9n}11PK7FKAryF?%gvcmw__Sl!Zlc^#@f)oV-JnzOBp|;Qi{!X2=3Y@7 zrHb#1(^CJz#*(YWFQd8y15W}n<*M;03~knj0*_C65pbdQ6xE}lCZbdXFnQE~8c+jj zKner2L^uNkhg-V6;%Vj6^T%U9}3=fC+5b>;Yz>JX?1g92#z; zGFDtf4SI8tAZb+aDA_F3$)Q3SHR$#AZnDR#9G74L6WAK1=CZ*4!M!^)H94;3=7CMy zL0&J+)78r(dTs}y-)!)CF*hqV_!J87V!go!{l#41ZyS7m0$WqhlE&u=k07*qo IM6N<$f~(zt8~^|S literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8d87ab1eecc6acf0e977b15569442f61824449f6 GIT binary patch literal 1236 zcmV;_1S|WAP)%I~$A1nD@Wbu-vQg{BMl$Wp4SFy{-I|-2TgT)JAuV1?& zTdFFgv*W$H!q3!zKh8z4zQFUyflF6shit8?)V#pWF#IiYO^!Wt>V#arRPX*#GE)72 zNTtf~QOc6N`wqzABgaziRm$WH6R`kmS;~u4A{<|a4|su_iD2;5%ZG-B5=h1^EzLT_ zbM&eYC@+iLf6%CNFaUdLVa@6?onuYXCaQ_22;A(8mM)X$FIs=51r)bXDnLjR?7yc7 z@B>Hi^loSy)~=Fw@7i;=3>$P=c=_^TdD7G@4r*SgAW*>+*C6l&S9|W9nKf_TytYiv zAfohhFM>E0i-|pL>Xh0qy}dfBi6)rrpz95&>E_v1ZC_s>kp!%PfdO&Qx81T| z;Q}bSk><~z=k?8HHge|eH0b)L5+2i<8CWe!GeV{@8ns%Kgs=) zP&;HJyP+Xs0rq=Whp2+7=yZ|@Td*bG-{hZ9c9?E@1K343PX{oXbE=Fl#7^fL+n2Ax2*nT1#;bP!1 z#>bk`hM5|lYb%uTso!3$g! zoI6H65J)6AKMC!KqDo84%tB8291L8|5nR>AO_jeHOi+^6+~wd2uAH+x#5v1#>orV# zu$(1_^h*ff2%ahSG4zQD!6(8@PFz=iQTH?vY&upliBXQp$%&Qmk|`@+DK*DW3ru{N z9{!=i;Bu=ueoAvRUPn6Tq5~16ckSMz-I36V=bM(F`m=3;<^^uMcJED2r#)&s=jB}E zZHtiV!4YN^0*K`Ou%kHCacpT9yzC%-hD{FW3glXLYK#&z=h yD-X)Mw{J>Y+gqUrWf~roLif}OyQluj$*&)}@u^}zfA6CJ0000jb<%3gg<1MiUn4i9UbsEYiI_2r0EvN}xoO zhQUCHTD^{U?>{1{9FdEgn;)!lWy8_TDGDl?Wf=|*GDPW*-No;_-=MTcC`MPKQtfsd zqB(P1m*sOVJ{gA!ME zq!~kSv{JE~96BK3V&k-@=H?))RdYl6NhlA)DbL4Xk zG1b`=D)V}dB@?TXKP|V^+FLu9^U#@-Q`)CsZO+b)v|x1xEFd!;Q-~#hQCYJR4)#w| zq2gc-pSAQq8V4oY3!xg>Bs-fTKsYjyO|tDuuMbJdsGoJn7JLI!vSH1hFhdBxC{szU zO$M@%iENTBF7|@i6RuBAvddbEPv*S=1u9qcrw2{+UtdG4JYLcp>uVyE*APDe7Y;>D92G0_Xr#6&@( ziTjcWCpWxkID%}ml=W4255o-VFxZ3Bd|yK7>FG&#{rbJGSJkgyyV^){luD(9!55GE zdZqpN5uHpX6igQG9Cc`af*CMy-3op6dbiru+%gTK1(*%*$l-%9V2PQ}SWk&%lQJw| zM%}mWNH#=e7BncsZFg>O(#gc6QpR1Q)=B(}PR2k{ZbhYj{PdZEJNuojV>iGx&$_Ll zN_hDK6VEFX3aosn;=s>u-neEv3|J!F_V)rCFaj$?D7KTqHE>V!4m~i?uY#C|`g6wu z)zsAL2YpYJ+xzf=AkHJ2!W0-7m|=hst6s6Z^ZmQGnK+M#3hPi{j7#Hj9a~i4bPf#- z`QbNJs3+TNV#14+J0~V4h@=ROjgO0ii2nm7a$IPbac$#j1oN`gDoYC7cUC+B)Vb3tE#G!En7BYPF&_`0#81E{A5nz zXlM}Ku-q1w2YB~-Zp+yBAD$JKY`((V*OHah(%N=NUc7iE@%YkE+}RDa5ytWWZ{TFR z=*dY@xG^2}gsqwI)aG7=s;rcnD_4E%*JXGO)Kd$9rxOX=uu=e&jHT(EV=2opMp?_V zR#BoJ**dUI!%z{41HJTyspYUOFnfOtq&X5HK#BkfkN^pgB0vHpKmw!)kN^pg04V|_ zKmsH{iU0|a011!)r6kYM`_GtV{+DWh1`x-` zCz#?ZbI4RhW~ea9{QqqL18D*zK#BkfkN{=jmOybdF%(}v#xccXSahODft|Bv^%{Tr zj2vfKdhR;!);`ws+FYH5PAs22lfrqZus`MWumzq9i^ zrqr)pKU1A#YP!G(tia3yHRh;6udQ{jynf9pmVYfqYi<|R*EdMdz5CW%XDmYN_@#fT z>6Vv9Ipo|Tw1LH81?nW@3TQWUIY`O2JTL(pFbWECgPjv>fEB2Zj5^7nobn+qTM;z77LpTMW-II>P{?xn=iXUx)DvJ~m;fg`Jq;00000 LNkvXXu0mjfb~`Zf literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5220e4f8de809b36011d5612794a733ef87529 GIT binary patch literal 1197 zcmV;e1XBBnP)7Y;>D92G0_Xr#6&@( ziTjcWCpWxkID%}ml=W4255o-VFxZ3Bd|yK7>FG&#{rbJGSJkgyyV^){luD(9!55GE zdZqpN5uHpX6igQG9Cc`af*CMy-3op6dbiru+%gTK1(*%*$l-%9V2PQ}SWk&%lQJw| zM%}mWNH#=e7BncsZFg>O(#gc6QpR1Q)=B(}PR2k{ZbhYj{PdZEJNuojV>iGx&$_Ll zN_hDK6VEFX3aosn;=s>u-neEv3|J!F_V)rCFaj$?D7KTqHE>V!4m~i?uY#C|`g6wu z)zsAL2YpYJ+xzf=AkHJ2!W0-7m|=hst6s6Z^ZmQGnK+M#3hPi{j7#Hj9a~i4bPf#- z`QbNJs3+TNV#14+J0~V4h@=ROjgO0ii2nm7a$IPbac$#j1oN`gDoYC7cUC+B)Vb3tE#G!En7BYPF&_`0#81E{A5nz zXlM}Ku-q1w2YB~-Zp+yBAD$JKY`((V*OHah(%N=NUc7iE@%YkE+}RDa5ytWWZ{TFR z=*dY@xG^2}gsqwI)aG7=s;rcnD_4E%*JXGO)Kd$9rxOX=uu=e&jHT(EV=2opMp?_V zR#BoJ**dUI!%z{41HJTyspYUOFnfOtq&X5HK#BkfkN^pgB0vHpKmw!)kN^pg04V|_ zKmsH{iU0|a011!)r6kYM`_GtV{+DWh1`x-` zCz#?ZbI4RhW~ea9{QqqL18D*zK#BkfkN{=jmOybdF%(}v#xccXSahODft|Bv^%{Tr zj2vfKdhR;!);`ws+FYH5PAs22lfrqZus`MWumzq9i^ zrqr)pKU1A#YP!G(tia3yHRh;6udQ{jynf9pmVYfqYi<|R*EdMdz5CW%XDmYN_@#fT z>6Vv9Ipo|Tw1LH81?nW@3TQWUIY`O2JTL(pFbWECgPjv>fEB2Zj5^7nobn+qTM;z77LpTMW-II>P{?xn=iXUx)DvJ~m;fg`Jq;00000 LNkvXXu0mjfb~`Zf literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..da4db59ca088b860704dc2111c0fc64afe2e5c73 GIT binary patch literal 1865 zcmZuyc{CgN7EVM(5&OQhMN6&K(vZ|Lh;2}YP!Zawy=ah7+98N#iYl>IYuDfqwQnI3 zZPn6IWl+(IAq<0P)iPtLmznwFy?5Tb=iKk!@80{*{m$>)-$Uo?HV^@M0RR91v9m?E zaAVA0&d+Zk004{HA+d|}Dmzh&qEd)Onu@x`UOc!^f$_EFJ8B>Rp^V8Zq4&PU*g8c zc65O*dXK;A4Ns=}E7T^fuWWSYR$MTF-!w}Qe#6{EsT+Dvs3VM}Of{W9=C6kV&nPJ5 zl1Som@;$0s*x8FjP~pa;Wz)BWR2d33h=di!+xh#uCC)Y^d;(t*5gtKfY0CRH)*F+F zOL=BIsvexAbOG4TSD(82`ZDQl%Y>3T(A~f{_aE?-$|}|zNq9I4C+xoWRd@4_J67fN z06s)bhmVHLc{VH;10}s9dA&O1enQ!setIz0v%Z*kVhz4>5`#D{XP?UCH+c^(Bc?=ZnyaW0eAbdR%VFR zlu4~V4^>{Cm~bhvEy$0LCa|%5>%O+K&1}(NXtKh~_z%5wC_-3D%E`YKrF3OVjn<-D z{Ie)lOb_VF>ma6QMVI_1`5T*zhYRdB$k{p^wnYrGGOv)3#3|wIL#ii4T|2|-4`h~+VIAnODkoIqDD`B+#(#AtF_Hy zt47qqEL3vLE?2a!luB%K=C+1%IGNg>UE>+rQ{y#~5+1q>^BeGsRWgJ^K#EOdsU;LP z1j{Wg_WD9H?vKFDABJaN^))#i(w%Va$h$DPE-&aEu3c)+iA4?UcM3hgw1g-x5So3% zbY#LMGNhGr(Z;Orvkm>wD?|Me#ImoLr2@*biaqO|AfNlksv7UpGVrc(^Z!`hivC|( z{124`O8i@?za;y=bhNhsj5r08l>16k)ZmEi%U|RvfJw1`o{7gV1FKv{ME5r|cf~$C z#JJJ!XbC)!9sya`%4%?w`a!^V7;0^2CaJfUnLbeZgSL7mi%~;$e`i8yT-2pVx*v;LYoP*LF%*C< zz$mme-fc~c&VBfuMAk#PxB~+k6YHOWbh{yFf`6v%QGI_{9MYk-Yowv1^a9;qQgnn{ zM&eJUVrIFggbt-M9zE@pZ4EF*D)OdcPLrc`GeHo@qlxAU*U9uHpFVC0Q}3YLGN>@q zcrzy|#JxHHcDbub|44>?A&L%MQ2A96%)Jyo1)X_$MM80!o;>9R*O2${7XubH zhxO}zUsld4@D0H~_*7b*@m%*-rAEL$*;0Ab`>5lfH;~X(eMrzl*C2t z?oO1zl%)d7L`(VhhU53TF`&^?+!<;epPa+JN}^CMHuMfuM*flqY?no4|5ymWd+4PX z8D69R3PY{|k!djz&;7E>@+foBL7lk97@CzyTvHY!4Qm3 zzQyXa3CxPt5_%IMKZcl2$k`4at$uZ$omMN#1O9WhtVIjy@#;hOx8zes?c)pbOp1t#fVR{CbB literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-512@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..59c18b9f137fb37fba5cf47345a565ad4a08c696 GIT binary patch literal 14543 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
xe|mCBX}in6$Zl8=pTs1Ym8#-r!rM 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1576e3720b7712b66777507341a3081352436ccc GIT binary patch literal 2998 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3779c3ae10774a02ce707263c45a25976e326d GIT binary patch literal 1024 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 Cq1Y4v literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7b2d10260c805132e6f509e2b00c9554429f17 GIT binary patch literal 2768 zcmbVOS6CCs7S2i$5LghE;;w)q9kLLr(m@D4h7zTTp)K7FC4>-A0ciq3x&#oEk|0e= zB$OyfM~Fy~-dkwWA+&{i_u)R?dmrZf=bUfO%y;ISng5T1nCP*w@UZ{@05*NF4)hEQ z&Ic3Ynf1M9v;qLIr0VNvngywx$<58pcV%UemXuUO3yUhF%sUp;f-#W_ z=P~b7oOE+@GhOTM&Q8<;391w1_fu^1B zl<{%t>vln!cBq5F-m(67X zoiAErKjPYV*No=!1B;8LEPs4bEd|D5IamtS0z4G(nU z75328{`=mQ_LlLxtH(uK2FHA_a5-rq;}wRM>L-Oo9ot+Qd=WVuyBLC=JD=slQvV4k zCCOD)8BRzGeCmH`2{D zplD-}l`0wx(B<1PI41oWBeWyc&p}MZb??}(+7I4rgB*Ply`oP|r{$01L)yF3_pxS^ zw70%s#M(*^ga2%6Y)Y>!y{vd5_yYcYoi#hZs-TmT(`DLXxS%C!iCaCjy4v#XE%iud zS%c#@)C~6UWt&(>{@CN26y3!R3@RHYMJ)2{^bSDJ8uiPAQ)eKL+3ooc55cZQfN3Euq5z4 zq)*RQXlYqo-}Yq+QwdHG?Cu8Z)7$C&K35yXoRh|UIb2_m`ZjP$Q6X#grN%4-cwDhg z=6_)xEf}fghP+_~q&uB%cBaV-B34bt1X~8B;DFqgsv=nPV0{cAS2xxFwoE!tF4$;q zYFbXiT+>9u1TafKORw>7=N~wa|0A80K;qL>FK-`~+{iGt^R-lnC(FHi6ACiH!CqiDDOOrwGr34>ZKzBp_{IgoP8$Pz^8Mx& zPgl;wY;D8~MMb|_x=XhD3H6o=XLq?q$YsAFJh+>+ko6UR4V2Ak3hflegyjM#|Dya0 zmg`^6KX4xZZ|VQLdWL7~+b!<4>Aeg;1S6*Y^7gK912aO)1Vg4ZB!CD|#*IsJ6Be9g z=iuPAHrHm~b!##^76j)83k?j4Kp_Hq9zW8qL-P&RcaLkg?6DwOP7n}idXy_GRxyEY z$Oe7=n$Z&)jbG60(NhRgGq!L-VQW4&g0t%dW+cQNhqnXIerh62ETYqz>-0^Qn~GGi zr|0y@uWs1SDbAI+_UHco{&S9BjIL@L8bpKax+L|NpVe~Av?Mz?KYt*ZvH^EC)_lj^ znCHtudIk7z4pDGBj(B3pMhPCzRwrhbA7;vkuxfgK$mXh89!|P?>qXwZff-F0< z@kitfNF^mDwIw)+I5vif6Jy^NzzKP@FC>xd52ifCiQAw4%xSphu1P)1k^ub5C#vAmFDLF2V9c6#= zo2!=>Vxl5Xel&_|gDEP`GU`kD<KCZ8Q2I{Gz6Uq_6-i&O|w&zfo(;q_XH^x*+TPy|?Zs-)e~^Q~`{^1KzCkol#-e{67e$vb2)_DEG{)v /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs new file mode 100644 index 0000000..682a9a7 --- /dev/null +++ b/apps/web/next.config.mjs @@ -0,0 +1,21 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + // Emit a self-contained server bundle (.next/standalone) so the Docker + // runtime image only needs the traced files, not the full node_modules. + output: "standalone", + // We're inside a pnpm monorepo. Tell Next to trace dependencies starting + // from the workspace root so symlinked modules under .pnpm get included + // in the standalone output. + outputFileTracingRoot: path.join(__dirname, "../.."), + // Dev-only: allow loading HMR/dev resources when the studio is opened + // via 127.0.0.1 or a LAN IP (not just localhost). Without this, Next 16 + // blocks cross-origin dev resources and the client bundle won't hydrate. + allowedDevOrigins: ["127.0.0.1", "localhost"] +}; + +export default nextConfig; diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..1934890 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,29 @@ +{ + "name": "@verric/web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@react-pdf/renderer": "^4.5.1", + "@verric/core": "workspace:*", + "@verric/storage": "workspace:*", + "docx": "^9.7.1", + "next": "^16.2.7", + "react": "^19.2.7", + "react-dom": "^19.2.7" + }, + "devDependencies": { + "@types/node": "22.19.20", + "@types/react": "^19.2.16", + "@types/react-dom": "^19.2.3", + "autoprefixer": "10.4.20", + "postcss": "8.4.49", + "tailwindcss": "3.4.16", + "typescript": "5.7.2" + } +} diff --git a/postcss.config.mjs b/apps/web/postcss.config.mjs similarity index 100% rename from postcss.config.mjs rename to apps/web/postcss.config.mjs diff --git a/apps/web/src/app/api/branding/[id]/route.ts b/apps/web/src/app/api/branding/[id]/route.ts new file mode 100644 index 0000000..3fed96e --- /dev/null +++ b/apps/web/src/app/api/branding/[id]/route.ts @@ -0,0 +1,37 @@ +import { NextResponse } from "next/server"; +import { deleteBranding, getBranding, upsertBranding, type UpsertBrandingInput } from "@verric/storage"; +import { getDb } from "@/lib/db"; + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +type Ctx = { params: Promise<{ id: string }> }; + +export async function GET(_request: Request, ctx: Ctx) { + const { id } = await ctx.params; + const db = getDb(); + const branding = getBranding(db, id); + if (!branding) return NextResponse.json({ error: "Not found" }, { status: 404 }); + return NextResponse.json({ branding }); +} + +export async function PUT(request: Request, ctx: Ctx) { + const { id } = await ctx.params; + let body: UpsertBrandingInput; + try { + body = (await request.json()) as UpsertBrandingInput; + } catch { + return NextResponse.json({ error: "Invalid JSON body." }, { status: 400 }); + } + const db = getDb(); + const branding = upsertBranding(db, { ...body, id }); + return NextResponse.json({ branding }); +} + +export async function DELETE(_request: Request, ctx: Ctx) { + const { id } = await ctx.params; + const db = getDb(); + const ok = deleteBranding(db, id); + if (!ok) return NextResponse.json({ error: "Not found" }, { status: 404 }); + return NextResponse.json({ ok: true }); +} diff --git a/apps/web/src/app/api/branding/route.ts b/apps/web/src/app/api/branding/route.ts new file mode 100644 index 0000000..e8b994b --- /dev/null +++ b/apps/web/src/app/api/branding/route.ts @@ -0,0 +1,29 @@ +import { NextResponse } from "next/server"; +import { listBranding, upsertBranding, type UpsertBrandingInput } from "@verric/storage"; +import { getDb } from "@/lib/db"; + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +// GET /api/branding — list all branded templates +// POST /api/branding — create or update one + +export async function GET() { + const db = getDb(); + return NextResponse.json({ branding: listBranding(db) }); +} + +export async function POST(request: Request) { + let body: UpsertBrandingInput; + try { + body = (await request.json()) as UpsertBrandingInput; + } catch { + return NextResponse.json({ error: "Invalid JSON body." }, { status: 400 }); + } + if (!body?.name) { + return NextResponse.json({ error: "name is required" }, { status: 400 }); + } + const db = getDb(); + const branding = upsertBranding(db, body); + return NextResponse.json({ branding }, { status: 201 }); +} diff --git a/src/app/api/export-docx/route.ts b/apps/web/src/app/api/export-docx/route.ts similarity index 59% rename from src/app/api/export-docx/route.ts rename to apps/web/src/app/api/export-docx/route.ts index 14dad75..f9fd5d5 100644 --- a/src/app/api/export-docx/route.ts +++ b/apps/web/src/app/api/export-docx/route.ts @@ -14,7 +14,13 @@ import { TextRun, WidthType } from "docx"; -import { type EvidenceArtifact, type EvidenceChunk, type Finding, type ReportClaim, type VerricReport } from "@/lib/report"; +import { + type EvidenceArtifact, + type EvidenceChunk, + type Finding, + type ReportClaim, + type VerricReport +} from "@verric/core"; export const runtime = "nodejs"; @@ -25,14 +31,21 @@ const MUTED = "716B60"; const text = (value: string, options: { bold?: boolean; color?: string; size?: number } = {}) => new TextRun({ text: value, bold: options.bold, color: options.color || INK, size: options.size || 22 }); -const p = (value: string, options: { bold?: boolean; color?: string; size?: number; spacing?: number } = {}) => - new Paragraph({ children: [text(value, options)], spacing: { after: options.spacing ?? 120 } }); +const p = ( + value: string, + options: { bold?: boolean; color?: string; size?: number; spacing?: number } = {} +) => new Paragraph({ children: [text(value, options)], spacing: { after: options.spacing ?? 120 } }); const h = (value: string, level: (typeof HeadingLevel)[keyof typeof HeadingLevel] = HeadingLevel.HEADING_1) => new Paragraph({ text: value, heading: level, spacing: { before: 320, after: 160 } }); const label = (value: string) => - new Paragraph({ children: [new TextRun({ text: value.toUpperCase(), bold: true, color: MUTED, size: 16, font: "Courier New" })], spacing: { after: 60 } }); + new Paragraph({ + children: [ + new TextRun({ text: value.toUpperCase(), bold: true, color: MUTED, size: 16, font: "Courier New" }) + ], + spacing: { after: 60 } + }); const bullet = (value: string) => new Paragraph({ children: [text(value)], bullet: { level: 0 }, spacing: { after: 80 } }); @@ -60,7 +73,10 @@ function table(rows: TableRow[]) { }); } -function specCell(value: string, options: { bold?: boolean; color?: string; mono?: boolean; header?: boolean } = {}) { +function specCell( + value: string, + options: { bold?: boolean; color?: string; mono?: boolean; header?: boolean } = {} +) { const run = new TextRun({ text: value, bold: options.bold || options.header, @@ -101,7 +117,12 @@ function claimParagraphs(title: string, claims: ReportClaim[]) { // genuinely unsupported (flagged) claims get pulled out. const verified = claims.filter((claim) => claim.status === "grounded" || claim.status === "needs_review"); if (verified.length === 0) return []; - return [label(title), ...verified.map((claim) => p(`${claim.text}${claim.evidenceIds.length ? ` [${claim.evidenceIds.join(", ")}]` : ""}`))]; + return [ + label(title), + ...verified.map((claim) => + p(`${claim.text}${claim.evidenceIds.length ? ` [${claim.evidenceIds.join(", ")}]` : ""}`) + ) + ]; } function isVerifiedClaim(claim: ReportClaim) { @@ -118,7 +139,11 @@ function collectUnverifiedClaims(report: VerricReport, confirmed: Finding[]): Un source, text: claim.text, status: claim.status, - reason: claim.groundingNote || (claim.status === "flagged" ? "Cited evidence does not support this claim." : "Cited evidence partially supports this claim.") + reason: + claim.groundingNote || + (claim.status === "flagged" + ? "Cited evidence does not support this claim." + : "Cited evidence partially supports this claim.") }); }; report.executiveSummary.forEach((claim) => push(claim, "Executive Summary")); @@ -146,33 +171,97 @@ function unverifiedClaimsTable(rows: UnverifiedRow[]) { }, rows: [ new TableRow({ - children: ["Source", "Statement", "Status", "Reviewer Note"].map((heading) => - new TableCell({ - shading: { fill: "F3EFE6", type: ShadingType.CLEAR, color: "auto" }, - margins: { top: 100, bottom: 100, left: 120, right: 120 }, - children: [new Paragraph({ children: [new TextRun({ text: heading, bold: true, color: MUTED, size: 18 })], spacing: { after: 0 } })] - }) + children: ["Source", "Statement", "Status", "Reviewer Note"].map( + (heading) => + new TableCell({ + shading: { fill: "F3EFE6", type: ShadingType.CLEAR, color: "auto" }, + margins: { top: 100, bottom: 100, left: 120, right: 120 }, + children: [ + new Paragraph({ + children: [new TextRun({ text: heading, bold: true, color: MUTED, size: 18 })], + spacing: { after: 0 } + }) + ] + }) ) }), - ...rows.slice(0, 14).map((row) => new TableRow({ - children: [ - new TableCell({ margins: { top: 100, bottom: 100, left: 120, right: 120 }, children: [new Paragraph({ children: [new TextRun({ text: row.source, color: MUTED, size: 20 })], spacing: { after: 0 } })] }), - new TableCell({ margins: { top: 100, bottom: 100, left: 120, right: 120 }, children: [new Paragraph({ children: [new TextRun({ text: row.text, color: INK, size: 20 })], spacing: { after: 0 } })] }), - new TableCell({ margins: { top: 100, bottom: 100, left: 120, right: 120 }, children: [new Paragraph({ children: [new TextRun({ text: row.status === "flagged" ? "Unsupported" : "Partial", bold: true, color: row.status === "flagged" ? RED : "A15C07", size: 20 })], spacing: { after: 0 } })] }), - new TableCell({ margins: { top: 100, bottom: 100, left: 120, right: 120 }, children: [new Paragraph({ children: [new TextRun({ text: row.reason, color: INK, size: 20 })], spacing: { after: 0 } })] }) - ] - })) + ...rows.slice(0, 14).map( + (row) => + new TableRow({ + children: [ + new TableCell({ + margins: { top: 100, bottom: 100, left: 120, right: 120 }, + children: [ + new Paragraph({ + children: [new TextRun({ text: row.source, color: MUTED, size: 20 })], + spacing: { after: 0 } + }) + ] + }), + new TableCell({ + margins: { top: 100, bottom: 100, left: 120, right: 120 }, + children: [ + new Paragraph({ + children: [new TextRun({ text: row.text, color: INK, size: 20 })], + spacing: { after: 0 } + }) + ] + }), + new TableCell({ + margins: { top: 100, bottom: 100, left: 120, right: 120 }, + children: [ + new Paragraph({ + children: [ + new TextRun({ + text: row.status === "flagged" ? "Unsupported" : "Partial", + bold: true, + color: row.status === "flagged" ? RED : "A15C07", + size: 20 + }) + ], + spacing: { after: 0 } + }) + ] + }), + new TableCell({ + margins: { top: 100, bottom: 100, left: 120, right: 120 }, + children: [ + new Paragraph({ + children: [new TextRun({ text: row.reason, color: INK, size: 20 })], + spacing: { after: 0 } + }) + ] + }) + ] + }) + ) ] }); } function findingEvidenceIds(finding: Finding) { - return Array.from(new Set([...finding.description, ...finding.impact, ...finding.proofOfConcept, ...finding.remediation].flatMap((claim) => claim.evidenceIds || []))); + return Array.from( + new Set( + [...finding.description, ...finding.impact, ...finding.proofOfConcept, ...finding.remediation].flatMap( + (claim) => claim.evidenceIds || [] + ) + ) + ); } function isUnconfirmedFinding(finding: Finding) { - const textValue = [finding.title, finding.readinessSummary, ...finding.proofOfConcept.map((claim) => claim.text)].join(" "); - return /potential|candidate|unconfirmed|not confirmed|requires further|no successful payload|needs poc/i.test(textValue) || finding.readiness === "needs_poc" || finding.readiness === "unsupported"; + const textValue = [ + finding.title, + finding.readinessSummary, + ...finding.proofOfConcept.map((claim) => claim.text) + ].join(" "); + return ( + /potential|candidate|unconfirmed|not confirmed|requires further|no successful payload|needs poc/i.test( + textValue + ) || + finding.readiness === "needs_poc" || + finding.readiness === "unsupported" + ); } function imageDataFromDataUrl(dataUrl: string) { @@ -208,7 +297,10 @@ function imageParagraphs(artifacts: EvidenceArtifact[] = []) { } function findingSection(finding: Finding, chunkMap: Map) { - const evidence = findingEvidenceIds(finding).map((id) => chunkMap.get(id)).filter(Boolean).slice(0, 8) as EvidenceChunk[]; + const evidence = findingEvidenceIds(finding) + .map((id) => chunkMap.get(id)) + .filter(Boolean) + .slice(0, 8) as EvidenceChunk[]; return [ h(`${finding.id}: ${finding.title}`, HeadingLevel.HEADING_2), specTable([ @@ -222,7 +314,14 @@ function findingSection(finding: Finding, chunkMap: Map) ...claimParagraphs("Description", finding.description), ...claimParagraphs("Business / Technical Impact", finding.impact), ...claimParagraphs("Proof of Concept", finding.proofOfConcept), - ...(evidence.length ? [label("Key Evidence Excerpts"), ...evidence.map((chunk) => p(`${chunk.id} | ${chunk.artifactName}:${chunk.lineStart} | ${chunk.text}`))] : []), + ...(evidence.length + ? [ + label("Key Evidence Excerpts"), + ...evidence.map((chunk) => + p(`${chunk.id} | ${chunk.artifactName}:${chunk.lineStart} | ${chunk.text}`) + ) + ] + : []), ...claimParagraphs("Remediation", finding.remediation) ]; } @@ -237,15 +336,37 @@ export async function POST(request: Request) { const confirmedFindings = report.findings.filter((finding) => !isUnconfirmedFinding(finding)); const unconfirmedFindings = report.findings.filter(isUnconfirmedFinding); const unverifiedClaims = collectUnverifiedClaims(report, confirmedFindings); - const usedEvidence = Array.from(new Set(confirmedFindings.flatMap(findingEvidenceIds))).map((id) => chunkMap.get(id)).filter(Boolean).slice(0, 50) as EvidenceChunk[]; + const usedEvidence = Array.from(new Set(confirmedFindings.flatMap(findingEvidenceIds))) + .map((id) => chunkMap.get(id)) + .filter(Boolean) + .slice(0, 50) as EvidenceChunk[]; const findingsRows = [ - new TableRow({ children: ["ID", "Finding", "Severity", "CVSS", "Affected Asset"].map((item) => cell([p(item, { bold: true, color: MUTED })])) }), - ...confirmedFindings.map((finding) => new TableRow({ children: [finding.id, finding.title, finding.severity, finding.cvss, finding.affectedAssets.join(", ") || "N/A"].map((item) => cell([p(item)])) })) + new TableRow({ + children: ["ID", "Finding", "Severity", "CVSS", "Affected Asset"].map((item) => + cell([p(item, { bold: true, color: MUTED })]) + ) + }), + ...confirmedFindings.map( + (finding) => + new TableRow({ + children: [ + finding.id, + finding.title, + finding.severity, + finding.cvss, + finding.affectedAssets.join(", ") || "N/A" + ].map((item) => cell([p(item)])) + }) + ) ]; const riskRows = [ - new TableRow({ children: ["Rating", "CVSS", "Remediation Guidance"].map((item) => cell([p(item, { bold: true, color: MUTED })])) }), + new TableRow({ + children: ["Rating", "CVSS", "Remediation Guidance"].map((item) => + cell([p(item, { bold: true, color: MUTED })]) + ) + }), ...[ ["Critical", "9.0-10.0", "Immediate remediation or compensating control within 24-48 hours."], ["High", "7.0-8.9", "Prioritize remediation within 7 days."], @@ -259,19 +380,53 @@ export async function POST(request: Request) { styles: { default: { document: { run: { font: "Aptos", size: 22 } } }, paragraphStyles: [ - { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true, run: { bold: true, size: 36, color: INK } }, - { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true, run: { bold: true, size: 28, color: INK } } + { + id: "Heading1", + name: "Heading 1", + basedOn: "Normal", + next: "Normal", + quickFormat: true, + run: { bold: true, size: 36, color: INK } + }, + { + id: "Heading2", + name: "Heading 2", + basedOn: "Normal", + next: "Normal", + quickFormat: true, + run: { bold: true, size: 28, color: INK } + } ] }, sections: [ { properties: {}, children: [ - new Paragraph({ alignment: AlignmentType.CENTER, spacing: { after: 180 }, children: [new TextRun({ text: "Penetration Test Report", bold: true, size: 44, color: INK })] }), - new Paragraph({ alignment: AlignmentType.CENTER, spacing: { after: 520 }, children: [new TextRun({ text: report.project.clientName, bold: true, size: 40, color: RED })] }), + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { after: 180 }, + children: [new TextRun({ text: "Penetration Test Report", bold: true, size: 44, color: INK })] + }), + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { after: 520 }, + children: [new TextRun({ text: report.project.clientName, bold: true, size: 40, color: RED })] + }), table([ - new TableRow({ children: [cell([label("Project"), p(report.project.projectName)]), cell([label("Assessment"), p(report.project.assessmentType)]), cell([label("Classification"), p(report.project.classification)])] }), - new TableRow({ children: [cell([label("Prepared By"), p(report.project.preparedBy)]), cell([label("Lead Tester"), p(report.project.testerName)]), cell([label("Report Date"), p(report.project.reportDate)])] }) + new TableRow({ + children: [ + cell([label("Project"), p(report.project.projectName)]), + cell([label("Assessment"), p(report.project.assessmentType)]), + cell([label("Classification"), p(report.project.classification)]) + ] + }), + new TableRow({ + children: [ + cell([label("Prepared By"), p(report.project.preparedBy)]), + cell([label("Lead Tester"), p(report.project.testerName)]), + cell([label("Report Date"), p(report.project.reportDate)]) + ] + }) ]), h("Document Control"), specTable([ @@ -289,8 +444,12 @@ export async function POST(request: Request) { ["Assessment Period", `${report.project.startDate} to ${report.project.endDate}`], ["In Scope", report.project.scope], ["Out of Scope", report.project.outOfScope], - ...(report.project.rulesOfEngagement ? [["Rules of Engagement", report.project.rulesOfEngagement] as [string, string]] : []), - ...(report.project.toolsUsed ? [["Tools Used", report.project.toolsUsed] as [string, string]] : []) + ...(report.project.rulesOfEngagement + ? [["Rules of Engagement", report.project.rulesOfEngagement] as [string, string]] + : []), + ...(report.project.toolsUsed + ? [["Tools Used", report.project.toolsUsed] as [string, string]] + : []) ]), label("Methodology"), ...report.methodology.map((item) => bullet(item)), @@ -301,14 +460,22 @@ export async function POST(request: Request) { ...(unconfirmedFindings.length > 0 ? [ h("Items Requiring Validation"), - p("The following observations are not included as confirmed vulnerabilities because the supplied evidence does not prove exploitation."), - ...unconfirmedFindings.map((finding) => p(`${finding.id}: ${finding.title} - ${finding.readinessSummary || "Additional PoC required."}`)) + p( + "The following observations are not included as confirmed vulnerabilities because the supplied evidence does not prove exploitation." + ), + ...unconfirmedFindings.map((finding) => + p( + `${finding.id}: ${finding.title} - ${finding.readinessSummary || "Additional PoC required."}` + ) + ) ] : []), ...(unverifiedClaims.length > 0 ? [ h("Claims Pending Independent Verification"), - p("Verric's grounding pass could not independently confirm that the cited evidence supports the following statements. They have been removed from the polished body of this report and are listed here for reviewer attention."), + p( + "Verric's grounding pass could not independently confirm that the cited evidence supports the following statements. They have been removed from the polished body of this report and are listed here for reviewer attention." + ), unverifiedClaimsTable(unverifiedClaims) ] : []), @@ -320,13 +487,21 @@ export async function POST(request: Request) { label("Short Term"), ...report.remediationRoadmap.shortTerm.map((item) => bullet(item)), label("Medium / Long Term"), - ...[...report.remediationRoadmap.mediumTerm, ...report.remediationRoadmap.longTerm].map((item) => bullet(item)), + ...[...report.remediationRoadmap.mediumTerm, ...report.remediationRoadmap.longTerm].map((item) => + bullet(item) + ), h("Evidence Reference Index"), - p("The following evidence references were cited by the report findings. Raw tool output is summarized rather than dumped in full."), - ...usedEvidence.map((chunk) => p(`${chunk.id} | ${chunk.artifactName}:${chunk.lineStart} | ${chunk.text}`)), + p( + "The following evidence references were cited by the report findings. Raw tool output is summarized rather than dumped in full." + ), + ...usedEvidence.map((chunk) => + p(`${chunk.id} | ${chunk.artifactName}:${chunk.lineStart} | ${chunk.text}`) + ), ...imageParagraphs(artifacts || []), h("Disclaimer & Limitations"), - p("This report is based on a point-in-time review of the supplied evidence and project scope. It does not guarantee that all possible vulnerabilities were identified. Findings should be validated by the testing team and remediated according to organizational risk tolerance.") + p( + "This report is based on a point-in-time review of the supplied evidence and project scope. It does not guarantee that all possible vulnerabilities were identified. Findings should be validated by the testing team and remediated according to organizational risk tolerance." + ) ] } ] diff --git a/apps/web/src/app/api/export-pdf/route.tsx b/apps/web/src/app/api/export-pdf/route.tsx new file mode 100644 index 0000000..6ffcf49 --- /dev/null +++ b/apps/web/src/app/api/export-pdf/route.tsx @@ -0,0 +1,839 @@ +import React from "react"; +import { NextResponse } from "next/server"; +import { Document, Image, Page, StyleSheet, Text, View, renderToBuffer } from "@react-pdf/renderer"; +import { + type EvidenceArtifact, + type EvidenceChunk, + type Finding, + type ReportClaim, + type VerricReport +} from "@verric/core"; +import { getDb } from "@/lib/db"; +import { getBranding, getDefaultBranding } from "@verric/storage"; + +export const runtime = "nodejs"; + +// Optional branding overrides applied at render time. +interface BrandingPayload { + logoDataUrl?: string | null; + primaryColor?: string | null; + secondaryColor?: string | null; + accentColor?: string | null; + footerText?: string | null; + coverSubtitle?: string | null; +} + +const colors = { + navy: "#1f3a5f", + blue: "#2f5f95", + red: "#b42318", + amber: "#a15c07", + green: "#18794e", + gray900: "#111827", + gray700: "#374151", + gray500: "#6b7280", + gray200: "#e5e7eb", + gray100: "#f3f4f6", + white: "#ffffff" +}; + +const styles = StyleSheet.create({ + page: { + padding: 42, + paddingBottom: 56, + backgroundColor: colors.white, + color: colors.gray900, + fontFamily: "Helvetica", + fontSize: 9.5, + lineHeight: 1.45 + }, + cover: { padding: 54, backgroundColor: colors.white, color: colors.gray900, fontFamily: "Helvetica" }, + coverBar: { height: 7, backgroundColor: colors.navy, marginBottom: 72 }, + coverTitle: { fontSize: 34, fontFamily: "Helvetica-Bold", color: colors.navy, marginBottom: 10 }, + coverSub: { fontSize: 17, color: colors.gray700, marginBottom: 34 }, + h1: { fontSize: 20, fontFamily: "Helvetica-Bold", color: colors.navy, marginBottom: 10 }, + h2: { fontSize: 15, fontFamily: "Helvetica-Bold", color: colors.navy, marginBottom: 7, marginTop: 9 }, + h3: { fontSize: 12, fontFamily: "Helvetica-Bold", color: colors.gray900, marginBottom: 5 }, + label: { fontSize: 7.2, fontFamily: "Helvetica-Bold", color: colors.gray500, textTransform: "uppercase" }, + caption: { fontSize: 8, fontFamily: "Helvetica-Bold", color: colors.gray700 }, + small: { fontSize: 8, color: colors.gray500 }, + section: { marginBottom: 16 }, + rule: { borderBottomWidth: 1, borderBottomColor: colors.gray200, paddingBottom: 7, marginBottom: 12 }, + box: { borderWidth: 1, borderColor: colors.gray200, backgroundColor: colors.white }, + row: { flexDirection: "row" }, + cell: { flex: 1, padding: 8, borderRightWidth: 1, borderRightColor: colors.gray200 }, + lastCell: { flex: 1, padding: 8 }, + tableRow: { flexDirection: "row", borderBottomWidth: 1, borderBottomColor: colors.gray200 }, + th: { + padding: 6, + fontSize: 7, + fontFamily: "Helvetica-Bold", + color: colors.gray700, + backgroundColor: colors.gray100 + }, + td: { padding: 6, fontSize: 8.4 }, + finding: { borderWidth: 1, borderColor: colors.gray200, marginBottom: 18 }, + findingHead: { + padding: 12, + backgroundColor: colors.gray100, + borderBottomWidth: 1, + borderBottomColor: colors.gray200 + }, + findingId: { + fontSize: 8, + fontFamily: "Helvetica-Bold", + color: colors.blue, + letterSpacing: 1, + marginBottom: 4 + }, + findingTitle: { + fontSize: 15, + fontFamily: "Helvetica-Bold", + color: colors.navy, + lineHeight: 1.25, + marginBottom: 6 + }, + findingMeta: { fontSize: 8.5, color: colors.gray700 }, + specRow: { flexDirection: "row", borderBottomWidth: 1, borderBottomColor: colors.gray200 }, + specLabel: { + width: 120, + padding: 7, + backgroundColor: colors.gray100, + borderRightWidth: 1, + borderRightColor: colors.gray200, + fontSize: 7.2, + fontFamily: "Helvetica-Bold", + color: colors.gray700, + textTransform: "uppercase" + }, + specValue: { flexGrow: 1, flexShrink: 1, flexBasis: 0, padding: 7, fontSize: 8.6 }, + claim: { marginTop: 4, marginBottom: 6 }, + evidenceTag: { fontSize: 7.5, color: colors.gray500, marginTop: 2 }, + code: { + fontFamily: "Courier", + fontSize: 7.2, + backgroundColor: colors.gray100, + borderWidth: 1, + borderColor: colors.gray200, + padding: 6, + marginTop: 4 + }, + footer: { + position: "absolute", + left: 42, + right: 42, + bottom: 24, + borderTopWidth: 1, + borderTopColor: colors.gray200, + paddingTop: 6, + flexDirection: "row", + justifyContent: "space-between" + }, + screenshot: { + width: "100%", + maxHeight: 380, + objectFit: "contain", + borderWidth: 1, + borderColor: colors.gray200, + marginTop: 7 + } +}); + +function severityColor(severity: string) { + if (severity === "Critical" || severity === "High") return colors.red; + if (severity === "Medium" || severity === "Review") return colors.amber; + if (severity === "Low" || severity === "Informational") return colors.green; + return colors.gray700; +} + +function isUnconfirmedFinding(finding: Finding) { + const text = [ + finding.title, + finding.readinessSummary, + ...finding.proofOfConcept.map((claim) => claim.text) + ].join(" "); + return ( + /potential|candidate|unconfirmed|not confirmed|requires further|no successful payload|needs poc/i.test( + text + ) || + finding.readiness === "needs_poc" || + finding.readiness === "unsupported" + ); +} + +// In the polished client export, we keep claims that are grounded OR partially supported +// (partial = the evidence backs the gist but the wording goes slightly beyond it — still +// usable in a professional report). Only "flagged" / unsupported claims get pulled out. +function isVerified(claim: ReportClaim) { + return claim.status === "grounded" || claim.status === "needs_review"; +} + +// NOTE: kept for future use. Currently superseded by collectUnverifiedClaims + +// inline filters above. Underscore-prefixed so ESLint allows the unused export-style helper. +function _partitionClaims(claims: ReportClaim[]): { verified: ReportClaim[]; unverified: ReportClaim[] } { + return { + verified: claims.filter(isVerified), + unverified: claims.filter((claim) => !isVerified(claim)) + }; +} + +type UnverifiedRow = { + source: string; + text: string; + status: ReportClaim["status"]; + reason: string; +}; + +function collectUnverifiedClaims(report: VerricReport, confirmed: Finding[]): UnverifiedRow[] { + const rows: UnverifiedRow[] = []; + const push = (claim: ReportClaim, source: string) => { + if (isVerified(claim)) return; + rows.push({ + source, + text: claim.text, + status: claim.status, + reason: + claim.groundingNote || + (claim.status === "flagged" + ? "Cited evidence does not support this claim." + : "Cited evidence partially supports this claim.") + }); + }; + report.executiveSummary.forEach((claim) => push(claim, "Executive Summary")); + report.keyRecommendations.forEach((claim) => push(claim, "Key Recommendations")); + for (const finding of confirmed) { + finding.description.forEach((claim) => push(claim, `${finding.id} · Description`)); + finding.impact.forEach((claim) => push(claim, `${finding.id} · Impact`)); + finding.proofOfConcept.forEach((claim) => push(claim, `${finding.id} · Proof of Concept`)); + finding.remediation.forEach((claim) => push(claim, `${finding.id} · Remediation`)); + } + return rows; +} + +function findingEvidenceIds(finding: Finding) { + return Array.from( + new Set( + [...finding.description, ...finding.impact, ...finding.proofOfConcept, ...finding.remediation].flatMap( + (claim) => claim.evidenceIds || [] + ) + ) + ); +} + +function chunkMap(chunks: EvidenceChunk[]) { + return new Map(chunks.map((chunk) => [chunk.id, chunk])); +} + +function Footer({ report, branding }: { report: VerricReport; branding?: BrandingPayload }) { + const left = branding?.footerText || `${report.project.classification} · Penetration Test Report`; + return ( + + {left} + {report.project.clientName} + + ); +} + +function EvidenceRefs({ ids }: { ids: string[] }) { + return ids.length ? Evidence: {ids.slice(0, 8).join(", ")} : null; +} + +function ClaimList({ title, claims }: { title: string; claims: ReportClaim[] }) { + const verified = claims.filter(isVerified); + if (verified.length === 0) return null; + return ( + + {title} + {verified.map((claim) => ( + + {claim.text} + + + ))} + + ); +} + +function Cover({ report, branding }: { report: VerricReport; branding?: BrandingPayload }) { + const navy = branding?.primaryColor || colors.navy; + const subtitle = branding?.coverSubtitle || report.project.clientName; + return ( + + + {branding?.logoDataUrl ? ( + + ) : null} + Penetration Test Report + {subtitle} + + + + Project + {report.project.projectName} + + + Assessment Type + {report.project.assessmentType} + + + Classification + {report.project.classification} + + + + + Prepared By + {report.project.preparedBy} + + + Lead Tester + {report.project.testerName} + + + Report Date + {report.project.reportDate} + + + + + Overall Risk + + {report.overallRisk} + + + + ); +} + +function SummaryPage({ + report, + confirmed, + unconfirmed, + branding +}: { + report: VerricReport; + confirmed: Finding[]; + unconfirmed: Finding[]; + branding?: BrandingPayload; +}) { + const counts = ["Critical", "High", "Medium", "Low", "Informational"].map((severity) => ({ + severity, + count: confirmed.filter((finding) => finding.severity === severity).length + })); + + return ( + +