From 8a096d7f7bd6af9628b8a24968fb289ac9d3d844 Mon Sep 17 00:00:00 2001 From: Vantz Stockwell Date: Tue, 17 Mar 2026 08:19:29 -0400 Subject: [PATCH] =?UTF-8?q?Wraith=20v0.1.0=20=E2=80=94=20Desktop=20SSH=20+?= =?UTF-8?q?=20RDP=20+=20SFTP=20Client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Go + Wails v3 + Vue 3 + SQLite + FreeRDP3 (purego) 183 tests, 76 source files, 9,910 lines of code Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitea/workflows/build-release.yml | 266 ++ .gitignore | 29 + LICENSE | 21 + README.md | 242 + docs/FUTURE-FEATURES.md | 54 + docs/SECURITY-AUDIT-2026-03-14.md | 369 ++ docs/config-export.mobaconf | 304 ++ docs/karens-wraith-layout.png | Bin 0 -> 647378 bytes docs/moba1.png | Bin 0 -> 135381 bytes docs/moba2.png | Bin 0 -> 117561 bytes docs/plans/2026-03-14-test-suite-buildout.md | 1371 ++++++ docs/screenshots/wraith-final.png | Bin 0 -> 81409 bytes docs/spikes/multi-window-results.md | 129 + docs/spikes/rdp-frame-transport-results.md | 171 + .../plans/2026-03-12-wraith-build.md | 3931 +++++++++++++++++ .../2026-03-17-wraith-phase1-foundation.md | 2690 +++++++++++ .../2026-03-17-wraith-phase2-ssh-sftp.md | 487 ++ ...2026-03-12-vigilance-remote-lean-design.md | 614 +++ .../specs/2026-03-17-wraith-desktop-design.md | 982 ++++ docs/test-buildout-spec.md | 108 + frontend/index.html | 12 + frontend/package-lock.json | 2829 ++++++++++++ frontend/package.json | 39 + frontend/src/App.vue | 30 + frontend/src/assets/css/main.css | 29 + frontend/src/assets/css/terminal.css | 50 + .../src/components/common/CommandPalette.vue | 267 ++ .../src/components/common/ContextMenu.vue | 97 + .../src/components/common/HostKeyDialog.vue | 105 + .../src/components/common/ImportDialog.vue | 247 ++ frontend/src/components/common/StatusBar.vue | 65 + .../src/components/common/ThemePicker.vue | 200 + .../connections/ConnectionEditDialog.vue | 292 ++ .../src/components/editor/EditorWindow.vue | 229 + frontend/src/components/rdp/RdpView.vue | 382 ++ .../components/session/SessionContainer.vue | 61 + frontend/src/components/session/TabBar.vue | 113 + frontend/src/components/sftp/FileTree.vue | 165 + .../src/components/sftp/TransferProgress.vue | 72 + .../src/components/sidebar/ConnectionTree.vue | 196 + .../src/components/sidebar/SidebarToggle.vue | 34 + .../src/components/terminal/TerminalView.vue | 45 + frontend/src/composables/useRdp.ts | 379 ++ frontend/src/composables/useSftp.ts | 100 + frontend/src/composables/useTerminal.ts | 123 + frontend/src/env.d.ts | 7 + frontend/src/layouts/MainLayout.vue | 264 ++ frontend/src/layouts/UnlockLayout.vue | 122 + frontend/src/main.ts | 8 + frontend/src/stores/app.store.ts | 77 + frontend/src/stores/connection.store.ts | 95 + frontend/src/stores/session.store.ts | 96 + frontend/tsconfig.json | 19 + frontend/vite.config.ts | 13 + go.mod | 58 + go.sum | 197 + images/wraith-logo.png | Bin 0 -> 30489 bytes internal/app/app.go | 205 + internal/app/workspace.go | 66 + internal/app/workspace_test.go | 74 + internal/connections/search.go | 40 + internal/connections/search_test.go | 53 + internal/connections/service.go | 361 ++ internal/connections/service_test.go | 234 + internal/credentials/service.go | 408 ++ internal/credentials/service_test.go | 176 + internal/db/migrations.go | 34 + internal/db/migrations/001_initial.sql | 101 + internal/db/sqlite.go | 39 + internal/db/sqlite_test.go | 85 + internal/importer/mobaconf.go | 322 ++ internal/importer/mobaconf_test.go | 236 + internal/plugin/interfaces.go | 57 + internal/plugin/registry.go | 47 + internal/rdp/freerdp_factory.go | 14 + internal/rdp/freerdp_stub.go | 45 + internal/rdp/freerdp_windows.go | 289 ++ internal/rdp/input.go | 189 + internal/rdp/input_test.go | 227 + internal/rdp/mock_backend.go | 313 ++ internal/rdp/pixelbuffer.go | 103 + internal/rdp/pixelbuffer_test.go | 172 + internal/rdp/service.go | 172 + internal/rdp/service_test.go | 255 ++ internal/rdp/types.go | 52 + internal/session/manager.go | 96 + internal/session/manager_test.go | 64 + internal/session/session.go | 22 + internal/settings/service.go | 41 + internal/settings/service_test.go | 70 + internal/sftp/service.go | 238 + internal/sftp/service_test.go | 119 + internal/ssh/cwd.go | 128 + internal/ssh/cwd_test.go | 72 + internal/ssh/hostkey.go | 89 + internal/ssh/hostkey_test.go | 77 + internal/ssh/service.go | 259 ++ internal/ssh/service_test.go | 148 + internal/theme/builtins.go | 94 + internal/theme/service.go | 85 + internal/theme/service_test.go | 60 + internal/vault/service.go | 95 + internal/vault/service_test.go | 104 + main.go | 54 + 104 files changed, 25169 insertions(+) create mode 100644 .gitea/workflows/build-release.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/FUTURE-FEATURES.md create mode 100644 docs/SECURITY-AUDIT-2026-03-14.md create mode 100644 docs/config-export.mobaconf create mode 100644 docs/karens-wraith-layout.png create mode 100644 docs/moba1.png create mode 100644 docs/moba2.png create mode 100644 docs/plans/2026-03-14-test-suite-buildout.md create mode 100644 docs/screenshots/wraith-final.png create mode 100644 docs/spikes/multi-window-results.md create mode 100644 docs/spikes/rdp-frame-transport-results.md create mode 100644 docs/superpowers/plans/2026-03-12-wraith-build.md create mode 100644 docs/superpowers/plans/2026-03-17-wraith-phase1-foundation.md create mode 100644 docs/superpowers/plans/2026-03-17-wraith-phase2-ssh-sftp.md create mode 100644 docs/superpowers/specs/2026-03-12-vigilance-remote-lean-design.md create mode 100644 docs/superpowers/specs/2026-03-17-wraith-desktop-design.md create mode 100644 docs/test-buildout-spec.md create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/assets/css/main.css create mode 100644 frontend/src/assets/css/terminal.css create mode 100644 frontend/src/components/common/CommandPalette.vue create mode 100644 frontend/src/components/common/ContextMenu.vue create mode 100644 frontend/src/components/common/HostKeyDialog.vue create mode 100644 frontend/src/components/common/ImportDialog.vue create mode 100644 frontend/src/components/common/StatusBar.vue create mode 100644 frontend/src/components/common/ThemePicker.vue create mode 100644 frontend/src/components/connections/ConnectionEditDialog.vue create mode 100644 frontend/src/components/editor/EditorWindow.vue create mode 100644 frontend/src/components/rdp/RdpView.vue create mode 100644 frontend/src/components/session/SessionContainer.vue create mode 100644 frontend/src/components/session/TabBar.vue create mode 100644 frontend/src/components/sftp/FileTree.vue create mode 100644 frontend/src/components/sftp/TransferProgress.vue create mode 100644 frontend/src/components/sidebar/ConnectionTree.vue create mode 100644 frontend/src/components/sidebar/SidebarToggle.vue create mode 100644 frontend/src/components/terminal/TerminalView.vue create mode 100644 frontend/src/composables/useRdp.ts create mode 100644 frontend/src/composables/useSftp.ts create mode 100644 frontend/src/composables/useTerminal.ts create mode 100644 frontend/src/env.d.ts create mode 100644 frontend/src/layouts/MainLayout.vue create mode 100644 frontend/src/layouts/UnlockLayout.vue create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/stores/app.store.ts create mode 100644 frontend/src/stores/connection.store.ts create mode 100644 frontend/src/stores/session.store.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/vite.config.ts create mode 100644 go.mod create mode 100644 go.sum create mode 100644 images/wraith-logo.png create mode 100644 internal/app/app.go create mode 100644 internal/app/workspace.go create mode 100644 internal/app/workspace_test.go create mode 100644 internal/connections/search.go create mode 100644 internal/connections/search_test.go create mode 100644 internal/connections/service.go create mode 100644 internal/connections/service_test.go create mode 100644 internal/credentials/service.go create mode 100644 internal/credentials/service_test.go create mode 100644 internal/db/migrations.go create mode 100644 internal/db/migrations/001_initial.sql create mode 100644 internal/db/sqlite.go create mode 100644 internal/db/sqlite_test.go create mode 100644 internal/importer/mobaconf.go create mode 100644 internal/importer/mobaconf_test.go create mode 100644 internal/plugin/interfaces.go create mode 100644 internal/plugin/registry.go create mode 100644 internal/rdp/freerdp_factory.go create mode 100644 internal/rdp/freerdp_stub.go create mode 100644 internal/rdp/freerdp_windows.go create mode 100644 internal/rdp/input.go create mode 100644 internal/rdp/input_test.go create mode 100644 internal/rdp/mock_backend.go create mode 100644 internal/rdp/pixelbuffer.go create mode 100644 internal/rdp/pixelbuffer_test.go create mode 100644 internal/rdp/service.go create mode 100644 internal/rdp/service_test.go create mode 100644 internal/rdp/types.go create mode 100644 internal/session/manager.go create mode 100644 internal/session/manager_test.go create mode 100644 internal/session/session.go create mode 100644 internal/settings/service.go create mode 100644 internal/settings/service_test.go create mode 100644 internal/sftp/service.go create mode 100644 internal/sftp/service_test.go create mode 100644 internal/ssh/cwd.go create mode 100644 internal/ssh/cwd_test.go create mode 100644 internal/ssh/hostkey.go create mode 100644 internal/ssh/hostkey_test.go create mode 100644 internal/ssh/service.go create mode 100644 internal/ssh/service_test.go create mode 100644 internal/theme/builtins.go create mode 100644 internal/theme/service.go create mode 100644 internal/theme/service_test.go create mode 100644 internal/vault/service.go create mode 100644 internal/vault/service_test.go create mode 100644 main.go diff --git a/.gitea/workflows/build-release.yml b/.gitea/workflows/build-release.yml new file mode 100644 index 0000000..57c0c0f --- /dev/null +++ b/.gitea/workflows/build-release.yml @@ -0,0 +1,266 @@ +# ============================================================================= +# Wraith — Build & Sign Release +# ============================================================================= +# Builds the Wails v3 desktop app for Windows amd64, cross-compiles FreeRDP3 +# from source via MinGW, signs everything with Azure Key Vault EV cert, +# then uploads to SeaweedFS. +# +# Trigger: push a tag matching v* (e.g. v1.0.0) or run manually. +# +# Required secrets: +# AZURE_TENANT_ID — Azure AD tenant +# AZURE_CLIENT_ID — Service principal client ID +# AZURE_CLIENT_SECRET — Service principal secret +# AZURE_KEY_VAULT_URL — e.g. https://my-vault.vault.azure.net +# AZURE_CERT_NAME — Certificate/key name in the vault +# GIT_TOKEN — PAT for cloning private repo +# ============================================================================= + +name: Build & Sign Wraith + +on: + push: + tags: + - 'v*' + workflow_dispatch: + +jobs: + build-and-sign: + name: Build Windows + Sign + runs-on: linux + steps: + # --------------------------------------------------------------- + # Checkout + # --------------------------------------------------------------- + - name: Checkout code + run: | + git clone --depth 1 --branch ${{ github.ref_name }} \ + https://${{ secrets.GIT_TOKEN }}@git.command.vigilcyber.com/vstockwell/wraith.git . + + # --------------------------------------------------------------- + # Extract version from tag + # --------------------------------------------------------------- + - name: Get version from tag + id: version + run: | + TAG=$(echo "${{ github.ref_name }}" | sed 's/^v//') + echo "version=${TAG}" >> $GITHUB_OUTPUT + echo "Building version: ${TAG}" + + # --------------------------------------------------------------- + # Install toolchain + # --------------------------------------------------------------- + - name: Install build dependencies + run: | + apt-get update -qq + apt-get install -y -qq \ + mingw-w64 mingw-w64-tools binutils-mingw-w64 \ + cmake ninja-build nasm meson \ + default-jre-headless \ + python3 awscli + + # Node.js + if ! command -v node >/dev/null 2>&1; then + curl -fsSL https://deb.nodesource.com/setup_22.x | bash - + apt-get install -y -qq nodejs + fi + + echo "=== Toolchain versions ===" + go version + node --version + x86_64-w64-mingw32-gcc --version | head -1 + cmake --version | head -1 + + # =============================================================== + # FreeRDP3 — Cross-compile from source via MinGW + # =============================================================== + - name: Build FreeRDP3 for Windows (MinGW cross-compile) + run: | + FREERDP_VERSION="3.24.0" + echo "=== Building FreeRDP ${FREERDP_VERSION} for Windows amd64 via MinGW ===" + + # Download FreeRDP source + curl -sSL -o /tmp/freerdp.tar.gz \ + "https://github.com/FreeRDP/FreeRDP/archive/refs/tags/${FREERDP_VERSION}.tar.gz" + tar -xzf /tmp/freerdp.tar.gz -C /tmp + cd /tmp/FreeRDP-${FREERDP_VERSION} + + # Create MinGW toolchain file + cat > /tmp/mingw-toolchain.cmake << 'TCEOF' + set(CMAKE_SYSTEM_NAME Windows) + set(CMAKE_SYSTEM_PROCESSOR AMD64) + set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) + set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) + set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + TCEOF + + # Configure — minimal client-only build (no server, no extras) + cmake -B build -G Ninja \ + -DCMAKE_TOOLCHAIN_FILE=/tmp/mingw-toolchain.cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/tmp/freerdp-install \ + -DBUILD_SHARED_LIBS=ON \ + -DWITH_CLIENT=ON \ + -DWITH_SERVER=OFF \ + -DWITH_SHADOW=OFF \ + -DWITH_PROXY=OFF \ + -DWITH_SAMPLE=OFF \ + -DWITH_PLATFORM_SERVER=OFF \ + -DWITH_WINPR_TOOLS=OFF \ + -DWITH_FFMPEG=OFF \ + -DWITH_SWSCALE=OFF \ + -DWITH_CAIRO=OFF \ + -DWITH_CUPS=OFF \ + -DWITH_PULSE=OFF \ + -DWITH_ALSA=OFF \ + -DWITH_OSS=OFF \ + -DWITH_WAYLAND=OFF \ + -DWITH_X11=OFF \ + -DCHANNEL_URBDRC=OFF \ + -DWITH_OPENH264=OFF + + # Build + cmake --build build --parallel $(nproc) + cmake --install build + + echo "=== FreeRDP3 DLLs built ===" + ls -la /tmp/freerdp-install/bin/*.dll 2>/dev/null || ls -la /tmp/freerdp-install/lib/*.dll 2>/dev/null || echo "Checking build output..." + find /tmp/freerdp-install -name "*.dll" -type f + + - name: Stage FreeRDP3 DLLs + run: | + mkdir -p dist + + # Copy all FreeRDP DLLs (MinGW produces lib-prefixed names) + find /tmp/freerdp-install -name "*.dll" -type f -exec cp {} dist/ \; + + echo "=== Staged DLLs ===" + ls -la dist/*.dll 2>/dev/null || echo "No DLLs found — FreeRDP build may have failed" + + # =============================================================== + # Build Wraith + # =============================================================== + - name: Build frontend + run: | + cd frontend + npm ci + npm run build + echo "Frontend build complete:" + ls -la dist/ + + - name: Build wraith.exe (Windows amd64) + run: | + VERSION="${{ steps.version.outputs.version }}" + echo "=== Cross-compiling wraith.exe for Windows amd64 ===" + + GOOS=windows GOARCH=amd64 CGO_ENABLED=0 \ + go build \ + -ldflags="-s -w -X main.version=${VERSION}" \ + -o dist/wraith.exe \ + . + + ls -la dist/wraith.exe + + # =============================================================== + # Code signing — jsign + Azure Key Vault (EV cert) + # =============================================================== + - name: Install jsign + run: | + JSIGN_VERSION="7.0" + curl -sSL -o /usr/local/bin/jsign.jar \ + "https://github.com/ebourg/jsign/releases/download/${JSIGN_VERSION}/jsign-${JSIGN_VERSION}.jar" + + - name: Get Azure Key Vault access token + id: azure-token + run: | + TOKEN=$(curl -s -X POST \ + "https://login.microsoftonline.com/${{ secrets.AZURE_TENANT_ID }}/oauth2/v2.0/token" \ + -d "client_id=${{ secrets.AZURE_CLIENT_ID }}" \ + -d "client_secret=${{ secrets.AZURE_CLIENT_SECRET }}" \ + -d "scope=https://vault.azure.net/.default" \ + -d "grant_type=client_credentials" \ + | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])") + echo "::add-mask::${TOKEN}" + echo "token=${TOKEN}" >> $GITHUB_OUTPUT + + - name: Sign all Windows binaries + run: | + echo "=== Signing all .exe and .dll files with EV certificate ===" + for binary in dist/*.exe dist/*.dll; do + [ -f "$binary" ] || continue + echo "Signing: $binary" + java -jar /usr/local/bin/jsign.jar \ + --storetype AZUREKEYVAULT \ + --keystore "${{ secrets.AZURE_KEY_VAULT_URL }}" \ + --storepass "${{ steps.azure-token.outputs.token }}" \ + --alias "${{ secrets.AZURE_CERT_NAME }}" \ + --tsaurl http://timestamp.digicert.com \ + --tsmode RFC3161 \ + "$binary" + echo "Signed: $binary" + done + + # =============================================================== + # Version manifest + # =============================================================== + - name: Create version.json + run: | + VERSION="${{ steps.version.outputs.version }}" + EXE_SHA=$(sha256sum dist/wraith.exe | awk '{print $1}') + + # Build DLL manifest + DLL_ENTRIES="" + for dll in dist/*.dll; do + [ -f "$dll" ] || continue + DLL_NAME=$(basename "$dll") + DLL_SHA=$(sha256sum "$dll" | awk '{print $1}') + DLL_ENTRIES="${DLL_ENTRIES} \"${DLL_NAME}\": \"${DLL_SHA}\", + " + done + + cat > dist/version.json << EOF + { + "version": "${VERSION}", + "filename": "wraith.exe", + "sha256": "${EXE_SHA}", + "platform": "windows", + "architecture": "amd64", + "released": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")", + "signed": true, + "dlls": { + ${DLL_ENTRIES} "_note": "All DLLs are EV code-signed" + } + } + EOF + + echo "=== version.json ===" + cat dist/version.json + + # =============================================================== + # Upload release artifacts + # =============================================================== + - name: Upload release artifacts + run: | + VERSION="${{ steps.version.outputs.version }}" + ENDPOINT="https://files.command.vigilcyber.com" + + echo "=== Uploading Wraith ${VERSION} ===" + + # Versioned path + aws s3 cp dist/ "s3://agents/wraith/${VERSION}/windows/amd64/" \ + --recursive --endpoint-url "$ENDPOINT" --no-sign-request + + # Latest path + aws s3 sync dist/ "s3://agents/wraith/latest/windows/amd64/" \ + --delete --endpoint-url "$ENDPOINT" --no-sign-request + + echo "=== Upload complete ===" + echo "Versioned: ${ENDPOINT}/agents/wraith/${VERSION}/windows/amd64/" + echo "Latest: ${ENDPOINT}/agents/wraith/latest/windows/amd64/" + echo "" + echo "=== Contents ===" + ls -la dist/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ef2cef --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Go +bin/ +dist/ +*.exe + +# Frontend +frontend/node_modules/ +frontend/dist/ +frontend/bindings/ + +# Wails +build/bin/ + +# IDE +.vscode/ +.idea/ + +# OS +.DS_Store +Thumbs.db + +# App data +*.db +*.db-wal +*.db-shm + +# Superpowers +.superpowers/ +.claude/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..16204ad --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Vantz Stockwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..03fa0e3 --- /dev/null +++ b/README.md @@ -0,0 +1,242 @@ +

+ Wraith +

+ +

Wraith

+ +

+ Native desktop SSH + RDP + SFTP client — a MobaXTerm replacement built with Go and Vue. +

+ +

+ + Go + Wails v3 + Vue 3 + License +

+ +--- + +## Features + +- **Multi-tabbed SSH terminal** with xterm.js + WebGL rendering +- **SFTP sidebar** on every SSH session (MobaXTerm's killer feature) -- same SSH connection, separate channel +- **RDP** via FreeRDP3 dynamic linking (purego, no CGO) +- **Encrypted vault** -- master password derived with Argon2id, secrets sealed with AES-256-GCM +- **Connection manager** with hierarchical groups, tags, color labels, and full-text search +- **7 built-in terminal themes** -- Dracula, Nord, Monokai, One Dark, Solarized Dark, Gruvbox Dark, MobaXTerm Classic +- **Tab detach / reattach** -- sessions live in the Go backend; tabs can be torn off into separate windows and reattached without dropping the connection +- **MobaXTerm import** -- plugin interface for `.mobaconf` and other formats +- **Command palette** (Ctrl+K) for quick connection search and actions +- **Single binary** -- ships as `wraith.exe` + `freerdp3.dll`, no Docker, no database server + +## Tech Stack + +### Backend (Go) + +| Component | Technology | Purpose | +|-----------|-----------|---------| +| Framework | Wails v3 | Desktop shell, multi-window, type-safe Go-to-JS bindings | +| SSH | `golang.org/x/crypto/ssh` | SSH client, PTY, key/password auth | +| SFTP | `github.com/pkg/sftp` | Remote filesystem over SSH channel | +| RDP | FreeRDP3 via `purego` | RDP protocol, bitmap rendering | +| Database | SQLite via `modernc.org/sqlite` (pure Go) | Connections, credentials, settings, themes | +| Encryption | AES-256-GCM + Argon2id | Vault encryption at rest | + +### Frontend (Vue 3 in WebView2) + +| Component | Technology | Purpose | +|-----------|-----------|---------| +| Framework | Vue 3 (Composition API) | UI framework | +| Terminal | xterm.js 5.x + WebGL addon | SSH terminal emulator | +| CSS | Tailwind CSS 4 | Utility-first styling | +| Components | Naive UI | Tree, tabs, modals, dialogs | +| State | Pinia | Reactive stores for sessions, connections, app state | +| Build | Vite 6 | Frontend build tooling | + +## Prerequisites + +| Tool | Version | Install | +|------|---------|---------| +| Go | 1.22+ | [go.dev/dl](https://go.dev/dl/) | +| Node.js | 20+ | [nodejs.org](https://nodejs.org/) | +| Wails CLI | v3 | `go install github.com/wailsapp/wails/v3/cmd/wails3@latest` | + +## Quick Start + +```bash +# Clone +git clone https://github.com/vstockwell/wraith.git +cd wraith + +# Install frontend dependencies +cd frontend && npm install && cd .. + +# Run in dev mode (hot-reload frontend + Go backend) +wails3 dev +``` + +The app opens a 1400x900 window. On first launch you will be prompted to create a master password for the vault. + +## Building + +```bash +# Production build for Windows +wails3 build + +# Output: build/bin/wraith.exe +``` + +The build embeds the compiled frontend (`frontend/dist`) into the Go binary via `//go:embed`. Ship `wraith.exe` alongside `freerdp3.dll` for RDP support. + +## Project Structure + +``` +wraith/ + main.go # Entry point -- Wails app setup, service registration + go.mod # Go module (github.com/vstockwell/wraith) + internal/ + app/ + app.go # WraithApp -- wires all services, vault create/unlock + db/ + sqlite.go # SQLite open with WAL mode, busy timeout, FK enforcement + migrations.go # Embedded SQL migration runner + migrations/ + 001_initial.sql # Schema: groups, connections, credentials, ssh_keys, + # themes, host_keys, connection_history, settings + vault/ + service.go # Argon2id key derivation + AES-256-GCM encrypt/decrypt + connections/ + service.go # Connection and Group CRUD (hierarchical tree) + search.go # Full-text search + tag filtering via json_each() + settings/ + service.go # Key-value settings store (vault salt, preferences) + theme/ + builtins.go # 7 built-in theme definitions + service.go # Theme CRUD + idempotent seeding + session/ + session.go # SessionInfo struct + state machine (connecting/connected/detached) + manager.go # Concurrent session manager -- create, detach, reattach, 32-session cap + plugin/ + interfaces.go # ProtocolHandler + Importer + Session interfaces + registry.go # Plugin registry -- register/lookup protocol handlers and importers + frontend/ + package.json # Vue 3, Pinia, Naive UI, Tailwind CSS, Vite + vite.config.ts # Vite + Vue + Tailwind plugin config + src/ + main.ts # App bootstrap -- createApp, Pinia, mount + App.vue # Root component + layouts/ + MainLayout.vue # Sidebar + tab bar + session area + status bar + UnlockLayout.vue # Master password entry screen + components/ + sidebar/ + ConnectionTree.vue # Hierarchical connection/group tree + SidebarToggle.vue # Collapse/expand sidebar + session/ + TabBar.vue # Draggable session tabs + SessionContainer.vue # Active session viewport + common/ + StatusBar.vue # Bottom status bar + stores/ + app.store.ts # Global app state (sidebar, vault status) + connection.store.ts # Connection + group state + session.store.ts # Active sessions state + images/ + wraith-logo.png # Application logo +``` + +## Architecture + +``` +Go Backend Wails v3 Bindings Vue 3 Frontend +(services + business logic) (type-safe Go <-> JS) (WebView2) + | + WraithApp ─────────────────────────┼──────────────> Pinia Stores + |-- VaultService | |-- app.store + |-- ConnectionService | |-- connection.store + |-- ThemeService | |-- session.store + |-- SettingsService | | + |-- SessionManager | Vue Components + |-- PluginRegistry | |-- MainLayout + | |-- ConnectionTree + SQLite (WAL mode) | |-- TabBar + wraith.db | |-- SessionContainer + %APPDATA%\Wraith\ | |-- StatusBar +``` + +**How it fits together:** + +1. `main.go` creates a `WraithApp` and registers Go services as Wails bindings. +2. Wails generates type-safe JavaScript bindings so the Vue frontend can call Go methods directly. +3. The Vue frontend uses Pinia stores to manage reactive state, calling into Go services for all data operations. +4. All secrets (passwords, SSH keys) are encrypted with AES-256-GCM before being written to SQLite. The encryption key is derived from the master password using Argon2id and is never persisted. +5. Sessions are managed by the Go `SessionManager` -- they are decoupled from windows, enabling tab detach/reattach without dropping connections. + +**Data storage:** SQLite with WAL mode at `%APPDATA%\Wraith\wraith.db` (Windows) or `~/.local/share/wraith/wraith.db` (Linux/macOS dev). Foreign keys enforced, 5-second busy timeout. + +## Plugin Development + +Wraith uses a plugin registry with two interfaces: `ProtocolHandler` for new connection protocols and `Importer` for loading connections from external tools. + +### Implementing a ProtocolHandler + +```go +package myplugin + +import "github.com/vstockwell/wraith/internal/plugin" + +type MyProtocol struct{} + +func (p *MyProtocol) Name() string { return "myproto" } + +func (p *MyProtocol) Connect(config map[string]interface{}) (plugin.Session, error) { + // Establish connection, return a Session +} + +func (p *MyProtocol) Disconnect(sessionID string) error { + // Clean up resources +} +``` + +### Implementing an Importer + +```go +package myplugin + +import "github.com/vstockwell/wraith/internal/plugin" + +type MyImporter struct{} + +func (i *MyImporter) Name() string { return "myformat" } +func (i *MyImporter) FileExtensions() []string { return []string{".myconf"} } +func (i *MyImporter) Parse(data []byte) (*plugin.ImportResult, error) { + // Parse file bytes into ImportResult (groups, connections, host keys, theme) +} +``` + +### Registering Plugins + +Register handlers and importers with the plugin registry during app initialization: + +```go +app.Plugins.RegisterProtocol(&myplugin.MyProtocol{}) +app.Plugins.RegisterImporter(&myplugin.MyImporter{}) +``` + +The `ImportResult` struct supports groups, connections, host keys, and an optional theme -- everything needed to migrate from another tool in a single import. + +## Contributing + +1. Fork the repository +2. Create a feature branch (`git checkout -b feat/my-feature`) +3. Make your changes +4. Run tests: `go test ./...` +5. Run frontend checks: `cd frontend && npm run build` +6. Commit and push your branch +7. Open a Pull Request + +## License + +[MIT](LICENSE) -- Copyright (c) 2026 Vantz Stockwell diff --git a/docs/FUTURE-FEATURES.md b/docs/FUTURE-FEATURES.md new file mode 100644 index 0000000..3755a6b --- /dev/null +++ b/docs/FUTURE-FEATURES.md @@ -0,0 +1,54 @@ +# Vigilance Remote — Future Features + +Remaining spec items not yet built. Foundation is solid — all items below are additive, no rearchitecting required. + +--- + +## Priority 1 — Power User + +1. **Split panes** — Horizontal and vertical splits within a single tab (xterm.js instances in a flex grid) +2. **Session recording/playback** — asciinema-compatible casts for SSH, Guacamole native for RDP. Replay in browser. Audit trail for MSP compliance. +3. **Saved snippets/macros** — Quick-execute saved commands/scripts. Click to paste into active terminal. + +## Priority 2 — MSP / Enterprise + +4. **Jump hosts / bastion** — Configure SSH proxy/jump hosts for reaching targets behind firewalls (ProxyJump chain support) +5. **Port forwarding manager** — Graphical SSH tunnel manager: local, remote, and dynamic forwarding +6. **Entra ID SSO** — One-click Microsoft Entra ID integration (same pattern as Vigilance HQ) +7. **Client-scoped access** — MSP multi-tenancy: technicians see only the hosts for clients they're assigned to +8. **Shared connections** — Admins define connection templates. Technicians connect without seeing credentials. + +## Priority 3 — Audit & Compliance + +9. **Command-level audit logging** — Every command, file transfer logged with user, timestamp, duration (currently connection-level only) +10. **Session sharing** — Share a live terminal session with a colleague (read-only or collaborative) + +## Priority 4 — File Transfer + +11. **Dual-pane SFTP** — Optional second SFTP panel for server-to-server file operations (drag between panels) +12. **Transfer queue** — Background upload/download queue with progress bars, pause/resume, retry + +## Priority 5 — RDP Enhancements + +13. **Multi-monitor RDP** — Support for multiple virtual displays +14. **RDP file transfer** — Upload/download via Guacamole's built-in drive redirection + +## Priority 6 — Auth Hardening + +15. **FIDO2 / hardware key auth** — WebAuthn support for login and SSH +16. **SSH agent forwarding** — Forward local SSH agent to remote host + +--- + +## Already Built (exceeds spec) + +- SSH terminal (xterm.js + ssh2 + WebSocket proxy + WebGL) +- RDP (guacd + guacamole-common-js + display.scale()) +- SFTP sidebar (auto-open, CWD following via OSC 7, drag-and-drop upload) +- Monaco file editor (fullscreen overlay with syntax highlighting) +- Connection manager (hosts, groups, quick connect, search, tags, colors) +- Credential vault (AES-256-GCM + **Argon2id key derivation**) +- Multi-tab sessions + Home navigation +- Terminal theming (6+ themes with visual picker) +- Multi-user with admin/user roles + per-user data isolation +- User management admin UI diff --git a/docs/SECURITY-AUDIT-2026-03-14.md b/docs/SECURITY-AUDIT-2026-03-14.md new file mode 100644 index 0000000..b02e341 --- /dev/null +++ b/docs/SECURITY-AUDIT-2026-03-14.md @@ -0,0 +1,369 @@ +# Wraith Remote — Security Audit Report + +**Date:** 2026-03-14 +**Auditor:** Claude (Opus 4.6) — secure-code-guardian + security-reviewer + ISO 27001 frameworks +**Scope:** Full-stack — Auth, Vault, WebSocket/SSH/SFTP/RDP, Frontend, Infrastructure, ISO 27001 gap assessment +**Codebase:** RDP-SSH-Client (Nuxt 3 + NestJS + guacd) + +--- + +## Executive Summary + +**54 unique findings** across 4 audit domains after deduplication. + +| Severity | Count | +|----------|-------| +| CRITICAL | 8 | +| HIGH | 16 | +| MEDIUM | 18 | +| LOW | 12 | + +The platform has a solid encryption foundation (Argon2id vault is well-implemented) but has significant gaps in transport security, session management, infrastructure hardening, and real-time channel authorization. The most urgent issues are **unauthenticated guacd exposure**, **JWT in localStorage/URLs**, and **missing session ownership checks on WebSocket channels**. + +--- + +## CRITICAL Findings (8) + +### C-1. guacd exposed on all interfaces via `network_mode: host` +**Location:** `docker-compose.yml:23` +**Domain:** Infrastructure + +guacd runs with `network_mode: host` and binds to `0.0.0.0:4822`. guacd is an **unauthenticated** service — anyone who can reach port 4822 can initiate RDP/VNC connections to any host reachable from the Docker host. This completely bypasses all application-level authentication. + +**Impact:** Full unauthenticated RDP/VNC access to every target host in the environment. + +**Fix:** Remove `network_mode: host`. Place guacd on the internal Docker network. Bind to `127.0.0.1`. The app container connects via the Docker service name `guacd` over the internal network. + +--- + +### C-2. JWT stored in localStorage (XSS → full account takeover) +**Location:** `frontend/stores/auth.store.ts:19,42` +**Domain:** Auth / Frontend + +`wraith_token` JWT stored in `localStorage`. Any XSS payload, browser extension, or injected script can read it. The token has a 7-day lifetime with no revocation mechanism — a stolen token is valid for up to a week with no way to invalidate it. + +**Impact:** Single XSS vulnerability → 7-day persistent access to the victim's account, including all SSH/RDP sessions and stored credentials. + +**Fix:** Issue JWT via `Set-Cookie: httpOnly; Secure; SameSite=Strict`. Remove all `localStorage` token operations. Browser automatically attaches the cookie to every request. + +--- + +### C-3. JWT passed in WebSocket URL query parameters +**Location:** `backend/src/auth/ws-auth.guard.ts:11-13`, all three WS gateways +**Domain:** Auth / WebSocket + +All WebSocket connections (`/api/ws/terminal`, `/api/ws/sftp`, `/api/ws/rdp`) accept JWT via `?token=` in the URL. Query parameters are logged by: web server access logs, browser history, Referrer headers, network proxies, and the application itself (`main.ts:75` logs `req.url`). + +**Impact:** JWT exposure in every log and monitoring system in the path. Combined with C-2, this creates multiple extraction vectors for a 7-day-lived credential. + +**Fix:** Issue short-lived (30-second) single-use WebSocket tickets via an authenticated REST endpoint. Frontend exchanges JWT for a ticket, connects WS with `?ticket=`. Server validates and destroys the ticket on use. + +--- + +### C-4. No HTTPS/TLS anywhere in the stack +**Location:** `docker-compose.yml`, `backend/src/main.ts` +**Domain:** Infrastructure + +No TLS termination configured. No nginx reverse proxy. No `helmet()` middleware. The application serves over plain HTTP. JWT tokens, SSH passwords, and TOTP codes all transit in cleartext. + +**Impact:** Any network observer (same Wi-Fi, ISP, network tap) can intercept credentials, tokens, and terminal data. + +**Fix:** Add nginx with TLS termination in front of the app. Install `helmet()` in NestJS for security headers (HSTS, X-Frame-Options, X-Content-Type-Options). Enforce HTTPS-only. + +--- + +### C-5. SSH host key verification auto-accepts all keys (MITM blind spot) +**Location:** `terminal.gateway.ts:61`, `ssh-connection.service.ts:98-119` +**Domain:** SSH + +`hostVerifier` callback returns `true` unconditionally. New fingerprints are silently accepted. **Changed** fingerprints (active MITM) are also silently accepted and overwrite the stored fingerprint. + +**Impact:** Man-in-the-middle attacker between the Wraith server and SSH target is completely invisible. Attacker gets the decrypted credentials and a live shell. + +**Fix:** Block connections to hosts with changed fingerprints. Require explicit user acceptance via a WS round-trip for new hosts. Never auto-accept changed fingerprints. + +--- + +### C-6. SFTP gateway has no session ownership check (horizontal privilege escalation) +**Location:** `sftp.gateway.ts:36-215` +**Domain:** SFTP / Authorization + +`SftpGateway.handleMessage()` looks up sessions by caller-supplied `sessionId` without verifying the requesting WebSocket client owns that session. User B can supply User A's `sessionId` and get full filesystem access on User A's server. + +**Impact:** Any authenticated user can read/write/delete files on any other user's active SSH session. + +**Fix:** Maintain a `clientSessions` map in `SftpGateway` (same pattern as `TerminalGateway`). Verify session ownership before every SFTP operation. + +--- + +### C-7. Raw Guacamole instructions forwarded to guacd without validation +**Location:** `rdp.gateway.ts:43-47` +**Domain:** RDP + +When `msg.type === 'guac'`, raw `msg.instruction` is written directly to the guacd TCP socket. Zero parsing, validation, or opcode whitelisting. The Guacamole protocol supports `file`, `put`, `pipe`, `disconnect`, and other instructions. + +**Impact:** Authenticated user can inject arbitrary Guacamole protocol instructions — write files via guacd file transfer, crash guacd via malformed instructions, or cause protocol desync. + +**Fix:** Parse incoming instructions via `guacamole.service.ts` `decode()`. Whitelist permitted opcodes (`input`, `mouse`, `key`, `size`, `sync`, `disconnect`). Enforce per-message size limit. Reject anything that doesn't parse. + +--- + +### C-8. PostgreSQL port exposed to host network +**Location:** `docker-compose.yml:27` +**Domain:** Infrastructure + +`ports: ["4211:5432"]` maps PostgreSQL to the host. Without a host-level firewall rule, the database is network-accessible. Contains encrypted credentials, SSH private keys, TOTP secrets, password hashes. + +**Impact:** Direct database access from the network. Even with password auth, the attack surface is unnecessary. + +**Fix:** Remove the `ports` mapping. Only the app container needs DB access via the internal Docker network. Use `docker exec` for admin access. + +--- + +## HIGH Findings (16) + +### H-1. 7-day JWT with no revocation mechanism +**Location:** `backend/src/auth/auth.module.ts:14` +**Domain:** Auth + +JWTs signed with 7-day expiry. No token blocklist, no session table, no refresh token pattern. Admin password reset, TOTP reset, and role changes do not invalidate existing tokens. + +**Fix:** Short-lived access token (15min) + refresh token in httpOnly cookie. Or: Redis-backed blocklist checked on every request. + +### H-2. RDP certificate verification hardcoded to disabled +**Location:** `rdp.gateway.ts:90`, `guacamole.service.ts:142` +**Domain:** RDP + +`ignoreCert: true` hardcoded unconditionally. Every RDP connection accepts any certificate — MITM attacks are invisible. + +**Fix:** Store `ignoreCert` as a per-host setting (default `false`). Surface a UI warning when enabled. + +### H-3. TOTP secret stored as plaintext in database +**Location:** `users` table, `totp_secret` column +**Domain:** Auth / Vault + +TOTP secrets stored unencrypted. If the database is compromised (C-8 makes this plausible), attacker can generate valid TOTP codes for every user with 2FA enabled, completely defeating the second factor. + +**Fix:** Encrypt TOTP secrets using the vault's `EncryptionService` (Argon2id v2) before storage. Decrypt only when validating a TOTP code. + +### H-4. SSH private key material logged in cleartext +**Location:** `ssh-connection.service.ts:126-129` +**Domain:** SSH / Logging + +First 40 characters of decrypted private key, key length, and passphrase existence boolean logged to stdout. Docker routes stdout to `docker logs`, which may be shipped to external log aggregation. + +**Fix:** Remove lines 126-129 entirely. Log only key type and fingerprint. + +### H-5. Terminal keystroke data logged (passwords in sudo prompts) +**Location:** `terminal.gateway.ts:31` +**Domain:** WebSocket / Logging + +`JSON.stringify(msg).substring(0, 200)` logs raw terminal keystrokes including passwords typed at `sudo` prompts. 200-char truncation still captures most passwords. + +**Fix:** For `msg.type === 'data'`, log only `{ type: 'data', sessionId, bytes: msg.data?.length }`. + +### H-6. No rate limiting on authentication endpoints +**Location:** Entire backend — no throttler installed +**Domain:** Auth / Infrastructure + +No `@nestjs/throttler`, no `express-rate-limit`. Login endpoint accepts unlimited attempts. Combined with 6-character minimum password = viable online brute-force. + +**Fix:** Install `@nestjs/throttler`. Apply tight limit on auth endpoints (10 req/min/IP). Add account lockout after repeated failures. + +### H-7. Container runs as root +**Location:** `Dockerfile:19-28` +**Domain:** Infrastructure + +Final Docker stage runs as `root`. Any code execution vulnerability (path traversal, injection) gives root access inside the container. + +**Fix:** Add `RUN addgroup -S wraith && adduser -S wraith -G wraith` and `USER wraith` before `CMD`. + +### H-8. Timing attack on login (bcrypt comparison) +**Location:** `auth.service.ts` login handler +**Domain:** Auth + +Failed login for non-existent user returns faster than for existing user (skips bcrypt comparison). Enables username enumeration via timing analysis. + +**Fix:** Always run `bcrypt.compare()` against a dummy hash when user not found, ensuring constant-time response. + +### H-9. bcrypt cost factor is 10 (below modern recommendations) +**Location:** `auth.service.ts` +**Domain:** Auth + +bcrypt cost 10 = ~100ms on modern hardware. OWASP recommends 12+ for password hashing. + +**Fix:** Increase to `bcrypt.hash(password, 12)`. Existing hashes auto-upgrade on next login. + +### H-10. `findAll` credentials endpoint leaks encrypted blobs +**Location:** `credentials.service.ts` / `credentials.controller.ts` +**Domain:** Vault + +The `GET /api/credentials` response includes `encryptedValue` fields. While encrypted, exposing ciphertext over the API gives attackers material for offline analysis and is unnecessary — the frontend never needs the encrypted blob. + +**Fix:** Add `select` clause to exclude `encryptedValue` from list responses. + +### H-11. No upload size limit on SFTP +**Location:** `sftp.gateway.ts:130-138` +**Domain:** SFTP + +`upload` handler does `Buffer.from(msg.data, 'base64')` with no size check. An authenticated user can send multi-gigabyte payloads, exhausting server memory. + +**Fix:** Check `msg.data.length` before `Buffer.from()`. Enforce max (e.g., 50MB base64 = ~37MB file). Set `maxPayload` on WebSocket server config. + +### H-12. No write size limit on SFTP file editor +**Location:** `sftp.gateway.ts:122-128` +**Domain:** SFTP + +`write` handler (save from Monaco editor) has no size check. `MAX_EDIT_SIZE` exists but is only applied to `read`. + +**Fix:** Apply `MAX_EDIT_SIZE` check on the write path. + +### H-13. Shell integration injected into remote sessions without consent +**Location:** `ssh-connection.service.ts:59-65` +**Domain:** SSH + +`PROMPT_COMMAND` / `precmd_functions` modification injected into every SSH shell for CWD tracking. Users are not informed. If this injection were modified (supply chain, code change), it would execute on every connected host. + +**Fix:** Make opt-in. Document the behavior. Scope injection to minimum needed. + +### H-14. Password auth credentials logged with username and host +**Location:** `ssh-connection.service.ts:146` +**Domain:** SSH / Logging + +Logs `username@host:port` for every password-authenticated connection. Creates a persistent record correlating users to targets. + +**Fix:** Log at DEBUG only. Use `hostId` instead of hostname. + +### H-15. guacd routing via `host.docker.internal` bypasses container isolation +**Location:** `docker-compose.yml:9` +**Domain:** Infrastructure + +App-to-guacd traffic routes out of the container network, through the host, and back. Unnecessary external routing path. + +**Fix:** After fixing C-1, both services on the same Docker network. Use service name `guacd` as hostname. + +### H-16. Client-side-only admin guard +**Location:** `frontend/pages/admin/users.vue:4-6` +**Domain:** Frontend + +`if (!auth.isAdmin) navigateTo('/')` is a UI redirect, not access control. Can be bypassed during hydration gaps. + +**Fix:** Backend `AdminGuard` handles the real enforcement. Add proper route middleware (`definePageMeta({ middleware: 'admin' })`) for consistent frontend behavior. + +--- + +## MEDIUM Findings (18) + +| # | Finding | Location | Domain | +|---|---------|----------|--------| +| M-1 | Terminal gateway no session ownership check on `data`/`resize`/`disconnect` | `terminal.gateway.ts:76-79` | WebSocket | +| M-2 | TOTP replay possible (no used-code tracking) | `auth.service.ts` | Auth | +| M-3 | Email change has no verification step | `users.controller.ts` | Auth | +| M-4 | Email uniqueness not enforced at DB level | `users` table | Auth | +| M-5 | Password minimum length is 6 chars (NIST says 8+, OWASP says 12+) | Frontend + backend DTOs | Auth | +| M-6 | JWT_SECRET has no startup validation | `auth.module.ts` | Auth | +| M-7 | TOTP secret returned in setup response (exposure window) | `auth.controller.ts` | Auth | +| M-8 | Mass assignment via object spread in update endpoints | Multiple controllers | API | +| M-9 | CORS config may not behave as expected in production | `main.ts:24-27` | Infrastructure | +| M-10 | Weak `.env.example` defaults (`DB_PASSWORD=changeme`) | `.env.example` | Infrastructure | +| M-11 | Seed script runs on every container start | `Dockerfile:28` | Infrastructure | +| M-12 | File paths logged for every SFTP operation | `sftp.gateway.ts:27` | Logging | +| M-13 | SFTP `delete` falls through from `unlink` to `rmdir` silently | `sftp.gateway.ts:154-165` | SFTP | +| M-14 | Unbounded TCP buffer for guacd stream (no max size) | `rdp.gateway.ts:100-101` | RDP | +| M-15 | Connection log `updateMany` closes sibling sessions | `ssh-connection.service.ts:178-181` | SSH | +| M-16 | RDP `security`/`width`/`height`/`dpi` params not validated | `rdp.gateway.ts:85-89` | RDP | +| M-17 | Frontend file upload has no client-side size validation | `SftpSidebar.vue:64-73` | Frontend | +| M-18 | Error messages from server reflected to UI verbatim | `login.vue:64` | Frontend | + +--- + +## LOW Findings (12) + +| # | Finding | Location | Domain | +|---|---------|----------|--------| +| L-1 | No Content Security Policy header | `main.ts` | Frontend | +| L-2 | No WebSocket connection limit per user | `terminal.gateway.ts:8` | WebSocket | +| L-3 | Internal error messages forwarded to WS clients | `terminal.gateway.ts:34-35`, `rdp.gateway.ts:51` | WebSocket | +| L-4 | Server timezone leaked in Guacamole CONNECT | `guacamole.service.ts:81-85` | RDP | +| L-5 | SFTP event listeners re-registered on every message | `sftp.gateway.ts:53-58` | SFTP | +| L-6 | Default SSH username falls back to `root` | `ssh-connection.service.ts:92` | SSH | +| L-7 | Weak seed password for default admin | `seed.js` | Infrastructure | +| L-8 | SSH fingerprint derived from private key (should use public) | `ssh-keys.service.ts` | Vault | +| L-9 | `console.error` used instead of structured logger | Multiple files | Logging | +| L-10 | `confirm()` used for SFTP delete | `SftpSidebar.vue:210` | Frontend | +| L-11 | Settings mirrored to localStorage unnecessarily | `default.vue:25-27` | Frontend | +| L-12 | No DTO validation on admin password reset | `auth.controller.ts` | Auth | + +--- + +## ISO 27001:2022 Gap Assessment + +| Control | Status | Gap | +|---------|--------|-----| +| **A.5 — Security Policies** | MISSING | No security policies, incident response plan, or vulnerability disclosure process | +| **A.6 — Security Roles** | MISSING | No defined security responsibilities or RACI for incidents | +| **A.8.1 — Asset Management** | MISSING | No data classification scheme (SSH keys, TOTP secrets, credentials treated uniformly) | +| **A.8.5 — Access Control** | PARTIAL | Auth exists but: no brute-force protection, no account lockout, no session revocation, only 2 roles (admin/user) with no least-privilege granularity | +| **A.8.9 — Configuration Mgmt** | FAIL | guacd on host network, DB port exposed, no security headers | +| **A.8.15 — Logging** | FAIL | No structured audit log. Sensitive data IN logs. No failed login tracking | +| **A.8.16 — Monitoring** | MISSING | No anomaly detection, no alerting on repeated auth failures | +| **A.8.24 — Cryptography** | PARTIAL | Vault encryption is excellent (Argon2id). But: no TLS, tokens in URLs, TOTP unencrypted, keys in logs | +| **A.8.25 — Secure Development** | MISSING | No SAST, no dependency scanning, no security testing | +| **A.8.28 — Secure Coding** | MISSING | No documented coding standard, no input validation framework | + +--- + +## Prioritized Remediation Roadmap + +### Phase 1 — Stop the Bleeding (do this week) + +| Priority | Finding | Effort | Impact | +|----------|---------|--------|--------| +| 1 | **C-1:** Fix guacd `network_mode: host` | 30 min | Closes unauthenticated backdoor to entire infrastructure | +| 2 | **C-8:** Remove PostgreSQL port exposure | 5 min | Closes direct DB access from network | +| 3 | **C-6:** Add session ownership to SFTP gateway | 1 hr | Blocks cross-user file access | +| 4 | **H-4:** Remove private key logging | 15 min | Stop bleeding secrets to logs | +| 5 | **H-5:** Stop logging terminal keystroke data | 15 min | Stop logging passwords | +| 6 | **H-11:** Add upload size limit | 15 min | Block memory exhaustion DoS | + +### Phase 2 — Auth Hardening (next sprint) + +| Priority | Finding | Effort | Impact | +|----------|---------|--------|--------| +| 7 | **C-2 + C-3:** Move JWT to httpOnly cookie + WS ticket auth | 4 hr | Eliminates primary token theft vectors | +| 8 | **C-4:** Add TLS termination (nginx + Let's Encrypt) | 2 hr | Encrypts all traffic | +| 9 | **H-1:** Short-lived access + refresh token | 3 hr | Limits exposure window of stolen tokens | +| 10 | **H-6:** Rate limiting on auth endpoints | 1 hr | Blocks brute-force | +| 11 | **H-3:** Encrypt TOTP secrets in DB | 1 hr | Protects 2FA if DB compromised | +| 12 | **M-5:** Increase password minimum to 12 chars | 15 min | NIST/OWASP compliance | + +### Phase 3 — Channel Hardening (following sprint) + +| Priority | Finding | Effort | Impact | +|----------|---------|--------|--------| +| 13 | **C-5:** SSH host key verification (block changed fingerprints) | 3 hr | Blocks MITM on SSH | +| 14 | **C-7:** Guacamole instruction validation + opcode whitelist | 2 hr | Blocks protocol injection | +| 15 | **H-2:** RDP cert validation (per-host configurable) | 2 hr | Blocks MITM on RDP | +| 16 | **M-1:** Terminal gateway session ownership check | 30 min | Blocks cross-user terminal access | +| 17 | **H-7:** Run container as non-root | 30 min | Limits blast radius of any RCE | + +### Phase 4 — Hardening & Compliance (ongoing) + +Everything in MEDIUM and LOW, plus ISO 27001 documentation gaps. Most are incremental improvements that can be addressed as part of normal development. + +--- + +## What's Actually Good + +Credit where due — these areas are solid: + +- **Vault encryption (Argon2id v2)** — OWASP-recommended parameters, per-record salts, backwards-compatible versioning, migration endpoint. This is production-grade. +- **Credential isolation** — `decryptForConnection()` is internal-only, never exposed over API. Correct pattern. +- **Per-user data isolation** — Users can only see their own credentials and SSH keys (ownership checks in vault services). +- **TOTP 2FA implementation** — Correct TOTP flow with QR code generation (aside from the plaintext storage issue). +- **Password hashing** — bcrypt is correct choice (cost factor should increase, but the algorithm is right). +- **Admin guards on backend** — `AdminGuard` properly enforces server-side. Not just frontend checks. + +--- + +*Report generated by 4 parallel audit agents covering Auth/JWT/Session, Vault/Encryption/DB, WebSocket/SSH/SFTP/RDP, and Frontend/Infrastructure/ISO 27001. Deduplicated from 70+ raw findings to 54 unique issues.* diff --git a/docs/config-export.mobaconf b/docs/config-export.mobaconf new file mode 100644 index 0000000..4eafb6e --- /dev/null +++ b/docs/config-export.mobaconf @@ -0,0 +1,304 @@ +[Misc] +PasswordsInRegistry=0 +SlashDir=_AppDataDir_\MobaXterm\slash +HomeDir=_AppDataDir_\MobaXterm\home +SkinSat=80 +LastSession=*Predator Mac|#109#0%192.168.1.214%22%vstockwell%%-1%-1%%%%%0%0%0%%%-1%-1%0%0%%1080%%0%-1%3%%0%%%%0%-1%-1%0%%#MobaFont%10%0%0%-1%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%0%-1%0%#0# #-1 +RightClickAction=1 +RightClickAssigned=1 +DefTextEditor= +LogFileFormat= +StorePasswords=Ask +StoreSSHKeysPassphrases=0 +BackupIni=1 +LogTerminalActivity=0 +LogType=0 +LocalShell=Bash (32 bit) +LogFolder= +DarknessIntensity=80 +XAuto=1 +XKeepAlive=1 +BackspaceSendsBS=1 +BSisBS=1 +BoldAsFont=0 +WinPath=1 +ConfirmExit=0 +PromptType=2 +WarnBeforePasteMultipleLines=1 +TransTerm=0 +TransDetachedTabs=0 +X11SharedClipboard2=1 +X11OpenGL=0 +X11DisplayMode=0 +X11AccessControl2=0 +X11DisplayOffset=0 +X11ScreenNumber=1 +X11Keyboard=0 +X11DpiMode=stretched +X11Version=MobaX +AdvTermSettings= +DefaultHome= +DefaultNewTab= +NewTabPosition=1 +ReplaceHomeTab=0 +NoTabClose=0 +AllowMultiInstances=1 +MPSetDate=2/2/2026 +MPSetAccount=vantz +MPSetComputer=STORMBREAKER +WhenToPromptForMasterPassword=0 +ExportConfPartialCrypt=1 +ExportConfUseMP=1 +SessionP=18377107475026 + +[WindowPos_DESKTOP-V1DRJ1C_3440_1440_1920_1080_1920_1080] +CompactMode=0 +MonitorCount=3 +Left=-8 +Top=-8 +Width=3456 +Height=1408 +Maximized=1 +SidebarVisible=1 +SidebarWidth=240 + +[SSH] +SFTPShowDotFiles=1 +SFTPAsciiMode=0 +MonitorHost=1 +MonitorCPU=1 +MonitorRAM=1 +MonitorNetUp=1 +MonitorNetDown=1 +MonitorProcesses=0 +MonitoFDs=0 +MonitorUptime=1 +MonitorUsers=1 +MonitorPartitions=1 +MonitorNfsPartitions=0 +MonitorNetstat=0 +StrictHostKeyChecking=0 +LastDownDir_vantz@STORMBREAKER=C:\Users\vantz\Downloads +UseInternalMobAgent=0 +UseExternalPageant=1 +ValidateEachAgentRequest=0 +MobAgentKeys= +DisplaySSHBanner=1 +UseNewMoTTY=1 +GwUse2factor=0 +AutoStartSSHGUI=1 +SSHKeepAlive2=0 +EnableSFTP=1 +RemoteMonitoring=1 +ScpPreservesDates=0 +UseGSSAPI=1 +KrbDomain= +GSSAPICustomLib= +GSSAPILibNumber=0 +DefaultLoginName= +BrowserSortType=0 +BrowserSortReverse=0 + +[Display] +SidebarRight=0 +C10Checked=1 +C11Checked=1 +C12Checked=1 +C13Checked=0 +C14Checked=0 +VisibleTabNum=1 +VisibleTabClose=1 +MenuAndButtons=2 +BtnType2=2 +S3Checked=0 +DisableQuickConnect=0 +CustomDPI_3440_96=0 +IconsTheme=0 +RoundedTabs=1 +GraphicCache=1 + +[SSH_Hostkeys] +ssh-ed25519@22:192.168.1.4=0x29ac3a21e1d5166c45aed41398d71cc889b683d01e1a019bf23cb2e1ce1c8276,0x2a8e2417caf686ac4b219cc3b94cd726fb49d2559bd8725ac2281b842845582b +sha256-ssh-ed25519@22:192.168.1.4=e4:88:e6:10:02:fc:01:35:3e:f4:a0:91:4c:ce:28:99:2f:ba:fe:78:54:b1:28:8e:fb:5d:90:36:5f:69:17:00 +ssh-ed25519@22:155.254.29.221=0x56f06b2deb3d77fd2d70a2cb1769555423e73f4abe5dfbed60e675bf97f5a3a7,0x477c72989fc0a6a61fab477a5ffb4c559426cd2a5e201db62d32e62599661fc7 +sha256-ssh-ed25519@22:155.254.29.221=1e:1a:04:68:bf:98:f7:fa:75:ae:b4:df:bd:20:bb:af:cd:70:c3:dd:2c:94:7e:ad:77:f5:9b:25:87:a6:0c:fd +ssh-ed25519@22:192.168.1.108=0x150d36ae7dcf070a42a692cc3ed1ef2758550ac62a03837348d1e386071dcbfb,0x7e8287a32f0f9f9720b8b949530110c34eb32efb99762523ec270d1056d4aefc +sha256-ssh-ed25519@22:192.168.1.108=25:92:7f:45:ac:22:4e:43:b8:3d:03:eb:b6:da:eb:1d:dc:ca:90:da:69:57:ab:36:d6:6a:63:7f:da:35:22:2c +ssh-ed25519@22:192.168.1.214=0x150d36ae7dcf070a42a692cc3ed1ef2758550ac62a03837348d1e386071dcbfb,0x7e8287a32f0f9f9720b8b949530110c34eb32efb99762523ec270d1056d4aefc +sha256-ssh-ed25519@22:192.168.1.214=25:92:7f:45:ac:22:4e:43:b8:3d:03:eb:b6:da:eb:1d:dc:ca:90:da:69:57:ab:36:d6:6a:63:7f:da:35:22:2c + +[WindowPos_STORMBREAKER_1920_1080_1920_1080_3440_1440] +CompactMode=0 +MonitorCount=3 +Left=3432 +Top=343 +Width=1936 +Height=1048 +Maximized=1 +SidebarVisible=1 +SidebarWidth=442 + +[CustomIcons] +-3=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 + +[WindowPos_STORMBREAKER_1920_1080_1920_1080_4206281_-24] +CompactMode=0 +MonitorCount=3 +Left=3432 +Top=343 +Width=1936 +Height=1048 +Maximized=1 +SidebarVisible=1 +SidebarWidth=442 + +[WindowPos_STORMBREAKER_3440_1440_1920_1080_1920_1080] +CompactMode=0 +MonitorCount=3 +Left=3432 +Top=343 +Width=1936 +Height=1048 +Maximized=1 +SidebarVisible=1 +SidebarWidth=240 + +[Font] +Font2=MobaFont +FontIsBold2=0 +FontHeight2=10 +FontCharset2=0 +FontQuality2=3 +Ligatures=0 +Charset2=UTF-8 +LockRowsCols=0 +LockedCols=80 +LockedRows=24 + +[Colors] +Black=0,0,0 +BoldBlack=128,128,128 +Red=170,66,68 +BoldRed=204,123,125 +Green=126,141,83 +BoldGreen=165,177,124 +Yellow=228,180,109 +BoldYellow=236,201,149 +Blue=110,154,186 +BoldBlue=150,182,205 +Magenta=158,80,133 +BoldMagenta=192,131,172 +Cyan=128,213,207 +BoldCyan=169,226,222 +White=204,204,204 +BoldWhite=204,204,204 +ForegroundColour=236,236,236 +BackgroundColour=36,36,36 +CursorColour=180,180,192 +SyntaxType=1 + +[Cursor] +CursorType=0 +CursorBlinks=0 + +[PopupConsole] +Transparency=16 +Size=36 +Sizeable=0 +Position=3 +TryToOpenInExplorerFolder=1 +BackgroundInsteadOfClose=0 + +[X11Extension] +Composite=1 +DAMAGE=1 +RANDR=1 +XFIXES=1 +XTEST=1 +XINERAMA=1 + +[WindowPos_STORMBREAKER_0_-30_1920_1080_1920_1080] +CompactMode=0 +MonitorCount=3 +Left=3432 +Top=-737 +Width=1936 +Height=1048 +Maximized=1 +SidebarVisible=1 +SidebarWidth=240 + +[Bookmarks] +SubRep= +ImgNum=42 + +[Bookmarks_1] +SubRep=AAA Vantz's Stuff +ImgNum=41 +*Asgard=#109#0%192.168.1.4%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0%%#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +*Docker=#109#0%155.254.29.221%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +*New-cp01-heistacp=#109#0%155.254.29.219%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +*Predator Mac=#109#0%192.168.1.214%22%vstockwell%%-1%-1%%%%%0%0%0%%%-1%-1%0%0%%1080%%0%-1%3%%0%%%%0%-1%-1%0%%#MobaFont%10%0%0%-1%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%0%-1%0%#0# #-1 +*VigilCyber-Helpdesk=#109#0%192.154.253.101%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +192.168.1.107 ([UPS-Monitor])=#91#4%192.168.1.107%3389%[UPS-Monitor]%0%-1%-1%-1%-1%0%0%-1%%%%%0%0%%-1%%-1%-1%0%-1%0%-1#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%-1%_Std_Colors_0_%80%24%0%1%-1%%%0#0# #-1 +CLT-VMHOST01=#91#4%100.64.1.204%3389%%-1%0%0%0%-1%0%0%-1%%%%%0%-1%%-1%%-1%-1%0%-1%0%-1%0%0%0%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%0%-1%0%#0# #-1 +CTG Unifi=#109#0%192.154.253.111%22%vstockwell%%-1%-1%%%22%%0%0%0%D:\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +Greyming Webhosting=#109#0%155.254.29.219%22%greyming%%-1%-1%%%22%%0%0%0%%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0#0# #-1 +MSPNerd - ITFlow=#109#0%192.154.253.106%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +MSPNerd - Mautic=#109#0%192.154.253.112%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +Netbird=#109#0%192.154.253.105%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +Node 1(top)=#109#0%192.168.1.105%22%root%%-1%-1%%%%%0%0%0%%%-1%0%0%0%%1080%%0%0%1#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%-1%_Std_Colors_0_%80%24%0%1%-1%%%0#0# #-1 +Node 2(bottom)=#109#0%192.168.1.106%22%root%%-1%-1%%%%%0%0%0%%%-1%0%0%0%%1080%%0%0%1#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%-1%_Std_Colors_0_%80%24%0%1%-1%%%0#0# #-1 +OpenVAS-Reporting=#109#0%10.150.10.100%22%vstockwell%%-1%-1%%%22%%0%0%0%D:\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +Pterodactyl Panel=#109#0%192.154.253.110%22%vstockwell%%-1%-1%%%22%%0%0%0%V:\vBackup\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0%#0# #-1 +rmm.t2cnc.com=#109#0%192.154.253.99%22%vstockwell%%-1%-1%%%22%%0%0%0%D:\Webhosting Password\ssh-key-vantz-primary%%-1%0%0%0%%1080%%0%0%1%%0%%%%0%-1%-1%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%1%-1%0#0# #-1 +Win Game Host=#91#4%192.154.253.107%3389%administrator%0%0%0%0%-1%0%0%-1%%%%%0%0%%-1%%-1%-1%0%-1%0%-1%0%0%0%0#MobaFont%10%0%0%0%15%236,236,236%30,30,30%180,180,192%0%-1%0%%xterm%-1%0%_Std_Colors_0_%80%24%0%1%-1%%%0%0%-1%0%#0# #-1 + +[EditorWindowPos_3440_1440_1920_1080_1920_1080] +Left=0 +Top=0 +Width=3440 +Height=1392 +Maximized=0 +MonitorCount=3 + +[EditorWindowPos_1920_1080_1920_1080_3440_1440] +Left=3432 +Top=343 +Width=1936 +Height=1048 +Maximized=1 +MonitorCount=3 + +[MobaTextEditor] +DarkTheme=1 +FontName3=MobaFanta +FontLigatures3=0 +FontHeight3=-13 +GutterVisible=1 +GutterZeroStart=0 +EdgeColumn=800 +TabWidth=2 +ColorsIntensity=80 +Options2=518148035 +RecentSearchDir= + +[Passwords] +mobauser@mobaserver=_@NLb5+QoIseFoRg+0bK8Kx4G/zfEh/cmZDlpOBedcA9qDv/RiIgkQ== +vstockwell@192.168.1.214=_@9jajOXKuLSaKciMn1EIQTT9vNVLCGwk3a4Fw== +ssh22:vstockwell@192.168.1.214=_@9jajOXKuLSaKciMn1EIQTT9vNVLCGwk3a4Fw== +vstockwell@192.168.1.108=_@FYcgiZ336eUoS36gHigR8MqfY3+8AIbpwQvw== +ssh22:vstockwell@192.168.1.108=_@FYcgiZ336eUoS36gHigR8MqfY3+8AIbpwQvw== + +[Credentials] +Mac Login=vstockwell:_@25LSjojT5a73AVTma1s1LUVSs/YNHX7740sg== + +[ImportExportSpecials] +ExportedSettings=Home and Slash directories location|Local terminal settings|Global X server settings|SSH settings|Folders history|Services settings|MobaXterm interface settings|Sessions|Macros|Stored passwords and credentials|Sessions presets|SSH tunnels|MobaTextEditor and MobaDiff settings|Custom syntaxes|Shared sessions|Suppressed message dialogs +mobauser@mobaserver=_@NLb5+QoIseFoRg+0bK8Kx4G/zfEh/cmZDlpOBedcA9qDv/RiIgkQ== +MobaVersion=25.3 +ExportDate=2026-03-14 +ExportTime=13:16:51 +ExportUsername=vantz +ExportComputer=STORMBREAKER + diff --git a/docs/karens-wraith-layout.png b/docs/karens-wraith-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..61d7de54e83a1cc5db936777ead14dfbf0fe1bcd GIT binary patch literal 647378 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

6mY3KA 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 z z+#H>3z`=0~4Qyi+iGCBj*4UjnH+UNN3?7U?&5%_D8lMWrFCRhU*pzd@)FVtT1*|yvx$0$05JZFU|Qrt1FF5G zc$kOxSGz+q(rbef`uh|XpwG|LCkdsDEH6#tzA`*Cj=fHD7@L= zqGzxnl_(!Au2V^77smw_1(;hopdetPwXU!d9C*EEt{``3mHL zVK2fVo)lP%#wjCQWAkvBTemrkRgP2+1*BWG1|@I6C9w-_E(hKA7X6EpQq;Qf7Q(4d zm3kGnM3W&nr#imB5sBE52*e~tCBf?yKgS7eaLN^|DVJl+p&My5hlrwa{jpSE5($<0h^Ra?p%3x3`^8yg21@u;4x8o1GNVE~Dp3S;%DmXX zJhWUhT9{HRXC!YVIY!KVPq-^U-x0S|#qU&gh9=_@+^>=4A6LvPuCvL9VlbIzjEOL>JZeTfd8+fj9mEe)1GzpqEY zbd_Im4^FsG^*5Oua=dWVQCVUcz6!qHSc^3i{J%Cakbv(x5t!GYXCSEK7*@9#>M+K`(ne1u+CRta z=j50yX3O~;H!hSd#^#H5BkN*pz<~sLF10Fm&l`^CMCJ2d!?$)NqVy*Bp*>`?+>yki z979}gj)_wqmtac0L_UwR8iNq=ts!F~Tr^jMs9abMw1ESK{77(hAg;vPC|pCP6

_ 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

s&%Bm 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ℑ%2b*O684lQ;2u-fyQ1I)gCQK1>%)(w{vE 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/moba1.png b/docs/moba1.png new file mode 100644 index 0000000000000000000000000000000000000000..dd741dc3fe3e107d789b4f82522216991d41b303 GIT binary patch literal 135381 zcmb5WXIxWR`!0+PMTj^!AOeCYjH3il2cooC7)M7`eCVMggaF9~lp-CK=77J#dH4e?>+Cg_k0M15cXd8T6ekb>$<~lH?Cho z?AF*VCntya_43bla&kNK<>a>S*(DEN*_Qps-{9MpFuO|^aa| z6~FlG06!~)UdDvU$?a+1d~9Kc{Ot!`R0+T65^f*jAAZN@HdgM^Z7eo8EFdJ@({UI0 zlW%Fi{(Rmc%5!#OXN|sdv`EJCKEb{`gDwhl3MdVmBf944A1u{p9DaI3G5Keev_nTu zw3;7Me1!Puz5Vd6jLxk|W~p0@ilCnol=ggnd(iA{@5DcO7VV9hrU}87%x|^6w6C1{ zpk~Hs41VzXQAs1mnX?>S7BpDq$Qa;PCT>v7MY&;Yg=L?pp47_l;gr6oj0hIjORKAH z_^9~yBPw$SJ$}yU})m`VA zK8)jxGv6%_`AU5Id?O09#RZBo%hx0J{HFCVeby|a3&swg^)H4l=#(@@#tsX3nXfX> zuTC#x;;!=RbnG*$IYnm+mNNU$%>rh=bG77*c`EvBOe4Qe%gt*KOXi8*#z66j#gd~$ za<-_t##S)vQb%&l{>nP-{<4}CW$vGlfT1+&DRrTzkIJ~v+v@DD#oLJ6a{@c*Z|B#v za(q)ZH-O@cuh(%CGBRfemZ$AxGiwslpqzuTQDi!+Dm%G|(I5G%x_j8ICW@ciWiPW| z1haMhi-dZDc<~fWVBH?dx1khqJwt@wr*b`2vTaTiGQ{m-KN9I$cK>T36JW%PS_uDgm* z9ve5^oDin&5*A4R_deMtRPy>ngOAO7V*H=I&J&o^X=>)Trd9zFpZ`Czpn?)%euvr6ExJ4q}}zQ?Fv zp6p$Z_gU01^S4!ZuRiVC5OYV}g?3sgrZ2K@sO$>3N2iZcgUf|bf zpRSCr>}>C?W3{)u+_rXmG3bD3=`yg(U0dGCOIxj?4yi}iNJ=@BaJ0{0o9`Ol~^wqdGToGiXwhmruZz%(>^i-XwS$9!)(TA9A zAF?jBwHyz$@C-YwL^0P!R5YDZqF8>H>f~`C)!EC@t@-%rnx(Q64KaE~X-*yoQ=NWK z9(Uv=x2ig)6@f?Vq;raXIR%l#s@T(RQ1Kh9NcD(MSJ|_^v85*gQELpJ>2C4TB-N3Z zHa>Z@{i$ky!G-vnsqu^pH-n~2>AJ&kpp+HAA1lr<(0Av8U6r z+D|7B+JroE>QV=PYDz`NSvUQGstV>`^O1nJ%oJ&UxINsT^QUQhNt;ICvnsq;?DtKD z-=s?_=U0AubD7ICHdE!Y>;%}^A~Bw#xF1=oD>xAs?@r;tdJ* zHQrNx;fwv6Z5M4Q%KMe_mG&!nY8q)b8P)ksBUV=Qd1=45AAOacM(N4kuk5)G)h+Ec z9e?V>*H*~h9xDIfv-3iQ40N5Y@H5aJeRYYNj%}%M>I`J;Fm)dHd_4^1~jZ zmf_f;Q@MuKMz!VyH**z~a^5bt)a%JTNz7N|cIP*cN3h#%?C0Kk^Z~T=>!^}W#oCYz zy?;aoXQm#ssZbK8W~Lpqxt=UxOmbUa`H07!RAR?MhpPUKavw#7n-Fx&HDHAHo_eCT zvPHI*qA)GvUz@ckamA7<}(fNZR&65rKV(-ijk@=)U^7bx0fR*SgdoP5wa zt!+;KQX6Hw-AB}0RP&{?BJptCQWYoFw&@#feBXTRDWlPEQf525$N;=Ct$l9X+9#W& zth3uQ`q{Jhu{P3 zp8lzn-~8_l!ay-ya-ha?_MoM@8uPS?dCq-x@4UZ;lOpFiAC!UI1-zY#7#CXA9 z#)M~8q{;_(%j7F|WgD8QNcUX+X6-ZoA<1X7MHM`X0=|unSKe7v?VD`B?KBizk*+ zZ9-=<%ED?ZY^EIq5l^SB**rcPQH8n=PC6-^jkNhzkV)|8E!&1VmuQIjIk z8o*LzS=#k~BC2Fxj`WRmFx&GlGM6Ts?(OqgUArWP(lgUML^_Ci?C4n5E!nI2b%)RY z$`XExn~85efL@yt{kdxO?UqQZYw!nG46PE51 zIO({(`C~C7EwgF)*;+)xQe(mIEM~&mtHqPMqZ=-0SH#cqV?3mBzkWLsofDkyA?k`< zaB=TOV`ffbWJLk1YyGxwEVQJCV8JZB9+aN(&*VS#|He!<%4!!%1xrR`K5s7xD57Lb*UjS%u9P!A+UV45jpD-e!^%q zH!+%S`!(U6!0(vwf|Q?7=M|8nU9gh9k-cf*Zwpta9nA=f z9*Up47w5+9Kpzl7^I2g9^=AbJqBGy9m5Eh!oLJ`fUa+3Oyyst=X=59R#=~P)C}VSXfDN9c`YXhI%hfM$7WURxf^ynywbT zZ}gdurrHXML*RJtD)-D!Pw*@v)pj;vEnF00Cz~sG-rRTJh8|XwsX_S@ih6_KN-+Y;3yN-k?`2`;moPsZz5z|E1dXrXQ9s_e@|9~Mn~ zWGoc1ZsUfk1MUnpN7=gXujdSZ*Y$O{9}aLHivP+65j$5YZa4@MLvrxE=FqV)L+SE`|e0abah zttx*4w?h_t20P&FA0QuQi?kBz zw z-1dhkSft%ahPHuQ6-jQnNfiQx=9Q)d&G%|Ba^$IT@il^uz;o#6|LfWn8;Uad>eQa} z(;`1N!hxZu^8=8C21U6IovP6%Xb)+1Nx4O2aJzJg4J;BbJ})BoeQY&cyZub-i0`1l zPq@0zEv-6B3LPBLKp}$n^;y!zj#(Z*=PBw;Vrl9{-$5qryKO$4>MUSN>GM42Ya>l zmjhlD9+FY<=?Nq``ji8qyCv3p`PWlF_PK^n_i?Y?dc)cfW71*YU-OSNq+UV z)r?F;euUfl-cix=oO{gLzY@Uin)57(wUNsB>ccjP5JM5q%eKD5m|R`pcJh zEj=qNJhwSQ1Ly2u(+Bi>m8n_Q<;Fj1mAAgudUd`8VYx9R2yS<@DllSHOJ<1K? zO6^kSHJ$24bUdLnp~<6KvLc?K@$dx(78yt=ph8sTJ0!ZulSIfOHUGxvGzQCZg%c44 z^Triq7zeGKz_j~ff)r6Wo1P&?DEtNOB1>*JAc`2n^6x+!(Y5u1z|PuV^Jn~X z64cL>f7?`%@tyGIjoclan^8&0%_WxuI!+LD}fQ-@}Iiy>a+@qpobHdP9HSlxp zjy@Ib{RndQAxt%R2UdYd>#ZI6;e0s!Zm;Woe}%lP?R^*S;}mkRrQ&qw`K}~UD?{ZM zo3RFCB}&iM0F3{Z@Hg_Dn*qbE$T-gkj7iNeTSZCHW5`tQmB&bN+RZ5vtD{`6kQl+Q zxVQY|@>ZNeehM%IWiv(E@~QXbzUa@El`~Q5{R`2Pi|XcJ?M2IDR}_jW_SkU!?$Oj; zZejIW!<6!zGyWNi{w=weQHi-PiuoLO&82R=?nJ|qpwi*Ol&Z>cul=b+k9`QEgTLu6 z_fqk`V@SVvewpS{ubEM{$NnTyF-t#yxOcry-CPml)%3vuY@T7WF3Ba@UMV-CRCoE| z20W*gNSrLwb)%wFu|rF}*lqB?iJg zg}^53MG@u96<<|6I=>9-I}f&fEMM9iBVPC|bY0+_a;JHveY~&QHhFcUd*AqQ$XaO4 za<|NPsv%;^1#G*TIj(hC>Jw-|OkuY(ZwmJWmhb3kljqbKwo!~f+!AC%Edz}KidqE z?k(T*QE;u;W!&^}ay&j{6X@%CG#t(Ed!D0gBDAI6_W zJjM!lax_liqsUNQ1Hq-O|7Jkk=-_JFB_?_=dZBZoFBUwRGyB@FuBW4J?z*eMw2~Wn zz;+d%gIv8bdR{?m(seRsCWCBsfKoT+0KloAwuwy+Ne2^uP5ZJ}eCzMy5Jyuv@$0?j zV=3J|Uu3J_9HXY*+(|Asswv%z$|g1Ix<~kMFI~Xtx6)GCEAYOQN=%y*qA+WF9ZHEf z+34JSykXT)XHTZpQs0zS^QYE@`x6yECbw$H;R^}Y*m`n2q)z^SlAAoYqXi>n)zMii zI?Bd%w@n)E%(jnj3(47~6ZP+_@kZtN9~;J|Sj)ZqRL@4v>`i z(Buc|44Ly7z4*VZ+=BKtF1suIl9@Uz`t@<_nfG@F4ccOL*1bRX3XlG|iq@MS%@&PU zZSO)Qb0ZaAm?n>$4W(Do?=h7BST!UrQV$8_-wNiEW@7f{rMy}7Tv=KeNz+!$+*nF$ z-q+-WF|9s1bq+4zQC*nsPjS=&jv5DYfXf3Pbyx30{Pa>~B zSvWK3-yR?&ru1NTn;yN1fMqZq{oEnT;QB58;X9O&S(D z6_;=6eHna=Y4_Gt$M+JpVKue!m&x}cj)%fbSv=}Jd@p3M4w053-`UYytu2qwK|Gv{ zLOh8motRCaZ2xV=cSY;=qs_9Cna5zMV?Gm-d_00W2}uEn1V&Fwcrwm~q+6LvZ}QmYd(bOs)Uwyqr^?E6 zb?s|?LH&`CYF=q3EC14Z*P6svD(XKu>*A^9y#6!hGjh}UnywM+*~3qE_FzJDpPaw| zbRf~VY!FL;0YE%5e%tV_8YrfZF~GQA@V!X7tAYbRSokXcgKK=QOL8FI+!Cr;DmBgJ5fS7F!GYjyYGwm z%`{vJX&l1WO9$cwoVkH>0{J0+0w#MerVXp`2dxk@G-f7bZ}n67BPF#{!vtSQ5`(Y6 z4;UFILt1HwIOsCz9(6YR(2#Usp+8u>NHyAs&p{MOPNJ@Id--XD8ViAcm)O*z5%yxo z+7<5`LPpQdiaNUPpQ9n1((^QORL0ffFe^gS38f0b+WZ58ltnb{kfWjTsDLDBt-B2pDF zyx*n$aYab@9MFDa_~;hELdXb1Wn0P-=m^VZNGOTf(4a0WlevkZPppovf4#z3Tl{pZ z%WfKU^{DtqUj>kkh5wA%ClQTPTgfSf1|YA$O--xCRSl!|m{IrB(_glfnXh&u%| z;0Zn+SH?)^X-4tq2<7?l47w5YK(ZB^DI1?+?0EX0zFb*V1_b%jb1nu2rh32LlLBo?8zBX%pldtQg|cUn~^-&@i0L1XPNKr ziC@nd^7MGFuY?#m59Msr8)_OR!W#nle)uIO@NZHU2du1GpTM0UXYh{*Jzt-8fBiW6x)jfkI4qzG*V?p$Hj3akj*XSFYeZbX;ghk**92<^1@; z<%MDoG@~Ej+W`;5zLzlB$Fsl z`iC1P^p8;v$^}26qrm0wsj8gAIdamob<)R|TORH^8Am*hQ^;k^M0R z`UjZIc!)#f>EHD{73ZP*fIG&QXA9KYMXmrWID*Ntxq18P`h9xjEI~zfc$2 z+ON6%5Wwd=M>BBZl!|9pKB}9K?oGle2V(mPJ=Mg_?dcPFIi?9N<4%){z92-`CSHCM}f)n z+IO8$gVJ(4twM3RWtrNef-c|Ij=@ruv*SZ&tphb3ghBqJ&Vr2^exy?#a!b|rH)&3u zs+9MK99xgJ|Aw%OkMlS~4bqz%rCr`SM=DS*guqeE6Cab*%oP=07WZSUMe!=LhG>;N z6q>XVQZoIWnmYOZV-ot_iVj>s@t575pfh5o5OzbxPCJ>(IfA zr&G#}o6Ov!$A2GBrt<`VMNKA%mp-T3kN0-t+k#8;P0!PutN^$iWWyi$6~e+hqUcke zaKaiD-&Pf&LLc3m&EyWN?@{u~+S!5H3+q;;wxixkb*Ub_1dSg{wg%{)k5Kc}`OPG1 zBzkUqYV3BcXX%w@w0XmN-E54<0x~n27p-E1gDf~%Wm2Ri@dlqF+>M(wC^Wsx4FX|P z+>PNfK47*5C=}?2t2raa{Ml;@d- zb5WQpD>UUi(;L#P9@ib@BHDJgz&6`;F|On3k@2Z+-|^0ezT-n>`@r*w@l!8K+Z;`W zy_oxc&0ecnNgrd>A%i?<2&viw_c&SE=mTI+jbH0+4fX5j3ndILMh&NB>-+`*8on9* zGb{$3FbD0zO;B;bM?nTJ@0@kMe^%kc!-=7my8nbC?^Vh-XsC@J=U!rIKr@|&nPD%w>w+sfaNP?Q;7P}Wn zX*_Z~-9z~0xm4prt$uhWi1J?27MeWURYEYxhe8QF?6LpDT+C%dkf}YC^CONyD(CRn zFzv%fxy67ovDp%C7&T&1W0A_bVm%=dLBH#r;dYB0D&7C~k7NRQ@V+r3fKmFb_(hC-=BBY+Og!&|CS{4xr!7fY`$5PimD_fLXoEhGX6 zzz|pZG3C4z`5p~(e2zRD9nLN<^1y-ytPa$mB!3UVV^<+V(tqz-@n!)M$vjMHWC!?s z*sBQ4m5Vfp=KHHYJ!3zU;%F%x<2#w#JSS!KY@V>dHc8|lXQ=mgJ`cQpP#A#-HXP;6 zuf|_g3sq|;kcr%?*`c~Q=05Z;2JiXrCHK7I3+R&r*c@+xlvY$UT98ILd6%@4ZMR5B z5~*{!T+?vkG)y~J=gB9Xry_{)JLq!*zIHan_K;0S7-~3jW8FUUKLv`zM|n_zn~tkc z^pAYD#%@6`CMkqW;KDJ7JQe@c++K$M>)nlhc>1IUQiy7%jK8)@L)c3us^TXmLhY~M zL}3&wJZxY^N7~yu$lxJVh!mq- zq=PKfE{dz5NyASTFBnbjg9|)Mq)$+qC?P=5A1tq;?6I;dIE9xh>f|VxDVU}~#Wci= z<-&TkD>$g5#U%-=b69o`WAHkQU=v_yGn~Cb-q}h0Lk{z6j>82&H|afq$Ei+d-J$~w z2RYH5?(RVgB*(X|ivU`s_O2x;JjZ^ki@CcAv8G56yk6@$>0S_Q0gB^YbH$g6x?#{u z2&1+&;Dx^%rMRjo@kqN}dfCoY3n?B&q_-mfy@n|gocR&jb0gTxSM>MlH+L;tgEX4dOm&f?E5;;zH zIENeLxJm$iQUUyryO*b$L0*Je4XQkxTM8F{z?29ntgSe(m=b}u=N*%ZC~cScGf3BC zj=fZ`3zH-Ph6oGH+_Dd?|Lh0e;c^S9oQFN;LrZ2ymO**JZkIcjTb9ZXmqw|%P6OtJ z*kYF2W1yEy^fpt>*AI8H+d>`y2`nrT$%~li|e3 zp9bOW02P`k1FQqKTs)5+=C!_S>9 zZF(DS@k`_Cpcg^1!+{kkY!#F^#+`c~SKJCLb6wH07U?Ryv<2$}KqeG!T_zSEU2frn zq_Kc30$}Tw(7{S5XP(;oLn!efPSY|(;|$O@3wF7s=>?#*QOa5fH+lU~^mo>xhNb8m zWjVBN;BWeIPA8Lzy8|%UccWcij~W@@xw7{l7MzQTO$Y6IHPrD?qjj2~d+W^9aF5efaF^7CWEUh)>lnA*e`0_oj8-yhP;&Hmwbs@nU zxrHjvD!qXLDYS_0WGR+X?y)}fUoVGBz$8d=_wiJg%^uMJ!9d~9)hmOy$xr#I-B-$U zB7z`Eb;u2Ac1aI6bV$Ba<3fp4h(eTYIxq&{vBP5eP-Hj3gNH`@NeA$;Drb1sqF3WB zmD_2UDJ0;2iU_ga3X?N#Usb!n>X$C7_Fu?&5?`0toZNP+zyX6Btdd>z)+%9ohW~ZK z111M>6EuuUq~cRxoI#i701_Og%^A3KIIP-%y1@ff9!c zuXy5tn@-b(fDikbTT06!01R+{=txQ+1M`RDsy_l>UrV4Of185(EZN_HHUz%ESQ5@T5 z!!7i=bg{~H)>l_=(txjUnhIT{Ne4pB7+%?qJ`8yd0Ev*>AW25QR`TJx<2hkqy_gjf z3YZJ>ec~bh{J>Y#&+vxdFF6vFTXf}w2%&tlhMt(tBW~|QyG#G_VA3{bSV(tb1i4K*!N-@*8>dlG zcNw}ggj@WN;&zPYd)KCl(RtZ!%{@ZsfESbMD-?hFGEv2wV$w4IW6&Up;3uqw9gV-* zK|>TuVm#LfZ6EVE+c7iPA12SzyL0+ocP%kL0=*kS{;C+9vvFB<1p{}ceKW=7=(z_W05br*& zXdoCsl}?TCg+W-v<9JgVIL8ZEeaKD$vc~I9OjR{e`A%nSS_s>wKTuH}(sLliBzON$ z9=@=O2VL${fF`W{A=)4Z?gmX;3<*J9i8|XDnKe{`iie#nMMB0j%n)E!1JC584Q9x* zS4wHLPz=x150=pnn~R-EQU8-~BVI}z9uRoYgWTOOzzz@A*$Tst&z+f!B)4X3sLu$08%D<3CVP+EYn)s>Yua=QWEVGhR)RZVW8~I~%#Y0gqp2ov%n|K$& zXJXsEtwucSM~}|NKP$GKL3c}Q-bG2xB`Z^=!bG`3nS>!gS!76FZTeOS%aq$u={zE1 z?8YLJBf25rQyUsr@hkKU9CL{|14Fd)k%XV_(I&TfdsGi#g^`FS#XUO*P)L{%0CCDi zl@l`G6?bXfhv%=?YrfxJ4~QO)>tOE7NMSIm%5_p}b(%i>Loe(Teo~7v+Kjo6%lk!W zTTkAIXx`rAiZB!kc=G-HCSv6j1S+2bGyvXFI=$%<9vy zRE8dxGER%^p>*|Aytx%Z$%l-1uD^W~xl8 z*XG|?LUS#oRRRubsKW zV$kZ-09mq-Tk33qvk%6tMspX;%3~V&sK@}dltH`BAm5`I>4y@p;IghUJd|@8OJD;_Ly0Z5XC#qU zQJ{3Dfl(peiZ;i55>93Zb@j)5Mmk;I1(oG59~ZfqL6*O)D!mWmZ^#U+j3QwXr=7W(+x!EIo+d)sh@|9heP;|A{<5eqd=tm~P z(|&h>ubfBDO;880vZqD(Ap2n6{7OS~7vokLRLcPs+-?!z9XF!;zWHUO57_tgS#3^f zAWVZHyA8|m!vwFFh7sKoWE@&MZ~;l}1z2UXPspb&)JBGg1b+yrjbUAjUpzUH4<#4m z@>pegz>~=_@Bkzdz7}A99U|${J7KK(+~F6ILO^7d0SF)te}8Hat{e!&x6E$CB3^AI z0IpU?Q;$`*on!txJkreH$*J=K$u1SP4`%w}{emDwUKTlsdt5|XUkjz<&b=NbCY+MM zR~dQN3V?T_9&x3lYwKC_9fTxbMCL{~AJm0b`sh(3P2vrB2(SKhVZydCVS3$B7Ry?;nM-dJNgk*!s!%(~zttd}ZOZ8+?#T!z(BVA%SB=II1? z0f@Q^MOY7Fqz0I48f5?enm=MZ;L2-rK@=_*au>E#Qa0;XJ;=hBh2DbH4kCgqiC)o) zj7ua$Qa*eyqyiaRIU8uRVpLQ{Ykj%4%7i(noOEnZll1SH0er8`7nAMm) z8M8;?X4$0u*Xy$Al*SNhYGoby9{%_rjETT=<;*EGA_l4~m)RFpBBCRP^V`qLCn6FG zl*hj$Q41h73`b|t`VjR0i4TmbLf76Boy=N8!w zLC;pc*ppC)sPnr~RXK;uT5WwD;5)Kyv-d~T%2h7YS zFS+qf;0jVDA5<$uF4ThjD~KYw0#Xf}cQY~Oaa2H4w z!O|>t&B{I9%!32+`B?It_6s81C{V+ff%FuW@vXH2pCpm+P zV+&|4{Oe?>WC+|6jD7+Z#&&psuOn1ljbdNuxYGsMi^vD#3!%XeHCszc7$M_02=EA@wnYT$q!ngc^)imn2h4c9p1lPHB zvrmFqvz7H(Q$f@1JgIhfWC5%oJF{WNXh#1Ko9k8G8oF48i$@-`mCf{Dzcn)DGF-w* zI#}^FidN{-?xnL^c<79(30|K*XZw3mD@_~MKJD;W!d&zTIsOT90A+U5kSb*CqmY5) z1mSCY0`qQdq!l3E=gK#!nJg+Imoc3B_Ew_d0|415EcH{W)yh?X(G0^+xlG?G%bZeqS<^7|C8Xh7p|T@9u^sb ztM^dOv$uzE)F7POqI%MN)9NMlA~=4FAZqZurs%Wug0efJI25)!;9Ooi&O&u3z&eE$PwRL?jJn5TnZ~X zat!p`iO1*_U7#=piGY~jf+-OYC0J_Hte;YW>1KJCSZzjF3Exv?el>RoTLsPBTc>sk zs2-PBK$opzQtoIF%--yTi#1%2=Ru#fs`0JMOXHeLEqvQ*a?$ecTG7%{j&HAf124>J z9H8?Nk(rYP@AWVjMB_`zmjsRx0TyfenFregdL!KZ&drrDLjr75dYjlA-QF9q<{&Hv z3l9>BeHW1TXb%CoInd5iea+{}EEV0RwaW9r{6rG2GzMq^M7u49<1_~=<}^c}0BEg} z`=Y33k?Y{{>sBCv0DexM0}C+oYq?~v14$nx46GF>&#=;!9dw6_fVOv91O`TyNz^Z} zPIb5WgA=HTWCv6d%JU-Pg)OQb-6Gcx+K3oK?DsFv$2OCrxVr-yMWEf-`2IcW0muUK zU3QEH`>kU?*C2&4wgD2cjPDK971N)&Cj_azbsVR&Vs*eZhyhDzgyE%y~fC zTVK1ZjV@;qwYoNUauwOskf0-q3xb9z&L?GMewya+eI2NZ9ik8sw`Ddi|LkAn;NUR?IBi{XPPc>oBv)B(^AUJ)Vb6lZh%Sgx~G zeWBU)CmxDf3@U#oOT$ul9A^bVv3|1NhB)o)}Il?344K=$B(m1Uj1r%b}xtP!Hxrf~ho`de_ z9!)wNK}qi5e|nF8%tg615)58Kk4dX>(pI|He}i&)#@}rtceKPzv2Z1UUH9&gx%>bl zkYUxx1Wa$rp;{+C=*-BQBowsQ@E#2bO#y-S`V+|drVbLn04}%UqUkA)iOxk@!uEl( z%G&=p0`e5JacMl%CkB0Z=UeI@Kocdhw?X_VF^!HaNbQWY z94JPS56#ZcH(V+!SPrDJHZ9_h^7yH24b=X! zoF14QC0#m3_h><~4vK;e7+8CP&57KUH!6DoxU4m%rLr`Bz=KW~=e0)Kh`$W+il0Uc zqwQ+l_he(;=B7!K$%j)n2g68_#6zwZhA+B-1Y(*Dungc@fZ~}C)sydX6HvKu7Ta!v zur27jd4$I%KR0swE3qwp6Cex|(LmCa={+{GEosE|eXO*9-4LnT3(xSKjPaLell%f{ zgT1AX1*v@rkG@#GE(1vtbn>O=!#$c%v?Ucilm28Gu;Nm*>v4JX&W*(CqG ze79{grl@IJ)L8#hTN_2*!MXm$H}d{Lef9b zgnGwlEt?yV8_G9U)J;DhRA$8>uWE5mLT3-Q%eP2f5Cod!!}8SVrLSv)6B;`zPc@D3 zhP<-1@jB(6%~VctYPD1#L0dTyW4`$hOEcYg8)2_~`C>Zfi3FF)Xr&(X0t{Bn@Cs`B zNIXqu4kV%WoAs1?mCEJ%-h(I12A!>g02Q?SoBCAHx#2^5iHCSjM`Xnmz#ab&tB(E$ z=6P3ifS4IBu$^z8ZO6qL`!_1n<@>9i)`A(11%7`M$^rPxRvbB)JvWIQzx9g@yCwWq z9l>pwWG7TP#iCj=B4LvAFC`_N($#2qutyMFp1-_XB#3D;Q3W%5Qyr%~?kE-L%TWyR z0|YSudDEnOG-?)`>bbiRUqnr2uiU_t{ZXw7LzfR)i(SW%J^&raS}?-DY)Q9KtI_PT z0o_np@gA~q{t2;9ssfNOBp@TZ^2sr14sLAo%#^x|M{~9CD z5v`+~?xgiQC|{Oh6CtSbFM{0K0j{OVENs;Ct})011Z8CXDS5W}pmgkZ>3#Hz^g#~m zCp!s=J_E)cRp(b5KCI_%XWL1THZN|w{kJ}{?C#@qTf>~zkoF~zki{(2R3JU`39(paai>3g(@CD`2LTw7Y+-{Hgv&2uaVVbxOfXE1OH z^!ClRocj}=8M9j=_K zwTSSdZ^32CDhK)-c^U?D63 zqZ3q)^Dp=@6689G)D2StdV2Js@^H1L3t$?{0)mH2vU;07VAlP0!>q!AAnj4D%8CTN z%1A`h_VLM5MugjDoQej*dG{SP+k!rq>C%;x^>4s~oe8C4*Xh}9eu#2=8I+@3B{3bs zceQ6JV7z4-`zyS%Q4YMXQVmlF#ukcv1=^iaM0MIJtmLP@MHMp6S7u1`A&^hh~Ce5s@Ah!hCCZ#dA=)IMh_dskOKbW~(D;PH2M{PHyvyvj#a? zbQ?Lc4^3KbEZ(dp!cqpqqa#$Xy%PX33eXvKu822^d?P-6$a|97gEDb~hp)Gj&r?Ts zg2ovT=nEL^02a4OfQzWx`@s0JoMe7W-b%S`1^H$#Qo^Xj@F7Hcg!$~dcLEJPK(}j} zY;x}0uL(#*uBjh4B9Vi$xj$tn3SrO96WT-#Wwj^<>;#}BiGZb&{>PUa6KRMXsFSb_ z?{)y%h66l$c`ks(a2sEq<=RJzW6+!~$R6Sp{tyrN^MqgOQU}naCcnjE;J-aq`Mz@Q zibbY+ApKu?-N)@6az+^-{*KTZ^VU#B$ z2%(nC&^M@m-pu8XaejM2-Sd-we8Es}ZC04%el+8ztI@38{*~X-V~2hzv~jna5S9mg ziwuu>@BSiB>}Gb*KrO>@BPg0N81}LM0K=bRn3K=&2pGQVW^Tc~^8yj((=}V;&2>Lz zY&3gZGq$tC>cgMfp+0vog10+7CbzcF8%X)RN4Yp+Pa`58JDiI-dyv&<%w3@~d?XJ| zeR{eFeOAgGeH?olc5up_DO-96xLZ}ZMZV%bD#FmsH2q6$+2@Hm;f@Vx$BCbuw$c2q z+18yXDr@ZC;nQ)ayxNn?2ng~x?ZUO<-f2{FcOFEG4?jnH>4Ht|%v0c!%6> zY4EKxC3-ATiPArP>-o-dQO~+jwwHLfx4BbMI_YAF%Wu;zNoEY!=e@NC_eJyZ^RWYV zyOrwMGjDgB*zF0F^Y%HuaoLpfWu>U|te2de$;ZS;JMQwG_Grr$dSz|3eEaCcmaEF&tkH5vhe@5kMcK{h@7F|%a(Cav9ojBOBWt~tJJ)=C$Lr?@ zehdAc#@rcu?zDJjY%OQ>i+_y-7G4>@ePlalqy5`sWjRI1wVg9-lNHJrzpibSD?F*Q zYfB5kVCPSAy%ksP9rOR?uvW+HVyku?vjn}^HTF#=O8hEX;2$ke(ll=P`(0ww##qR= zAKoX3q2fq=+1I&{uXXQ6GAMiUy}qsU(we`pnvp52-~TUHJEfgtTx&w84YzNtYQNN` z^L1S3%>sY5AVdZEt>7C|`Pq2bt9Z#2u&D2n4nnp%uWTIMWph~PRC;5!j`C5jjTe=% zqpidwQS(MlvmxPI``Itn<6cJ^u(O86z5;#G-`cp3Nw~H7oYBwzr5>FVIWJ!xXWX&) zzu3>`iMCg-CMT|CCm!=lUn&3}Sx_h_UgGQU5O!O_%Ef5i+b6ckZIpfg{HDKN+kf6_ z>&*Im{k0|T!_cA~W4R~^d;}50p}twF8g7yA`RRapdcH!w@o1w(oVZSWp=O!Au!g57 zFz4fbe82JJ8&JT7i4$o)U5a1hhhW*mRG_c3RHQ)FwSlTzX#rXq)vp)TY5Oc$E{nHb zL~7DyzIA!ubamv^%9fPhEwj9I9)4NgA$QIfy?5)T^ZNhSdF_Goo_VC0*|uRp z2u6f0AWcH^yLvI7eqM+hZi*j2I~)f-BJyp8ZP7kq9IYqMp840}8=6$}v8pmmL;(wV z{FrYPF}#yQHEgXSDN2l6DPM8S$6wbAw1Lo&+$24V$de@6y+Hbu=SeNDD|jmU6q~zs zCYJ8SFe{nwV+IVPJ1NY79rUlbq?vwSo8;E8uK)ke@7WxiGi%4Ig%tUwvOd7_YDG&FGL!KUfs&hoNAo`ESRaVT`nti^U{r?|de77dr zEq7N6vXq>^tJ(7{cM}|UUp@Jg%J`4|naa`=-(swyJQwVt#PO1Z<8iVj*7CwyIVUkX ziZegAt9gI^cR%F2Y9}nxDiEWe=Q+EZ*OCf$Coa7MAGK)g89F{O`}<>t3=EZe$qJlM z!h|*;k^}{;RUD5Zej_XdC5>BFUf)iax>)#^UF&2_Cz>Y&y_{S7nD}<*-ITH~NuRzf z@zNe8f`4@~^+@@FocHUjqyutO&c!X?|8(@b$2TKCdn+&7e#L)p8PfD`|H5yXi4F7$ z&A;ydFVfySs>$qY8%7;PDdLELm5gISny4s9je}!F!J&$js3=GY5orNZ5GkX8Q4tV< zWKe;jMnrlEMTtm>QiT8k5d(yfKp?$*2X*H6JkPt<^R9P&_djBC=e|$bXP;fJeVwlk zu6bZ6EgQmv_}xKx)vnpWhmf_mrF=t(cJ1NFW9`z7DW zTcpjiPmPuV2>Wq=tdBXe&uODMqj#_vl;Q-CD;S6HYdVZR?M1GMnsb!?7J(5kT&KjG zRdS7s{Qo+5)(1Hof7A9#T^>B?Buu(zyD9QzZ$lUlUqz`5OE|gWn|>J@tNxNfQ^KOg zW5*GQ>OC=ZC{)Z)^w=OBfKrp=y9iQ-{&)zMZ8&a?6>rPAT$S#0$2-f4%Imoa#15qK zGU_#67x}SgS#2O%>sm=&ho7uMT9j*7qCv_pId%St?>4y_m_U9S=wC!OhoT}U*E6x| zSGgxXlb6@X2_3a}znwiDlk>#H@>7dA^6J%J*K|msKFR0?tntNK-w=K+Nx+C}dNnI* zqDjx^*Y9xOV(vUxg>rm?>!XL+f4#pVPgh zjE@CSC#Q7-bG#y1+d%*kGAj?!+)M0ec9ht*TsC7?7RLo>AuCe4o1LN5dH5%Ph^ukT z2WdQ7?&9C?p{FSZShQjm79%J3#KrQ!%BX3bM#ZY*L9$7g@jV2=-J3jB=+FB{>t6L%Mz$%suD|rh7wo5Rg0*T{ zuqr65E=$vr8#wQrT2;&0mE*=N2F%BmU{3aBAmdfzv`pdme1#WcpN2B5xp zdv0cmf{ml;PJ9S=#pP@rnVbblyrds26|9iE>?LSiE0W^>B=!&-2eHCt0 zK!0*m*%0PhRd4^cwRqR@|D_=tKtoPwA9&mGV|GA8Y~?BS31ii2|BTPEZ{w4W4FKbV zwmh~nDm3NJX1R;|zHh2O#;0>Fp1!&%NLP##ebetZm-V~4g3Me_?f?`O^^+V^NB$uA z=J87Vj?CXL-%B4~wgG-Nrzn2wocLSk#>_$Imds@Q6>?8t|Mg9vUmm|6eY*&j;FQ-- z6i)QF=3&20-_hmfNxGn5`o5;AJdpd#ee#zza_aZ&PTw1RxYqWg31oJ~NKs)l{X~NL z3cy43;}Xg>8UFLPoZRJ0Yw`c(%N{GX(to~uq8{!2pZ_(!4t8gwB0l>cjjWjM_;fv| zp(k|k;?W@Pxy`kDrNljXEpJ}mCz@DX(PaF7l*tRbI)sCJwJ|P5C{G63X5wXjDU73r z>iZ4hZ4BmbhO+Rd**w(ybC~sCMHY^~QmBKo5|5$EeQrjfdo!5@4ETw@NMQDjSpL(1 zztX_#-3An!-YB_wD!n`R4!nG`S=Q75I=A`qJLT$<2XTfOnuafNoiv^WJv7g>%FmH$+*SEr}c-u3g(Nc`jAQsBb8hk9#Q zFL96JX?ytGkb>vnJ z5|cVVPb3Fk_mMTlW*(<9h_*sj5|=mNfFiyr)rFCI=d;e%<=HWF1}MDz;tbMY8}DBc znew&RWM0ecQ7ymOEbml);q3AHA+#q)5?HGvKCsg^8`c*h@SAn8P&zA*`Z~Wix5%a< zrKCqbN8fzzOI21vQvfsM@AZ#dk;C1gxt6Ir!Xlp5;oIoXKSxMJ-8)>dVtq|0Tv~br zYwN%&EY>36rf*CHjZwD+7$b4D19CGyq9+>vuuMeFOTF6i})F1h;4hFilFbkI6gz7g2Y%VzG%sklI z`1j0w|B&LieL<&(>o82|qwXC_cOYii=iPCm;)P!HWYAtnn59~1vFRZbC;I20Lmw}{ zr}uLH2&r$Q_r+wj`O;64ZJlR04)gdMuMOreb$${ZFJCZWP*KKyQZVEiA$dQsNDt=y)7r&KO+~!xTKA!$l1pLK*dXd( zJrF~5>E}Z#Pwa66i$V62>ePY~sQngXN`<7V=a0y_g%200+hBg<7tOB zY3DlOLf|%Ne>3Ng@cL=`A1g^#v7y_@wzeFKJ+&zaPV1DY5>%)5TtOWH|2V#BrnG!h_mexd}LIp(L$49tY~ z)lj>RpHa3exIf)EU1~ShJ>$@xubs;PbD922-i9>-@>r#$YLamyevL;;-=MN)Slt@q zw-pZiKrV&sc-}egddOS4Nl5)&`oXwN)hkvjIaVZf96=rGQO5iIIeL=ulq-79q}(Rm zKS}N6_Cfr((#%*gotW+P(GAiwOB6@;+$ey{_yr!Mnl0FKZCoc0=s@1*h=1hvSQsOF z%w^TxllB$4_x)bGm(Nu)czBC#cUlTOO&`YYe@k|trbX1nY9sx|&lPmST(1-rkf$q> zCv5C@p0-aa=`+`oUL=j|%wMy_t3O{3B9v{6B}(Dn^*C{rJ_Nes?z|37HHq8VFM8fd zx!rIwg$hu13Al-lPoMNGEhCl7?@7K$3rNO8M5&vDW43bxrcC%mXDFEn6D*}ac_;nj ztR(QCwgMIM7O3csg9UK7`|r=dhX?e3qWtH(D4(6kWd^(-*Ez-i zZ3F4nXyR~pId>{x@d2TuvD;e8MooUkOD3Urtp~a2nmz;Bd$KjWza%@T#n{+FS1c)k zC}OLb>Eq=LOigbdL=P5$`9iH7nasl*>x#p_CXh?*TfIRo{yw$QdiN_XZrnq z|Dh*3()d#aoLa=DPkU*=>&<4XXAB<}i6jzVMpIbKDlO9XGz@HDn}_Ba+^9xsotSfF z&{d|VhaFJai&8;UbAsozpP-`SywNsrlzu zWDglFY^Kaeui=Z(ju0Lu6`ax4Fj&tkhN)SSn9tbWqRJSE=CEd44R9l;CvfcoPVip_ z(R2oEzJ?uL8WtaPSu(@ple@yRPwamL=iah}T%o-E;&S!=l;;cmZpeS08*GcLte9fT%_Cg?<2CPm zM_Mz^qRpp0aXwlv@wyApjk^y>ZDnktp;hZl|CpdcLuQAhXh@H@p%KD*b7X1=3HGiO zQ|D2JT58yQ$T}8eJl^MqPx z6&OgO_^YAk^)jdzpkusp?b>etDuHVFR8dXA!eGqXZSiZGA+v)H3QsZ~dVaYWO^@*c zZgOYXeW@S6ItaUI2c`|Tb3+!o12ptV#UU)O=t=vyGNOFM&8;j}zg_n?vb z@#h37X7`HMF%(^=qPwEK2Ix?wr?POm$v71D^dno44U>3$dL54Ssq@&K(j^;UWvMP* z>I-^4Ch+r?Y1b`uveu@-FyV9IVKnLi)Lg}7CkSmDhDETxjoXv`ip@+-{0PU{^5tCg zU8~D_o!cyFq`t<8{rZo`Ty)aVPlj#Sde@Yo0R|uQ%k8g}!CCL~E1lsTxxF^xksGnw zt@%If%}qJE!%Aez9=j!32^~%a`C1yApOd%`2L~z4rHvGDkclt?c{QDUQ;MZGV zp1rRhLy?;Am=b}8VwWi6&s=4eDgbmbD=G+3#A82e(Ecd!k_sg8ifI3%`atbk0&blg@%}uI>F{{AoIK`z>-%7QSL!TBa-wo|nMBjvdG))i zlsNe&Y%Aq(&Wg19w$91i0H+~c9GQ=$@L~44B zzU&se5%#_u&-{Vn~a#NlKAA{h467 zh#U9AN({zf*v043`LYSvge488lsEF-iHJQ%{OIhi?G=)HEaUV7q)FFxvdl<0$y3P(o<%4b1w~gW{_C7aFX2 zbL3*fEu`D?-^v`0`ehXPfrYHQrH3H@T`n%Z+j_oQzsHXSy@l2e_6X(Kmu?-x^(oJ} zk_t9y%5XfAnRp5!b=`T9+f+82Y}q{kG4K>}f}auZfM7khXMFm(s2SpZ^Jr!reOoxY zPKLIPQHBifkTe@Zx3>61x*4yb;6dK>ZCMNj#viheh4l5^J0gFTB;nORJM38b(??84 zK=yc0*_hy-wQ)QV%|Lv9J-pEz%U8wzydN5T+^0^EyMn{B6m-~C4e#G_e3cItFR)YV zsIZ&YLyH5!=nUPXTiA*{_WS;W`4C<5md-?V14}9h%RR*Prrt<_3Zs%XzJX}&-}Yc z2;FK*T!01Ss5|y0ebiqzYpiaFanA1QtFG^4I5q`2LU(=}Py~p{S516n6DgR`+po`j z5>Ft|p-rubIY#xE%bD^r2NM8@8(w@yY`q+Tn(<#=peIG8Uz1}xF`^`dND|k?d3%Q* zODA9)`P?w6HD8=2Gm4|&ET#3`7dht(QoMf+b~>aSX6$&(c{N2gO=YbotH7KTGE%^_ zO2047C58oFzdEd}_;Tt26E#cg4CVY2GaesC8s#Zg0DqVB zdo_YE@2fo=DwMSzl!X5qzyh0Lh;5CS%NDB^70I2vu5c1{Oc4ib};;qUKsf78D2mFg&~L zZw35Y&Rj#~rlY!pbdjn#1q#{6suuQ)KVupsHNAQe;=@@{4#{(U0Wc719o*4QZMz-C zw}XL2_-zY&m()xz_~7#HB1RnU-SSy6RKwD~#o*~a9`R#-Wv!1doH!%x!pC%(E>-AV zr}Em`(0En)%J1W$Zkm1z5DOX44R4W7rBf6Tm$2|6lxBm3mU^FIB$al_p8tAIN`Oh2 z?<&p^98T+h6C&1~3Q zKuFt##5&QrWh12lvC!?Ew$dA7uDC8^4=Odka?dx*xjXzTb*PViUKf?>S*stco)k@o ziH2E^S97ECtlVuQIDM$c50 zGEC?(&eGW+YjQ}2(;fPzXu7)I;#fE(8>ScE1^f{sCgyrR!uXNskaZ5=oFeh93Hu!M zD#1>+E@Roaom}x6YHK`o7&Qj~oQJ`jTC-{kH|AaSfBOQYAqguqHCO8@hXoO!e!!tejwN$&!fTCJH0i-TnH#E z2e9q1TBlq9SO*Ah3+F2Z@b9zump`yU=Nr1nCA1v@;mn-aF_$@x*c&_o`QfTO__*k zC+Wv@y^_=zhd57OQcJ(;sso@i>Y(mo&QA+Dr^bw&ke#z(i*7R@jl@+Ovz!0)P&yW1ZW=8W@l-aV0mSncxFXk}D| zJg^-as29;fkRp)`T9&HKNXXxZCqd!s=QeL>?ctNg0&zuxLiRiq(8KXRLdBJ*`_Z3< z&qBdYm8Xi{W?sm`OwfLBkifC?h+k==0RKyD5E(ZUr17MC z*qB<5XU)fkRnGA$*v|%6*?R42y8Ums7$y8$`BA=VPE_^1#U*l>s-Vare6%Gj=Am&B zAc?JqX2o}5O{9jU%RNtpQc&{)N9@JnHR;6|;FFLt&YZ5p%5HDzJKx0l@ZqMmIsX1U zO{@|Kd{4pd9&f+DFFidQdHIY*FthZ7i;`wNanp9&w8Ux354%+F8t{gb`nn8+ZzzD> zq>dZbRhW6pHB($o&`s*m|F+@k$Z(hTa7ZYYiZ$R>?0Q8kICQCXkv{!9@b2tR@S6~p zM|MTz{5ro_Z*YHnAxt&`=EW;NwEx(pIo2$WdGZ#~yEq~>(z3mm8apO>8s|94%(; zx`bf})q}Tm=V1(mUSe7K;&6b5Sp-#4@kJ+8lLB;Fgb6aBPpUd_vZ0=O=CpW3#>bx8 zxYaiPeve}lXLW7Mt9ZiuJC2b3)C-p$>pY8W{Gg23FaNGp)mDPlr%i-U)flI?{xHzg z3)EU#mJQZKpn9@7fcLy8b=24x`|bUw1Bovi9V~k~mf!IXD)c8*I<61A7Hb!5M5s@99TZhZPSEzGtl%(Tz)s z&q46-bWdDZriRqxAp;yh#`psBhjriUjuA}8icAZaBPbWmA1t|)`#Q4DSEHqZQY(Q9 z*Iy_0omFn1ls-T@w5HRl0B_%eP~5W1$xPL}(p&Z}zi#Uv{Sv7MyCT6@>;|>*H5jr~yiwRCH{R8swI=t;N#1ANoYlT^T6gOF&9dt>R#J_I^ zTlWl22nb``BUq142r@G8YCP*kz2AZ~%}L{#>|qdJ-

pZk{IW|EcQ~SB%QX0k$DN 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 literal 0 HcmV?d00001 diff --git a/docs/moba2.png b/docs/moba2.png new file mode 100644 index 0000000000000000000000000000000000000000..07426ab1d0576f67bff38c4a5223489f1abe27c6 GIT binary patch literal 117561 zcmb@u2UJsA*Df3jAR=(Yf=Ck;Q7KVSkQ#-fsGxXkp$GwKDkV}v3rQ3dJE$B$q=|xv zl+ckt2%v(}LJtr^P#}~L5(p$A^=|Z>_q+GM_l|MLH~uw-BkY}(z1Es*u4g{8Y#&`X zZ!5oX=SC0+B!A}gpBF(O88isAe(eTn;EqkT(_7$UO~^%CYfy2g+6-{9-uJ}06ChA& zf}GGp3b>ZNecCAm1XB3C`fp7O{DT*8Qz`VMW9TKgPiVMDus6sy*xNfW%rG zTc@~+PEmCr(6?$GkY0%;$o+iWZ2 z_aPwx&D(QI!YzP_TBC*YwH;z2g``UuL<>J_zItNtsf!%=y5v3$LehJPkZ7IWtp?>Jq_vyM?&~Bw23Ds zuiC`Zki;(T+i=MBuzDdT?Q{GwEfZeSZD`X~*{DfaEkz#v#D*NaNZ#SV(hbm_n)DBk z4Rp<$|9@8;$LPhZd$m!uwb;%^Y{^~bejC_d2YHt4>31FBM02n#3KO#Mm9~yFlDxit zK&4tzKEzluZ~u6O*d~v@f3I$yz$sNgPu8rjUUVE>R4N>nj2P$CiHHNGjo5p|^BChL zgd{PwMkx%}c3#KsBG>vtYKGnf;le{d@@@LH+w&_ozXi|-RT?-Dll`1d{Xd!w_KIxG zK=!&4nV(;C1rPKr-9Vs;-n*MXPt!D?f*LMPN+s`jcKq0*h3>}TiXBB{$s+YY3-Y1$To^<`!-Es7RnCT2m|^ z6JUA3FXhR=R6nQ@GN;A6-7zK887w!_~6aeo(cvgsBRi(74IGE5t*JD{)X}O zE#|b$otu-A<8_}xC0%(f8$owwLyxZmz572XqsdGo^DTH;_&v|!YxKgW@g5epH>GZ* zj^3C=lcSZsUuG54j%pIVM{`mf4q+C@^Il;sg;Q>W&R;UT$tW!x8PVnU8Onv2my`5$ zMpOv%{_ZQ_?ZQ?}AZtdt{HD9whSL;WU|M#7HQz^4&Uldg$jzVM5(;{CRjk4K< z(pP}}Um1(-c&`H)YS)bP+9^geS}%3P5~8h@#LlV`?xl808kQYH*&UVdYbS#f4dKu= zdmRx~Lt~`4dbBEfmtU;2T@0)?Gz7R~6-Exzv_l$?A!5B_V4x3RiOdgRXH6JOJP_!R zntB(g;ln@2#qm+M-1?*)`m4u91e{@GB19Yk7yMNA!-hpx!1qy~8{2mMFb@7kl(g zr}Rd2(Psze`GB-d>j~b|ngeUxomU_rumOc|Gp|Jkbf>%Lt~_W{o1!(y-8tfy3AlPa zG_*vzZ|FiJb7J@ZcQ_+UV_>)}h1;Mv2O%5Q+`0MV7n1xI%LU){goizl;$LE9xvq-Q zI$<3M^u$Ky80bQh<~>kD1q(3N=XaHSxv{!XqZrtqGnym6=EO4q=9GIr3j*}F`=9y) zf^pmR>C5faIjJ;)-!3UKe_8Wrz?xGp<`FePcfRJXQv-cy{k;Y)?dCmyxLv<(=D2RQ zT@Ib1@8SbcrGH!ElQF>V{oD4bH3D4X-)4UdI9dN`uWqj={O1C6=toQ=)86mNP}x@# z2(l0wcB7^9^@={*hcnnvf6>R@?*re`NPp^@i_a;h=9jK1W9LO&6gE3O+|Or0a8UFr z>u8G^IYyLm{2d|l)KaFR$|Ry>ka-~CDLHvwKp|JRtC^d_tNK0?yuXafl`^ih{X6uX zGn+S|1^cvi>^PyBc&AmiCO+e6xzXL=#Ll?7PGebZm!qa6d)UO$zfQ0wR2z|q9LD}6 z>^h2~s4fsEO3PAQE>+%0!b!AB4<`g*omc7RuV%k72DbTC0B-M$J6NSw%NG&=Q;rNRyW?iB#BKaCgk^abj!+#&+e(|y*I+1k& zEJaqlj3Y-a`|!QBzt9bGKc>_m61tHVWLV&U{0&1p+Iu7DI#i+k@IyVkss+`vV=kHi zrra^CIJd0do2=?j%LxBKIe{RbC4XxNb<+K~b>$xZZ=$_qDF-JkcN-Zlw@=i6i&)Q3 zL&470-V%;`Q+)O1Q z)zlI^E`L&3;*3n0GJ_DssYpirl8`Tw1?v_In56RYae~egQhRDyb;Zs@uK|9>-B8&uUmxHrfG-NWlYbQo7csk-k?AN9Zu5hY+o3gr$ ztKr|p{twmVHSke5idK$RO2*_3?n=w1%y8V+5O|n-Nl~M=XHTnB@UbHrrDExpep%Jn zauj=3Q8(1`m(h> zOTN_+_+*)&yYpBi5mEbj`kCv_;bF!Ks-rJSJE*sz+S{jYEbzEeMJ|Ju<>zDZRwSSB zZhc^?O6#^+#XMfrM>Qdb^K4$!4UJZxMo(B0hoDE@kXf()op>8~&B#Y_2ma%|fx`vRsm`z=Gpw>0on0)$7abCU>6!Ig3_< zWmV^&p9tr&(zfJyHSItt@M{7|Oxtb7w;y+&?=)rRDBgPHo0_e9(B;|dqiXU6{IYSi zS-87e;`35(XC+79)}%tnR*GBqs_Ig)*;LKdGn-I1byC2e8b)E_e+WZ0ql}^i0cL`C zStgNomUQ+LJQ}qJk~hXN#AY4bGV>qY`hW$LRDS(p@+SHIHlzl!FpJBy#A(aUUq?uH z%UhOB^^uj$sO?H6_}hCc&T;j7ug+QYv)yZLTGu;Wb%SLb?nW%L*L?RsjiUB;RZT~% z7ZkKySsJy)QF@jiY`y{JXMQ7_6mxCA(i`eebx(O?8FP{C#LoBy;fU3ePoWIA#R~3U zBX<1a;{hC}(#%U+g4-1C3+pdkmidqMYm z;g7#YjCOAOL-=q1Lo*xDYxE3#ohD!CVV=$c7yoR{tI+=ym;dV<5Xil0^M4)y0yW&* z!&~*8f44ibwk)}SFF>Fz@&E6JV2>PH5i-+P+SQU@?rRl}Vc#RW&>nHo`YX^(x*=j2 zGPc zOF^^lEt9(KCv5Sf{)Ervb*RXk_`ZHJeXQiOf~p)U-HgobYHNRyH=6XkB}#G;F}(mk zT0s0{vI1om;3sQetCOyIhoM(2eNs#?pXd1Twn~eRRo|@+jQ0a3ceT04o6YVAe4xC% z^XNurc9V(4R|{mnQC-A7l#7{{k(IpzwPJp1uNQ?y`zZ0OqWX+g><$Z2{q1m_B@QmpZxR!IJ26tA zV+B#_xtdW7nQ3!@SV1l#%pfF>7D7j%)j09xE-3TK5T;-LjC#Jy(L-(la8L{_(9ca^UDS0tIiQ;Ke;D{5(Lf2|+Bs-z%Fmyz8Zv^CsmL%bjt|H6wwr2_Z zUV=u8H6oS zwfh44^*rcWSk-}zA1nzZ z^be@p*w2?2pwquarxSX|k5MK#h%M9>gszm`U9f(gJO=fdpFLE4mZh5`Pnq9aYG?kS z$t@hIpMoCsl+3^Eyi0s$m}BtcA8dZU&3SQUSrK9^i}9ZEt)4q?&iH!{hFGk0o38Dh z36BZ@AJkb&@=iy5@Du&)^8~a-8)5VVYjysloRV-cDv1=S8dqiP6`;2q?b`6?Z@$!>r*xIK$HwJdUAO*M(T+W69}z!>X|I zXq|uoxErg$29`3{J9&~4)19j!Y+idUXyT@(+-NNnKn>T?R=KCj!xifZww97j;BQ4c zg=bZ9lrz_Tg~MIp4_vuts@e$ioZ$|hYrWsRJ#~u}pGoUMVpg$b# z;0ITl9;#3FPy2gy{oDb`N+5W;f0R|648^XhIi$vx`6FDs8*t~NYVC$UkXM|dXz&~F zvHQGd&3Z{2r3gyXR$=3wi5LlwX_dxnb&wnw^38f;!!$KKFeUv3A&-XFixS25;Tp#r^EMYVTHQHaPs&c?6*%`Xm3+c#(*KNU8YRFofH#@(Sepssp&X^;XAGo z)Rit(KhRu_=@}8_GxJWAj_5j8Lv3ZOd|lX0TQW1-XGPzbR^4(a{UIIioWj0tM&C(2 zUWW^9Xrn&&TDAL;Fm&ukKuBaJtI+ zXK$e{#f*Gx#8zaJGxjD%Bv1hhJ^7&8(s&v`(Xcd&svlSb_?a~RvEL`9;YgdyqEm9X z6)mT{t}8sHP2;@JI(pUY*hgRHkNeeBq--qI--vcN#&QplOrf9a$>}#T1rVWr$Os!YQCU6c z-%z`_6U5gE691O4@MwT&AN=x41ZYBeqLocn!ZCgU(p*3{*oa`Bpfv%qO=c(j8FB9 zK{d#Xi>FA5RiOez`FK#u>x|CmfTqsbZDGyu{d0(F(#>XOCz#M87kJ;5=JXAZVuXdy z_`0^NQjgyPy>nBi&9t@=tH+2QzHj?VIb9etVO5{n#pT0ZF`$K<;SW!c3S^Tl!(sq! z6OTi`jXSbbb#-#iq0&D#?-Zi_D3LT1hv@5Z{)r{r1vvV8vsh8hGN=)&U5@fj#wwt` z)__++l{OI(RS}KY5fjJi%2#{m`iU@ZE#`%)aK3uns6*R`lm-@0LS7^1MIK7xdhWV3 zeAV`}_5t;i(|+F#yAZF}sL7!Tg0JDP6CErD990ae1xU7_Yjm6Jf%FfAr!DZk!ND-`kSUB#y{EMMR<3EZ+Sjav$k+pWD zj%Bi)zwxGBHDP+Bgkx&!Rh&NwzPU1qoa-SXoQIvBP^i$vE|P&rPtqFVx=)+CBCqz3 zkMJrCFjxv`qElsS^kk63AuNU?mzYXu1M^=3P`V^SNsN?eVs4&9??+&wVfJ&!Uq|yq z49vp@X2RQMyp%C92314M+Tt5b7MdLPHkSPT0?BV(>@@7HKA(+!j%2s?bT0Drndv4n z>e2Q%ENW~Ez5zJt)=h4|_`)yde2jVQNdVI_%k(l&7eU|7e+)#L8CkqKWu9}HLy8X1 zH9AUmYWGPyYj71{ygmRYUfE4_3f%DQJ|Pkq1UO4i&LjtqE*C+JiBZe2R~ax)5c9QC znZsK513GOGy76qGKg*BFaM{5J0z&^-@Y85=KOlK}aqVjfJT0Kzp=zl48n?nXVtMwx zKTFk`WxggpTI?t6;yy)ooUpw%l~lB+28?a*OKRXAg$r-{GzSiiK~E0~WH3uLM?eED z`LQQHQ*m+iyTQC|VEpVw@KRC$F8xZidtYYOJzQ|Y=ngUlPtgwOV+gJHezTnZKtgJ* zS|m08pxP06n$E(K{td;nDpsm9W`Jb_>J@ zE&RA{6^GiYfGBvQ*CSt5VXNm5Z6G5DU=mBCf>fCfUFuTqDiMW8qVPU}U%x344SS(Y zFs(K#GU`eU^~_&Kg-K->ZL2RS2N!*tql8lhNpH@DOELkK(@4`Ihnm_Af9ze>K}FJA zrtoNmv%uBL$W!PeU|B*gH|GfNc9a5dhVXJN;OGqJCeA zMRv7hzFG`?I5@KeRpIsIXc3%{a*t5U2zodafbI8LUdYoSf0-S3V9oY*cNaJqF(s_( zmt#;dC7>Grl3{n4w++L>=>V+%>EHd!^goM}UMW*?ok!dR{%i_Y7`Bs-M$YGdHy+As zt6d7({$!r?VS2nT)m#A8po1n53N`Z0qzLAWiV->ZgTq`MOj<>LLisDN6(7}G zQFf-xk`TyJdPx^_?i1}G_>+1v@a;d;%f9?wyxGB2hTx?l$xn9Pw02wpyuAJ z`N~VmtG+I{PedHGABDliWy-U|T~N+fAL-v1cZ8SZ6soEj5wUll_o-2Uf$030hl!R= z@OPj-g5l$i^UMPJz>5(&sgs|C6u0&e0g&r7Nwo!=-afOQkVWN1fXAM_D8r#M=8(M2 znS0J#j?^vM5KZ8sp8PZ4YG=J`_eyXH-dTSGed@bfob+%otpegPhz(P*8;CZXQ9vtN z@y3A2gOi?85Bi6yBJE^+=z^{6#pymE+_inMGArN0XWa!q$t#-~_6G zAn_|_YKoi4Sz27KYkdJm?YCCApS9%H5E-4*sO8L?(|#FU$By78*x?$2L9h2Efmnqw zDjLbOBK#ykM80QAbd934N0KJfPbzI}v!~i>o@RFZTrGCKM4FUopa!#X8F>bQa zKsV5_%d~Y|OLtBLi|ms|ME6=OI7oUdL^*NL;=lnM)Un`+y737MYe#n+D4>&u709V{$!&zvoHL1vA5P~!kl9yUD|qEa*3UAv()z)y zLI%3ud_t90o^tSi`aAvNt8OOz}~zY{nsf^U96rtdM)Z z45Ry{2epCw_3Bg_x47pi;~N!kt7}H{2xqC|;dw@|sY=D)VzMuwB!f-z(u2IxotW;(_RXx}ng@hq~vKr?Y+ zqWl)$quk%gFqR~b^4zeFAX_7P17AB<P``n3;J(+dC;zc{B=n~7N`S7#y-k}H}?vS;ffLiEJ-39eW4!&?RrI%{r zsJf5?ZB}wleA8p&)zu^H&bF-7dv)aYz{G_?sMUZ)2#Mb*Z57Vw#oytM*66%?r+_;3 za}PoAB~;*Rf{2BY#<9iR9wPSB9&@q@Q6q$W{_?c$-obvOXwT3w-MxPd1Po9v%AvE$ z*+w0fc@_u8LzML$rWqHnlCX&$u~a(=vFuM*U*Xw?f_0r1N?Ym1`6uX9Lk+YM)B+Ge**sgz+5RN>`Lcn1#`XH3AP;H&I&UbBzpeIcyA6R(7ar7 z-u%^STuqsltc}Q(CufGIKL+UMJf3=2Mc2VXTQ>T>#ee`IG7I(kB-4qxt96uIt!E-cjZ`MsB|iohe!rbVflt23wVe8Pg%*U3ir%-h>e3-hzBe+p zY&GaZ5u+g;@1TK~9s`(t->UPv$`uxQbkQAGbiNV$JQYvYM8pqykWep&00Y7eJN1>#sypdT%A0551{U7B~Bd zX)nxDyQ(`InT;*!V;yz6yAh%0h%K)d(oAAW2J-rL7Hwt3$nseF90!Fi&=hM_K3m~< zBp4CN`4Z9&;viS$%$RN?vp1dv9>l#k&Sk4=!rdaQ7ZyQE8|{uokIsz)^&cvNzPZod z>nG6F06VKdQj@i&_Wr=W>SL!(jD<65QX)P|6MliPJ%)21j=US_WY`NFr(Assn)0d5 z+~KDsDny@pw8nv1%#8RV7h%ba$U!>5lEeSWsu^;uB2rBwDfQo9b^@w^E7az$vkD;x zbl7EaD*EVItb1O~%vCa_Rub?GO%4A%JX%H!&Kk9ihm6QY96gXY+6(Ok(8IrxDK3aV z>$7}SYgGzME?`W6(nRYVCGTkGG6#G`X=$|LXLX`VL)*IY?!BxcHVWlxmvvJN&&7{_TK37{4;q?pgO7nrH})sDkVv1abi9VI?+UlzAU_ z<&0`iav&jaL?AxDw25lb7Jk&cxTbYZxQN8r9k=^K7;pP>m6>ej{d443_JXW_Y;!oB zj0|Ja(^{k(;8E?K7nML%;e-y-TltxSe+GyL_^}@Irv6kf6<^uN`xeOoWng?3{2>tE z@|62eI3GAZaE!109`iE~BnNuM!=wt}2ofM>oC11~UxZ(zzL}Zwh z1DTq81&e0n!$B?0s(FXYPyroYRm6&_SNf5thsz{OO=c9(t6*Kgv#%QDIs!rC?dm5ZrQY=s1>LVTy5_8uW#m4?S1Y2o>MQRtYubD z#8Bsyr>py3He%~;2m1Qj+uh%p7?7U@yX!%9|2&{M_%|W&kz1Evi+i`*lc0}0vj@$) zDgv&(^sKaRL%Pz~f(uL8n!{C&+i_sINDGwSil*U}gd#GK=_Dn0O})=@czr=)L;g7T zk5`yn(qGP=S+A7J>U+J=W`ExUt)uon@b1P&_}8R|jX7rZ`2G{YUiQl8CJ^U4PprMVY&IBTM?7qPsq*%z@sg;P zjBXgZ90wa(>=su!|A;!EqB&LflGGcSvFyj}>t<4WLSfg5NJ$jwtbc7$fuOMEL#Sv? zu?@=R5axZ;-8opI^p zD7~oaezO+aYE!iIjOXu70ok2}Tc7D{eb-181f%^_y+_{*42`p?+qb-+&h;+z5X$3? z%lE4YImri-&U^W+%h!BH(X`2680kyCo~_o_8B)JzAF;1x2LEtIF+aAw?qEKD#Tzr$ zA-od1WOOsnOVl;Eo`1}EG|gx+>PyuWexC2R=c))HS0@9M6-C10hBq!nPV{io*jDZ7 zHtu?tU-jRrjG8j?boRtG$8C+J}7 zc(8q>B}HYdlvFRsHN1R$o4Jgrjx@!pR2tNvhfGs%pq7VbIR%@p=+w;H1muuh-7Snn zPoovQ>UFG9ohnZ@qdV7Qiv~-VJw?%7B;PMnm(O6asq};Rs@>zyXTryfPHX-{y&Z3* z%YsMi$CxNnLgh0Mk zUmhat-dM+xV*LG<{LoU<3+a}%OvvVEGjNi~P|Z+e6l{9OP19wk3-8h0j!)?!r(iCP zo-)mSD7PiEFI5Tj^wus^aP`+_tuQN&(f%b!*zYvuo!q@(p1f!jy5y1;h#ad6ShG#d zoR@|d>mR)UckGX){t3QuaL#e;E28=<+TxsB!*KzBWpHac>~^g@C0!-4G1!zGJ6;L; zwb=2^dx!f5K#E6@4<*1{K8l9!#CFA9fTu zX4x=&o{op?3kxt^vf@S-GEYvuHWhy$=HDSbNN4XKp$ax_6eqa;J`3*o)1vqf7$$pt zu(IpEPpGYtqU7xvqgfg;>-YTCRK_a;#5jT~R5TllJGnhwk- z##=1Dx(OP3zFe89|Jzij+RYzXNW{4XijIGpt-7-Js%-!hyheS8LtbG!pEF;Zk*`S) ziPk&CG2PR$(bc8YlWaI&Ibo%_w5&2|dL>uzdT6`KgTct{V#R+2v53$~LTLIXdsoE} zxZ8vS+s&GHMUt&sEyKo4kU;Jt197iaih$Rw67=TvD^}0<-I{8-SX(4$T3;2ZbCX-3 z`62+a#D0+sP~Z+h35JvQp5fKDt+mtA>F7ma2J|5%%ao4rFmMi3AJB(4rZRAHa1J z383`S4S3G2TCTU#-rMosod-C>TkBy6d>udR`*l>O_e_=gjOaEcqyjOrkd7cv*IO;t zKN(0^Ha)U^k0|}oHJ5JBaPExX0iIjY694I9`oSJlKiPVGtX`3V;tMo?tA^vP(D>)V zQ|~d#PlTg+7za5~@+(qc5?}5FSLX#g4L@4|$mH@_X#(hi(UXGpKX7|1ZcMqsYj^00JLUyp7k%8%U(b@M%;`)b?)s<0QJep6X8*rWC;soH z1S7^^Qg9@YJ%!&Dh&dNp{HX|fgCi8#u<5YnTPl6r}VQMn_v zkCb^WmXFi(%eL|b@!~{c*P7tmnz^#JI*IyPcj3fvqTdBr3b5LSBS1wcelzIK8RN&y zD)sQ;?}er!wUBOaXsVn+bg3zKB&6kRyjIIg&(=}|=6cvjP>rd$PdRNWE2`eqf0EsP zLPmYP``z!AI;1z(o&=wpr62Lhh5%zqi^P=3sf-RBg5I9$n|V{=*chn%`qzyhIs0PE z8tF;rzx^)4@_x-=H&9feXZjgk{aumZ=KyKB7SV0Sl=&Hy2#nb#=RGMvB0qjM#((t(a5|NGBj6M;}38~&~fS^Y5=l$u;tpZ zkX)|kZ70=ubA#+^XyyE3L3_Q7#?NKqu)tL2b>dDi$65#Ugn3UnJ%D4*JI%zY_fKuQ zvv7bfw&Vd7!KPE`lw!?tzxUD+k?{Eq(%(;G~4mIvddzU3HC{6W4^%PnJSBCqq z3OsimENE=AiO!E=VXa`4=%8UYRvVpyN)&~q-TREQ^ka>MFMIohg&B|YjX3PKZ8MdZ z4BEAUP1>r;s}1<(6v4FkxgkX2hSZLe#}LgWYuQa~g9X0tWCsUDp}U!ErD)u_rC{lw z>l88&#l-2eP1*6`b)NfimZ1KvC<(2DgP%-xiF-?4ccDWpV8V+({oKgJAu^B)+h}nl zijRW%TuG@@$YMS%AUyiZwIIg1GhKy()uXvVo!|Ph)3`6`4Kz8dsvN1!s%(R_p@)je z&pj-&!@QvEhZW(`R@j3>Xn?mqhGZ5$_rW(O0BhS->b~0)A zeQl@@$N_9e5X9lw8WK*ox-X0`Z5 z@z2>=4(PIu(W19ceLeb#m2Vs#jX;7vK0!&&mV_>RRYrOw9-Uh*0M?h${w*bSh0m`X z75q3yThS?6ZW<2y^f9tLvWKw@wxk!9w|CoWGNjH8l#sB2ipLR#dtg2^I-L}?a!$2|)CfxHy*rK$;wz}h1hWbB%N zw{|!a8h7W7BMr!iAqztzn9nqHC0&KX?`OD1(f82wvktk2FxecWTQD}Ya&n@y2*?j& zYc7-Wt%udBQk9IN65sSl*JQsjhVU4j`#I}|<_{x~ zlPM{ka46U1o^_yVm7C91^8hb;(g9Dw_}>fGY$cS!eH!S_-59D(X86;ZiN%x%h_JcP zoL+cjNkk^_+xAY22G_xk>cUqdu8Z3w=0p4L0?95GH0CR6Xl8mRzYtDGFR~Tw&=K1sjS@mxX^8xqqFoi|Vt$&>pGLm{iW8-+hjZ-zib&V# zdY@;Xy8Dc3cm(5GRGR-Do@=WcuSxlJ0!BD~lcx(L?pB5WB6Y>khR{0IUP6Mu$J>94 zdQvlg-qQ{B4r8w?`-mC+r7mio?!(yvGl5E34+o}d#gLDuHSEX#+=e}rwbJg}!-9&F zrpjDXI^Gd5q+(aU^A-z#g587Vks_br#OFrx7l_8;7U`N1nW&b}KJ?FuX@dD$qJ`cX z_^zCDt%L3nf7~^;^lsgHW;kNdZ;B@HauFYMFZ+(*bSI#X$YUm9|C5^0C3yImKXmUF zD%^Y$EoNsq%%CFo-bik6;;y<)z2}--Oxh7lI=yo~$xul+e0*?}4z2dRB8N_V^OsCb z>xD-6UnO$`45`9gpPKEJWcf(E$gO1OF-^F=wBEQn_5%@T0c!ZTM5*#m9YQ})Z+~Lo z4DYmLS}-2~l`<%ZIDP6BF(dTiPX6#1_pq|qqe+@z-Flj*d!iJ8mTfOoVhk_cexM#^ z?<3HNW@))KOax;h&_lS`9?kS3l3OK#8(S{;TpmcoEmbwlk^V^C?Dx6n0?4mg+b9-p zR9#d4kfPEQXz5$q7eo&A)eaYgKd$+q(0|H@R=UOQ0sjp@@^e7=E7kL*5VA;8XxcX=pkaN2bOA&1d?A5Yv#4Zhm8V-QIJ9TxQdS% z?S*65w1QBVsP`pgpNl3v$u2(gbXvc+uim=zJmh2&RADRMS;VBOzpUa6`D*^&N?gF1 z)AY`Weq!uM$+4{s!vWvh#{}&tL%Cx|YzB*_{8P*V)6P6kPkk{0yqgf<<)dM46mNsN zAgUX$f6$@sOJ-0~zl4vF6w#t_^YK5-ldm|hP3Mp;FL-r*v_D&v^h*LLiI54RPlG}@(yn6vkwWM0wd>2EouutgZPCf|pC zRTfoH;ZorWQ4HuMt|Lc@y6ujIC#lN;so97597w>twq>8)r$SO+#*HgG~d>D zbqB$lH{Q1KHXzdWf%7)2Hzbs$yi9cR~q=?AcLF5wV}<~ zkIxtWJYJ%PRQs4E`B2_5#T> zZ(svupDjz~mCf~Gf#T^zwogAh6R?)UFyU9&)*i$W(|9$9_=44($DJ8(=41hr?&r%L z7VwKLW-M>+^0%RGmIm?~3FUFP7P!aYkX$t4^lZ|lvsH8^iM-72G8S2s6xqAG3{Jgd zfEu=bT;0t&R-IjY

a7G^Wa~D!_8AsfIb7bTGcp58D+vrEMfds+-;zGVP&@cR$k$ zv1m(Z=UByZY^Mhkh^1rInoWE`u(!|fN0n-~{dykx2URyF*bv#n3dxFp_x7Mf0;x7b zq7vtP=!YTXq z#kr2IEVhA(dV*_7?OiFUd_zx|1dh=%y6wHMSm9>n1C6K;&x^P0HhSv)zI1*yGWkAb zeJxPfxV~12H9Le4+%*?hzh@Jgf%5hA@H82lBW@_(88gdwt_oB#v=#g$J*hVTa*;R+ zY(YiQ2Z(lCglHY;;lckR^Ab;ZJP98dt32C^k0yk0n>U54+$b3Gk76Wg8A%bHxrX4& z8@nMEwO%u4R@OM9qpP?YeGm&eXUTr#>{+RTFqa99CS1A#g7SyS*6Hp2;BG?T7+t!d z^C`7!K^Cp^x;_tEKLx*HcnL$xt&SiezWugRJm=tiU+AGw#BjHOG8NefzugQZ0B_~r zpzOO4^UrULz%|3^A)TgfAGR8kv2OTTPdwGatkNBkC>|)iQace1W`PzJv zd^80#n7W{9X4T02vll2W-id8?r8s-fJ`uErR@M7`*7rv3Q7n&Syd=)gxp}PfQ0K=V;hpmpMcwr@`7lT1AX?3g?$vq(=<%MdZz}-PrQVnw z*Vh!&stZy+Y)4aVTDa9SQ$GSI;_2Yv_A<|II7#k7V#r?sDHLgt-SH%5)zQ2xPlLJ} z8C)B9<^`4@BOKouJ(a^Kw-N?oN8U7I+qc&7KGN%sAK1%$;2X3ODU(;8FaZ;-qLhi6 z{!1u{oZ|YjhF}rwp6}yAly$7-4$H3xB6af@iQar2I}2)e)^fTup>(_;H`A!)Pe!G) zJ~Oj^@mdwV%=??Yr~oc>W#SY7de>255~o7=9^5%owPI?&|={JPZZN zkdC2VK!xW|8H#`kPtExUqc>Tq=Jh)Z+7JJQWMU)&JW%|z%2blIjFu;N4oC#lm%Fa6 zbyDwXj$ST+0d(B^beG=U^55#6C?DzVgB|IG#<)isBzUJ;R0E8>EBs3%+yQ(fG;&SO z1#WpIcj}oGp|q-YQUtm(c*qnkJ1Y#^BfxX4TS(+3_MkDwUnzCWqDzMoUrXfxdYSxd zD~6a=u3=5wlRHLJa9m*O2Z{fF_TQSahlKzOTPL8@`>Td7EmB&(tmN*el^_uEtKp9!3C$XC>>ws24AGDN=(% zlvrV(hepG~eXwrvrUMVgtR$IuO6fy&g7U@(ol=+1_{_CE^$`XWqjCj z-k5HHZx>`&e|sxMP%bi>Ds*8=opnyt%)GB>J|mv?$3zS;*6bMlxF`NFwC<<;D53~p zkbrx(>HPfRD4>uIdEz2KQ32Pif#uaK2BIx>63tz!-oJmH0Ns0xtp?6fe{h9}%v>3V z2wsv_s}byVWZ{h9&aix6tpx8X>|C!0vq_2&mg)0_}iI$8kbRnl}PRkN*Zk1nRsr(Id<~U-dFt|j1Q=#Ud-h3s-MyOUHVg5 zAsYzJxEZ!Vzj+S5k99j&?fYy$ZyTOft@CNl2$0+${{a zcl69NEZ0Y9#Tp2Ynk+`oEW07EeA_hH>lS)fd4G)?7e|sm2~6zBst+78bkqb%s-&wk zBU&zmB0|IVQk*|M6R zJ$3Wm>Z_j17XVr;QZRp|>{>CJjvS2~Rm6LrW(j;H^cI!uF)nsKf&dL19D{zdpR`dl zACXG}^-<+IYkJbd#rH=M@^9RV>lV+J6RiXhYn1MM-)qDRAM#daN`AdlY9|j2;r{&q zKak7?fwc;CuORyj>P$lf5ekr2jk z{$C&ST@Xl)OmXdyBjN{v(WQWyZW*s*x938S$}yMa-k=q%cz=XU>caKwNZ>nPgMQps zer;z^^JR`85xd=9?;iYp6BKF>dxCQ_*&nOXt2ZZp6;-0D(T6&6RvMTvCJpbNJQzzQ&u+AN$)`iV&p= z0>!R|D}Oh8CH0A`N$Uwwaedb1s4mFxI?$p0D{fl<)nVgm2WbMoW#PV;;0>li2IPJr zn`tc4Uj2_-R@-sc>0Q+aV_@!0Gb&5(auTHMl_C}COx6EW4{Z{&TPI$Pw0EEDbnQ9J zqkl5YpbN@o--;fODX+d@eBAN>zpqH8lrz|)Z3B>3r!{0+w?;Ov5xfo<6(HBWz~S%~ zNX;_56Oz(N`}wT)b;10QJ^&`?63o69J4mYYWn*Z#NgIqu*eD_#8@SEZ(oct- zxsH1nX3pQm?j2Wj_%2O61~wSoVGvM&#Zy8HiDDcRek5-OESQpg&LyG10eNM@95*-{>eMS9cjqX~INNB0l{sxAbLhUKY-VL%rNYAb1~JTK_0v%Itru`>n1#%{w@-Q?ha zpZQk635$N)=W1X2BQ5XNXB`J`Yv*t>ok#U)^)Tjj9RER|ac+55&n8=4Pp}XYZ^kzY#G*V0)wdXSq)h&R0R#0(niNb3&nY8gpilp6P7@kMdsc=V!iZ>7^*o5Alqia&GgPFvE( zYR}J&j}_YT^D+$9ni;`nVAflb&e&W1{`^5*%?#a`7c2ORS)DRRAtv@-q|rkTPpdPXx)rY z?^b-o8a(J7dq1e0!OI*aonO3Ss)YLaSA{-*NIu8ncvCIKh<+qm899IaRnh;t^wNsF zjIQsx0F}QXv|rSm8bO9LzN(;A(Wh#VR5Z?d=!vDmT1#+O_daV1(~Jmi-kSG{J(D2Z zetzen3Zr%WEUnf>Znw&xx~Lzb8k36B0W`7Aq z1ia=J5XrW;?K_Q7HdCcu8yJF4i;T3$`WcJ@KyL0@gC?B*a^1b2^VDYs)#CVT*KXc0Pqt}76H<&D;jj6#bL?m%j%Vlk*)dD9`bX9Sr^CFYf)0_qja z7>}NG1f~i${Pt!q4*5T^@3sb+^IRzNN{wn1n&}~&Gx0=`bf`w{Tj#5pz8G{UGZn`- zTa9;0ndX)a$61*{Eh@(SPWJcKZJ2Bf7ot)F46Iv^aCX-whinL}gnMj&ARk@i=MeHp zKZ`xPe$WkNKcnKl59tbbVBSM(2BLidqa{CCZM-v%DX0eE(R(uLZkIfOXm8SsxQTfU zAV(QF8rX=5tfRq6l6RffBG+%=cy~cx{x*|u_htMFwjG#HK-c+%^m_k!!-d~xJf=(w zctVY;y9${vAgO7_4zah2O?oKJR_F#dV3xE&G9KwprL3t!%@p?T?oU7kFg(m|^txir z9R@OhfQmDYGRlJ&`mV+cJ(ka2ItnGwa-XLf_l$tuLI7m%9?&c`V6W`N8W=`Ha3!V< z^q|waU4ZdTR$f9*hS2iA#E?rYj7S|eE`o`Bx}Xrb^S|T4 zo3IF|A&IyK|DlyrF0>u$4x7Zl#20`VZjnJ|hXp`-4Mg#T{!pyr7&QtHnp_@LO=KV| zx!ow<<@eGd4#9W;yjA(Xu5ZpQf+5 zJvWex|3jF!37^-JAkrPZ!=Sda6yZG>T7;kzB36}{&b0T>1i(#4J0jJY+UGt*eHsde zTQFvxf3(dye{-^+s0?T_&>3MX5BVHmdOWSHGrpqSuTf2yDt3L>C2tpG365$yqEQwL*XS7Yl4+GKci6(d(yl|ZY@ z&V;4e7|S+joKpYqCA(rUZ^Zc=(e_1kyCcMZqRxfCKwz0dEm$B#sR6Ry&I(!1X@ug> zYbCX%qWBFW0DzGVootOflt*frZC!PqZA!jn|6+2-sr9@foVTk+e}Wwj(4WB(Pv(9O z*rYjTgXb4@PlheE~VN zmYAVaG{k=GO8eRNvwMY)XDTp(D>stv39yE1BvAuH#CC?XZxW)&f{`lEQ4+*tpPSw9 zGdHnm=lrMF_v=V=Nn_uSj#|2UkhGbsXWL+kr2*6)C4BlzzQy2^VZ$dbBu`o^Itr9+ zmmjmQAjEZoJ`U>OJEW|}N6=Owm%769m&4o(8oa7p(JQuJW7%PC8sVxqoh+=Z$0jZ0 zeM3O)XC&-N_hP8UF=q%TOG7_J6=XWsvGWjUWnS;#30Y(baP=L;XP{w=$|?iy=Px6% zsp0$8CqaaCwU#AwDqCBjLh+t;y7K`^K|MF#)%3#@!^yQBHfhYVfKires9qHwbIjz< z!cK_7PEq`p@+C*FSaV@@{7Kp-8uZQP;ac1f_Qtk0{Vs3pMp#=E^cO!*n&H-3TG_eM8|=sXk`La_ zb3Aoq^P{f4KQc0DRVI7gWrkX5ks(dL%TwnZtjNp29-9K!vKAg(gpUNsx!?4I zZmNY^v#4uRcBX(akENCfJuSV83Lj0Gh3jByE4P7$@&H5+yvA5Hz1P0Ch%nu!=5!fQ zm3P<>c+yWbvq4!FXZ77sJa`WyfnlR$v89%$|4Hj%(^j5@xL*r!`Iklubf&OkM8?pz;lkK8R7g1H`-TS5pTM~P-A+K#&dcg?y52E;~w?AUhsa*|j zX6eu_6a2BD;Y%(dHrke2^!Xr~>aA0OgA2~23Bk_ej=!isBAbNUGAA6m)DPus3SG*^ z#H>AcMnD~(MJ|~yqxu9iuM3AQkYBU6;gy2U*|q5O^#@v3vFVa(JKY@{-7dVdFT-~X zHDHV~r=%z@x}xy#&JMwWrZ0+_n!{8jlRFtzG%6=-mP*CRA4mg7y``rTWJOoThiqEY zO5@}ijl#1)BkRPXo9qkQee;T|i_9&nm#yp14kKh&=mtx8YntJza>x9kA;C*WtQ%^l z$vXAZ@7rr<)%r|Cu*e_tGIw|@s20bshw^^?#EbJF$-g3jENGwaW;%H)&&9Ds9s=Q! z8_WA3IBRSEfhXM!H(>4lUvnb8?jGCO;4@YUIhqIbzAj((VyS3TUc zf$-~Vqp~9U-yB$t$JE^p{M9rRBis&3#{o*W8UL{>Ds(21SvZd#R z#qv@${Rs$8xk)mg)PM5u31>4iO(@J{+SA|BZcVW z3pXNTSMSI&>p$_21kc`duu^XV843~y2WVM`eV(r|YJb6uDpc6Gt;u(L-dkVgn#rIj z)?>AKX+_E7rqPuVK+EUX&@2r=f_a4ss7aHQR^H?hq}!-5eRY6+h5w!rF9of@ToSfF zDE|`Ms_X1Tzq^ay1Zg;r-@%vY4!|-w`$o)Ys-eYv3(hkmEZPvkze>sUPSTmP{5q!Z z8bO}?UOoJj7^P0}q(6=hL}nFt4%@J5SBCn>ZKXK{w@)KU$Q&B8xo=4Ku6Hr9s8yfD z5xHpaQ4UlT7rl^lHd3SXT*l%6nV)Wx_;=^QyG=qzd`%3m6-94Z1L{nN)<7naW zdwpI7@}qmg(k0HCF`b$MSADT{z=rr8Q;<4~hB&Z`rMC<`2^_VOduhNNHAw;-PTR~< z38WTfH1;$^!JV9LS6n>%=<#F2qATrcJxv{zO%sir9~ovdl|%hEF%D?h)iC*ccNp9S z0%|a1Sb=;vFB2I&a~+Tod=Mm3ZOPvZ#d|r&h1i1by!7f|+`2Z|)%@Nxv|YiJRI9ap z7N>Z~s<}qX(kx)Wsq)4PnTrF+%76j8S2)^uOebWACpR8#e$Bsq{0OYE;`L*QKGvjj zR`T&q|xsu`r-ThbEne3D$6~fq{HZBJ9fYS12plJe+>#* zTs+-W{xfKNh**&xSr16smL|2Z&nDRK9;!bA@|OogOt68t>-Y?&@e0`gXiX&wk;N;d zAziKEOS@MtJBf~_MF8ham_w9|;t&GlV*5e*n}oIwA~+5wZe?^UazH4+r57w7-m4gsY3X#XbOOBern2@#c-|BI2+ zVxZro8Z_=5>D)QB<3CnfIL*xo{~rzsY}tD!bN>5RmWZPV6#tUB*)bHD>Q(XkeL6Ob zlM9k=0e4pqe*5&#$v|{lW_9QGSJ+=6Oytz5MF{R^IMhf|O61#UpC=_D1)zy}rlfj{*DjpLJ=P8GMld;JJYgPMpI1D-x_CjX|PD zF+-)~a{c|8lZIoSu;IKCt*CfDSmU%%YYe~CM_V^zzyy+87x_7hbRDEf%!kr4~(_5pMM}9^*FC4g(T?Z zxo>lQJKNW?k-F+$(We^Yb{#Cr_ffAOF(52dzo@3gvv=ksjN2O)>Qr`jSbL=_*}HE3 z6R8bw_cRmjHv~EW;_*fgO!)FEQ~Dl_iOAd_SSgyTJ{6yFL}CVU}z^gR4@FvsO^~`;^}QtdkGk=z$@wL z3UcC#@h|k>4NO^N2D(bxq~sX9s`cH*Ng+}UZfCLLi|bmh=d~oRzm0iWJ8fx7w&czr z?Rbp94H0Co3jNRh^F`-#S`MR{#ocLwQY~)4J}Mo%)3=vz{+(q1hSR8ko|gPI+~Hhc z{!fN%zBAY_ExavV<|gWi(#Sn?3B3*G3l>oKSmV*V7^A}1vOWuu`(IHjpE1l_l>3gi zivLlf)zg32;{8p-h+=Gip<(I~@mrU1^~GTqKGzseNvw_-N7OD3wzYm%pA`hSPUh0| zZ`^UIxzr?{F~Yg_dBnGugT%DMA=%hqNLK_!i9%LfMtXO zNt5^FmqYAwHTL1WG&tPP#8E*|H~&|z{$CHW0kq=Gc@Z&Kl7)G<;$uLdewNL?b;Vg% zHXNH7@yrlsjdl*QyIQIHT%-Udwiz%HbPsQsni6)pFvdPEcUmDa@;URE|A|bZ**+7*0-@59B!Mx;O-4DY!ahc zq;`R|GTkgwCZr{@?!BayfAUM$&*OYfaZ&u|%=>GkvRj!q=rszpsy;Ir0WRkg?=AxH z_Z!|JcKzDXW@F{jT3-p4S=`BO#%mgP!w+Q<*0PI>lD3zcP`echtQCS$W6Ve8d0hJw zBh&ujKyY!Qj{I!sI_D-ishI7W0BiYIPA$q|PZY1gd-Px5|kixT~0^aRIoWm7Jpwp9`DK{Q2K!SNweJ3J5E#Qdae#6tw2! zYyb|8ulBh@P(R)McP6@AjsaLzqMPy5{84j9wH93xtw6@;n`8)o$Y$;XnQ1eaR)+N( zIY8Ij)f1h3APe((%^KWc)peS?!x9ITLf$4`Ufp<*&N<^^-A4%%QQ!D&@7X#OXc|ul z9oV5Sem`IbrKj`9^vchQs*2l3uP+AXgeJlQT+ec~vOi?5pC&w-yhxa+dv6vh_@l3j zU%12P7@t+c_gl0bI%KC*%LeX;el{@#PVY_aQ8)OXum0jV$fDf0i= zq;sCEtH2*D+IZ36L<;s5ET4_pxI4JPUgKxH$KG#9(>860NYL=630DTk#%Xj7u_9z| zYfq+RaZ}cjk``Fp#H{K!h~vTLW`*-lBk@)yC71x62eFGgPy7k%8iD=mh?4-0I1kt0 z{Y;?ZAtQp?lFPH8qMh!E+045ZoeH8uOY3&{ClFCRii>1X6?azOX3<9T3*16?hV$s~-iuJ37LD z$No-9u}>v}896mFFUSmQUyIkv_~*=Eo&)l8i3mXQ2_1ppf4-hnmeQ(V9VL&T9`#lyej{Q19gqxx4u zfK@J>T$G?@gHE-fZM_Z}YNIiX=A;Ydvh`&@{%;>i040RR8(b!RmNYw>P_vvwsXIL} z7U_!oJD>ZHm6qNF5IdBQZBdg?0kC&Af%qk z{mPRoM7EszZy5ac?Qk*;-rIhR_9`#PUtgsD>$?B0SEZy3vCXl^z8ssv#mydL_U8pV zuMmmX`0paY(W4FY6{wJVRje+e%&n0GH5>~tPd5Lr-x$d1!n+R6$oouxte|RwmYd_a zC3M@3_BXnn;?^3_+EZwcxc!}w5=VZw8Nri`!+&f-{iWVW?ea`5OxN$~AT4jjCqmrq z(nj9IVVnM$PHZadP!KlgQ_bKHS{Go>+zXZzR;xSv3f8r1kM`wi5g8R44Z=vdFVy5q zMQ)30_msMk&iNpw1SJ&xL&d{Q6>)v_nDYP}E&(L|^jC|)i&s@Ex0fJ01z&UZz-vx>FBe+;Oc3h0;UHfx}23ki-@RLEY z7L)VEv}_#)^%6hWt72g0Ll0YyCY#zb6j-Q_ISRr@KjP3%23F8l`}3@Wl|NLC-naZN zUT^(1CP#1=f^GE@)_VC?I9bIe1%`2O>VeiYrXl)PKT4b_vNC|z4n{j{FC&hl}tAA?lxHJUQS7+Cb##*j{Cn-zoPoB z{lVMnnN_1vw{)OBr^pFUw}$RKIV_**>kh?Vsu7K&$zHAeAXbU z8l_KowJO zX0-$ZDZ8ByB*If*URp^}S2p-nHC*=jb5y%5;fZs*J4V5i`C)S}CZdq%oDn~hUZvgY zu1(=INv?)ND!)s&X@;FQTkVhqKLym@Li^H^+K22tdYYw7FxUUcpO&nRz2=FRR`TM8 z5%Fr9k5xZh#Tyf(O=BqvROl2po58og!`m>NNydj$KRm=4=YOB4=A;;TvmcI* zc_fY7Dn0FI{3Fs7ym9Z}mb6q|UB69%&O0j_UCehTX=J~K3<}2P#UO@sz73=Ab{6tu zEL6`pY#70X70F_)#^&YB$J9@_9llOy?y2?J#C*h}Y~4GrzHPCVzXC`>)W5MeaR`Zn z9(lDYG`r3HUJJeMiOkNqQ$@=55dy zSCawzsj3~{J5BjB?HY3i2bL!DTq_mZDzG-WNg5E`XL+2YlWXCoq(`xsCJj304s{H^ zW>b1V0axzG9sWyx6?hK-p6tay5PS{=XY#O5BWGx~Az(&sw3g7A6s$DD6*A5M+3dQI z1Mv-r=7mG-rg|mXIOj-TPhgNTBCqc+q5N`FMo8jyDoFEcOERpVJn40Doz}l`#fq_$ zt<`o2;J$iaBwc1%k6-fB;El(p*r^IUw=853B@bG9@4Mg?zeH=BLYUWTTGD{B0pX9K z@|HP`cjN--Uwj2aq#L4h+Kk4&ON_QxEi+PaVf{H=kktolKUuT|Gc^!YnOw4eU0Y`2$uHqb%B?P2e+8O3$Te%PLiO|5r^lE~vdOB8 znX>Rkx+hfv@0m|sR?c^vUfN>f$jow5Y3r;;h+wH0_-`)^oZc%u?)mNq&4*xpzNXrp z$sX(^3s4}09a4BZ#z!;q{y4mGAo1Bqo*`dQ&aV#QtI6|RNL!sNOD1|`=MsYi9$MU9 z+2q+b{Z#Da{GKdpR19xx>Qg?BMM)zb4vBL`clMgI#^Dj6Z%fDzV^JSkogt_JJdYiX zL~-bGX~WT+smCbf;@q?o{lgG-SV=`sFcZDaid*u$%n)(Z%kbOizKJ9f)H4K>ZTJ^P zX4~3bDuz{vXBm909ScrR=4MY!i4FRN55+vobXwYmB9APAXE=8bBpu0zmcmV6z&$(I z^tMvLwM=M5QFX)Stj3j+t6k;f+Ds4j$x3bKS#8wlSe6ZXtqQ`#N$^qIXUpX{^QT*r z#y7lOH!fxExN@8g+YVC6skeTD!^{6~x$=Mh|E4X?Yh8FNKm69Zw>|J{Ya!^>=~X}G z@?5S5R6}J%-f1t@-S#bySVSa1SZ>PQ3#e+TN!x2R^Sf8VjZ!Rz-!Pwn9B*k`-KL9N6N4E`ZEl#iUM3|rH0}@d@gIq02 zS_BqfFz}7C?t;#fbFr6RUbpNW{vB&a7(QVb4 z1uZ^yz2}V1EBt}yR_{sLlU~VHR=Q>7 z+?pSS8@K4DVt}8pobgl)KP5$$$IU$+ zoe$7ejU!b5wFdLnS;%@&-UFtVLu%QgnI`g1#N}G^C8o4^m3YC@TlAtnzV zKc`34c|TFOS~Sq@09$~XdEQ>;p3mo6%#Ds3+D*JF^EP)Ab4IzU{OwE z{*4qr%q?zkqS5cYddUp9PwDNvsFl#27KYRgT_3b7U<^duzaTtRR-}7={%SAiP7NCs zHPb1(Lk-$_@lS?W{R6!g9Yok$B*c19eD?sl2we5Er?0Idy^!9ot2evwG~Fn5A#J)( zNlSsXcLm1KIEBEr(;&O~lrW#| zg=;oM*4%>a7&_;|SY1&Qc1JC}S6=doNX#D_4s(df3bm{x#deKMyW9FRVhY7@8$!k9 zCzHx5W+>!G)_C0}Bjpt}-%1RX8VF^r#Wh*)Omy@ujKmsoN6FBcYmJvVSxvuoOa-8- zW-IIl{d$kR4^Ory${pzNJcGLO#DgB>K@Tff)dz?tzTn%;1WB75)JT$wlk z-M#5^R5-cgSw}Sz!XVi))rT)mU2N|4XvfKL8{BGZYx?~lZVKL5 zgbxFm8k~3=k_nWvxAQn&jV4`_u1+QD`SM#*TUqM4N2y3SoHT`ZnLtv*?i^b-i;A@k zKGqwoo8Nvt{(1ah&cV|AT_U>O(vQ0|-PiW3Qo6iM>MV%OLiOy!tAL4a5aAmAC> za7V@YYtD&5o0q7QA|h*+(S+Y=$`V!hfE2PY!K2-36pzFfK^xtvt-94aY8Lj+O9O=x$$OJn$CoTUH_d*|nNNbhOGdXHD zMJ{MrA(9yN>&u*Eke4I_e(B|kB;N#a1@LFoGGJf9feZ1o3IoWOg_D1W9Vnt}`0+xA z(=jXt6=kzo`@ebDIl zGcBzp=&N@Tr(O*J+j6n+*lTT5zOf48dJX*R=elcK=d@fqf{m6p`H^ksw1`u?vpn+v z|ECSo(I*Kvq~*Hrc2>ykg@-$+=>YB$@9bx_oki*@UjCzLhjqa%K-1MH$|65)*sgo- zgLKTV&?=H6OhV5#_+$)2@0_ZhgC#g;EHm()1KUgR#^|gOKeZ-*m1Q+L(Y@_EWkX$i zYH#-d5*>~#jhZ4_~`Zr=rwp%pEDh7zh2?#%^;DczNvvj_qJSp;uJec1T-}*JqLs< z3+|q}FIt!9;GclSJy>D~E{)AgRr;pp4NLeMs7Hmu)z)UuV+!k>U1SYToOeTLOpf)? z%g5K8nVN<*yO1hQB#55lmuT8|dT1R+)_=XZ%BBh~%zut{{73$Cz4VLaFh~S6>1{Ws zjM*mVd4x2EYrI#}!a-_i;$BLU=+vwWys84^oBd6 zADMdf2}CTeOm3UYh;C*_d}&p_c54hi2UCbz6PuHNM^`!&A4Ds9yRKuxk3;rfNweW92TOxuao43JHGbPfqN?xMS}<=yBdQh-2};ILt=tqR{#=T z@kdQ>MJY3#yT-MMI62w-Tp)FAt%; zW@)L+ze!&+%pHgkEy)_vE!*v1jr)U9^U}S~9t)2fXE_%+83;MBl>k>>ejra z`KdKNlhqb#gwIvMq1KtI-X;N=G}rjSspsjwHV5Bng}P4qBKV*C4Xf0aVwWnUcSu(p zW(ZU$(CC_OPcL0Q2jnk-_*T6{&fxC~dVL4547mm$^NRGV1{(=$jP+aMbDQWH94=@6dS5Df=Zn5^=V@#)g~TEK#ut?ZMXl~YPFu1 zc#Gsqr=z7&9Fl!$*o#vM=1DHnUc?h|5-_c%xWsNRYR*M3g_7M~LuvQ+G&-Es=OP0! z1%iML8uUZhH2J|;C3;!Uk zVgS{aR(ziBl|h64cXSh$5HNyi2qf7)5m4Dzh)n!1?E}Kf0Hj7k%O<_9wg1kS(gRNo z08v{^c; zbM|eZK9DrVEx3`=b}DD~c547&$R*FQ?U=Kt(=9nv8{DD=m9xaAS!#kTf6O}!kq4a$ zAl&XDtBK;Bjx$KuEyMUfj*{%pxfcEKf@($uVWci$4<)|Ww=6YB@uS8U4+kvm%OwKk zSpYeRy!!@}fz1^opyS}4*9hB~Y2}aB!(E4A>9J@JDc`#LO-W9kM`^i(5Yz15%>A_i z1>+T~RVkO1p$agCfnM;S2?L26 zMk<`ElE0nD9meucRHM@`Bt}X78RcHVWgnPxnLC=|atQExs;6R_0hgKzfREc}7F<*| zZ(8690xb>okxgZkpFwQoL%yA_KL7lLtLwqN{X-ZA@8Q_6A+se0^<#QZt6Qr6)|NuW zuJJRy$j=>jNQp;oPZam?3-pZd`-NZPU#~=MvA)ZLSQoI91RqwKtetTcZRDDyuzg-E zqK5;y-v{y<-&_vGlkKL7cm{7}Sds~HfllzF(`#o5c%&bBF{cre#mRHkrldjh33yUxWYT#UcJQu9KSuLCz&QzI5M~rObqJ$twEjTzU zfRn_+^Zd*X%8#|7$OL2jhRpL-eh^(XEb3$vw!!%=vXgpAPf%1(wRy9+r%$80 zE;t}NbG<$W1+84nnV{6hnmH_Uk^c}vG~?pPRbf7Ipz>Fr{I@_guKPc^Uppj>)k^%iM8^xb>$A*e$jS3tPV zR51wtB0r9<5gIxUFCU}QC7AeI{4uKS9l_QxDnV_@;~Y-{HUln_HU|y;@6SA_{3Wej zjrD0P`$|*Sx@3z)+v#*k_z)hHrS{f+@^o(#op=N9XJ}!d0Y}~L8M@&zz$(GQv4b&c zic`0c$rVj&X&SdpJ}lm-xwx3!aO%XOm%{+TAKJbkC!UV#L>d|2Z<37^o7hq^=N`EI zR!{Oqy~j60qArZ`XgUsuR5a#kQ7HZ_j5OX2bNPN0m-Db?+tAXh-(tqN%wnFOr%;r2 zwN*-o_;&N)m0zH&Gtl4*z91HBK#P|%iC~C-Nl+s{bFr zn`o`~{8p;X3#6CSwjr5o7}x!x`26n|le3gxX_@p>c;C~fl9a!tulrDtshgeu^J1bi zM_EEgf=i#DB0D!QMpjmY@$_4Y`AYhAd5%o+|R%?xHb50brmH(;)mA;Y1L8u$FTPbaYr&qXb)&@YFh z+K(L0sJ~SjRv?;pJJE+>L>A_<&fz^Jv^Rb`JF9n@=qcq1Tw}&EqZb!;hEAel_h>yg z%e>)k*zP*`7B;nvRYjGp`g2 z$BRZQR#9?c1j4RPL3FruXb5Jpf*dBY`$7ovT;>YZtk+NbVL6uQ{qB4C&n0wit5Y8PE4*UOEzaM!BD=CG!(nt6Uke-oGYc}|P9wMQ|&^{$I?o@dQMW`MVH(rrfSg^B0@ zySi?i*lm-Ko22cKnhq~Z(hr`_r>fpKaWU6vw3ctSPeSLJ-vS@ouQ_$G{1e6IqY3gF z_T#*~vWe=Gwcpq+3;Y62V>6G<=};TNw3sxq26H0tRC-r*{X(3*V1cRUloRpxJ*TsJ z1hV*I_nCmkLulW8stp3w2tgrgTlJ;x@IP|aE8|}xjxWcxn+udDUHF&7Y*ve_pFz{xC2YOwq{@4|hVTg=(;nRX_n-9J4u zUA@!0g60`YslyE(oglV(LwD#*1{fn=W-3qVkIfc4y~gHoc`QE@YMS3AAq6}4(idz0 zXIG?qmtLr?#IHQOmz8$MELx6LHK-)%9f12jYa1$etlVW%iafZ1z(T%&Ac}`8n`T$Z zJC=;U(_Z&8s;I_xVeDedFWga-I)PMQQxj9mZ}ny86J*)j=N7&b4&w&)8v^XHYOJ(9 zUq}YFElCV!)O;f>(OB=T1?a;`hW#_IyoC0T)YZmcqy~}o@vVLFhfSlmXc`_08kGLS z|M+?-v$Nmm8u5LFT`8I8T_uH5-7PPwwWgc56AhbAN+;c0Z@%)>B7brXh7cAS6YlvQTV+rdPZg;>o=!s!MNEy2Rh2CoWCSn-9-3x#&<*?baw@o3A! zTk5}5MwXfdz#X5~HY*{sHKe&vPX(tbI-koO@B%mNO>iEK7ocjBmac~hK-{lAUjFh1 zbyfZI-vvIP2(y=#rpp_ic@vedPj=93I`Jc{(y?=r=IUvW&1wHQ*{F`yYODd&92fT1iO9zws%K!XV zDWvn4(cPcHoltxF%d>#2LvJ0t5u?EAD`5w^3VOW2J+Sp(|Doq6?*>K#kiP+UuJZtb zbN01|E0Z-foGK_#mK2Xpx2yjeCA{CvjpSWZ7}S8Kq!d6w|4%P|08R=5$Bp>=|B%tl zg?OkpBek6sK>wk(6O-OaZJz-WSU9er=SB|@PD9P*2hA2{qF;zDen}1trRzrGMc#@2 zi|i+yYqK=c#P3Hu*Frz~jL7v(9M;O4!utU`nnm%%ka!^Ro4E2HQrm7J0#nt10kFO^ zeYU`iY~2eve$Z>2C4a4VC<*-YUgdvye9wgG++Rb)L)0|g7G0kTy69>^=qq2kRW#k?CDGqpM*|aB`mdRUGssi?J{Q7zuGbb3;&OK`Z7FRrZiFLR zS~n$X7#2N+YmuY&fdp*wcAx+o)^PE;Rg+@&xVtXu{Gz3xk?iBN)jc@8$F4(JgN zR}Q%M$c$XuTPKRI+imR^@ghY*Gemsb=~QRSzVAuTqr#?=_x||#)sPt0R+hGPkZ&TA z?9OyWst&uEeLJ&IGJI{RZfGosUfV!CdMEAf{Pm3y5IU%K{)aIDN+a^;dsSE0xoV&W zCh|5Z5+3TA`bvF3V5)GAk(yqZB&vr-hvAODmbY!KxNK)cB1i{(lltKHJ$}EdS+;kL zyU6qBXmAb7*EoRFQITVCQ+}e?21_P2c*UiQb!4PRF0^i5&l}JAVFN#vt?=;i-ASim z!~DxGEa|k&T$myrNkYuAb$uj zq^2P@RFXhBNvo?TX}C-?^j{RsC5<6K=dYa@pB_nbj>5>G?mKMjW7d$8XJru8L@=e3 z47C-fSat6PUc683B}(diE!l9b^2U9(9?9z1LeG(t)e6t#Y!N|nx4R)p`Q&f++I21zujtYTU-?}`Tbl~Yd~H^)A1*7in{*t?WT=U zbfl!WTeJib4vl(315d$%({nRVR9Mn|hj8N#*es9!o|dxIe?exa|7+XRV-59y?%WX3 zuCW)icen-uk zujrYe6<#NTT(4^p$0t4igqM1`QVnl-Pa4&H$GCG&Z=E{mrVvwr9C3&!rs@n(u&!}Q zqAeF2quM7RP5&aj3d_WPLegu1GVbVxi9R&mKzQ>koxC^SKDxK=WlsafQ0+?67sHIi z*6Q@3A>9QcI%~VfY31|SEG!jSMLQ^mhIO5A65wv-MJxQ(M>+6W+CigurqfsbHdaFm zrnCEE;1O3YJRs?+)m2#rCvW9Yt;b>bfPu4XKVmltU8lvW#364@rS}VY9m~&>BYbms zUJi?A>_@)#xSxnf^unR*g^l{QKn^0<;wfvTj8E@H#hV|)(1%Sz^aN5d_R)iu5VS&;V1aptg>%O@t*WZL%1z6 zlq3zUqJQdjDsvgqir|i@VB?kWeCNPp*W9-hCZ%DUVy_GLf_|XURN=zHTvbf|oLSuP zGihY1S82JHDjIUW>%?L9SXnxfi^)s#sdmv#+8@?T@n#@ zsO6aQYRoxyT50Hhd@{^6PrH{7;NR}r>1mLC#oyAkXgovh)xcU>TFvDs+e!AHk?@RrWoZj!~bcXyJ9;KdQ-8(jQz(Fk%HZFz^) zuM{3FK_#YmSf-`*Q$dEeF$i?=_lSE)yBPyJtuZnaO1x?<2d&bfD9{Jtcs4;AY4eK} zyGIwpB&P)^9vdd_CdJkM0AzA(E7@e zcWt-uWVTw$?;lv)zfSrtF-1C6C-w2~>%QxEEsZ9EY`%Brlw|uc;&uKTV$v>Wc}+lP zk7+;NK!2*%Rz)m2LIqsdb|b)bdwW_8&#J5N3heRupiSZ<2H?9N1d!ac+pfFdWdc(9 z2&y+NxvEN{!RPpoXa9$@_ke0DYuknyJ0hZ@A|k{N3K9hcsZmi;QBgWlf+D>HK?p60 zg32gOMClNb5$ORbkrF~giFB0`AVAOnK|%;EA*B8X&>5e3pa1*b^_{g`%NcXd*?XUR z-)&#_b+^h6)M@JETLS<#xd7TAQB#xC3POK#QIT04Jm7?6-~u(h?w%p+FD{=S^S^!O zwz!vOilm%I@|9Fg;Ll%2w!PiBjbC&^PEB9~T6bjMB^K&WpkNG0^Aw^VOnQG#nahP2 z;qLVAZuT)8$5>U{vy8FjUkacU3_hsie5t;A4867C3cFwP0CD|V{65agpBa0H3xK=h zo(HJXy15($e$jC{#|2CdIoRZ?BfxyVxA z3VP<2_^q`Yk!#Z{ZL%{~)y4T}Dgtu?xs^JOex+Wzpey64s0uc-yV(tUUhHGAb9<2; zo`5HLOh#F|L02bubm1OEtV6~Ndn*pC8Yrve;-2_%A)dTsF7BxvDN${}YoO$kL7?1a z+AbiO8|_>l%(Fe?uJ~@Uiy4c1@VVDP=Pt5jNK;?#=joHxj>VabhfyR{tz1$_l&$5y zU7PLY#p;H0ckweS4oY(qq>ux>#lh#@!SBk9j*zv32wu)2F_vG?Q*#&?Aa}uz@h86a zw)u9MSE^rT)uz>**r#~%NZ0wJK>FpcLC^jNN90^Xp8BZuiEfg?Hh7ts=7lPCcLU6o zV&rYqO~G4%AA2=%8M!L<_h_O)oIe*xXi>=LeWE$==>4_$%Nz+YqdI^QQ*cV%dQ?k& z<+~8$f&SOeQvI^C5=|?32KRs5Bf#FK&4{t88n*HiWI>h2ciwa;la4XIHk-{qcu#1l z-Etc0y?e(xnezA4vwiEjnk7^nZwWvZf*zBv_qmN~P2640i>v1Cu*)5vgZzR#qH*=t zo?G+~O=bDQnMAzWJj!`6l(`n7kt*Wa91=&N=H?+Mq!0_Rb*Mia-kWbkS{5AjDDn@d zoUpf!wIA1dXLe`z)MbB{GG}M;5Ow=m=MM?$wqwe`C`Y@*pYjCfnfrEa6E~Nb*YaIS z*y8nI#U~T5RTZ?=iO0SOrO36NQswz`ZP3Z^G&h~CO(E(5PHwI)KgKQ*yn*IxFz znXT*hc2!L1c^;?%5M5f;{co!xyoMBN>j$WolaFm)hh7F+JU{GAMttK|QuhJ$ImxuU zP=^|$F^Z!`jq&^1{ty7o(`2^WcCJUv6bAO*cQ>}Lr}FH`9IA(1I?rLmP#PrLeA~wR z)#r!G)gNUMnbAhU#t#0mgYSnlLy;vunoPvc6K0iFi!*ouuvp_ooOY3#Xeu6c^`f;M zNZOTEkc>v3$Y%wJu{4IuZS*;ds^lxh{?gGu%jRE~mj)gPeR1Grb@L8*pI`Qm2U*dT z0jNsqRq}D#T-2cVm^*WiE{)N?+4@o?1^X6=00yRuiL)`A2Q0lp-xGZA_a~=$v~r{0 zZny)N{dPsJexzS5nb$e`phA|encckCQbGn$ddWhTLHFVBfVdz~e9u1z^@{W}q*uLB zzn@-mod~5*kZatsfR3k4Q50_xciv?1`7UL?z0!jA&)GRHqPMcuID*D~B9f;kVy~si z!A<-&SnsWh+W;mfey|gg52@f=R8rj@VqMPm zwR%!+Rg^ie@Hf|qn`d5b##wlHe)jMI4%(f*Gyhxn;`-tGngm$m-IJh5F^;iK%ET3l4@q z-^fNQ&a-jz!nNw|viyUYrq^9>yfO|VhwOKKCL47z=Pwtv@hWa*bt~C&bXS^M&@--} zx3e%=STKD2TD;n1LDSH5!Ylsn%?a{~tc=K7O&(RdJ#BUyh7f5i#Q)L#K#&LX51$fleC>XFaN z-FWa`23I&%S$%~WU$;;CZjSy~z^xHaD2rWIE4{Od*eQtA0}-_L80i=p zLws8glAJ|p&Nnh4>`(S+LGR~*V~tU7ctOu9{!dYXsT@CH0lb6%=uE;j&MWLTJvjCN z0Izv+p3Zuw&Uj^1H`+O0FMFc&I;pFDz-wiOLDQhYiLGMQEQ45o9(Uo{w!qd+LoxBo zsjx;~Kl+C@M91b8a9rHWZS&-{@HBnf86N{tNq zy8>7|;dPW`dKYc=zrt3p;fU#~sj!E~iU~}^$y#E+D0yLbFLsQ88F<4~+?gk{MOlVi zl<0b7!^;)G*s@MWSXqsB1ErY^I?ZTHCQK_hZN+KtQJl#&{i?En>(z+lkl5QgK=VBXEGf1H7hgRb@>{mz&|1c?im}MEE#czj3f3U45_6)eJYU=B9PLO5?(EjK&hvZquLcCaRf zvBCo0*^w??`AjVnU@iUg7k+E7q6kPwRav@ZzZf8;h_BrlkV?wvuyCf-B%?_HWYq&X z=y`{1Jg&tEv`DpfGa?-tAOgTi(~?-VfGSYt^c8k%l0_BH$$5RV3sEnypaw`&g0l` z!BFu2<_GwaDsE3vvIRbR|86?l5N)(G;an3uyz+Z-scrR^Cq#qUNspR$f22_&yq}^o z!lQ_L*_iEnnJ;{q_qjOiUxEdTd`?PUxEcxh=_M=pf3Cf<2m#1!BM!mDi3m~Ohcq{F z&elIpyQXNSxIGWBOROO*{z{irF~Mic!QOi(F|9QS?j2Xup#c7+G*ouYgIjTT+Lg%O z)0~fV)t8q+chRg_H_cvV;hdD#3f}fhqp{c1W-ru_A1|IPJUG<$Gy$2IBsq}c-v$=% zr?pN*anmj?+aT56A#AUPjgDV-CN?W=jC100Y418u(2F}*sDX!O5)dY(u!4D31t;hv zpvV!&sJpk*FT1qdDc!hv0g+AkpvbC9Su>l$X+MG30ki4m0 zTvsjg!It%&6B;<<_U=xeBYC2rZXw9!(ak@luT>M*m&?)}-;0-=;Te!;{u=Q=nGHbG zU7)d33-m?2m(}W+*XDZIJD=uGw|$gU@)NGRx%0|Yh_ZSJYBL2s88tfWS6_r2N;7?1 zbzhe~n3~!9**&4k2HfGTaof9mV#E04vmS4dICAq=IsBzP4Pp%gNckhTr>dV4-{0La ze?n)HO)R`5%732j9LW+aRg>jxTioI00M(!93<1_ONL7dB(t6lEwU<9-o*BMY`N}Jf zF&U+c>V7G`W6iiTH)mdQ6F(TySmqRdNj~KVZS_d{XQhyu-YpDgatvG3$6Mm+{Aqk_ z7)>MEcTjl{IQo$g4mP!ATshJZ(*6i{v5p>NJcJv~FqlH5l=2ZT^+Iay_J;Db3MLb6 z0Z$gDF&KiW)T{%`b-PwvaiLq3n&0hnF8Y=zo7^K+ujKMLmeMDg+AyUdSaQK5r?ix)uYZ!&CZ( z=J&xVj)39`eL4Yfp-2Nf0$Z*A;_WL{G4P+zfJ4WSuY&xWcNsRSw2rSa&aBGRA72tl zRXy+f#YZ}>o?aO9B)tmYsg=qZ_>QY4)#wj1QV*|YZiA(*ZvwMJlwp(}AW@bP=f~o{ z1QKQKYl0MbyBJ=ncbIXWF5I>rDw`Wu3HP<^1)8uwk~CPY4WyU0ur<7T$gU}s>>a3g zg)FIh$qv`fP_3rS2FxT43j~ify`Hw13b2(=ZVXh5W9QLbRQS!eb)Ou5wLbo$_~^KM zKUFi2ZJ7O?M$X}aQ(H0vtu3cmSx{lks}#{MDN{4PM8XDZ&TXwJ`W*0UUQ z1dm-LPqPgx+%B#gUhC$4vKzWn10U+FWhgDFgK z&=JSOg3r{G*QTliaJ|KMvU=YEe~OWXmfa*Edy^g}TPq2GWAD1GgblcBGqSli%Uw|& zWjeUt555JJUxY`~k_&6f9s61z9qu^VdRa7A;EL1BnvWqUIGw;VJuWvxb4EJN;dGm@9dnN?iFDw^IYD|Fo=c}ho z@Q!^KdGZ|@rHsn_y~Dfk7nuCvlnTKd57P!+?NLdh6r&;MsFrzxJq?OlkNA7ODnan+ z+}B+6?1JTSeFBv}OXB&9eEY!D!W@15D%810eB|L!1dxd-7NpHKd*C}+l8aHqjwQSo zcW6GFRI4@p5Ulr{@8Pn72sB|=%lFR7OoTEbv<9R4E*B4b!dLFvHg}ht1RO(nr-vOq z3DmVC6{DKyj>Dm)yi0RmzD1i?O%$e|PV!Q>AGF(|3AU2JrmBt%WVvh^WoaGCH>h|; zGg!|iXhq~oAyztef)b}fcH1N4C^p`*^C@4MxvywhL*+j*{MZN=W^6{$!A(2mSe0K> z{2}U9Uh`0OmkAc)b4cD=y!XA%*UiCaAiI=X1Lh+}hlwT&o6AdqoF@0%``tW489qCV zo{dn2+-i4fQ`ADbs0xnZzohv!ku~lPZTW#>8jg)E{1D(klRPgY(cPm@F?^0cN^Bn5 z%%4>TcOs`biP&z>o~=m?)ajM$7X}0j4mtxAI-S z39Fi9ckrkknSw`#^9*-vc{@JT<)yflU*(0l(pCtCj(e)febsLk)~y#SnWjf~)zK`E z3-43SO<1!Rp@6PcKNv!I`ruS!(>k2Sa1wjR>llz@IIf50GR9XY*b`WqVeRO-q$ zGRQsjFQF~D<@L=9eq7unN=UPrq@f-QU1FtotlTVz-a=cfab-(TK(9VGWY0?MI+EfU@DSP-U`A7Y>QZ9x0H7@V zkp!|Df@C{)?}wb74_ggq8z}|u2ox0uL%3}xuIxK$py(57Y@b|LdzeP!7w_ta=Db8; z3Pkn6#nJa4^nrJZ*3Ws`;J{mLtBj86uu2Iq%_J4wtF9rrT-+33zbrAecgz z)99ES!P{F@%O2rVs`U3Rsa;u}wQ2&A*XoA4Zt+QpU3k~fGq)HrwU8$sukcRPs^xE6f*hXHl9Uyo;&op~Z&F@gB#*D5|uG&dBJ(DcW)xa~LwpSu-kNwIQC7D%e(lr@*-aBpir$7WAf)CpUpF!hu06D!Dh zaXdR`)NZL=lz7X7Gmiefg4f7*ZPH^lWyk{XeT_9+Jn-!x(X(5G+h2sQhDv-IJd@dx zGkm*p%)qvH@bgPwIKelLlxa=I~v??X7r4>F`>xM0n;i zV(i7f_R3lV8VDy`NrHalUazvtFBa?}D(2!(givl_L_ug+5U*(tiruD_*uxp_x;Rgp zYkyJ>%@YL?mByiQr^tiT18=!jz=lX>uXJjvfCeJy0Bs3yIW3iRO8{7lj+;-1G)n?- z*330mRzDj_*I~>lgwHtU@C@9?6ha2|)+ojFK*RB=5nQL5&@sqDKeP^u(Bv(x`5 zy1#{REtg8%&)|{ZqS;bjWe=W)sS-vO;XiZC`TQSP=^gkj45<_PY;{GPB5Z6HJXJaT zNx%nxL1Dm|)DI1BJ}l7Km|{WLyy1<5W+W}-Rne0T^8zzIcRLp3j=jx0P{b@tKdryS zndb21=lVoC^NVc#A6TvhV6IJT@pAQ z>bym4X?=*af+acIaG!!^9^B>*x~)ZuB~%Oufm2d}&#of$qv3Nr<<%0$oEk8c3i(LS zz~^w}wpD##1<{I3A9V*o!xcgAgdAYX3F+P2|^4)PiXQJLLAzl1_+lWb?!YL9c^wg;5Zs z&?ZmRi{Q?-ua7Yv=A5H|G93-c;6T&{HGOk?^i4ea2^9JU5rhii&9;NF0uvHeuR#nA zT@R7Sw zGhquQ-)EQ3T=SL?$p5R%{0k{$;)>+1j$>Z94+jz|wh$(+0hAMcQc=H7lz+L{O#&$w z_j>33`wF5}OT3N0ESt5+*K0p!t560Q8SzX>fN-dwWV( za7dgLu7~~Fy{}CsX^nwBsbkxcK3-g^C2HQql!js~A6i<%dTe_!`P!7u9Wc!Ar{xZ$`*+Cnefhwx)4SOyR?)zWYr>9(Pq3eyYwEi!VcCP=FjTyKC7j<)7 zHR0mK?4K9cous&55u7~RT6Wo^K|gWIAIMct#-t9^1_#uFKAdlY8$dNbNh*^j-PLs{ z9-5!en;5_UR_CF89W(!uMEhUF%&&&v0rst8EiLOO)}C~8h<~K9W$LW6)RX-~uE`cR zvPlUW^(XuUm;qYb{te#D)fOcIkz84AO$<{|r>vnL-0cWiClPDtkxjw)kiYqO-uUG4 ztQPbpa90z6C9RQKtc&8XR`w-Z=;kn#$wh}{w&d7EkU|DiKlURg5&94GP0ye&0w@sL z`@ieK=Ug%h!9+JF?uGw6?FZ_NZcU|1-q`!?>cOa|FO{}bj0gDpq&>>Jf6qchmbk2z z>FN-oJ$tmf2wCv3?FtJA*{7zakK6r8A_PZ$r>>Gtyg%E-nB9{2=-y1|6JqAG7FH&J z@Ys}J^yYZa2Emsz#lOIq<0lH6>5Mklt3^h<%2yE3@SSXQT>D?2X<>zlZklpx*c$5x>UeM3!qv1W@~q~T zOwuL_P~KIA!~78S*)vq?3#mU@ip-iPeYUUqd!OeXl8^KaX0{JYZM(ZWA1(77OER6( zKIE=R4ydSA@6eweY-`J~>m-qv1K(I~=%!4Mo&g!2?FIH?E%s|v;4K3efBfx#C;1kk zL6adZ0(7#}GsNp~sJz+joK5>NHG?t|1{1SA_!3_ya#w6tn%``b4gr=Uj|n|h012X* zca9!+*tP!Mo+5<(_t+h`MzZF|et|dMcu&@r&{Yf5_?eNUh_rV70hb^J{;nU1>Hi8z zWq@qo^0f?%$_1DuhY<6;LG*)~QY>yDbUp-f0Z2H$1p|~VE7QH-W!A4b)N#pWLW^)M zy9i2@)KfE3)A6r4@UkPg_ukwK6@p zH6v3w2(_@M@VBCC-@<7h8&$f`CAdZ^$wailRO!8K)txubAY=}oKez<%I z!toDZ?9ZV~Az{IcRB0&Zt3e|^;GoZO4rBGEAHD?_UuGuSmX{9joov+o2Li$wcjs3p zKB&0=ryPI({Co3}nhNtCxx;8u`{&9ZwIMf6hiW?6`zP+y?~!+Xs6cFkr&LnI0o#}n zByt|?_(tDnGic|n1um1s(raNI^RZa2c`U{r^fMFVP%d z{MXnPGl52n+^Ybgn#SdNvi`@v^J!K`h5IajupIe%FB&ja4You8YE$kK`jaVTiM}7` z76-iNitUsR`{^4mZ9hp^NMUr)Wwq@yRvoXJk}MAC9NF%Ed3`Jp(gzS*P5|ejOIK71 zklF{vG~kBy6_6w_pa z5Jvfd{3Z0!Dt=kOCUFf||L|Bh7QTyt?g&H|NZpi?P-BSY`g>At1ak#isiKFNH zT5G=VgtMUBqowkV{LqW8_kX}NcmIGT78iPrj%ovGOGj<_N=&xg+q?Deh7cO@ry3^x zZlCF&R4WL8z8Nqhm_DpK-#)IajeHB_6&j~?vh`e=vDKxKA@{$gsi?~@7BxhU%S6Gl z+(y-?SuRJmN2AEcQw3BQz*^LitTo^Rq%4jDoo#`f#m+p`wl<6_U!Ae4LDMa(g>yEB zLPxO$G(0khYN;#yNVS|3wlkqud6}m=2jdm9FwR><=hl2{jyC-We4|ROLS#m^19O~;lcaft)WK>IgmXZ}z8~0G(7#NR|Y*hd0yk8MS;USf_J_--W z!V0FSU%0ItwEk>30Y(7gYOrPRbTb3>7+{IgHK_4hh9T7D0N&2>7BbV~=y_c^ICn&v zpMCnzRf_V-(~937Z@j^pO*$QhIYrh^yYn7|u|q^z3DPvmDm98gkwc0u6K zj~B;>6Vl}O6}RW3vnDt%exL>y*LzP1^{0Zr{kKTncna|S9DLhCw^g_P>R*&=@ca}< z`uM4-uGGzAM_A))3^J!aNoPpjnB-^?Oq8yzUu{`JP0WKHt(^(J>)W8%5u|{ORw1I z>>HMO%7$?5z|MEWosG{AokW%i!UX3CCT~$avXSRlvu(!gMi1%(TVNpz#toD znVNwLz_DX(2xD!N)j2A3oO6yE@5k>)m=nQAh2H5ywQ1TvglR(S61EWw!rXCApnPqd zbAX4Q7p{|6+<({er@mRFMOoH2;j8eE0iwebi~CW6-uBmJ0~wwA_G&|Sl^wn#&m~sB z)awoTGk|%sFQa*IWv4{&3a?>CtO8!i%C}+P59pLag%%NP4sq$9sGZ9w9pHYOI{f*n z(k8!pa56)=S$Cd&E}YWC`9Z>rF9699zo;Qj!cKG=l`JGqX4)J_X4XE4G5sZ*6<~yK zgZJmf@V@U+8GTUkq?Uc-bR-Ku%&X6E@j3sl9lSA)&OoR7 zwdG%a_nQ3!h`|=9WS?BmXz0F;&OZcKoT`o||LTT&uPNh}hV|2F=T^T7y%REKrP4`&WtlBG`* zI9H=m@aN;|WPjefNEf?&@4^uL(x)hW+y~Fc4gpH%7%~i^&kktRS-3^;n3Uo2&yU_% zs)$*(f!$(+eart_?D-=5&C+AG{C6W-J$GVM+nL^7sCQ015@2oc^ocdO9J@OGPCM&_ z?+bfK1I5&hpO?=D`m_VrZzgav|7x5XWGeB{N|gf=3mMQ)j#nZNJKlIbQD&8M%sOXz zGiN{gTMQ+(@HNP7Q6NjeDy|q&b_bH;eOFK+Y8^QPa}`o5TCv9jJ_D{P0dF80>1&1Z)qd4*1@f&=N7X1+CAGu+a)+VXLGWjfvFiO|xn;RnE zLNGR#XRC5vchYY>n)&h^Vguc&Bb!U{K3ZPko8#bAmY@mFiBU>rpvz(CpEPW7j-uy{!mMu2&;e>Fza5hWTVRw-?=w2PIfyy3@l`KRk5BUYthc+n^ z@50z6;@CuX=JO!3;V>I;oE)hJI?M3OgHQjKx4j%Mm=c-jP?XTM4{T`^6mMOrrHX|o zZliE46doSJO1V2X`XkD6V$Mmx^NB&uBxP6PkLzKZy>zfB-xx~mn|JF+ypj>Sav%!N zUI{>Ml=v?$I^OLqbRb=Qqxd;OxRTf2r|&Ds>Bge&Zjlv*2d{@fTeTb80c-tmJXRh^ zq*nW{6xetrj-y)y9%a5vPQPH)_!BmCn48UjN*6-9gl3|%eTmP?MJ;S%Lqx@LP2qn| z!Fv=#@*i^mX;xY{%aP*bXg91IqnTDoPYtT~6se?c<*pf@J4Aftr8x$2N?pgRHNkw z3(Z6>49KFW7&c$x8UH}R<;qpwUa?eggDRV$EO?H*3+3QF9-?GMY_ycu^7j5s_6?_O z+KHBX$Nj-51*fC=ml1*v+jwVApC;sXTZ-Y@=}~&un3WE|pF( zD;^FVbfiJvi3%7m+8?UW2eoWq7?k~sU=uW^zuh=T^j05qsd^3TJeSfN(TBGdNcW=1 z!p}N)O$Bet&ykJ2MU8ZuJVYaxPWL6j9eIjhYl}8AW|PUNOtwo*Ec+ytvOK@x_`k(z zABO>}A!+7)jGpsO_U)*OpN|=E@Al#;wVp2atha{q^jCc{(QE2LT&7h~Y9+H*6&lA+ zR9^4`lN#5r0XBBKKYT;#G)=Etq(uW4DQMac#hDhd;uPN^^7!XEK_~IK4!MV*T8=F` zq7uQ{3Q&;@9{Fh+XWQ5w;rM}O)D3cv=tI5er0w$!1-1rV={8Rwd^~~w4uw{El_Nq( zZ*E$T?c70!REoZ_2EZh?d;!I+qk>Bm3B^P8CAh|3s5XwzxFkz&X=A^>{nTbLggk2G z2hg`OrigA=D|hYz;A?`%Z4uX{1BcNDQsxly!d+u{l9;2yp11F`e4m1^`v_% z<2LJFJtMf2%QYQIdL&%tDrrBprt8V@Ufd zpo`z~Gb#*zz3}Xm@~-rhj*fkP`xA|iy&1|@8cr>4HQmce&mQI{6h!u=6)kTuF`K>r zjKx1arMX(i4-R*`ihC=r7M2>X32LFz+8fODQzA4mIRCq}QNoT{A5{R(t%!}SsI#e6 zrG7-+1T*7#NfT|pf|jM(K$=*^A}B436Jay4S)v= zmWO-tvf8I3i$y?52f`@baSOo+mm)B@b;NWn9z#ivkb<=|dcXzkqu-+67QNXxs{k{u zQA_o6Yi4LDD(VFGdn;L`?%ePs*tiWe6V_)7KEUycQAZR!q&ki-crmI_SPRrm(N<|x zOGyX)XP|ZSZyUUsUlG$n!n|oMp!^^(8y5A6)AwcTNfU0|Ndx&z3e*j(I15VzN!h4USBTy>bd}5Z*S1VTW1SKc-pob5!YF$ zy}J2fkP&=9!!5ZD7Wchop^XK02a0E1)X_<^r+Mvb8JPO-MV-27Is#zgd6TCp`(rS@ zqGC~+K$D0HA!AQhFb|a>vSSlJaDXN%vLI_3{5|LTJeX&k(9Aw0YMlPjZ3%x?8oOwN z<#yVFZddlt$6$Vb(1;7a3Bi?h$keIM1_=Ak2dvk-o|d|hveKD6f2buPYGJAYlXVC$ z7;Ed%aSMBO*hEbVOB?+l-o@QiCQix|*{#JRip>%wS2pUe)5iPv**r{A3-qIlx1^Y@ z=nIDUPjxfNk8Wpjx81<)-Q_{|pwAmH4gJWhhXbO*bpiAt?D|Ge*F)q@?hzFzosInh zEWt5{fAJ*s^qR;QA2>Pdy#lR7547q}6-s*Rr`W(B4W>#pgoe^EvMSDY}W$$0d_9?T$A*K zeYi+(FqrOwJSSFhrH=S7yF;~#7Euk7NfV=T2u7X_l8?NC3<|N15nRlbQ78yui zUdsu{f39V~nONV}4c_lFuZ&+W^iN_>U5hx+($SL$%g<}^rmwnh4=^?)%4C$2U7f56 zHy)TUr{wW*8iyu$$hE9Wbql9tWvlGDLK*(~CiJPUy9<<|>n%;kZohbuLHShqgpH}_ zKN4Gp*_H>%7nC6W>LX1m`XF2%_F-p#?aOa*zl_Uf{w3)!sG)qBF2FSLjBsVP?dpj# zw{TmY(1elx(n8O)SR%Sl_RrS@`}wwRu6)_IA=PWK+kFC>O@VQ(`{3!LJa3Bmibs`? zi^!uKh9^`mK#ROK97;o!*ptr?73aZ}Z}c>&@=)4yzk|F}HpDON$J~truV&?X0bAHK zo9Yg*8jugphq_TAUnis37sKh{rV-i)1CYOzmhNv#D?u`p*)mW!C-&~ydhfiM_J(z_ zOnaXH>J9amHsAJdeoyFnjNp6dNY8!I*U;YD-<4@!U9=%@!ZEvA)HhVAw8PA7ElK3! zVpQ=5lzF?DsXaE{JTfiGB}l9)H{3(&q9lZT)_jy{DHS6!;6t`u5dYECI}UE-WAak9QJEh}Ehe1%%9C8!mOLV1TC zML+j4=?Vz zV#;q5QJ)c}FT@YQQx5rG>D?Z5YtQw9iQQ?b5q4OV4PvgJ(5C8{4-4Bk#&-`ehhM}U zptoHUl;}(+Fw<$Z`mQ|V=yWqJ;F^hsKX$P>b~sH|dV~H=QB|44$Y(|;ESREd;a!mGJb1ta z{DIJ#qVt**QD_U1?-QC*Rm|-j-jM7UKg`O1z6!;1wCjtdUr>;HObi!A-o%+PvxcKL z^SMq%Wti+SRFvo`edGcpjjcl z-jt8?Ruq27vh(9jK^%=mL*!-`N`v@Q2WPWg>E#P^g{VX(nlhM-^-Z^$;t8Xz&sU&$ zBjF3BA;wdNeykCe1J5kzhHg)&Xaqis3o)Jqjgk|gT(9y|U5|<>sC>#t@^h#i%Rf}a z_7G(Z=G7FErx})S5cm{W=KP$q7s%CxCNn!?BT^kY%{%-}SduyE=f#|b@R&$a9TwJFKBeX7R2AY5_{eOP}OZqfhOtn>hCa{6Oi?)KpavC5wP z3zFF86D)o=v199Dnr2sww4cJb=y|q%b$i7c6z?%H(H~Lb6?nW$WL}z27I@C`6QPg@ zTEha&2YHKuq5p|Sn+4?wKe6`E`5S+b%91__ZN5yWUZ32-4^?b-8cX9WfCYj@-qqdb z|JmmGT53>?VGGC0Tb0a8LTDZrHY+D`9XNA z_FX}}HR;h`c-9|z+jD{mF!>MNB4L*;LKLxp9C<)wXuMU3^)hlu?_}T5k%QK1F+y08 zUu&&IX~#8F=&5~xpHeTIGsx8s0rx%fWJPmkhg812yF)k!nmY0A3JV`W0Q|YxpxiSx z0eaTZ{kjrtgO16`gE&bo?-#5y{HKasrS>oC-Fu1K<2vwP5M~064Ibp_uSHqWAkF^I zP2}lq>+f(!Oxuk^MOs9_N1VsQYw7Dd{p+9Cwws_yY@Gw!lX7{VP9h6Mm%>U3>_L$H z{^N{z9tjHy3T>ntbr8LG|5$a0tRosBwcC%WdwnFMwIR7Puec+eLx3w4WS4HTebWHS z5*ElGeX$lyixN2QiLPSq$K-a3I&(RCx4HQE^UY|94 zH2fHdvOv#E87db?gzqI_Xw4CaFBG{5`nZr(2xc$|JFagsV%k;eg@+2<2R&FG_w!`< z!kb0?UIV`H5~it%<)`DZ_Rqi0SC+x~P5y_Q^q&#YWBAj0 zeMohz)Wr(p$^1FaR{Kid4TJg(X`&;xkaKo3Ri=^U&_l}lq9*NW+OU$ATW#0aAVlk=INRH7E@xTWPS4d1-bym@>wj3RPX$mK^YjJ7@MT44_6L_e=? z9uCfsUxm*!JlD*2y6(LpU$Y=R_1lfgfN<@Lm4u9}0X*Wb5k?T}!WSD}@*Q#~@=?F2 zlYNK~+aGH?_`G+hVDOw^F=k0yuUrx z3(KSUkZS~Mn;cnp`#*aP(@xQO*UMz{k2rz)?s%1=@2d z^bW6d(J^xQ`8D|5+4#fld62K7T;JR|Zn6!&!v1{F46XX=5Pz$H|0Wb4vg8f={N}BO zIG&;0|C}Wj=^W~s-Nq?&nb-n~%{HOGLxdC(2l5 zUS(dTN(hKWv1F5e8TD%$klnb&dcd}Rm8a<_+U5kkQC&kdvV%U?e_G)yl;-`pepTcP ztAR`CZ7;C&596_E_*b*3*7{F-P)2f!=SJ?MnKuH^ee6cG$b`ZKq(tw7!wo?fH)(F;h2`naw<+$K{vIr%VUGQ zg^bnsfvlIQ)^)8qp^=p7{M8>6MoL=XtrVR4D0Z zKg1;u@~d^NJk4%~MPK+JJSVW@tt2>GT@}l^$innTP>|rMO@zl9NRyF4owKO|3uOHUdNGrPOgYum?$GB%3FS9$Ldu~roDFNdyDvNf4V@ur&b`W?&^Ev z(~uu5T+^@%+QvGUODc_?MfVxD^bBbtfG3}0H4Cq#Qzqzd5Vz`z)2(@MtW*@GW@d1R zR_$!9H~jog9AIr|Jb7S&PbK|h_vc>(`OkIPQU;QBzH#Ys_{kluSwg_%=fK2}LQe&9 z>b+k3RAUM^xg3S;aH01l*RZHb44ojJ!vez`&&M!9EpPI_MM14qU1Z)gy$MFKLPRHr znRwo}@x+@8iOO2kdAQ$5=d>VIArHC0HWcNI)M-!F-VRLb*MG+VhkM~syw=b-;>jo zyU*!Mx6^k#lEg~va}!mLIWr?54s)Ng-SZQA*}!NZSKP32?(9T9qHq^ znG00tO&UVJ1+`h$K|^V#Z}1uMsXxDMprG}{oZ?WD6wZ7m3D;2&45FAUiUyv@AnUcEelyf?S&DVW0a{b%Y6#xb)__ ztG_7~w3wz)Y(L}9QO^6WSk4vQu#;}+c1&m|hMhBz=%EALduer+-+#IBCvAjS#MytG zlqK{cFus%f|8aT$YapT#bG3DZm0nq0TGTp1+J{<{zs0Mr^zTIGX8sMsQTm9bUvMX% z{HP8NADuBPT8`nx!~(s4d%?huk@QOE?q7hX3HjelbeJrD`N?9%*x%L+mxUqKP=B>x zV5j{f`IdL?y4Tvz=D7U4t;g`6H&O0&82P~kUAr1be*Wt{m*0$8xq2u*r5W=E@rm5R zS#%6YztV@g%Kr=r#u%IXYHP`yFSLVdpFaBYK@PCLPcRm9lFQfs)6)JTx8L~qpGnOp z*DN@+5aFX|RZ*o6+xi@KKRmj=brg&*=ZI0eC zY%Gu@9R`$)uZKcweaAzp@fN;5^=EV|w)Qu_m#z)?y_i-KCNV^Yp8<6Azy%BXpc<JP`&Ub+{=M^5BXEf{(W5BLNGLmU$RHWj>sXItE=cf@h8F~kGaMJ?Z3C>-qk0z^21!7?KsM&%*ZTq{iDIp&Fz0soG-*K|_DvCad&mkChIxW3@%ysK5@ePSAWwUb}}u z-5VIX6-uEb8(#@rU^nZO^7nQ}uEL{>^pl)qx@$FzY$(_O5v-+)0!rt4e&V;~D%uO# zc~Z|`=XaD~ZAp;Z3hvxZDh=kRWHWZP2QSH2w-NHPjB~hbaFk^#s>Z1(nKgKg=OG1O z2el`<>ic6yyAig2Q`g&XOeu#C1_u<&tsp)Pbx)v3DB)*OIVAI zKPY$RasN=4xGisJ-g5SeKG4&{x!e~c3^-r1E^tIx&Mh}QC&h+-|Byz}pQA?q>Q4ZE z`rAOngE9D&tgNgXa(o5(1^VG<1Pt41^!*Tglfqi8 zv8~iJNJ_r)v=Ys1VQcP?rgD<`ih6Q}L9}nV2L7VkexzhvmNm27majrU&E?XTwKeN%9zp;0ILHN2mE0Lx* zuC;d?-(5Wzhyn|n7y)V@uB@((cj3?c(pA4Z*5+IF$E{7*`p1rbs}aI`b&%&S^yj_* zF7<8Z&jL6<;13|{7i737=58*c3IZm*)dNKBF93%R++Hwi9D;{1IsPPufsNcQ9o7j} zB95v#G0gs=tKXk88!t@%vb^u=j1K($;_R{3v6Nt8Nr>7qMjB z9H75hXDKtK9m}UpPi4P)_WrGEH(FnuvU#ieo;}T7YS2=b@mrQ}(QYo<0E{mv&OeGTw>!Ppn# zi6!Gyqkh0zi+C<17VOJoz3Wo6!I?IFd&-h=>QVnkrlI*8kr=$fA*YbMqdQIpF~A`# zZaLm_eHc`p0Lz57@aFMKPk$ZEM;lw=XxG0}{F#&$HrST$x zniR>?aUcmw7vULitaKDce2M?{g&v|Xpg@c4{^%BHW6ke+-C<~1uPa?+OuzhJ>UGz+ zMZF&Jf7RS#Ou>gSt2pTC8LI{{b zcCz=`fTNuA`^~xcIrsi?pUcC4Y@WTpw!XFA^{#jEQPo!N!0}|%!x&aMC1(F6)3(;% z%O(do1tUt4u_^-{qGUPMS5(4+^R>scdqqT+VsGr%DitoYA8pM;l)02!Pm&7Ircj8M zF`&&ubWzqrQVkZlteP7+J~6$vFE7u^!#Rzgpfd)>jraEXu6i7&5gQ&AwViyd;sTs~ z(?|5S?Rm*X4s=|fHypcNec7Ac;*c`1J`LaXwmQKM=cYc#0tfhmQm{43_th&hy7xi9 zYLVL?68QyT-PYPgBrxn*t9=%*LELx9=Sv=jZ^+ z$+|~zP(K;Zehl&rFN6SETO@IORBjhV#Tm2EnZYPDFtSh&YT{H&dt7kmAk4n8HzF&b zyANqc(2(8QEva?ZG$w>z_gYzMmzW-2VUE-~tlfowCZorW5B1cIoT!#(Rr2u`n8bf-PcO2#{3crd@XHbH2ba_?I~Nc)eyIRVR{Dlh@DS;os?aUs^(y> zwBwy4WjiWD#989HA@ER{o*fnGR%+2WMP3;e)-(9MV=9ZQq+t;_Yn;Wj<(i#uMYG?3 zopzjbt>wk8FOdCti@fUG8+%6}pMV}(_yWZI-1&2NEPU>rP`PK1%Zi$3ns#d!;my$& zC-(%Ia~T~_mn>Y^P-7=f)FHl6cFTBKrh><4Z`N!#yO>mDGuqB>)wb8HOkXK$5E1Wm zyPYHCf{%H&{g*=y8pF`BihM9fxdKLis#rJApI_~7_{d#nyVCpw%=wW3?t+9-N=E;I zI{shsMzGD(*t6cf%6VXZc7UrB;^+{fz-2`)%2cAv+qXHm+!{?4@}&LN;W(A3?}OYu z%Wm{cxoTnI!`s-`&Yu6vys>2a>eW}3>M(PI=Js?(z}p2yy{%U1I_8Xx6v{m&j0O`1 zh7X%H8rxYM(2=w(_DbFzcAOx;=m|j7aD%7GJX>L2-8tZSzf`~7GvRJ18G}&dwL$$z z7-&u^(Pkf%S1-lCHi4!1?ZP%a`}JE!Tf%5TmWQdI&7!keby?%=RnctUXXjP5eGP1q zJ$%pA`Q*ANZ)d?&80JCf@BLisGMIGINO)aGvS5kNk@&{M=~8@!rO`hx76)-s9ac;7 z{M}cBS6cz2_p~rlHKf;6|F3Y(jgw<}*Y4)16}ZW*DtnGyf8tno&L3KoBTW-?7esS6 zodi3~haFiK9h8&u%O=Hf7n9&bo^ey@4of@T=)XfFG2vU6l$9@&*;n6(l&|pqe4)0j zN%>e$)f}2hIl+eKcWs#NOYleJh{}LPuG9=%u5d&uwfOw~r2q1Rg|u8o*+Gh@OocB4 zZzjdIQ{DsnIbp;rCb@R5&DDhkI!7hTbQ9i0(6FjwzD*fn-zWr+`=KJNx{TRXBhqhe zk?!cUx^JDl1TPHhj1Q-gsteN#SnXQuL{@8R+z3iXP1YDT*1>~9+bQ+rMV{51LpAkC zJ6OYS#A83K7+h_^3>!7!pVfF#62b!qO!lZTg8nr`V?k88#Y0xuBel~Z3S*}Vw7l`{ zeEgCCRUtD<+Ck5kPo!BmGg`kCAZY&Vw=6#JUtkZdw+r#;S}7bG@P`Tzwz8f@`mAxi z=pe05q1OobS&@t$rtM}V>;`+HD(@QL2}lPAxd{kv*l`72AjjOm)P{+8Wuz|3;>f%Z z@Htbb$wO!jH(O$qzc)E7Z&w%)!xV`VrtPohGZJI9NeeBD)1F2;)jnO#X6CNpiFB6If8x$uF zISwAkgC}u1T(v%}YH*!86(4S28$T=5XN@$jPta3v zUjNf6=V{<-cQRn;WOTIE1)ceDgJ(wV^2K-}><)T=cL!^Bkl?IsR`|uL^XYx!b5f`& z=A1!jm#@+<%(GreeSGWvO^+wFm8ypx`83eFe4DwBpa02S)HTFQQG{V^^ z&x?RFWY9^Z5>>C$tYv`4rFB1d6AZ6#%POlWJF_iYsMgenq--!EGHbiU{D)(DD`SDT ztvN@}YaZ45BQ%d%d-D8!9kv#=`{9Mul*!;FFY8Rv1n@8=H#+KN|r#?910}j zkpm<)7n67A@z~VR!$sy2W*}fwZb&I2hMG|}B|!UD0r*lvTacec2%At{MX@R+5uw2V zhfy%h1oYr+X#vf~7zmY~)lmSqz;RU^RST3a-90OWWti+rffqR_;Y#nl3FnD1iH~M0 z%M;sNPop=?n6VuaoQG!ajw5Enj*+sG@~y+uxmwj>I9EGKSgx+r+Dp}MdLzP8qqY-5 z`Hpg*LdueTU*S~k7uAwYsd5odWr8e+97JqriWyM7q60irm>X0rLks|9^nszt+mk!A z!}gwlZxL!S*LY9`B_=@iQR>~> zf!8j$u#^K*)V^;r2TtL(;Hb!t`4bH;a(S1FGE>alO1-%9xqQ0`klR$L1!NN7% zv}Z7ujWb*A(agb!5cyX-*X>_`v`h8y7Ibw*jkXX6oV-a75?XeR3+mJMs2}Uat#z}` z!@##d9ikZ~C|G)EA`W{k4&cf%Q<0Bg1-1_UlY7Wcn?YJ8fz?3EElgm0YG^&i9RteL z2?6KRcHwO}C2rnrlA@Ax(8Uq&VA*?mx~xR`<49aRdnCLJnUSm>Lrpg|(B&yNgjRR7 z@nU2G+!+hya)#HF*tJ9}d7Yp=Ns$gGL=?MN*$wF0R$V%wg1|Gzcr8XY<*L7qR;#Di z;%a*DYq4LH4b01mCEWK~j|a7NI4R?T?U6>X$(y0_XzAPg|^_e1@YX z1A5-_vcjV(b`5Hc8z{M}&bnPl&3Rd*0qH1=goGf3GT~Q*Flvggr`eJv?->--b!UpH z+UW#||52c6bUM;_IUI{tS7`bt(r^^s9*;3xeFXT%E1Bd1rV}}no};{!Ft5$f4vSyY zaWh$Oco$)C(e9&JwnXKwUSr|kO>8&e<@7ei$WQ3zZubslPihnZXSan%%Hrj00{Qe1 zfX+K!vW?pa$Lo~RPopVpDektEN>E*owI5Sw6HYdW9BEpOJ!(`tDh>$g1nczS9lRM2 z0=VnmGJB6F>e$O69vre7N!TJW*$GbMYSKT_(7_&0YSlcjcku{{-)KvFbU34Dqy)J> z26=3x`s)|bXk63DaMDtDnYzPh%kPmZa{M7o4+lF^F-#pr^ga&^kUXy=5#&)(NEv5& zWL!Z?J7GV^O>awkcnOpo+p{f`%_sM?lrqo(E!Cq^8^yVzgN4dC6f-U0vGUgmTed{K z_gyG6+n-&Au3kSppGr5y_kw4lciEcn9mnj->S!H(0XY}uv5jQkSkaE53FvZzq>&{@ zc?XZaoiF>hSXxE0IKbrWA~_s}rL8!%CD z=8H^{etBQ1*~!DgDpf*pnm^iLX-zPaB_IwFussrsT>U>N&Lz^Y5y{FBA9ljrpay<0 zBiXgj7`xR3e-2ma&uY z2CXp@_Jx|0mMXA*6i2{x{Ajjmu)GXM;=`=haPLt#2nz{&3EGUEdRiOO$%Q_65E54s zYS%`!m8_CA{)HU79e8|2jWT%U)bd5GW`-Am-d1UW_gU~iLNH#ez2NykT~>VZ3`9Bp zra!+ASq@$OB03D*Zj^iYM4usT%Q~A$*w&1>S=6$3J@Qh~l7^kuFWL}woN0%(YpnRizFOt+w$hiQ0j^GP?0W&<^dRVJ8(R*6*c7d{%$@(pP?-$G`0^6Bb zRi1e$vwzW>5;j2RpE>wM zJ-wFTT}UDLYjy$eU3Qgh?y1V^w|#Pjo$qeH=z^k_*GGlpW^r|zUTy1^q!&uyGORQbl%~#_T^Q9k~|#B-(3C42HK}p zXF?~TXI|YFVv+NTg%q1XJ-boed)$!W z^LbS89Ctp`p*(_0R2+l3QcYb5L^N&^QA>@s19fRt(37i3RN}Yx4c_R(+s{ew(-m& zlR!rKM1yrMw1MNXMFq;8OofCK{$d^i0Ln^B?4>6@8DXpXa#mGWI~O zudMw5J`O56x`p+7IB5E)KcG@0_)(Fn29-I^{3gimzN6l4l!KKn>E#Y2XO|}=S0C(_ zY|ceb*55zstL;_BAM+2Xd%Ms4wr*I%pJH8O0i_}*G!Ry1%0n`ec(oH*`75?;sT8E> zShu5&TfnB3S%VfQI8S_KI0p-3GEQ6wu#iW5PS_}HI1LOP8kEh$E{SJb7*X0y$cMf{ zCo4nor4#A3wZ-wis)ML@Dj3`S$uyK031Ak@Lo+KkOQTF-Zp(o)yxT6Q9+7bqSzTrl z;z#SiwWGr3i^@>=~TqYFYh&9%4?nw z$!qYHhWLI{JXe5a{lQRwS{3-2x^Igl-h48?pv|;mM`L88Rc5TZX}A!{AG2X6uC%2R z4S<8OQA>O~Og~>wpkhhn`YL)0M(ALCjlYi7F{xZT_eA$aEF%Q4z~Pf7GCT2|cyUGy z)3h%$SXPlR$01-`*{9!Xti$4P&4a`z2{e6HHcdRH@xrjVrr_0)O8yCs!7j?2K}(gE zZ|B$7;-X|_+>v2fwv?=k_3mSuoZ-9Ur93|lov`haN;s{0uNC>b;epn0y?3(^=~3ET8?YY^k`5^6ug@zGY?7;)pQ0cS3UBuhqJgKTm-*E31R)dLd?Z_w?8m z>JcxNV?S_BM#`uPtUgi3xGKE>i5NyF@qqXwbbK`HK&>H>A~aBkWY3yYODR!9nzy;v z{jelyKLH21TevEFyEX=?^*(K!f<^Ky)f}ckk*Bg+}HD(;+Eu^q7U8Oc^%>T!#Z2Sq5_$xu>oE^oq@xU z8{#$^x><=UMeg~coP70V*70h~Uk>}i;M5f(#%s~0GxgLH&ubNHYxRYvL^sM`PKGev z8dI^kVUlu|sb{Zpnbc)TeN5Zrd#psc95F&Lvgpz0lu<9p=FtY<2v*>zetAnjUiZjH z?86cwS2zCweM?JUzT-5IFTm7)5^3CMkWB&wlV2z+%Foq57j(5D)}pP#zsbm7$~Hs- zZIV20XV0XykW{O-_M&3Hn?Kgd7_v8#+{&cp)5BUcJc`yGRt-SIT(afqOXtzfKh9VF z^DO$p!FYE5lzB+xC4=o(woS@cu_!~pw&T6m|E`^kCv*|sbDyluvI8DsOvjzlK2kT( zup0$(A0qQJUR?R98+NV+?&7vIm4y^HSRR8E{j2d^pcl|bPjCcCuW8U|1H)ZIs4~*c zXGj4C+FOaE__FnX0*A8A7e`pvQl(iB)wZVaZx0tWA6_TRFICry(LK)@boAlhP%oeu zhm0ZdqOUUd+g>{?^nV?MjN#S*C+EaHVC50ftD%y5Iu;moC*YS{6?Uygy`;=yiOh){ zb-%)vCbqNN)K&oNWZHw?We&(=mc~zbz)_0n6*((WgJsuy4m&s0@mMH+%Ke0ijk;=IX@mxzYzl1xzD#8t!ybTY< z{^g`HOXM-yy@b2>5`u6CSyh3jdcJLjyZVBioQY_j(U9QgTO)}64F7j9&NbPygsg|6 zZU+Z%64@dJ6lw?lQvED<^S@;m^_IE{dpoFHwG4t>UKeH45e`EpX?j|E!=$1-@$fEK z8!{Z>mASSU_VwEl4KksM2Poxq)NI=}18-jZeHH-M+yLhd=_#7B(IyXZX8kW~0T#No zg@qo0EcA(Z4RL%vnVRXqidS~^U=gG}sVIUHd5hh2UQuD}#uLmt@&Hp7N>8 zI9$$5zt|KO+eZ#O<3?qZXuDVsG70itGp0BtI9Qla^h@7T%r;5S35fNsEZl6I#n!ZJ zPRCr~ur=q@VGjEOCtsxLB!oB4G=@~TxM2Xy zsE~~WMsd}xmEjJ_4E|%egl9kR_TWIYD>Ph`%jJYs7pkAhObuhR#GMuo!yI7zGmN~n z8rNq|#;lX}KRTD9Po$z!kr-CGiDs<+fWSW8S^b-#fnA!XVZ}G^{LC4E|T3I!J<4hTMVq!W`Ce40*m^=+JWex>mgx3uaeTkK@7 zsWFnQk}&Yz%XXUNvdAX4Ph6spIR!}LD&>+cGfMC)2HcP9@+g-glSP-v^B9dHeZva5 z&wbZF{q}W+;diS)5CEd#tQGSVJK|uP3#ENekjBaOM*^Zl2#{ChIn+HA-GBakJ4`wG zg2S~dUdK|@CIq<_ir7NU=4w663(tLj!pj;wx7egYW8Pgpu&%kolR;|qzu~{HZ_gOF zBWpf2pvUlRGC(5RMYjwKUjFV=`svXUFc)70CDRA;nG^DIr7Sd|au+}SINB5}$C@Vg zA!~6p5G$k&d^;vmRd0Scyu1s`0%b7dTUGP$gq&6|*(L*cB(j%rs-s`Mcwp_tI^H*) zUyfSs&GDhhged$}xcb~Cq;NV*IUTM}P2;7^S$U@!1aSPME*ovQGkls&Bix&#Ba!xW6H_O z4$yrpt)#ZN)&6xapG$v!KlfdQvP&(6ScTiNd}LD-43#l%8dGsYB=38}GpT^!S?EA!Yt~Ijj znj7Uwb^H|PiK57p!9YcSbKeQ2owa=*3M`fI!DNRotrCqRe&}2mKbUImQ%S}>fwY`J z(7g~(PKYQ^aKdkQ5EZ>8bb9hk?0{x!?ysZ?8T*_tV~;j&<%Ci2@nkl3OJo&dG0S*pGxO|dgeR-p5tTA^ItQ^oqDq} zH{7km%2$6<>B-7G5^edknbqqWc6cmL_UY1&tdj&9|5T&kX=9nlkM>|HC^*a|R={RD z?I{i_#QiowA`c8Fz!f#D%E@osLk8F7poR~7dG~N{5%A96AOx`2>9k5tc%79wZANz+ z{{+ZMoT0o*O0^+6A*pz-t>We>NB)Zj74D8e;fRxs!zWtJYE~pTEiEd+@jNoq2<5?A z9SRCf8i)4pIjI=U)~T@b8V?SI2jd>W?iqc3aUL(e1%N|Gs=cdBRF+g zqIf4g$&&W0`H$Vk9I?)|_4eVGe!`_)0oQYt*OV!Yb$8nnLXLw=y9;VKWTnozLQArP zv}MI8F$p};)LI>SAY7(VyR`pAi!GV-^h(dk$%+Y>Pwz8R>uW}wHY5tCe_nI!-YFXB zR5=EsX5a*!%(u9Z;E%tsx7*1~QkLLk0gV+!HcxP3!UoJL3i-VD7%;Gjjha{AW6e(Q zB9CiOFqiVKH5BN{@z+0%arg90kpV5{Gmmdon@Ww6G@EIo%jqfuEy+vVZ0k6OG(?6h zDts8CzKZR5aK?Lz(`b10qt|$5TZw&M*W=KJ+*KdS>V`NsEWg2cF9Q4hHjL8kr)thqlTr7R21uuYt{lXJYwz*#p;~#&4Y;PasCzi^QepG zzv~r5{*_DHvE}mEZTM;6ucelYKsTLM)bz6#*UXv|Rd>TWtmH&%iMYQb-159Rz#y~< zCSZEWYW)qXg6k${yanq6KOG)mPV+iR0Yc!9crUZ@1{y8bH(9RaU)K4yC6c*~Zz z{x5S@_Te8E?fE}v-Jmneqi|{8tOEA`=ICHKLv1c@><87=Od-tm{ev-c?JFplna zA!jLWtQX?aMUh+r+ci^%`wz)A^M`oM&A#thknvJ<=r`fRf5@QoXd+YuEf-5q@akzrU;uLLRejo}9dC z9C*LWPz;%;24mAw3i1gu5a&d%g$4~jORNK0JjQG0ysY6t^yvif_E|7PPhl-JaE(&s z8P7LdVtPpE*9T(w=#SNK2+e|ot^vpN)QK3&;7Hw+xi2q7LNl7V3ui53!~2}d8j3+! zSVvhU7%@z`cN#z*gSBllymPObw;yeb3C2$P(A6$wz*(JuGjMWZb$g7~vxn)xMQ1~f z0V7zH5aJehb&y54tC2S)=Ag@7@d%6@op5@kSzp+IyrhZ&P}Hd%{xV=zs8g_ELMUx@ zA(*d`0WeiPrChF_9g>>U?&!T69Dg6W`cj6^>ApiO(TZRI4z*b!{tMSGtj@|6F(C52 zvA`Jly^X)QjNatQ*T1@HY`i(jB{=>#oM#E&W`kC_g;H0z^Flte4(_vw?4jlSDWcH1 zV?CbPDFdU@Jmb6EO(UNhax}+aj?Snn4B)l20Z zR2W^r*@yVsd(r&6kNS6Lm-EPjf888KV2-47ZomyEaRAYnt`OmRPIi8%Fg7U0^`|xSO?e_OST+< zp1^u6SAFDZMhKRxl`X^FP$YYq7W-?Xc?*h`bo%clMxXZcTDK$_d)E zx21a`rJer(5XTetj;S$YwwCaZ7q$}Q)O#gvik@onj|E#2*j)#=q(#XRaa9lHo#NFh z+}3W2U7Ml8o07EeM=flYy)DZkpWB$@Yey$Gy#}gkd~7o|YSQG(bHA%#A)K*C5x8 z*Wr^uL5Bb!`yPXZ8y*Z=D?K+)gf}TRXsnB0&o}Uftg3VAH!>zoPdQ-4e{F3?*#{=NNQ0zJhcdHTUJI>d9$auMlea^KNIEglGz*FqF)4 zKCrDMPdyuR{*>arkQ-k{2mfw;=I>o)!KCf=tFzxAdLpwt8o=PgwYwr9xH`uTY3B zgE5~e>*_wck_5iOKAJz7AGxvr%~|hfbn~RB0ebnGKj9ldHZ3jQH#-GHzO9}esl9UK zSz{u-wOrZk@oKozwtP?{f9^%y|Lx-^;(W`^B1kWq>n-D&qa+a9g zu1uk)dEo!%ZO(_sBH@C-rs-Rz>cKBAm;U7izf0gIu>*ncL~@FuB$?~k_b&rqh<_k} z%f;Lb|I2jqcJxmFZPS1GTiM4ZSOcl6dCa_++x?))wi2`EUmTckL08x&&9&<1=k~!j z^LUjb9;3^P#Mhd9s0duFps-YV#s(Sf{Kt|%O<5tcP!33+1G}yDGiH8i+)qC*tomR6 z50(kyeg4;B{^QWjF6IJc@p_{zQ(zG+w(6K2=HJ>H-%>=D_3Lm^W;aXJCph4hsc(dT zE@jN(XpSawl!A$ib%Q&?57JbT1K{UQXYdbE4c6_qT@rIcZ=`tO^HIl{m_b2%7RK0e zeEuz7tWC@ce+^=f5w|-ntz`M9!8*kh?|}hYZKcuuCWEdQ=Nkp6Fvto6r9X%B!&4#~ z@XzrdGFkh_xQ!~h^Z@)f1Lp+2=9ZQR#sOr%E1%OoJcy%fxEwoa9yB@7?3}sH)X3bB zMr-60-jk;g@Rn}_Af;tXE+(|RmfxU%FUIJbHK?i`(RDiRu_WZe>%j-2kFd&LM*6d+ z^b^I%0snUtseU!jzdus_q-n@eVp00yZ*WHV`1YMy5zBsul~?ptRmFB}Hk(y7N8ZO{ z6>PZB8{cx^3E^=u6BZZr0){3_9#yNCR(X_uO;G|?kG>R<;_3T=v#vRU5U+qymIsw2 zda6iu{?P`z=HfrwVdE9F!`9U!PowirE?jeGiEe?3f^e=ivbkjar|lR0p`QCJk+AMU zaJOqDPo#P?^iKgLPedTRzjlr0tqNAVWf^#J`y!W}(!71%q>J#$aH*7b{jX^7?QiFx zHYsP2gwA%e7uz90rn^ZoRB~HA`297x;giq?>#q{uVU_vRPhBsk7eHaR=1=zstMNFz zWY-p_8(MpJU0d?Hcw_XDEx*BR_TXiOn=fZO1VrzKH4LAY8eT|}`~6;b&R)Y8>Q6^M z9o7GI_J!P*OYfl=Cy3zYq}dtjA;9kNAfQ`h?CCqx2Tws^cIBDw#+P@`T((~+y=6Ii z|9JF~&G2hH-Og+6v)146k&-RxwK&*yzb7s2O4oCo`W#$#ne__gc?PXkL8!|nrMzDU z9as9o;|y*^XFZJ5P0;s-yj4To^V^9`3p?Fw((k>o-^_CQL*`$piwAG?bUb;-_%LTD z{YIYyYtt(VpKO+TTj-kKyu1f{P{Rpzw*Ar8g!w7!>qOQCs0rCF8kQZsbstVIN!$>V z@p?3t``Dd4COPBzeeM?gGj|`>USZ?!drX`{tLyA4`D5Suf@6zbxHw(1Ki3;>V%+RI z*QnB^(AFX=SQ6hU)u=|Q%1vE(&}h@%U%XtPc*ol2axG~*+Z}Rh42-mqs}}Byw8RXZ zy7D`Z=tTG?v%5~SxY&Ks)WfI(dWNnFn{zwt+x>XG%Gzb>THn89=|5lcYaN!-R~^Z6 zw_07sFG(vb>=OlL#JU$Q&Bma1v3kC(&ku=u&zR(Z2bJ~i)!?dRazAb*cL`v!mbvr| zC9!`GZQ#s1ipAM&%LCvUmV?1`A}j&Bt|D#G$hWvosu?`f8{q;nk&tggfj4);wdRS1 zGvBcP2WSPWWS&8HjwKw&@_p)f!Gbv+Gf(_AtK?JF+0(mwspg(oZ!)qDYtDUuS~By{ z%agN?i2HzO(?2qKvlZ_CZJ zthsLm$o5PGYHH#7erid$xxm$9qeoUP#t-%qf>9KGx5Gp;ao}|k!YRJ~ymsASVMEuW zwKM+uRT|u@^wk~zq5`r|$ zyGEuA9=}3&jVsw_jGy}ImvuiX+xiz!X{xI5h3WRB@|SeVqMGfu57co&$szR-7se9L z`3Y4;^wsn=GK)Gv?S2m$dUSA$9U(W$@4lCOBHK}~e|-P{^c8J&82g3H7pHxxU>gsY zGhTGCJ@Vg%esDgO<~{IvprO0FJN0&n2e#)<==}`*ME7-lzY?eRx-l;gw&_ssRkzgs zDuU`KFW%L=JY{Zw6>+l6F|EJvV6cX$jdeSX^+?SlTJ3TWbY%I_#u>F<k`4X?jlcd zQ4$CFdk8))h^57|xJ5@76PV?uUt$?|+NOqXAKofJ4r&V(7xj8;mAIH%XIvXXcUeqM zt`O2-(kDzOp!=XN$ey)YYqdew>M#@GJXD%3S#K+GH#B-U9sNF2no%`w)+E?KbJ*(- zRqo}Genp_)kLPoy!Ly&XBF9W(Zh%DLQxQum3kxZg=$2yJ=oFKat9!SPVqZ8Uu)6cB zUU(F_Jg_tMAT83BVt7^;wpI9uS5$mm`#{jq!RXM7zU2eh2>p=VwKFwRHVas+W$Pt> z2Gm0L^U54UPTy7j<+_|$hzg73#WP-C(1a0c7(;tIL# z2ayj{0VMI>Bm$F%+Yvf+3-I{ZP*9%etih zBS3sz$M0%c_pN0qUJ;p`w(eD0;+B;DBxUT@u%?>6wgOmK#dvj;Hh^d&CHd{09_e>! zU|Nzt;w#D_mrx^34mnfPS9)-{ys-@P;^Uc|FAWPH3*OGu^{ab%VH;J6U0i% zMV-uaCd9Xe76tLl?2?KetYL3JhBJoRk@9hH)B{(11MplZpwdV9eSK$0O=$Sf_0IZBSrdcU)64Awh6Kuga4M&3T#KUECb*bk7*3%THk6OXxYqQE_cc_A=tD| zE^5!(X3ay3(5+KTv;0a)fM@lbgIJ;tQTw9R%?!3kT9bny^WvyE41OCJe2$}CT60zg zcUPRU7nc&JS44bCh6bAm-k_Wyp@uj8qColFCvM*o9LiZhMfO%b96oVpyg}60fZr;) zo$T3tQ8a855I|-<_e{i8jsFQaJ(89%5iHAG+~&hQy!wZKV8r z&Qunmb=>{W6;CzTcW~(32+e&qgJd0Rq4m+ngl^Ab4PzT#7|e$YYP=m!c(nCM8_~H? z!~1|*T8@B+AqL|20*w3FB2qhhVLbcY_~kz#({FwDKs2JK0%i(+{K`oBdoqMZX41a; z9dkJYRh9Vb@7B47)7P=sFb3`{f4y=)>mDg}rzW`(9AvFtp7+M`S9*b{v)qIBfX~$JeDe$ERG;f5A4InarqZCoXb#cVEhwD%^f98tpy@ z82S*f3hmRtP%69DH}RL1IS3P0gPNU?(Z;(AXEHzEs~t6$smXqYcirkbz0B)TNjXs` zhm=GgqTixr_yzw+F(_P` zJClx4{6lN%?<9x|l`JOoixkH0{^v{JA%bur4pa@W4TqAy{L4c~N!cSlL4cN#2T+hT zySh)zmYWjP6)xudm#WkvH;N8LZEt2enX1SJ+TLVUmza0I*OkSwo>_|IZ2d zKEVd=-csf}1}MftJi=JxFMS*TL+m=^GBiqssP-jzC=D8*A|VhZ=~o#0^*>$@w{E!k zBi;6YkOlnEq=Z-Xs&q-cMqaz;c5;`@CGDw8;bVe|`ryo-o5jeQLe(BG3szj!RIk)= zSek#^kV`y!+MbJ-VLO_5nHy#{ao_wO&ZoH*4C7{U`yZprPr(fi zn||r1C=%4wB?T=J4w(EoOe@co%I&INMcSz$GWZ)`fp1^9Ks!;@FUV?2dEms0cdd+9 zlQq8ySkxZrOfYh3@Q1`i#9dfJ#Kt5Xlz0Q{N z(1n2fH~J~J)b_@5TKPT}wY@a(OKi_;Ut5h5WwoB;MWjf$TZPH$-jgMyp3o=o9WP4+ zTTD_-a0{LmQd>fy8&X8s&L*{bD6ej_qZ*WYEUgV)CTXZdQxh%u8+YDV11DD0;8 zyvTE9lTZiP1hk={BxH_}UfT#)a{=>#-1&kmk#jqpn2|})`_d-W&LaHIyZu3gIyDfJ zy!e(n{Tu=!a_vY-Ad(2 z(pt3#iQ~UBL9+X@KXhnW(`wM*8^L^fLNSDat0^uD;mbV6W&neD#6xdYUr-csgQZwz z3^;TI{>=?LH)x&1>Y>WnRz0{*zxq$-BWGTGY4Z=~&U%$>X(vsm$x@(`FdS#T*kQ$D za6yv$kvz5%enbC(Bsq4^%8?M>qLziq^8%SLZzGz9Fs8hl>=I5g%Ee6LFkJR;Q!0;a zN|!g4d-6~p@Q%7%amPpInl3`vRv{wHe*|v3@cp&CpPSBlY)ie?M*lT`UUNE@@jilC z^~L0{oW4pnobc*cj^^tv(Z+lY+9QkD%0iI={YY7}ylwXJJ8 zWs4=BKRIZxQy)R&XmD9;^Gc=n{tuKf`})^6>W8m?UL3!HNj*SAbXk9qjfi9nIg?12 z$_5l+lKRuXdlOkX(hCLU8)~78fUPil_z;f@)<;K}ngUTC-e4nVx&T>0q5OxY7_7~Y zUHMxSP{ zq-FI9U{@Ig`?W&Twh2`>)OUi@lJ!U!w($G6ef*KKg5BhQC=KrFKj!W~OfB4SOAHaU@i z*cji^)m3CHx^KA_oeCge_+2-KFL~A74Q)r^W!q7sdX3V_%^5vrSRh@FKzB3bb^@AX zuIzPQAyK`=N!wGeJqUvju(zHtKk-d|EoIxpU`qB{DtvNNXK8W+e=n7v3hM%0J8HKT z88$SE91m3=>FC*ayPfH8uY{evr?%pAJWOQR+8k7?pZC-SywDnePX%s!z$D17tUj{y z{Wab><0-fL7_gp1*JXm%r$zno$^YwnzWr9m59(>X{>^Uv(b1OG&8%Y$b#SviaHrqK z*j%sSDct3K=m+rV?Wc}dCcV8O|H!MBL4WbRVvo}abJwUhoU3E5pC3SvsF!uRz~e`H z2Tf{zxWY)~l;Af_Bt!-q?CS0i5vRVS$PFr~1X2jQ7*IW7jjpK_0keO@mY8npAsQR{ zm2?m6y41%&4wxLz$X?Fgr#Ap7S$j249gdeJKW*88F>dkt7f4RLdf1E59ZOevm7QpC z@!5K;=$?qN%IWzF9~NbMo-kL%V44_VXX-CDQYtxh)-1m0o#+ba5gg?rsTf!r4EIc+ zJBvEiQ`a;PE})v45Hez=WqrGb;4!$QmT(5xhV#J0;PmA)BHR}CD`dU$CK%TU>#~n# zgVOR-g=F=%0CP!Ci;#aPZV}wu*kF>g0i4*gnF^|UH%odRy24GcrqtOlM*M?wKCNAh z&r>gMX$iW_95=Yr^V*$*AeW-y; z`2r1NFnxm9PAykX)7jtUKT^fRm#(Yc>Ar-7Sge#6me!lT3o1X&imR-sK#EbLE%I6% zKWD`i4dR2_X`t(KF>*&+UcHIXJjd>@j{C+;9QiV<%Zl17w?fSGGB)&%7G)?i9W?UP z=h*`_NYx&T&#dYO#SvI$&SXp|#V+&T)QTRL*!1T}V+=y|bkqCFjH#iHk$AZ@rV(*Y zql>U*Dz!?>y}~9Kra)hsr9#-_JWByTvNo*)9fIZ7q=|i}Hy-~+doJfZ=oH_Ufr%*8 zH%>Wzu)4;uiRURV;Vy);YkAALZs>|wK|Jnm<_#m#qNdduUn^&QP>^~C>LU4 zG)5;61rR0REeug8Pd6b1e&i;^s_?vj!FFAhW=C8Rq>QrP(Dg9k{<2L|9XN;>4hL%k z4aP!e{iXY}#yC)}P;ele(d^l_f1tF~tXAvx@0_HuK|le_XQJUw%Q6_h-W zYTHU6+@n@bI>`B_m!+}^jRNu&p59k<9KuOjcg>?M77fXUUEgrBZ~EwK2;(ig18T zm*9^Psi~MYggW9YQRP`X>U}E>T}6oDNm9JJnP|5r;FFhC!8~vH~9<7;r$=Bsw#+qI)8qIT~>G;2X}| z9i%^9OL#AOH2(MGGTfHv{yz%hwy9SbuJ=XYndj*l0^fQ=F?$g+>q2$JoKKEBB`blY z-w8KYQw)Dwd$qBWh5Y@OcslOaOG(a_TUNq=8_~wlh;lOAJ>%4aYTUqNftM%JAhfAh zkkgDV?K1*g8rpCna3^lPemnD{Kt(G&Q< zW&dV3wu(!=DbFkGF}2vUh0$tzqq;T}!x&b<5M_AHz^Go4EqBU=C0HCU-RZuTD!d4v53=@SW9>+&jAl5(}us^w>E+>wV{R`zK-TQ z0z84H9*0n9GfhvtAqD9fE?58DE&CvCecIf4;{#KpJ0?g5_hA7XDl3tFt-gl~^4vRKNncqV?eHgbK+ubGvty2CGbN}iu4XYRhZN*Vt;Xj_HSIq#&yjiQhW?f4RR z;Fh^K$n30Ipc^a?O3mRMN%n3>7!z`WHt*VSs<8m=OnMTPuL}np2&Cj3V&xX{TjlHU zypGGCBv&)}*;ew36O)R@;cT=m4ZlAZvgzOK1pS7F<_>Q51~4Nikvu&F{B;w9xCW6( zR4KQC=H&>Ib?D2v?90nh)F)DFmfPVt>Sj5KhmOB|N}j_j3&H|_LOZ$p>DKvC>cY7S zm%4sbHE8S~%j?PCe1=R$p3RU)APs*foXFJCyKAuupyc)`AGiA~S^Qc|Dn)T+p5KV} z);`1o!#oC8`YcLl)LQ0`4uB3YfAxos*AVKN^mwV--77qY-{N3+uZ$yVCFBy4^?xs8 zU1Sa1XlGvy6=~$D3aef6!v1>ZRlBs&zi((>pwo+v0`-OT&?$wluf8G=wkesszh_!S39XN1!O2THHi<|bp(MzL0Uc+1`V(c~VShadn+~@PV^>I% zEmplkA^fvJrbRq;J(b|Wjeu<(dTx%~yJ|6y9MkSme zFu-oh^{P{Idv6exO-PO~7n+0)#P*gO37H?C_g-dR^$6|Y)@Dp{YwLF{A1S-+F{F{3 z6H%)0!Z~w=jH%W%TI~~AAJ#_M0jK>32KFvs;e2%1>(hHFs@%bfbp2%ph7zm)LEW2% zC6)jG!_Kr#)1FOcYRuF$WmZ&9?n1jw=2-4KmAMO)rlta?W!ff}7MB_`Dl>B>H%Lv$ z7I7zYK|!TLqd-I?j>zF~?&Ey#Z!^E^{yn*`>;L5cpl6BrS>Nx^Yr_zVo;{}7;snO8 z?=;khb_oBv&qAZ`%19{@&DU@erdsas?G%w-fkkcZTc60Kq~7+X%A zfGp~%QplF7U(Iv_8a3a+lqaRy$vAY)kzMf}8jZ^&Di^%A61W~8@>?2m3Kl5C2*@y4 z0k}!ldE%<|9Zd=py*{z{pV?Td6O4D@9(tLC~sOI1{8)QNQ>r+LyqCF*t$1Jj~ ze@X6HleTxU_57zF8ivYqHw`#`t7*K`Z~QXoNw1BJpP4SJu1u|Sn#*bk`fXh1cI@u=G1Hn>nLx!$6qw{K{z?lAtt3PqIIF$!Ie+AP}&2wr%W`QuCy%8J^9lMVQ^Sm z_z2bH1sdW9cpr~`)cTTNupYI3u{5~UK;CYsq5ri*LqO9pSU(+3+wk3qvQ$tjPUT(j zUBD&`tGf`rv7YiSZAx2LHVRotVuNK*_?<6ggni>yg@DCaU9I)d^!-VQg_>snDxdfS z8jA>>^2`{-;b8}1;EOi4(P>o0O4Uv#=<*@{PXMhji_0a~BD$DK(Ma<8jU9UN`U~ zY4oGSv}w!O6=lulf>}_WqiPD+9{R|7qTe@)!X6J;0VH1%xqd$m&op=*@U`(pOJ>rY zhb`AbG3~we;)6L$W`p@&V(=oBn2Y|?zc6i$`Pt#6W~bs%BZ`u$n7n>O`I79A4eS_Ly>JF<_M`oky)^NWMEdlQVTUn4&m5o*b`wIY2N?ZoU55 zwsDc&9822ddW}3QpS{j)1YI-9UwiUX`x_L;YOHeNKfVjCufG?{w^rR<kwkmH=5lRA(ghFVsGX2Yz(RtHP$Q^BxcEQF$_;pJ)tqX^@bZg&LYpcq_TO?aj zovj;LNfg(UFL745QmNo=hm_nyFC6jPtRQ;L3lXOFmt@gQ7WOPWCpsyX{I|zW48AI^ z+b`8!op6a6ZI9O7yS{=0?U@%8oW|4MZbO^7_U;q@LO}YTfqBCHIxv@(>b%mgn*H&U zbEO~IT=V8!CNb&HBfo8!doiA>TUkowb*3#X1oK;1p+}crU6P*jvxazCFPxIZM)cx= zztl0ESd#$G(h)yS1f72QLVWbRFd%uPZ9sP`<~-78ior-kr+C%XN1~<5x%Ql+^c8fk zkEg4CI`IQo+d2~0e6fwVzNGtpzf4)Leuvuc{5CVp-$Zo5O+v`v0|uW081BNbKAF-z z+KJBz%U;3hNUC$x|GP5>wMTZpJ4`2EVj|s>dx}iaYd-z!iL!8wrrLVKt)cBjNiUr8 zus!Mav$=y2=Q4YW=!Zv%guzeovTW-bqfp}wMh$Lohr98aW_d0eT9|%I>2OPZ3<~e! zoi69zh+TuL)AuPQ(ey6drgzdkTBnZLNR9EuWwyt-{8Gax!oI})9hzd?jQCua?O9em zqxK1e>q~!Tzg~ zcS)aeGs0#Q8|3vN?d6^s%wY;{b&>I(W2v8fRy-Q4qQymbkhBR)hD1#<$(6dsfPevS z^^iyyC(P*+q@G&0C!BPe5HN5HD$`qb_QqRf1#c0*9eS1^ltg3Axe1hBMcrS@IIBC# zA2yN6eRZ+{(U+YsJcfJ@A5Y_!yyHXB>%!%#EcppaSSp=XfGVO#IW@t15)&NPBf!*|=j=8`dl+-qF#UKZzYDkXNY%8`Zi9utacUL5N+z)?w4|eJ6k#iyln9%;kzxQ*( zfsRzos5Y2OuSD(AR!eLJcsXYFsrUB=kprdceoms4?uRN`cB3Ij$>PKnpX|i$p9y50 zg>_RbD?Lq-BDYurIW4&QYU0cE#3-ju$;KOrZk1%{v^L+$-TrWy+CTJ-m+GbJ#1^+X z!xNfH9A+-u9=+)@@pEPEC==WlZxXtS9(e0&gI!$i%jXX{C&wID@^c6KW)tL0ZkVUZ zGZV#ii!-r@h2Ii`6PnKFYYn<9uA) z==%G(30uFQ(c5w%s#jPE_)TS~I01H|m;J}Y30Jv{45J<_gpH%+FR`TMK?> zV(#-*|Fjy%&^+U&N=plYZ<5Qnq+?6_vn7Lk!c+KOKtIO~sr_ro2hpz{tOS`W6DQ<>TEA7r8Q#X?uHYvb)`~14(E1 z)de1jKQU(a;Su=binwz%Bx zl)Ou5%S)oiQc!86Ij1mm8IG%oczv$2N%Omz$YZE)iRFf92qIXKZ!xUvv7{qZ6Ky({(zxRJ6+iW*C+PDKc7izB%v1gh7dVI{P^MjJbCVJ z)|8STsjVlsk?vM^KW~~FQ#EnJglsFsdWUv77WvG?3cw&(-5vuW^(KE79&sub5eY>O zYr~+oVoVo~SWilP2>cZnz2z{2wN-X5hn?A{Tp+k#g=IPH5q8Mv9w%-Kf@*f&t*iG6 zs-Q;Kn-0duX{yTAwQ&*ZB*+y_@KV*p6&fEEq-eX9`8Hh4pw;4N^hDX#ZOz(k{bq(W zSV`J%Va+)ocQp=;Gcb{K9@!WSy-{wD8yFCBFV80FxGj~FoJ}p7)U?7N8%-Ry_mOtZ zsv6>eWtzeR@g7l&S#o5u1GUoX_(OS9z#c4!c5+V$g7z&HIjb?CtzPs5wD(1*-j$fdv76$(M0CO1iUeWFCW2EMr=+s*P^{(!bxeV_%cj=-;hL7zXL z6PZ`NX$*Xn;Y1#q>-l7d^c1TSB03QL@w4-PVS4glGVJB!tE3J>ctNG?F}z z>gPBJ3Sx4pB8G^&^@=!ZmN46Q)eTc1>+PlTZDi<8Uu*w=m!d!`x4-7CuDe*AuxC+d zcs|G|={i8e1)g;p%$g7wne(-qs_P#t80;P|&7<~i!(+_bQ$wJ;dlZkVe)#_GG3!C+ z-U#x=)|?NXb=yJ@W>zu6q5DPD>*{AQXs9<6X-R8j=n~G@fj8(i4m>NiyO_HvTT(XR zAzruq&R(gjndtdtfD_#_P8|yW1vBv^X74K z7z0TYL?ZVS?)`a$5y-DMw+RO-;o98l8%uQI=xfW8j1v4wT{D_#$sgLG7T%I#AP!XV z)}-Nz*aVgDVHplT+Uf%R&X;w7GOk^zN?*m=^fi6(%_$=Nl8>Iju*Y&L$ z3K-WHpOI1;N)a&QATaF9qZW5MV`Gn%>;&GUiq-;CUiIa4!7j;ivntsB%m}kap;<6^ z3sV-1+3wiq8uwBNI6dGmm(Ql{PUb!sz@4VVGape8l2v5v)7JHqq`oL?eZqEHX`Ax# z#mLuu*%`@7QK528qlqtsXCYt3JGJTh6bn(Ju z#%>!+>-Lz*+G_)xx_a={*-;c%J_CQn-t98p@%{RYfex{5;0c3mJcxHI`vf0#dE(Z- z{uFc3m~i%+_{R6|8iO1S%S9abkF!X}_BkI(wjTa{4n8iIDDtpe9ZPly?Z%+xj=WOn zJ=jgu{>TC{zzgI7=`g6DBF;otb=lk$&U<#XNk`c;r2>5aAKbh2ng7k&^! zdn$IB-GsvNTC7afzZqlcUO3m{j?>u|{ne~6Dm&)ahJ%szBc>q$?pxhG?}6jJFIvwA z$9mPTsiw`Bz^U=>_LN|@XZ7x}g8s?Zd*Ss%wKU{oQax34@x9VC=ju-A6?jE#9}f~S zb2p~1@hj^ooy`F)qj|xJ`pLx8v|$Hb395=FB&y>S^8jf^@i7<2!-TL0?FjaKW} zEzW*V<~;kcp+Cjnt3KGLP1dlTD*7)%fM-@_TQ;aMyFA?-_y;^q+o|%#@Dw7DgeGZtT?PBJ+a$vHS;7*o)^Ls z9CB*=ZfGCueq2FUZa)x@j2(*B9sP@HGmY+9er=>tEcdQ)1NMnK+N{c)!doh`V}oh$ zpA{JSS7s{LV73=KO4YZIV=&^Vj8XkyzT+z35((RZV!h9weJywYKg=LBg?`Vtf8^1u z)>(=t$yU5KNLy2?Uy0R636Gv?_ND8p6bV})s@#Pn#=}#EQqip*_YN?iter=!cV<2Y zRuFhm&M>E4sd^ZsRa$^jRh>-x!(J|MW+|7YqT>@bouuTAc1emrM@S-wkc>}7B`{wC-oJ=Aqus{ zq@CBSUrJ6-tRKzx)8-hyhw+6&P$66NmrF z6UP3m8O-0!!5t(b-E!v?W4voWJJ2Ln$2(p_3X9cR6~ER~X!KTQ8bIJCj44OTSQfz$ z*+{-hHML5p&p<;M+dsquBI@^rV%N;{?GFG01G}%(611muuGCL;m1JL~^&gAylD!~A zFY;8+lQc%(xxEiG5~nVB;SAJ>=AoFRgHk*m^9QY*-irNrU#v=Tz}HC&h&^>Ov1{`X zJ_xl<c_PyW+XO^&Fb0A`#HvSY`lV-xBF zjfFs6_~b3#WFJ_t3`2k*cEFHeg6C8^&6?$I7{eIs_!^+}`A5{El8~}Iv}P=9CQ4aq zz+SvMQhWC&|Ni;Ahf^lN?9TDzhs#5M5CB420%omcRt~|&+iJ9wl+@4cM#gA0jB_VY zHYgUhh0=)x-&;M86!e}0Lq3-$Il@qrr5^XI1?fL2^{#ZzUJQ$A z7e~r_)N|5ZH)X^8Uipc#MK@8-r5945#SZBom&m*5iqnYe3cRoU>K9iJI5u;6%>1zW zy=myfdVU(dTmKA{pQ6}3Xdp{9yJ1!)s3_8>=y|sKKDA>MrC<*Z@Q)yT(2kBdZFa3D zzny9x^#mA-SSLOz0xmb#?T@TX4XjwJ3{)8AYk^61f(6CHr8Gh zPvy||LfMVXRnWY0m{p3(I0LyQ#wbDO6prc)W%Lzu%+ z-(0^G#tP}90IZv`zVxyRH6%ShGQ(KxyoykS_%+C0eo-22uR!YcbD4PeUeHhrywDWx z5ft<&)UIa+z5KliWu{1z%1AfmQbizNs-tklUH6%5#TwMImskx883f1Bgv3T=L75^G zt@N+Z^pBX>Nv-MBl%;@uMN(k+nNw;?_ye3;Kx5a7$tgs@A3!ba#Jb5{z^5&8NuCE} zaUI>#1yWHE^6#Kfw7Tl$v?VDt@|GOJz#!+EnXc!A%2^y4v0O^%eAF^hJCV(KrO!1H zMME< zCO>t$w!J*8G=C;uR9(sd0^7r{Q!#z)r%3RK`4u#(I6JO6_+U39GwK}wl35DgdqR^5 zM!|;Bz@rj5s~ctRxu28g_;3PQHO-<+6g4kNf9r4>Ffrwvu};VmD?cCF{bpEMm!TI% zLTExt5pp#R@3zWRWPU|ySxv1G&H?lXtH{!+lQNG<#)??VPFt>#MM73;1jmb0JgnK( zng<9Z3y|)`sZ6&HrBax@uVep~}az;bi?#V@YO? zQ|CllOt4ek`*-j$jJfMc;QcB6xRTV${XAh&tA{{HyDWsZeFyaA3HW&LBi%ihI?vM9z z{rG(~>V*5dvU~M)JiwKd=!}sl|2+NdI(9h zV{XENmN~n`#p9Y^%VjUSl}35hsjC|3P;$!@V^$S+O@$iWYe6nR5#Piz0>Rc_)PT4fB8(1Oh$!VVeI%I8%TETYNva%@{i`=1ZsbxcZbm(0hm&%BOwfbje)SsX2l}F+K8?xucab*}Eg9l; zqU`dRXfQj#sZb=Nr>KxUIz2zlyiLS@7$D@wLs&N85~-__{n2FBX7Tm|mM5hAnW7iR%b#zYKLpUseH(CJgQDEffoUI}(r-8WsE($xfX zG3*t6lUan%qryooO3w^hX2^AAC&Ng46~46x_N;@I5*oXr16i1kkJG<}jG&|zS*wRJ zOkc_Aoc4*f|HOF!N4*uV>mKu}LfqWw^b~L}m$iZ~uN~{V%Eb2|G0FK5Lg)zrG zp^ng@Ps)5PTb#W&WfWilyX3sg>UzCxvlN*tE?62t_u}yJOL{<;L3MJ4 z^;vnQ7?Y@X8yVB*$t{fO@tlst4I#q!YUf7f}+%mo-iEv%k+gH|wI zYH}XHJPFS{Q}fU3)t+&oZrd2{KtyF0XIT$0SCPfy9QPCoIa!KT4OJj5(K&NbAF~Sj zOgmhCw5kq}WLJ(7M!)^mdi8*lV=IW2r<`d>y`VuaN^dFmL>!!#!9|aktI139kr0SG z#&w(x&5N&g$V1+8=^w~+M|P#a+dZAJ6pya}U}dMm`)-bDr#44i9Qy1O7ym3`Eo+e( zcPveW#|Me_OezjRe-|*TT?OtP27$+j>3vYr zBEXGLWx*B@AkY+E5N7l7Kb_~tdq{RKda_|c6U!rf(TL?}#YLv{HVoXNkqh4+>Qydk z9o95Q0gueOF>)kDoDEGf6xHMCBvH`YlQFC<`9iIrw&XXTkGu z(9j=Ye|~H5#I?$pVPKH*mFlxvvv<|hD<8KX4oR)Im2__@UW~7G?EwZ|k)rxjs z21kazZruN!UrRkU-K9ues5CmuNl4Mvm1puPF1)Uw7ecYYz2!OUcFwC5=zf(+w6EXjE9z1Sf5nat8_6~a zCP895N(Ge$mua2#cX+PS(AHHHoKb6a|EbEQR-yH#s;N8czf2uai)5OE$}G%T1@++VtupS`rM$jIQ@e?(qrM?C$<8{S%oxH;?8g1h0OGPDZr2mF@`fb!idMUL>k0xPR1p$XE?9^4UCUc$C4!nO6Wvmvv?58#b< zTq%>+@@!QR^%riS3jS1@y;?Tcu1#rstzVS+KzTE`6<){7aX=nC)6bZ@?#uxqXHKnR zIsX_SV8yK!Tb_XZUFRyCK|(5;<1%Mf`!?a-RCssxfZc32db&sAfhm+_VbtoWY}*Ax zOGa9FguOu$=CQvALp%A#azhP!S^sMu+2BmT*HYl+cQm01=EJ@?$oVliuW<5eAiUxc zskiwt=awQ9b_+zd+1%+_9k!+~CpW6H!n&j=$A?)uwzYrU_KhCYyiTdq{}Nyc?OZu9 z^Up7?MS3ROk@BhM00)ER$PZtUj!U^E&87Ia`ff?ohbfuh14#A^Grao{B+ONlEw-_9sHMendDlV# z{6m{`WmP90>B8gRs~)FcAf_R&4sMV`=BusBoSOSNlhi_Y=q*%Yv}$*+CN+h3U|1KD z$<6164QtXQS{lfT>o1jy_%OEu)G)_r8~F` zg-kUY3YEq;pXxnV<2lT@J(E}-qmpV#D=H5R%+Zz)@vkeVQfN505o0dOd3{8x0|&FP zI@kwo9eXvuT~6iA|IBkePH}jxwq#O!C;cD7bEOFtx~X4!+32@o4R7aNN8cgdpY#P) z36YdX46IgS&7yuDF*q~$&xLki+yeM)s*A~ocWodYXQk)H0k>6vZ%5TlV-5;7nJlM5 zv*j$#t3|Xz26^LCPDxREzbENQk-Ami{Fo3$(5LP$ey2%z!wyF)w(ZuqI#uK(#|^SA zWj73q`YvM#2NB;0(p?WE*=BhjS2XnW`&14o_qil?hb{Y+UTxz4eq^H0ZI}8}s~Ys) zMQ2=*FnU<)PQY{J_)boBlcr2S5cM%SqAC~F1E_vi*eEF|++AZ_uTnCo$Wylwx6to$ z7`7}>S={>kV1665ND^S2@SX?!;pU3nhC}ocQ)9fY78zEev+U8R zb}7bdraV9lOsNucnJ-Df2$63#ld}m{-PTiHwN`^+0O!%Ka9zx~P57tIa{;_oc17R3 z0&m`_yq%%f?cs6_1Mpo!8NY@E`9OvhG5&dui{TC&)j7 z87Pl`0JLvN@k0YM;Hpfmp)l;Q^l~P#8l??9w>!Tr+3HRFdV%EI;BYym1WYInJ#54}2giG~|?p+9_}tw!ah;UT_ocAjw<_$V`; zavv_xT37wvTF8Ky!2jfX<#~_L?1<5J%r&R*R2gI8x)Hpu$~FR?AJWH zpR!ebrxi@2dN4}DcGx^2ooxtl1VM+MSUy&%(Msz zLd<2uMOv0IzNfx9e{<#)-{(tQ!9hGGpk{H(s9__dSHoXF?8*jerHDL(96b){^~L8 zb5cKjHb65T#WQHtaOo$B#UNlSJ+yVp!aOMb3mH`i4TAP^uieid?m%2%od@w?72qu< zSR_F1o6^6_<(3{kcOFGJ?y8FFNunNjBg^H_Rnvz>2jQWE6R7cMWX0?2m8fDq5|WC* zN5B!NEby#8=fEB7$wC9aL{6W}izcoUucxT;%s&vhL)$2UshDQmX=_r}i3K#ndhc8rK@6sQKmP$|`niU0Q zsH90Co(EIh<@R~hA4YVoaMOs3@3`*aDRr7|%HN+~M~lvLD4sYZk}< zjc!}0Xv9*J?+LAqev&rP`oW`OfiFtK^}DUT8gXwrzC|YGXIbA+uM=eNEet-yYz5a! z7xgST_iebtpwtu zulh32s|u@jZa+pzgqNIN#;9yRGP~3*=$E+YEBa0xJqS?;i;($0ON~B=!}cHrAl(6% zkF1tYnxoGLS3$alGE=K+MzcEGWcZNW=mRQd@>W z<2Ei#eBlsIuX5Q3-Kp(nhKqN+r_(bYk-2(ZX?3eTr%**de76Tzv&rC{`PWUbaD#?O z`=%18DH%L1%gP^m?+(Y*Zj%l8t_2yl>$oMh>Ps}`yp^b{H`r>-Z6;7m1Pd0I()#hn z>L|Gi#CV?2*@qLRO&VTl)^n8a-N2hCDJRuWWde^Lqr^E`4zw_8oGxw`-4!tFPw#|T zBkl1$shgne$wAaYJ}G4K5;lnAOa|6|nfi;OF9AOW!U`rw2d_sZ{h}`?x62a*rL%u* zkK0NK(5BWADKs5e6_3};t~Id3D*6i?A2IROD$EjGTGISwlc~h3#N-50!d5ZsiOXM2 zC|u3!Mqh-}H>{*5*{`D_s4Sq8H`ZfBgYU;r5iwiYRr(XzS7L;~c~uFK@VH(tQ)pbi zq=Qr4xJ5k`)o;^3YgLWBCOxkYz4+b4majSbO)u$qvQ9eE053QuKk&v1}{=rw(Q&^9xGA5n6|VLEYCT#ttPfXy*0ZE2+KRhkMb2 z0}l+{dW^WCRM{SsD*JQWVNuB_=4SOt+HX8-9LhNWpUM+Jy7DTyRet_`YTkb2c#mj^ z65f%{N6bHqMMP+|I;@I(6j?c74BS^&*aVl>p1l@FIVn$7Cc)a-9pfMO3~O>=Z$LSg zg0D#@;jhz*n#9g>!q6)sDSClOIe1qX)ZCsO4&M;y|I$tgdZ$dj)X)rnN8cfbIGsv4 zQxw4h&KHy1bx%j_^ezph6xwR4c9|GBF~3K=P-t>RtLY{WICbpq*;luSgSZtb7-L#* zjOZSHHB~afOSCy{yvBhR3?JLuLGVfp=+t;H78$aEZH@G3I-+t##XD9hD^RpB0T=99 zV+jtN+47WX&OrvsP381aS*%98yp&+h=e=ywdrPr+cDLr>P2!4G!NU@M2@FYCCcDon z^X72w^TMPmG@{)MJu#R0a$*9^hin&JgKuu9eHiY$Mo(W>Q!h%tu3Ykz7D~WuP^z+r z*vs{_t5x{jQc2DL=s7&aTYpo1No#)mEl=btwxm+8P-!Zm5oR4)wtW>ioB5%>?tR{c zPXZUwSTBbL?8kFRLkpanJBrdWXSi=+-!+2M18+A>idXn;`EGRAgv8q5`R1?tbQ;dH zulBk1`oZm<2OXydm)e{B3@y0=J-QpWl)aT8ddd&`%fNl>-=AV;|4G5U{vA#Evm2iC zjY0g^R&ScQ*_W%mc#Db^B(<&C(D~$jO~CBvd16^&C-S^^T6I6Z`m06D|BfI+EgQZ5 z*1XRKjM@IvYRJ1MdqpUO#*_7-#vnPt8$!fE8pX`u^vbXs-%}(RStq{z*a$$rUX068^gA(@4 zI2e~~GCRza<8bkJvtOd1`K%F?3u=Tbvvqo$YTQ6RAv|A&+H5t7mpcVBgG+F#B z+^zgex!jMdmr?92ed>3(&s{L5GOz&k>rq_Jyujqy>))R7E+fAjGl@NUcn)uJax!QI zX>zdLgT18kM$YZmaW&tC=NPxfFk|@u5zTv$y4r zD_Y!MCZzpdh0^eLJqSgL-=y$LDQtO4Z@kc@8mrKjet*fgC*c79Vz>IIxB3#jYm`vz zNb;uffAi&ww!O4^c#c4%WE^4>4z!?cRwJng^)r&BqP+Z0W#(4gc{-ixV8wQ8-3DTa zK#EnKe~0NoGlKNWk0zC6E$Bjx#JlQCNV!(*VToNeqTvxfi?24>vio=ig>;b{pMIcG zbL$l4x-7Z6;}7xGtX9=%wB=KpQwOj%PG^Y23p5j1dvQpQR;h1YqSHTqm?o;99nQsk z7A+A0G!sMEa%6gc8}0o1nzg=x@$CAxXP;Fq8@;0{W5~;E($9jV7va|WZ)MHIV!8*^2G&xu$6rf~ZN$d+r@}Z$_ zMIdK}E~l-0q(y!Ihe%)_QegYdB^~K|IqT+An$gXpSLe?rK3#j>ypC+WqQ%~N3~WHv zZ7evLUkQgIMBd(=<2fq{h05Dn-F*H{?rI2iWX}ibk-#dBS-nOX0bzpZ(syjTvX2@y zkN!J&Nq6w!Bvu&zJ{U` zfKzk~5-U#Sr-5j~7$L1`(kVosj2c;s2WASTnX|M`{Tv_#wGjL#xX0|^xcyV##dRm& zoFLPV4{GL>tYcltycDiZYGBk~|KPBYc&}#b^1n{z4B*a#X-#DZBmSPcx8zZeb8wEG zerXGeyRyVGycIXh%AnrbdYTd1k!0qux$k0nN1Kna%`dA)?rbDyUpZm*6mZ(2aUs!d z^r5*&ZwbSNk&`FMVP6Dr6SWCg*CbY?ETCm_W0Tc$(#RFBG_GlckYv|mW=dnsK%dK) z$oCg~@_lLn3jSe^@reS#rCFf;9{ZpX?YrK*%#l?<+dbg5(hG_^&kyarS;y&9*B#P5 zqQXvSel9Qx3x_l;5x&RnLc@g>{&A;2ng&aue0!|gcJNoc$?zP`v`lbON#0v-wiWaY znc7!a_mpaT4DW3YUCvD87ks>xJ92-A>koDMj8THcqMqwfZOTLmRxDw?Q9DIJz3Es_ z&Y@G3D>44wU$mvBIec6Qsvu=i19U1`MTo$5+4qweSpVJTs~PA|xdqwaK8Ub>$j=~p z2u^3woEbx@m)g+%fY?tTL+>37I7}Yy@5g=kc)Bx{^E@dg$0zZ!7h`}!U6fTHF*q;| zhIurbARn+p!9t_fTU+IuyIRgynb@ZuLOz-TRv{?1JTi6ViKUl3?*gyL_;LFhKtA6G zvN;l#i(9`eeOB4GPLo^Fh$8)q+b(~3u3ChWk`w+oC+b77O-!VB{(?-RqY-%c?X(Rs z+uIt2*wi_`T(cU~R6jq^)9e7=Phd~07GK^(U%g%LF7~#VTyO0?XW-EOlHwi)mDWgO z$I2FcW-?xOMtVK=3fo(Qt9l@(zhQ%QrT&DrzIk%%{qurUY@nF?I zuGX6;?Y%H0i`jFXz(N^R$!^ z8s`t~x(XB^H#kQyFgP{m2b4W)FiL2ItoP+6{E?_QQ$#K~B|JSsa=dRsKWlQtcPYfG zG^^zvkF;iMxp`_?x3F8C&q}Wl3Tx}c6JaR}Cb6N*!mVlNGIDH6_apn#IhWBd3kQ=o z7B&Rg)-k!@7!F8hU;2SgIqzz;}s8ufF8+WW?N_}4hQrqq0E;UrVo$cFu zv6LGYM{PJ_btoO&FCit8#*57e#q5R4s8%MOO8Qn>vHYe&(}PcrF;i&$=iQOG96*VRG-103RDTE6I^swmhVg&)7 zdOj7<9lQ^ke{m+d0pJ3fK1RCGjNmb$`Kxv}p8ipmtzlfdHia(}B)&U%` zL=+MHPE#$vipO8)kzJ#l9w0X|?CNnIy(b^05iGp%qA`7)+)#v_kz`*DOM1{|A?W*m z3ba|AmnJ*LCNAVIc;mR5NX&}gcP2Ub$nEvsy*I6mWU#&B@W!X*xdKi!$APW=_!~#j zUc2bz1T($TS~%d;-mkqx4JLoAQ(QaMA~ZSg_83@AH60Ualt$Mf*P*8yPDXDgjpaBk z;GPQ%3w`W2*0ezp_F+f}|FYYU8d|hcw>+A$io;z*C^mi_=;OzCjK0K4m1$mF9F(JB zj=^~^8=`;M&!VnP>%oNzaykQ6=q?H)xlhc{I9d2%lZLmFqX%D>mx@kgN@a{b?@ADfO7*OX4fGUb zv1v{-%S2T8suU_BgjwFn?JW`0@XO?!t(t|!t0wJCcQ+_(s*#p+qA!{Qsk~=A*R?im zX>1wGcG`<57FDRiD#e|;<6Ab!zISKfGn@3Kul`f7+2CyBNAw|ykIkg&f*UI_UFq0( zYBp+3!9JBJ)#lnD&0MD>2-7>lg?u6}C8X}TB{i-R2uv75r^>Agb z3MI~d{6{nwj=K91;tV$@8P2_YGyTEcoN;CU8 zXUTt_Kb?shGC%+3UqAotb9Wyb#ZkwN>NQ?y1ZT^(bKe-$EvwfbVLfGY3?>f0pE%r) zo(0hV=%J_KVl-;u=dZY#(GuOZ;D&M(4L-;D$OXUZ6-7>5RIshTG^G?@nmP#_O$(V~ z`=br8JFlfv)F1)avV<6G;V2yUhK&FChYA`7VF|s6YEo(Urr@VhDl)A?{WmR`di2x0 zXyG@rIAPXkEBYF>^FP$*ba$Vq-Uy;_Tfo;pRV@*pq|t}ileP^g9oXQ^KZ%p5wrVq9 z9ld=LCiS#4-;`J%ok*?8_eFFOz0P62J&$TTKsffV@crk1DsZjeHp)1U#y?EAxUsRn zWEX5~E6NQirZRJ6UGFMM*>U_wufTq3(ro_yr8gPpv8Mcjr!%DV$mO~ek&(R(yFfdT z?uaC>&=rZ-oT9k)aHfartD|@R%ege`(8|x`vVN1;oc51b&Jhy3T<4xMX*NzoCAsCd zRN^f&xJI?*ej5)VHxtKTe0l#IPO05#HBKbQJbD_OuvqsClecdi`t@77s5FosDm|iI zr-O6XZNY&Tzy5Y3-RwrEPnx?$z_iNt@z=}qlA*4wz2#!PXZSI48yW%BR^&gas2C{8 zhEw}d^X16uvaq?W6Op<3eK=FW(XBy?R zeBI-7!sOW4STd~-0gfU>(fQ=y&1ph48Y|!##KBDJKb8P^lA$grVBlBb74*AUme*4_ zW97Ea83iB^->X2l=o>?D7kt_W7*-AbIeQt;M!(@Y zhvYg%)`kT0%ZbiX^I>FVheE1_KOGl3_Z zRbChB51DLhR6G>7e&U2f?hwxoS<)`4gMA;-*43D zfQgTzI-~YO6m-O&w|#v{T4;`v^GuF|7w^EVdgaJWP7fM!pL5jeVeE`7urcuQ0Esj0 zi&NP)G}Dt55N~ZT;?f+nUSn3}y5Nj7C;O$zIT9o@$s2R&e8c`AHR1kUe%!^q;919l0=6re~5LeENec#sB-Vb1A3l}H)04z~% zyC$y8RbH{<=`fMLDXbB#dPou9c!+(uqBC#x^&Fgw0^Pnjo<_?zWmy!k_dq#fg^)Cf zJzu!LrbJ|qds((b;&Ef{Y>neDsIqvp`(M#|v=CcTO3q3UM_-BR}BqtVsCVU{;1CYJn!I@)-z!sS|w*bxQyPz#qq+6=B_ zno}vIzX8l`<*sSzuk=P1l}w=O5HSiP`E-YMM|_ot_uQcA8G0|9#kf8p6&ZaD!jWv5 z_0AU9K_GEopBf+h;KozQ{c22_NeBa=gmfi&RFKyVfc3W1}nbp;)t8x0}A8t9D6Z;`q7wS0k zYa!KQgalQq{M^daQ)emwm)?_6ked`6i5z-@>~3|37L^)WSVRCZx`jVr2&gL)IPW#& zdNQ3*y4%F^PiFgdrhlFgwOyAILhOmjVRi3QL`~qX@o9I#Wlj0Qpt}$lf?|HAFd%(?l=Py7w=SKXD zfMO2Hj=aImUWMs|h5a_*)|7TmwMk{CxU~<*yIoUWNvcbDZ-u6;4%x?_A0eI)&MtGQ zF=_i9%~oa4-p7Po#z`X=+4$fzv&2=spPQnJGXeK)F=q!j9%tMRc&qJ;1h zGm7gcn*6NvE#_UPZsXp=Y!hNe@dc~Yngfvc^l^-SQOV!qQuEKatksn6x-K<4sSX~u z>Tsz58wHV`_ybQiVS0PA`<)hU_MT|0S-wwW{mo13MMj~v;RL|2etAv#os+>&n%;iC zwAtoLH<}+X*%)1gpse`Vr_|%*Q?=^!F-}H`_-a~u3fwA()gQRoLpUc#Rqwn#mghtp zeyy)jtm>jDE^^yJBO~iLgMo}X2p8W%8xY;9oM+s&DyMQMd>}lh4;e!A+#Q2a?$J=RZ3BARc5DzfYAWOU)Vip+CH;*vp5jK-t|=mlKV_^316j6$yQfy&H&(?R8eRA*ue=;1}B)L_uNKaAPf7VoO8_{tE^Z{UvOy@kr za}!{iG-9$1P6!KQIG7u9zIOlpRdi;${Y@#N58|9cY5F&@Gs5P;(M z>I`y&c_KK8fhKL7S$8x{N_=a1gO$p|9*b$bL_I~CT$n&?{Je0a3L7c~E0@qRsLTHI z3BUgP6F$;{PmTRQ?7ewd()s@=>P(p}rj?bJsnb~5;*wceF3@C?O^a4)?qZr+Dw3Mw z29%agxwV)&nUZ5=Zn%qxLT1XODK)96$dZPX2)KkG>-}J()A^n6ea<<5-1FS$+{+(5 zMSMQ*_xtsJ?JG&m=JqXj8d^YI9unCy79@FUvb@EFUnEey>^6zLkgsj=Hv`FpB+o@m4ZLf@h*oaT%p0e%e zbILa!d9E)OQk*i*i3KU+2V(dZW%Cr^7fw+yme}-9v z{zN&mJ1!u*>zO;I9{`R4xLCP`>xjicwQ)^MEb$}WZAcd%uXE{EShIbY8^8FLyYWhW z3cg}=6_7LKgqRp zx14J>FXJ7rZduWClHr?O7wyrVJ|_=ssDLcfuCV%PbH8~DVs zTPwo?eK}GPXg^B98xm!?05UDzK9o}mS+%~GY55*}Z#LllP$95YMosgIu+S4uw(I(m zFLZ)NMo3^UawQ~$u~*cs11_A&`Fojvq5K|qRRM7_4Z;;AQ%Mptm|~Y9R%^6~>rZ{& zfDugrz68bIpgkn*!-}cdfR%k{b5OB9x?kQZ^qdy!T|x0?w>}`H_~=XJ8bJF4@jwVD zD8h68=<64ab{P=t^zF^R;o=nr+h``R&mQ}G=*nTs9yLyBW>arstw}wZ#f5w+DzAZV zLD!~xJfC0y%^qf-DQ~t?R*l#ROu64w7wvprVAPp6<3t|#FitL&2j2!Nz#NfYv z=hjc3l^hsSo`BRF@l5ZBFrC%Ptsl9waA{Y}5+U5=Dp!on$`38o&2E1PIzY+w$n~ta zx842~`DbYFXIEct9o#sC_4*?{!Hesw=y0s1&3b#1vfD(u&Sz6pjrRpwoF-75u4q^gMwXW7FOiU2-1z`hms zW$H~0R1fl58dPuAHXtqr3iagUj1ms~sSHO=Ijv{l&e|j^?z31UN|@)vYZkLu;xJ4K z`r^hs^QSk@t(`?QMWEb|QmG8SINq z_>>jG&8VAi#(mvn(OG0`KN*tbxaren{u*_He^sp7L|oreQuM(JL|Tm#5xKXl^~OG#RjGVciyeG?svelBY6Yn1+c}j<_rjXfxIoMH>AD}% zy?hQ40&s_T4VBVJEiJITH_k)SbnsIKnmKpsMZ=8HV1me;Tct`APtAP{YUIXB90y${ z^CA+x6(a7y6I{8Du_YIY^KHp zK8^LQEI$=!DzY~zws{j`rat1hCpW=(Ey~|O0d4trDVuyCn7C~VhW=^p3&Ao7ReyL z0VPgyyT^p6OK3)#uNflYg5KLJZ0OLG0O*oejJOgkb5|Y}$G&PIO}OMu3<;L3YH)=H zB)rZv!z+42QmGDyP3Osd`C{5MFkoPnuTL{mU1f*IC3*Gy?aoi__zWbvY#X%4M)P&_ zEJk(aA5$6lZX%-D_5E`@UFUYXefuxwmqo|Me@>D4AL>vg3RJvM%db0*p@uYH;+_W8 znLIL)7PQwZ3_Y$0U4w{l3H1_UGdn8}Ie(iCube*`P_N z{g&KMddqA!YMFo75=yFV+`2T-yzxu-1TV0`rx|Ztv%E36G;;iLDa6*r(M9;>128pb zqXC^4H$LZC%+MA~K#nVrKjdzo_Y$h8u(vJ4IsKpZ#WQ!HZ@Wu1j=H|=*FPr;vpFMS zwYxV?#r62Plv~2vX*62f_&gTu-MM&rSf<)CVwb?X+TFy8GT)u=P=?MYhwUO&-)x6X zz{CQMpA+w9MRXe`Q@fXt%Y>gRKL~G++f)gzhZ6gmconGuGX?F_Ra$dlPN5gNj#2c8{Hi>S8JD@*)VI$x!R!qbLIw6kEzIeeQLYkQ3jsYX^+<33egO>X+nJrZZ~rjYm4O-k&GS=-cNN zhP6Gb57=6lGOT?V9_zaZ;)k;t1AW0KC-a8Fbs1CEd*w|Ed{nguv=kS5u;lR9+pS?| zD;zKHSxQX}@VA_$J$EyUADU;^F@ffP<)55f_0l+f1+q)npMAp@XIE!~iIuPqzMfdE zn|Hp|zckZI-P_pumoeX1Ly-xoeiwYBW<7fONhfZmCNe~3eZ`53rC`*N{!eWEpnJ?? z=<7Lw)Di(qm5BF6f_eM4L8AKCC{M}U{`)UHXCU4dc;)n@Cs$;$gdu1e$hyG_bV7LR z_u1^$Iis3sa$B#p#J8q0L0gI`)2lB*?i19q`~|8+{~^cWnIowIIQ{PM*H7>ocR2M! zw|ZDJHb)inAavaI&-Fe#*9yZexrQr$#TY-t+$Zuj0f6`^{&Hk1th8BcVyv?(97>|B z@Zn5f4wV!MmJ*AGz&?|nrO}rx8STw(dKoqJEc=rw^0Mja+%K;)E-K%CU3-Cao&m$L z5WSK0{?~ArS8w|3UxS;WxU&}LKmqn)GkQdpK&OUBM^kle*h2;tMk2jF)u= zg1@>DD$yfSNAE_;NC&6IiHvI!8e9t6D>8v|4x-z`QX(U_r1k|9XY-4m*de|V{p9`j zpWwTJzt`^HEuw`08ED3^a|Ro{4J?OO9@cIzjkD*68HF1@?aoeNVkHh#Zhb(ReCu*( z|6n$($$o3*-v&~R4B|A9Pq*@;ZiuITpO>njP$oM^&hx&D+G&71I1hX?`+rd%h^GRd z7@q~q0vL|+i$g~L{}=O=_CEs;#%{Vt`JHZnQcczcu!C`?yn|(aYb(k0Kiy2VwGY9R z0BzjzFF+lEGB$u|)p}gRV0rGQ1_nL_A(Qx+Ps3$FIMeJYE1RJ|-7uEz!J8_Ttng~^ z!jt*iL=~?Z@gt^>HlNPEIOcRS&S(`fr`?J|Mpoz_CfBMXy99?{4abIW?1~!YUq4gr zqoH7@XmgBF808kmj239_!BXN1fT2dSLr8z95mWn~H+q^`Q#3cW2iNYpP-ggcX5z=v z2p+sWu*I}LGhb5c39v!KXpxWG3>+W&cOnC6SA*_Gnraw)y+k;yMbD;g)cac{~7j+yryi1-8uafVad--Al?$q<; zmmh>RZZM6}vRA;!LHu$~txZ-R$KQpKwnOBZlpXyh?8y$q>z{iJA3Bo>} ze*q3gE{PU&9jM^I*+e~IX+knQ&#(42y6}devP%sOA;=2Z4 ztZJkex&)nBOFg6XZ0!XvUOz}gTju6;6y37x#^pVa2X6(Ib%fWR!876B+~ue1(Iw#H zfjNPqmeQ>O(>e1r1|M8o&d zA@V<_Lnj|DcZxT;9|EFh5zem@)XsEWMuOrvM*T4_%4-RBEL&k+XGf(wZ^qh7KFO9m zd56898_%AxK3m|ayokbm06re>lZCR-#wj*6J$JD`9O8r98FGfU1C_CTIusJ;4db zkH3YTZSk*z$#&mH>Mo-YixUzi^I}0bG7QsvAUVZ`L9>n|VcD1*W%N2 z32E}f%CYLqH?RMZ8P__Qa53H%U+SGC$QU^8nc6p-I~G?w5z(g+<`-+J6Pg@M%YTz3 zAZ=d$z)INu)9w)KG44?49hY2`3*8NW#&D^wcEZDt-nH^lx9I*S&Bb2DCH`i8g?=CG zh6XcQkQe$awj3b-fETkK@u*M?B;Zi4o|mGj8Hr@E%Vwn0Tuoc_Fx%1<`FZpQGFBrn z>B`41FU9F`pd}oOFEjVzfySaLDvysY2%lngo5`tS=M!f}}Lhug|Pmd^l&+eSPZTWIv-78%NK*o_aBo!@LDzJg_lPZp!EWf9G5;C}UfrL!3No*}GJjp9 z9^*s?tEt*h=-YC7SfZ22D0ZsF8nXFa*c~Y8%DzJ^o^|fj8Tdi zs!6lE8NT(iFYw|EoHqP*ydbB&Y24pQfFH~f9;5#!`mxQ%U^wd+1NbuA2xju4KtQ!$OeTXw%YaW+St(XM{eG}2Mz2nWaKp@QDpO_H8pUi<_|$A%scL&yqeNotGszNf?D=^J=2_rqbb?XDe}%n!&)x zlrcHMd9Q0jUKzSE=ta2`>g9_mBeBkIPA`nEOZmwaD50EYGA$^`KbsE|&T%aF6HZGi zB^XD(4Y5{p2)=3EhhwAb~M%l)a?1TdhIX=JPz*9q4#9*!HMT z(55z3SLmM@-ETM8<2o`gF%Sjh?BrcwfOd67Wl zmpPcr+y8Vkj>da%kIj>>&mxqT5`&m;NJQHmv9*KiIX!DTm9JJYJGDTVKqk?={k2zj z0s7s5X;^+oFotQw8#w1;JM-Jw%!2v<3+wIIQU z0d_D?2>BfUE;Q|d0mp`USc2SDKCg8*|BJYelX!$Cw8bK-)@Mg_fa#sSF^rqpsGypq z?eH1sr4R7Y8w*G8*$$W#<8*Et9eSNg!{x1tj%4|p+-dh43V)gUt8mCO^^iPh$G4ev zJx3M}^&c3B`$i7_Om%Q_F`z!`wNQ@;Ckuu|8h~h?EnqP-Mk3TXe)U7^^MKy~d?Q2s zH>VrHY>z>tB0gHXE2?@h2X;qLvvxCl=nlt;UaM~XT#Ik%P;cSkMI4a7%;1(X&Qt^C z2kmh#NTPSj_#ga^dJnz+Co>7jW3J>fTykDib?B|BHV)bVg_*xxrrUx#X@!`SL{Hs< zB@jeoa4^Ietlbs&^v5^7^%EI%`Lr}+1iE)XL)yU`;LhURpr!IAVc3$f+2-h0ApyCm z2BRT-+W+%XVpm_28@Fv_-|OKXY#+Qd|6Zwp3aEQP+v?yn%W~MJzYkL2+S2T;uzFLx z`2>UH^-!~y+zoS8OipwPPQ4}G_fVLR8c;z>=uiI3@BRymQN3Rha{D^a-^&JD)W|Ma zG4u=n;4xlCk!k7-U;&o}kng>}UH>@^eBxp8(5CI!gSV#x72QZ(3RS5mW;sawIl>CX z5!r9tc}bGFVF7b?B{JZ2svbv5$Gd!%bZgST3|s8naN;>eunhmlbe#Q_Yp)ab>}EWot2w~t?~ zP|vg;z1+L2E2k`aQinsDcDAPZB2K_%Lr_f{;<;9SliPu@HE0D>`g~dKn*%zB<>vp~ z#eydC_m@OS%oFFTl}b=}E$(M2u{lPWpRA(tWb2~y%FL|b8#lWAFEg6=MZP?IdqKng zIgt@e`aEwv+E=+j@8I$H{9^haO#nanwfeIc!yRBXftK0br3!-2AG2l!g87?bFW4`D zV)VO1__pxpnG39?C}4;f(?8Fb3%nO@ioHQENW*c%gks z^L~NvaN1=Ozv`+{N@I{V@J##2R?>=9NP}O2x&z=7v~aj*Y~b!q=`v<1K$Vqu%o2Xi z7L?JS;eB>wTKE`K+5;5@G{6Qu*l7pwG9!NPb=Wy$N(y`~tpBz*3CMc|6o6$Mvs3}C z$*rQHbv96o{p~dyo?4Qs00ULcM`b;Bh^y zQ-4e&60tr))-&v;L_GwE74)aRg2^t*wz`iqtOivpK3OBx`e76Qb?+;Xr(llsFZdkw zS3_F?`DojL8`_R@H%jaZbjvxk+bZOoF;HOvlMIx{AMIvc+|oTeD#|X4Ss!6__VoA{ zLjx)A$Ic#)z#+0~&O<0eBH+I@3vw?P+Fyh<33UBWRziexy;~8xFerwVCG`Yx$>C~X z)P-w>T=N%Ru0Yp%UKlA0f_?*HMzJeO;oF6(k4U{Ml8xd*ziCJf3jkav^|?#&p_xIn# zC$wSJyAQ%Sew!+ZCsO@zUZ<%m5Eo{su^2rD;O(b}!Yhm<j$@(W-=?OQt3VjT@+99?h}V1{z8RC{UXbx0{) zw?BUHiybI&>(}?#GB6107{o%^`Qhv^2^aBFMh4|sJz1>$fIQ)6mUJ@nDJLF zBAdt`_huX*5@xM4CZ*p@MfJsv#wIebsc>-PZo(Yxo4UQ?_RA~PL+jz3F$`nhTQBXh zzUKp3)`^yRXN%RrT_IHO%DjCiD!QUu2ZEypT&TOreFpW0@N>p$Ky%3f!yqFH#JEkW zTj&)gi(oypw;>LTq6JhALr+mNr*6ryJ6li=7R(91XlhZ>Q&2Y|6nwK1uULLI6IzL} z2Hay2Tt3NiQd&bUZZT|;me(aQJ_^XXVreM)mms7>9?8m#l`C)3X3+!%+DbA^36tq$ zZHAP`PGzzE+%w;|!qm5Demu45TDH(NAYgg@m8IyYsy^3(GKipM*9FNWM!n=h#Z<#M zKk?~rts$pSZihOTL`zLw0cy~!?ObEBEOiOz!JbN+kvUd}D}}Ko+SV+)tZil}o&OF# zCtU}W6G7y2nqO9Z{6N9}5K_Z^P5v$5weSQo(t!&kr;8O zfl#Wv&s@_5kBpNVk&moejUbBY)chJB^Q$NI11oy zIjzJTykDfZS#bivbzK*-|7k7KZnWzmJFSAD4TLBR=DzL6cyT{ViTq})b^lxoyzHGY z&!G7OF6iurLkBY5Y0g_uNeIUpoyszs(xDBBZ|t-9Ja<^9f0$NlFykC9pSi2jig(Z* zrVG*=;;;Ig9BrfVO?iu+5P$02lNp2T6KatxpUKS0u+MYs35i*zwQ1&WJ{wYdb9Za5 zMyicjUVum*-e9}-<%<%YV*thrrpSFDRn~t>&B;m;bN$T%N3i-8V5#ir8?Z0B=-u?& ztWEhZ)tIMW6Uo4@RAQPJsO7&iBGq~O%UAOcZAl;nwG>rVCLEJR#lGe6=)d|kbKzNG z40F%^+oPwcEf4Bz?ZTh#CCIFu?G3bBJgGA4@HT6=NKVck*zD9@c8)IN1zf7ZU#^#c zG%P?l^vT2Itb43qR~JcMW8qE-r5;? zldTjIFZVC7l>8kclNQ_9Vm|%FPXRk)cAMOBi9J0XrcHmo_UAr;$m;0^yOdN`Nk_-O zh{w7cb(~Aab_0gzzB2X;YS`7jO7)^g(AQJ!*K;PWQ#yC*7mgU;xO zZlF4OY#SOqrV~d&JhADigejfnD&GY$wWS2#65q6`2mmtkT3hZj0eNu zg)P_mY%$PJk=FYk=AZo$g z2YIkmj#YVCXP$L7++&oC12s!#yAk1$T1ku>Q|XTw2TubzDX&_gJM$*MmWuK~>gtO~ z%Ox{iU`1LP=N+<$Pm^{Yrp%nORnVtTh9xYSIi=b#HS|s-8CPD)%Rd&4t8J}(GNMMr z087GN1>Moi*evaMIk6@zo1bCAXJkW@I@&Tm*6j zsKJwn$q!wVNtQN5Uejwb;Oi60zD2ikQx-2{pXiK|by_~apVkVfD7w#?#eA?I9~*bQ zF?1w$W+*8Uds4K87F3tM3r86fh6 zUwbOIua#zuqn;$x6)@q>k|ktR8YgcAq;F{(tz7h_=y^XsE1(11JFhf8E?hj1k*Hhs z!je{x-EX&?C1_%4kmtzVXHO+ZR@182MTXR)H$mRzL!3%0PAmM`=sqp!n3#_bs*6*D z8mjZ(!k#F+<_MXDsqLLs0xap59Q-f`OckhgKu*~jDKGSp-2&(FK0c|-xZ#mHsj3ZlrdKH#wB6p<{H1XENK`-h9%(U^qx|}s}$8UEWgnb$}f z?5mKR=~1p2Tbo%h#bUcweu4g(|5oHFd`3|^!d3pI$((i4?7|TNS0>jPmQeFXn!@>g z-Q16jpCr^{)=LCNOVQm2HTa=={R`nj%mm zy10iRQ+|pEy2Pin3vdo^D<97wy&uWgoqKRotT9*Yy_MH2MqwvGp7X~wTR1Kdi3~vM zub(I=ajvp`rc~He4wWtdeJL^RyuMxwDrF)%h}S-$)2)if&1X0717m*WDLAlq@x(lHJTRB>9E#s7OdNu7w9wCGMNB zcDZ~&=sN{0z#CO^!t0y9f6BGJ8{nA$19XZ;UO#F_Et4~uV}_c_3+wYl0KYP!4rkLCK8`DUO67b`10UdMI>s7UR1|`$Gl~e0*Q5CR zBJs0bf|Iil12T1DR36=1dqu#YAZd!1(xw@-PLq#!%B-%yzT3=Feldw0L_rM(A{>!& z-1L+`RXN~iR#yg$D&u)|p@2b;FmR61;QM*O8oFpU13m_EgV6xaB<%Rj)D)G=+NLfL z(#y-9{Tk(dhddZLE1xIBrP&`N2VoZFKSWnNutxH}H_ z5aw3T5?2xOE_xwQSXo``Yc3%FCpgEUA-3ko-0o zb6+(eWFiFm+TMD;k$d*#_`lD+#EJboyVgutAwGo_R~||^Epgd<_-w($D~heG%mY`D zx8+7;6m!m|NpWoMk{xtg=PN1o7k)IM1pP$~A@8h&Lk(Wh_if?n&P&^zMMboBIg;Za z(B&Tt!;~5N!!S1>%R{8Rz(_z?aqB$2hq>*zD36u-HeAH-7#ia z3WRDOd&yF=99@w5v-Ss41gGlJ98{+i4*d#3dr5FW2`YH-CD|UMa6?^%ib1F)Tt3@X zAM34e*CKJ$ubx*a1{R$MfYIcgdo3PM3vlCsnu+NjKOCugczMsJoj`7mUDWa4(kg0; zA`>Jm$)yjY6CnTt-+f6}UHIo|iRLc!({c#%;O2{*r*qrI=>3X@o|zJ{K`>bG_R+f0 zywDfvUJ6e^*ziZgTqo!=O#3u9{vnpjr&m9=Ik{O$jDU!~driNUKb!wVvbTc%%fQOy zAfDbb6ZR^9cT3y-?!t84rEKX0t9;BJHsHEPD0vnPpV|E->9X z6dsA;XUZ~jA;AenY;-&*oy=iMB?XEiN^zFlt8U2PGx2=IAlKI#A^S8`*$EevDhAH+ zq}pM+5$Jp-z_q+%isO>%E_h25aY}c-7QdfOhZ!PHD=Z|1RflBF!>ZKtW9>V zuEIAKuT^b|C)(b;I@#v8VDq%AGi<_}zEE8JL*Y zFV)!U>#ffQ6Zkx_mtz4WOxotBs9@J}h(qtKF3P!NS8T$>KtlxBfHsRq^SNa2Xzw@> z%8u*GUlV3qNq{e(&qV-Sg!ch8dwTj>qGQ47-7(6zu8RJGJ+Zx&e`{xEKaIEqj>jM1 zMUUP7CRM-Zr#^RLdc$mjbBzq=9sU3Mae)j=<;(tcH~uymAL`mJ5cC;Fe*iVePr;>g z-n1>z`-nJEemx1oAjP?p*{q6rN&4Ym$AE1ONuMJb5S!7QdicAjAZ@eQ)jqEVd|u5b zXU5bmaQ~jIq8360d{s1!;T6S0Rbya~ml>oVfPB%zX12ZY6JlV^$oMbhdG1=f7}`I) zlz1j!`D4xa$~$Fc+A)tgr!;v!Vo`)oT$N}*fC!bbXa7de?3mnyLow#yK6KJSnJbuG$!cvzo)APyBDxjdP3WL(_PSP9o+Fd90d`;6lO z{_8_B&yoq7Np-0P54V)l0V4<1V_x7GEnfmyjIPW2 zgPdh$BVz;%3eqj;M)(8Wb%0oo^Md>W^w~;SDwV?%l;s6h9qa*SPAsWtLr?-BlBx#v z*3GShrf$}~CU%6tstXMW$nXUFY&PTRl5%gAd}G~ue+zG-zT*MHzHN9|xm~o>aCI82 zO7Yve8LDa}E9m3+*qQ-8I!Z5LOl+`xqvt5&Rt#65`x)gdTgw605$w=pV3gK6jxNc7 z0yw%PTSn*9yTO(Ouh>(5h~t3&5Iyh7X3o9-$x_?{Cpg`vr~*llL(M?`WDLdR)K0rP ztHvu!QE#TLoC!EnObyp4@mXLVA|Oei6`8kRelL!c^96PPwe-;q-y&M{r1hT)y05v# zH?U<{R&FQdOfto{1-AVn31C@E64pIWGjpZicSDED-inn(eKo@TuXOpOrlM+HI4v}m(f)YtF0&*7^;=D`kP?OH52upsP2Rk&JnF4E}-WMt0QTM4*1t>@>R)cdja?v(xhJA!pWOU2;>+IS+Usc_hcgr z#jq%XRYCv+i><(klQW;2aNX(mU&6MDRGB|3d1$6R!7TG+*qtBVF4tUz#BQCDH_|24 z5pkf$)%6^qz==}9Pxo&jw1Bq+#N$_K6kP)F{P{T{VeQe3O$s;JD1d0ChlpO2O?!w} zY?A15f2yRWtbdpXgWchXH;swW=ZWSSy<%YnOqx&+LK}`_w^4kVb7yo=f3GbdGo_IL z{n&@A7mY)pZFHKb6F1v1ucSOkUD)I{(Jj&m)yU>8Iidus*1bx~DqjB&@BrpI;_X)z z<6!!6F3Uci&-kU8Cewv08(*kgwF1xz5L;f`TFuPp+n1)YCw?w)v>C^b-B~sERUMWF8~#e~a~8j|8mZ`8xxCrF`P5gWp|UK&@>& z@hw0!ugn_)j#cgN*z-3~f2aH|>`D2Cd5ix4TblrqoGsz-_Ib@l<#BJ*j3gL<*jF8` zZ!mp%3J@Ou+kot_R!WGS2|U|8Pm?O*|7i@^tS9yH)}~M>?E;rSjSZIpbzJ}D701?$iN2FQFAP->3yAdq z@IKRbV_?{eTy7M$+)+KQC0dnG$O4m_Hml)x7* zasi*ohA#2(MX~ji zWT!L5cv!6QEw!2HHo|W%N?nB{&gAnaj8;FsFgK%(+VL?9INSnt{t9fxnQcA=j8=l|vv%6pvJtYVY30D}LgI8jdR zR~kxgR&Z=WEw>Wz{TV1uP9-tsqNkq4;Fd^^cL-d?3Ew%O$__a|z}3x9{_D z1d`2If4W`67z}y9c*;mOPyjMcZh9NhWbyqzP>2 z8HTc81js$Oo(hD$PfT{XH_0Xy$aU2QzCca?>FM4OSudA(HMOq^NHWXkBt2hh_eXpV z2meI|u78_r)=@;c2n3(={OZ#vK_l-uGe^(-K^cfwB?5T&7O)!uRvc8Keg!7)Q@Bfw zP<*28of?x?Gp}qw#Uy^^jxgjsK#yZcf^5{V(?9evTJ`nb@tyAQT?Bv{y?I2(IIs>FT{yK7KbV6+No;~9xkX&L5 z=G&*K1Om?Gd(52L{p$fY65mmZQjnfbx=yaj336!VQ-~t&h#H>u3M`tgJeb%GF(C-8 z!NvsPsqQ%RE`q$CRv#*xE&#rkv-o_tp@P{3x$+Rz@Yv43cv^@ou|<2$Jux5M!$_xY zh8UYso`jA{+BK1E;19wDI(}6bFe@ICP+6*wjl@HYiDuL*7)A7IEEjG!J1mW0;bzO& zeU?Nk5fC7#hiL=0U-Yz$ZG%xXe>@VV4ExFAPXj4LgNHJ38p)4@p~|d)tgJ#;M*LYU z!hrr@Gkwal9=(%)v)8tDC|8^sQ0-wr?`v|mJX%7NUSOFINTyk$cfqF>tj%>|^gB5Q z8JiXnA;s6jz*JFl$~a$r+4X9qLS!H{P}c|Q6hVyPnO&4Bsd{MXnya4uT9?csMD$$d6uq~nz{+QF0C1i>v+{xhv{G_`rZZ^b1bYxvae+$ZJD6mpz#>*W&?i9r9LaYi)S+WG`77p63H%3 z!8m&{>Q{)fZ5Q&;vJqj~G$MaI=1bt@VK2ogmfP&bi<^E7<1>(u0`tHG{8VV$U(gpcpAXQgAq`_V3(v%Q0X>hSIp-S&5vEiXob5c^t1AYOxsb<- zFoZ_r9x8e|VOpP}(6KFat}WlN4x`aZGL1QW^FTnXdch;;v&2GZOX1{UViD}JMw=j~ zEUJ1ap8E*J$^=D3c(UI;ruOv;tN>J8YfRn zVjMf`m{{Fo1ckV0q(~F80i7WPKP(7uKEd99!L&0WkueEk?i-MK_`8N3(rDW7Hoe54 zz7t+Ju8pb}g+?^vrqd=w(XD~7Sh8)!EIj1H3riD`-XjRchMpG;q$U>i2ZbtjWpYtB ztI8^%+Hn=x?LWH|lu~th&yor&QkD{J@wfJTq+gQhcTYJ!VqB-owQew<&T0vY)|_le z!mkx*LAPuh*GwnE_4dtLTNn4ANiz$$>SZ`|0z=k9fSiD2^$yV2gg<{nD|*Rr4B(bN z(K6%s`72r>fqHXw9DwA1Kpl7)+OE_~BeKVtLVLwzh)H)9R^vwA53o(kNmkED%ZM!$ zbZ3bqJ}q+d9_;{7D{T2H>sHUv%WR!b=_QI&kX^{hdhrXU_z)wyO4?HSkhGJZu`Xlg z%|p#M>6P@gTk?%Xdges0xwDd@G4NReKFCY40yhgJ8$NxNf0jVcA`SC0_Ca|ar&N7f zTF>m(DYe}uN{4E`z4$^N;S%b1gt8Jz>VX}BC^CW8Jj5bg!^QmLeFlv%gTH3WA-z}) z|15q#H=ckHcj&Fo*fTS@J3#WL&U`?z93gNTjhkSXVUZ(jYgg1byV#K-EvvbK=AWPC zW4TlPEc6>9I{ClB0xQ5`i3}5yVG7cPce<7Bk`NLQ+&1$u%Df@JHZ|Usd52QD+5R{Y zNkrVdHisyqHRWrjx}r0n6v~L;wN9p0a@%7_i})()lOUxMq}N{*RBi`Fikf0%AHy`d zqx8nj8s@}((HVRauB{b7ptaVfoRDf`PZZw2PT(^zaNMpBss5u;7Cdb;1k+-qfz*wd z(FMlMqID#OiIk6Wrwl5}V@Fo-PDaq+O1FqshhlWW)v>`u1~;RnKmM?FYp)aU#OXAk zyTNVouBg2H2K#w7!+cWe=>HFe>zY}7nhKa zVieB#YC4Y zjuv-4i9o4;ZJ3ypnd(#!D~Die&63G!871Wi)*_=2ROFvgxRwyzxej6})(wt?^j|41 zCcXwKUI^L_mz z_V#Kc1Ay9h73(H$p%@<*MV!)mD##$F5De@4sVK4D3#TCifd-Xk)0LlD4Wxv9AQ#Ir z`k}IE3oU*bKON8tfLLt|Xpr15FZe1>3-+&4tX(z^9-oQ2iRL>iy2VZ)a7!E;t(fak z$f7S}<;GlgLD}~Z>{v#87D0mH%HW^#i9iWyT=DoXaP}2-E6z{#dhaxl;9dvgR0dX@ zwoIJH(5$Df{M~6QbcE9@d@wYzYmXiC!aKcJ0Vi@DCnekw4n#T&^xrh-;I#aqyRLS?1rmW6dtc7pVRYSo^0K>c`HfzLz~OVEZ)C z`+)kUrY!#8aJs)DV`xe|P6EQ;;Ur}uByZ5>3BOQYhO_MKoP7{N33(qJU+Ykb*x=C~ zbf8fFt~OP`xm$0drw(f2iO$b(P#{AR4G$XqDg*}L$?Ovd8PhYg1j^KNv3oFu4?=%s z2e~n%YAAvhi$-KTA|tJH#%A=&zX$B|r9@U3kbY;<#&DahVp=BWZuK4Z4oPX#T#mH9 zICkVG>w%#C?}DVrX`OW!VatEeqXK(1;*|DX}k)*b!mB7F^H8I4P=uWmR&M=54y3zkvoE>~lc#kqpM9J_GT2pwwbb zO*DbrvI>hUg1;bNenA!?!qjbl31xG}+%n$ML6Qh--NW27f3)7RS^hRYmRk$FNbB(I|D7(xf5(RM}O` zW|BR;)A!WBo@Kyw!7`R<5+xFMhM0z;uj_L113$hUjD;C~hUy!v{wHp~;3x^?7|0*E zwu9$d6u9$9y{_AHNy_{zNEf%;^Ryj1r< zm57dWNf5nHX)klURXK`?41aq#1Ikg#1%*IDo8AQ->)iUwzlfo%ATQ_z9&=eUKr@lP zAGkVsIEmpTgohS&D3Cxx3Lu90B#v#we|#>NDJ({g7vBNPK7bKNCMCcBbaqm5)xQHm zn`w#x`|uxxSh#AeC}9dMk)xKmH$>m6C;;17^41A(_&tqi1tLfTnHwMqF(nl&E&|6T zGKEg_biCDiqZ1q%+4^i&LLn^LR#7zaEW`o+v@(Hs3VG-?CS~|Sz z!Y>zPh~3Mf$qx{M(z7$~V0xhb!YdncL6e9EE;1V0_wlleQS%-+5QOCM=p|G+Qadhs zOn0brX+QO+L+>w)(Ax&qU5sNiB})Ju$v0-&BOGv4&U^xC3_2eheNN>((BYY7KUMCsN?RnplH;rR)KnAOq;te6N-9G^Mb(N@9pzqAImF58lXC)oi_F5s zy&0wcZFi_?BUDWczeQN8Mgw z9zD32U&a;4rd}ib;w2&GI_azuD|0XI9D&cd>uQL@f8$@ym8JTc4)-e`V4nFqn(uS=0%}&io zS(B(AOK^E;*##sIIm8x+mQ|c?={%?dZP9`Yk+g9BLt1~P{ZY7N7ir&`hK>+Bh7ge- zyyqNp2rdodLzj`Ma-dU`&mPmi?GhPaQ4)A31|)#_>DgWU{B`n`$k_AdqVB^$7lxIj4VLgxjb-^u1kp{c{#I|fwX65xxvt!UnPv{l zimVs#!bNS++JJzRHR=%`-iYE3LsB^1aw_+XhjR5KMkZpy|2N{S5QSS;Nhz=unSdp? ziIw_K!$PXMd8p4i&%_eeM{p7D8xl=EPDZ924lIT__uuAzT?>$T=MmFnyj`cnA7EYK zZ<#`@T*3&w&9VowA=~*_?tv<@2>2?5z7muV^-rd&}GE(mX*RH65UNzY|X zhS6MtqA7gcQJh^Prj}-6Gn;ku`S)*6!y~$`3oGU0m3I^(zPwxRF&7nUl1wBDXUW%w zP63X^y{AYkkq}uC*|`w*p^PCq%_bBw;V9?0XX<;T6Hf7z0MCH}=D!b;z9}D0hIC;ji%Fm9{wVOvr`LAr1@2@Xe%7TRSBU zTxa(Rt=|$wpU6?s({d7O2E}b-j8UctHDRGW8EvtkHk8l2Zc9L2-+0t#7lxaF7i;KVq)KlxUR~s zkO21?`oADF6v^rt(%=nWvk3tEz@A4zvd^qQQg4Kn0EG&D>c4a`qfr&5ltan5K6;^? z5%&G?>i~dyMyfDKY0Q89R2>_B`*K1hFY50Q^bH z5OMPJo6VVA{DuB>?lZuTo%`(nS~BbYr|<4fIeGB?8JRNq^3$7=e%Ls|wJii{`*;7} z?70Ev%YjX|m%yb83De}H{>0V3dvAAQDR9Vt-QAN9^S5&E*vMSD2p+`Fz*4(Y{{P2E z@%4Ywtsmyi|8x)7xLe*2K4`+@!|$onDRfC|2U`*-iQeej>7>hoR0qyvGmWbJ!aqL?gLFQL}FH244YMc l%vFaJj1?#6eJ-Ez-#*pE%*Mp;{u5Bv@^tlcS?83{1ON($Ab0=( literal 0 HcmV?d00001 diff --git a/docs/plans/2026-03-14-test-suite-buildout.md b/docs/plans/2026-03-14-test-suite-buildout.md new file mode 100644 index 0000000..8fbcec0 --- /dev/null +++ b/docs/plans/2026-03-14-test-suite-buildout.md @@ -0,0 +1,1371 @@ +# Wraith Remote — Test Suite Build-Out Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a full service-layer test suite (~96 tests) covering all backend services, guards, and controller logic plus frontend stores, composables, and middleware. + +**Architecture:** Backend uses NestJS Testing Module with Jest. Frontend uses Vitest + happy-dom with mocked Nuxt auto-imports ($fetch, navigateTo). All tests are unit tests with mocked dependencies — no real database or network calls. + +**Tech Stack:** Jest 29 (backend, already configured), Vitest (frontend, new), @nestjs/testing, @vue/test-utils, @pinia/testing, happy-dom + +--- + +## File Structure + +### Backend (existing Jest infrastructure, new test files) + +| File | Purpose | +|------|---------| +| `backend/src/__mocks__/prisma.mock.ts` | Shared PrismaService mock factory | +| `backend/src/vault/encryption.service.spec.ts` | Encryption round-trip, v1/v2, upgrade | +| `backend/src/vault/credentials.service.spec.ts` | Credential CRUD, decryptForConnection | +| `backend/src/vault/ssh-keys.service.spec.ts` | SSH key CRUD, key type detection | +| `backend/src/auth/auth.service.spec.ts` | Login, password hashing, TOTP, admin CRUD | +| `backend/src/auth/auth.controller.spec.ts` | Cookie auth, WS tickets, route wiring | +| `backend/src/auth/jwt-auth.guard.spec.ts` | JWT guard pass/reject | +| `backend/src/auth/admin.guard.spec.ts` | Admin role enforcement | +| `backend/src/auth/ws-auth.guard.spec.ts` | Cookie, ticket, legacy token auth | + +### Frontend (new Vitest infrastructure + test files) + +| File | Purpose | +|------|---------| +| `frontend/vitest.config.ts` | Vitest config with happy-dom | +| `frontend/tests/setup.ts` | Global mocks for $fetch, navigateTo | +| `frontend/tests/stores/auth.store.spec.ts` | Auth store login/logout/profile | +| `frontend/tests/stores/connection.store.spec.ts` | Host/group CRUD | +| `frontend/tests/composables/useVault.spec.ts` | Vault API calls | +| `frontend/tests/middleware/admin.spec.ts` | Admin route guard | + +--- + +## Chunk 1: Backend Test Infrastructure + Encryption Tests + +### Task 1: Create Prisma Mock Factory + +**Files:** +- Create: `backend/src/__mocks__/prisma.mock.ts` + +- [ ] **Step 1: Create the shared mock** + +```typescript +// backend/src/__mocks__/prisma.mock.ts +export const mockPrismaService = { + user: { + findUnique: jest.fn(), + findFirst: jest.fn(), + findMany: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + credential: { + findUnique: jest.fn(), + findMany: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + sshKey: { + findUnique: jest.fn(), + findMany: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + connectionLog: { + create: jest.fn(), + updateMany: jest.fn(), + }, +}; + +export function createMockPrisma() { + // Deep clone to prevent test bleed + const mock = JSON.parse(JSON.stringify(mockPrismaService)); + // Re-attach jest.fn() since JSON.parse loses functions + for (const model of Object.keys(mock)) { + for (const method of Object.keys(mock[model])) { + mock[model][method] = jest.fn(); + } + } + return mock; +} +``` + +- [ ] **Step 2: Commit** + +```bash +git add backend/src/__mocks__/prisma.mock.ts +git commit -m "test: add shared Prisma mock factory" +``` + +### Task 2: Encryption Service Tests + +**Files:** +- Create: `backend/src/vault/encryption.service.spec.ts` +- Reference: `backend/src/vault/encryption.service.ts` + +- [ ] **Step 1: Write encryption tests** + +```typescript +// backend/src/vault/encryption.service.spec.ts +import { EncryptionService } from './encryption.service'; + +// Set test encryption key before importing service +process.env.ENCRYPTION_KEY = 'a'.repeat(64); // 32 bytes hex + +describe('EncryptionService', () => { + let service: EncryptionService; + + beforeAll(async () => { + service = new EncryptionService(); + await service.onModuleInit(); + }); + + describe('encrypt/decrypt round-trip', () => { + it('should encrypt and decrypt a string', async () => { + const plaintext = 'my-secret-password'; + const encrypted = await service.encrypt(plaintext); + expect(encrypted).toMatch(/^v2:/); + const decrypted = await service.decrypt(encrypted); + expect(decrypted).toBe(plaintext); + }); + + it('should produce different ciphertexts for the same plaintext', async () => { + const plaintext = 'same-input'; + const a = await service.encrypt(plaintext); + const b = await service.encrypt(plaintext); + expect(a).not.toBe(b); // Different salts + IVs + }); + + it('should handle empty string', async () => { + const encrypted = await service.encrypt(''); + const decrypted = await service.decrypt(encrypted); + expect(decrypted).toBe(''); + }); + + it('should handle unicode', async () => { + const plaintext = '密码 пароль 🔐'; + const encrypted = await service.encrypt(plaintext); + const decrypted = await service.decrypt(encrypted); + expect(decrypted).toBe(plaintext); + }); + }); + + describe('v2 format', () => { + it('should produce v2-prefixed ciphertext', async () => { + const encrypted = await service.encrypt('test'); + const parts = encrypted.split(':'); + expect(parts[0]).toBe('v2'); + expect(parts).toHaveLength(5); // v2:salt:iv:authTag:ciphertext + }); + }); + + describe('isV1', () => { + it('should detect v1 format', () => { + expect(service.isV1('v1:abc:def:ghi')).toBe(true); + }); + + it('should not detect v2 as v1', () => { + expect(service.isV1('v2:abc:def:ghi:jkl')).toBe(false); + }); + }); + + describe('upgradeToV2', () => { + it('should return null for v2 ciphertext', async () => { + const v2 = await service.encrypt('test'); + const result = await service.upgradeToV2(v2); + expect(result).toBeNull(); + }); + }); + + describe('error handling', () => { + it('should throw on unknown version', async () => { + await expect(service.decrypt('v3:bad:data')).rejects.toThrow('Unknown encryption version'); + }); + + it('should throw on tampered ciphertext', async () => { + const encrypted = await service.encrypt('test'); + const tampered = encrypted.slice(0, -4) + 'dead'; + await expect(service.decrypt(tampered)).rejects.toThrow(); + }); + }); +}); +``` + +- [ ] **Step 2: Run tests to verify they pass** + +Run: `cd backend && npx jest src/vault/encryption.service.spec.ts --verbose` +Expected: 8 tests PASS + +- [ ] **Step 3: Commit** + +```bash +git add backend/src/vault/encryption.service.spec.ts +git commit -m "test: encryption service — round-trip, v1/v2 format, upgrade, error handling" +``` + +--- + +## Chunk 2: Backend Vault Service Tests + +### Task 3: Credentials Service Tests + +**Files:** +- Create: `backend/src/vault/credentials.service.spec.ts` +- Reference: `backend/src/vault/credentials.service.ts` + +- [ ] **Step 1: Write credentials service tests** + +```typescript +// backend/src/vault/credentials.service.spec.ts +import { Test, TestingModule } from '@nestjs/testing'; +import { CredentialsService } from './credentials.service'; +import { PrismaService } from '../prisma/prisma.service'; +import { EncryptionService } from './encryption.service'; +import { NotFoundException, ForbiddenException } from '@nestjs/common'; + +describe('CredentialsService', () => { + let service: CredentialsService; + let prisma: any; + let encryption: any; + + beforeEach(async () => { + prisma = { + credential: { + findMany: jest.fn(), + findUnique: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + }; + encryption = { + encrypt: jest.fn().mockResolvedValue('v2:mock:encrypted'), + decrypt: jest.fn().mockResolvedValue('decrypted-password'), + }; + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + CredentialsService, + { provide: PrismaService, useValue: prisma }, + { provide: EncryptionService, useValue: encryption }, + ], + }).compile(); + + service = module.get(CredentialsService); + }); + + describe('findAll', () => { + it('should return credentials without encryptedValue', async () => { + prisma.credential.findMany.mockResolvedValue([{ id: 1, name: 'test' }]); + const result = await service.findAll(1); + expect(prisma.credential.findMany).toHaveBeenCalledWith( + expect.objectContaining({ + where: { userId: 1 }, + select: expect.objectContaining({ id: true, name: true }), + }), + ); + // Verify encryptedValue is NOT in select + const call = prisma.credential.findMany.mock.calls[0][0]; + expect(call.select.encryptedValue).toBeUndefined(); + }); + }); + + describe('findOne', () => { + it('should return credential for owner', async () => { + prisma.credential.findUnique.mockResolvedValue({ id: 1, userId: 1, name: 'cred' }); + const result = await service.findOne(1, 1); + expect(result.name).toBe('cred'); + }); + + it('should throw ForbiddenException for non-owner', async () => { + prisma.credential.findUnique.mockResolvedValue({ id: 1, userId: 2, name: 'cred' }); + await expect(service.findOne(1, 1)).rejects.toThrow(ForbiddenException); + }); + + it('should throw NotFoundException for missing credential', async () => { + prisma.credential.findUnique.mockResolvedValue(null); + await expect(service.findOne(99, 1)).rejects.toThrow(NotFoundException); + }); + }); + + describe('create', () => { + it('should encrypt password before storage', async () => { + prisma.credential.create.mockResolvedValue({ id: 1 }); + await service.create(1, { name: 'test', username: 'admin', password: 'secret', type: 'password' as any }); + expect(encryption.encrypt).toHaveBeenCalledWith('secret'); + expect(prisma.credential.create).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ encryptedValue: 'v2:mock:encrypted' }), + }), + ); + }); + }); + + describe('decryptForConnection', () => { + it('should decrypt password credential', async () => { + prisma.credential.findUnique.mockResolvedValue({ + id: 1, username: 'admin', domain: null, + encryptedValue: 'v2:encrypted', sshKey: null, sshKeyId: null, + }); + const result = await service.decryptForConnection(1); + expect(result.password).toBe('decrypted-password'); + expect(result.username).toBe('admin'); + }); + + it('should decrypt SSH key credential', async () => { + prisma.credential.findUnique.mockResolvedValue({ + id: 1, username: 'root', domain: null, encryptedValue: null, + sshKey: { encryptedPrivateKey: 'v2:key', passphraseEncrypted: 'v2:pass' }, + sshKeyId: 5, + }); + encryption.decrypt.mockResolvedValueOnce('private-key-content'); + encryption.decrypt.mockResolvedValueOnce('passphrase'); + const result = await service.decryptForConnection(1); + expect(result.sshKey).toEqual({ privateKey: 'private-key-content', passphrase: 'passphrase' }); + }); + + it('should throw for orphaned SSH key reference', async () => { + prisma.credential.findUnique.mockResolvedValue({ + id: 1, name: 'orphan', username: 'root', domain: null, + encryptedValue: null, sshKey: null, sshKeyId: 99, + }); + await expect(service.decryptForConnection(1)).rejects.toThrow(NotFoundException); + }); + + it('should throw for credential with no auth method', async () => { + prisma.credential.findUnique.mockResolvedValue({ + id: 1, name: 'empty', username: 'root', domain: null, + encryptedValue: null, sshKey: null, sshKeyId: null, + }); + await expect(service.decryptForConnection(1)).rejects.toThrow(NotFoundException); + }); + }); + + describe('remove', () => { + it('should delete owned credential', async () => { + prisma.credential.findUnique.mockResolvedValue({ id: 1, userId: 1 }); + prisma.credential.delete.mockResolvedValue({ id: 1 }); + await service.remove(1, 1); + expect(prisma.credential.delete).toHaveBeenCalledWith({ where: { id: 1 } }); + }); + }); +}); +``` + +- [ ] **Step 2: Run tests** + +Run: `cd backend && npx jest src/vault/credentials.service.spec.ts --verbose` +Expected: 10 tests PASS + +- [ ] **Step 3: Commit** + +```bash +git add backend/src/vault/credentials.service.spec.ts +git commit -m "test: credentials service — CRUD, ownership, decryptForConnection" +``` + +### Task 4: SSH Keys Service Tests + +**Files:** +- Create: `backend/src/vault/ssh-keys.service.spec.ts` +- Reference: `backend/src/vault/ssh-keys.service.ts` + +- [ ] **Step 1: Write SSH keys tests** + +```typescript +// backend/src/vault/ssh-keys.service.spec.ts +import { Test, TestingModule } from '@nestjs/testing'; +import { SshKeysService } from './ssh-keys.service'; +import { PrismaService } from '../prisma/prisma.service'; +import { EncryptionService } from './encryption.service'; +import { NotFoundException, ForbiddenException } from '@nestjs/common'; + +describe('SshKeysService', () => { + let service: SshKeysService; + let prisma: any; + let encryption: any; + + beforeEach(async () => { + prisma = { + sshKey: { + findMany: jest.fn(), + findUnique: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + }; + encryption = { + encrypt: jest.fn().mockResolvedValue('v2:mock:encrypted'), + }; + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + SshKeysService, + { provide: PrismaService, useValue: prisma }, + { provide: EncryptionService, useValue: encryption }, + ], + }).compile(); + + service = module.get(SshKeysService); + }); + + describe('findAll', () => { + it('should return keys without private key data', async () => { + prisma.sshKey.findMany.mockResolvedValue([{ id: 1, name: 'key1' }]); + await service.findAll(1); + const call = prisma.sshKey.findMany.mock.calls[0][0]; + expect(call.select.encryptedPrivateKey).toBeUndefined(); + expect(call.select.passphraseEncrypted).toBeUndefined(); + }); + }); + + describe('findOne', () => { + it('should return key for owner', async () => { + prisma.sshKey.findUnique.mockResolvedValue({ id: 1, userId: 1, name: 'key1', keyType: 'ed25519' }); + const result = await service.findOne(1, 1); + expect(result.name).toBe('key1'); + // Should not include encrypted private key + expect((result as any).encryptedPrivateKey).toBeUndefined(); + }); + + it('should throw ForbiddenException for non-owner', async () => { + prisma.sshKey.findUnique.mockResolvedValue({ id: 1, userId: 2 }); + await expect(service.findOne(1, 1)).rejects.toThrow(ForbiddenException); + }); + }); + + describe('create', () => { + it('should encrypt private key and passphrase', async () => { + prisma.sshKey.create.mockResolvedValue({ id: 1 }); + await service.create(1, { + name: 'my-key', + privateKey: '-----BEGIN OPENSSH PRIVATE KEY-----\ndata\n-----END OPENSSH PRIVATE KEY-----', + passphrase: 'secret', + }); + expect(encryption.encrypt).toHaveBeenCalledTimes(2); + }); + + it('should detect RSA key type', async () => { + prisma.sshKey.create.mockResolvedValue({ id: 1 }); + await service.create(1, { + name: 'rsa-key', + privateKey: '-----BEGIN RSA PRIVATE KEY-----\ndata\n-----END RSA PRIVATE KEY-----', + }); + expect(prisma.sshKey.create).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ keyType: 'rsa' }), + }), + ); + }); + + it('should detect ed25519 key type from OPENSSH format', async () => { + prisma.sshKey.create.mockResolvedValue({ id: 1 }); + await service.create(1, { + name: 'ed25519-key', + privateKey: '-----BEGIN OPENSSH PRIVATE KEY-----\ndata\n-----END OPENSSH PRIVATE KEY-----', + }); + expect(prisma.sshKey.create).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ keyType: 'ed25519' }), + }), + ); + }); + }); + + describe('remove', () => { + it('should delete owned key', async () => { + prisma.sshKey.findUnique.mockResolvedValue({ id: 1, userId: 1 }); + prisma.sshKey.delete.mockResolvedValue({ id: 1 }); + await service.remove(1, 1); + expect(prisma.sshKey.delete).toHaveBeenCalled(); + }); + + it('should throw for non-owner', async () => { + prisma.sshKey.findUnique.mockResolvedValue({ id: 1, userId: 2 }); + await expect(service.remove(1, 1)).rejects.toThrow(ForbiddenException); + }); + }); +}); +``` + +- [ ] **Step 2: Run tests** + +Run: `cd backend && npx jest src/vault/ssh-keys.service.spec.ts --verbose` +Expected: 8 tests PASS + +- [ ] **Step 3: Commit** + +```bash +git add backend/src/vault/ssh-keys.service.spec.ts +git commit -m "test: SSH keys service — CRUD, ownership, key type detection, encryption" +``` + +--- + +## Chunk 3: Backend Auth Tests + +### Task 5: Auth Guards Tests + +**Files:** +- Create: `backend/src/auth/jwt-auth.guard.spec.ts` +- Create: `backend/src/auth/admin.guard.spec.ts` +- Create: `backend/src/auth/ws-auth.guard.spec.ts` + +- [ ] **Step 1: Write JWT auth guard test** + +```typescript +// backend/src/auth/jwt-auth.guard.spec.ts +import { JwtAuthGuard } from './jwt-auth.guard'; + +describe('JwtAuthGuard', () => { + it('should be defined', () => { + expect(new JwtAuthGuard()).toBeDefined(); + }); + + it('should extend AuthGuard("jwt")', () => { + const guard = new JwtAuthGuard(); + expect(guard).toBeInstanceOf(JwtAuthGuard); + }); +}); +``` + +- [ ] **Step 2: Write admin guard test** + +```typescript +// backend/src/auth/admin.guard.spec.ts +import { AdminGuard } from './admin.guard'; +import { ExecutionContext, ForbiddenException } from '@nestjs/common'; + +function createMockContext(user: any): ExecutionContext { + return { + switchToHttp: () => ({ + getRequest: () => ({ user }), + }), + } as any; +} + +describe('AdminGuard', () => { + const guard = new AdminGuard(); + + it('should allow admin role', () => { + const ctx = createMockContext({ role: 'admin' }); + expect(guard.canActivate(ctx)).toBe(true); + }); + + it('should reject non-admin role', () => { + const ctx = createMockContext({ role: 'user' }); + expect(() => guard.canActivate(ctx)).toThrow(ForbiddenException); + }); + + it('should reject missing user', () => { + const ctx = createMockContext(undefined); + expect(() => guard.canActivate(ctx)).toThrow(ForbiddenException); + }); +}); +``` + +- [ ] **Step 3: Write WS auth guard test** + +```typescript +// backend/src/auth/ws-auth.guard.spec.ts +import { WsAuthGuard } from './ws-auth.guard'; +import { JwtService } from '@nestjs/jwt'; +import { AuthController } from './auth.controller'; + +describe('WsAuthGuard', () => { + let guard: WsAuthGuard; + let jwt: any; + + beforeEach(() => { + jwt = { + verify: jest.fn().mockReturnValue({ sub: 1, email: 'test@test.com' }), + }; + guard = new WsAuthGuard(jwt as any); + }); + + it('should authenticate via cookie', () => { + const req = { headers: { cookie: 'wraith_token=valid-jwt; other=stuff' } }; + const result = guard.validateClient({}, req); + expect(jwt.verify).toHaveBeenCalledWith('valid-jwt'); + expect(result).toEqual({ sub: 1, email: 'test@test.com' }); + }); + + it('should authenticate via WS ticket', () => { + const originalConsume = AuthController.consumeWsTicket; + AuthController.consumeWsTicket = jest.fn().mockReturnValue({ sub: 1, email: 'test@test.com', role: 'admin' }); + const req = { url: '/api/ws/terminal?ticket=abc123', headers: {} }; + const result = guard.validateClient({}, req); + expect(result).toEqual({ sub: 1, email: 'test@test.com' }); + AuthController.consumeWsTicket = originalConsume; + }); + + it('should fall back to legacy URL token', () => { + const req = { url: '/api/ws/terminal?token=legacy-jwt', headers: {} }; + guard.validateClient({}, req); + expect(jwt.verify).toHaveBeenCalledWith('legacy-jwt'); + }); + + it('should return null for no credentials', () => { + const req = { url: '/api/ws/terminal', headers: {} }; + const result = guard.validateClient({}, req); + expect(result).toBeNull(); + }); + + it('should return null for invalid JWT', () => { + jwt.verify.mockImplementation(() => { throw new Error('invalid'); }); + const req = { headers: { cookie: 'wraith_token=bad-jwt' } }; + const result = guard.validateClient({}, req); + expect(result).toBeNull(); + }); +}); +``` + +- [ ] **Step 4: Run all guard tests** + +Run: `cd backend && npx jest src/auth/*.guard.spec.ts --verbose` +Expected: 10 tests PASS + +- [ ] **Step 5: Commit** + +```bash +git add backend/src/auth/jwt-auth.guard.spec.ts backend/src/auth/admin.guard.spec.ts backend/src/auth/ws-auth.guard.spec.ts +git commit -m "test: auth guards — JWT, admin, WS (cookie, ticket, legacy token)" +``` + +### Task 6: Auth Service Tests + +**Files:** +- Create: `backend/src/auth/auth.service.spec.ts` +- Reference: `backend/src/auth/auth.service.ts` + +- [ ] **Step 1: Write auth service tests** + +```typescript +// backend/src/auth/auth.service.spec.ts +import { Test, TestingModule } from '@nestjs/testing'; +import { AuthService } from './auth.service'; +import { PrismaService } from '../prisma/prisma.service'; +import { JwtService } from '@nestjs/jwt'; +import { EncryptionService } from '../vault/encryption.service'; +import { UnauthorizedException, BadRequestException, NotFoundException, ForbiddenException } from '@nestjs/common'; +import * as argon2 from 'argon2'; +import * as bcrypt from 'bcrypt'; + +describe('AuthService', () => { + let service: AuthService; + let prisma: any; + let jwt: any; + let encryption: any; + + beforeEach(async () => { + prisma = { + user: { + findUnique: jest.fn(), + findMany: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + }; + jwt = { sign: jest.fn().mockReturnValue('mock-jwt-token') }; + encryption = { + encrypt: jest.fn().mockResolvedValue('v2:encrypted'), + decrypt: jest.fn().mockResolvedValue('decrypted-secret'), + }; + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + AuthService, + { provide: PrismaService, useValue: prisma }, + { provide: JwtService, useValue: jwt }, + { provide: EncryptionService, useValue: encryption }, + ], + }).compile(); + + service = module.get(AuthService); + await service.onModuleInit(); + }); + + describe('login', () => { + it('should return access_token and user for valid credentials', async () => { + const hash = await argon2.hash('correct-password', { type: argon2.argon2id }); + prisma.user.findUnique.mockResolvedValue({ + id: 1, email: 'test@test.com', passwordHash: hash, + displayName: 'Test', role: 'admin', totpEnabled: false, + }); + const result = await service.login('test@test.com', 'correct-password'); + expect(result).toHaveProperty('access_token', 'mock-jwt-token'); + expect(result).toHaveProperty('user'); + expect((result as any).user.email).toBe('test@test.com'); + }); + + it('should throw for wrong password', async () => { + const hash = await argon2.hash('correct', { type: argon2.argon2id }); + prisma.user.findUnique.mockResolvedValue({ + id: 1, email: 'test@test.com', passwordHash: hash, + totpEnabled: false, + }); + await expect(service.login('test@test.com', 'wrong')).rejects.toThrow(UnauthorizedException); + }); + + it('should throw for non-existent user (constant time)', async () => { + prisma.user.findUnique.mockResolvedValue(null); + await expect(service.login('nobody@test.com', 'pass')).rejects.toThrow(UnauthorizedException); + }); + + it('should auto-upgrade bcrypt hash to argon2id on login', async () => { + const bcryptHash = await bcrypt.hash('password', 10); + prisma.user.findUnique.mockResolvedValue({ + id: 1, email: 'legacy@test.com', passwordHash: bcryptHash, + displayName: 'Legacy', role: 'user', totpEnabled: false, + }); + prisma.user.update.mockResolvedValue({}); + await service.login('legacy@test.com', 'password'); + // Should have called update to upgrade the hash + expect(prisma.user.update).toHaveBeenCalledWith( + expect.objectContaining({ + where: { id: 1 }, + data: expect.objectContaining({ + passwordHash: expect.stringContaining('$argon2id$'), + }), + }), + ); + }); + + it('should return requires_totp when TOTP enabled but no code provided', async () => { + const hash = await argon2.hash('pass', { type: argon2.argon2id }); + prisma.user.findUnique.mockResolvedValue({ + id: 1, email: 'totp@test.com', passwordHash: hash, + totpEnabled: true, totpSecret: 'v2:encrypted-secret', + }); + const result = await service.login('totp@test.com', 'pass'); + expect(result).toEqual({ requires_totp: true }); + }); + }); + + describe('createUser', () => { + it('should hash password with argon2id', async () => { + prisma.user.findUnique.mockResolvedValue(null); // no existing user + prisma.user.create.mockResolvedValue({ id: 1, email: 'new@test.com', displayName: null, role: 'user' }); + await service.createUser({ email: 'new@test.com', password: 'StrongPass1!' }); + const createCall = prisma.user.create.mock.calls[0][0]; + expect(createCall.data.passwordHash).toMatch(/^\$argon2id\$/); + }); + + it('should throw for duplicate email', async () => { + prisma.user.findUnique.mockResolvedValue({ id: 1 }); + await expect(service.createUser({ email: 'dup@test.com', password: 'pass' })) + .rejects.toThrow(BadRequestException); + }); + }); + + describe('adminDeleteUser', () => { + it('should prevent self-deletion', async () => { + await expect(service.adminDeleteUser(1, 1)).rejects.toThrow(ForbiddenException); + }); + + it('should delete another user', async () => { + prisma.user.findUnique.mockResolvedValue({ id: 2 }); + prisma.user.delete.mockResolvedValue({ id: 2 }); + await service.adminDeleteUser(2, 1); + expect(prisma.user.delete).toHaveBeenCalledWith({ where: { id: 2 } }); + }); + }); + + describe('totpSetup', () => { + it('should encrypt TOTP secret before storage', async () => { + prisma.user.findUnique.mockResolvedValue({ id: 1, totpEnabled: false }); + prisma.user.update.mockResolvedValue({}); + const result = await service.totpSetup(1); + expect(encryption.encrypt).toHaveBeenCalled(); + expect(result).toHaveProperty('secret'); + expect(result).toHaveProperty('qrCode'); + }); + + it('should throw if TOTP already enabled', async () => { + prisma.user.findUnique.mockResolvedValue({ id: 1, totpEnabled: true }); + await expect(service.totpSetup(1)).rejects.toThrow(BadRequestException); + }); + }); + + describe('updateProfile', () => { + it('should require current password for password change', async () => { + prisma.user.findUnique.mockResolvedValue({ id: 1, passwordHash: 'hash' }); + await expect(service.updateProfile(1, { newPassword: 'new' })) + .rejects.toThrow(BadRequestException); + }); + }); +}); +``` + +- [ ] **Step 2: Run tests** + +Run: `cd backend && npx jest src/auth/auth.service.spec.ts --verbose` +Expected: ~12 tests PASS + +- [ ] **Step 3: Commit** + +```bash +git add backend/src/auth/auth.service.spec.ts +git commit -m "test: auth service — login, bcrypt migration, TOTP, admin CRUD, profile" +``` + +### Task 7: Auth Controller Tests + +**Files:** +- Create: `backend/src/auth/auth.controller.spec.ts` + +- [ ] **Step 1: Write auth controller tests** + +```typescript +// backend/src/auth/auth.controller.spec.ts +import { Test, TestingModule } from '@nestjs/testing'; +import { AuthController } from './auth.controller'; +import { AuthService } from './auth.service'; +import { JwtService } from '@nestjs/jwt'; + +describe('AuthController', () => { + let controller: AuthController; + let authService: any; + + beforeEach(async () => { + authService = { + login: jest.fn(), + getProfile: jest.fn(), + totpSetup: jest.fn(), + listUsers: jest.fn(), + }; + + const module: TestingModule = await Test.createTestingModule({ + controllers: [AuthController], + providers: [ + { provide: AuthService, useValue: authService }, + { provide: JwtService, useValue: { sign: jest.fn(), verify: jest.fn() } }, + ], + }).compile(); + + controller = module.get(AuthController); + }); + + describe('login', () => { + it('should set httpOnly cookie on successful login', async () => { + authService.login.mockResolvedValue({ + access_token: 'jwt-token', + user: { id: 1, email: 'test@test.com', role: 'admin' }, + }); + const res = { cookie: jest.fn() }; + const result = await controller.login({ email: 'test@test.com', password: 'pass' } as any, res); + expect(res.cookie).toHaveBeenCalledWith('wraith_token', 'jwt-token', expect.objectContaining({ + httpOnly: true, + sameSite: 'strict', + path: '/', + })); + expect(result).toEqual({ user: expect.objectContaining({ email: 'test@test.com' }) }); + // Token should NOT be in response body + expect(result).not.toHaveProperty('access_token'); + }); + + it('should pass through requires_totp without setting cookie', async () => { + authService.login.mockResolvedValue({ requires_totp: true }); + const res = { cookie: jest.fn() }; + const result = await controller.login({ email: 'test@test.com', password: 'pass' } as any, res); + expect(res.cookie).not.toHaveBeenCalled(); + expect(result).toEqual({ requires_totp: true }); + }); + }); + + describe('logout', () => { + it('should clear cookie', () => { + const res = { clearCookie: jest.fn() }; + const result = controller.logout(res); + expect(res.clearCookie).toHaveBeenCalledWith('wraith_token', { path: '/' }); + }); + }); + + describe('ws-ticket', () => { + it('should issue a ticket', () => { + const req = { user: { sub: 1, email: 'test@test.com', role: 'admin' } }; + const result = controller.issueWsTicket(req); + expect(result).toHaveProperty('ticket'); + expect(result.ticket).toHaveLength(64); // 32 bytes hex + }); + + it('should consume ticket exactly once', () => { + const req = { user: { sub: 1, email: 'test@test.com', role: 'admin' } }; + const { ticket } = controller.issueWsTicket(req); + const first = AuthController.consumeWsTicket(ticket); + expect(first).toEqual(expect.objectContaining({ sub: 1 })); + const second = AuthController.consumeWsTicket(ticket); + expect(second).toBeNull(); // Single-use + }); + }); +}); +``` + +- [ ] **Step 2: Run tests** + +Run: `cd backend && npx jest src/auth/auth.controller.spec.ts --verbose` +Expected: 6 tests PASS + +- [ ] **Step 3: Commit** + +```bash +git add backend/src/auth/auth.controller.spec.ts +git commit -m "test: auth controller — cookie login, logout, WS ticket issuance/consumption" +``` + +--- + +## Chunk 4: Frontend Test Infrastructure + Tests + +### Task 8: Frontend Test Infrastructure + +**Files:** +- Create: `frontend/vitest.config.ts` +- Create: `frontend/tests/setup.ts` +- Modify: `frontend/package.json` + +- [ ] **Step 1: Install Vitest dependencies** + +Run: `cd frontend && npm install --save-dev vitest @vue/test-utils @pinia/testing happy-dom` + +- [ ] **Step 2: Create Vitest config** + +```typescript +// frontend/vitest.config.ts +import { defineConfig } from 'vitest/config'; +import { resolve } from 'path'; + +export default defineConfig({ + test: { + environment: 'happy-dom', + globals: true, + setupFiles: ['./tests/setup.ts'], + include: ['tests/**/*.spec.ts'], + }, + resolve: { + alias: { + '~': resolve(__dirname, '.'), + '#imports': resolve(__dirname, '.nuxt/imports.d.ts'), + }, + }, +}); +``` + +- [ ] **Step 3: Create test setup with Nuxt auto-import mocks** + +```typescript +// frontend/tests/setup.ts +import { vi } from 'vitest'; + +// Mock Nuxt auto-imports +(globalThis as any).$fetch = vi.fn(); +(globalThis as any).navigateTo = vi.fn(); +(globalThis as any).defineNuxtRouteMiddleware = (fn: any) => fn; +(globalThis as any).defineNuxtPlugin = vi.fn(); +(globalThis as any).definePageMeta = vi.fn(); +(globalThis as any).useAuthStore = vi.fn(); +(globalThis as any).useSessionStore = vi.fn(); +(globalThis as any).useConnectionStore = vi.fn(); + +// Mock ref, computed, onMounted from Vue (Nuxt auto-imports these) +import { ref, computed, onMounted, watch } from 'vue'; +(globalThis as any).ref = ref; +(globalThis as any).computed = computed; +(globalThis as any).onMounted = onMounted; +(globalThis as any).watch = watch; +``` + +- [ ] **Step 4: Add test scripts to frontend package.json** + +Add to `frontend/package.json` scripts: +```json +"test": "vitest run", +"test:watch": "vitest", +"test:cov": "vitest run --coverage" +``` + +- [ ] **Step 5: Commit** + +```bash +git add frontend/vitest.config.ts frontend/tests/setup.ts frontend/package.json +git commit -m "test: frontend test infrastructure — Vitest, happy-dom, Nuxt auto-import mocks" +``` + +### Task 9: Auth Store Tests + +**Files:** +- Create: `frontend/tests/stores/auth.store.spec.ts` +- Reference: `frontend/stores/auth.store.ts` + +- [ ] **Step 1: Write auth store tests** + +```typescript +// frontend/tests/stores/auth.store.spec.ts +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { setActivePinia, createPinia } from 'pinia'; +import { useAuthStore } from '../../stores/auth.store'; + +describe('Auth Store', () => { + beforeEach(() => { + setActivePinia(createPinia()); + vi.resetAllMocks(); + }); + + describe('initial state', () => { + it('should start with no user', () => { + const auth = useAuthStore(); + expect(auth.user).toBeNull(); + expect(auth.isAuthenticated).toBe(false); + expect(auth.isAdmin).toBe(false); + }); + }); + + describe('login', () => { + it('should store user on successful login', async () => { + const mockUser = { id: 1, email: 'test@test.com', displayName: 'Test', role: 'admin' }; + (globalThis as any).$fetch = vi.fn().mockResolvedValue({ user: mockUser }); + + const auth = useAuthStore(); + await auth.login('test@test.com', 'password'); + expect(auth.user).toEqual(mockUser); + expect(auth.isAuthenticated).toBe(true); + expect(auth.isAdmin).toBe(true); + }); + + it('should return requires_totp without storing user', async () => { + (globalThis as any).$fetch = vi.fn().mockResolvedValue({ requires_totp: true }); + + const auth = useAuthStore(); + const result = await auth.login('test@test.com', 'password'); + expect(result).toEqual({ requires_totp: true }); + expect(auth.user).toBeNull(); + }); + + it('should not store token in state (httpOnly cookie)', async () => { + (globalThis as any).$fetch = vi.fn().mockResolvedValue({ + user: { id: 1, email: 'test@test.com', role: 'user' }, + }); + + const auth = useAuthStore(); + await auth.login('test@test.com', 'password'); + expect((auth as any).token).toBeUndefined(); + }); + }); + + describe('logout', () => { + it('should clear user and call logout API', async () => { + (globalThis as any).$fetch = vi.fn().mockResolvedValue({}); + (globalThis as any).navigateTo = vi.fn(); + + const auth = useAuthStore(); + auth.user = { id: 1, email: 'test@test.com', displayName: null, role: 'admin' }; + await auth.logout(); + expect(auth.user).toBeNull(); + expect(auth.isAuthenticated).toBe(false); + expect(navigateTo).toHaveBeenCalledWith('/login'); + }); + }); + + describe('fetchProfile', () => { + it('should populate user on success', async () => { + const mockUser = { id: 1, email: 'test@test.com', displayName: 'Test', role: 'user' }; + (globalThis as any).$fetch = vi.fn().mockResolvedValue(mockUser); + + const auth = useAuthStore(); + await auth.fetchProfile(); + expect(auth.user).toEqual(mockUser); + }); + + it('should clear user on failure', async () => { + (globalThis as any).$fetch = vi.fn().mockRejectedValue(new Error('401')); + + const auth = useAuthStore(); + auth.user = { id: 1, email: 'old@test.com', displayName: null, role: 'user' }; + await auth.fetchProfile(); + expect(auth.user).toBeNull(); + }); + }); + + describe('getWsTicket', () => { + it('should return ticket string', async () => { + (globalThis as any).$fetch = vi.fn().mockResolvedValue({ ticket: 'abc123' }); + + const auth = useAuthStore(); + const ticket = await auth.getWsTicket(); + expect(ticket).toBe('abc123'); + }); + }); + + describe('getters', () => { + it('isAdmin should be true for admin role', () => { + const auth = useAuthStore(); + auth.user = { id: 1, email: 'a@b.com', displayName: null, role: 'admin' }; + expect(auth.isAdmin).toBe(true); + }); + + it('isAdmin should be false for user role', () => { + const auth = useAuthStore(); + auth.user = { id: 1, email: 'a@b.com', displayName: null, role: 'user' }; + expect(auth.isAdmin).toBe(false); + }); + }); +}); +``` + +- [ ] **Step 2: Run tests** + +Run: `cd frontend && npx vitest run tests/stores/auth.store.spec.ts` +Expected: 10 tests PASS + +- [ ] **Step 3: Commit** + +```bash +git add frontend/tests/stores/auth.store.spec.ts +git commit -m "test: auth store — login, logout, fetchProfile, getWsTicket, getters" +``` + +### Task 10: Connection Store Tests + +**Files:** +- Create: `frontend/tests/stores/connection.store.spec.ts` + +- [ ] **Step 1: Write connection store tests** + +```typescript +// frontend/tests/stores/connection.store.spec.ts +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { setActivePinia, createPinia } from 'pinia'; +import { useConnectionStore } from '../../stores/connection.store'; + +describe('Connection Store', () => { + beforeEach(() => { + setActivePinia(createPinia()); + vi.resetAllMocks(); + (globalThis as any).$fetch = vi.fn().mockResolvedValue([]); + }); + + describe('fetchHosts', () => { + it('should populate hosts from API', async () => { + const mockHosts = [{ id: 1, name: 'Server 1' }]; + (globalThis as any).$fetch = vi.fn().mockResolvedValue(mockHosts); + + const store = useConnectionStore(); + await store.fetchHosts(); + expect(store.hosts).toEqual(mockHosts); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/hosts'); + }); + + it('should not send Authorization header', async () => { + const store = useConnectionStore(); + await store.fetchHosts(); + const callArgs = (globalThis as any).$fetch.mock.calls[0]; + expect(callArgs[1]?.headers?.Authorization).toBeUndefined(); + }); + }); + + describe('createHost', () => { + it('should POST and refresh hosts', async () => { + (globalThis as any).$fetch = vi.fn() + .mockResolvedValueOnce({ id: 1, name: 'New' }) // create + .mockResolvedValueOnce([]); // fetchHosts + + const store = useConnectionStore(); + await store.createHost({ name: 'New', hostname: '10.0.0.1', port: 22 } as any); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/hosts', expect.objectContaining({ method: 'POST' })); + }); + }); + + describe('deleteHost', () => { + it('should DELETE and refresh hosts', async () => { + (globalThis as any).$fetch = vi.fn() + .mockResolvedValueOnce({}) // delete + .mockResolvedValueOnce([]); // fetchHosts + + const store = useConnectionStore(); + await store.deleteHost(1); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/hosts/1', expect.objectContaining({ method: 'DELETE' })); + }); + }); + + describe('group CRUD', () => { + it('should create group and refresh tree', async () => { + (globalThis as any).$fetch = vi.fn().mockResolvedValue([]); + const store = useConnectionStore(); + await store.createGroup({ name: 'Production' }); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/groups', expect.objectContaining({ + method: 'POST', + body: { name: 'Production' }, + })); + }); + }); +}); +``` + +- [ ] **Step 2: Run tests** + +Run: `cd frontend && npx vitest run tests/stores/connection.store.spec.ts` +Expected: 5 tests PASS + +- [ ] **Step 3: Commit** + +```bash +git add frontend/tests/stores/connection.store.spec.ts +git commit -m "test: connection store — host/group CRUD, no auth headers" +``` + +### Task 11: Vault Composable + Admin Middleware Tests + +**Files:** +- Create: `frontend/tests/composables/useVault.spec.ts` +- Create: `frontend/tests/middleware/admin.spec.ts` + +- [ ] **Step 1: Write vault composable tests** + +```typescript +// frontend/tests/composables/useVault.spec.ts +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { useVault } from '../../composables/useVault'; + +describe('useVault', () => { + beforeEach(() => { + vi.resetAllMocks(); + (globalThis as any).$fetch = vi.fn().mockResolvedValue([]); + }); + + it('should list keys without auth header', async () => { + const { listKeys } = useVault(); + await listKeys(); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/ssh-keys'); + const callArgs = (globalThis as any).$fetch.mock.calls[0]; + expect(callArgs[1]?.headers?.Authorization).toBeUndefined(); + }); + + it('should list credentials without auth header', async () => { + const { listCredentials } = useVault(); + await listCredentials(); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/credentials'); + }); + + it('should import key via POST', async () => { + const { importKey } = useVault(); + await importKey({ name: 'key', privateKey: 'pem-data' }); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/ssh-keys', expect.objectContaining({ method: 'POST' })); + }); + + it('should delete key via DELETE', async () => { + const { deleteKey } = useVault(); + await deleteKey(5); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/ssh-keys/5', expect.objectContaining({ method: 'DELETE' })); + }); + + it('should create credential via POST', async () => { + const { createCredential } = useVault(); + await createCredential({ name: 'cred', username: 'admin' }); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/credentials', expect.objectContaining({ method: 'POST' })); + }); + + it('should update credential via PUT', async () => { + const { updateCredential } = useVault(); + await updateCredential(3, { name: 'updated' }); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/credentials/3', expect.objectContaining({ method: 'PUT' })); + }); + + it('should delete credential via DELETE', async () => { + const { deleteCredential } = useVault(); + await deleteCredential(3); + expect((globalThis as any).$fetch).toHaveBeenCalledWith('/api/credentials/3', expect.objectContaining({ method: 'DELETE' })); + }); +}); +``` + +- [ ] **Step 2: Write admin middleware tests** + +```typescript +// frontend/tests/middleware/admin.spec.ts +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +describe('Admin Middleware', () => { + let middleware: any; + + beforeEach(() => { + vi.resetAllMocks(); + (globalThis as any).navigateTo = vi.fn().mockReturnValue('/'); + }); + + it('should redirect non-admin to /', async () => { + (globalThis as any).useAuthStore = vi.fn().mockReturnValue({ isAdmin: false }); + // Re-import to pick up fresh mock + const mod = await import('../../middleware/admin.ts'); + middleware = mod.default; + const result = middleware({} as any, {} as any); + expect(navigateTo).toHaveBeenCalledWith('/'); + }); + + it('should allow admin through', async () => { + (globalThis as any).useAuthStore = vi.fn().mockReturnValue({ isAdmin: true }); + const mod = await import('../../middleware/admin.ts'); + middleware = mod.default; + const result = middleware({} as any, {} as any); + // Should not redirect — returns undefined + expect(result).toBeUndefined(); + }); +}); +``` + +- [ ] **Step 3: Run all frontend tests** + +Run: `cd frontend && npx vitest run` +Expected: ~24 tests PASS + +- [ ] **Step 4: Commit** + +```bash +git add frontend/tests/composables/useVault.spec.ts frontend/tests/middleware/admin.spec.ts +git commit -m "test: vault composable + admin middleware — API calls, auth headers, route guard" +``` + +--- + +## Chunk 5: Integration Verification + Pre-commit Hook + +### Task 12: Run Full Test Suites + +- [ ] **Step 1: Run all backend tests** + +Run: `cd backend && npx jest --verbose` +Expected: ~66 tests PASS across 8 spec files + +- [ ] **Step 2: Run all frontend tests** + +Run: `cd frontend && npx vitest run` +Expected: ~30 tests PASS across 4 spec files + +- [ ] **Step 3: Add test:cov script to backend** + +Add to `backend/package.json` scripts: `"test:cov": "jest --coverage"` + +- [ ] **Step 4: Commit** + +```bash +git add backend/package.json +git commit -m "chore: add test:cov script to backend" +``` + +### Task 13: Final Push + +- [ ] **Step 1: Push everything** + +```bash +git push +``` + +- [ ] **Step 2: Verify test count** + +Run: `cd backend && npx jest --verbose 2>&1 | tail -5` +Run: `cd frontend && npx vitest run 2>&1 | tail -5` + +Report total test count to Commander. diff --git a/docs/screenshots/wraith-final.png b/docs/screenshots/wraith-final.png new file mode 100644 index 0000000000000000000000000000000000000000..674a7d744c02687d03dc6ad353a5e50ce19f3a14 GIT binary patch literal 81409 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 E2Wcicr~m)} literal 0 HcmV?d00001 diff --git a/docs/spikes/multi-window-results.md b/docs/spikes/multi-window-results.md new file mode 100644 index 0000000..083a504 --- /dev/null +++ b/docs/spikes/multi-window-results.md @@ -0,0 +1,129 @@ +# Spike: Multi-Window Support in Wails v3 + +**Status:** Research-based (not yet validated on Windows) +**Date:** 2026-03-17 +**Target platform:** Windows (developing on macOS) +**Wails version:** v3.0.0-alpha.74 + +--- + +## Context + +Wraith needs to support detached sessions — users should be able to pop out +an SSH or RDP session into its own window while the main connection manager +remains open. This spike evaluates three approaches, ranked by preference. + +--- + +## Plan A: Wails v3 Native Multi-Window + +**Status: LIKELY WORKS** based on API documentation. + +### How it works + +- `app.Window.NewWithOptions()` creates a new OS-level window at runtime. +- Each window can load a different URL or frontend route (e.g., + `/session/rdp/3` in one window, `/` in the main window). +- All windows share the same Go backend services — no IPC or inter-process + marshalling required. Bindings registered on the application are callable + from any window. +- Window lifecycle events (`OnClose`, `OnFocus`, etc.) are available for + cleanup. + +### Example (pseudocode) + +```go +win, err := app.Window.NewWithOptions(application.WindowOptions{ + Title: "RDP — server-01", + Width: 1280, + Height: 720, + URL: "/session/rdp/3", +}) +``` + +### Risks + +| Risk | Severity | Mitigation | +|------|----------|------------| +| Alpha API — method signatures may change before v3 stable | Medium | Pin to a known-good alpha tag; wrap calls behind an internal interface so migration is a single-file change. | +| Platform-specific quirks on Windows (DPI, focus, taskbar grouping) | Low | Test on Windows during Phase 2. Wails uses webview2 on Windows which is mature. | +| Window count limits or resource leaks | Low | Cap concurrent detached windows (e.g., 8). Ensure `OnClose` releases resources. | + +--- + +## Plan B: Floating Panels (CSS-based) + +**Status: FALLBACK** — no external dependency, purely frontend. + +### How it works + +- Detached sessions render as draggable, resizable `position: fixed` panels + within the main Wails window. +- Each panel contains its own Vue component instance (terminal emulator or + RDP canvas). +- Panels can be minimised, maximised within the viewport, or snapped to + edges. + +### Pros + +- Zero dependency on Wails multi-window API. +- Works on any platform without additional testing. +- Simpler state management — everything lives in one window context. + +### Cons + +- Sessions share the same viewport — limited screen real estate. +- Cannot span multiple monitors. +- Feels less native than real OS windows. + +### Implementation cost + +Small. Requires a `` wrapper component with drag/resize +handlers. Libraries like `vue3-draggable-resizable` exist but a lightweight +custom implementation (~150 LOC) is preferable to avoid dependency churn. + +--- + +## Plan C: Browser Mode + +**Status: EMERGENCY** — last resort if both Plan A and Plan B are inadequate. + +### How it works + +- Wails v3 supports a server mode where the frontend is served over HTTP on + `localhost`. +- Detached sessions open in the user's default browser via + `open(url, '_blank')` or `runtime.BrowserOpenURL()`. +- The browser tab communicates with Go services through the same HTTP + endpoint. + +### Pros + +- Guaranteed to work — it is just a web page. +- Users can arrange tabs freely across monitors. + +### Cons + +- Breaks the desktop-app experience. +- Browser tabs lack access to Wails runtime bindings; all communication must + go through HTTP/WebSocket, requiring a parallel transport layer. +- Security surface increases — localhost HTTP server is accessible to other + local processes. + +--- + +## Recommendation + +**Start with Plan A.** The Wails v3 `NewWithOptions` API is documented and +consistent with how other multi-window desktop frameworks (Electron, +Tauri v2) work. The alpha stability risk is mitigated by wrapping calls +behind an internal interface. + +If Plan A fails during Windows validation, **Plan B requires only frontend +CSS changes** — no backend work is wasted. Plan C is reserved for scenarios +where neither A nor B is viable. + +## Next Step + +Validate Plan A on Windows during Phase 2 when SSH sessions exist and there +is a real payload to render in a second window. diff --git a/docs/spikes/rdp-frame-transport-results.md b/docs/spikes/rdp-frame-transport-results.md new file mode 100644 index 0000000..febf9e8 --- /dev/null +++ b/docs/spikes/rdp-frame-transport-results.md @@ -0,0 +1,171 @@ +# Spike: RDP Frame Transport Mechanisms + +**Status:** Research-based (not yet benchmarked) +**Date:** 2026-03-17 +**Target platform:** Windows (developing on macOS) +**Wails version:** v3.0.0-alpha.74 + +--- + +## Context + +When Wraith connects to a remote desktop via FreeRDP, the Go backend +receives raw bitmap frames that must be delivered to the frontend for +rendering on an HTML ``. This spike evaluates three transport +approaches, estimating throughput for a 1920x1080 session at 30 fps. + +--- + +## Approach 1: Local HTTP Endpoint + +### How it works + +1. Go spins up a local HTTP server on a random high port + (`net.Listen("tcp", "127.0.0.1:0")`). +2. Each frame is JPEG-encoded and served at a predictable URL + (e.g., `http://127.0.0.1:{port}/frame?session=3`). +3. The frontend fetches frames via `fetch()`, `` tag, or + `ReadableStream` for chunked delivery. + +### Throughput estimate + +| Metric | Value | +|--------|-------| +| 1080p RGBA raw | ~8 MB/frame | +| 1080p JPEG (quality 80) | ~100-200 KB/frame | +| At 30 fps (JPEG) | ~3-6 MB/s | +| Loopback bandwidth | >1 GB/s | + +Loopback HTTP can handle this with headroom to spare. + +### Pros + +- No base64 overhead — binary JPEG bytes transfer directly. +- Standard HTTP semantics; easy to debug with browser DevTools. +- Can use `Transfer-Encoding: chunked` or Server-Sent Events for + push-based delivery. +- Can serve multiple sessions on the same server with different paths. + +### Cons + +- Requires an extra listening port on localhost. +- Potential firewall or endpoint-security issues on locked-down Windows + enterprise machines. +- Slightly more complex setup (port allocation, CORS headers for Wails + webview origin). + +--- + +## Approach 2: Wails Bindings (Base64) + +### How it works + +1. Go encodes each frame as a JPEG, then base64-encodes the result. +2. A Wails-bound method (`SessionService.GetFrame(sessionID)`) returns the + base64 string. +3. The frontend decodes the string, creates an `ImageBitmap` or sets it as a + data URI, and draws it on a ``. + +### Throughput estimate + +| Metric | Value | +|--------|-------| +| 1080p JPEG (quality 80) | ~100-200 KB/frame | +| Base64 of JPEG (+33%) | ~133-270 KB/frame | +| At 30 fps | ~4-8 MB/s of string data | +| Wails IPC overhead | Negligible for this payload size | + +This is feasible. Modern JavaScript engines handle base64 decoding at +several hundred MB/s. + +### Pros + +- No extra ports — everything flows through the existing Wails IPC channel. +- Works out of the box with Wails bindings; no additional infrastructure. +- No firewall concerns. + +### Cons + +- 33% base64 size overhead on every frame. +- CPU cost of `base64.StdEncoding.EncodeToString()` in Go and `atob()` in + JS on every frame (though both are fast). +- Polling-based unless combined with Wails events to signal frame + availability. +- May bottleneck at very high resolutions (4K) or high FPS (60+). + +--- + +## Approach 3: Wails Events (Streaming) + +### How it works + +1. Go emits each frame as a Wails event: + `app.EmitEvent("frame:3", base64JpegString)`. +2. The frontend subscribes: `wails.Events.On("frame:3", handler)`. +3. The handler decodes and renders on canvas. + +### Throughput estimate + +Same as Approach 2 — the payload is identical (base64 JPEG). The difference +is delivery mechanism (push vs. pull). + +### Pros + +- Push-based — the frontend receives frames as soon as they are available + with no polling delay. +- Natural Wails pattern; aligns with how other real-time data (connection + status, notifications) already flows. + +### Cons + +- Same 33% base64 overhead as Approach 2. +- Wails event bus may not be optimised for high-frequency, large-payload + events. This is unvalidated. +- Harder to apply backpressure — if the frontend cannot keep up, events + queue without flow control. + +--- + +## Throughput Summary + +| Approach | Payload/frame | 30 fps throughput | Extra infra | +|----------|--------------|-------------------|-------------| +| 1 — Local HTTP | ~150 KB (binary JPEG) | ~4.5 MB/s | Localhost port | +| 2 — Wails bindings | ~200 KB (base64 JPEG) | ~6 MB/s | None | +| 3 — Wails events | ~200 KB (base64 JPEG) | ~6 MB/s | None | + +All three approaches are within comfortable limits for 1080p at 30 fps. +The differentiator is operational simplicity, not raw throughput. + +--- + +## Recommendation + +**Start with Approach 2 (base64 JPEG via Wails bindings).** + +Rationale: + +1. JPEG compression brings 1080p frames down to ~200 KB, making the 33% + base64 overhead manageable (~6 MB/s at 30 fps). +2. No extra ports or firewall concerns — important for enterprise Windows + environments where Wraith will be deployed. +3. Simple implementation: one Go method, one frontend call per frame. +4. If polling latency is a problem, upgrade to Approach 3 (events) with + minimal code change — the payload encoding is identical. + +**If benchmarking reveals issues** (dropped frames, high CPU from +encoding), fall back to Approach 1 (local HTTP) which eliminates base64 +overhead entirely. The migration path is straightforward: replace the +`fetch(dataUri)` call with `fetch(httpUrl)`. + +--- + +## Next Step + +Benchmark during Phase 3 when FreeRDP integration is in progress and real +frame data is available. Key metrics to capture: + +- End-to-end frame latency (Go encode to canvas paint) +- CPU utilisation on both Go and browser sides +- Frame drop rate at 30 fps and 60 fps +- Memory pressure from base64 string allocation/GC diff --git a/docs/superpowers/plans/2026-03-12-wraith-build.md b/docs/superpowers/plans/2026-03-12-wraith-build.md new file mode 100644 index 0000000..61a591d --- /dev/null +++ b/docs/superpowers/plans/2026-03-12-wraith-build.md @@ -0,0 +1,3931 @@ +# Wraith Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build Wraith — a self-hosted MobaXterm replacement providing SSH+SFTP+RDP in a browser, deployed as a Docker stack. + +**Architecture:** Monorepo with `backend/` (NestJS 10, Prisma, ssh2, guacamole tunnel) and `frontend/` (Nuxt 3 SPA, xterm.js, Monaco, guacamole-common-js, PrimeVue 4). Single Docker container serves both API and static frontend. WebSocket gateways handle real-time terminal/SFTP/RDP data channels. + +**Tech Stack:** NestJS 10, Prisma 6, PostgreSQL 16, ssh2, guacd, Nuxt 3 (SPA mode), xterm.js 5, Monaco Editor, guacamole-common-js, PrimeVue 4, Tailwind CSS, Pinia + +**Spec:** `docs/superpowers/specs/2026-03-12-vigilance-remote-lean-design.md` + +--- + +## File Structure + +``` +wraith/ +├── docker-compose.yml +├── Dockerfile +├── .env.example +├── .gitignore +├── README.md +├── backend/ +│ ├── package.json +│ ├── tsconfig.json +│ ├── tsconfig.build.json +│ ├── nest-cli.json +│ ├── prisma/ +│ │ ├── schema.prisma +│ │ └── seed.ts +│ ├── src/ +│ │ ├── main.ts +│ │ ├── app.module.ts +│ │ ├── prisma/ +│ │ │ ├── prisma.service.ts +│ │ │ └── prisma.module.ts +│ │ ├── auth/ +│ │ │ ├── auth.module.ts +│ │ │ ├── auth.service.ts +│ │ │ ├── auth.controller.ts +│ │ │ ├── jwt.strategy.ts +│ │ │ ├── jwt-auth.guard.ts +│ │ │ ├── ws-auth.guard.ts +│ │ │ └── dto/ +│ │ │ └── login.dto.ts +│ │ ├── vault/ +│ │ │ ├── vault.module.ts +│ │ │ ├── encryption.service.ts +│ │ │ ├── credentials.service.ts +│ │ │ ├── credentials.controller.ts +│ │ │ ├── ssh-keys.service.ts +│ │ │ ├── ssh-keys.controller.ts +│ │ │ └── dto/ +│ │ │ ├── create-credential.dto.ts +│ │ │ ├── update-credential.dto.ts +│ │ │ ├── create-ssh-key.dto.ts +│ │ │ └── update-ssh-key.dto.ts +│ │ ├── connections/ +│ │ │ ├── connections.module.ts +│ │ │ ├── hosts.service.ts +│ │ │ ├── hosts.controller.ts +│ │ │ ├── groups.service.ts +│ │ │ ├── groups.controller.ts +│ │ │ └── dto/ +│ │ │ ├── create-host.dto.ts +│ │ │ ├── update-host.dto.ts +│ │ │ ├── create-group.dto.ts +│ │ │ └── update-group.dto.ts +│ │ ├── terminal/ +│ │ │ ├── terminal.module.ts +│ │ │ ├── terminal.gateway.ts +│ │ │ ├── sftp.gateway.ts +│ │ │ └── ssh-connection.service.ts +│ │ ├── rdp/ +│ │ │ ├── rdp.module.ts +│ │ │ ├── rdp.gateway.ts +│ │ │ └── guacamole.service.ts +│ │ └── settings/ +│ │ ├── settings.module.ts +│ │ ├── settings.service.ts +│ │ └── settings.controller.ts +│ └── test/ +│ ├── encryption.service.spec.ts +│ └── auth.service.spec.ts +├── frontend/ +│ ├── package.json +│ ├── nuxt.config.ts +│ ├── tailwind.config.ts +│ ├── app.vue +│ ├── assets/ +│ │ └── css/ +│ │ └── main.css +│ ├── layouts/ +│ │ ├── default.vue +│ │ └── auth.vue +│ ├── pages/ +│ │ ├── index.vue +│ │ ├── login.vue +│ │ ├── vault/ +│ │ │ ├── index.vue +│ │ │ ├── keys.vue +│ │ │ └── credentials.vue +│ │ └── settings.vue +│ ├── components/ +│ │ ├── connections/ +│ │ │ ├── HostTree.vue +│ │ │ ├── HostCard.vue +│ │ │ ├── HostEditDialog.vue +│ │ │ ├── GroupEditDialog.vue +│ │ │ └── QuickConnect.vue +│ │ ├── session/ +│ │ │ ├── SessionContainer.vue +│ │ │ └── SessionTab.vue +│ │ ├── terminal/ +│ │ │ ├── TerminalInstance.vue +│ │ │ ├── TerminalTabs.vue +│ │ │ └── SplitPane.vue +│ │ ├── sftp/ +│ │ │ ├── SftpSidebar.vue +│ │ │ ├── FileTree.vue +│ │ │ ├── FileEditor.vue +│ │ │ └── TransferStatus.vue +│ │ ├── rdp/ +│ │ │ ├── RdpCanvas.vue +│ │ │ └── RdpToolbar.vue +│ │ └── vault/ +│ │ ├── KeyImportDialog.vue +│ │ └── CredentialForm.vue +│ ├── composables/ +│ │ ├── useTerminal.ts +│ │ ├── useSftp.ts +│ │ ├── useRdp.ts +│ │ ├── useVault.ts +│ │ └── useConnections.ts +│ └── stores/ +│ ├── auth.store.ts +│ ├── session.store.ts +│ └── connection.store.ts +└── docs/ + └── superpowers/ + ├── specs/ + │ └── 2026-03-12-vigilance-remote-lean-design.md + └── plans/ + └── 2026-03-12-wraith-build.md +``` + +--- + +## Chunk 1: Foundation (Phase 1) + +### Task 1: Project Scaffold + Docker + +**Files:** +- Create: `.gitignore`, `.env.example`, `docker-compose.yml`, `Dockerfile`, `README.md` +- Create: `backend/package.json`, `backend/tsconfig.json`, `backend/tsconfig.build.json`, `backend/nest-cli.json` +- Create: `frontend/package.json`, `frontend/nuxt.config.ts`, `frontend/tailwind.config.ts` + +- [ ] **Step 1: Initialize git repo** + +```bash +cd /Users/vstockwell/repos/RDP-SSH-Client +git init +``` + +- [ ] **Step 2: Create `.gitignore`** + +```gitignore +node_modules/ +dist/ +.output/ +.nuxt/ +.env +*.log +.DS_Store +backend/prisma/*.db +``` + +- [ ] **Step 3: Create `.env.example`** + +```env +DB_PASSWORD=changeme +JWT_SECRET=generate-a-64-char-hex-string +ENCRYPTION_KEY=generate-a-64-char-hex-string +``` + +- [ ] **Step 4: Create `docker-compose.yml`** + +```yaml +services: + app: + build: . + ports: ["3000:3000"] + environment: + DATABASE_URL: postgresql://wraith:${DB_PASSWORD}@postgres:5432/wraith + JWT_SECRET: ${JWT_SECRET} + ENCRYPTION_KEY: ${ENCRYPTION_KEY} + GUACD_HOST: guacd + GUACD_PORT: "4822" + depends_on: + postgres: + condition: service_healthy + guacd: + condition: service_started + restart: unless-stopped + + guacd: + image: guacamole/guacd + restart: always + + postgres: + image: postgres:16-alpine + volumes: [pgdata:/var/lib/postgresql/data] + environment: + POSTGRES_DB: wraith + POSTGRES_USER: wraith + POSTGRES_PASSWORD: ${DB_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U wraith"] + interval: 5s + timeout: 3s + retries: 5 + +volumes: + pgdata: +``` + +- [ ] **Step 5: Create `Dockerfile`** + +Multi-stage build: frontend → static, backend → NestJS, production → serve both. + +```dockerfile +# Stage 1: Frontend build +FROM node:20-alpine AS frontend +WORKDIR /app/frontend +COPY frontend/package*.json ./ +RUN npm ci +COPY frontend/ ./ +RUN npx nuxi generate + +# Stage 2: Backend build +FROM node:20-alpine AS backend +WORKDIR /app/backend +COPY backend/package*.json ./ +RUN npm ci +COPY backend/ ./ +RUN npx prisma generate +RUN npm run build + +# Stage 3: Production +FROM node:20-alpine +WORKDIR /app +COPY --from=backend /app/backend/dist ./dist +COPY --from=backend /app/backend/node_modules ./node_modules +COPY --from=backend /app/backend/package.json ./ +COPY --from=backend /app/backend/prisma ./prisma +COPY --from=frontend /app/frontend/.output/public ./public +EXPOSE 3000 +CMD ["node", "dist/main.js"] +``` + +- [ ] **Step 6: Create `backend/package.json`** + +```json +{ + "name": "wraith-backend", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "nest build", + "start": "node dist/main.js", + "dev": "nest start --watch", + "test": "jest", + "test:watch": "jest --watch", + "prisma:migrate": "prisma migrate dev", + "prisma:generate": "prisma generate", + "prisma:seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/jwt": "^10.0.0", + "@nestjs/passport": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/platform-ws": "^10.0.0", + "@nestjs/serve-static": "^4.0.0", + "@nestjs/websockets": "^10.0.0", + "@prisma/client": "^6.0.0", + "bcrypt": "^5.1.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "reflect-metadata": "^0.2.0", + "rxjs": "^7.8.0", + "ssh2": "^1.15.0", + "ws": "^8.16.0" + }, + "devDependencies": { + "@nestjs/cli": "^10.0.0", + "@nestjs/testing": "^10.0.0", + "@types/bcrypt": "^5.0.0", + "@types/node": "^20.0.0", + "@types/passport-jwt": "^4.0.0", + "@types/ssh2": "^1.15.0", + "@types/ws": "^8.5.0", + "jest": "^29.0.0", + "prisma": "^6.0.0", + "ts-jest": "^29.0.0", + "ts-node": "^10.9.0", + "typescript": "^5.3.0" + }, + "jest": { + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testRegex": ".*\\.spec\\.ts$", + "transform": { "^.+\\.ts$": "ts-jest" }, + "testEnvironment": "node", + "moduleNameMapper": { + "^@/(.*)$": "/src/$1" + } + } +} +``` + +- [ ] **Step 7: Create `backend/tsconfig.json` and `backend/tsconfig.build.json`** + +`tsconfig.json`: +```json +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "paths": { "@/*": ["src/*"] } + } +} +``` + +`tsconfig.build.json`: +```json +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*.spec.ts"] +} +``` + +`nest-cli.json`: +```json +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} +``` + +- [ ] **Step 8: Create `frontend/package.json`** + +```json +{ + "name": "wraith-frontend", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "nuxi dev", + "build": "nuxi generate", + "preview": "nuxi preview" + }, + "dependencies": { + "@pinia/nuxt": "^0.5.0", + "@primevue/themes": "^4.0.0", + "guacamole-common-js": "^1.5.0", + "lucide-vue-next": "^0.300.0", + "monaco-editor": "^0.45.0", + "pinia": "^2.1.0", + "primevue": "^4.0.0", + "@xterm/xterm": "^5.4.0", + "@xterm/addon-fit": "^0.10.0", + "@xterm/addon-search": "^0.15.0", + "@xterm/addon-web-links": "^0.11.0", + "@xterm/addon-webgl": "^0.18.0" + }, + "devDependencies": { + "@nuxtjs/tailwindcss": "^6.0.0", + "@primevue/nuxt-module": "^4.0.0", + "nuxt": "^3.10.0", + "typescript": "^5.3.0" + } +} +``` + +- [ ] **Step 9: Create `frontend/nuxt.config.ts`** + +```typescript +export default defineNuxtConfig({ + ssr: false, + devtools: { enabled: false }, + modules: [ + '@pinia/nuxt', + '@nuxtjs/tailwindcss', + '@primevue/nuxt-module', + ], + css: ['~/assets/css/main.css'], + primevue: { + options: { + theme: 'none', + }, + }, + runtimeConfig: { + public: { + apiBase: process.env.API_BASE || 'http://localhost:3000', + }, + }, + devServer: { + port: 3001, + }, + nitro: { + devProxy: { + '/api': { target: 'http://localhost:3000/api', ws: true }, + '/ws': { target: 'ws://localhost:3000/ws', ws: true }, + }, + }, +}) +``` + +- [ ] **Step 10: Create `frontend/tailwind.config.ts`** + +```typescript +import type { Config } from 'tailwindcss' + +export default { + content: [ + './components/**/*.vue', + './layouts/**/*.vue', + './pages/**/*.vue', + './composables/**/*.ts', + './app.vue', + ], + darkMode: 'class', + theme: { + extend: { + colors: { + wraith: { + 50: '#f0f4ff', + 100: '#dbe4ff', + 200: '#bac8ff', + 300: '#91a7ff', + 400: '#748ffc', + 500: '#5c7cfa', + 600: '#4c6ef5', + 700: '#4263eb', + 800: '#3b5bdb', + 900: '#364fc7', + 950: '#1e3a8a', + }, + }, + }, + }, + plugins: [], +} satisfies Config +``` + +- [ ] **Step 11: Create frontend shell files** + +`frontend/app.vue`: +```vue + +``` + +`frontend/assets/css/main.css`: +```css +@tailwind base; +@tailwind components; +@tailwind utilities; + +html, body, #__nuxt { + @apply h-full bg-gray-900 text-gray-100; +} +``` + +`frontend/layouts/auth.vue`: +```vue + +``` + +- [ ] **Step 12: Commit scaffold** + +```bash +git add -A +git commit -m "feat: project scaffold — Docker, NestJS, Nuxt 3, Prisma config" +``` + +--- + +### Task 2: Prisma Schema + Backend Bootstrap + +**Files:** +- Create: `backend/prisma/schema.prisma` +- Create: `backend/src/main.ts`, `backend/src/app.module.ts` +- Create: `backend/src/prisma/prisma.service.ts`, `backend/src/prisma/prisma.module.ts` + +- [ ] **Step 1: Create `backend/prisma/schema.prisma`** + +Full schema from spec Section 5 — 7 models, 2 enums. Copy verbatim from spec: + +```prisma +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + passwordHash String @map("password_hash") + displayName String? @map("display_name") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("users") +} + +model HostGroup { + id Int @id @default(autoincrement()) + name String + parentId Int? @map("parent_id") + sortOrder Int @default(0) @map("sort_order") + parent HostGroup? @relation("GroupTree", fields: [parentId], references: [id], onDelete: SetNull) + children HostGroup[] @relation("GroupTree") + hosts Host[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("host_groups") +} + +model Host { + id Int @id @default(autoincrement()) + name String + hostname String + port Int @default(22) + protocol Protocol @default(ssh) + groupId Int? @map("group_id") + credentialId Int? @map("credential_id") + tags String[] @default([]) + notes String? + color String? @db.VarChar(7) + sortOrder Int @default(0) @map("sort_order") + hostFingerprint String? @map("host_fingerprint") + lastConnectedAt DateTime? @map("last_connected_at") + group HostGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull) + credential Credential? @relation(fields: [credentialId], references: [id], onDelete: SetNull) + connectionLogs ConnectionLog[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("hosts") +} + +model Credential { + id Int @id @default(autoincrement()) + name String + username String? + domain String? + type CredentialType + encryptedValue String? @map("encrypted_value") + sshKeyId Int? @map("ssh_key_id") + sshKey SshKey? @relation(fields: [sshKeyId], references: [id], onDelete: SetNull) + hosts Host[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("credentials") +} + +model SshKey { + id Int @id @default(autoincrement()) + name String + keyType String @map("key_type") @db.VarChar(20) + fingerprint String? + publicKey String? @map("public_key") + encryptedPrivateKey String @map("encrypted_private_key") + passphraseEncrypted String? @map("passphrase_encrypted") + credentials Credential[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("ssh_keys") +} + +model ConnectionLog { + id Int @id @default(autoincrement()) + hostId Int @map("host_id") + protocol Protocol + connectedAt DateTime @default(now()) @map("connected_at") + disconnectedAt DateTime? @map("disconnected_at") + host Host @relation(fields: [hostId], references: [id], onDelete: Cascade) + + @@map("connection_logs") +} + +model Setting { + key String @id + value String + + @@map("settings") +} + +enum Protocol { + ssh + rdp +} + +enum CredentialType { + password + ssh_key +} +``` + +- [ ] **Step 2: Create Prisma service + module** + +`backend/src/prisma/prisma.service.ts`: +```typescript +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { PrismaClient } from '@prisma/client'; + +@Injectable() +export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { + async onModuleInit() { + await this.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } +} +``` + +`backend/src/prisma/prisma.module.ts`: +```typescript +import { Global, Module } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService], +}) +export class PrismaModule {} +``` + +- [ ] **Step 3: Create `backend/src/main.ts`** + +```typescript +import { NestFactory } from '@nestjs/core'; +import { ValidationPipe } from '@nestjs/common'; +import { WsAdapter } from '@nestjs/platform-ws'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + app.setGlobalPrefix('api'); + app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true })); + app.useWebSocketAdapter(new WsAdapter(app)); + app.enableCors({ + origin: process.env.NODE_ENV === 'production' ? false : 'http://localhost:3001', + credentials: true, + }); + await app.listen(3000); + console.log('Wraith backend running on port 3000'); +} +bootstrap(); +``` + +- [ ] **Step 4: Create `backend/src/app.module.ts`** (initial — will grow as modules are added) + +```typescript +import { Module } from '@nestjs/common'; +import { ServeStaticModule } from '@nestjs/serve-static'; +import { join } from 'path'; +import { PrismaModule } from './prisma/prisma.module'; + +@Module({ + imports: [ + PrismaModule, + ServeStaticModule.forRoot({ + rootPath: join(__dirname, '..', 'public'), + exclude: ['/api/(.*)'], + }), + ], +}) +export class AppModule {} +``` + +- [ ] **Step 5: Install backend dependencies and generate Prisma client** + +```bash +cd backend && npm install +npx prisma generate +``` + +- [ ] **Step 6: Commit** + +```bash +git add -A +git commit -m "feat: Prisma schema (7 models) + NestJS bootstrap" +``` + +--- + +### Task 3: Encryption Service + +**Files:** +- Create: `backend/src/vault/encryption.service.ts` +- Create: `backend/src/vault/vault.module.ts` +- Create: `backend/test/encryption.service.spec.ts` + +This is a critical security component. Full code required. + +- [ ] **Step 1: Write encryption service tests** + +`backend/test/encryption.service.spec.ts`: +```typescript +import { EncryptionService } from '../src/vault/encryption.service'; + +describe('EncryptionService', () => { + let service: EncryptionService; + + beforeEach(() => { + // 32-byte key as 64-char hex string + process.env.ENCRYPTION_KEY = 'a'.repeat(64); + service = new EncryptionService(); + }); + + it('encrypts and decrypts a string', () => { + const plaintext = 'my-secret-password'; + const encrypted = service.encrypt(plaintext); + expect(encrypted).not.toEqual(plaintext); + expect(encrypted.startsWith('v1:')).toBe(true); + expect(service.decrypt(encrypted)).toEqual(plaintext); + }); + + it('produces different ciphertext for same plaintext (random IV)', () => { + const plaintext = 'same-input'; + const a = service.encrypt(plaintext); + const b = service.encrypt(plaintext); + expect(a).not.toEqual(b); + expect(service.decrypt(a)).toEqual(plaintext); + expect(service.decrypt(b)).toEqual(plaintext); + }); + + it('throws on tampered ciphertext', () => { + const encrypted = service.encrypt('test'); + const parts = encrypted.split(':'); + parts[3] = 'ff' + parts[3].slice(2); // tamper ciphertext + expect(() => service.decrypt(parts.join(':'))).toThrow(); + }); + + it('handles empty string', () => { + const encrypted = service.encrypt(''); + expect(service.decrypt(encrypted)).toEqual(''); + }); + + it('handles unicode', () => { + const plaintext = 'p@$$w0rd-日本語-🔑'; + const encrypted = service.encrypt(plaintext); + expect(service.decrypt(encrypted)).toEqual(plaintext); + }); +}); +``` + +- [ ] **Step 2: Run tests — verify they fail** + +```bash +cd backend && npx jest test/encryption.service.spec.ts +``` + +Expected: FAIL — module not found. + +- [ ] **Step 3: Implement encryption service** + +`backend/src/vault/encryption.service.ts`: +```typescript +import { Injectable } from '@nestjs/common'; +import { createCipheriv, createDecipheriv, randomBytes } from 'crypto'; + +@Injectable() +export class EncryptionService { + private readonly algorithm = 'aes-256-gcm'; + private readonly key: Buffer; + + constructor() { + const hex = process.env.ENCRYPTION_KEY; + if (!hex || hex.length < 64) { + throw new Error('ENCRYPTION_KEY must be a 64-char hex string (32 bytes)'); + } + this.key = Buffer.from(hex.slice(0, 64), 'hex'); + } + + encrypt(plaintext: string): string { + const iv = randomBytes(16); + const cipher = createCipheriv(this.algorithm, this.key, iv); + const encrypted = Buffer.concat([ + cipher.update(plaintext, 'utf8'), + cipher.final(), + ]); + const authTag = cipher.getAuthTag(); + return `v1:${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted.toString('hex')}`; + } + + decrypt(encrypted: string): string { + const [version, ivHex, authTagHex, ciphertextHex] = encrypted.split(':'); + if (version !== 'v1') throw new Error(`Unknown encryption version: ${version}`); + const iv = Buffer.from(ivHex, 'hex'); + const authTag = Buffer.from(authTagHex, 'hex'); + const ciphertext = Buffer.from(ciphertextHex, 'hex'); + const decipher = createDecipheriv(this.algorithm, this.key, iv); + decipher.setAuthTag(authTag); + return Buffer.concat([ + decipher.update(ciphertext), + decipher.final(), + ]).toString('utf8'); + } +} +``` + +- [ ] **Step 4: Create vault module** + +`backend/src/vault/vault.module.ts`: +```typescript +import { Module } from '@nestjs/common'; +import { EncryptionService } from './encryption.service'; + +@Module({ + providers: [EncryptionService], + exports: [EncryptionService], +}) +export class VaultModule {} +``` + +- [ ] **Step 5: Run tests — verify they pass** + +```bash +cd backend && npx jest test/encryption.service.spec.ts --verbose +``` + +Expected: 5 tests PASS. + +- [ ] **Step 6: Commit** + +```bash +git add -A +git commit -m "feat: AES-256-GCM encryption service with tests" +``` + +--- + +### Task 4: Auth Module + +**Files:** +- Create: `backend/src/auth/auth.module.ts`, `auth.service.ts`, `auth.controller.ts` +- Create: `backend/src/auth/jwt.strategy.ts`, `jwt-auth.guard.ts`, `ws-auth.guard.ts` +- Create: `backend/src/auth/dto/login.dto.ts` +- Create: `backend/test/auth.service.spec.ts` +- Create: `backend/prisma/seed.ts` + +- [ ] **Step 1: Write auth service tests** + +`backend/test/auth.service.spec.ts`: +```typescript +import { JwtService } from '@nestjs/jwt'; +import { AuthService } from '../src/auth/auth.service'; +import * as bcrypt from 'bcrypt'; + +describe('AuthService', () => { + let service: AuthService; + const mockPrisma = { + user: { + findUnique: jest.fn(), + count: jest.fn(), + create: jest.fn(), + }, + }; + const mockJwt = { + sign: jest.fn().mockReturnValue('mock-jwt-token'), + }; + + beforeEach(() => { + service = new AuthService(mockPrisma as any, mockJwt as any); + jest.clearAllMocks(); + }); + + it('returns token for valid credentials', async () => { + const hash = await bcrypt.hash('password123', 10); + mockPrisma.user.findUnique.mockResolvedValue({ + id: 1, + email: 'admin@wraith.local', + passwordHash: hash, + displayName: 'Admin', + }); + + const result = await service.login('admin@wraith.local', 'password123'); + expect(result).toEqual({ + access_token: 'mock-jwt-token', + user: { id: 1, email: 'admin@wraith.local', displayName: 'Admin' }, + }); + }); + + it('throws on wrong password', async () => { + const hash = await bcrypt.hash('correct', 10); + mockPrisma.user.findUnique.mockResolvedValue({ + id: 1, + email: 'admin@wraith.local', + passwordHash: hash, + }); + + await expect(service.login('admin@wraith.local', 'wrong')) + .rejects.toThrow('Invalid credentials'); + }); + + it('throws on unknown user', async () => { + mockPrisma.user.findUnique.mockResolvedValue(null); + await expect(service.login('nobody@wraith.local', 'pass')) + .rejects.toThrow('Invalid credentials'); + }); +}); +``` + +- [ ] **Step 2: Run tests — verify fail** + +- [ ] **Step 3: Implement auth service** + +`backend/src/auth/auth.service.ts`: +```typescript +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { PrismaService } from '../prisma/prisma.service'; +import * as bcrypt from 'bcrypt'; + +@Injectable() +export class AuthService { + constructor( + private prisma: PrismaService, + private jwt: JwtService, + ) {} + + async login(email: string, password: string) { + const user = await this.prisma.user.findUnique({ where: { email } }); + if (!user) throw new UnauthorizedException('Invalid credentials'); + + const valid = await bcrypt.compare(password, user.passwordHash); + if (!valid) throw new UnauthorizedException('Invalid credentials'); + + const payload = { sub: user.id, email: user.email }; + return { + access_token: this.jwt.sign(payload), + user: { id: user.id, email: user.email, displayName: user.displayName }, + }; + } + + async getProfile(userId: number) { + const user = await this.prisma.user.findUnique({ where: { id: userId } }); + if (!user) throw new UnauthorizedException(); + return { id: user.id, email: user.email, displayName: user.displayName }; + } +} +``` + +- [ ] **Step 4: Implement auth controller** + +`backend/src/auth/auth.controller.ts`: +```typescript +import { Controller, Post, Get, Body, Request, UseGuards } from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { JwtAuthGuard } from './jwt-auth.guard'; +import { LoginDto } from './dto/login.dto'; + +@Controller('auth') +export class AuthController { + constructor(private auth: AuthService) {} + + @Post('login') + login(@Body() dto: LoginDto) { + return this.auth.login(dto.email, dto.password); + } + + @UseGuards(JwtAuthGuard) + @Get('profile') + getProfile(@Request() req: any) { + return this.auth.getProfile(req.user.sub); + } +} +``` + +`backend/src/auth/dto/login.dto.ts`: +```typescript +import { IsEmail, IsString, MinLength } from 'class-validator'; + +export class LoginDto { + @IsEmail() + email: string; + + @IsString() + @MinLength(1) + password: string; +} +``` + +- [ ] **Step 5: Implement JWT strategy + guards** + +`backend/src/auth/jwt.strategy.ts`: +```typescript +import { Injectable } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor() { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: process.env.JWT_SECRET, + }); + } + + validate(payload: { sub: number; email: string }) { + return { sub: payload.sub, email: payload.email }; + } +} +``` + +`backend/src/auth/jwt-auth.guard.ts`: +```typescript +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class JwtAuthGuard extends AuthGuard('jwt') {} +``` + +`backend/src/auth/ws-auth.guard.ts`: +```typescript +import { Injectable } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { WsException } from '@nestjs/websockets'; + +@Injectable() +export class WsAuthGuard { + constructor(private jwt: JwtService) {} + + validateClient(client: any): { sub: number; email: string } | null { + try { + const url = new URL(client.url || client._url, 'http://localhost'); + const token = url.searchParams.get('token'); + if (!token) throw new WsException('No token'); + return this.jwt.verify(token); + } catch { + return null; + } + } +} +``` + +- [ ] **Step 6: Implement auth module** + +`backend/src/auth/auth.module.ts`: +```typescript +import { Module } from '@nestjs/common'; +import { JwtModule } from '@nestjs/jwt'; +import { PassportModule } from '@nestjs/passport'; +import { AuthService } from './auth.service'; +import { AuthController } from './auth.controller'; +import { JwtStrategy } from './jwt.strategy'; +import { WsAuthGuard } from './ws-auth.guard'; + +@Module({ + imports: [ + PassportModule, + JwtModule.register({ + secret: process.env.JWT_SECRET, + signOptions: { expiresIn: '7d' }, + }), + ], + providers: [AuthService, JwtStrategy, WsAuthGuard], + controllers: [AuthController], + exports: [WsAuthGuard, JwtModule], +}) +export class AuthModule {} +``` + +- [ ] **Step 7: Create seed script** + +`backend/prisma/seed.ts`: +```typescript +import { PrismaClient } from '@prisma/client'; +import * as bcrypt from 'bcrypt'; + +const prisma = new PrismaClient(); + +async function main() { + const hash = await bcrypt.hash('wraith', 10); + await prisma.user.upsert({ + where: { email: 'admin@wraith.local' }, + update: {}, + create: { + email: 'admin@wraith.local', + passwordHash: hash, + displayName: 'Admin', + }, + }); + console.log('Seed complete: admin@wraith.local / wraith'); +} + +main() + .catch(console.error) + .finally(() => prisma.$disconnect()); +``` + +Add to `backend/package.json`: +```json +"prisma": { + "seed": "ts-node prisma/seed.ts" +} +``` + +- [ ] **Step 8: Update app.module.ts — register AuthModule + VaultModule** + +```typescript +import { Module } from '@nestjs/common'; +import { ServeStaticModule } from '@nestjs/serve-static'; +import { join } from 'path'; +import { PrismaModule } from './prisma/prisma.module'; +import { AuthModule } from './auth/auth.module'; +import { VaultModule } from './vault/vault.module'; + +@Module({ + imports: [ + PrismaModule, + AuthModule, + VaultModule, + ServeStaticModule.forRoot({ + rootPath: join(__dirname, '..', 'public'), + exclude: ['/api/(.*)'], + }), + ], +}) +export class AppModule {} +``` + +- [ ] **Step 9: Run tests — verify pass** + +```bash +cd backend && npx jest --verbose +``` + +Expected: all encryption + auth tests pass. + +- [ ] **Step 10: Commit** + +```bash +git add -A +git commit -m "feat: auth module — JWT login, guards, seed user" +``` + +--- + +### Task 5: Connection Manager Backend + +**Files:** +- Create: `backend/src/connections/connections.module.ts` +- Create: `backend/src/connections/hosts.service.ts`, `hosts.controller.ts` +- Create: `backend/src/connections/groups.service.ts`, `groups.controller.ts` +- Create: `backend/src/connections/dto/*.ts` + +- [ ] **Step 1: Create DTOs** + +`backend/src/connections/dto/create-host.dto.ts`: +```typescript +import { IsString, IsInt, IsOptional, IsEnum, IsArray, Min, Max } from 'class-validator'; +import { Protocol } from '@prisma/client'; + +export class CreateHostDto { + @IsString() + name: string; + + @IsString() + hostname: string; + + @IsInt() + @Min(1) + @Max(65535) + @IsOptional() + port?: number; + + @IsEnum(Protocol) + @IsOptional() + protocol?: Protocol; + + @IsInt() + @IsOptional() + groupId?: number; + + @IsInt() + @IsOptional() + credentialId?: number; + + @IsArray() + @IsString({ each: true }) + @IsOptional() + tags?: string[]; + + @IsString() + @IsOptional() + notes?: string; + + @IsString() + @IsOptional() + color?: string; +} +``` + +`backend/src/connections/dto/update-host.dto.ts`: +```typescript +import { PartialType } from '@nestjs/mapped-types'; +import { CreateHostDto } from './create-host.dto'; + +export class UpdateHostDto extends PartialType(CreateHostDto) {} +``` + +`backend/src/connections/dto/create-group.dto.ts`: +```typescript +import { IsString, IsInt, IsOptional } from 'class-validator'; + +export class CreateGroupDto { + @IsString() + name: string; + + @IsInt() + @IsOptional() + parentId?: number; + + @IsInt() + @IsOptional() + sortOrder?: number; +} +``` + +`backend/src/connections/dto/update-group.dto.ts`: +```typescript +import { PartialType } from '@nestjs/mapped-types'; +import { CreateGroupDto } from './create-group.dto'; + +export class UpdateGroupDto extends PartialType(CreateGroupDto) {} +``` + +- [ ] **Step 2: Implement hosts service** + +`backend/src/connections/hosts.service.ts`: +```typescript +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreateHostDto } from './dto/create-host.dto'; +import { UpdateHostDto } from './dto/update-host.dto'; + +@Injectable() +export class HostsService { + constructor(private prisma: PrismaService) {} + + findAll(search?: string) { + const where = search + ? { + OR: [ + { name: { contains: search, mode: 'insensitive' as const } }, + { hostname: { contains: search, mode: 'insensitive' as const } }, + { tags: { has: search } }, + ], + } + : {}; + return this.prisma.host.findMany({ + where, + include: { group: true, credential: { select: { id: true, name: true, type: true } } }, + orderBy: [{ lastConnectedAt: { sort: 'desc', nulls: 'last' } }, { sortOrder: 'asc' }], + }); + } + + async findOne(id: number) { + const host = await this.prisma.host.findUnique({ + where: { id }, + include: { group: true, credential: true }, + }); + if (!host) throw new NotFoundException(`Host ${id} not found`); + return host; + } + + create(dto: CreateHostDto) { + return this.prisma.host.create({ + data: { + name: dto.name, + hostname: dto.hostname, + port: dto.port ?? (dto.protocol === 'rdp' ? 3389 : 22), + protocol: dto.protocol ?? 'ssh', + groupId: dto.groupId, + credentialId: dto.credentialId, + tags: dto.tags ?? [], + notes: dto.notes, + color: dto.color, + }, + include: { group: true }, + }); + } + + async update(id: number, dto: UpdateHostDto) { + await this.findOne(id); // throws if not found + return this.prisma.host.update({ where: { id }, data: dto }); + } + + async remove(id: number) { + await this.findOne(id); + return this.prisma.host.delete({ where: { id } }); + } + + async touchLastConnected(id: number) { + return this.prisma.host.update({ + where: { id }, + data: { lastConnectedAt: new Date() }, + }); + } + + async reorder(ids: number[]) { + const updates = ids.map((id, index) => + this.prisma.host.update({ where: { id }, data: { sortOrder: index } }), + ); + return this.prisma.$transaction(updates); + } +} +``` + +- [ ] **Step 3: Implement hosts controller** + +`backend/src/connections/hosts.controller.ts`: +```typescript +import { Controller, Get, Post, Put, Delete, Param, Body, Query, UseGuards, ParseIntPipe } from '@nestjs/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { HostsService } from './hosts.service'; +import { CreateHostDto } from './dto/create-host.dto'; +import { UpdateHostDto } from './dto/update-host.dto'; + +@UseGuards(JwtAuthGuard) +@Controller('hosts') +export class HostsController { + constructor(private hosts: HostsService) {} + + @Get() + findAll(@Query('search') search?: string) { + return this.hosts.findAll(search); + } + + @Get(':id') + findOne(@Param('id', ParseIntPipe) id: number) { + return this.hosts.findOne(id); + } + + @Post() + create(@Body() dto: CreateHostDto) { + return this.hosts.create(dto); + } + + @Put(':id') + update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateHostDto) { + return this.hosts.update(id, dto); + } + + @Delete(':id') + remove(@Param('id', ParseIntPipe) id: number) { + return this.hosts.remove(id); + } + + @Post('reorder') + reorder(@Body() body: { ids: number[] }) { + return this.hosts.reorder(body.ids); + } +} +``` + +- [ ] **Step 4: Implement groups service + controller** + +`backend/src/connections/groups.service.ts`: +```typescript +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreateGroupDto } from './dto/create-group.dto'; +import { UpdateGroupDto } from './dto/update-group.dto'; + +@Injectable() +export class GroupsService { + constructor(private prisma: PrismaService) {} + + findAll() { + return this.prisma.hostGroup.findMany({ + include: { children: true, hosts: { select: { id: true, name: true, protocol: true } } }, + orderBy: { sortOrder: 'asc' }, + }); + } + + findTree() { + return this.prisma.hostGroup.findMany({ + where: { parentId: null }, + include: { + hosts: { orderBy: { sortOrder: 'asc' } }, + children: { + include: { + hosts: { orderBy: { sortOrder: 'asc' } }, + children: { + include: { + hosts: { orderBy: { sortOrder: 'asc' } }, + }, + }, + }, + orderBy: { sortOrder: 'asc' }, + }, + }, + orderBy: { sortOrder: 'asc' }, + }); + } + + async findOne(id: number) { + const group = await this.prisma.hostGroup.findUnique({ + where: { id }, + include: { hosts: true, children: true }, + }); + if (!group) throw new NotFoundException(`Group ${id} not found`); + return group; + } + + create(dto: CreateGroupDto) { + return this.prisma.hostGroup.create({ data: dto }); + } + + async update(id: number, dto: UpdateGroupDto) { + await this.findOne(id); + return this.prisma.hostGroup.update({ where: { id }, data: dto }); + } + + async remove(id: number) { + await this.findOne(id); + return this.prisma.hostGroup.delete({ where: { id } }); + } +} +``` + +`backend/src/connections/groups.controller.ts`: +```typescript +import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards, ParseIntPipe } from '@nestjs/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { GroupsService } from './groups.service'; +import { CreateGroupDto } from './dto/create-group.dto'; +import { UpdateGroupDto } from './dto/update-group.dto'; + +@UseGuards(JwtAuthGuard) +@Controller('groups') +export class GroupsController { + constructor(private groups: GroupsService) {} + + @Get() + findAll() { + return this.groups.findAll(); + } + + @Get('tree') + findTree() { + return this.groups.findTree(); + } + + @Get(':id') + findOne(@Param('id', ParseIntPipe) id: number) { + return this.groups.findOne(id); + } + + @Post() + create(@Body() dto: CreateGroupDto) { + return this.groups.create(dto); + } + + @Put(':id') + update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateGroupDto) { + return this.groups.update(id, dto); + } + + @Delete(':id') + remove(@Param('id', ParseIntPipe) id: number) { + return this.groups.remove(id); + } +} +``` + +- [ ] **Step 5: Create connections module + register in app.module** + +`backend/src/connections/connections.module.ts`: +```typescript +import { Module } from '@nestjs/common'; +import { HostsService } from './hosts.service'; +import { HostsController } from './hosts.controller'; +import { GroupsService } from './groups.service'; +import { GroupsController } from './groups.controller'; + +@Module({ + providers: [HostsService, GroupsService], + controllers: [HostsController, GroupsController], + exports: [HostsService], +}) +export class ConnectionsModule {} +``` + +Update `app.module.ts` imports to add `ConnectionsModule`. + +- [ ] **Step 6: Commit** + +```bash +git add -A +git commit -m "feat: connection manager — hosts + groups CRUD with search" +``` + +--- + +### Task 6: Vault Backend (Credentials + SSH Keys) + +**Files:** +- Create: `backend/src/vault/credentials.service.ts`, `credentials.controller.ts` +- Create: `backend/src/vault/ssh-keys.service.ts`, `ssh-keys.controller.ts` +- Create: `backend/src/vault/dto/*.ts` +- Modify: `backend/src/vault/vault.module.ts` + +- [ ] **Step 1: Create DTOs** + +`backend/src/vault/dto/create-credential.dto.ts`: +```typescript +import { IsString, IsOptional, IsEnum, IsInt } from 'class-validator'; +import { CredentialType } from '@prisma/client'; + +export class CreateCredentialDto { + @IsString() + name: string; + + @IsString() + @IsOptional() + username?: string; + + @IsString() + @IsOptional() + domain?: string; + + @IsEnum(CredentialType) + type: CredentialType; + + @IsString() + @IsOptional() + password?: string; // plaintext — encrypted before storage + + @IsInt() + @IsOptional() + sshKeyId?: number; +} +``` + +`backend/src/vault/dto/update-credential.dto.ts`: +```typescript +import { PartialType } from '@nestjs/mapped-types'; +import { CreateCredentialDto } from './create-credential.dto'; + +export class UpdateCredentialDto extends PartialType(CreateCredentialDto) {} +``` + +`backend/src/vault/dto/create-ssh-key.dto.ts`: +```typescript +import { IsString, IsOptional } from 'class-validator'; + +export class CreateSshKeyDto { + @IsString() + name: string; + + @IsString() + privateKey: string; // plaintext — encrypted before storage + + @IsString() + @IsOptional() + passphrase?: string; // plaintext — encrypted before storage + + @IsString() + @IsOptional() + publicKey?: string; +} +``` + +`backend/src/vault/dto/update-ssh-key.dto.ts`: +```typescript +import { IsString, IsOptional } from 'class-validator'; + +export class UpdateSshKeyDto { + @IsString() + @IsOptional() + name?: string; + + @IsString() + @IsOptional() + passphrase?: string; // new passphrase (re-encrypted) +} +``` + +- [ ] **Step 2: Implement credentials service** + +`backend/src/vault/credentials.service.ts`: +```typescript +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { EncryptionService } from './encryption.service'; +import { CreateCredentialDto } from './dto/create-credential.dto'; +import { UpdateCredentialDto } from './dto/update-credential.dto'; + +@Injectable() +export class CredentialsService { + constructor( + private prisma: PrismaService, + private encryption: EncryptionService, + ) {} + + findAll() { + return this.prisma.credential.findMany({ + include: { sshKey: { select: { id: true, name: true, keyType: true, fingerprint: true } } }, + orderBy: { name: 'asc' }, + }); + } + + async findOne(id: number) { + const cred = await this.prisma.credential.findUnique({ + where: { id }, + include: { sshKey: true, hosts: { select: { id: true, name: true } } }, + }); + if (!cred) throw new NotFoundException(`Credential ${id} not found`); + return cred; + } + + create(dto: CreateCredentialDto) { + const encryptedValue = dto.password ? this.encryption.encrypt(dto.password) : null; + return this.prisma.credential.create({ + data: { + name: dto.name, + username: dto.username, + domain: dto.domain, + type: dto.type, + encryptedValue, + sshKeyId: dto.sshKeyId, + }, + }); + } + + async update(id: number, dto: UpdateCredentialDto) { + await this.findOne(id); + const data: any = { ...dto }; + delete data.password; + if (dto.password) { + data.encryptedValue = this.encryption.encrypt(dto.password); + } + return this.prisma.credential.update({ where: { id }, data }); + } + + async remove(id: number) { + await this.findOne(id); + return this.prisma.credential.delete({ where: { id } }); + } + + /** Decrypt credential for use in SSH/RDP connections. Never expose over API. */ + async decryptForConnection(id: number): Promise<{ + username: string | null; + domain: string | null; + password: string | null; + sshKey: { privateKey: string; passphrase: string | null } | null; + }> { + const cred = await this.prisma.credential.findUnique({ + where: { id }, + include: { sshKey: true }, + }); + if (!cred) throw new NotFoundException(`Credential ${id} not found`); + + let password: string | null = null; + if (cred.encryptedValue) { + password = this.encryption.decrypt(cred.encryptedValue); + } + + let sshKey: { privateKey: string; passphrase: string | null } | null = null; + if (cred.sshKey) { + const privateKey = this.encryption.decrypt(cred.sshKey.encryptedPrivateKey); + const passphrase = cred.sshKey.passphraseEncrypted + ? this.encryption.decrypt(cred.sshKey.passphraseEncrypted) + : null; + sshKey = { privateKey, passphrase }; + } + + return { username: cred.username, domain: cred.domain, password, sshKey }; + } +} +``` + +- [ ] **Step 3: Implement credentials controller** + +`backend/src/vault/credentials.controller.ts`: +```typescript +import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards, ParseIntPipe } from '@nestjs/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { CredentialsService } from './credentials.service'; +import { CreateCredentialDto } from './dto/create-credential.dto'; +import { UpdateCredentialDto } from './dto/update-credential.dto'; + +@UseGuards(JwtAuthGuard) +@Controller('credentials') +export class CredentialsController { + constructor(private credentials: CredentialsService) {} + + @Get() + findAll() { + return this.credentials.findAll(); + } + + @Get(':id') + findOne(@Param('id', ParseIntPipe) id: number) { + return this.credentials.findOne(id); + } + + @Post() + create(@Body() dto: CreateCredentialDto) { + return this.credentials.create(dto); + } + + @Put(':id') + update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateCredentialDto) { + return this.credentials.update(id, dto); + } + + @Delete(':id') + remove(@Param('id', ParseIntPipe) id: number) { + return this.credentials.remove(id); + } +} +``` + +- [ ] **Step 4: Implement SSH keys service** + +`backend/src/vault/ssh-keys.service.ts`: +```typescript +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { EncryptionService } from './encryption.service'; +import { CreateSshKeyDto } from './dto/create-ssh-key.dto'; +import { UpdateSshKeyDto } from './dto/update-ssh-key.dto'; +import { createPublicKey, createHash } from 'crypto'; +import { utils as ssh2Utils } from 'ssh2'; + +@Injectable() +export class SshKeysService { + constructor( + private prisma: PrismaService, + private encryption: EncryptionService, + ) {} + + findAll() { + return this.prisma.sshKey.findMany({ + select: { id: true, name: true, keyType: true, fingerprint: true, publicKey: true, createdAt: true }, + orderBy: { name: 'asc' }, + }); + } + + async findOne(id: number) { + const key = await this.prisma.sshKey.findUnique({ + where: { id }, + include: { credentials: { select: { id: true, name: true } } }, + }); + if (!key) throw new NotFoundException(`SSH key ${id} not found`); + // Never return encrypted private key over API + return { + id: key.id, + name: key.name, + keyType: key.keyType, + fingerprint: key.fingerprint, + publicKey: key.publicKey, + credentials: key.credentials, + createdAt: key.createdAt, + }; + } + + async create(dto: CreateSshKeyDto) { + // Detect key type from private key content + const keyType = this.detectKeyType(dto.privateKey); + + // Generate fingerprint from public key if provided, else from private key + const fingerprint = this.generateFingerprint(dto.publicKey || dto.privateKey); + + // Encrypt sensitive data + const encryptedPrivateKey = this.encryption.encrypt(dto.privateKey); + const passphraseEncrypted = dto.passphrase + ? this.encryption.encrypt(dto.passphrase) + : null; + + return this.prisma.sshKey.create({ + data: { + name: dto.name, + keyType, + fingerprint, + publicKey: dto.publicKey || null, + encryptedPrivateKey, + passphraseEncrypted, + }, + }); + } + + async update(id: number, dto: UpdateSshKeyDto) { + const key = await this.prisma.sshKey.findUnique({ where: { id } }); + if (!key) throw new NotFoundException(`SSH key ${id} not found`); + + const data: any = {}; + if (dto.name) data.name = dto.name; + if (dto.passphrase !== undefined) { + data.passphraseEncrypted = dto.passphrase + ? this.encryption.encrypt(dto.passphrase) + : null; + } + return this.prisma.sshKey.update({ where: { id }, data }); + } + + async remove(id: number) { + const key = await this.prisma.sshKey.findUnique({ where: { id } }); + if (!key) throw new NotFoundException(`SSH key ${id} not found`); + return this.prisma.sshKey.delete({ where: { id } }); + } + + private detectKeyType(privateKey: string): string { + if (privateKey.includes('RSA')) return 'rsa'; + if (privateKey.includes('EC')) return 'ecdsa'; + if (privateKey.includes('OPENSSH')) return 'ed25519'; // OpenSSH format, likely ed25519 + return 'unknown'; + } + + private generateFingerprint(keyContent: string): string { + try { + const hash = createHash('sha256').update(keyContent.trim()).digest('base64'); + return `SHA256:${hash}`; + } catch { + return 'unknown'; + } + } +} +``` + +- [ ] **Step 5: Implement SSH keys controller** + +`backend/src/vault/ssh-keys.controller.ts`: +```typescript +import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards, ParseIntPipe } from '@nestjs/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { SshKeysService } from './ssh-keys.service'; +import { CreateSshKeyDto } from './dto/create-ssh-key.dto'; +import { UpdateSshKeyDto } from './dto/update-ssh-key.dto'; + +@UseGuards(JwtAuthGuard) +@Controller('ssh-keys') +export class SshKeysController { + constructor(private sshKeys: SshKeysService) {} + + @Get() + findAll() { + return this.sshKeys.findAll(); + } + + @Get(':id') + findOne(@Param('id', ParseIntPipe) id: number) { + return this.sshKeys.findOne(id); + } + + @Post() + create(@Body() dto: CreateSshKeyDto) { + return this.sshKeys.create(dto); + } + + @Put(':id') + update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateSshKeyDto) { + return this.sshKeys.update(id, dto); + } + + @Delete(':id') + remove(@Param('id', ParseIntPipe) id: number) { + return this.sshKeys.remove(id); + } +} +``` + +- [ ] **Step 6: Update vault.module.ts** + +```typescript +import { Module } from '@nestjs/common'; +import { EncryptionService } from './encryption.service'; +import { CredentialsService } from './credentials.service'; +import { CredentialsController } from './credentials.controller'; +import { SshKeysService } from './ssh-keys.service'; +import { SshKeysController } from './ssh-keys.controller'; + +@Module({ + providers: [EncryptionService, CredentialsService, SshKeysService], + controllers: [CredentialsController, SshKeysController], + exports: [EncryptionService, CredentialsService, SshKeysService], +}) +export class VaultModule {} +``` + +Update `app.module.ts` — VaultModule is already imported. + +- [ ] **Step 7: Commit** + +```bash +git add -A +git commit -m "feat: vault — encrypted credentials + SSH key management" +``` + +--- + +### Task 7: Settings Backend + +**Files:** +- Create: `backend/src/settings/settings.module.ts`, `settings.service.ts`, `settings.controller.ts` + +- [ ] **Step 1: Implement settings service + controller** + +`backend/src/settings/settings.service.ts`: +```typescript +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; + +@Injectable() +export class SettingsService { + constructor(private prisma: PrismaService) {} + + async getAll(): Promise> { + const settings = await this.prisma.setting.findMany(); + return Object.fromEntries(settings.map((s) => [s.key, s.value])); + } + + async get(key: string): Promise { + const setting = await this.prisma.setting.findUnique({ where: { key } }); + return setting?.value ?? null; + } + + async set(key: string, value: string) { + return this.prisma.setting.upsert({ + where: { key }, + update: { value }, + create: { key, value }, + }); + } + + async setMany(settings: Record) { + const ops = Object.entries(settings).map(([key, value]) => + this.prisma.setting.upsert({ where: { key }, update: { value }, create: { key, value } }), + ); + return this.prisma.$transaction(ops); + } + + async remove(key: string) { + return this.prisma.setting.delete({ where: { key } }).catch(() => null); + } +} +``` + +`backend/src/settings/settings.controller.ts`: +```typescript +import { Controller, Get, Put, Body, UseGuards } from '@nestjs/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { SettingsService } from './settings.service'; + +@UseGuards(JwtAuthGuard) +@Controller('settings') +export class SettingsController { + constructor(private settings: SettingsService) {} + + @Get() + getAll() { + return this.settings.getAll(); + } + + @Put() + update(@Body() body: Record) { + return this.settings.setMany(body); + } +} +``` + +`backend/src/settings/settings.module.ts`: +```typescript +import { Module } from '@nestjs/common'; +import { SettingsService } from './settings.service'; +import { SettingsController } from './settings.controller'; + +@Module({ + providers: [SettingsService], + controllers: [SettingsController], + exports: [SettingsService], +}) +export class SettingsModule {} +``` + +Register `SettingsModule` in `app.module.ts`. + +- [ ] **Step 2: Commit** + +```bash +git add -A +git commit -m "feat: settings — key/value store with CRUD API" +``` + +--- + +### Task 8: Frontend — Auth + Connection Manager UI + +**Files:** +- Create: `frontend/stores/auth.store.ts`, `frontend/stores/connection.store.ts` +- Create: `frontend/pages/login.vue`, `frontend/pages/index.vue` +- Create: `frontend/layouts/default.vue` +- Create: `frontend/components/connections/HostTree.vue`, `HostCard.vue`, `HostEditDialog.vue`, `GroupEditDialog.vue` + +- [ ] **Step 1: Create auth store** + +`frontend/stores/auth.store.ts`: +```typescript +import { defineStore } from 'pinia' + +interface User { + id: number + email: string + displayName: string | null +} + +export const useAuthStore = defineStore('auth', { + state: () => ({ + token: localStorage.getItem('wraith_token') || '', + user: null as User | null, + }), + getters: { + isAuthenticated: (state) => !!state.token, + }, + actions: { + async login(email: string, password: string) { + const res = await $fetch<{ access_token: string; user: User }>('/api/auth/login', { + method: 'POST', + body: { email, password }, + }) + this.token = res.access_token + this.user = res.user + localStorage.setItem('wraith_token', res.access_token) + }, + logout() { + this.token = '' + this.user = null + localStorage.removeItem('wraith_token') + navigateTo('/login') + }, + async fetchProfile() { + if (!this.token) return + try { + this.user = await $fetch('/api/auth/profile', { + headers: { Authorization: `Bearer ${this.token}` }, + }) + } catch { + this.logout() + } + }, + }, +}) +``` + +- [ ] **Step 2: Create connection store** + +`frontend/stores/connection.store.ts`: +```typescript +import { defineStore } from 'pinia' +import { useAuthStore } from './auth.store' + +interface Host { + id: number + name: string + hostname: string + port: number + protocol: 'ssh' | 'rdp' + groupId: number | null + credentialId: number | null + tags: string[] + notes: string | null + color: string | null + lastConnectedAt: string | null + group: { id: number; name: string } | null +} + +interface HostGroup { + id: number + name: string + parentId: number | null + children: HostGroup[] + hosts: Host[] +} + +export const useConnectionStore = defineStore('connections', { + state: () => ({ + hosts: [] as Host[], + groups: [] as HostGroup[], + search: '', + loading: false, + }), + actions: { + headers() { + const auth = useAuthStore() + return { Authorization: `Bearer ${auth.token}` } + }, + async fetchHosts() { + this.loading = true + try { + this.hosts = await $fetch('/api/hosts', { headers: this.headers() }) + } finally { + this.loading = false + } + }, + async fetchTree() { + this.groups = await $fetch('/api/groups/tree', { headers: this.headers() }) + }, + async createHost(data: Partial) { + const host = await $fetch('/api/hosts', { + method: 'POST', + body: data, + headers: this.headers(), + }) + await this.fetchHosts() + return host + }, + async updateHost(id: number, data: Partial) { + await $fetch(`/api/hosts/${id}`, { + method: 'PUT', + body: data, + headers: this.headers(), + }) + await this.fetchHosts() + }, + async deleteHost(id: number) { + await $fetch(`/api/hosts/${id}`, { + method: 'DELETE', + headers: this.headers(), + }) + await this.fetchHosts() + }, + async createGroup(data: { name: string; parentId?: number }) { + await $fetch('/api/groups', { + method: 'POST', + body: data, + headers: this.headers(), + }) + await this.fetchTree() + }, + async updateGroup(id: number, data: { name?: string; parentId?: number }) { + await $fetch(`/api/groups/${id}`, { + method: 'PUT', + body: data, + headers: this.headers(), + }) + await this.fetchTree() + }, + async deleteGroup(id: number) { + await $fetch(`/api/groups/${id}`, { + method: 'DELETE', + headers: this.headers(), + }) + await this.fetchTree() + }, + }, +}) +``` + +- [ ] **Step 3: Create login page** + +`frontend/pages/login.vue`: +```vue + + + +``` + +- [ ] **Step 4: Create default layout + main index page (connection manager)** + +`frontend/layouts/default.vue` — main layout with sidebar for host tree and top bar. Active sessions render as persistent tabs via `SessionContainer.vue` (built in Phase 2). For now, just the connection manager shell: + +```vue + + + +``` + +`frontend/pages/index.vue` — connection manager home page: +```vue + + + +``` + +- [ ] **Step 5: Create HostTree, HostCard, HostEditDialog, GroupEditDialog components** + +These are standard PrimeVue-driven components. Each component: + +`frontend/components/connections/HostTree.vue` — recursive tree using PrimeVue `Tree` or hand-rolled recursive list. Displays groups with expand/collapse, hosts as leaf nodes. Emits `select-host` and `new-host` events. + +`frontend/components/connections/HostCard.vue` — card showing host name, hostname:port, protocol badge (SSH/RDP), color indicator, last connected timestamp. Click to connect (Phase 2), edit button, delete button. + +`frontend/components/connections/HostEditDialog.vue` — PrimeVue Dialog with form fields matching CreateHostDto. Protocol selector, group dropdown, credential dropdown, tags input, notes textarea, color picker. + +`frontend/components/connections/GroupEditDialog.vue` — PrimeVue Dialog with name field and parent group dropdown. + +Each component should be implemented following standard Vue 3 Composition API patterns with PrimeVue components. Use `$fetch` with auth headers for API calls. + +- [ ] **Step 6: Install frontend dependencies and verify dev server starts** + +```bash +cd frontend && npm install +npx nuxi dev +``` + +Verify: login page renders, login succeeds (requires backend running with DB), connection manager loads. + +- [ ] **Step 7: Commit** + +```bash +git add -A +git commit -m "feat: frontend — auth flow, connection manager UI, host tree" +``` + +--- + +### Task 9: First Docker Compose Up + +- [ ] **Step 1: Create `.env` from `.env.example` with real values** + +```bash +cp .env.example .env +# Generate secrets: +echo "DB_PASSWORD=$(openssl rand -hex 16)" >> .env +echo "JWT_SECRET=$(openssl rand -hex 32)" >> .env +echo "ENCRYPTION_KEY=$(openssl rand -hex 32)" >> .env +``` + +- [ ] **Step 2: Run Prisma migration against Docker postgres** + +```bash +cd backend +DATABASE_URL=postgresql://wraith:$(grep DB_PASSWORD ../.env | cut -d= -f2)@localhost:5432/wraith npx prisma migrate dev --name init +``` + +- [ ] **Step 3: Seed the database** + +```bash +DATABASE_URL=... npx prisma db seed +``` + +- [ ] **Step 4: Verify Docker Compose up** + +```bash +docker compose up -d +docker logs -f wraith-app +``` + +Expected: NestJS starts, serves API on port 3000, frontend loads in browser. + +- [ ] **Step 5: Commit** + +```bash +git add -A +git commit -m "feat: Phase 1 complete — foundation layer verified" +``` + +--- + +## Chunk 2: SSH + SFTP (Phase 2) + +### Task 10: SSH Connection Service + Terminal Gateway + +**Files:** +- Create: `backend/src/terminal/terminal.module.ts` +- Create: `backend/src/terminal/ssh-connection.service.ts` +- Create: `backend/src/terminal/terminal.gateway.ts` + +This is the core of Wraith. The SSH connection service manages ssh2 connections, the terminal gateway bridges WebSocket to ssh2. + +- [ ] **Step 1: Implement SSH connection service** + +`backend/src/terminal/ssh-connection.service.ts`: +```typescript +import { Injectable, Logger } from '@nestjs/common'; +import { Client, ClientChannel } from 'ssh2'; +import { createHash } from 'crypto'; +import { CredentialsService } from '../vault/credentials.service'; +import { HostsService } from '../connections/hosts.service'; +import { PrismaService } from '../prisma/prisma.service'; +import { v4 as uuid } from 'uuid'; + +export interface SshSession { + id: string; + hostId: number; + client: Client; + stream: ClientChannel | null; +} + +@Injectable() +export class SshConnectionService { + private readonly logger = new Logger(SshConnectionService.name); + private sessions = new Map(); + + constructor( + private credentials: CredentialsService, + private hosts: HostsService, + private prisma: PrismaService, + ) {} + + async connect( + hostId: number, + onData: (data: string) => void, + onClose: (reason: string) => void, + onHostKeyVerify: (fingerprint: string, isNew: boolean) => Promise, + ): Promise { + const host = await this.hosts.findOne(hostId); + const cred = host.credentialId + ? await this.credentials.decryptForConnection(host.credentialId) + : null; + + const sessionId = uuid(); + const client = new Client(); + + return new Promise((resolve, reject) => { + client.on('ready', () => { + client.shell({ term: 'xterm-256color' }, (err, stream) => { + if (err) { + client.end(); + return reject(err); + } + const session: SshSession = { id: sessionId, hostId, client, stream }; + this.sessions.set(sessionId, session); + + stream.on('data', (data: Buffer) => onData(data.toString('utf-8'))); + stream.on('close', () => { + this.disconnect(sessionId); + onClose('Session ended'); + }); + + // Update lastConnectedAt and create connection log + this.hosts.touchLastConnected(hostId); + this.prisma.connectionLog.create({ + data: { hostId, protocol: host.protocol }, + }).catch(() => {}); + + resolve(sessionId); + }); + }); + + client.on('error', (err) => { + this.logger.error(`SSH error for host ${hostId}: ${err.message}`); + this.disconnect(sessionId); + onClose(err.message); + reject(err); + }); + + const connectConfig: any = { + host: host.hostname, + port: host.port, + username: cred?.username || 'root', + hostVerifier: (key: Buffer, verify: (accept: boolean) => void) => { + const fingerprint = createHash('sha256').update(key).digest('base64'); + const fp = `SHA256:${fingerprint}`; + + if (host.hostFingerprint === fp) { + verify(true); // known host — accept silently + return; + } + + // Unknown or changed fingerprint — ask the user via WebSocket + const isNew = !host.hostFingerprint; + onHostKeyVerify(fp, isNew).then((accepted) => { + if (accepted) { + // Persist fingerprint so future connections auto-accept + this.prisma.host.update({ + where: { id: hostId }, + data: { hostFingerprint: fp }, + }).catch(() => {}); + } + verify(accepted); + }); + }, + }; + + if (cred?.sshKey) { + connectConfig.privateKey = cred.sshKey.privateKey; + if (cred.sshKey.passphrase) { + connectConfig.passphrase = cred.sshKey.passphrase; + } + } else if (cred?.password) { + connectConfig.password = cred.password; + } + + client.connect(connectConfig); + }); + } + + write(sessionId: string, data: string) { + const session = this.sessions.get(sessionId); + if (session?.stream) { + session.stream.write(data); + } + } + + resize(sessionId: string, cols: number, rows: number) { + const session = this.sessions.get(sessionId); + if (session?.stream) { + session.stream.setWindow(rows, cols, 0, 0); + } + } + + disconnect(sessionId: string) { + const session = this.sessions.get(sessionId); + if (session) { + session.stream?.close(); + session.client.end(); + this.sessions.delete(sessionId); + + // Update connection log with disconnect time + this.prisma.connectionLog.updateMany({ + where: { hostId: session.hostId, disconnectedAt: null }, + data: { disconnectedAt: new Date() }, + }).catch(() => {}); + } + } + + getSession(sessionId: string): SshSession | undefined { + return this.sessions.get(sessionId); + } + + getSftpChannel(sessionId: string): Promise { + return new Promise((resolve, reject) => { + const session = this.sessions.get(sessionId); + if (!session) return reject(new Error('Session not found')); + session.client.sftp((err, sftp) => { + if (err) return reject(err); + resolve(sftp); + }); + }); + } +} +``` + +- [ ] **Step 2: Implement terminal gateway** + +`backend/src/terminal/terminal.gateway.ts`: +```typescript +import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets'; +import { Logger } from '@nestjs/common'; +import { Server } from 'ws'; +import { WsAuthGuard } from '../auth/ws-auth.guard'; +import { SshConnectionService } from './ssh-connection.service'; + +@WebSocketGateway({ path: '/ws/terminal' }) +export class TerminalGateway implements OnGatewayConnection, OnGatewayDisconnect { + @WebSocketServer() server: Server; + private readonly logger = new Logger(TerminalGateway.name); + private clientSessions = new Map(); // ws client → sessionIds + + constructor( + private ssh: SshConnectionService, + private wsAuth: WsAuthGuard, + ) {} + + handleConnection(client: any) { + const user = this.wsAuth.validateClient(client); + if (!user) { + client.close(4001, 'Unauthorized'); + return; + } + this.clientSessions.set(client, []); + this.logger.log(`Terminal WS connected: ${user.email}`); + + client.on('message', async (raw: Buffer) => { + try { + const msg = JSON.parse(raw.toString()); + await this.handleMessage(client, msg); + } catch (err: any) { + this.send(client, { type: 'error', message: err.message }); + } + }); + } + + handleDisconnect(client: any) { + const sessions = this.clientSessions.get(client) || []; + sessions.forEach((sid) => this.ssh.disconnect(sid)); + this.clientSessions.delete(client); + } + + private async handleMessage(client: any, msg: any) { + switch (msg.type) { + case 'connect': { + const sessionId = await this.ssh.connect( + msg.hostId, + (data) => this.send(client, { type: 'data', sessionId, data }), + (reason) => this.send(client, { type: 'disconnected', sessionId, reason }), + async (fingerprint, isNew) => { + // Send verification request to client + this.send(client, { type: 'host-key-verify', fingerprint, isNew }); + return true; // auto-accept for now, full flow in Task 12 + }, + ); + const sessions = this.clientSessions.get(client) || []; + sessions.push(sessionId); + this.clientSessions.set(client, sessions); + this.send(client, { type: 'connected', sessionId }); + break; + } + case 'data': { + if (msg.sessionId) { + this.ssh.write(msg.sessionId, msg.data); + } + break; + } + case 'resize': { + if (msg.sessionId) { + this.ssh.resize(msg.sessionId, msg.cols, msg.rows); + } + break; + } + case 'disconnect': { + if (msg.sessionId) { + this.ssh.disconnect(msg.sessionId); + } + break; + } + } + } + + private send(client: any, data: any) { + if (client.readyState === 1) { // WebSocket.OPEN + client.send(JSON.stringify(data)); + } + } +} +``` + +- [ ] **Step 3: Create terminal module** + +`backend/src/terminal/terminal.module.ts`: +```typescript +import { Module } from '@nestjs/common'; +import { SshConnectionService } from './ssh-connection.service'; +import { TerminalGateway } from './terminal.gateway'; +import { VaultModule } from '../vault/vault.module'; +import { ConnectionsModule } from '../connections/connections.module'; +import { AuthModule } from '../auth/auth.module'; + +@Module({ + imports: [VaultModule, ConnectionsModule, AuthModule], + providers: [SshConnectionService, TerminalGateway], + exports: [SshConnectionService], +}) +export class TerminalModule {} +``` + +Register `TerminalModule` in `app.module.ts`. + +- [ ] **Step 4: Add `uuid` dependency** + +```bash +cd backend && npm install uuid && npm install -D @types/uuid +``` + +- [ ] **Step 5: Commit** + +```bash +git add -A +git commit -m "feat: SSH terminal gateway — ssh2 proxy over WebSocket" +``` + +--- + +### Task 11: SFTP Gateway + +**Files:** +- Create: `backend/src/terminal/sftp.gateway.ts` +- Modify: `backend/src/terminal/terminal.module.ts` + +- [ ] **Step 1: Implement SFTP gateway** + +`backend/src/terminal/sftp.gateway.ts`: +```typescript +import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets'; +import { Logger } from '@nestjs/common'; +import { Server } from 'ws'; +import { WsAuthGuard } from '../auth/ws-auth.guard'; +import { SshConnectionService } from './ssh-connection.service'; + +const MAX_EDIT_SIZE = 5 * 1024 * 1024; // 5MB + +@WebSocketGateway({ path: '/ws/sftp' }) +export class SftpGateway implements OnGatewayConnection, OnGatewayDisconnect { + @WebSocketServer() server: Server; + private readonly logger = new Logger(SftpGateway.name); + + constructor( + private ssh: SshConnectionService, + private wsAuth: WsAuthGuard, + ) {} + + handleConnection(client: any) { + const user = this.wsAuth.validateClient(client); + if (!user) { + client.close(4001, 'Unauthorized'); + return; + } + this.logger.log(`SFTP WS connected: ${user.email}`); + + client.on('message', async (raw: Buffer) => { + try { + const msg = JSON.parse(raw.toString()); + await this.handleMessage(client, msg); + } catch (err: any) { + this.send(client, { type: 'error', message: err.message }); + } + }); + } + + handleDisconnect() {} + + private async handleMessage(client: any, msg: any) { + const { sessionId } = msg; + if (!sessionId) { + return this.send(client, { type: 'error', message: 'sessionId required' }); + } + + const sftp = await this.ssh.getSftpChannel(sessionId); + + switch (msg.type) { + case 'list': { + sftp.readdir(msg.path, (err: any, list: any[]) => { + if (err) return this.send(client, { type: 'error', message: err.message }); + const entries = list.map((f: any) => ({ + name: f.filename, + path: `${msg.path === '/' ? '' : msg.path}/${f.filename}`, + size: f.attrs.size, + isDirectory: (f.attrs.mode & 0o40000) !== 0, + permissions: (f.attrs.mode & 0o7777).toString(8), + modified: new Date(f.attrs.mtime * 1000).toISOString(), + })); + this.send(client, { type: 'list', path: msg.path, entries }); + }); + break; + } + case 'read': { + sftp.stat(msg.path, (err: any, stats: any) => { + if (err) return this.send(client, { type: 'error', message: err.message }); + if (stats.size > MAX_EDIT_SIZE) { + return this.send(client, { + type: 'error', + message: `File too large for editing (${(stats.size / 1024 / 1024).toFixed(1)}MB, max 5MB). Download instead.`, + }); + } + const chunks: Buffer[] = []; + const stream = sftp.createReadStream(msg.path); + stream.on('data', (chunk: Buffer) => chunks.push(chunk)); + stream.on('end', () => { + const content = Buffer.concat(chunks).toString('utf-8'); + this.send(client, { type: 'fileContent', path: msg.path, content, encoding: 'utf-8' }); + }); + stream.on('error', (e: any) => this.send(client, { type: 'error', message: e.message })); + }); + break; + } + case 'write': { + const stream = sftp.createWriteStream(msg.path); + stream.end(Buffer.from(msg.data, 'utf-8'), () => { + this.send(client, { type: 'saved', path: msg.path }); + }); + stream.on('error', (e: any) => this.send(client, { type: 'error', message: e.message })); + break; + } + case 'mkdir': { + sftp.mkdir(msg.path, (err: any) => { + if (err) return this.send(client, { type: 'error', message: err.message }); + this.send(client, { type: 'created', path: msg.path }); + }); + break; + } + case 'rename': { + sftp.rename(msg.oldPath, msg.newPath, (err: any) => { + if (err) return this.send(client, { type: 'error', message: err.message }); + this.send(client, { type: 'renamed', oldPath: msg.oldPath, newPath: msg.newPath }); + }); + break; + } + case 'delete': { + // Try unlink (file), fallback to rmdir (directory) + sftp.unlink(msg.path, (err: any) => { + if (err) { + sftp.rmdir(msg.path, (err2: any) => { + if (err2) return this.send(client, { type: 'error', message: err2.message }); + this.send(client, { type: 'deleted', path: msg.path }); + }); + } else { + this.send(client, { type: 'deleted', path: msg.path }); + } + }); + break; + } + case 'chmod': { + const mode = parseInt(msg.mode, 8); + sftp.chmod(msg.path, mode, (err: any) => { + if (err) return this.send(client, { type: 'error', message: err.message }); + this.send(client, { type: 'chmodDone', path: msg.path, mode: msg.mode }); + }); + break; + } + case 'stat': { + sftp.stat(msg.path, (err: any, stats: any) => { + if (err) return this.send(client, { type: 'error', message: err.message }); + this.send(client, { + type: 'stat', + path: msg.path, + size: stats.size, + isDirectory: (stats.mode & 0o40000) !== 0, + permissions: (stats.mode & 0o7777).toString(8), + modified: new Date(stats.mtime * 1000).toISOString(), + accessed: new Date(stats.atime * 1000).toISOString(), + }); + }); + break; + } + case 'download': { + // Stream file data to client in chunks + const readStream = sftp.createReadStream(msg.path); + sftp.stat(msg.path, (err: any, stats: any) => { + if (err) return this.send(client, { type: 'error', message: err.message }); + const transferId = `dl-${Date.now()}`; + let sent = 0; + this.send(client, { type: 'downloadStart', transferId, path: msg.path, total: stats.size }); + readStream.on('data', (chunk: Buffer) => { + sent += chunk.length; + client.send(JSON.stringify({ + type: 'downloadChunk', + transferId, + data: chunk.toString('base64'), + progress: { bytes: sent, total: stats.size }, + })); + }); + readStream.on('end', () => { + this.send(client, { type: 'downloadComplete', transferId }); + }); + readStream.on('error', (e: any) => { + this.send(client, { type: 'error', message: e.message }); + }); + }); + break; + } + } + } + + private send(client: any, data: any) { + if (client.readyState === 1) { + client.send(JSON.stringify(data)); + } + } +} +``` + +- [ ] **Step 2: Register SftpGateway in terminal.module.ts** + +Add `SftpGateway` to providers array. + +- [ ] **Step 3: Commit** + +```bash +git add -A +git commit -m "feat: SFTP gateway — file operations over WebSocket" +``` + +--- + +### Task 12: Frontend — Terminal + SFTP + +**Files:** +- Create: `frontend/composables/useTerminal.ts`, `frontend/composables/useSftp.ts` +- Create: `frontend/stores/session.store.ts` +- Create: `frontend/components/session/SessionContainer.vue`, `SessionTab.vue` +- Create: `frontend/components/terminal/TerminalInstance.vue`, `TerminalTabs.vue`, `SplitPane.vue` +- Create: `frontend/components/sftp/SftpSidebar.vue`, `FileTree.vue`, `FileEditor.vue`, `TransferStatus.vue` +- Modify: `frontend/layouts/default.vue`, `frontend/pages/index.vue` + +- [ ] **Step 1: Create session store** + +`frontend/stores/session.store.ts`: +```typescript +import { defineStore } from 'pinia' + +interface Session { + id: string // uuid from backend + hostId: number + hostName: string + protocol: 'ssh' | 'rdp' + color: string | null + active: boolean +} + +export const useSessionStore = defineStore('sessions', { + state: () => ({ + sessions: [] as Session[], + activeSessionId: null as string | null, + }), + getters: { + activeSession: (state) => state.sessions.find(s => s.id === state.activeSessionId), + hasSessions: (state) => state.sessions.length > 0, + }, + actions: { + addSession(session: Session) { + this.sessions.push(session) + this.activeSessionId = session.id + }, + removeSession(id: string) { + this.sessions = this.sessions.filter(s => s.id !== id) + if (this.activeSessionId === id) { + this.activeSessionId = this.sessions.length ? this.sessions[this.sessions.length - 1].id : null + } + }, + setActive(id: string) { + this.activeSessionId = id + }, + }, +}) +``` + +- [ ] **Step 2: Create useTerminal composable** + +`frontend/composables/useTerminal.ts`: +```typescript +import { Terminal } from '@xterm/xterm' +import { FitAddon } from '@xterm/addon-fit' +import { SearchAddon } from '@xterm/addon-search' +import { WebLinksAddon } from '@xterm/addon-web-links' +import { WebglAddon } from '@xterm/addon-webgl' +import { useAuthStore } from '~/stores/auth.store' +import { useSessionStore } from '~/stores/session.store' + +export function useTerminal() { + const auth = useAuthStore() + const sessions = useSessionStore() + let ws: WebSocket | null = null + + function createTerminal(container: HTMLElement, options?: Partial<{ fontSize: number; scrollback: number }>) { + const term = new Terminal({ + cursorBlink: true, + fontSize: options?.fontSize || 14, + fontFamily: "'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace", + scrollback: options?.scrollback || 10000, + theme: { + background: '#0a0a0f', + foreground: '#e4e4ef', + cursor: '#5c7cfa', + selectionBackground: '#364fc744', + }, + }) + + const fitAddon = new FitAddon() + const searchAddon = new SearchAddon() + term.loadAddon(fitAddon) + term.loadAddon(searchAddon) + term.loadAddon(new WebLinksAddon()) + + term.open(container) + + try { + term.loadAddon(new WebglAddon()) + } catch { + // WebGL not available, fall back to canvas + } + + fitAddon.fit() + const resizeObserver = new ResizeObserver(() => fitAddon.fit()) + resizeObserver.observe(container) + + return { term, fitAddon, searchAddon, resizeObserver } + } + + function connectToHost(hostId: number, hostName: string, protocol: 'ssh', color: string | null, term: Terminal, fitAddon: FitAddon) { + const wsUrl = `${location.protocol === 'https:' ? 'wss' : 'ws'}://${location.host}/ws/terminal?token=${auth.token}` + ws = new WebSocket(wsUrl) + + ws.onopen = () => { + ws!.send(JSON.stringify({ type: 'connect', hostId })) + } + + ws.onmessage = (event) => { + const msg = JSON.parse(event.data) + switch (msg.type) { + case 'connected': + sessions.addSession({ id: msg.sessionId, hostId, hostName, protocol, color, active: true }) + // Send initial terminal size + ws!.send(JSON.stringify({ type: 'resize', sessionId: msg.sessionId, cols: term.cols, rows: term.rows })) + break + case 'data': + term.write(msg.data) + break + case 'disconnected': + sessions.removeSession(msg.sessionId) + break + case 'host-key-verify': + // Auto-accept for now — full UX in polish phase + ws!.send(JSON.stringify({ type: 'host-key-accept' })) + break + case 'error': + term.write(`\r\n\x1b[31mError: ${msg.message}\x1b[0m\r\n`) + break + } + } + + ws.onclose = () => { + term.write('\r\n\x1b[33mConnection closed.\x1b[0m\r\n') + } + + // Terminal input → WebSocket + term.onData((data) => { + if (ws?.readyState === WebSocket.OPEN) { + const sessionId = sessions.activeSession?.id + if (sessionId) { + ws.send(JSON.stringify({ type: 'data', sessionId, data })) + } + } + }) + + // Terminal resize → WebSocket + term.onResize(({ cols, rows }) => { + if (ws?.readyState === WebSocket.OPEN) { + const sessionId = sessions.activeSession?.id + if (sessionId) { + ws.send(JSON.stringify({ type: 'resize', sessionId, cols, rows })) + } + } + }) + + return ws + } + + function disconnect(sessionId: string) { + if (ws?.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({ type: 'disconnect', sessionId })) + } + sessions.removeSession(sessionId) + } + + return { createTerminal, connectToHost, disconnect } +} +``` + +- [ ] **Step 3: Create useSftp composable** + +`frontend/composables/useSftp.ts`: +```typescript +import { useAuthStore } from '~/stores/auth.store' + +export function useSftp(sessionId: Ref) { + const auth = useAuthStore() + let ws: WebSocket | null = null + const entries = ref([]) + const currentPath = ref('/') + const fileContent = ref<{ path: string; content: string } | null>(null) + const transfers = ref([]) + + function connect() { + const wsUrl = `${location.protocol === 'https:' ? 'wss' : 'ws'}://${location.host}/ws/sftp?token=${auth.token}` + ws = new WebSocket(wsUrl) + + ws.onmessage = (event) => { + const msg = JSON.parse(event.data) + switch (msg.type) { + case 'list': + entries.value = msg.entries.sort((a: any, b: any) => { + if (a.isDirectory !== b.isDirectory) return a.isDirectory ? -1 : 1 + return a.name.localeCompare(b.name) + }) + currentPath.value = msg.path + break + case 'fileContent': + fileContent.value = { path: msg.path, content: msg.content } + break + case 'saved': + fileContent.value = null + list(currentPath.value) + break + case 'progress': + // Update transfer progress + break + case 'error': + console.error('SFTP error:', msg.message) + break + } + } + + return ws + } + + function send(msg: any) { + if (ws?.readyState === WebSocket.OPEN && sessionId.value) { + ws.send(JSON.stringify({ ...msg, sessionId: sessionId.value })) + } + } + + function list(path: string) { send({ type: 'list', path }) } + function readFile(path: string) { send({ type: 'read', path }) } + function writeFile(path: string, data: string) { send({ type: 'write', path, data }) } + function mkdir(path: string) { send({ type: 'mkdir', path }) } + function rename(oldPath: string, newPath: string) { send({ type: 'rename', oldPath, newPath }) } + function remove(path: string) { send({ type: 'delete', path }) } + function chmod(path: string, mode: string) { send({ type: 'chmod', path, mode }) } + function download(path: string) { send({ type: 'download', path }) } + + function disconnect() { + ws?.close() + ws = null + } + + return { + entries, currentPath, fileContent, transfers, + connect, disconnect, list, readFile, writeFile, mkdir, rename, remove, chmod, download, + } +} +``` + +- [ ] **Step 4: Create SessionContainer, SessionTab, TerminalInstance components** + +`frontend/components/session/SessionContainer.vue` — persistent container in default layout. Renders all active sessions, shows/hides via `v-show` based on `activeSessionId`. Tab bar on top. Each SSH session renders `TerminalInstance` + `SftpSidebar`. Each RDP session renders `RdpCanvas` (Phase 3). + +`frontend/components/session/SessionTab.vue` — individual tab in the tab bar. Shows host name, color dot, protocol icon, close button. + +`frontend/components/terminal/TerminalInstance.vue` — wraps xterm.js in a Vue component. Uses `useTerminal()` composable. Mounts terminal to a div ref. Handles resize via ResizeObserver. Props: `sessionId`, `hostId`. Imports xterm.js CSS. + +`frontend/components/terminal/TerminalTabs.vue` — tab bar component showing all active sessions. + +`frontend/components/terminal/SplitPane.vue` — flex container that allows horizontal/vertical splitting of terminal instances within a session. Uses CSS `flex-direction` toggle and a draggable divider. + +- [ ] **Step 5: Create SFTP components** + +`frontend/components/sftp/SftpSidebar.vue` — resizable panel on the left of the terminal. Uses `useSftp()` composable. Shows `FileTree` component. Top bar with path breadcrumbs and action buttons (upload, new folder, refresh). + +`frontend/components/sftp/FileTree.vue` — recursive tree of remote filesystem entries. Directories are expandable (lazy-load children on click). Files are clickable (open in FileEditor if text, download if binary). Right-click context menu for rename/delete/chmod/download. + +`frontend/components/sftp/FileEditor.vue` — wraps Monaco Editor. Opens when a text file is clicked in the tree. Shows file path, save button, close button. Unsaved changes warning on close. + +`frontend/components/sftp/TransferStatus.vue` — bottom bar showing active uploads/downloads with progress bars, file names, speed, ETA. + +- [ ] **Step 6: Update default.vue layout — add SessionContainer** + +The `SessionContainer` should live in the default layout so it persists across page navigation. When sessions exist, the session area takes over the main content area. The connection manager sidebar remains for launching new connections. + +- [ ] **Step 7: Update index.vue — connect-on-click** + +When a host card is clicked (not the edit button), call `useTerminal().connectToHost()` to open a new SSH or RDP session. Add an "open" action to HostCard. + +- [ ] **Step 8: Install xterm.js CSS** + +Add to `frontend/nuxt.config.ts` CSS array: `'@xterm/xterm/css/xterm.css'` + +- [ ] **Step 9: Commit** + +```bash +git add -A +git commit -m "feat: Phase 2 — SSH terminal + SFTP sidebar in browser" +``` + +--- + +## Chunk 3: RDP + Polish (Phases 3-4) + +### Task 13: RDP Backend — Guacamole Service + Gateway + +**Files:** +- Create: `backend/src/rdp/rdp.module.ts` +- Create: `backend/src/rdp/guacamole.service.ts` +- Create: `backend/src/rdp/rdp.gateway.ts` +- Modify: `backend/src/app.module.ts` + +- [ ] **Step 1: Implement Guacamole service** + +`backend/src/rdp/guacamole.service.ts`: + +The Guacamole service opens a raw TCP socket to guacd and speaks the Guacamole wire protocol. This is NOT an HTTP integration — it's a custom TCP client that translates between the Guacamole instruction format and JSON WebSocket messages. + +```typescript +import { Injectable, Logger } from '@nestjs/common'; +import * as net from 'net'; + +/** + * Guacamole wire protocol: instructions are comma-separated fields + * terminated by semicolons. Each field is length-prefixed. + * Example: "4.size,4.1024,3.768;" + */ + +@Injectable() +export class GuacamoleService { + private readonly logger = new Logger(GuacamoleService.name); + private readonly host = process.env.GUACD_HOST || 'guacd'; + private readonly port = parseInt(process.env.GUACD_PORT || '4822', 10); + + async connect(params: { + hostname: string; + port: number; + username: string; + password: string; + domain?: string; + width: number; + height: number; + dpi?: number; + security?: string; + colorDepth?: number; + ignoreCert?: boolean; + }): Promise { + return new Promise((resolve, reject) => { + const socket = net.createConnection(this.port, this.host, () => { + this.logger.log(`Connected to guacd at ${this.host}:${this.port}`); + + // Phase 1: SELECT protocol + socket.write(this.encode('select', 'rdp')); + + let buffer = ''; + const onData = (data: Buffer) => { + buffer += data.toString('utf-8'); + + // Wait for "args" instruction from guacd + if (buffer.includes(';')) { + socket.removeListener('data', onData); + + // Phase 2: CONNECT with RDP parameters + const connectArgs = this.buildRdpArgs(params); + socket.write(connectArgs); + + resolve(socket); + } + }; + socket.on('data', onData); + }); + + socket.on('error', (err) => { + this.logger.error(`guacd connection error: ${err.message}`); + reject(err); + }); + + socket.setTimeout(10000, () => { + socket.destroy(); + reject(new Error('guacd connection timeout')); + }); + }); + } + + private buildRdpArgs(params: any): string { + const args: Record = { + hostname: params.hostname, + port: String(params.port), + username: params.username, + password: params.password, + width: String(params.width), + height: String(params.height), + dpi: String(params.dpi || 96), + security: params.security || 'any', + 'color-depth': String(params.colorDepth || 24), + 'ignore-cert': params.ignoreCert !== false ? 'true' : 'false', + 'disable-audio': 'false', + 'enable-wallpaper': 'false', + 'enable-theming': 'true', + 'enable-font-smoothing': 'true', + 'resize-method': 'reconnect', + }; + if (params.domain) args.domain = params.domain; + + // Build connect instruction with all args + const values = Object.values(args); + return this.encode('connect', ...values); + } + + /** Encode a Guacamole instruction: "opcode,arg1,arg2,...;" with length prefixes */ + encode(...parts: string[]): string { + return parts.map((p) => `${p.length}.${p}`).join(',') + ';'; + } + + /** Decode a Guacamole instruction back to string array */ + decode(instruction: string): string[] { + const parts: string[] = []; + let pos = 0; + while (pos < instruction.length) { + const dotIndex = instruction.indexOf('.', pos); + if (dotIndex === -1) break; + const len = parseInt(instruction.substring(pos, dotIndex), 10); + const value = instruction.substring(dotIndex + 1, dotIndex + 1 + len); + parts.push(value); + pos = dotIndex + 1 + len + 1; // skip comma or semicolon + } + return parts; + } +} +``` + +- [ ] **Step 2: Implement RDP gateway** + +`backend/src/rdp/rdp.gateway.ts`: +```typescript +import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets'; +import { Logger } from '@nestjs/common'; +import { Server } from 'ws'; +import * as net from 'net'; +import { WsAuthGuard } from '../auth/ws-auth.guard'; +import { GuacamoleService } from './guacamole.service'; +import { CredentialsService } from '../vault/credentials.service'; +import { HostsService } from '../connections/hosts.service'; +import { PrismaService } from '../prisma/prisma.service'; + +@WebSocketGateway({ path: '/ws/rdp' }) +export class RdpGateway implements OnGatewayConnection, OnGatewayDisconnect { + @WebSocketServer() server: Server; + private readonly logger = new Logger(RdpGateway.name); + private clientSockets = new Map(); // ws client → guacd socket + + constructor( + private guacamole: GuacamoleService, + private credentials: CredentialsService, + private hosts: HostsService, + private prisma: PrismaService, + private wsAuth: WsAuthGuard, + ) {} + + handleConnection(client: any) { + const user = this.wsAuth.validateClient(client); + if (!user) { + client.close(4001, 'Unauthorized'); + return; + } + this.logger.log(`RDP WS connected: ${user.email}`); + + client.on('message', async (raw: Buffer) => { + try { + const msg = JSON.parse(raw.toString()); + if (msg.type === 'connect') { + await this.handleConnect(client, msg); + } else if (msg.type === 'guac') { + // Forward Guacamole instruction to guacd + const socket = this.clientSockets.get(client); + if (socket) { + socket.write(msg.instruction); + } + } + } catch (err: any) { + this.send(client, { type: 'error', message: err.message }); + } + }); + } + + handleDisconnect(client: any) { + const socket = this.clientSockets.get(client); + if (socket) { + socket.destroy(); + this.clientSockets.delete(client); + } + } + + private async handleConnect(client: any, msg: any) { + const host = await this.hosts.findOne(msg.hostId); + const cred = host.credentialId + ? await this.credentials.decryptForConnection(host.credentialId) + : null; + + const socket = await this.guacamole.connect({ + hostname: host.hostname, + port: host.port, + username: cred?.username || '', + password: cred?.password || '', + domain: cred?.domain || undefined, + width: msg.width || 1920, + height: msg.height || 1080, + dpi: msg.dpi || 96, + security: msg.security || 'any', + colorDepth: msg.colorDepth || 24, + }); + + this.clientSockets.set(client, socket); + + // Forward guacd data to browser + socket.on('data', (data: Buffer) => { + if (client.readyState === 1) { + client.send(JSON.stringify({ type: 'guac', instruction: data.toString('utf-8') })); + } + }); + + socket.on('close', () => { + this.send(client, { type: 'disconnected', reason: 'RDP session closed' }); + this.clientSockets.delete(client); + }); + + socket.on('error', (err) => { + this.send(client, { type: 'error', message: err.message }); + }); + + // Update connection tracking + this.hosts.touchLastConnected(host.id); + this.prisma.connectionLog.create({ + data: { hostId: host.id, protocol: 'rdp' }, + }).catch(() => {}); + + this.send(client, { type: 'connected', hostId: host.id }); + } + + private send(client: any, data: any) { + if (client.readyState === 1) { + client.send(JSON.stringify(data)); + } + } +} +``` + +- [ ] **Step 3: Create RDP module** + +`backend/src/rdp/rdp.module.ts`: +```typescript +import { Module } from '@nestjs/common'; +import { GuacamoleService } from './guacamole.service'; +import { RdpGateway } from './rdp.gateway'; +import { VaultModule } from '../vault/vault.module'; +import { ConnectionsModule } from '../connections/connections.module'; +import { AuthModule } from '../auth/auth.module'; + +@Module({ + imports: [VaultModule, ConnectionsModule, AuthModule], + providers: [GuacamoleService, RdpGateway], +}) +export class RdpModule {} +``` + +Register `RdpModule` in `app.module.ts`. + +- [ ] **Step 4: Commit** + +```bash +git add -A +git commit -m "feat: RDP gateway — Guacamole tunnel to guacd over WebSocket" +``` + +--- + +### Task 14: RDP Frontend + +**Files:** +- Create: `frontend/composables/useRdp.ts` +- Create: `frontend/components/rdp/RdpCanvas.vue`, `RdpToolbar.vue` + +- [ ] **Step 1: Create useRdp composable** + +`frontend/composables/useRdp.ts`: +```typescript +import Guacamole from 'guacamole-common-js' +import { useAuthStore } from '~/stores/auth.store' +import { useSessionStore } from '~/stores/session.store' + +export function useRdp() { + const auth = useAuthStore() + const sessions = useSessionStore() + + function connectRdp( + container: HTMLElement, + hostId: number, + hostName: string, + color: string | null, + options?: { width?: number; height?: number }, + ) { + const wsUrl = `${location.protocol === 'https:' ? 'wss' : 'ws'}://${location.host}/ws/rdp?token=${auth.token}` + const ws = new WebSocket(wsUrl) + + // Guacamole tunnel wrapping our WebSocket + const tunnel = new Guacamole.WebSocketTunnel(wsUrl) + // We need to handle this custom since we have a JSON wrapper + + let client: Guacamole.Client | null = null + + ws.onopen = () => { + ws.send(JSON.stringify({ + type: 'connect', + hostId, + width: options?.width || container.clientWidth, + height: options?.height || container.clientHeight, + })) + } + + ws.onmessage = (event) => { + const msg = JSON.parse(event.data) + switch (msg.type) { + case 'connected': { + // Initialize Guacamole client with custom tunnel + client = new Guacamole.Client(tunnel) + const display = client.getDisplay().getElement() + container.appendChild(display) + + // Set up input + const mouse = new Guacamole.Mouse(display) + mouse.onEach(['mousedown', 'mousemove', 'mouseup'], (e: any) => { + client?.sendMouseState(e.state) + }) + + const keyboard = new Guacamole.Keyboard(document) + keyboard.onkeydown = (keysym: number) => client?.sendKeyEvent(1, keysym) + keyboard.onkeyup = (keysym: number) => client?.sendKeyEvent(0, keysym) + + sessions.addSession({ + id: `rdp-${hostId}-${Date.now()}`, + hostId, + hostName, + protocol: 'rdp', + color, + active: true, + }) + break + } + case 'guac': { + // Forward Guacamole instruction to client + if (client) { + tunnel.oninstruction?.(msg.instruction) + } + break + } + case 'error': + console.error('RDP error:', msg.message) + break + case 'disconnected': + client?.disconnect() + break + } + } + + return { ws, getClient: () => client } + } + + return { connectRdp } +} +``` + +**Note:** The guacamole-common-js integration may need adjustment during implementation. The standard `WebSocketTunnel` expects raw Guacamole protocol over WebSocket, but our gateway wraps instructions in JSON. Two approaches: +1. Implement a custom `Guacamole.Tunnel` that speaks JSON over WebSocket +2. Switch the RDP gateway to pass raw Guacamole instructions without JSON wrapping + +The implementer should evaluate both approaches during Phase 3 and choose whichever produces cleaner code. The custom tunnel approach is likely simpler. + +- [ ] **Step 2: Create RdpCanvas and RdpToolbar components** + +`frontend/components/rdp/RdpCanvas.vue` — wraps the Guacamole display element. Uses `useRdp()` composable. Full-size container that resizes with the parent. Props: `sessionId`, `hostId`. + +`frontend/components/rdp/RdpToolbar.vue` — floating toolbar overlay for RDP sessions. Buttons: clipboard (text input dialog for paste), fullscreen toggle (HTML5 Fullscreen API), disconnect, settings dropdown (color depth, resize behavior). + +- [ ] **Step 3: Update SessionContainer to handle RDP sessions** + +When a session has `protocol === 'rdp'`, render `RdpCanvas` instead of `TerminalInstance + SftpSidebar`. + +- [ ] **Step 4: Commit** + +```bash +git add -A +git commit -m "feat: Phase 3 — RDP via Guacamole in browser" +``` + +--- + +### Task 15: Vault Management UI + +**Files:** +- Create: `frontend/composables/useVault.ts` +- Create: `frontend/pages/vault/index.vue`, `vault/keys.vue`, `vault/credentials.vue` +- Create: `frontend/components/vault/KeyImportDialog.vue`, `CredentialForm.vue` + +- [ ] **Step 1: Create useVault composable** + +`frontend/composables/useVault.ts`: +```typescript +import { useAuthStore } from '~/stores/auth.store' + +export function useVault() { + const auth = useAuthStore() + const headers = () => ({ Authorization: `Bearer ${auth.token}` }) + + // SSH Keys + async function listKeys() { + return $fetch('/api/ssh-keys', { headers: headers() }) + } + async function importKey(data: { name: string; privateKey: string; passphrase?: string; publicKey?: string }) { + return $fetch('/api/ssh-keys', { method: 'POST', body: data, headers: headers() }) + } + async function deleteKey(id: number) { + return $fetch(`/api/ssh-keys/${id}`, { method: 'DELETE', headers: headers() }) + } + + // Credentials + async function listCredentials() { + return $fetch('/api/credentials', { headers: headers() }) + } + async function createCredential(data: any) { + return $fetch('/api/credentials', { method: 'POST', body: data, headers: headers() }) + } + async function updateCredential(id: number, data: any) { + return $fetch(`/api/credentials/${id}`, { method: 'PUT', body: data, headers: headers() }) + } + async function deleteCredential(id: number) { + return $fetch(`/api/credentials/${id}`, { method: 'DELETE', headers: headers() }) + } + + return { + listKeys, importKey, deleteKey, + listCredentials, createCredential, updateCredential, deleteCredential, + } +} +``` + +- [ ] **Step 2: Create vault pages** + +`frontend/pages/vault/index.vue` — overview page with quick stats (number of keys, number of credentials). Links to keys and credentials sub-pages. + +`frontend/pages/vault/keys.vue` — list of SSH keys (name, type, fingerprint, created date). "Import Key" button opens `KeyImportDialog`. Delete button per key with confirmation. + +`frontend/pages/vault/credentials.vue` — list of credentials (name, username, type badge, associated hosts). "New Credential" button opens form. Edit and delete per credential. + +- [ ] **Step 3: Create KeyImportDialog** + +`frontend/components/vault/KeyImportDialog.vue` — PrimeVue Dialog. Fields: name (text), private key (textarea or file upload), public key (textarea or file upload, optional), passphrase (password input, optional). File upload accepts `.pem`, `.pub`, `id_rsa`, `id_ed25519`. + +- [ ] **Step 4: Create CredentialForm** + +`frontend/components/vault/CredentialForm.vue` — form component used in both create and edit modes. Fields: name, type dropdown (password/ssh_key), username, password (shown if type=password), SSH key dropdown (shown if type=ssh_key, populated from keys list), domain (optional, for RDP). + +- [ ] **Step 5: Commit** + +```bash +git add -A +git commit -m "feat: vault management UI — SSH key import + credential CRUD" +``` + +--- + +### Task 16: Quick Connect + Search + Connection History + +**Files:** +- Create: `frontend/components/connections/QuickConnect.vue` +- Modify: `frontend/pages/index.vue` — add quick connect bar, search, recent connections section + +- [ ] **Step 1: Create QuickConnect component** + +`frontend/components/connections/QuickConnect.vue`: +```vue + + + +``` + +- [ ] **Step 2: Add search filter to connection manager** + +Update `frontend/pages/index.vue`: add a search input above the host grid. Filter `connections.hosts` by search term (name, hostname, tags) client-side. Add a "Recent" section above the full list showing hosts sorted by `lastConnectedAt`. + +- [ ] **Step 3: Wire QuickConnect to terminal/RDP** + +When QuickConnect emits a connection, create a temporary (unsaved) connection and open a terminal or RDP session. If the user wants to save it afterward, show a "Save this connection?" prompt. + +- [ ] **Step 4: Commit** + +```bash +git add -A +git commit -m "feat: quick connect, search, recent connections" +``` + +--- + +### Task 17: Settings Page + Theming + +**Files:** +- Create: `frontend/pages/settings.vue` +- Modify: `frontend/layouts/default.vue` — add dark/light toggle + +- [ ] **Step 1: Create settings page** + +`frontend/pages/settings.vue`: +```vue + + + +``` + +- [ ] **Step 2: Wire theme toggle** + +Apply `dark` class to `` element based on theme setting. Persist via the settings API. Update Tailwind classes throughout to support both modes using `dark:` prefix. + +- [ ] **Step 3: Commit** + +```bash +git add -A +git commit -m "feat: Phase 4 — settings, theming, polish" +``` + +--- + +### Task 18: Final Integration + Docker Verify + +- [ ] **Step 1: Update app.module.ts — register all modules** + +Ensure `app.module.ts` imports: `PrismaModule`, `AuthModule`, `VaultModule`, `ConnectionsModule`, `TerminalModule`, `RdpModule`, `SettingsModule`, `ServeStaticModule`. + +- [ ] **Step 2: Full Docker build and test** + +```bash +docker compose build +docker compose up -d +docker logs -f wraith-app +``` + +Verify: +- Login works (admin@wraith.local / wraith) +- Connection manager loads, can create hosts and groups +- SSH terminal connects to a test host +- SFTP sidebar shows remote files +- RDP connects to a Windows target (if available) +- Vault: can import SSH key, create credential, associate with host +- Settings: theme, font size, scrollback persist + +- [ ] **Step 3: Commit + tag** + +```bash +git add -A +git commit -m "feat: Wraith v0.1.0 — SSH + SFTP + RDP in a browser" +git tag v0.1.0 +``` + +--- + +## Dependency Graph + +``` +Task 1 (scaffold) ──┬──→ Task 2 (prisma + bootstrap) ──→ Task 3 (encryption) ──→ Task 4 (auth) + │ ↓ + │ Task 6 (vault backend) + │ ↓ + └──→ Task 8 (frontend shell) ←── Task 5 (connections backend) + ↓ + Task 9 (docker compose up) + ↓ + ┌──────────────────────────────────────────────┐ + ↓ ↓ + Task 10 (SSH gateway) ──→ Task 11 (SFTP gateway) ──→ Task 12 (frontend terminal+sftp) + │ + ↓ + Task 13 (RDP backend) ──→ Task 14 (RDP frontend) + ↓ + Task 15 (vault UI) ──→ Task 16 (quick connect + search) ──→ Task 17 (settings) + ↓ + Task 18 (final integration) +``` + +**Parallelizable groups:** +- Tasks 3 + 5 (after Task 2) +- Tasks 6 + 7 (after Task 3) +- Tasks 10-12 and Tasks 13-14 (after Task 9) +- Tasks 15, 16, 17 (after Task 12) diff --git a/docs/superpowers/plans/2026-03-17-wraith-phase1-foundation.md b/docs/superpowers/plans/2026-03-17-wraith-phase1-foundation.md new file mode 100644 index 0000000..8e98ad2 --- /dev/null +++ b/docs/superpowers/plans/2026-03-17-wraith-phase1-foundation.md @@ -0,0 +1,2690 @@ +# Wraith Desktop — Phase 1: Foundation Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Stand up the Wraith desktop application skeleton — Wails v3 + Vue 3 + SQLite + vault encryption + connection CRUD + dark UI shell — with validated spikes for multi-window and RDP frame transport. + +**Architecture:** Go backend exposes services (vault, connections, settings, themes) via Wails v3 bindings to a Vue 3 frontend running in WebView2. SQLite (WAL mode) stores all data in `%APPDATA%\Wraith\wraith.db`. Master password derives a 256-bit AES key via Argon2id. + +**Tech Stack:** Go 1.22+, Wails v3 (alpha), Vue 3 (Composition API), Pinia, Tailwind CSS, Naive UI, SQLite (modernc.org/sqlite), Argon2id, AES-256-GCM + +**Spec:** `docs/superpowers/specs/2026-03-17-wraith-desktop-design.md` + +--- + +## File Structure + +``` +wraith/ + main.go # Wails app entry point, service registration + go.mod # Go module + go.sum + Taskfile.yml # Wails v3 build tasks + README.md # Developer documentation + LICENSE # MIT license + .gitignore + build/ + config.yml # Wails dev mode config + windows/ + Taskfile.yml # Windows build tasks + internal/ + db/ + sqlite.go # SQLite open, WAL mode, busy_timeout + sqlite_test.go + migrations.go # Embedded SQL migrations runner + migrations/ + 001_initial.sql # Full schema + vault/ + service.go # Argon2id key derivation, AES-256-GCM encrypt/decrypt + service_test.go + connections/ + service.go # Connection + group CRUD + service_test.go + search.go # Full-text search + tag filtering + search_test.go + settings/ + service.go # Key-value settings CRUD + service_test.go + theme/ + service.go # Theme CRUD + service_test.go + builtins.go # Dracula, Nord, Monokai, etc. + session/ + manager.go # Session manager (window-agnostic) + session.go # Session types + interfaces + plugin/ + interfaces.go # ProtocolHandler, Importer interfaces + registry.go # Plugin registration + frontend/ + index.html + package.json + vite.config.ts + tsconfig.json + tailwind.config.ts + postcss.config.js + src/ + main.ts # Vue app bootstrap + Pinia + Naive UI + App.vue # Root: unlock gate → main layout + router.ts # Vue Router (/, /settings, /vault) + layouts/ + MainLayout.vue # Sidebar + tabs + status bar + UnlockLayout.vue # Master password prompt + components/ + sidebar/ + ConnectionTree.vue # Group tree with connection entries + SidebarToggle.vue # Connections ↔ SFTP toggle + session/ + SessionContainer.vue # Holds active sessions (v-show) + TabBar.vue # Draggable tab bar + common/ + StatusBar.vue # Bottom status bar + stores/ + app.store.ts # Unlocked state, settings, active theme + connection.store.ts # Connections, groups, search + session.store.ts # Active sessions, tab order + composables/ + useConnections.ts # Connection CRUD wrappers + useVault.ts # Vault lock/unlock wrappers + assets/ + css/ + main.css # Tailwind imports + dark theme vars +``` + +--- + +## Task 1: Project Scaffold + +**Files:** +- Create: `go.mod`, `main.go`, `Taskfile.yml`, `.gitignore`, `LICENSE` +- Create: `frontend/package.json`, `frontend/vite.config.ts`, `frontend/tsconfig.json`, `frontend/index.html` +- Create: `frontend/src/main.ts`, `frontend/src/App.vue` + +- [ ] **Step 1: Initialize Go module** + +```bash +cd /Users/vstockwell/repos/wraith +go mod init github.com/vstockwell/wraith +``` + +- [ ] **Step 2: Install Wails v3 CLI (if not already installed)** + +```bash +go install github.com/wailsapp/wails/v3/cmd/wails3@latest +``` + +- [ ] **Step 3: Create `.gitignore`** + +```gitignore +# Go +bin/ +dist/ +*.exe + +# Frontend +frontend/node_modules/ +frontend/dist/ +frontend/bindings/ + +# Wails +build/bin/ + +# IDE +.vscode/ +.idea/ + +# OS +.DS_Store +Thumbs.db + +# App data +*.db +*.db-wal +*.db-shm + +# Superpowers +.superpowers/ +``` + +- [ ] **Step 4: Create `LICENSE` (MIT)** + +``` +MIT License + +Copyright (c) 2026 Vantz Stockwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +- [ ] **Step 5: Create `main.go` — minimal Wails v3 app** + +```go +package main + +import ( + "embed" + "log" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed all:frontend/dist +var assets embed.FS + +func main() { + app := application.New(application.Options{ + Name: "Wraith", + Description: "SSH + RDP + SFTP Desktop Client", + Services: []application.Service{}, + Assets: application.AssetOptions{ + Handler: application.BundledAssetFileServer(assets), + }, + }) + + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Title: "Wraith", + Width: 1400, + Height: 900, + URL: "/", + Windows: application.WindowsWindowOptions{ + BackdropType: application.Mica, + }, + BackgroundColour: application.NewRGBA(13, 17, 23, 255), + }) + + if err := app.Run(); err != nil { + log.Fatal(err) + } +} +``` + +- [ ] **Step 6: Create `frontend/package.json`** + +```json +{ + "name": "wraith-frontend", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "build:dev": "vue-tsc --noEmit && vite build --minify false --mode development", + "preview": "vite preview" + }, + "dependencies": { + "@wailsio/runtime": "latest", + "vue": "^3.5.0", + "vue-router": "^4.4.0", + "pinia": "^2.2.0", + "naive-ui": "^2.40.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.0.0", + "typescript": "^5.5.0", + "vite": "^6.0.0", + "vue-tsc": "^2.0.0", + "tailwindcss": "^4.0.0", + "@tailwindcss/vite": "^4.0.0" + } +} +``` + +- [ ] **Step 7: Create `frontend/vite.config.ts`** + +```ts +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import tailwindcss from "@tailwindcss/vite"; + +export default defineConfig({ + plugins: [vue(), tailwindcss()], +}); +``` + +- [ ] **Step 8: Create `frontend/tsconfig.json`** + +```json +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "noEmit": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"] +} +``` + +- [ ] **Step 9: Create `frontend/index.html`** + +```html + + + + + + Wraith + + +

+ + + +``` + +- [ ] **Step 10: Create `frontend/src/assets/css/main.css`** + +```css +@import "tailwindcss"; + +:root { + --wraith-bg-primary: #0d1117; + --wraith-bg-secondary: #161b22; + --wraith-bg-tertiary: #21262d; + --wraith-border: #30363d; + --wraith-text-primary: #e0e0e0; + --wraith-text-secondary: #8b949e; + --wraith-text-muted: #484f58; + --wraith-accent-blue: #58a6ff; + --wraith-accent-green: #3fb950; + --wraith-accent-red: #f85149; + --wraith-accent-yellow: #e3b341; +} + +body { + margin: 0; + font-family: system-ui, -apple-system, 'Segoe UI', sans-serif; + background: var(--wraith-bg-primary); + color: var(--wraith-text-primary); + overflow: hidden; + user-select: none; +} + +/* Scrollbar styling */ +::-webkit-scrollbar { width: 8px; } +::-webkit-scrollbar-track { background: var(--wraith-bg-primary); } +::-webkit-scrollbar-thumb { background: var(--wraith-border); border-radius: 4px; } +::-webkit-scrollbar-thumb:hover { background: var(--wraith-text-muted); } +``` + +- [ ] **Step 11: Create `frontend/src/main.ts`** + +```ts +import { createApp } from "vue"; +import { createPinia } from "pinia"; +import App from "./App.vue"; +import "./assets/css/main.css"; + +const app = createApp(App); +app.use(createPinia()); +app.mount("#app"); +``` + +- [ ] **Step 12: Create `frontend/src/App.vue` — placeholder** + +```vue + +``` + +- [ ] **Step 13: Install frontend dependencies and verify build** + +```bash +cd frontend && npm install && npm run build && cd .. +``` + +- [ ] **Step 14: Install Go dependencies and verify compilation** + +```bash +go mod tidy +go build -o bin/wraith.exe . +``` + +- [ ] **Step 15: Commit scaffold** + +```bash +git add .gitignore LICENSE main.go go.mod go.sum Taskfile.yml frontend/ +git commit -m "feat: Wails v3 + Vue 3 project scaffold with Tailwind dark theme" +``` + +--- + +## Task 2: SQLite Database Layer + +**Files:** +- Create: `internal/db/sqlite.go`, `internal/db/sqlite_test.go` +- Create: `internal/db/migrations.go`, `internal/db/migrations/001_initial.sql` + +- [ ] **Step 1: Write the test — SQLite opens with WAL mode** + +```go +// internal/db/sqlite_test.go +package db + +import ( + "os" + "path/filepath" + "testing" +) + +func TestOpenCreatesDatabase(t *testing.T) { + dir := t.TempDir() + dbPath := filepath.Join(dir, "test.db") + + db, err := Open(dbPath) + if err != nil { + t.Fatalf("Open() error: %v", err) + } + defer db.Close() + + // Verify file exists + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + t.Fatal("database file was not created") + } +} + +func TestOpenSetsWALMode(t *testing.T) { + dir := t.TempDir() + db, err := Open(filepath.Join(dir, "test.db")) + if err != nil { + t.Fatalf("Open() error: %v", err) + } + defer db.Close() + + var mode string + err = db.QueryRow("PRAGMA journal_mode").Scan(&mode) + if err != nil { + t.Fatalf("PRAGMA query error: %v", err) + } + if mode != "wal" { + t.Errorf("journal_mode = %q, want %q", mode, "wal") + } +} + +func TestOpenSetsBusyTimeout(t *testing.T) { + dir := t.TempDir() + db, err := Open(filepath.Join(dir, "test.db")) + if err != nil { + t.Fatalf("Open() error: %v", err) + } + defer db.Close() + + var timeout int + err = db.QueryRow("PRAGMA busy_timeout").Scan(&timeout) + if err != nil { + t.Fatalf("PRAGMA query error: %v", err) + } + if timeout != 5000 { + t.Errorf("busy_timeout = %d, want %d", timeout, 5000) + } +} +``` + +- [ ] **Step 2: Run tests to verify they fail** + +```bash +go test ./internal/db/ -v +``` + +Expected: FAIL — `Open` not defined + +- [ ] **Step 3: Implement `internal/db/sqlite.go`** + +```go +package db + +import ( + "database/sql" + "fmt" + "os" + "path/filepath" + + _ "modernc.org/sqlite" +) + +func Open(dbPath string) (*sql.DB, error) { + // Ensure parent directory exists + dir := filepath.Dir(dbPath) + if err := os.MkdirAll(dir, 0700); err != nil { + return nil, fmt.Errorf("create db directory: %w", err) + } + + db, err := sql.Open("sqlite", dbPath) + if err != nil { + return nil, fmt.Errorf("open database: %w", err) + } + + // Enable WAL mode for concurrent read/write + if _, err := db.Exec("PRAGMA journal_mode=WAL"); err != nil { + db.Close() + return nil, fmt.Errorf("set WAL mode: %w", err) + } + + // Set busy timeout to prevent "database is locked" errors + if _, err := db.Exec("PRAGMA busy_timeout=5000"); err != nil { + db.Close() + return nil, fmt.Errorf("set busy_timeout: %w", err) + } + + // Enable foreign keys + if _, err := db.Exec("PRAGMA foreign_keys=ON"); err != nil { + db.Close() + return nil, fmt.Errorf("enable foreign keys: %w", err) + } + + return db, nil +} +``` + +- [ ] **Step 4: Add `modernc.org/sqlite` dependency** + +```bash +go get modernc.org/sqlite +go mod tidy +``` + +- [ ] **Step 5: Run tests to verify they pass** + +```bash +go test ./internal/db/ -v +``` + +Expected: 3 PASS + +- [ ] **Step 6: Create migration SQL — `internal/db/migrations/001_initial.sql`** + +Full schema from spec (all tables: groups, connections, credentials, ssh_keys, themes, connection_history, host_keys, settings). + +```sql +-- 001_initial.sql +CREATE TABLE IF NOT EXISTS groups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + parent_id INTEGER REFERENCES groups(id) ON DELETE SET NULL, + sort_order INTEGER DEFAULT 0, + icon TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS ssh_keys ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + key_type TEXT, + fingerprint TEXT, + public_key TEXT, + encrypted_private_key TEXT NOT NULL, + passphrase_encrypted TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS credentials ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + username TEXT, + domain TEXT, + type TEXT NOT NULL CHECK(type IN ('password','ssh_key')), + encrypted_value TEXT, + ssh_key_id INTEGER REFERENCES ssh_keys(id) ON DELETE SET NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS connections ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + hostname TEXT NOT NULL, + port INTEGER NOT NULL DEFAULT 22, + protocol TEXT NOT NULL CHECK(protocol IN ('ssh','rdp')), + group_id INTEGER REFERENCES groups(id) ON DELETE SET NULL, + credential_id INTEGER REFERENCES credentials(id) ON DELETE SET NULL, + color TEXT, + tags TEXT DEFAULT '[]', + notes TEXT, + options TEXT DEFAULT '{}', + sort_order INTEGER DEFAULT 0, + last_connected DATETIME, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS themes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE, + foreground TEXT NOT NULL, + background TEXT NOT NULL, + cursor TEXT NOT NULL, + black TEXT NOT NULL, + red TEXT NOT NULL, + green TEXT NOT NULL, + yellow TEXT NOT NULL, + blue TEXT NOT NULL, + magenta TEXT NOT NULL, + cyan TEXT NOT NULL, + white TEXT NOT NULL, + bright_black TEXT NOT NULL, + bright_red TEXT NOT NULL, + bright_green TEXT NOT NULL, + bright_yellow TEXT NOT NULL, + bright_blue TEXT NOT NULL, + bright_magenta TEXT NOT NULL, + bright_cyan TEXT NOT NULL, + bright_white TEXT NOT NULL, + selection_bg TEXT, + selection_fg TEXT, + is_builtin BOOLEAN DEFAULT 0 +); + +CREATE TABLE IF NOT EXISTS connection_history ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + connection_id INTEGER NOT NULL REFERENCES connections(id) ON DELETE CASCADE, + protocol TEXT NOT NULL, + connected_at DATETIME DEFAULT CURRENT_TIMESTAMP, + disconnected_at DATETIME, + duration_secs INTEGER +); + +CREATE TABLE IF NOT EXISTS host_keys ( + hostname TEXT NOT NULL, + port INTEGER NOT NULL, + key_type TEXT NOT NULL, + fingerprint TEXT NOT NULL, + raw_key TEXT, + first_seen DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (hostname, port, key_type) +); + +CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL +); +``` + +- [ ] **Step 7: Write migration runner test** + +```go +// Add to internal/db/sqlite_test.go +func TestMigrateCreatesAllTables(t *testing.T) { + dir := t.TempDir() + db, err := Open(filepath.Join(dir, "test.db")) + if err != nil { + t.Fatalf("Open() error: %v", err) + } + defer db.Close() + + if err := Migrate(db); err != nil { + t.Fatalf("Migrate() error: %v", err) + } + + expectedTables := []string{ + "groups", "connections", "credentials", "ssh_keys", + "themes", "connection_history", "host_keys", "settings", + } + for _, table := range expectedTables { + var name string + err := db.QueryRow( + "SELECT name FROM sqlite_master WHERE type='table' AND name=?", table, + ).Scan(&name) + if err != nil { + t.Errorf("table %q not found: %v", table, err) + } + } +} +``` + +- [ ] **Step 8: Implement migration runner — `internal/db/migrations.go`** + +```go +package db + +import ( + "database/sql" + "embed" + "fmt" + "sort" +) + +//go:embed migrations/*.sql +var migrationFiles embed.FS + +func Migrate(db *sql.DB) error { + entries, err := migrationFiles.ReadDir("migrations") + if err != nil { + return fmt.Errorf("read migrations: %w", err) + } + + sort.Slice(entries, func(i, j int) bool { + return entries[i].Name() < entries[j].Name() + }) + + for _, entry := range entries { + content, err := migrationFiles.ReadFile("migrations/" + entry.Name()) + if err != nil { + return fmt.Errorf("read migration %s: %w", entry.Name(), err) + } + if _, err := db.Exec(string(content)); err != nil { + return fmt.Errorf("execute migration %s: %w", entry.Name(), err) + } + } + + return nil +} +``` + +- [ ] **Step 9: Run all db tests** + +```bash +go test ./internal/db/ -v +``` + +Expected: 4 PASS + +- [ ] **Step 10: Commit** + +```bash +git add internal/db/ +git commit -m "feat: SQLite database layer with WAL mode and schema migrations" +``` + +--- + +## Task 3: Vault Service — Encryption + +**Files:** +- Create: `internal/vault/service.go`, `internal/vault/service_test.go` + +- [ ] **Step 1: Write test — Argon2id key derivation produces consistent keys** + +```go +// internal/vault/service_test.go +package vault + +import ( + "testing" +) + +func TestDeriveKeyConsistent(t *testing.T) { + salt := []byte("test-salt-exactly-32-bytes-long!") + key1 := DeriveKey("mypassword", salt) + key2 := DeriveKey("mypassword", salt) + + if len(key1) != 32 { + t.Errorf("key length = %d, want 32", len(key1)) + } + if string(key1) != string(key2) { + t.Error("same password+salt produced different keys") + } +} + +func TestDeriveKeyDifferentPasswords(t *testing.T) { + salt := []byte("test-salt-exactly-32-bytes-long!") + key1 := DeriveKey("password1", salt) + key2 := DeriveKey("password2", salt) + + if string(key1) == string(key2) { + t.Error("different passwords produced same key") + } +} +``` + +- [ ] **Step 2: Run tests to verify they fail** + +```bash +go test ./internal/vault/ -v +``` + +Expected: FAIL — `DeriveKey` not defined + +- [ ] **Step 3: Implement key derivation** + +```go +// internal/vault/service.go +package vault + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/hex" + "errors" + "fmt" + "strings" + + "golang.org/x/crypto/argon2" +) + +// Argon2id parameters (OWASP recommended) +const ( + argonTime = 3 + argonMemory = 64 * 1024 // 64MB + argonThreads = 4 + argonKeyLen = 32 +) + +// DeriveKey derives a 256-bit key from password and salt using Argon2id. +func DeriveKey(password string, salt []byte) []byte { + return argon2.IDKey([]byte(password), salt, argonTime, argonMemory, argonThreads, argonKeyLen) +} +``` + +- [ ] **Step 4: Run tests to verify they pass** + +```bash +go get golang.org/x/crypto +go test ./internal/vault/ -v +``` + +Expected: 2 PASS + +- [ ] **Step 5: Write test — Encrypt/Decrypt round-trip** + +```go +// Add to internal/vault/service_test.go +func TestEncryptDecryptRoundTrip(t *testing.T) { + key := DeriveKey("testpassword", []byte("test-salt-32-bytes-long-exactly!")) + vs := NewVaultService(key) + + plaintext := "super-secret-ssh-key-data" + encrypted, err := vs.Encrypt(plaintext) + if err != nil { + t.Fatalf("Encrypt() error: %v", err) + } + + // Must start with v1: prefix + if !strings.HasPrefix(encrypted, "v1:") { + t.Errorf("encrypted does not start with v1: prefix: %q", encrypted[:10]) + } + + decrypted, err := vs.Decrypt(encrypted) + if err != nil { + t.Fatalf("Decrypt() error: %v", err) + } + + if decrypted != plaintext { + t.Errorf("Decrypt() = %q, want %q", decrypted, plaintext) + } +} + +func TestEncryptProducesDifferentCiphertexts(t *testing.T) { + key := DeriveKey("testpassword", []byte("test-salt-32-bytes-long-exactly!")) + vs := NewVaultService(key) + + enc1, _ := vs.Encrypt("same-data") + enc2, _ := vs.Encrypt("same-data") + + if enc1 == enc2 { + t.Error("two encryptions of same data produced identical ciphertext (IV reuse)") + } +} + +func TestDecryptWrongKey(t *testing.T) { + key1 := DeriveKey("password1", []byte("test-salt-32-bytes-long-exactly!")) + key2 := DeriveKey("password2", []byte("test-salt-32-bytes-long-exactly!")) + + vs1 := NewVaultService(key1) + vs2 := NewVaultService(key2) + + encrypted, _ := vs1.Encrypt("secret") + _, err := vs2.Decrypt(encrypted) + if err == nil { + t.Error("Decrypt() with wrong key should return error") + } +} + +func TestDecryptInvalidFormat(t *testing.T) { + key := DeriveKey("test", []byte("test-salt-32-bytes-long-exactly!")) + vs := NewVaultService(key) + + _, err := vs.Decrypt("not-valid-format") + if err == nil { + t.Error("Decrypt() with invalid format should return error") + } +} +``` + +- [ ] **Step 6: Implement Encrypt/Decrypt** + +```go +// Add to internal/vault/service.go + +// VaultService handles encryption and decryption of sensitive data. +type VaultService struct { + key []byte +} + +// NewVaultService creates a vault with the given AES-256 key. +func NewVaultService(key []byte) *VaultService { + return &VaultService{key: key} +} + +// Encrypt encrypts plaintext using AES-256-GCM. +// Returns "v1:{iv_hex}:{sealed_hex}" where sealed = ciphertext || authTag. +func (v *VaultService) Encrypt(plaintext string) (string, error) { + block, err := aes.NewCipher(v.key) + if err != nil { + return "", fmt.Errorf("create cipher: %w", err) + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return "", fmt.Errorf("create GCM: %w", err) + } + + iv := make([]byte, gcm.NonceSize()) // 12 bytes + if _, err := rand.Read(iv); err != nil { + return "", fmt.Errorf("generate IV: %w", err) + } + + sealed := gcm.Seal(nil, iv, []byte(plaintext), nil) + + return fmt.Sprintf("v1:%s:%s", hex.EncodeToString(iv), hex.EncodeToString(sealed)), nil +} + +// Decrypt decrypts a "v1:{iv_hex}:{sealed_hex}" string. +func (v *VaultService) Decrypt(encrypted string) (string, error) { + parts := strings.SplitN(encrypted, ":", 3) + if len(parts) != 3 || parts[0] != "v1" { + return "", errors.New("invalid encrypted format: expected v1:{iv}:{sealed}") + } + + iv, err := hex.DecodeString(parts[1]) + if err != nil { + return "", fmt.Errorf("decode IV: %w", err) + } + + sealed, err := hex.DecodeString(parts[2]) + if err != nil { + return "", fmt.Errorf("decode sealed data: %w", err) + } + + block, err := aes.NewCipher(v.key) + if err != nil { + return "", fmt.Errorf("create cipher: %w", err) + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return "", fmt.Errorf("create GCM: %w", err) + } + + plaintext, err := gcm.Open(nil, iv, sealed, nil) + if err != nil { + return "", fmt.Errorf("decrypt: %w", err) + } + + return string(plaintext), nil +} +``` + +- [ ] **Step 7: Run all vault tests** + +```bash +go test ./internal/vault/ -v +``` + +Expected: 6 PASS + +- [ ] **Step 8: Write test — GenerateSalt produces 32 random bytes** + +```go +// Add to internal/vault/service_test.go +func TestGenerateSalt(t *testing.T) { + salt1, err := GenerateSalt() + if err != nil { + t.Fatalf("GenerateSalt() error: %v", err) + } + if len(salt1) != 32 { + t.Errorf("salt length = %d, want 32", len(salt1)) + } + + salt2, _ := GenerateSalt() + if string(salt1) == string(salt2) { + t.Error("two calls to GenerateSalt produced identical salt") + } +} +``` + +- [ ] **Step 9: Implement GenerateSalt** + +```go +// Add to internal/vault/service.go + +// GenerateSalt generates a 32-byte random salt for Argon2id. +func GenerateSalt() ([]byte, error) { + salt := make([]byte, 32) + if _, err := rand.Read(salt); err != nil { + return nil, fmt.Errorf("generate salt: %w", err) + } + return salt, nil +} +``` + +- [ ] **Step 10: Run all vault tests** + +```bash +go test ./internal/vault/ -v +``` + +Expected: 7 PASS + +- [ ] **Step 11: Commit** + +```bash +git add internal/vault/ +git commit -m "feat: vault service — Argon2id key derivation + AES-256-GCM encrypt/decrypt" +``` + +--- + +## Task 4: Settings Service + +**Files:** +- Create: `internal/settings/service.go`, `internal/settings/service_test.go` + +- [ ] **Step 1: Write tests** + +```go +// internal/settings/service_test.go +package settings + +import ( + "path/filepath" + "testing" + + "github.com/vstockwell/wraith/internal/db" +) + +func setupTestDB(t *testing.T) *SettingsService { + t.Helper() + d, err := db.Open(filepath.Join(t.TempDir(), "test.db")) + if err != nil { + t.Fatal(err) + } + if err := db.Migrate(d); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { d.Close() }) + return NewSettingsService(d) +} + +func TestSetAndGet(t *testing.T) { + s := setupTestDB(t) + + if err := s.Set("theme", "dracula"); err != nil { + t.Fatalf("Set() error: %v", err) + } + + val, err := s.Get("theme") + if err != nil { + t.Fatalf("Get() error: %v", err) + } + if val != "dracula" { + t.Errorf("Get() = %q, want %q", val, "dracula") + } +} + +func TestGetMissing(t *testing.T) { + s := setupTestDB(t) + + val, err := s.Get("nonexistent") + if err != nil { + t.Fatalf("Get() error: %v", err) + } + if val != "" { + t.Errorf("Get() = %q, want empty string", val) + } +} + +func TestSetOverwrites(t *testing.T) { + s := setupTestDB(t) + + s.Set("key", "value1") + s.Set("key", "value2") + + val, _ := s.Get("key") + if val != "value2" { + t.Errorf("Get() = %q, want %q", val, "value2") + } +} + +func TestGetWithDefault(t *testing.T) { + s := setupTestDB(t) + + val := s.GetDefault("missing", "fallback") + if val != "fallback" { + t.Errorf("GetDefault() = %q, want %q", val, "fallback") + } +} +``` + +- [ ] **Step 2: Run tests to verify they fail** + +```bash +go test ./internal/settings/ -v +``` + +- [ ] **Step 3: Implement settings service** + +```go +// internal/settings/service.go +package settings + +import "database/sql" + +type SettingsService struct { + db *sql.DB +} + +func NewSettingsService(db *sql.DB) *SettingsService { + return &SettingsService{db: db} +} + +func (s *SettingsService) Get(key string) (string, error) { + var value string + err := s.db.QueryRow("SELECT value FROM settings WHERE key = ?", key).Scan(&value) + if err == sql.ErrNoRows { + return "", nil + } + return value, err +} + +func (s *SettingsService) GetDefault(key, defaultValue string) string { + val, err := s.Get(key) + if err != nil || val == "" { + return defaultValue + } + return val +} + +func (s *SettingsService) Set(key, value string) error { + _, err := s.db.Exec( + "INSERT INTO settings (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = ?", + key, value, value, + ) + return err +} + +func (s *SettingsService) Delete(key string) error { + _, err := s.db.Exec("DELETE FROM settings WHERE key = ?", key) + return err +} +``` + +- [ ] **Step 4: Run tests** + +```bash +go test ./internal/settings/ -v +``` + +Expected: 4 PASS + +- [ ] **Step 5: Commit** + +```bash +git add internal/settings/ +git commit -m "feat: settings service — key-value store with upsert" +``` + +--- + +## Task 5: Connection + Group CRUD + +**Files:** +- Create: `internal/connections/service.go`, `internal/connections/service_test.go` + +- [ ] **Step 1: Write connection model types** + +```go +// internal/connections/service.go +package connections + +import ( + "database/sql" + "encoding/json" + "fmt" + "time" +) + +type Group struct { + ID int64 `json:"id"` + Name string `json:"name"` + ParentID *int64 `json:"parentId"` + SortOrder int `json:"sortOrder"` + Icon string `json:"icon"` + CreatedAt time.Time `json:"createdAt"` + Children []Group `json:"children,omitempty"` +} + +type Connection struct { + ID int64 `json:"id"` + Name string `json:"name"` + Hostname string `json:"hostname"` + Port int `json:"port"` + Protocol string `json:"protocol"` + GroupID *int64 `json:"groupId"` + CredentialID *int64 `json:"credentialId"` + Color string `json:"color"` + Tags []string `json:"tags"` + Notes string `json:"notes"` + Options string `json:"options"` + SortOrder int `json:"sortOrder"` + LastConnected *time.Time `json:"lastConnected"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` +} + +type ConnectionService struct { + db *sql.DB +} + +func NewConnectionService(db *sql.DB) *ConnectionService { + return &ConnectionService{db: db} +} +``` + +- [ ] **Step 2: Write tests for group CRUD** + +```go +// internal/connections/service_test.go +package connections + +import ( + "path/filepath" + "testing" + + "github.com/vstockwell/wraith/internal/db" +) + +func setupTestDB(t *testing.T) *ConnectionService { + t.Helper() + d, err := db.Open(filepath.Join(t.TempDir(), "test.db")) + if err != nil { + t.Fatal(err) + } + if err := db.Migrate(d); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { d.Close() }) + return NewConnectionService(d) +} + +func TestCreateGroup(t *testing.T) { + svc := setupTestDB(t) + + g, err := svc.CreateGroup("Vantz's Stuff", nil) + if err != nil { + t.Fatalf("CreateGroup() error: %v", err) + } + if g.ID == 0 { + t.Error("group ID should not be zero") + } + if g.Name != "Vantz's Stuff" { + t.Errorf("Name = %q, want %q", g.Name, "Vantz's Stuff") + } +} + +func TestCreateSubGroup(t *testing.T) { + svc := setupTestDB(t) + + parent, _ := svc.CreateGroup("Parent", nil) + parentID := parent.ID + child, err := svc.CreateGroup("Child", &parentID) + if err != nil { + t.Fatalf("CreateGroup() error: %v", err) + } + if child.ParentID == nil || *child.ParentID != parent.ID { + t.Error("child ParentID should match parent ID") + } +} + +func TestListGroups(t *testing.T) { + svc := setupTestDB(t) + svc.CreateGroup("Group A", nil) + svc.CreateGroup("Group B", nil) + + groups, err := svc.ListGroups() + if err != nil { + t.Fatalf("ListGroups() error: %v", err) + } + if len(groups) != 2 { + t.Errorf("len(groups) = %d, want 2", len(groups)) + } +} + +func TestDeleteGroup(t *testing.T) { + svc := setupTestDB(t) + g, _ := svc.CreateGroup("ToDelete", nil) + + if err := svc.DeleteGroup(g.ID); err != nil { + t.Fatalf("DeleteGroup() error: %v", err) + } + + groups, _ := svc.ListGroups() + if len(groups) != 0 { + t.Error("group should have been deleted") + } +} +``` + +- [ ] **Step 3: Implement group CRUD methods** + +```go +// Add to internal/connections/service.go + +func (s *ConnectionService) CreateGroup(name string, parentID *int64) (*Group, error) { + result, err := s.db.Exec( + "INSERT INTO groups (name, parent_id) VALUES (?, ?)", + name, parentID, + ) + if err != nil { + return nil, fmt.Errorf("create group: %w", err) + } + id, _ := result.LastInsertId() + return &Group{ID: id, Name: name, ParentID: parentID}, nil +} + +func (s *ConnectionService) ListGroups() ([]Group, error) { + rows, err := s.db.Query("SELECT id, name, parent_id, sort_order, COALESCE(icon,''), created_at FROM groups ORDER BY sort_order, name") + if err != nil { + return nil, fmt.Errorf("list groups: %w", err) + } + defer rows.Close() + + var groups []Group + for rows.Next() { + var g Group + if err := rows.Scan(&g.ID, &g.Name, &g.ParentID, &g.SortOrder, &g.Icon, &g.CreatedAt); err != nil { + return nil, err + } + groups = append(groups, g) + } + return groups, nil +} + +func (s *ConnectionService) DeleteGroup(id int64) error { + _, err := s.db.Exec("DELETE FROM groups WHERE id = ?", id) + return err +} +``` + +- [ ] **Step 4: Run group tests** + +```bash +go test ./internal/connections/ -v -run "TestCreateGroup|TestCreateSubGroup|TestListGroups|TestDeleteGroup" +``` + +Expected: 4 PASS + +- [ ] **Step 5: Write tests for connection CRUD** + +```go +// Add to internal/connections/service_test.go + +func TestCreateConnection(t *testing.T) { + svc := setupTestDB(t) + + conn, err := svc.CreateConnection(CreateConnectionInput{ + Name: "Asgard", + Hostname: "192.168.1.4", + Port: 22, + Protocol: "ssh", + Tags: []string{"Prod", "Linux"}, + }) + if err != nil { + t.Fatalf("CreateConnection() error: %v", err) + } + if conn.Name != "Asgard" { + t.Errorf("Name = %q, want %q", conn.Name, "Asgard") + } + if len(conn.Tags) != 2 { + t.Errorf("len(Tags) = %d, want 2", len(conn.Tags)) + } +} + +func TestListConnections(t *testing.T) { + svc := setupTestDB(t) + svc.CreateConnection(CreateConnectionInput{Name: "Host1", Hostname: "10.0.0.1", Port: 22, Protocol: "ssh"}) + svc.CreateConnection(CreateConnectionInput{Name: "Host2", Hostname: "10.0.0.2", Port: 3389, Protocol: "rdp"}) + + conns, err := svc.ListConnections() + if err != nil { + t.Fatalf("ListConnections() error: %v", err) + } + if len(conns) != 2 { + t.Errorf("len(conns) = %d, want 2", len(conns)) + } +} + +func TestUpdateConnection(t *testing.T) { + svc := setupTestDB(t) + conn, _ := svc.CreateConnection(CreateConnectionInput{Name: "Old", Hostname: "10.0.0.1", Port: 22, Protocol: "ssh"}) + + updated, err := svc.UpdateConnection(conn.ID, UpdateConnectionInput{Name: strPtr("New")}) + if err != nil { + t.Fatalf("UpdateConnection() error: %v", err) + } + if updated.Name != "New" { + t.Errorf("Name = %q, want %q", updated.Name, "New") + } +} + +func TestDeleteConnection(t *testing.T) { + svc := setupTestDB(t) + conn, _ := svc.CreateConnection(CreateConnectionInput{Name: "Del", Hostname: "10.0.0.1", Port: 22, Protocol: "ssh"}) + + if err := svc.DeleteConnection(conn.ID); err != nil { + t.Fatalf("DeleteConnection() error: %v", err) + } + conns, _ := svc.ListConnections() + if len(conns) != 0 { + t.Error("connection should have been deleted") + } +} + +func strPtr(s string) *string { return &s } +``` + +- [ ] **Step 6: Implement connection CRUD** + +```go +// Add to internal/connections/service.go + +type CreateConnectionInput struct { + Name string `json:"name"` + Hostname string `json:"hostname"` + Port int `json:"port"` + Protocol string `json:"protocol"` + GroupID *int64 `json:"groupId"` + CredentialID *int64 `json:"credentialId"` + Color string `json:"color"` + Tags []string `json:"tags"` + Notes string `json:"notes"` + Options string `json:"options"` +} + +type UpdateConnectionInput struct { + Name *string `json:"name"` + Hostname *string `json:"hostname"` + Port *int `json:"port"` + GroupID *int64 `json:"groupId"` + CredentialID *int64 `json:"credentialId"` + Color *string `json:"color"` + Tags []string `json:"tags"` + Notes *string `json:"notes"` + Options *string `json:"options"` +} + +func (s *ConnectionService) CreateConnection(input CreateConnectionInput) (*Connection, error) { + tags, _ := json.Marshal(input.Tags) + if input.Tags == nil { + tags = []byte("[]") + } + options := input.Options + if options == "" { + options = "{}" + } + + result, err := s.db.Exec( + `INSERT INTO connections (name, hostname, port, protocol, group_id, credential_id, color, tags, notes, options) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + input.Name, input.Hostname, input.Port, input.Protocol, + input.GroupID, input.CredentialID, input.Color, string(tags), input.Notes, options, + ) + if err != nil { + return nil, fmt.Errorf("create connection: %w", err) + } + + id, _ := result.LastInsertId() + return s.GetConnection(id) +} + +func (s *ConnectionService) GetConnection(id int64) (*Connection, error) { + var conn Connection + var tagsStr string + err := s.db.QueryRow( + `SELECT id, name, hostname, port, protocol, group_id, credential_id, + COALESCE(color,''), tags, COALESCE(notes,''), COALESCE(options,'{}'), + sort_order, last_connected, created_at, updated_at + FROM connections WHERE id = ?`, id, + ).Scan(&conn.ID, &conn.Name, &conn.Hostname, &conn.Port, &conn.Protocol, + &conn.GroupID, &conn.CredentialID, &conn.Color, &tagsStr, &conn.Notes, + &conn.Options, &conn.SortOrder, &conn.LastConnected, &conn.CreatedAt, &conn.UpdatedAt) + if err != nil { + return nil, fmt.Errorf("get connection: %w", err) + } + json.Unmarshal([]byte(tagsStr), &conn.Tags) + return &conn, nil +} + +func (s *ConnectionService) ListConnections() ([]Connection, error) { + rows, err := s.db.Query( + `SELECT id, name, hostname, port, protocol, group_id, credential_id, + COALESCE(color,''), tags, COALESCE(notes,''), COALESCE(options,'{}'), + sort_order, last_connected, created_at, updated_at + FROM connections ORDER BY sort_order, name`) + if err != nil { + return nil, fmt.Errorf("list connections: %w", err) + } + defer rows.Close() + + var conns []Connection + for rows.Next() { + var c Connection + var tagsStr string + if err := rows.Scan(&c.ID, &c.Name, &c.Hostname, &c.Port, &c.Protocol, + &c.GroupID, &c.CredentialID, &c.Color, &tagsStr, &c.Notes, &c.Options, + &c.SortOrder, &c.LastConnected, &c.CreatedAt, &c.UpdatedAt); err != nil { + return nil, err + } + json.Unmarshal([]byte(tagsStr), &c.Tags) + conns = append(conns, c) + } + return conns, nil +} + +func (s *ConnectionService) UpdateConnection(id int64, input UpdateConnectionInput) (*Connection, error) { + setClauses := []string{"updated_at = CURRENT_TIMESTAMP"} + args := []interface{}{} + + if input.Name != nil { + setClauses = append(setClauses, "name = ?") + args = append(args, *input.Name) + } + if input.Hostname != nil { + setClauses = append(setClauses, "hostname = ?") + args = append(args, *input.Hostname) + } + if input.Port != nil { + setClauses = append(setClauses, "port = ?") + args = append(args, *input.Port) + } + if input.Tags != nil { + tags, _ := json.Marshal(input.Tags) + setClauses = append(setClauses, "tags = ?") + args = append(args, string(tags)) + } + if input.Notes != nil { + setClauses = append(setClauses, "notes = ?") + args = append(args, *input.Notes) + } + if input.Color != nil { + setClauses = append(setClauses, "color = ?") + args = append(args, *input.Color) + } + if input.Options != nil { + setClauses = append(setClauses, "options = ?") + args = append(args, *input.Options) + } + + args = append(args, id) + query := fmt.Sprintf("UPDATE connections SET %s WHERE id = ?", strings.Join(setClauses, ", ")) + if _, err := s.db.Exec(query, args...); err != nil { + return nil, fmt.Errorf("update connection: %w", err) + } + return s.GetConnection(id) +} + +func (s *ConnectionService) DeleteConnection(id int64) error { + _, err := s.db.Exec("DELETE FROM connections WHERE id = ?", id) + return err +} +``` + +- [ ] **Step 7: Run all connection tests** + +```bash +go test ./internal/connections/ -v +``` + +Expected: 8 PASS (4 group + 4 connection) + +- [ ] **Step 8: Commit** + +```bash +git add internal/connections/ +git commit -m "feat: connection + group CRUD with JSON tags and options" +``` + +--- + +## Task 6: Connection Search + Tag Filtering + +**Files:** +- Create: `internal/connections/search.go`, `internal/connections/search_test.go` + +- [ ] **Step 1: Write search tests** + +```go +// internal/connections/search_test.go +package connections + +import "testing" + +func TestSearchByName(t *testing.T) { + svc := setupTestDB(t) + svc.CreateConnection(CreateConnectionInput{Name: "Asgard", Hostname: "192.168.1.4", Port: 22, Protocol: "ssh"}) + svc.CreateConnection(CreateConnectionInput{Name: "Docker", Hostname: "155.254.29.221", Port: 22, Protocol: "ssh"}) + + results, err := svc.Search("asg") + if err != nil { + t.Fatalf("Search() error: %v", err) + } + if len(results) != 1 { + t.Fatalf("len(results) = %d, want 1", len(results)) + } + if results[0].Name != "Asgard" { + t.Errorf("Name = %q, want %q", results[0].Name, "Asgard") + } +} + +func TestSearchByHostname(t *testing.T) { + svc := setupTestDB(t) + svc.CreateConnection(CreateConnectionInput{Name: "Asgard", Hostname: "192.168.1.4", Port: 22, Protocol: "ssh"}) + + results, _ := svc.Search("192.168") + if len(results) != 1 { + t.Errorf("len(results) = %d, want 1", len(results)) + } +} + +func TestSearchByTag(t *testing.T) { + svc := setupTestDB(t) + svc.CreateConnection(CreateConnectionInput{Name: "ProdServer", Hostname: "10.0.0.1", Port: 22, Protocol: "ssh", Tags: []string{"Prod", "Linux"}}) + svc.CreateConnection(CreateConnectionInput{Name: "DevServer", Hostname: "10.0.0.2", Port: 22, Protocol: "ssh", Tags: []string{"Dev", "Linux"}}) + + results, _ := svc.Search("Prod") + if len(results) != 1 { + t.Errorf("len(results) = %d, want 1", len(results)) + } +} + +func TestFilterByTag(t *testing.T) { + svc := setupTestDB(t) + svc.CreateConnection(CreateConnectionInput{Name: "A", Hostname: "10.0.0.1", Port: 22, Protocol: "ssh", Tags: []string{"Prod"}}) + svc.CreateConnection(CreateConnectionInput{Name: "B", Hostname: "10.0.0.2", Port: 22, Protocol: "ssh", Tags: []string{"Dev"}}) + svc.CreateConnection(CreateConnectionInput{Name: "C", Hostname: "10.0.0.3", Port: 22, Protocol: "ssh", Tags: []string{"Prod", "Linux"}}) + + results, _ := svc.FilterByTag("Prod") + if len(results) != 2 { + t.Errorf("len(results) = %d, want 2", len(results)) + } +} +``` + +- [ ] **Step 2: Implement search** + +```go +// internal/connections/search.go +package connections + +import "fmt" + +func (s *ConnectionService) Search(query string) ([]Connection, error) { + like := "%" + query + "%" + rows, err := s.db.Query( + `SELECT id, name, hostname, port, protocol, group_id, credential_id, + COALESCE(color,''), tags, COALESCE(notes,''), COALESCE(options,'{}'), + sort_order, last_connected, created_at, updated_at + FROM connections + WHERE name LIKE ? COLLATE NOCASE + OR hostname LIKE ? COLLATE NOCASE + OR tags LIKE ? COLLATE NOCASE + OR notes LIKE ? COLLATE NOCASE + ORDER BY last_connected DESC NULLS LAST, name`, + like, like, like, like, + ) + if err != nil { + return nil, fmt.Errorf("search connections: %w", err) + } + defer rows.Close() + return scanConnections(rows) +} + +func (s *ConnectionService) FilterByTag(tag string) ([]Connection, error) { + rows, err := s.db.Query( + `SELECT c.id, c.name, c.hostname, c.port, c.protocol, c.group_id, c.credential_id, + COALESCE(c.color,''), c.tags, COALESCE(c.notes,''), COALESCE(c.options,'{}'), + c.sort_order, c.last_connected, c.created_at, c.updated_at + FROM connections c, json_each(c.tags) AS t + WHERE t.value = ? + ORDER BY c.name`, tag, + ) + if err != nil { + return nil, fmt.Errorf("filter by tag: %w", err) + } + defer rows.Close() + return scanConnections(rows) +} +``` + +- [ ] **Step 3: Extract `scanConnections` helper to `service.go`** + +```go +// Add to internal/connections/service.go +import "database/sql" + +func scanConnections(rows *sql.Rows) ([]Connection, error) { + var conns []Connection + for rows.Next() { + var c Connection + var tagsStr string + if err := rows.Scan(&c.ID, &c.Name, &c.Hostname, &c.Port, &c.Protocol, + &c.GroupID, &c.CredentialID, &c.Color, &tagsStr, &c.Notes, &c.Options, + &c.SortOrder, &c.LastConnected, &c.CreatedAt, &c.UpdatedAt); err != nil { + return nil, err + } + json.Unmarshal([]byte(tagsStr), &c.Tags) + conns = append(conns, c) + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("scan connections: %w", err) + } + return conns, nil +} +``` + +Refactor `ListConnections` to use `scanConnections`. + +- [ ] **Step 4: Run search tests** + +```bash +go test ./internal/connections/ -v +``` + +Expected: 12 PASS + +- [ ] **Step 5: Commit** + +```bash +git add internal/connections/ +git commit -m "feat: connection search by name/hostname/tag with json_each filtering" +``` + +--- + +## Task 7: Theme Service + Built-in Themes + +**Files:** +- Create: `internal/theme/service.go`, `internal/theme/service_test.go`, `internal/theme/builtins.go` + +- [ ] **Step 1: Define theme type and built-in themes** + +```go +// internal/theme/builtins.go +package theme + +type Theme struct { + ID int64 `json:"id"` + Name string `json:"name"` + Foreground string `json:"foreground"` + Background string `json:"background"` + Cursor string `json:"cursor"` + Black string `json:"black"` + Red string `json:"red"` + Green string `json:"green"` + Yellow string `json:"yellow"` + Blue string `json:"blue"` + Magenta string `json:"magenta"` + Cyan string `json:"cyan"` + White string `json:"white"` + BrightBlack string `json:"brightBlack"` + BrightRed string `json:"brightRed"` + BrightGreen string `json:"brightGreen"` + BrightYellow string `json:"brightYellow"` + BrightBlue string `json:"brightBlue"` + BrightMagenta string `json:"brightMagenta"` + BrightCyan string `json:"brightCyan"` + BrightWhite string `json:"brightWhite"` + SelectionBg string `json:"selectionBg,omitempty"` + SelectionFg string `json:"selectionFg,omitempty"` + IsBuiltin bool `json:"isBuiltin"` +} + +var BuiltinThemes = []Theme{ + { + Name: "Dracula", IsBuiltin: true, + Foreground: "#f8f8f2", Background: "#282a36", Cursor: "#f8f8f2", + Black: "#21222c", Red: "#ff5555", Green: "#50fa7b", Yellow: "#f1fa8c", + Blue: "#bd93f9", Magenta: "#ff79c6", Cyan: "#8be9fd", White: "#f8f8f2", + BrightBlack: "#6272a4", BrightRed: "#ff6e6e", BrightGreen: "#69ff94", + BrightYellow: "#ffffa5", BrightBlue: "#d6acff", BrightMagenta: "#ff92df", + BrightCyan: "#a4ffff", BrightWhite: "#ffffff", + }, + { + Name: "Nord", IsBuiltin: true, + Foreground: "#d8dee9", Background: "#2e3440", Cursor: "#d8dee9", + Black: "#3b4252", Red: "#bf616a", Green: "#a3be8c", Yellow: "#ebcb8b", + Blue: "#81a1c1", Magenta: "#b48ead", Cyan: "#88c0d0", White: "#e5e9f0", + BrightBlack: "#4c566a", BrightRed: "#bf616a", BrightGreen: "#a3be8c", + BrightYellow: "#ebcb8b", BrightBlue: "#81a1c1", BrightMagenta: "#b48ead", + BrightCyan: "#8fbcbb", BrightWhite: "#eceff4", + }, + { + Name: "Monokai", IsBuiltin: true, + Foreground: "#f8f8f2", Background: "#272822", Cursor: "#f8f8f0", + Black: "#272822", Red: "#f92672", Green: "#a6e22e", Yellow: "#f4bf75", + Blue: "#66d9ef", Magenta: "#ae81ff", Cyan: "#a1efe4", White: "#f8f8f2", + BrightBlack: "#75715e", BrightRed: "#f92672", BrightGreen: "#a6e22e", + BrightYellow: "#f4bf75", BrightBlue: "#66d9ef", BrightMagenta: "#ae81ff", + BrightCyan: "#a1efe4", BrightWhite: "#f9f8f5", + }, + { + Name: "One Dark", IsBuiltin: true, + Foreground: "#abb2bf", Background: "#282c34", Cursor: "#528bff", + Black: "#282c34", Red: "#e06c75", Green: "#98c379", Yellow: "#e5c07b", + Blue: "#61afef", Magenta: "#c678dd", Cyan: "#56b6c2", White: "#abb2bf", + BrightBlack: "#545862", BrightRed: "#e06c75", BrightGreen: "#98c379", + BrightYellow: "#e5c07b", BrightBlue: "#61afef", BrightMagenta: "#c678dd", + BrightCyan: "#56b6c2", BrightWhite: "#c8ccd4", + }, + { + Name: "Solarized Dark", IsBuiltin: true, + Foreground: "#839496", Background: "#002b36", Cursor: "#839496", + Black: "#073642", Red: "#dc322f", Green: "#859900", Yellow: "#b58900", + Blue: "#268bd2", Magenta: "#d33682", Cyan: "#2aa198", White: "#eee8d5", + BrightBlack: "#002b36", BrightRed: "#cb4b16", BrightGreen: "#586e75", + BrightYellow: "#657b83", BrightBlue: "#839496", BrightMagenta: "#6c71c4", + BrightCyan: "#93a1a1", BrightWhite: "#fdf6e3", + }, + { + Name: "Gruvbox Dark", IsBuiltin: true, + Foreground: "#ebdbb2", Background: "#282828", Cursor: "#ebdbb2", + Black: "#282828", Red: "#cc241d", Green: "#98971a", Yellow: "#d79921", + Blue: "#458588", Magenta: "#b16286", Cyan: "#689d6a", White: "#a89984", + BrightBlack: "#928374", BrightRed: "#fb4934", BrightGreen: "#b8bb26", + BrightYellow: "#fabd2f", BrightBlue: "#83a598", BrightMagenta: "#d3869b", + BrightCyan: "#8ec07c", BrightWhite: "#ebdbb2", + }, + { + Name: "MobaXTerm Classic", IsBuiltin: true, + Foreground: "#ececec", Background: "#242424", Cursor: "#b4b4c0", + Black: "#000000", Red: "#aa4244", Green: "#7e8d53", Yellow: "#e4b46d", + Blue: "#6e9aba", Magenta: "#9e5085", Cyan: "#80d5cf", White: "#cccccc", + BrightBlack: "#808080", BrightRed: "#cc7b7d", BrightGreen: "#a5b17c", + BrightYellow: "#ecc995", BrightBlue: "#96b6cd", BrightMagenta: "#c083ac", + BrightCyan: "#a9e2de", BrightWhite: "#cccccc", + }, +} +``` + +- [ ] **Step 2: Write test — seed built-in themes and list them** + +```go +// internal/theme/service_test.go +package theme + +import ( + "path/filepath" + "testing" + + "github.com/vstockwell/wraith/internal/db" +) + +func setupTestDB(t *testing.T) *ThemeService { + t.Helper() + d, err := db.Open(filepath.Join(t.TempDir(), "test.db")) + if err != nil { + t.Fatal(err) + } + if err := db.Migrate(d); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { d.Close() }) + return NewThemeService(d) +} + +func TestSeedBuiltins(t *testing.T) { + svc := setupTestDB(t) + if err := svc.SeedBuiltins(); err != nil { + t.Fatalf("SeedBuiltins() error: %v", err) + } + + themes, err := svc.List() + if err != nil { + t.Fatalf("List() error: %v", err) + } + if len(themes) != len(BuiltinThemes) { + t.Errorf("len(themes) = %d, want %d", len(themes), len(BuiltinThemes)) + } +} + +func TestSeedBuiltinsIdempotent(t *testing.T) { + svc := setupTestDB(t) + svc.SeedBuiltins() + svc.SeedBuiltins() // Second call should not duplicate + + themes, _ := svc.List() + if len(themes) != len(BuiltinThemes) { + t.Errorf("len(themes) = %d after double seed, want %d", len(themes), len(BuiltinThemes)) + } +} + +func TestGetByName(t *testing.T) { + svc := setupTestDB(t) + svc.SeedBuiltins() + + theme, err := svc.GetByName("Dracula") + if err != nil { + t.Fatalf("GetByName() error: %v", err) + } + if theme.Background != "#282a36" { + t.Errorf("Background = %q, want %q", theme.Background, "#282a36") + } +} +``` + +- [ ] **Step 3: Implement theme service** + +```go +// internal/theme/service.go +package theme + +import ( + "database/sql" + "fmt" +) + +type ThemeService struct { + db *sql.DB +} + +func NewThemeService(db *sql.DB) *ThemeService { + return &ThemeService{db: db} +} + +func (s *ThemeService) SeedBuiltins() error { + for _, t := range BuiltinThemes { + _, err := s.db.Exec( + `INSERT OR IGNORE INTO themes (name, foreground, background, cursor, + black, red, green, yellow, blue, magenta, cyan, white, + bright_black, bright_red, bright_green, bright_yellow, bright_blue, + bright_magenta, bright_cyan, bright_white, selection_bg, selection_fg, is_builtin) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,1)`, + t.Name, t.Foreground, t.Background, t.Cursor, + t.Black, t.Red, t.Green, t.Yellow, t.Blue, t.Magenta, t.Cyan, t.White, + t.BrightBlack, t.BrightRed, t.BrightGreen, t.BrightYellow, t.BrightBlue, + t.BrightMagenta, t.BrightCyan, t.BrightWhite, t.SelectionBg, t.SelectionFg, + ) + if err != nil { + return fmt.Errorf("seed theme %s: %w", t.Name, err) + } + } + return nil +} + +func (s *ThemeService) List() ([]Theme, error) { + rows, err := s.db.Query( + `SELECT id, name, foreground, background, cursor, + black, red, green, yellow, blue, magenta, cyan, white, + bright_black, bright_red, bright_green, bright_yellow, bright_blue, + bright_magenta, bright_cyan, bright_white, + COALESCE(selection_bg,''), COALESCE(selection_fg,''), is_builtin + FROM themes ORDER BY is_builtin DESC, name`) + if err != nil { + return nil, err + } + defer rows.Close() + + var themes []Theme + for rows.Next() { + var t Theme + if err := rows.Scan(&t.ID, &t.Name, &t.Foreground, &t.Background, &t.Cursor, + &t.Black, &t.Red, &t.Green, &t.Yellow, &t.Blue, &t.Magenta, &t.Cyan, &t.White, + &t.BrightBlack, &t.BrightRed, &t.BrightGreen, &t.BrightYellow, &t.BrightBlue, + &t.BrightMagenta, &t.BrightCyan, &t.BrightWhite, + &t.SelectionBg, &t.SelectionFg, &t.IsBuiltin); err != nil { + return nil, err + } + themes = append(themes, t) + } + return themes, nil +} + +func (s *ThemeService) GetByName(name string) (*Theme, error) { + var t Theme + err := s.db.QueryRow( + `SELECT id, name, foreground, background, cursor, + black, red, green, yellow, blue, magenta, cyan, white, + bright_black, bright_red, bright_green, bright_yellow, bright_blue, + bright_magenta, bright_cyan, bright_white, + COALESCE(selection_bg,''), COALESCE(selection_fg,''), is_builtin + FROM themes WHERE name = ?`, name, + ).Scan(&t.ID, &t.Name, &t.Foreground, &t.Background, &t.Cursor, + &t.Black, &t.Red, &t.Green, &t.Yellow, &t.Blue, &t.Magenta, &t.Cyan, &t.White, + &t.BrightBlack, &t.BrightRed, &t.BrightGreen, &t.BrightYellow, &t.BrightBlue, + &t.BrightMagenta, &t.BrightCyan, &t.BrightWhite, + &t.SelectionBg, &t.SelectionFg, &t.IsBuiltin) + if err != nil { + return nil, fmt.Errorf("get theme %s: %w", name, err) + } + return &t, nil +} +``` + +- [ ] **Step 4: Run theme tests** + +```bash +go test ./internal/theme/ -v +``` + +Expected: 3 PASS + +- [ ] **Step 5: Commit** + +```bash +git add internal/theme/ +git commit -m "feat: theme service with 7 built-in terminal color schemes" +``` + +--- + +## Task 8: Plugin Interfaces + Session Manager Skeleton + +**Files:** +- Create: `internal/plugin/interfaces.go`, `internal/plugin/registry.go` +- Create: `internal/session/session.go`, `internal/session/manager.go`, `internal/session/manager_test.go` + +- [ ] **Step 1: Define plugin interfaces** + +```go +// internal/plugin/interfaces.go +package plugin + +// ProtocolHandler defines how a protocol plugin connects and manages sessions. +type ProtocolHandler interface { + Name() string + Connect(config map[string]interface{}) (Session, error) + Disconnect(sessionID string) error +} + +// Session represents an active protocol session. +type Session interface { + ID() string + Protocol() string + Write(data []byte) error + Close() error +} + +// Importer parses configuration files from other tools. +type Importer interface { + Name() string + FileExtensions() []string + Parse(data []byte) (*ImportResult, error) +} + +// ImportResult holds parsed data from an imported config file. +type ImportResult struct { + Groups []ImportGroup `json:"groups"` + Connections []ImportConnection `json:"connections"` + HostKeys []ImportHostKey `json:"hostKeys"` + Theme *ImportTheme `json:"theme,omitempty"` +} + +type ImportGroup struct { + Name string `json:"name"` + ParentName string `json:"parentName,omitempty"` +} + +type ImportConnection struct { + Name string `json:"name"` + Hostname string `json:"hostname"` + Port int `json:"port"` + Protocol string `json:"protocol"` + Username string `json:"username"` + GroupName string `json:"groupName"` + Notes string `json:"notes"` +} + +type ImportHostKey struct { + Hostname string `json:"hostname"` + Port int `json:"port"` + KeyType string `json:"keyType"` + Fingerprint string `json:"fingerprint"` +} + +type ImportTheme struct { + Name string `json:"name"` + Foreground string `json:"foreground"` + Background string `json:"background"` + Cursor string `json:"cursor"` + Colors [16]string `json:"colors"` // ANSI 0-15 +} +``` + +- [ ] **Step 2: Define plugin registry** + +```go +// internal/plugin/registry.go +package plugin + +import "fmt" + +type Registry struct { + protocols map[string]ProtocolHandler + importers map[string]Importer +} + +func NewRegistry() *Registry { + return &Registry{ + protocols: make(map[string]ProtocolHandler), + importers: make(map[string]Importer), + } +} + +func (r *Registry) RegisterProtocol(handler ProtocolHandler) { + r.protocols[handler.Name()] = handler +} + +func (r *Registry) RegisterImporter(imp Importer) { + r.importers[imp.Name()] = imp +} + +func (r *Registry) GetProtocol(name string) (ProtocolHandler, error) { + h, ok := r.protocols[name] + if !ok { + return nil, fmt.Errorf("protocol handler %q not registered", name) + } + return h, nil +} + +func (r *Registry) GetImporter(name string) (Importer, error) { + imp, ok := r.importers[name] + if !ok { + return nil, fmt.Errorf("importer %q not registered", name) + } + return imp, nil +} + +func (r *Registry) ListProtocols() []string { + names := make([]string, 0, len(r.protocols)) + for name := range r.protocols { + names = append(names, name) + } + return names +} +``` + +- [ ] **Step 3: Define session types (data only — no behavior to test)** + +```go +// internal/session/session.go +package session + +import "time" + +type SessionState string + +const ( + StateConnecting SessionState = "connecting" + StateConnected SessionState = "connected" + StateDisconnected SessionState = "disconnected" + StateDetached SessionState = "detached" +) + +type SessionInfo struct { + ID string `json:"id"` + ConnectionID int64 `json:"connectionId"` + Protocol string `json:"protocol"` + State SessionState `json:"state"` + WindowID string `json:"windowId"` + TabPosition int `json:"tabPosition"` + ConnectedAt time.Time `json:"connectedAt"` +} +``` + +```go +// internal/session/manager.go +package session + +import ( + "fmt" + "sync" + + "github.com/google/uuid" +) + +const MaxSessions = 32 + +type Manager struct { + mu sync.RWMutex + sessions map[string]*SessionInfo +} + +func NewManager() *Manager { + return &Manager{ + sessions: make(map[string]*SessionInfo), + } +} + +func (m *Manager) Create(connectionID int64, protocol string) (*SessionInfo, error) { + m.mu.Lock() + defer m.mu.Unlock() + + if len(m.sessions) >= MaxSessions { + return nil, fmt.Errorf("maximum sessions (%d) reached", MaxSessions) + } + + s := &SessionInfo{ + ID: uuid.NewString(), + ConnectionID: connectionID, + Protocol: protocol, + State: StateConnecting, + TabPosition: len(m.sessions), + } + m.sessions[s.ID] = s + return s, nil +} + +func (m *Manager) Get(id string) (*SessionInfo, bool) { + m.mu.RLock() + defer m.mu.RUnlock() + s, ok := m.sessions[id] + return s, ok +} + +func (m *Manager) List() []*SessionInfo { + m.mu.RLock() + defer m.mu.RUnlock() + list := make([]*SessionInfo, 0, len(m.sessions)) + for _, s := range m.sessions { + list = append(list, s) + } + return list +} + +func (m *Manager) SetState(id string, state SessionState) error { + m.mu.Lock() + defer m.mu.Unlock() + s, ok := m.sessions[id] + if !ok { + return fmt.Errorf("session %s not found", id) + } + s.State = state + return nil +} + +func (m *Manager) Detach(id string) error { + return m.SetState(id, StateDetached) +} + +func (m *Manager) Reattach(id, windowID string) error { + m.mu.Lock() + defer m.mu.Unlock() + s, ok := m.sessions[id] + if !ok { + return fmt.Errorf("session %s not found", id) + } + s.State = StateConnected + s.WindowID = windowID + return nil +} + +func (m *Manager) Remove(id string) { + m.mu.Lock() + defer m.mu.Unlock() + delete(m.sessions, id) +} + +func (m *Manager) Count() int { + m.mu.RLock() + defer m.mu.RUnlock() + return len(m.sessions) +} +``` + +- [ ] **Step 4: Write session manager tests (TDD — tests before manager implementation)** + +Add `github.com/google/uuid` before running tests: +```bash +go get github.com/google/uuid +``` + +```go +// internal/session/manager_test.go +package session + +import "testing" + +func TestCreateSession(t *testing.T) { + m := NewManager() + s, err := m.Create(1, "ssh") + if err != nil { + t.Fatalf("Create() error: %v", err) + } + if s.ID == "" { + t.Error("session ID should not be empty") + } + if s.State != StateConnecting { + t.Errorf("State = %q, want %q", s.State, StateConnecting) + } +} + +func TestMaxSessions(t *testing.T) { + m := NewManager() + for i := 0; i < MaxSessions; i++ { + _, err := m.Create(int64(i), "ssh") + if err != nil { + t.Fatalf("Create() error at %d: %v", i, err) + } + } + _, err := m.Create(999, "ssh") + if err == nil { + t.Error("Create() should fail at max sessions") + } +} + +func TestDetachReattach(t *testing.T) { + m := NewManager() + s, _ := m.Create(1, "ssh") + m.SetState(s.ID, StateConnected) + + if err := m.Detach(s.ID); err != nil { + t.Fatalf("Detach() error: %v", err) + } + + got, _ := m.Get(s.ID) + if got.State != StateDetached { + t.Errorf("State = %q, want %q", got.State, StateDetached) + } + + if err := m.Reattach(s.ID, "window-1"); err != nil { + t.Fatalf("Reattach() error: %v", err) + } + + got, _ = m.Get(s.ID) + if got.State != StateConnected { + t.Errorf("State = %q, want %q", got.State, StateConnected) + } +} + +func TestRemoveSession(t *testing.T) { + m := NewManager() + s, _ := m.Create(1, "ssh") + m.Remove(s.ID) + if m.Count() != 0 { + t.Error("session should have been removed") + } +} +``` + +- [ ] **Step 5: Run session tests to verify they FAIL (manager not implemented yet)** + +```bash +go test ./internal/session/ -v +``` + +Expected: FAIL — `NewManager` not defined + +- [ ] **Step 5b: Implement session manager (manager.go — the code from Step 3's second block)** + +Move the `Manager` struct and methods into `manager.go` now that tests exist. + +- [ ] **Step 5c: Run session tests to verify they PASS** + +```bash +go test ./internal/session/ -v +``` + +Expected: 4 PASS + +- [ ] **Step 6: Commit** + +```bash +git add internal/plugin/ internal/session/ +git commit -m "feat: plugin interfaces + window-agnostic session manager with detach/reattach" +``` + +--- + +## Task 9: Wire Services into Wails App + +**Files:** +- Modify: `main.go` + +- [ ] **Step 1: Update `main.go` to initialize DB, vault, and register all services** + +Wire up SQLite, vault unlock flow, and register ConnectionService, SettingsService, ThemeService, and SessionManager as Wails services. The vault unlock happens via a frontend prompt (implemented in Task 10). + +Create a `WraithApp` struct that holds all services and exposes methods the frontend needs: +- `Unlock(password string) error` +- `IsFirstRun() bool` +- `CreateVault(password string) error` + +Register it as a Wails service alongside ConnectionService, ThemeService, and SettingsService. + +- [ ] **Step 2: Verify compilation** + +```bash +go build -o bin/wraith.exe . +``` + +- [ ] **Step 3: Commit** + +```bash +git add main.go +git commit -m "feat: wire all services into Wails app entry point" +``` + +--- + +## Task 10: Master Password Unlock UI + +**Files:** +- Create: `frontend/src/layouts/UnlockLayout.vue` +- Create: `frontend/src/stores/app.store.ts` +- Create: `frontend/src/composables/useVault.ts` +- Modify: `frontend/src/App.vue` + +- [ ] **Step 1: Create app store with unlock state** + +```ts +// frontend/src/stores/app.store.ts +import { defineStore } from "pinia"; +import { ref } from "vue"; + +export const useAppStore = defineStore("app", () => { + const unlocked = ref(false); + const isFirstRun = ref(false); + + function setUnlocked(val: boolean) { unlocked.value = val; } + function setFirstRun(val: boolean) { isFirstRun.value = val; } + + return { unlocked, isFirstRun, setUnlocked, setFirstRun }; +}); +``` + +- [ ] **Step 2: Create unlock layout with master password form** + +Dark-themed centered card with the Wraith logo, master password input, unlock button. First-run mode shows "Create Master Password" with confirm field. + +- [ ] **Step 3: Update `App.vue` to gate on unlock state** + +```vue + +``` + +Note: `MainLayout` is created in Task 11. This placeholder will be replaced there. + +- [ ] **Step 4: Generate Wails bindings and verify the unlock flow renders** + +```bash +wails3 generate bindings +cd frontend && npm run build && cd .. +go run . +``` + +Note: `wails3 generate bindings` scans registered Go services and generates TypeScript bindings into `frontend/bindings/`. Frontend code imports from these bindings to call Go methods. Re-run this command whenever Go service methods change. + +- [ ] **Step 5: Commit** + +```bash +git add frontend/src/ +git commit -m "feat: master password unlock UI with first-run vault creation" +``` + +--- + +## Task 11: Main Layout — Sidebar + Tab Container + Status Bar + +**Files:** +- Create: `frontend/src/layouts/MainLayout.vue` +- Create: `frontend/src/components/sidebar/ConnectionTree.vue` +- Create: `frontend/src/components/sidebar/SidebarToggle.vue` +- Create: `frontend/src/components/session/TabBar.vue` +- Create: `frontend/src/components/session/SessionContainer.vue` +- Create: `frontend/src/components/common/StatusBar.vue` +- Create: `frontend/src/stores/connection.store.ts` +- Create: `frontend/src/stores/session.store.ts` +- Create: `frontend/src/composables/useConnections.ts` + +- [ ] **Step 1: Create connection store** + +Pinia store wrapping Wails bindings for ConnectionService: `groups`, `connections`, `searchQuery`, `activeTag`, computed filtered lists. + +- [ ] **Step 2: Create session store** + +Pinia store wrapping SessionManager bindings: `sessions`, `activeSessionId`, `tabOrder`. + +- [ ] **Step 3: Create `MainLayout.vue`** + +Three-panel layout: resizable sidebar (240px default), tab bar + session area, status bar. Uses CSS Grid. + +- [ ] **Step 4: Create `ConnectionTree.vue`** + +Renders hierarchical group tree with connection entries. Search bar at top, tag filter pills, recent connections section. Uses Naive UI `NTree` component. Green dots for SSH, blue for RDP. + +- [ ] **Step 5: Create `SidebarToggle.vue`** + +Toggle buttons: Connections | SFTP. Switches the sidebar content area. + +- [ ] **Step 6: Create `TabBar.vue`** + +Horizontal tab bar with color-coded dots, close button, "+" button. Active tab highlighted with blue bottom border and 0.5s CSS transition. + +- [ ] **Step 7: Create `SessionContainer.vue`** + +Holds active session placeholders (empty state for Phase 1 — "Connect to a host to start a session"). Uses `v-show` for tab switching. + +- [ ] **Step 8: Create `StatusBar.vue`** + +Bottom bar with connection info (left) and app info (right): theme name, encoding, terminal dimensions placeholder. + +- [ ] **Step 9: Build and verify layout renders** + +```bash +cd frontend && npm run build && cd .. +go run . +``` + +- [ ] **Step 10: Commit** + +```bash +git add frontend/src/ +git commit -m "feat: main layout — sidebar connection tree, tab bar, status bar" +``` + +--- + +## Task 12: Multi-Window Spike (Plan A Validation) + +**Files:** +- Create: `spike/multiwindow/main.go` (temporary) + +- [ ] **Step 1: Write a minimal two-window Wails v3 test** + +Create a spike app that: +1. Opens a main window +2. Has a button that opens a second window via `app.NewWebviewWindowWithOptions()` +3. Both windows can call the same Go service method +4. Closing the second window doesn't crash the app + +- [ ] **Step 2: Run the spike on Windows (or via cross-compile check)** + +```bash +cd spike/multiwindow && go run . +``` + +Document results: does `NewWebviewWindow` work? Can both windows access the same service? Any crashes? + +- [ ] **Step 3: Record findings** + +Create `docs/spikes/multi-window-results.md` with: +- Plan A status: WORKS / PARTIAL / FAILED +- Any issues found +- Fallback recommendation if needed + +- [ ] **Step 4: Clean up spike** + +```bash +rm -rf spike/ +``` + +- [ ] **Step 5: Commit findings** + +```bash +git add docs/spikes/ +git commit -m "spike: Wails v3 multi-window validation — Plan A results" +``` + +--- + +## Task 13: RDP Frame Transport Spike + +**Files:** +- Create: `spike/frametransport/main.go` (temporary) + +- [ ] **Step 1: Write a spike that benchmarks frame delivery** + +Create a Go app that: +1. Generates a 1920x1080 RGBA test frame (solid color + timestamp) +2. Serves it via local HTTP endpoint (`/frame`) +3. Also exposes it via a Wails binding (base64-encoded PNG) +4. Frontend renders both approaches on a `` and measures FPS + +- [ ] **Step 2: Run benchmark** + +Target: which approach sustains 30fps at 1080p? + +- [ ] **Step 3: Record findings** + +Create `docs/spikes/rdp-frame-transport-results.md` with: +- HTTP approach: measured FPS, latency, CPU usage +- Base64 approach: measured FPS, latency, CPU usage +- Recommendation for Phase 3 + +- [ ] **Step 4: Clean up spike** + +```bash +rm -rf spike/ +``` + +- [ ] **Step 5: Commit findings** + +```bash +git add docs/spikes/ +git commit -m "spike: RDP frame transport benchmark — HTTP vs base64 results" +``` + +--- + +## Task 14: README.md + +**Files:** +- Create: `README.md` + +- [ ] **Step 1: Write comprehensive README** + +Cover: +- Project overview (what Wraith is, screenshot/logo) +- Features list +- Tech stack +- Prerequisites (Go 1.22+, Node 20+, Wails v3 CLI) +- Build instructions (dev mode, production build) +- Project structure walkthrough +- Architecture overview (Go services → Wails bindings → Vue 3 frontend) +- Plugin development guide (implement ProtocolHandler or Importer interface) +- Contributing guidelines +- License (MIT) + +- [ ] **Step 2: Commit** + +```bash +git add README.md +git commit -m "docs: comprehensive README with architecture, build, and plugin guide" +``` + +--- + +## Task 15: License Audit + Final Verification + +- [ ] **Step 1: Audit all Go dependencies** + +```bash +go list -m all +``` + +Verify each is MIT, BSD, Apache 2.0, or ISC. No GPL/AGPL. + +- [ ] **Step 2: Audit all npm dependencies** + +```bash +cd frontend && npx license-checker --summary && cd .. +``` + +- [ ] **Step 3: Run all Go tests** + +```bash +go test ./... -v +``` + +Expected: All pass (vault, db, connections, search, settings, theme, session) + +- [ ] **Step 4: Build production binary** + +```bash +cd frontend && npm run build && cd .. +go build -o bin/wraith.exe . +``` + +- [ ] **Step 5: Commit any fixes** + +```bash +git add -A +git commit -m "chore: Phase 1 complete — license audit passed, all tests green" +``` + +--- + +## Phase 1 Completion Checklist + +- [ ] Wails v3 scaffold compiles and runs +- [ ] SQLite with WAL mode + full schema +- [ ] Vault service: Argon2id + AES-256-GCM (7 passing tests) +- [ ] Connection + Group CRUD with JSON tags/options +- [ ] Search by name/hostname/tag with `json_each` +- [ ] Settings service (key-value with upsert) +- [ ] Theme service with 7 built-in themes +- [ ] Plugin interfaces defined (ProtocolHandler, Importer) +- [ ] Session manager (window-agnostic, detach/reattach, 32 session cap) +- [ ] Master password unlock UI +- [ ] Main layout: sidebar + tab bar + status bar +- [ ] Multi-window spike completed with documented results +- [ ] RDP frame transport spike completed with documented results +- [ ] README.md with architecture and plugin guide +- [ ] All dependencies MIT/BSD/Apache 2.0 compatible +- [ ] All Go tests passing diff --git a/docs/superpowers/plans/2026-03-17-wraith-phase2-ssh-sftp.md b/docs/superpowers/plans/2026-03-17-wraith-phase2-ssh-sftp.md new file mode 100644 index 0000000..49005d5 --- /dev/null +++ b/docs/superpowers/plans/2026-03-17-wraith-phase2-ssh-sftp.md @@ -0,0 +1,487 @@ +# Wraith Desktop — Phase 2: SSH + SFTP Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Connect to remote hosts via SSH with a real terminal (xterm.js), SFTP sidebar with file operations and CWD following, multi-tab sessions, and CodeMirror 6 file editor. + +**Architecture:** Go SSH service wraps `x/crypto/ssh` for connections, PTY requests, and shell I/O. SFTP service wraps `pkg/sftp` riding the same SSH connection. Data flows: xterm.js ↔ Wails bindings ↔ Go SSH pipes. CWD tracking via OSC 7 shell injection. + +**Tech Stack:** `golang.org/x/crypto/ssh`, `github.com/pkg/sftp`, xterm.js 5.x + WebGL addon + fit addon + search addon, CodeMirror 6 + +**Spec:** `docs/superpowers/specs/2026-03-17-wraith-desktop-design.md` (Sections 6, 10, 11) + +--- + +## File Structure (New/Modified) + +``` +internal/ + ssh/ + service.go # SSH dial, PTY, shell, I/O goroutines + service_test.go # Connection config tests (unit, no real SSH) + hostkey.go # Host key verification + storage + hostkey_test.go + cwd.go # OSC 7 parser for CWD tracking + cwd_test.go + sftp/ + service.go # SFTP operations (list, upload, download, etc.) + service_test.go + credentials/ + service.go # Credential CRUD (encrypted passwords + SSH keys) + service_test.go + app/ + app.go # Add SSH/SFTP/Credential services +frontend/ + src/ + components/ + terminal/ + TerminalView.vue # xterm.js instance wrapper + sftp/ + FileTree.vue # Remote filesystem tree + TransferProgress.vue # Upload/download progress + editor/ + EditorWindow.vue # CodeMirror 6 (placeholder for multi-window) + composables/ + useTerminal.ts # xterm.js lifecycle + Wails binding bridge + useSftp.ts # SFTP operations via Wails bindings + stores/ + session.store.ts # Update with real session management + assets/ + css/ + terminal.css # xterm.js overrides + package.json # Add xterm.js, codemirror deps +``` + +--- + +## Task 1: SSH Service — Connect, PTY, Shell I/O + +**Files:** +- Create: `internal/ssh/service.go` +- Create: `internal/ssh/service_test.go` + +The SSH service manages connections and exposes methods to Wails: + +```go +// SSHService methods (exposed to frontend via Wails bindings): +// Connect(connectionID int64) (string, error) → returns sessionID +// Write(sessionID string, data string) error → write to stdin +// Resize(sessionID string, cols, rows int) error → window change +// Disconnect(sessionID string) error → close session +// +// Events emitted to frontend via Wails events: +// "ssh:data:{sessionID}" → terminal output (stdout) +// "ssh:connected:{sessionID}" → connection established +// "ssh:disconnected:{sessionID}" → connection closed +// "ssh:error:{sessionID}" → error message +``` + +Key implementation details: +- Each SSH session runs two goroutines: one reading stdout→Wails events, one for keepalive +- Sessions stored in a `map[string]*SSHSession` with mutex +- `SSHSession` holds: `*ssh.Client`, `*ssh.Session`, stdin `io.WriteCloser`, connection metadata +- PTY requested as `xterm-256color` with initial size from frontend +- Auth method determined by credential type (password, SSH key, keyboard-interactive) +- Host key verification delegates to `hostkey.go` + +Tests (unit only — no real SSH server): +- TestSSHServiceCreation +- TestBuildAuthMethods (password → ssh.Password, key → ssh.PublicKeys) +- TestSessionTracking (create, get, remove) + +- [ ] **Step 1:** Write tests +- [ ] **Step 2:** Implement service +- [ ] **Step 3:** Run tests, verify pass +- [ ] **Step 4:** Commit: `feat: SSH service — connect, PTY, shell I/O with goroutine pipes` + +--- + +## Task 2: Host Key Verification + +**Files:** +- Create: `internal/ssh/hostkey.go` +- Create: `internal/ssh/hostkey_test.go` + +Host key verification stores/checks fingerprints in the `host_keys` SQLite table: +- New host → emit `ssh:hostkey-verify` event to frontend with fingerprint, wait for accept/reject +- Known host, matching fingerprint → proceed silently +- Known host, CHANGED fingerprint → emit warning event, block connection + +For Phase 2, implement the storage and verification logic. The frontend prompt (accept/reject dialog) will be wired in the frontend task. + +Tests: +- TestStoreHostKey +- TestVerifyKnownHost (match → ok) +- TestVerifyChangedHost (mismatch → error) +- TestVerifyNewHost (not found → returns "new") + +- [ ] **Step 1:** Write tests +- [ ] **Step 2:** Implement hostkey.go +- [ ] **Step 3:** Run tests, verify pass +- [ ] **Step 4:** Commit: `feat: SSH host key verification — store, verify, detect changes` + +--- + +## Task 3: CWD Tracker (OSC 7 Parser) + +**Files:** +- Create: `internal/ssh/cwd.go` +- Create: `internal/ssh/cwd_test.go` + +Parses OSC 7 escape sequences from terminal output to track the remote working directory: + +``` +Input: "some output\033]7;file://hostname/home/user\033\\more output" +Output: stripped="some output more output", cwd="/home/user" +``` + +The CWD tracker: +1. Scans byte stream for `\033]7;` prefix +2. Extracts URL between prefix and `\033\\` (or `\007`) terminator +3. Parses `file://hostname/path` to extract just the path +4. Strips the OSC 7 sequence from the output before forwarding to xterm.js +5. Returns the new CWD path when detected + +Shell injection command (injected after PTY is established): +```bash +# bash +PROMPT_COMMAND='printf "\033]7;file://%s%s\033\\" "$(hostname)" "$PWD"' +# zsh +precmd() { printf "\033]7;file://%s%s\033\\" "$(hostname)" "$PWD" } +# fish +function fish_prompt; printf "\033]7;file://%s%s\033\\" (hostname) "$PWD"; end +``` + +Tests: +- TestParseOSC7Basic +- TestParseOSC7WithBEL (terminated by \007 instead of ST) +- TestParseOSC7NoMatch (no OSC 7 in output) +- TestParseOSC7MultipleInStream +- TestStripOSC7FromOutput + +- [ ] **Step 1:** Write tests +- [ ] **Step 2:** Implement cwd.go +- [ ] **Step 3:** Run tests, verify pass +- [ ] **Step 4:** Commit: `feat: OSC 7 CWD tracker — parse and strip directory change sequences` + +--- + +## Task 4: SFTP Service + +**Files:** +- Create: `internal/sftp/service.go` +- Create: `internal/sftp/service_test.go` + +SFTP service wraps `pkg/sftp` and exposes file operations to the frontend: + +```go +// SFTPService methods (exposed via Wails bindings): +// OpenSFTP(sessionID string) error → start SFTP on existing SSH connection +// List(sessionID string, path string) ([]FileEntry, error) → directory listing +// ReadFile(sessionID string, path string) (string, error) → read file content (max 5MB) +// WriteFile(sessionID string, path string, content string) error → write file +// Upload(sessionID string, remotePath string, localPath string) error +// Download(sessionID string, remotePath string) (string, error) → returns local temp path +// Mkdir(sessionID string, path string) error +// Delete(sessionID string, path string) error +// Rename(sessionID string, oldPath, newPath string) error +// Stat(sessionID string, path string) (*FileEntry, error) +``` + +`FileEntry` type: +```go +type FileEntry struct { + Name string `json:"name"` + Path string `json:"path"` + Size int64 `json:"size"` + IsDir bool `json:"isDir"` + Permissions string `json:"permissions"` + ModTime string `json:"modTime"` + Owner string `json:"owner"` +} +``` + +SFTP client is created from the existing `*ssh.Client` (same connection, separate channel). Stored alongside the SSH session. + +Tests (unit — mock the sftp.Client interface): +- TestFileEntryFromFileInfo +- TestListSortsDirectoriesFirst +- TestReadFileRejectsLargeFiles (>5MB) + +- [ ] **Step 1:** Write tests +- [ ] **Step 2:** Implement service +- [ ] **Step 3:** Add `pkg/sftp` dependency +- [ ] **Step 4:** Run tests, verify pass +- [ ] **Step 5:** Commit: `feat: SFTP service — list, read, write, upload, download, mkdir, delete` + +--- + +## Task 5: Credential Service (Encrypted SSH Keys + Passwords) + +**Files:** +- Create: `internal/credentials/service.go` +- Create: `internal/credentials/service_test.go` + +CRUD for credentials and SSH keys with vault encryption: + +```go +// CredentialService methods: +// CreatePassword(name, username, password, domain string) (*Credential, error) +// CreateSSHKey(name string, privateKey, passphrase []byte) (*SSHKey, error) +// GetCredential(id int64) (*Credential, error) +// ListCredentials() ([]Credential, error) +// DecryptPassword(id int64) (string, error) → decrypt for connection use only +// DecryptSSHKey(id int64) ([]byte, string, error) → returns (privateKey, passphrase, error) +// DeleteCredential(id int64) error +// ImportSSHKeyFile(name, filePath string) (*SSHKey, error) → read .pem file, detect type, store +``` + +All sensitive data encrypted via VaultService before storage. Decryption only happens at connection time. + +Tests: +- TestCreatePasswordCredential +- TestCreateSSHKeyCredential +- TestDecryptPassword (round-trip through vault) +- TestDecryptSSHKey (round-trip) +- TestListCredentialsExcludesEncryptedValues +- TestDetectKeyType (RSA, Ed25519, ECDSA) + +- [ ] **Step 1:** Write tests +- [ ] **Step 2:** Implement service +- [ ] **Step 3:** Run tests, verify pass +- [ ] **Step 4:** Commit: `feat: credential service — encrypted password and SSH key storage` + +--- + +## Task 6: Wire SSH/SFTP/Credentials into App + +**Files:** +- Modify: `internal/app/app.go` +- Modify: `main.go` + +Add SSHService, SFTPService, and CredentialService to WraithApp. Register as Wails services. + +- [ ] **Step 1:** Update app.go to create and expose new services +- [ ] **Step 2:** Update main.go to register them +- [ ] **Step 3:** Verify compilation: `go vet ./...` +- [ ] **Step 4:** Run all tests: `go test ./... -count=1` +- [ ] **Step 5:** Commit: `feat: wire SSH, SFTP, and credential services into Wails app` + +--- + +## Task 7: Frontend — xterm.js Terminal + +**Files:** +- Modify: `frontend/package.json` — add xterm.js + addons +- Create: `frontend/src/components/terminal/TerminalView.vue` +- Create: `frontend/src/composables/useTerminal.ts` +- Create: `frontend/src/assets/css/terminal.css` +- Modify: `frontend/src/components/session/SessionContainer.vue` +- Modify: `frontend/src/stores/session.store.ts` + +Install xterm.js dependencies: +``` +@xterm/xterm +@xterm/addon-fit +@xterm/addon-webgl +@xterm/addon-search +@xterm/addon-web-links +``` + +`useTerminal` composable: +- Creates xterm.js Terminal instance with theme from connection settings +- Attaches fit, WebGL, search, web-links addons +- Binds `terminal.onData` → Wails `SSHService.Write(sessionId, data)` +- Listens for Wails events `ssh:data:{sessionId}` → `terminal.write(data)` +- Handles resize via fit addon → Wails `SSHService.Resize(sessionId, cols, rows)` +- Cleanup on unmount + +`TerminalView.vue`: +- Receives `sessionId` prop +- Mounts xterm.js into a div ref +- Applies theme colors from the active theme +- Handles focus management + +`SessionContainer.vue` update: +- Replace placeholder with real TerminalView for SSH sessions +- Use `v-show` (not `v-if`) to keep terminals alive across tab switches + +- [ ] **Step 1:** Install xterm.js deps: `cd frontend && npm install @xterm/xterm @xterm/addon-fit @xterm/addon-webgl @xterm/addon-search @xterm/addon-web-links` +- [ ] **Step 2:** Create terminal.css (xterm.js container styling) +- [ ] **Step 3:** Create useTerminal.ts composable +- [ ] **Step 4:** Create TerminalView.vue component +- [ ] **Step 5:** Update SessionContainer.vue to render TerminalView +- [ ] **Step 6:** Update session.store.ts with real Wails binding calls +- [ ] **Step 7:** Build frontend: `npm run build` +- [ ] **Step 8:** Commit: `feat: xterm.js terminal with WebGL rendering and Wails binding bridge` + +--- + +## Task 8: Frontend — SFTP Sidebar + +**Files:** +- Create: `frontend/src/components/sftp/FileTree.vue` +- Create: `frontend/src/components/sftp/TransferProgress.vue` +- Create: `frontend/src/composables/useSftp.ts` +- Modify: `frontend/src/layouts/MainLayout.vue` — SFTP sidebar rendering +- Modify: `frontend/src/components/sidebar/SidebarToggle.vue` — enable SFTP tab + +`useSftp` composable: +- `listDirectory(sessionId, path)` → calls Wails SFTPService.List +- `uploadFile(sessionId, remotePath, file)` → chunked upload with progress +- `downloadFile(sessionId, remotePath)` → triggers browser download +- `deleteFile(sessionId, path)` → with confirmation +- `createDirectory(sessionId, path)` +- `renameFile(sessionId, old, new)` +- Tracks current path, file list, loading state, transfer progress + +`FileTree.vue`: +- Renders file/directory tree (lazy-loaded on expand) +- Path bar at top showing current directory +- Toolbar: upload, download, new file, new folder, refresh, delete +- File entries show: icon (folder/file), name, size, modified date +- Double-click file → open in editor (Task 9) +- Drag-and-drop upload zone +- "Follow terminal folder" toggle at bottom + +`TransferProgress.vue`: +- Shows active uploads/downloads with progress bars +- File name, percentage, speed, ETA + +- [ ] **Step 1:** Create useSftp.ts composable +- [ ] **Step 2:** Create FileTree.vue component +- [ ] **Step 3:** Create TransferProgress.vue component +- [ ] **Step 4:** Update MainLayout.vue to render SFTP sidebar when toggled +- [ ] **Step 5:** Enable SFTP toggle in SidebarToggle.vue +- [ ] **Step 6:** Build frontend: `npm run build` +- [ ] **Step 7:** Commit: `feat: SFTP sidebar — file tree, upload/download, CWD following` + +--- + +## Task 9: Frontend — Host Key Dialog + Connection Flow + +**Files:** +- Create: `frontend/src/components/common/HostKeyDialog.vue` +- Modify: `frontend/src/components/sidebar/ConnectionTree.vue` — double-click to connect +- Modify: `frontend/src/stores/session.store.ts` — real connection flow + +Wire up the full connection flow: +1. User double-clicks connection in sidebar +2. Session store calls Wails `SSHService.Connect(connectionId)` +3. If host key verification needed → show HostKeyDialog +4. On success → create tab, mount TerminalView, open SFTP sidebar +5. On error → show error toast + +`HostKeyDialog.vue`: +- Modal showing: hostname, key type, fingerprint +- "New host" vs "CHANGED host key (WARNING)" modes +- Accept / Reject buttons +- "Always accept for this host" checkbox + +- [ ] **Step 1:** Create HostKeyDialog.vue +- [ ] **Step 2:** Update ConnectionTree.vue with double-click handler +- [ ] **Step 3:** Update session.store.ts with connection flow +- [ ] **Step 4:** Build frontend: `npm run build` +- [ ] **Step 5:** Commit: `feat: connection flow — host key dialog, double-click to connect` + +--- + +## Task 10: Frontend — CodeMirror 6 Editor (Placeholder) + +**Files:** +- Modify: `frontend/package.json` — add CodeMirror deps +- Create: `frontend/src/components/editor/EditorWindow.vue` + +Install CodeMirror 6: +``` +codemirror +@codemirror/lang-javascript +@codemirror/lang-json +@codemirror/lang-html +@codemirror/lang-css +@codemirror/lang-python +@codemirror/lang-markdown +@codemirror/theme-one-dark +``` + +`EditorWindow.vue`: +- Renders CodeMirror 6 editor with dark theme +- Receives file content, path, and sessionId as props +- Syntax highlighting based on file extension +- Save button → calls Wails SFTPService.WriteFile +- Unsaved changes detection +- For Phase 2: renders inline (not separate window — multi-window is Phase 4) + +- [ ] **Step 1:** Install CodeMirror deps +- [ ] **Step 2:** Create EditorWindow.vue +- [ ] **Step 3:** Wire file click in FileTree.vue to open EditorWindow +- [ ] **Step 4:** Build frontend: `npm run build` +- [ ] **Step 5:** Commit: `feat: CodeMirror 6 editor — syntax highlighting, dark theme, SFTP save` + +--- + +## Task 11: Workspace Snapshot Persistence + +**Files:** +- Create: `internal/app/workspace.go` +- Create: `internal/app/workspace_test.go` + +Implements workspace snapshot saving/restoring per the spec: + +```go +// SaveWorkspace() error — serialize current tab layout to settings +// LoadWorkspace() (*WorkspaceSnapshot, error) — read last saved layout +// Auto-save every 30 seconds via goroutine +// Save on clean shutdown +``` + +WorkspaceSnapshot JSON: +```json +{ + "tabs": [ + {"connectionId": 1, "protocol": "ssh", "position": 0}, + {"connectionId": 5, "protocol": "rdp", "position": 1} + ], + "sidebarWidth": 240, + "sidebarMode": "connections", + "activeTab": 0 +} +``` + +Tests: +- TestSaveAndLoadWorkspace +- TestEmptyWorkspace + +- [ ] **Step 1:** Write tests +- [ ] **Step 2:** Implement workspace.go +- [ ] **Step 3:** Run tests, verify pass +- [ ] **Step 4:** Commit: `feat: workspace snapshot persistence — auto-save layout every 30s` + +--- + +## Task 12: Integration Test + Final Verification + +- [ ] **Step 1:** Run all Go tests: `go test ./... -count=1` +- [ ] **Step 2:** Build frontend: `cd frontend && npm run build` +- [ ] **Step 3:** Verify Go compiles with embedded frontend: `go vet ./...` +- [ ] **Step 4:** Count tests and lines of code +- [ ] **Step 5:** Commit any fixes: `chore: Phase 2 complete — SSH + SFTP with terminal and file operations` + +--- + +## Phase 2 Completion Checklist + +- [ ] SSH service: connect, PTY, shell I/O with goroutine pipes +- [ ] Host key verification: store, verify, detect changes +- [ ] OSC 7 CWD tracker: parse and strip directory change sequences +- [ ] SFTP service: list, read, write, upload, download, mkdir, delete +- [ ] Credential service: encrypted password + SSH key storage +- [ ] All new services wired into Wails app +- [ ] xterm.js terminal with WebGL rendering +- [ ] SFTP file tree sidebar with upload/download +- [ ] Host key verification dialog +- [ ] Double-click connection to connect flow +- [ ] CodeMirror 6 inline editor with SFTP save +- [ ] Workspace snapshot persistence +- [ ] All Go tests passing +- [ ] Frontend builds clean diff --git a/docs/superpowers/specs/2026-03-12-vigilance-remote-lean-design.md b/docs/superpowers/specs/2026-03-12-vigilance-remote-lean-design.md new file mode 100644 index 0000000..863075b --- /dev/null +++ b/docs/superpowers/specs/2026-03-12-vigilance-remote-lean-design.md @@ -0,0 +1,614 @@ +# Wraith — Lean Build Spec + +> **Date:** 2026-03-12 +> **Purpose:** Self-hosted MobaXterm replacement — SSH + SFTP + RDP in a browser +> **Stack:** Nuxt 3 (Vue 3 SPA) + NestJS 10 + PostgreSQL 16 + guacd +> **Target:** Single-user personal tool with bolt-on multi-user path +> **Reference:** `Remote-Spec.md` (full feature spec — this is the lean cut) + +--- + +## 1. What This Is + +A self-hosted web application that replaces MobaXterm. SSH terminal with SFTP sidebar (MobaXterm's killer feature), RDP via Guacamole, connection manager with hierarchical groups, and an encrypted vault for SSH keys and passwords. Runs in any browser, deployed as a Docker stack. + +**What this is NOT:** An MSP product, a SaaS platform, a team collaboration tool. It's a personal remote access workstation that happens to be web-based. Multi-user is a future bolt-on, not a design constraint. + +**Name:** Wraith — exists everywhere, all at once. + +--- + +## 2. Five Modules + +### 2.1 SSH Terminal + +**Frontend:** xterm.js 5.x with addons: +- `@xterm/addon-fit` — auto-resize to container +- `@xterm/addon-search` — Ctrl+F scrollback search +- `@xterm/addon-web-links` — clickable URLs +- `@xterm/addon-webgl` — GPU-accelerated rendering + +**Backend:** NestJS WebSocket gateway + `ssh2` (npm). Browser opens WebSocket to NestJS, NestJS opens SSH connection to target using credentials from the vault. Bidirectional data pipe: terminal input → ssh2 stdin, ssh2 stdout → terminal output. + +**Features:** +- Multi-tab sessions with host name labels and color-coding by group +- Horizontal and vertical split panes within a single tab (multiple xterm.js instances in a flex grid) +- Terminal theming: dark/light modes, custom color schemes, font selection, font size +- Configurable scrollback buffer size (default 10,000 lines, configurable in settings) +- Copy/paste: Ctrl+Shift+C/V, right-click context menu +- Search in scrollback: Ctrl+F via xterm.js SearchAddon +- Auto-reconnect on connection drop with configurable retry + +**Authentication flow:** +1. User clicks host in connection manager +2. Backend looks up host → finds associated credential (key or password) +3. If SSH key: decrypt private key from vault, optionally decrypt passphrase, pass to ssh2 +4. If password: decrypt from vault, pass to ssh2 +5. ssh2 performs host key verification (see Section 8: Host Key Verification) +6. ssh2 connects, WebSocket bridge established + +### 2.2 SFTP Sidebar + +The MobaXterm feature. When an SSH session connects, a sidebar automatically opens showing the remote filesystem. + +**Layout:** Resizable left sidebar panel (tree view) + main terminal panel. Sidebar can be collapsed/hidden per session. + +**Backend:** Uses the same ssh2 connection as the terminal (ssh2's SFTP subsystem). No separate connection needed — SFTP rides the existing SSH channel. All SFTP commands include a `sessionId` to target the correct ssh2 connection when multiple tabs are open. + +**File operations:** +- Browse remote filesystem as a tree (lazy-loaded — fetch children on expand) +- Upload: drag-and-drop from desktop onto sidebar, or click upload button. Chunked transfer with progress bar. +- Download: click file → browser download, or right-click → Download +- Rename, delete, chmod, mkdir via right-click context menu +- File size, permissions, modified date shown in tree or detail view + +**File editing:** +- Click a text file → opens in embedded Monaco Editor (VS Code's editor component) +- File size guard: files over 5MB are refused for inline editing (download instead) +- Syntax highlighting based on file extension +- Save button pushes content back to remote via SFTP +- Unsaved changes warning on close + +**Transfer status:** Bottom status bar showing active transfers with progress, speed, ETA. Queue-based — multiple uploads/downloads run sequentially with status indicators. + +### 2.3 RDP (Remote Desktop) + +**Architecture:** Browser → WebSocket → NestJS Guacamole tunnel → guacd (Docker) → RDP target + +**Frontend:** `guacamole-common-js` — renders remote desktop on HTML5 Canvas. Keyboard, mouse, and touch input forwarded to remote. + +**Backend:** NestJS WebSocket gateway that speaks Guacamole wire protocol to the `guacd` daemon over TCP. The gateway translates between the browser's WebSocket and guacd's TCP socket. + +**guacd:** Apache Guacamole daemon running as `guacamole/guacd` Docker image. Handles the actual RDP protocol translation. Battle-tested, Apache-licensed. + +**Features:** +- Clipboard sync: bidirectional between browser and remote desktop +- Auto-resolution: detect browser window/tab size, send to RDP server +- Connection settings: color depth (16/24/32-bit), security mode (NLA/TLS/RDP), console session, admin mode +- Audio: remote audio playback in browser (Guacamole native) +- Full-screen mode: F11 or toolbar button + +**Authentication:** RDP credentials (username + password + domain) stored encrypted in vault, associated with host. Decrypted at connect time and passed to guacd. + +### 2.4 Connection Manager + +The home screen. A searchable, organized view of all saved hosts. + +**Host properties:** +``` +name — display name (e.g., "RSM File Server") +hostname — IP or FQDN +port — default 22 (SSH) or 3389 (RDP) +protocol — ssh | rdp +group_id — FK to host_groups (nullable for ungrouped) +credential_id — FK to credentials (nullable for quick-connect-style) +tags — text[] array for categorization +notes — free text (markdown rendered) +color — hex color for visual grouping +lastConnectedAt — timestamp of most recent connection +``` + +**Host groups:** Hierarchical folders with `parent_id` self-reference. E.g., "RSM > Servers", "Home Lab > VMs". Collapsible tree in the sidebar. + +**Quick connect:** Top bar input — type `user@hostname:port` and hit Enter to connect without saving. Protocol auto-detected (or toggle SSH/RDP). + +**Search:** Full-text across host name, hostname, tags, notes, group name. Instant filter as you type. + +**Recent connections:** Hosts sorted by `lastConnectedAt` shown as a quick-access section above the full host tree. + +**UI pattern:** Left sidebar = group tree + host list. Main area = active sessions rendered as persistent tab components within the layout (NOT separate routes — terminal/RDP instances persist across tab switches). Double-click host or press Enter to connect. Drag hosts between groups. + +### 2.5 Key Vault + +Encrypted storage for SSH private keys and passwords. + +**SSH keys:** +``` +name — display name (e.g., "RSM Production Key") +public_key — plaintext (safe to store) +encrypted_private_key — AES-256-GCM encrypted blob +passphrase_encrypted — AES-256-GCM encrypted (nullable — not all keys have passphrases) +fingerprint — SHA-256 fingerprint for display +key_type — rsa | ed25519 | ecdsa (detected on import) +``` + +**Import flow:** +1. Click "Import Key" in vault management +2. Paste key content or upload `.pem`/`.pub`/id_rsa file +3. If key has passphrase, prompt for it (stored encrypted) +4. Key encrypted with AES-256-GCM using `ENCRYPTION_KEY` env var +5. Public key extracted and stored separately (for display/export) + +**Credentials (passwords and key references):** +``` +name — display name (e.g., "RSM root cred") +username — plaintext username (not sensitive) +domain — for RDP (e.g., "CONTOSO") +type — password | ssh_key (enum CredentialType) +encrypted_value — AES-256-GCM encrypted password (for type=password) +ssh_key_id — FK to ssh_keys (for type=ssh_key) +``` + +Credentials are shared entities — hosts reference credentials via `credential_id` FK on the host. Multiple hosts can share the same credential. The relationship is Host → Credential (many-to-one), not Credential → Host. + +**Encryption pattern:** Same as Vigilance HQ — `ENCRYPTION_KEY` env var (32+ byte hex), AES-256-GCM, random IV per encryption, `v1:` version prefix on ciphertext for future key rotation. + +--- + +## 3. Technology Stack + +### Frontend + +| Component | Technology | Purpose | +|---|---|---| +| Framework | Nuxt 3 (Vue 3, SPA mode `ssr: false`) | App shell, routing, auto-imports | +| Terminal | xterm.js 5.x + addons | SSH terminal emulator | +| RDP client | guacamole-common-js | RDP canvas rendering | +| Code editor | Monaco Editor | SFTP file editing | +| UI library | PrimeVue 4 | DataTable, Dialog, Tree, Toolbar, etc. | +| State | Pinia | Connection state, session management | +| CSS | Tailwind CSS | Utility-first styling | +| Icons | Lucide Vue | Consistent iconography | + +> **Why SPA, not SSR:** xterm.js, Monaco, and guacamole-common-js are all browser-only. Every session page would need `` wrappers. No SEO benefit for a self-hosted tool behind auth. SPA mode avoids hydration mismatches entirely while keeping Nuxt's routing, auto-imports, and module ecosystem. + +### Backend + +| Component | Technology | Purpose | +|---|---|---| +| Framework | NestJS 10 | REST API + WebSocket gateways | +| SSH proxy | ssh2 (npm) | SSH + SFTP connections | +| RDP proxy | Custom Guacamole tunnel | NestJS ↔ guacd TCP bridge | +| Database | PostgreSQL 16 | Hosts, credentials, keys, settings | +| ORM | Prisma | Schema-as-code, type-safe queries | +| Encryption | Node.js crypto (AES-256-GCM) | Vault encryption at rest | +| Auth | JWT + bcrypt | Single-user local login | +| WebSocket | @nestjs/websockets (ws) | Terminal and RDP data channels | + +### Infrastructure (Docker Compose) + +```yaml +services: + app: + build: . + ports: ["3000:3000"] + environment: + DATABASE_URL: postgresql://wraith:${DB_PASSWORD}@postgres:5432/wraith + JWT_SECRET: ${JWT_SECRET} + ENCRYPTION_KEY: ${ENCRYPTION_KEY} + GUACD_HOST: guacd + GUACD_PORT: "4822" + depends_on: [postgres, guacd] + + guacd: + image: guacamole/guacd + restart: always + # Internal only — app connects via Docker DNS hostname "guacd" on port 4822 + + postgres: + image: postgres:16-alpine + volumes: [pgdata:/var/lib/postgresql/data] + environment: + POSTGRES_DB: wraith + POSTGRES_USER: wraith + POSTGRES_PASSWORD: ${DB_PASSWORD} + +volumes: + pgdata: +``` + +> **No Redis:** JWT auth is stateless. Single NestJS process means no pub/sub fanout needed. If horizontal scaling becomes relevant later, Redis is a straightforward add. Not burning ops complexity on it now. + +**Required `.env` vars:** +``` +DB_PASSWORD= +JWT_SECRET= +ENCRYPTION_KEY= +``` + +Production deployment: Nginx reverse proxy on the Docker host with SSL termination and WebSocket upgrade support (`proxy_set_header Upgrade $http_upgrade`). + +--- + +## 4. Architecture + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Browser (Any device) │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ xterm.js │ │ SFTP Sidebar │ │ guac-client │ │ +│ │ (SSH term) │ │ (file tree) │ │ (RDP canvas) │ │ +│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ +│ │ WebSocket │ WebSocket │ WebSocket │ +└─────────┼──────────────────┼─────────────────┼──────────────┘ + │ │ │ +┌─────────┼──────────────────┼─────────────────┼──────────────┐ +│ NestJS Backend (Docker: app) │ +│ ┌──────▼───────┐ ┌──────▼───────┐ ┌──────▼───────┐ │ +│ │ SSH Gateway │ │ SFTP Gateway │ │ Guac Tunnel │ │ +│ │ (ssh2) │ │ (ssh2 sftp) │ │ (TCP→guacd) │ │ +│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ +│ │ SSH │ SFTP │ Guac Protocol │ +│ ┌──────▼────────────────────────┐ ┌──────▼───────┐ │ +│ │ Vault Service │ │ guacd │ │ +│ │ (decrypt keys/passwords) │ │ (Docker) │ │ +│ └──────┬────────────────────────┘ └──────┬───────┘ │ +│ │ Prisma │ RDP │ +│ ┌──────▼───────┐ │ │ +│ │ PostgreSQL │ │ │ +│ │ (Docker) │ │ │ +│ └──────────────┘ │ │ +└──────────────────────────────────────────────┼──────────────┘ + │ + ┌─────────────────┐ ┌──────▼───────┐ + │ SSH Targets │ │ RDP Targets │ + │ (Linux/Unix) │ │ (Windows) │ + └─────────────────┘ └──────────────┘ +``` + +--- + +## 5. Database Schema (Prisma) + +```prisma +model User { + id Int @id @default(autoincrement()) + email String @unique + passwordHash String @map("password_hash") + displayName String? @map("display_name") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("users") +} + +model HostGroup { + id Int @id @default(autoincrement()) + name String + parentId Int? @map("parent_id") + sortOrder Int @default(0) @map("sort_order") + parent HostGroup? @relation("GroupTree", fields: [parentId], references: [id], onDelete: SetNull) + children HostGroup[] @relation("GroupTree") + hosts Host[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("host_groups") +} + +model Host { + id Int @id @default(autoincrement()) + name String + hostname String + port Int @default(22) + protocol Protocol @default(ssh) + groupId Int? @map("group_id") + credentialId Int? @map("credential_id") + tags String[] @default([]) + notes String? + color String? @db.VarChar(7) + sortOrder Int @default(0) @map("sort_order") + hostFingerprint String? @map("host_fingerprint") + lastConnectedAt DateTime? @map("last_connected_at") + group HostGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull) + credential Credential? @relation(fields: [credentialId], references: [id], onDelete: SetNull) + connectionLogs ConnectionLog[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("hosts") +} + +model Credential { + id Int @id @default(autoincrement()) + name String + username String? + domain String? + type CredentialType + encryptedValue String? @map("encrypted_value") + sshKeyId Int? @map("ssh_key_id") + sshKey SshKey? @relation(fields: [sshKeyId], references: [id], onDelete: SetNull) + hosts Host[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("credentials") +} + +model SshKey { + id Int @id @default(autoincrement()) + name String + keyType String @map("key_type") @db.VarChar(20) + fingerprint String? + publicKey String? @map("public_key") + encryptedPrivateKey String @map("encrypted_private_key") + passphraseEncrypted String? @map("passphrase_encrypted") + credentials Credential[] + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@map("ssh_keys") +} + +model ConnectionLog { + id Int @id @default(autoincrement()) + hostId Int @map("host_id") + protocol Protocol + connectedAt DateTime @default(now()) @map("connected_at") + disconnectedAt DateTime? @map("disconnected_at") + host Host @relation(fields: [hostId], references: [id], onDelete: Cascade) + + @@map("connection_logs") +} + +model Setting { + key String @id + value String + + @@map("settings") +} + +enum Protocol { + ssh + rdp +} + +enum CredentialType { + password + ssh_key +} +``` + +--- + +## 6. Frontend Structure + +``` +frontend/ + nuxt.config.ts # ssr: false (SPA mode) + layouts/ + default.vue # Main layout: sidebar + persistent tab container + auth.vue # Login page layout + pages/ + index.vue # Connection manager (home screen) + active session tabs + login.vue # Single-user login + vault/ + index.vue # Key vault management + keys.vue # SSH key list + import + credentials.vue # Password credentials + settings.vue # App settings (theme, terminal defaults, scrollback) + components/ + connections/ + HostTree.vue # Sidebar host group tree + HostCard.vue # Host entry in list + HostEditDialog.vue # Add/edit host modal + GroupEditDialog.vue # Add/edit group modal + QuickConnect.vue # Top bar quick connect input + session/ + SessionContainer.vue # Persistent container — holds all active sessions, manages tab switching + SessionTab.vue # Single session (SSH terminal + SFTP sidebar, or RDP canvas) + terminal/ + TerminalInstance.vue # Single xterm.js instance + TerminalTabs.vue # Tab bar for multiple sessions + SplitPane.vue # Split pane container + sftp/ + SftpSidebar.vue # SFTP file tree sidebar + FileTree.vue # Remote filesystem tree + FileEditor.vue # Monaco editor for text files + TransferStatus.vue # Upload/download progress + rdp/ + RdpCanvas.vue # Guacamole client wrapper + RdpToolbar.vue # Clipboard, fullscreen, settings + vault/ + KeyImportDialog.vue # SSH key import modal + CredentialForm.vue # Password credential form + composables/ + useTerminal.ts # xterm.js lifecycle + WebSocket + useSftp.ts # SFTP operations via WebSocket + useRdp.ts # Guacamole client lifecycle + useVault.ts # Key/credential CRUD + useConnections.ts # Host CRUD + search + stores/ + auth.store.ts # Login state, JWT (stored in memory/localStorage, sent via Authorization header) + session.store.ts # Active sessions, tabs — sessions persist across tab switches + connection.store.ts # Hosts, groups, search +``` + +> **Session architecture:** Active sessions are NOT page routes. They render as persistent tab components inside `SessionContainer.vue` within the main `index.vue` layout. Switching tabs toggles `v-show` visibility (not `v-if` destruction), so xterm.js and guacamole-common-js instances stay alive. The vault and settings pages are separate routes — navigating away from the main page does NOT destroy active sessions (the SessionContainer lives in the `default.vue` layout). + +--- + +## 7. Backend Structure + +``` +backend/src/ + main.ts # Bootstrap, global prefix, validation pipe + app.module.ts # Root module + prisma/ + prisma.service.ts # Prisma client lifecycle + prisma.module.ts # Global Prisma module + auth/ + auth.module.ts + auth.service.ts # Login, JWT issue/verify + auth.controller.ts # POST /login, GET /profile + jwt.strategy.ts # Passport JWT strategy + jwt-auth.guard.ts # Route guard (REST) + ws-auth.guard.ts # WebSocket auth guard (validates JWT from handshake) + connections/ + connections.module.ts + hosts.service.ts # Host CRUD + lastConnectedAt updates + hosts.controller.ts # REST: /hosts + groups.service.ts # Group CRUD (hierarchical) + groups.controller.ts # REST: /groups + vault/ + vault.module.ts + encryption.service.ts # AES-256-GCM encrypt/decrypt + credentials.service.ts # Credential CRUD + decrypt-on-demand + credentials.controller.ts # REST: /credentials + ssh-keys.service.ts # SSH key import/CRUD + ssh-keys.controller.ts # REST: /ssh-keys + terminal/ + terminal.module.ts + terminal.gateway.ts # WebSocket gateway: SSH proxy via ssh2 + sftp.gateway.ts # WebSocket gateway: SFTP operations + ssh-connection.service.ts # ssh2 connection management + pooling + rdp/ + rdp.module.ts + rdp.gateway.ts # WebSocket gateway: Guacamole tunnel + guacamole.service.ts # TCP connection to guacd, protocol translation + settings/ + settings.module.ts + settings.service.ts # Key/value settings CRUD + settings.controller.ts # REST: /settings +``` + +--- + +## 8. Key Implementation Details + +### WebSocket Authentication + +All WebSocket gateways validate JWT before processing any commands. The token is sent in the WebSocket handshake: + +```typescript +// Client: connect with JWT +const ws = new WebSocket(`wss://host/terminal?token=${jwt}`) + +// Server: ws-auth.guard.ts validates in handleConnection +// Rejects connection if token is invalid/expired +``` + +JWT is stored in Pinia state (memory) and localStorage for persistence. Sent via `Authorization: Bearer` header for REST, query parameter for WebSocket handshake. No cookies used for auth — CSRF protection not required. + +### WebSocket Protocol (SSH) + +``` +Client → Server: + { type: 'connect', hostId: 123 } # Initiate SSH connection + { type: 'data', data: '...' } # Terminal input (keystrokes) + { type: 'resize', cols: 120, rows: 40 } # Terminal resize + +Server → Client: + { type: 'connected', sessionId: 'uuid' } # SSH connection established + { type: 'data', data: '...' } # Terminal output + { type: 'host-key-verify', fingerprint: 'SHA256:...', isNew: true } # First connection — needs approval + { type: 'error', message: '...' } # Connection error + { type: 'disconnected', reason: '...' } # Connection closed + +Client → Server (host key response): + { type: 'host-key-accept' } # User approved — save fingerprint to host record + { type: 'host-key-reject' } # User rejected — abort connection +``` + +### WebSocket Protocol (SFTP) + +All SFTP commands include `sessionId` to target the correct ssh2 connection: + +``` +Client → Server: + { type: 'list', sessionId: 'uuid', path: '/home/user' } # List directory + { type: 'read', sessionId: 'uuid', path: '/etc/nginx/nginx.conf' } # Read file (max 5MB) + { type: 'write', sessionId: 'uuid', path: '/etc/nginx/nginx.conf', data } # Write file + { type: 'upload', sessionId: 'uuid', path: '/tmp/file.tar.gz', chunk } # Upload chunk + { type: 'download', sessionId: 'uuid', path: '/var/log/syslog' } # Start download + { type: 'mkdir', sessionId: 'uuid', path: '/home/user/newdir' } # Create directory + { type: 'rename', sessionId: 'uuid', oldPath, newPath } # Rename/move + { type: 'delete', sessionId: 'uuid', path: '/tmp/junk.log' } # Delete file + { type: 'chmod', sessionId: 'uuid', path, mode: '755' } # Change permissions + { type: 'stat', sessionId: 'uuid', path: '/home/user' } # Get file info + +Server → Client: + { type: 'list', path, entries: [...] } # Directory listing + { type: 'fileContent', path, content, encoding } # File content + { type: 'progress', transferId, bytes, total } # Transfer progress + { type: 'error', message } # Operation error +``` + +### Host Key Verification + +SSH host key verification follows standard `known_hosts` behavior: + +1. **First connection:** ssh2 receives server's public key fingerprint. Gateway sends `host-key-verify` message to browser with `isNew: true`. User sees a dialog showing the fingerprint and chooses to accept or reject. +2. **Accept:** Fingerprint saved to `Host.hostFingerprint` in database. Connection proceeds. +3. **Subsequent connections:** ssh2 receives fingerprint, compared against stored `Host.hostFingerprint`. If match, connect silently. If mismatch, gateway sends `host-key-verify` with `isNew: false` and `previousFingerprint` — user warned of possible MITM. +4. **Reject:** Connection aborted, no fingerprint stored. + +### Guacamole Tunnel (RDP) + +NestJS acts as a tunnel between the browser's WebSocket and guacd's TCP socket: + +1. Browser sends `{ type: 'connect', hostId: 456 }` +2. NestJS looks up host → decrypts RDP credentials +3. NestJS opens TCP socket to guacd at `${GUACD_HOST}:${GUACD_PORT}` (default: `guacd:4822`) +4. NestJS sends Guacamole handshake: `select`, `size`, `audio`, `video`, `image` instructions +5. NestJS sends `connect` instruction with RDP params (hostname, port, username, password, security, color-depth) +6. Bidirectional pipe: browser WebSocket ↔ NestJS ↔ guacd TCP +7. guacd handles actual RDP protocol to target Windows machine + +The `guacamole-common-js` client library handles rendering the Guacamole instruction stream to Canvas in the browser. + +### Encryption Service + +Identical pattern to Vigilance HQ: + +```typescript +encrypt(plaintext: string): string + → random 16-byte IV + → AES-256-GCM cipher with ENCRYPTION_KEY + → return `v1:${iv.hex}:${authTag.hex}:${ciphertext.hex}` + +decrypt(encrypted: string): string + → parse version prefix, IV, authTag, ciphertext + → AES-256-GCM decipher + → return plaintext +``` + +`ENCRYPTION_KEY` is a 32-byte hex string from environment. `v1:` prefix allows future key rotation without re-encrypting all stored values. + +--- + +## 9. Multi-User Bolt-On Path + +When the time comes to add JT or Victor: + +1. Add rows to `users` table +2. Add `userId` FK to `hosts`, `host_groups`, `credentials`, and `ssh_keys` tables (nullable — null = shared with all users) +3. Add `shared_with` field or a `host_permissions` join table +4. Add basic role: `admin` | `user` on `users` table +5. Filter host list by ownership/sharing in queries +6. Optional: Entra ID SSO (same pattern as HQ and RSM) + +**Zero architectural changes.** The connection manager, vault, terminal, SFTP, and RDP modules don't change. You just add a filter layer on who can see what. + +--- + +## 10. Build Phases + +| Phase | Deliverables | +|---|---| +| **1: Foundation** | Docker Compose, NestJS scaffold, Prisma schema, encryption service, Nuxt 3 SPA shell, auth (single-user login), connection manager CRUD, host groups | +| **2: SSH + SFTP** | xterm.js terminal, ssh2 WebSocket proxy, host key verification, multi-tab, split panes, SFTP sidebar with file tree, upload/download, Monaco editor | +| **3: RDP** | guacd integration, Guacamole tunnel, RDP canvas rendering, clipboard sync, connection settings | +| **4: Polish** | SSH key import UI, vault management page, theming, quick connect, search, settings page, connection history/recent hosts | + +> **Note on encryption timing:** The encryption service and credential CRUD (encrypted) are in Phase 1, not Phase 4. SSH connections in Phase 2 need to decrypt credentials — plaintext storage is never acceptable, even temporarily. Phase 4's vault work is the management UI (import dialogs, key list view), not the encryption layer itself. diff --git a/docs/superpowers/specs/2026-03-17-wraith-desktop-design.md b/docs/superpowers/specs/2026-03-17-wraith-desktop-design.md new file mode 100644 index 0000000..24a6a4f --- /dev/null +++ b/docs/superpowers/specs/2026-03-17-wraith-desktop-design.md @@ -0,0 +1,982 @@ +# Wraith Desktop — Design Spec + +> **Date:** 2026-03-17 +> **Purpose:** Native Windows desktop replacement for MobaXTerm — SSH + SFTP + RDP in a single binary +> **Stack:** Go + Wails v3 (Vue 3 frontend, WebView2) + SQLite + FreeRDP3 (purego) +> **Target:** Personal tool for daily MSP/sysadmin work — Windows only +> **Name:** Wraith — exists everywhere, all at once. + +--- + +## 1. What This Is + +A Windows desktop application that replaces MobaXTerm. Multi-tabbed SSH terminal with SFTP sidebar (MobaXTerm's killer feature), RDP via FreeRDP3 dynamic linking, connection manager with hierarchical groups, and an encrypted vault for SSH keys and passwords. Ships as `wraith.exe` + `freerdp3.dll`. No Docker, no database server, no sidecar processes. + +**What this is NOT:** A web app, a SaaS platform, a team tool. It's a personal remote access workstation built as a native desktop binary. + +**Prior art:** This is a ground-up rebuild of Wraith, which was previously a self-hosted web application (Nuxt 3 + NestJS + guacd + PostgreSQL). The web version proved the feature set; this version delivers it as a proper desktop tool. + +--- + +## 2. Technology Stack + +### Backend (Go) + +| Component | Technology | Purpose | +|---|---|---| +| Framework | Wails v3 (alpha) | Desktop app shell, multi-window, Go↔JS bindings | +| SSH | `golang.org/x/crypto/ssh` | SSH client connections, PTY, auth | +| SFTP | `github.com/pkg/sftp` | Remote filesystem operations over SSH | +| RDP | FreeRDP3 via `purego` / `syscall.NewLazyDLL` | RDP protocol, bitmap rendering | +| Database | SQLite via `modernc.org/sqlite` (pure Go) | Connections, credentials, settings | +| Encryption | `crypto/aes` + `crypto/cipher` (GCM) | Vault encryption at rest | +| Key derivation | `golang.org/x/crypto/argon2` | Master password → encryption key | + +### Frontend (Vue 3 in WebView2) + +| Component | Technology | Purpose | +|---|---|---| +| Framework | Vue 3 (Composition API) | UI framework | +| Terminal | xterm.js 5.x + WebGL addon | SSH terminal emulator | +| File editor | CodeMirror 6 | Remote file editing (separate window) | +| CSS | Tailwind CSS | Utility-first styling | +| Components | Naive UI | Tree, tabs, modals, dialogs, inputs | +| State | Pinia | Reactive stores for sessions, connections, app state | +| Build | Vite | Frontend build tooling | + +### Distribution + +| Artifact | Notes | +|---|---| +| `wraith.exe` | Single Go binary, ~8-10MB | +| `freerdp3.dll` | FreeRDP3 dynamic library, shipped alongside | +| Data | `%APPDATA%\Wraith\wraith.db` (SQLite) | +| Installer | NSIS via Wails build | + +--- + +## 3. Architecture + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ Wails v3 Application (wraith.exe) │ +│ │ +│ ┌─ Go Backend ──────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌──────────────┐ ┌──────────────┐ ┌───────────────────┐ │ │ +│ │ │ SSH Service │ │ SFTP Service │ │ RDP Service │ │ │ +│ │ │ x/crypto/ssh │ │ pkg/sftp │ │ purego→freerdp3 │ │ │ +│ │ └──────┬───────┘ └──────┬───────┘ └────────┬──────────┘ │ │ +│ │ │ │ │ │ │ +│ │ ┌──────▼─────────────────▼────────────────────▼──────────┐ │ │ +│ │ │ Session Manager │ │ │ +│ │ │ • Tracks all active SSH/RDP sessions │ │ │ +│ │ │ • Routes I/O between frontend and protocol backends │ │ │ +│ │ │ • Supports tab detach/reattach (session ≠ window) │ │ │ +│ │ └────────────────────────┬───────────────────────────────┘ │ │ +│ │ │ │ │ +│ │ ┌────────────────────────▼───────────────────────────────┐ │ │ +│ │ │ Vault Service │ │ │ +│ │ │ • Master password → Argon2id → AES-256-GCM key │ │ │ +│ │ │ • SQLite storage (%APPDATA%\Wraith\wraith.db) │ │ │ +│ │ │ • Encrypts: SSH keys, passwords, RDP credentials │ │ │ +│ │ └────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ +│ │ │ Connection │ │ Import │ │ Host Key │ │ │ +│ │ │ Manager │ │ .mobaconf │ │ Store │ │ │ +│ │ └──────────────┘ └──────────────┘ └──────────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ ▲ │ +│ Wails v3 Bindings (type-safe Go↔JS) │ +│ ▼ │ +│ ┌─ Vue 3 Frontend (WebView2) ───────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌───────────────┐ │ │ +│ │ │ xterm.js │ │ SFTP Tree │ │ RDP │ │ CodeMirror 6 │ │ │ +│ │ │ +WebGL │ │ Sidebar │ │ Canvas │ │ (sep window) │ │ │ +│ │ └──────────┘ └───────────┘ └──────────┘ └───────────────┘ │ │ +│ │ │ │ +│ │ ┌───────────────────────────────────────────────────────┐ │ │ +│ │ │ Tab Bar (detachable) + Connection Sidebar │ │ │ +│ │ │ Command Palette (Ctrl+K) | Dark theme │ │ │ +│ │ │ Tailwind CSS + Naive UI │ │ │ +│ │ └───────────────────────────────────────────────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────┘ + │ │ │ + SSH (port 22) SFTP (over SSH) RDP (port 3389) + │ │ │ + ▼ ▼ ▼ + Linux/macOS hosts Remote filesystems Windows hosts +``` + +### Key Architectural Decisions + +**Sessions ≠ Windows.** SSH and RDP sessions live as objects in the Go Session Manager. The frontend is a view. Detaching a tab spawns a new Wails window pointing at the same backend session. Re-attaching destroys the window and re-renders the session in the original tab. The session itself never drops. + +**Wails v3 multi-window risk mitigation:** This is the project's biggest technical risk. The detach/reattach model depends on Wails v3's alpha `application.NewWebviewWindow()` API. Three fallback plans, validated in priority order during Phase 1: + +- **Plan A (target):** Wails v3 `NewWebviewWindow()` — true native multi-window. Spike this in Phase 1 with a minimal two-window prototype before committing. +- **Plan B:** Single Wails window with internal "floating panel" detach — session renders in a draggable, resizable overlay within the main window. Not true OS windows, but close enough. No external dependency. +- **Plan C:** Wails v3 server mode — detached sessions open in the default browser at `localhost:{port}/session/{id}`. Functional but breaks the native feel. + +If Plan A fails, we fall to Plan B (which is entirely within our control). Plan C is the emergency fallback. **This must be validated in Phase 1, not discovered in Phase 4.** + +**Single binary + DLL.** No Docker, no sidecar processes. SQLite is embedded (pure Go driver). FreeRDP3 is the only external dependency, loaded dynamically via `purego`. + +**SFTP rides SSH.** SFTP opens a separate SSH channel on the same `x/crypto/ssh` connection as the terminal. No separate TCP connection is needed. `pkg/sftp.NewClient()` takes an `*ssh.Client` (not the shell `*ssh.Session`) and opens its own subsystem channel internally. The terminal shell session and SFTP operate as independent channels multiplexed over the same connection. + +**RDP via pixel buffer.** FreeRDP3 is loaded via `purego` (dynamic linking, no CGO). FreeRDP writes decoded bitmap frames into a shared Go pixel buffer. The Go backend serves frame data to the frontend via a local HTTP endpoint (`localhost:{random_port}/frame`) that returns raw RGBA data. The frontend renders frames on a `` element using `requestAnimationFrame`. Performance target: 1080p @ 30fps using Bitmap Update callbacks. The local HTTP approach is the default; if benchmarking reveals issues, Wails binding with base64-encoded frames is the fallback. + +--- + +## 4. Data Model (SQLite) + +```sql +-- Connection groups (hierarchical folders) +CREATE TABLE groups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + parent_id INTEGER REFERENCES groups(id) ON DELETE SET NULL, + sort_order INTEGER DEFAULT 0, + icon TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +-- Saved connections +CREATE TABLE connections ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + hostname TEXT NOT NULL, + port INTEGER NOT NULL DEFAULT 22, + protocol TEXT NOT NULL CHECK(protocol IN ('ssh','rdp')), + group_id INTEGER REFERENCES groups(id) ON DELETE SET NULL, + credential_id INTEGER REFERENCES credentials(id) ON DELETE SET NULL, + color TEXT, + tags TEXT DEFAULT '[]', -- JSON array: ["Prod","Linux","Client-RSM"] + notes TEXT, + options TEXT DEFAULT '{}', -- JSON: protocol-specific settings + sort_order INTEGER DEFAULT 0, + last_connected DATETIME, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +-- Credentials (password or SSH key reference) +CREATE TABLE credentials ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + username TEXT, + domain TEXT, + type TEXT NOT NULL CHECK(type IN ('password','ssh_key')), + encrypted_value TEXT, + ssh_key_id INTEGER REFERENCES ssh_keys(id) ON DELETE SET NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +-- SSH private keys (encrypted at rest) +CREATE TABLE ssh_keys ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + key_type TEXT, + fingerprint TEXT, + public_key TEXT, + encrypted_private_key TEXT NOT NULL, + passphrase_encrypted TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +-- Terminal themes (16-color ANSI + fg/bg/cursor) +CREATE TABLE themes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE, + foreground TEXT NOT NULL, + background TEXT NOT NULL, + cursor TEXT NOT NULL, + black TEXT NOT NULL, + red TEXT NOT NULL, + green TEXT NOT NULL, + yellow TEXT NOT NULL, + blue TEXT NOT NULL, + magenta TEXT NOT NULL, + cyan TEXT NOT NULL, + white TEXT NOT NULL, + bright_black TEXT NOT NULL, + bright_red TEXT NOT NULL, + bright_green TEXT NOT NULL, + bright_yellow TEXT NOT NULL, + bright_blue TEXT NOT NULL, + bright_magenta TEXT NOT NULL, + bright_cyan TEXT NOT NULL, + bright_white TEXT NOT NULL, + selection_bg TEXT, + selection_fg TEXT, + is_builtin BOOLEAN DEFAULT 0 +); + +-- Connection history (for recent connections + frequency sorting) +CREATE TABLE connection_history ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + connection_id INTEGER NOT NULL REFERENCES connections(id) ON DELETE CASCADE, + protocol TEXT NOT NULL, + connected_at DATETIME DEFAULT CURRENT_TIMESTAMP, + disconnected_at DATETIME, + duration_secs INTEGER +); + +-- Known SSH host keys +CREATE TABLE host_keys ( + hostname TEXT NOT NULL, + port INTEGER NOT NULL, + key_type TEXT NOT NULL, + fingerprint TEXT NOT NULL, + raw_key TEXT, + first_seen DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (hostname, port, key_type) +); + +-- App settings (key-value) +CREATE TABLE settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL +); +``` + +**`connections.options`** — JSON blob for protocol-specific settings. SSH: keepalive interval, preferred auth method, shell integration toggle. RDP: color depth, security mode (NLA/TLS/RDP), console session, audio redirection, display resolution. Keeps the schema clean and extensible as we discover edge cases without adding nullable columns. + +**`connections.tags`** — JSON array searchable via SQLite's `json_each()`. Enables filtering across groups (type "Prod" in search, see only production hosts regardless of which group they're in). + +**Connections → Credentials** is many-to-one. Multiple hosts can share the same credential. + +**SQLite WAL mode:** Enable Write-Ahead Logging (`PRAGMA journal_mode=WAL`) on database open in `db/sqlite.go`. WAL mode allows concurrent reads during writes, preventing "database is locked" errors when the frontend queries connections while the backend is writing session history or updating `last_connected` timestamps. Also set `PRAGMA busy_timeout=5000` as a safety net. + +**Host keys** are keyed by `(hostname, port, key_type)`. Supports multiple key types per host. Separated from connections so host key verification works independently of saved connections (e.g., quick connect). + +--- + +## 5. UI Layout + +### Visual Identity + +Dark theme inspired by the Wraith brand: deep dark backgrounds (#0d1117), blue accent (#58a6ff), green for SSH indicators (#3fb950), blue for RDP indicators (#1f6feb). The aesthetic is "operator command center" — atmospheric, moody, professional. Reference: `docs/karens-wraith-layout.png` for the target mood. + +Logo: `images/wraith-logo.png` — ghost with "$" symbol, used in the title bar and app icon. + +**The "alive" feel:** Tabs use a 0.5s CSS `transition` on `background-color` and `border-color` when switching between active and backgrounded states. The active tab's background subtly brightens; backgrounded tabs dim. This creates a fluid, "breathing" quality as you switch between sessions — the Wraith is present without being loud. Same 0.5s transition applies to sidebar item hover states and toolbar button interactions. No animations on the terminal itself — that would be distracting. + +### Main Window Layout + +``` +┌─────────────────────────────────────────────────────────────┐ +│ [👻 WRAITH v1.0] File View Tools Settings Help │ ← Title/Menu bar +├─────────────────────────────────────────────────────────────┤ +│ [⚡ Quick connect...] [+SSH] [+RDP] 4 sessions 🔒 ⚙ │ ← Toolbar +├────────────┬────────────────────────────────────────────────┤ +│ │ [Asgard ●] [Docker ●] [Predator ●] [VM01 ●]+ │ ← Tab bar +│ SIDEBAR │────────────────────────────────────────────────│ +│ │ │ +│ Toggles: │ Terminal / RDP Canvas │ +│ 📂 Conn │ │ +│ 📁 SFTP │ (xterm.js or ) │ +│ │ │ +│ Search │ Primary workspace area │ +│ Tags │ Takes dominant space │ +│ Groups │ │ +│ Tree │ │ +│ │ │ +├────────────┴────────────────────────────────────────────────┤ +│ SSH · root@asgard:22 ⚠️ ↑1.2K ↓3.4K Dark+ UTF-8 120×40 │ ← Status bar +└─────────────────────────────────────────────────────────────┘ +``` + +### Sidebar Behavior + +The left sidebar is a **single panel that toggles context** between Connections and SFTP (same as MobaXTerm, not two panels): + +- **Connections view:** Search bar, tag filter pills, recent connections, hierarchical group tree with connection entries. Green dots for SSH, blue dots for RDP. "Connected" indicator on active sessions. Right-click context menu for edit, delete, duplicate, move to group. +- **SFTP view:** Activates when an SSH session connects. Path bar showing current remote directory. Toolbar with upload, download, new file, new folder, refresh, delete. File tree with name, size, modified date. "Follow terminal folder" toggle at bottom. + +The sidebar is resizable. Minimum width ~200px, collapsible to icon-only rail. + +### Tab Bar + +- Color-coded dots: green = SSH, blue = RDP +- Protocol icon on each tab +- Environment badges: optional colored pills (PROD, ROOT, DEV) derived from connection tags +- Root session warning: tabs connected as root get a subtle warm accent +- Close button (×) on each tab +- Pop-out icon (↗) on hover for tab detach +- Overflow: chevron dropdown for hidden tabs when 10+ are open (not multi-line rows) +- Drag to reorder tabs +- Drag out of tab bar to detach into new window +- "+" button to open new session + +### Tab Detach/Reattach + +- **Detach:** Drag tab out of bar OR click ↗ icon → spawns new Wails window with that session still alive. Original tab shows "Session detached — [Reattach]" placeholder. +- **Reattach:** Click "Reattach" button in placeholder OR close the detached window → session snaps back into the tab bar. +- Works for both SSH and RDP sessions. +- The session lives in the Go backend, not the window. Detaching is just moving the view. + +### Command Palette (Ctrl+K) + +Modal overlay with fuzzy search across: +- Connection names, hostnames, group names, tags +- Actions: "New SSH", "New RDP", "Open Vault", "Settings", "Import MobaXTerm" +- Active sessions: "Switch to Asgard", "Disconnect Docker" +- Keyboard-first — arrow keys to navigate, Enter to select, Esc to close + +### Status Bar + +- Left: Protocol, user@host:port, privilege warning (⚠️ when root), transfer speed +- Right: Active theme name, encoding (UTF-8), terminal dimensions (cols×rows) +- Active session count in toolbar area + +### Terminal Theming + +Built-in themes: Dracula, Nord, Monokai, Solarized Dark, One Dark, Gruvbox, plus a "MobaXTerm Classic" theme matching the colors from the user's `.mobaconf` export. + +Custom theme creation via settings. Full 16-color ANSI palette + foreground/background/cursor maps directly to xterm.js `ITheme` objects. + +Per-connection theme override via `connections.options` JSON field. + +### Keyboard Shortcuts + +| Shortcut | Action | +|---|---| +| Ctrl+K | Command palette | +| Ctrl+T | New SSH session (from quick connect) | +| Ctrl+W | Close current tab | +| Ctrl+Tab | Next tab | +| Ctrl+Shift+Tab | Previous tab | +| Ctrl+1-9 | Switch to tab N | +| Ctrl+B | Toggle sidebar | +| Ctrl+Shift+D | Detach current tab | +| F11 | Fullscreen | +| Ctrl+Shift+C | Copy (terminal) | +| Ctrl+Shift+V | Paste (terminal) | +| Ctrl+F | Search in terminal scrollback | + +### CodeMirror 6 Editor (Separate Window) + +- Opens as a new Wails window when clicking a text file in the SFTP sidebar +- File size guard: files over 5MB refused for inline editing (offered download instead) +- Syntax highlighting based on file extension +- Save button writes content back to remote via SFTP +- Unsaved changes warning on close +- Window title: `filename — host — Wraith Editor` + +--- + +## 6. SSH + SFTP Flow + +### SSH Connection + +``` +User double-clicks "Asgard" in connection sidebar + → Go: ConnectionManager.Connect(connectionId) + → Go: VaultService.DecryptCredential(credentialId) → auth method + → Go: SSHService.Dial(hostname, port, authConfig) + → x/crypto/ssh.Dial() with host key callback + → If new host key: emit event to frontend, user accepts/rejects + → If changed host key: BLOCK connection, warn user (no silent accept) + → If accepted: store in host_keys table + → Go: SessionManager.Create(sshClient, connectionId) → sessionId + → Go: SSHService.RequestPTY(session, "xterm-256color", cols, rows) + → Go: SSHService.Shell(session) → stdin/stdout pipes + → Frontend: xterm.js instance created, bound to sessionId + → Wails bindings: bidirectional data flow + → xterm.js onData → Go SSHService.Write(sessionId, bytes) + → Go SSHService.Read(sessionId) → Wails event → xterm.js write +``` + +### SSH Authentication + +Supports three auth methods: + +1. **SSH Key:** Decrypt private key from vault. If key has passphrase, decrypt that too. Pass to `ssh.PublicKeys()` signer. +2. **Password:** Decrypt password from vault. Pass to `ssh.Password()`. +3. **Keyboard-Interactive:** For servers with 2FA/MFA prompts. `ssh.KeyboardInteractive()` callback relays challenge prompts to the frontend, user responds in a dialog. Common in MSP environments with PAM-based MFA. + +Auth methods are tried in order: key → password → keyboard-interactive. The credential type determines which are attempted first, but keyboard-interactive is always available as a fallback for servers that require it. + +### Terminal Resize + +``` +Frontend: xterm.js fit addon detects container resize + → Wails binding: SSHService.Resize(sessionId, cols, rows) + → Go: session.WindowChange(rows, cols) +``` + +### SFTP Sidebar + +``` +SSH connection established: + → Go: SFTPService.Open(sshClient) → pkg/sftp.NewClient(sshClient) + → Go: SFTPService.List(sessionId, homeDir) → directory listing + → Frontend: sidebar switches to SFTP view, renders file tree +``` + +SFTP uses the **same SSH connection** as the terminal (SFTP subsystem). No separate connection needed. + +**File operations:** All SFTP commands route through Go via Wails bindings, targeting the correct `pkg/sftp` client by sessionId. + +| Operation | Go function | Notes | +|---|---|---| +| List directory | `sftp.ReadDir(path)` | Lazy-loaded on tree expand | +| Upload | `sftp.Create(path)` + chunked write | Drag-and-drop from Windows Explorer | +| Download | `sftp.Open(path)` + read | Browser-style save dialog | +| Delete | `sftp.Remove(path)` / `sftp.RemoveAll(path)` | Confirmation prompt | +| Rename/Move | `sftp.Rename(old, new)` | | +| Mkdir | `sftp.Mkdir(path)` | | +| Chmod | `sftp.Chmod(path, mode)` | | +| Read file | `sftp.Open(path)` → content | Opens in CodeMirror window | +| Write file | `sftp.Create(path)` ← content | Save from CodeMirror | + +### CWD Following + +``` +SSH session starts: + → Go: injects shell hook after PTY is established: + PROMPT_COMMAND='printf "\033]7;file://%s%s\033\\" "$(hostname)" "$PWD"' + (or precmd for zsh) + → Go: SSHService reads stdout, scans for OSC 7 escape sequences + → Go: strips OSC 7 before forwarding to xterm.js (user never sees it) + → Go: emits CWD change event with new path + → Frontend: if "Follow terminal folder" is enabled, calls SFTPService.List(newPath) + → Frontend: SFTP tree navigates to new directory +``` + +"Follow terminal folder" is a per-session toggle (checkbox at bottom of SFTP sidebar), enabled by default. + +**Shell detection:** The OSC 7 injection assumes a bash-like shell (`PROMPT_COMMAND`) or zsh (`precmd`). For fish, the equivalent is `function fish_prompt; printf "\033]7;file://%s%s\033\\" (hostname) "$PWD"; end`. If shell detection fails (unknown shell, restricted shell, non-interactive session), CWD following is silently disabled — the SFTP sidebar stays at the initial home directory and requires manual navigation. + +### Upload Flow + +``` +User drags file from Windows Explorer onto SFTP sidebar: + → Frontend: reads file via File API, sends chunks to Go + → Go: SFTPService.Upload(sessionId, remotePath, fileData) + → Go: sftp.Create(remotePath) → write chunks → close + → Progress events emitted back to frontend + → SFTP tree refreshes on completion +``` + +--- + +## 7. RDP Flow + +### Architecture + +FreeRDP3 is loaded via `purego` (or `syscall.NewLazyDLL`) at runtime. No CGO, no C compiler needed. The Go binary loads `freerdp3.dll` from the application directory. + +### Connection + +``` +User double-clicks "CLT-VMHOST01" in connection sidebar: + → Go: ConnectionManager.Connect(connectionId) + → Go: VaultService.DecryptCredential(credentialId) → username, password, domain + → Go: RDPService.Connect(host, port, username, password, domain, options) + → purego: freerdp_new() → configure settings → freerdp_connect() + → Register BitmapUpdate callback + → Go: allocate pixel buffer (width × height × 4 bytes RGBA) + → FreeRDP: decoded bitmap frames written into pixel buffer + → Go: frame data served to frontend + → Frontend: renders frames via requestAnimationFrame (30fps target) +``` + +### Frame Delivery + +FreeRDP writes decoded frame data into a shared Go pixel buffer. The frontend retrieves frame data via one of: + +- **Local HTTP endpoint:** `localhost:{random_port}/frame` returns raw RGBA or PNG +- **Blob URL:** Go encodes frame, passes via Wails binding as base64 +- **Optimal approach TBD during implementation** — benchmark both + +Performance target: **1080p @ 30fps**. Focus on Bitmap Update callbacks. No H.264 pipeline needed — raw bitmap updates with basic RLE compression is sufficient for remote management work. + +### Input Handling + +``` +Frontend: mouse/keyboard events captured on element + → Wails binding → Go: RDPService.SendMouseEvent(sessionId, x, y, flags) + → Wails binding → Go: RDPService.SendKeyEvent(sessionId, keycode, pressed) + → Go: translate JS virtual keycodes to RDP scancodes via lookup table + → Go: purego calls freerdp_input_send_mouse_event / freerdp_input_send_keyboard_event +``` + +**Scancode mapping:** JavaScript `KeyboardEvent.code` values (e.g., "KeyA", "ShiftLeft") must be translated to RDP hardware scancodes that FreeRDP expects. A static lookup table in `internal/rdp/input.go` maps JS key codes → RDP scancodes. This is a known complexity in web-based RDP — the table must handle extended keys (e.g., right Alt, numpad) and platform-specific quirks. Reference: FreeRDP's `scancode.h` for the canonical scancode list. + +**System key pass-through:** The Windows key and Alt+Tab require special handling. By default, these keys are captured by the local OS. A per-connection toggle in `connections.options` (`"grabKeyboard": true`) controls whether system keys are forwarded to the remote host or stay local. When enabled, the RDP canvas captures all keyboard input including Win key, Alt+Tab, Ctrl+Alt+Del (via a toolbar button). Power users toggling between remote and local need this to be fast and obvious — surface it as an icon in the RDP toolbar. + +### Clipboard Sync + +``` +Remote → Local: + → Go: FreeRDP clipboard channel callback fires + → Go: emits clipboard event to frontend + → Frontend: writes to system clipboard via Wails API + +Local → Remote: + → Frontend: detects clipboard change (or user pastes) + → Wails binding → Go: RDPService.SendClipboard(sessionId, data) + → Go: writes to FreeRDP clipboard channel +``` + +### RDP Connection Options + +Stored in `connections.options` JSON field: + +```json +{ + "colorDepth": 32, + "security": "nla", + "consoleSession": false, + "audioRedirect": false, + "width": 1920, + "height": 1080, + "scaleFactor": 100 +} +``` + +**HiDPI / display scaling:** On Windows with display scaling (e.g., 150% on a 4K monitor), the RDP session resolution must account for the scale factor. `scaleFactor` in connection options controls whether to send the physical pixel resolution or the scaled logical resolution to FreeRDP. Default behavior: detect the current Windows DPI setting and scale the RDP resolution accordingly. Override via the `scaleFactor` option (100 = no scaling, 150 = 150%). + +--- + +## 8. Vault + Encryption + +### Master Password Flow + +``` +App launch: + → Master password prompt (modal, cannot be bypassed) + → If first launch: + → Generate random 32-byte salt + → Store salt in settings table (key: "vault_salt") + → Derive key: Argon2id(password, salt, t=3, m=65536, p=4, keyLen=32) + → Encrypt a known test value ("wraith-vault-check") with derived key + → Store encrypted test value in settings (key: "vault_check") + → If returning: + → Read salt and encrypted test value from settings + → Derive key with same parameters + → Attempt to decrypt test value + → If decryption succeeds → vault unlocked + → If fails → wrong password, prompt again + → Derived key held in memory only, never written to disk + → Key zeroed from memory on app close +``` + +### Encryption Functions + +``` +Encrypt(plaintext string) → string: + → Generate random 12-byte IV (crypto/rand) + → AES-256-GCM Seal(): returns ciphertext with authTag appended (Go's native format) + → Return "v1:{iv_hex}:{sealed_hex}" + → (sealed = ciphertext || authTag, as produced by cipher.AEAD.Seal()) + +Decrypt(blob string) → string: + → Parse version prefix, IV (12B), sealed data + → AES-256-GCM Open(): decrypts and verifies authTag (Go's native format) + → Return plaintext +``` + +The `v1:` version prefix enables future key rotation without re-encrypting all stored values. + +### What Gets Encrypted + +| Data | Encrypted | Reason | +|---|---|---| +| SSH private keys | Yes | Sensitive key material | +| SSH key passphrases | Yes | Passphrase is a secret | +| Password credentials | Yes | Passwords are secrets | +| RDP passwords | Yes | Via credential reference | +| Hostnames, ports, usernames | No | Not secrets, needed for display | +| Public keys, fingerprints | No | Public by definition | +| Group names, tags, notes | No | Not secrets | +| Settings, themes | No | User preferences | + +### Argon2id Parameters + +| Parameter | Value | Rationale | +|---|---|---| +| Time cost (t) | 3 | OWASP recommended minimum | +| Memory cost (m) | 65536 (64MB) | Resists GPU attacks | +| Parallelism (p) | 4 | Matches typical core count | +| Key length | 32 bytes (256-bit) | AES-256 key size | +| Salt | 32 bytes, random | Unique per installation | + +### Future: Windows DPAPI Integration (Post-MVP) + +The current vault is secure and portable (works on any Windows machine, backup the `.db` file and go). Post-MVP, an optional DPAPI layer could wrap the derived AES key with Windows Data Protection API, tying the vault to the current Windows user account. This would enable: + +- Transparent unlock when logged into Windows (no master password prompt) +- Hardware-backed key protection on machines with TPM +- Enterprise trust (DPAPI is a known quantity for IT departments) + +Implementation: the Argon2id-derived key gets wrapped with `CryptProtectData()` and stored. On unlock, DPAPI unwraps the key. Master password remains the fallback for portability (moving the database to another machine). This is designed-for but not built in MVP — the `v1:` encryption prefix enables adding a `v2:` scheme without re-encrypting existing data. + +--- + +## 9. MobaXTerm Importer + +### Config Format + +MobaXTerm exports configuration as `.mobaconf` files — INI format with `%`-delimited session strings. + +```ini +[Bookmarks_1] +SubRep=AAA Vantz's Stuff # Group name +ImgNum=41 # Icon index +*Asgard=#109#0%192.168.1.4%22%vstockwell%... # SSH session +CLT-VMHOST01=#91#4%100.64.1.204%3389%... # RDP session + +[SSH_Hostkeys] +ssh-ed25519@22:192.168.1.4=0x29ac... # Known host keys + +[Colors] +ForegroundColour=236,236,236 # Terminal colors +BackgroundColour=36,36,36 + +[Passwords] +vstockwell@192.168.1.214=_@9jajOXK... # Encrypted (can't import) +``` + +### Session String Parsing + +| Protocol | Type code | Fields (%-delimited) | +|---|---|---| +| SSH | `#109#` | host, port, username, ..., SSH key path, ..., colors | +| RDP | `#91#` | host, port, username, ..., color depth, security | + +### Import Flow + +``` +1. User: File → Import → Select .mobaconf file +2. Go: parse INI sections +3. Go: extract groups from [Bookmarks_N] SubRep values +4. Go: parse session strings → connections +5. Go: parse [SSH_Hostkeys] → host_keys table +6. Go: parse [Colors] + [Font] → create "MobaXTerm Import" theme +7. Frontend: show preview dialog: + "Found: 18 connections, 1 group, 4 host keys, 1 color theme" +8. User confirms import +9. Go: create groups, connections, host keys, theme in SQLite +10. Frontend: report results: + "Imported! 5 connections reference SSH keys — re-import key files. + 3 connections had stored passwords — re-enter in Wraith vault." +``` + +### What Gets Imported + +| Data | Imported | Notes | +|---|---|---| +| Connection names | Yes | | +| Groups (folder hierarchy) | Yes | From SubRep values | +| Hostnames, ports | Yes | | +| Usernames | Yes | | +| Protocol (SSH/RDP) | Yes | From type code #109# / #91# | +| SSH key file paths | As notes | User must re-import actual key files | +| Host keys | Yes | To host_keys table | +| Terminal colors | Yes | As a new theme | +| Font preferences | Yes | To settings | +| Encrypted passwords | No | MobaXTerm-encrypted, can't decrypt | + +--- + +## 10. Frontend Structure + +``` +frontend/ + src/ + App.vue # Root: master password → main layout + layouts/ + MainLayout.vue # Sidebar + tab container + status bar + UnlockLayout.vue # Master password prompt + components/ + sidebar/ + ConnectionTree.vue # Group tree with connection entries + SftpBrowser.vue # SFTP file tree + toolbar + SidebarToggle.vue # Connections ↔ SFTP toggle + session/ + SessionContainer.vue # Holds all active sessions (v-show, not v-if) + TabBar.vue # Draggable, detachable tab bar + TabBadge.vue # PROD/ROOT/DEV environment pills + terminal/ + TerminalView.vue # xterm.js instance wrapper + ThemePicker.vue # Terminal color scheme selector + rdp/ + RdpView.vue # Canvas-based RDP renderer + RdpToolbar.vue # Clipboard, fullscreen controls + sftp/ + FileTree.vue # Remote filesystem tree (lazy-loaded) + TransferProgress.vue # Upload/download progress indicator + vault/ + VaultManager.vue # SSH keys + credentials management + KeyImportDialog.vue # SSH key import modal + CredentialForm.vue # Password/key credential form + common/ + CommandPalette.vue # Ctrl+K fuzzy search overlay + QuickConnect.vue # Quick connect input + StatusBar.vue # Bottom status bar + composables/ + useSession.ts # Session lifecycle + tab management + useTerminal.ts # xterm.js + Wails binding bridge + useSftp.ts # SFTP operations via Wails bindings + useRdp.ts # RDP canvas rendering + input capture + useVault.ts # Key/credential CRUD + useConnections.ts # Connection CRUD + search + tags + useTheme.ts # Terminal theme management + useCommandPalette.ts # Command palette search + actions + stores/ + session.store.ts # Active sessions, tab order, detach state + connection.store.ts # Connections, groups, search state + app.store.ts # Global state: unlocked, settings, active theme +``` + +**Session architecture:** Active sessions render as persistent components inside `SessionContainer.vue`. Switching tabs toggles `v-show` visibility (not `v-if` destruction), so xterm.js and RDP canvas instances stay alive across tab switches. This is critical — destroying and recreating terminal instances would lose scrollback and session state. + +--- + +## 11. Go Backend Structure + +``` +internal/ + app/ + app.go # Wails app setup, window management + menu.go # Application menu definitions + session/ + manager.go # Session lifecycle, tab detach/reattach + session.go # Session struct (SSH or RDP, backend state) + ssh/ + service.go # SSH dial, PTY, shell, I/O pipes + hostkey.go # Host key verification + storage + cwd.go # OSC 7 parsing for CWD tracking + sftp/ + service.go # SFTP operations (list, upload, download, etc.) + rdp/ + service.go # RDP session management + freerdp.go # purego bindings to freerdp3.dll + pixelbuffer.go # Shared frame buffer management + input.go # Mouse/keyboard event translation + vault/ + service.go # Encrypt/decrypt, master password, key derivation + vault_test.go # Encryption round-trip tests + connections/ + service.go # Connection CRUD, group management + search.go # Full-text search + tag filtering + importer/ + mobaconf.go # MobaXTerm .mobaconf parser + mobaconf_test.go # Parser tests with real config samples + db/ + sqlite.go # SQLite connection, migrations + migrations/ # SQL migration files + settings/ + service.go # Key-value settings CRUD + theme/ + service.go # Theme CRUD, built-in theme definitions + builtins.go # Dracula, Nord, Monokai, etc. + plugin/ + interfaces.go # Plugin interfaces (ProtocolHandler, Importer, etc.) + registry.go # Plugin registration and lifecycle +``` + +### Plugin Interface + +Wraith exposes Go interfaces that community developers can implement to extend functionality: + +```go +// ProtocolHandler — add support for new protocols (VNC, Telnet, etc.) +type ProtocolHandler interface { + Name() string + Connect(config ConnectionConfig) (Session, error) + Disconnect(sessionId string) error +} + +// Importer — add support for importing from other tools +type Importer interface { + Name() string + FileExtensions() []string + Parse(data []byte) (*ImportResult, error) +} +``` + +Plugins are compiled into the binary (not runtime-loaded). Community developers fork the repo, implement the interface, register it in `plugin/registry.go`, and build. This keeps distribution simple (single binary) while enabling extensibility. + +--- + +## 12. MVP Scope + +### In MVP (launch-blocking) + +| Feature | Priority | Phase | Notes | +|---|---|---|---| +| Wails v3 scaffold + SQLite + vault | P0 | 1 | Foundation — nothing works without this | +| Connection manager sidebar | P0 | 1 | Groups, tree, search, tags | +| SSH terminal (xterm.js) | P0 | 2 | Multi-tab, 8+ concurrent sessions | +| SFTP sidebar | P0 | 2 | Auto-open, CWD following, file ops | +| Credential vault UI | P0 | 2 | SSH key import, credential management | +| Host key verification | P0 | 2 | Accept/reject new, block changed | +| RDP in tabs | P0 | 3 | FreeRDP3/purego, embedded canvas | +| MobaXTerm importer | P1 | 4 | Parse .mobaconf, first-run detection | +| Terminal theming | P1 | 4 | 6+ built-in themes, custom themes | +| Tab detach/reattach | P1 | 4 | Drag out, pop-out icon, reattach button | +| CodeMirror 6 editor | P1 | 4 | Separate window, syntax highlighting | +| Command palette (Ctrl+K) | P1 | 4 | Fuzzy search connections + actions | +| Session context awareness | P1 | 4 | Root warning, user@host in status bar | +| Tab badges | P1 | 4 | Protocol icon, environment tags | +| Quick connect | P1 | 4 | user@host:port in toolbar | +| Plugin interface | P1 | 1 | Define interfaces, implement in later phases | +| README.md | P1 | 1 | Developer docs, architecture, contribution guide | + +### Post-MVP + +| Feature | Notes | +|---|---| +| Split panes | Horizontal/vertical splits within a tab | +| Session recording/playback | asciinema-compatible | +| Jump host / bastion proxy | ProxyJump chain support | +| Port forwarding manager | Local, remote, dynamic SSH tunnels | +| Saved snippets/macros | Quick-execute command library | +| Tab grouping/stacking | Browser-style tab groups | +| Live latency monitoring | Ping/packet loss in status bar | +| Dual-pane SFTP | Server-to-server file operations | +| Auto-detect environment | Parse hostname for prod/dev/staging classification | +| Subtle glow effects | "Wraith" personality — energy on active sessions | +| Dynamic plugin loading | Drop-in plugins without recompilation (longer-term) | +| Windows DPAPI vault | Optional OS-backed encryption layer for transparent unlock | +| **Claude Code plugin** | **First official plugin — see below** | + +### Post-MVP Plugin: Claude Code Integration + +The first plugin built on the Wraith plugin interface. Embeds Claude Code directly into Wraith as a sidebar panel or tab, with full access to the active session's context. + +**Authentication:** User authenticates with their Anthropic API key or Claude account (stored encrypted in the vault alongside SSH keys and passwords). Key is decrypted on demand, never persisted in plaintext. + +**Core capabilities:** +- **Terminal integration:** Claude Code runs in a dedicated Wraith tab (xterm.js instance). It can see the active SSH session's terminal output and type commands into it — same as a human operator switching tabs. +- **SFTP-aware file access:** Claude Code can read and write files on the remote host via the active SFTP session. "Read `/etc/nginx/nginx.conf`" pulls the file through SFTP, Claude analyzes/modifies it, and writes it back. No need for Claude to SSH separately — it rides the existing Wraith session. +- **CodeMirror handoff:** Claude can open files in the CodeMirror editor window, make changes, and save back to the remote host. The user sees the edits happening in real-time. +- **Context awareness:** Claude sees which host you're connected to, the current working directory (via CWD tracking), and recent terminal output. "Fix the nginx config on this server" just works because Claude already knows where "this" is. + +**UX flow:** +1. User opens Claude Code panel (sidebar tab or dedicated session tab) +2. Types a prompt: "Check why nginx is returning 502 on this server" +3. Claude reads recent terminal output, pulls nginx config via SFTP, analyzes logs +4. Claude proposes a fix, user approves, Claude writes the file via SFTP +5. Claude types `nginx -t && systemctl reload nginx` into the terminal + +**Plugin interface usage:** This plugin implements `ProtocolHandler` (for the Claude Code tab) and extends the SFTP/terminal services to allow programmatic read/write. It proves the plugin architecture works and becomes the reference implementation for community plugin developers. + +--- + +## 13. Build Phases + +### Error Handling + Logging Strategy + +**Structured logging:** Use `log/slog` (Go 1.21+ standard library) with JSON output. Log levels: DEBUG, INFO, WARN, ERROR. Log to `%APPDATA%\Wraith\wraith.log` with daily rotation (keep 7 days). + +**Connection drops:** When an SSH/RDP connection drops unexpectedly: +1. Session Manager marks session as `disconnected` +2. Frontend tab shows "Connection lost — [Reconnect] [Close]" +3. Auto-reconnect is opt-in (configurable per connection via `options` JSON) +4. If auto-reconnect is enabled, retry 3 times with exponential backoff (1s, 2s, 4s) + +**Error surfacing:** Errors from Go backend are emitted as Wails events with a severity level. Frontend shows: +- Transient errors (network timeout) → toast notification, auto-dismiss +- Actionable errors (auth failure) → modal with explanation and action button +- Fatal errors (vault corruption) → full-screen error with instructions + +**Sensitive data in logs:** Never log passwords, private keys, or decrypted credentials. Log only: connection IDs, hostnames, session IDs, error types. + +### Crash Recovery + Workspace Restore + +When the app crashes, the system reboots, or Wails dies, SSH/RDP sessions are gone — there's no way to recover a dropped TCP connection. But the **workspace layout** can be restored. + +**Workspace snapshots:** The Session Manager periodically writes a workspace snapshot to SQLite (every 30 seconds and on clean shutdown): + +```json +{ + "tabs": [ + {"connectionId": 1, "protocol": "ssh", "position": 0, "detached": false}, + {"connectionId": 5, "protocol": "rdp", "position": 1, "detached": false}, + {"connectionId": 3, "protocol": "ssh", "position": 2, "detached": true, "windowBounds": {...}} + ], + "sidebarWidth": 240, + "sidebarMode": "connections", + "activeTab": 0 +} +``` + +**On restart after crash:** +1. Detect unclean shutdown (snapshot exists but no `clean_shutdown` flag) +2. Show: "Wraith closed unexpectedly. Restore previous workspace? [Restore] [Start Fresh]" +3. If Restore: recreate tab layout, attempt to reconnect each session +4. Tabs that fail to reconnect show "Connection lost — [Retry] [Close]" + +Users care about continuity more than perfection. Even if every session dies, restoring the layout and offering one-click reconnect is a massive UX win. + +### Resource Management + +With 20+ SSH sessions and multiple RDP sessions, resource awareness is critical: + +**Memory budget:** Each SSH session costs ~2-5MB (PTY buffer + SFTP client). Each RDP session costs ~8-12MB (pixel buffer at 1080p). Target: stable at 20 SSH + 3 RDP (~100-120MB total backend memory). + +**Session limits:** +- Default max: 32 concurrent sessions (SSH + RDP combined) +- Configurable via settings +- When limit reached: "Maximum sessions reached. Close a session to open a new one." + +**Inactive session handling:** +- Sessions idle for 30+ minutes get a subtle "idle" indicator on the tab (dimmed text) +- SSH keepalive (`ServerAliveInterval` equivalent) prevents server-side timeouts — configurable per connection via `options.keepAliveInterval` (default: 60 seconds) +- No automatic session suspension — users control their sessions explicitly +- SFTP idle connections are closed after 10 minutes of inactivity and silently reopened on next file operation + +**Monitoring:** Expose a "Sessions" panel in Settings showing per-session memory usage, connection duration, and idle time. Simple table, not a dashboard. + +--- + +## 14. Licensing + Open Source + +**License:** MIT. All dependencies must be MIT, Apache 2.0, BSD, or ISC compatible. **No GPL/AGPL dependencies.** + +Dependency license audit is part of Phase 1. Key libraries and their licenses: +- `golang.org/x/crypto` — BSD-3-Clause ✓ +- `github.com/pkg/sftp` — BSD-2-Clause ✓ +- `github.com/ebitengine/purego` — Apache 2.0 ✓ +- `modernc.org/sqlite` — BSD-3-Clause ✓ +- FreeRDP3 — Apache 2.0 ✓ (dynamically linked, no license contamination) +- xterm.js — MIT ✓ +- Vue 3 — MIT ✓ +- Naive UI — MIT ✓ +- Tailwind CSS — MIT ✓ +- CodeMirror 6 — MIT ✓ + +**Plugin architecture:** The Go backend exposes a plugin interface so community developers can extend Wraith with custom protocol handlers, importers, or sidebar panels. Plugins are Go packages that implement defined interfaces and are compiled into the binary (no runtime plugin loading — keeps the binary simple and portable). + +**README.md:** Comprehensive developer-facing documentation covering: architecture overview, build instructions, project structure walkthrough, plugin development guide, contribution guidelines, and the design philosophy. Written as part of Phase 1. + +--- + +## 15. First-Run Experience + +On first launch: +1. Master password creation dialog (set + confirm) +2. Detect if `.mobaconf` files exist in common locations (`%APPDATA%\MobaXterm\`, user's Documents folder) +3. If found: prompt "We found a MobaXTerm configuration. Import your sessions?" with file path shown +4. If not found: offer "Import from MobaXTerm" button + "Start fresh" +5. After import (or skip): land on the empty connection manager with a "Create your first connection" prompt + +--- + +## 16. Build Phases + +| Phase | Deliverables | +|---|---| +| **1: Foundation** | Wails v3 scaffold (including multi-window spike — validate Plan A/B/C), SQLite schema + migrations (WAL mode), vault service (master password, Argon2id, AES-256-GCM), connection CRUD, group tree, Vue 3 shell with sidebar + tab container, dark theme, Naive UI integration, plugin interface definitions, README.md, license audit, **RDP frame transport spike** (benchmark HTTP vs base64 with a test canvas — don't wait until Phase 3) | +| **2: SSH + SFTP** | SSH service (x/crypto/ssh), PTY + shell, xterm.js terminal rendering, multi-tab sessions, SFTP sidebar (pkg/sftp), file tree, upload/download, CWD following (OSC 7), CodeMirror 6 editor in separate window, workspace snapshot persistence | +| **3: RDP** | FreeRDP3 purego bindings, pixel buffer, canvas rendering (using proven transport from Phase 1 spike), mouse/keyboard input mapping (including scancode table + system key pass-through), clipboard sync, connection options | +| **4: Polish** | Command palette, tab detach/reattach, terminal theming (built-in + custom), MobaXTerm importer (with first-run detection), tab badges, session context awareness, quick connect, host key management UI, settings page, crash recovery / workspace restore, resource management panel, NSIS installer | diff --git a/docs/test-buildout-spec.md b/docs/test-buildout-spec.md new file mode 100644 index 0000000..5d82c54 --- /dev/null +++ b/docs/test-buildout-spec.md @@ -0,0 +1,108 @@ +# Wraith Remote — Test Suite Build-Out Spec + +**Date:** 2026-03-14 +**Scope:** Level B — Full service layer coverage (~80-100 tests) +**Status:** Pinned — awaiting green light to execute + +--- + +## Backend (Jest) + +Jest is already configured in `backend/package.json`. Zero spec files exist today. + +### Infrastructure + +- Tests co-located with source: `*.spec.ts` next to `*.ts` +- Shared mock factories in `backend/src/__mocks__/` for Prisma, JwtService, EncryptionService +- `beforeEach` resets all mocks to prevent test bleed + +### Test Files + +| File | Tests | Priority | +|------|-------|----------| +| `auth.service.spec.ts` | Login (valid, invalid, non-existent user timing), bcrypt→argon2 migration, TOTP setup/verify/disable, TOTP secret encryption/decryption, password hashing, profile update, admin CRUD | ~20 | +| `encryption.service.spec.ts` | v2 encrypt/decrypt round-trip, v1 backwards compat decrypt, v1→v2 upgrade, isV1 detection, invalid version handling, key derivation warmup | ~8 | +| `credentials.service.spec.ts` | findAll excludes encryptedValue, findOne with ownership check, create with encryption, update with password change, remove, decryptForConnection (password, SSH key, orphaned key, no auth) | ~10 | +| `ssh-keys.service.spec.ts` | Create with encryption, findAll (no private key leak), findOne ownership, update passphrase, remove, key type detection, fingerprint generation | ~8 | +| `jwt-auth.guard.spec.ts` | Passes valid JWT, rejects missing/expired/invalid JWT | ~3 | +| `admin.guard.spec.ts` | Allows admin role, blocks non-admin, blocks missing user | ~3 | +| `ws-auth.guard.spec.ts` | Cookie-based auth, WS ticket auth (valid, expired, reused), legacy URL token fallback, no token rejection | ~6 | +| `auth.controller.spec.ts` | Login sets cookie, logout clears cookie, ws-ticket issuance and consumption, TOTP endpoints wired correctly | ~8 | + +**Backend total: ~66 tests** + +### Mocking Strategy + +- **PrismaService:** Jest manual mock returning controlled data per test +- **EncryptionService:** Mock encrypt returns `v2:mock:...`, mock decrypt returns plaintext +- **JwtService:** Mock sign returns `mock-jwt-token`, mock verify returns payload +- **Argon2:** Real library (fast enough for unit tests, tests actual hashing behavior) +- **bcrypt:** Real library (needed to test migration path) + +--- + +## Frontend (Vitest) + +No test infrastructure exists today. Needs full setup. + +### Infrastructure + +- Install: `vitest`, `@vue/test-utils`, `@pinia/testing`, `happy-dom` +- Config: `frontend/vitest.config.ts` with happy-dom environment +- Global mock for `$fetch` (Nuxt auto-import) via setup file +- Global mock for `navigateTo` (Nuxt auto-import) + +### Test Files + +| File | Tests | Priority | +|------|-------|----------| +| `stores/auth.store.spec.ts` | Login success (stores user, no token in state), login TOTP flow, logout clears state + calls API, fetchProfile success/failure, getWsTicket, isAuthenticated/isAdmin getters | ~10 | +| `stores/connection.store.spec.ts` | fetchHosts, fetchTree, createHost, updateHost, deleteHost, group CRUD, no Authorization headers in requests | ~8 | +| `composables/useVault.spec.ts` | listKeys, importKey, deleteKey, listCredentials, createCredential, updateCredential, deleteCredential — all without Authorization headers | ~7 | +| `middleware/admin.spec.ts` | Redirects non-admin to /, allows admin through | ~3 | +| `plugins/auth.client.spec.ts` | Calls fetchProfile on init when user is null, skips when user exists | ~2 | + +**Frontend total: ~30 tests** + +--- + +## NPM Scripts + +```json +// backend/package.json +"test": "jest", +"test:watch": "jest --watch", +"test:cov": "jest --coverage" + +// frontend/package.json +"test": "vitest run", +"test:watch": "vitest", +"test:cov": "vitest run --coverage" +``` + +--- + +## Pre-commit Hook (Husky) + +- Install `husky` + `lint-staged` at repo root +- Pre-commit runs: backend Jest (changed files) + frontend Vitest (changed files) +- Fast feedback — only tests related to changed files run on commit + +--- + +## Execution Plan + +1. **Agent 1:** Backend test infra (mock factories) + auth service tests + auth controller tests + guard tests (~37 tests) +2. **Agent 2:** Backend vault tests — encryption, credentials, SSH keys (~26 tests) +3. **Agent 3:** Frontend test infra (Vitest setup) + store tests + middleware + plugin tests (~30 tests) +4. **XO (me):** Wire npm scripts, verify all pass, add Husky pre-commit hook, final integration check + +--- + +## Future (Level C — when ready) + +- Component tests with Vue Test Utils (render + interaction) +- Integration tests against a real test PostgreSQL (Docker test container) +- Gateway tests (WebSocket mocking for terminal, SFTP, RDP) +- E2E with Playwright +- CI pipeline (Gitea Actions) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..33a57ad --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + Wraith + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..8a11e8b --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2829 @@ +{ + "name": "wraith-frontend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wraith-frontend", + "dependencies": { + "@codemirror/lang-javascript": "^6.2.5", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-python": "^6.2.1", + "@codemirror/state": "^6.6.0", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.40.0", + "@wailsio/runtime": "latest", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-search": "^0.16.0", + "@xterm/addon-web-links": "^0.12.0", + "@xterm/addon-webgl": "^0.19.0", + "@xterm/xterm": "^6.0.0", + "codemirror": "^6.0.2", + "naive-ui": "^2.40.0", + "pinia": "^2.2.0", + "vue": "^3.5.0", + "vue-router": "^4.4.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "@vitejs/plugin-vue": "^5.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.5.0", + "vite": "^6.0.0", + "vue-tsc": "^2.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz", + "integrity": "sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", + "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", + "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/markdown": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-python": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.2.1.tgz", + "integrity": "sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.3.2", + "@codemirror/language": "^6.8.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/python": "^1.1.4" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.2.tgz", + "integrity": "sha512-jEPmz2nGGDxhRTg3lTpzmIyGKxz3Gp3SJES4b0nAuE5SWQoKdT5GoQ69cwMmFd+wvFUhYirtDTr0/DRHpQAyWg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz", + "integrity": "sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", + "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.40.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.40.0.tgz", + "integrity": "sha512-WA0zdU7xfF10+5I3HhUUq3kqOx3KjqmtQ9lqZjfK7jtYk4G72YW9rezcSywpaUMCWOMlq+6E0pO1IWg1TNIhtg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@css-render/plugin-bem": { + "version": "0.15.14", + "resolved": "https://registry.npmjs.org/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz", + "integrity": "sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==", + "license": "MIT", + "peerDependencies": { + "css-render": "~0.15.14" + } + }, + "node_modules/@css-render/vue3-ssr": { + "version": "0.15.14", + "resolved": "https://registry.npmjs.org/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz", + "integrity": "sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" + }, + "node_modules/@lezer/common": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.1.tgz", + "integrity": "sha512-PYAKeUVBo3HFThruRyp/iK91SwiZJnzXh8QzkQlwijB5y+N5iB28+iLk78o2zmKqqV0uolNhCwFqB8LA7b0Svg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz", + "integrity": "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.3.tgz", + "integrity": "sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@lezer/python": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz", + "integrity": "sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "tailwindcss": "4.2.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@wailsio/runtime": { + "version": "3.0.0-alpha.79", + "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.79.tgz", + "integrity": "sha512-NITzxKmJsMEruc39L166lbPJVECxzcbdqpHVqOOF7Cu/7Zqk/e3B/gNpkUjhNyo5rVb3V1wpS8oEgLUmpu1cwA==", + "license": "MIT" + }, + "node_modules/@xterm/addon-fit": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", + "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", + "license": "MIT" + }, + "node_modules/@xterm/addon-search": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-search/-/addon-search-0.16.0.tgz", + "integrity": "sha512-9OeuBFu0/uZJPu+9AHKY6g/w0Czyb/Ut0A5t79I4ULoU4IfU5BEpPFVGQxP4zTTMdfZEYkVIRYbHBX1xWwjeSA==", + "license": "MIT" + }, + "node_modules/@xterm/addon-web-links": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-web-links/-/addon-web-links-0.12.0.tgz", + "integrity": "sha512-4Smom3RPyVp7ZMYOYDoC/9eGJJJqYhnPLGGqJ6wOBfB8VxPViJNSKdgRYb8NpaM6YSelEKbA2SStD7lGyqaobw==", + "license": "MIT" + }, + "node_modules/@xterm/addon-webgl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-webgl/-/addon-webgl-0.19.0.tgz", + "integrity": "sha512-b3fMOsyLVuCeNJWxolACEUED0vm7qC0cy4wRvf3oURSzDTYVQiGPhTnhWZwIHdvC48Y+oLhvYXnY4XDXPoJo6A==", + "license": "MIT" + }, + "node_modules/@xterm/xterm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz", + "integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==", + "license": "MIT", + "workspaces": [ + "addons/*" + ] + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/css-render": { + "version": "0.15.14", + "resolved": "https://registry.npmjs.org/css-render/-/css-render-0.15.14.tgz", + "integrity": "sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "~0.8.0", + "csstype": "~3.0.5" + } + }, + "node_modules/css-render/node_modules/csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-tz": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", + "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", + "license": "MIT", + "peerDependencies": { + "date-fns": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/evtd": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/evtd/-/evtd-0.2.4.tgz", + "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/naive-ui": { + "version": "2.44.1", + "resolved": "https://registry.npmjs.org/naive-ui/-/naive-ui-2.44.1.tgz", + "integrity": "sha512-reo8Esw0p58liZwbUutC7meW24Xbn3EwNv91zReWKm2W4JPu+zfgJRn/F7aO0BFmvN+h2brA2M5lRvYqLq4kuA==", + "license": "MIT", + "dependencies": { + "@css-render/plugin-bem": "^0.15.14", + "@css-render/vue3-ssr": "^0.15.14", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "async-validator": "^4.2.5", + "css-render": "^0.15.14", + "csstype": "^3.1.3", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "evtd": "^0.2.4", + "highlight.js": "^11.8.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "seemly": "^0.3.10", + "treemate": "^0.3.11", + "vdirs": "^0.1.8", + "vooks": "^0.2.12", + "vueuc": "^0.4.65" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz", + "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/seemly": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.10.tgz", + "integrity": "sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/treemate": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/treemate/-/treemate-0.3.11.tgz", + "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vdirs": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/vdirs/-/vdirs-0.1.8.tgz", + "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vooks": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz", + "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vueuc": { + "version": "0.4.65", + "resolved": "https://registry.npmjs.org/vueuc/-/vueuc-0.4.65.tgz", + "integrity": "sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==", + "license": "MIT", + "dependencies": { + "@css-render/vue3-ssr": "^0.15.10", + "@juggle/resize-observer": "^3.3.1", + "css-render": "^0.15.10", + "evtd": "^0.2.4", + "seemly": "^0.3.6", + "vdirs": "^0.1.4", + "vooks": "^0.2.4" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..a63810b --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,39 @@ +{ + "name": "wraith-frontend", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "build:dev": "vue-tsc --noEmit && vite build --minify false --mode development", + "preview": "vite preview" + }, + "dependencies": { + "@codemirror/lang-javascript": "^6.2.5", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-python": "^6.2.1", + "@codemirror/state": "^6.6.0", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.40.0", + "@wailsio/runtime": "latest", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-search": "^0.16.0", + "@xterm/addon-web-links": "^0.12.0", + "@xterm/addon-webgl": "^0.19.0", + "@xterm/xterm": "^6.0.0", + "codemirror": "^6.0.2", + "naive-ui": "^2.40.0", + "pinia": "^2.2.0", + "vue": "^3.5.0", + "vue-router": "^4.4.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "@vitejs/plugin-vue": "^5.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.5.0", + "vite": "^6.0.0", + "vue-tsc": "^2.0.0" + } +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..52affe7 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,30 @@ + + + diff --git a/frontend/src/assets/css/main.css b/frontend/src/assets/css/main.css new file mode 100644 index 0000000..537ee58 --- /dev/null +++ b/frontend/src/assets/css/main.css @@ -0,0 +1,29 @@ +@import "tailwindcss"; + +:root { + --wraith-bg-primary: #0d1117; + --wraith-bg-secondary: #161b22; + --wraith-bg-tertiary: #21262d; + --wraith-border: #30363d; + --wraith-text-primary: #e0e0e0; + --wraith-text-secondary: #8b949e; + --wraith-text-muted: #484f58; + --wraith-accent-blue: #58a6ff; + --wraith-accent-green: #3fb950; + --wraith-accent-red: #f85149; + --wraith-accent-yellow: #e3b341; +} + +body { + margin: 0; + font-family: system-ui, -apple-system, 'Segoe UI', sans-serif; + background: var(--wraith-bg-primary); + color: var(--wraith-text-primary); + overflow: hidden; + user-select: none; +} + +::-webkit-scrollbar { width: 8px; } +::-webkit-scrollbar-track { background: var(--wraith-bg-primary); } +::-webkit-scrollbar-thumb { background: var(--wraith-border); border-radius: 4px; } +::-webkit-scrollbar-thumb:hover { background: var(--wraith-text-muted); } diff --git a/frontend/src/assets/css/terminal.css b/frontend/src/assets/css/terminal.css new file mode 100644 index 0000000..2e67ee6 --- /dev/null +++ b/frontend/src/assets/css/terminal.css @@ -0,0 +1,50 @@ +/* xterm.js terminal container styling */ + +.terminal-container { + width: 100%; + height: 100%; + position: relative; + overflow: hidden; + background: var(--wraith-bg-primary); +} + +.terminal-container .xterm { + height: 100%; + padding: 4px; +} + +.terminal-container .xterm-viewport { + overflow-y: auto !important; +} + +.terminal-container .xterm-screen { + height: 100%; +} + +/* Selection styling */ +.terminal-container .xterm-selection div { + background-color: rgba(88, 166, 255, 0.3) !important; +} + +/* Cursor styling */ +.terminal-container .xterm-cursor-layer { + z-index: 4; +} + +/* Scrollbar inside terminal */ +.terminal-container .xterm-viewport::-webkit-scrollbar { + width: 8px; +} + +.terminal-container .xterm-viewport::-webkit-scrollbar-track { + background: var(--wraith-bg-primary); +} + +.terminal-container .xterm-viewport::-webkit-scrollbar-thumb { + background: var(--wraith-border); + border-radius: 4px; +} + +.terminal-container .xterm-viewport::-webkit-scrollbar-thumb:hover { + background: var(--wraith-text-muted); +} diff --git a/frontend/src/components/common/CommandPalette.vue b/frontend/src/components/common/CommandPalette.vue new file mode 100644 index 0000000..b26b165 --- /dev/null +++ b/frontend/src/components/common/CommandPalette.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/frontend/src/components/common/ContextMenu.vue b/frontend/src/components/common/ContextMenu.vue new file mode 100644 index 0000000..c46b566 --- /dev/null +++ b/frontend/src/components/common/ContextMenu.vue @@ -0,0 +1,97 @@ + + + diff --git a/frontend/src/components/common/HostKeyDialog.vue b/frontend/src/components/common/HostKeyDialog.vue new file mode 100644 index 0000000..862d7b8 --- /dev/null +++ b/frontend/src/components/common/HostKeyDialog.vue @@ -0,0 +1,105 @@ + + + diff --git a/frontend/src/components/common/ImportDialog.vue b/frontend/src/components/common/ImportDialog.vue new file mode 100644 index 0000000..6a2bde3 --- /dev/null +++ b/frontend/src/components/common/ImportDialog.vue @@ -0,0 +1,247 @@ + + + diff --git a/frontend/src/components/common/StatusBar.vue b/frontend/src/components/common/StatusBar.vue new file mode 100644 index 0000000..f962b3c --- /dev/null +++ b/frontend/src/components/common/StatusBar.vue @@ -0,0 +1,65 @@ + + + diff --git a/frontend/src/components/common/ThemePicker.vue b/frontend/src/components/common/ThemePicker.vue new file mode 100644 index 0000000..c28a43e --- /dev/null +++ b/frontend/src/components/common/ThemePicker.vue @@ -0,0 +1,200 @@ + + + diff --git a/frontend/src/components/connections/ConnectionEditDialog.vue b/frontend/src/components/connections/ConnectionEditDialog.vue new file mode 100644 index 0000000..b25a7d7 --- /dev/null +++ b/frontend/src/components/connections/ConnectionEditDialog.vue @@ -0,0 +1,292 @@ +